From 6958674bf5af23810e1e318981c979450683069c Mon Sep 17 00:00:00 2001 From: hajipour Date: Fri, 26 Jan 2024 14:49:05 +0100 Subject: [PATCH 001/602] bug fix: port & device uuids extracted from device protobuf message instead of custom feature which is dedicated for emulated devices. --- .../rest_server/nbi_plugins/etsi_bwm/Tools.py | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py index a78d28193..c80591992 100644 --- a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py +++ b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py @@ -14,6 +14,7 @@ import json import logging +import re import time from decimal import ROUND_HALF_EVEN, Decimal from flask.json import jsonify @@ -26,6 +27,9 @@ from common.tools.object_factory.Service import json_service_id LOGGER = logging.getLogger(__name__) +RE_PORT_AND_IP_MATCH = r'resource_key: \"\/interface\[(.*)\]\/subinterface\[.*\]\"[.|\n]*.*\\\"address_ip\\\": \\\"{}\\\"' +RE_ENDPOINT_UUID_PORT_MATCH = r'\s*\n?\s*endpoint_uuid .\s*\n?\s*uuid: \"(.*)\"\n?\s*.\n?\s*.\n?\s*name: \"{}\"' +RE_DEVICE_UUID_MATCH = r'\n?\s*device_uuid \{\s*\n?\s*uuid: \"(.*)\"\n?\s*\}\n?\s*\}' def service_2_bwInfo(service: Service) -> dict: response = {} @@ -75,17 +79,20 @@ def bwInfo_2_service(client, bwInfo: dict) -> Service: a_ip = bwInfo['sessionFilter'][0]['sourceIp'] z_ip = bwInfo['sessionFilter'][0]['dstAddress'] - devices = client.ListDevices(Empty()).devices + devices = (str(device) for device in client.ListDevices(Empty()).devices) for device in devices: - for cr in device.device_config.config_rules: - if cr.WhichOneof('config_rule') == 'custom' and cr.custom.resource_key == '_connect/settings': - for ep in json.loads(cr.custom.resource_value)['endpoints']: - if 'ip' in ep and (ep['ip'] == a_ip or ep['ip'] == z_ip): - ep_id = EndPointId() - ep_id.endpoint_uuid.uuid = ep['uuid'] - ep_id.device_id.device_uuid.uuid = device.device_id.device_uuid.uuid - service.service_endpoint_ids.append(ep_id) - + for ep_id in (a_ip, z_ip): + if look_up := re.search(RE_PORT_AND_IP_MATCH.format(ep_id), device): + physical_port = look_up.groups(0)[0] + # 'PORT-' is added as a prefix + port = 'PORT-' + physical_port + port_uuid = re.search(RE_ENDPOINT_UUID_PORT_MATCH.format(port), device).group(0)[0] + device_uuid = re.search(RE_DEVICE_UUID_MATCH, device).group(0)[0] + ep_id = EndPointId() + ep_id.endpoint_uuid.uuid = port_uuid + ep_id.device_id.device_uuid.uuid = device_uuid + service.service_endpoint_ids.append(ep_id) + service.service_type = ServiceTypeEnum.SERVICETYPE_L3NM if 'appInsId' in bwInfo: -- GitLab From 27b2104dd4fb4615db630ec424ee20258acbeec0 Mon Sep 17 00:00:00 2001 From: hajipour Date: Fri, 26 Jan 2024 23:16:03 +0100 Subject: [PATCH 002/602] refactoring: port lookup done sequentially in device protobuf instead of global regex search --- .../rest_server/nbi_plugins/etsi_bwm/Tools.py | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py index c80591992..17199315d 100644 --- a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py +++ b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py @@ -27,9 +27,8 @@ from common.tools.object_factory.Service import json_service_id LOGGER = logging.getLogger(__name__) -RE_PORT_AND_IP_MATCH = r'resource_key: \"\/interface\[(.*)\]\/subinterface\[.*\]\"[.|\n]*.*\\\"address_ip\\\": \\\"{}\\\"' -RE_ENDPOINT_UUID_PORT_MATCH = r'\s*\n?\s*endpoint_uuid .\s*\n?\s*uuid: \"(.*)\"\n?\s*.\n?\s*.\n?\s*name: \"{}\"' -RE_DEVICE_UUID_MATCH = r'\n?\s*device_uuid \{\s*\n?\s*uuid: \"(.*)\"\n?\s*\}\n?\s*\}' +RE_CONFIG_RULE_IF_SUBIF = re.compile(r'^\/interface\[([^\]]+)\]\/subinterface\[([^\]]+)\]$') +RE_CONFIG_RULE_ADDRESS_IP = re.compile(r'\\\"address_ip\\\": \\\"((?:[0-9]{1,3}\.){3}[0-9]{1,3})\\\"') def service_2_bwInfo(service: Service) -> dict: response = {} @@ -79,20 +78,20 @@ def bwInfo_2_service(client, bwInfo: dict) -> Service: a_ip = bwInfo['sessionFilter'][0]['sourceIp'] z_ip = bwInfo['sessionFilter'][0]['dstAddress'] - devices = (str(device) for device in client.ListDevices(Empty()).devices) + devices = client.ListDevices(Empty()).devices for device in devices: - for ep_id in (a_ip, z_ip): - if look_up := re.search(RE_PORT_AND_IP_MATCH.format(ep_id), device): - physical_port = look_up.groups(0)[0] - # 'PORT-' is added as a prefix - port = 'PORT-' + physical_port - port_uuid = re.search(RE_ENDPOINT_UUID_PORT_MATCH.format(port), device).group(0)[0] - device_uuid = re.search(RE_DEVICE_UUID_MATCH, device).group(0)[0] - ep_id = EndPointId() - ep_id.endpoint_uuid.uuid = port_uuid - ep_id.device_id.device_uuid.uuid = device_uuid - service.service_endpoint_ids.append(ep_id) - + device_endpoint_uuids = {ep.name:ep.endpoint_id.endpoint_uuid for ep in device.device_endpoints} + for cr in device.device_config.config_rules: + if cr.WhichOneof('config_rule') == 'custom': + match_subif = RE_CONFIG_RULE_IF_SUBIF.match(cr.custom.resource_key) + match_ip = RE_CONFIG_RULE_ADDRESS_IP.match(cr.custom.resource_value) + if match_subif and match_ip and match_ip.groups(0)[0] in [a_ip, z_ip]: + # `PORT-` added as prefix + port_name = 'PORT-' + match_subif.groups(0)[0] + ep_id = EndPointId() + ep_id.endpoint_uuid.uuid = device_endpoint_uuids[port_name] + ep_id.device_id.device_uuid.uuid = device.device_id.device_uuid + service.service_endpoint_ids.append(ep_id) service.service_type = ServiceTypeEnum.SERVICETYPE_L3NM if 'appInsId' in bwInfo: -- GitLab From c2179dd845b717806fb0acc522f80e70581e0a37 Mon Sep 17 00:00:00 2001 From: hajipour Date: Fri, 26 Jan 2024 23:44:16 +0100 Subject: [PATCH 003/602] bug fix: Showing service info error in webui when service is created by BWM resolved. --- src/webui/service/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webui/service/__init__.py b/src/webui/service/__init__.py index 05b2eeaf0..5211ad935 100644 --- a/src/webui/service/__init__.py +++ b/src/webui/service/__init__.py @@ -48,7 +48,7 @@ def json_to_list(json_str : str) -> List[Union[str, Tuple[str, str]]]: if isinstance(data, dict): return [('kv', (key, value)) for key, value in data.items()] - elif isinstance(data, list): + elif isinstance(data, list) and not isinstance(data[0], dict): return [('item', ', '.join(data))] else: return [('item', str(data))] -- GitLab From ccdf13d912422c550f141a4f6ca81533ff749aad Mon Sep 17 00:00:00 2001 From: hajipour Date: Sun, 28 Jan 2024 11:18:15 +0100 Subject: [PATCH 004/602] bug fix:device's uuid assigned to EndpointId.device_id.device_uuid.uuid in bwm service creation. --- src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py index 17199315d..b9ed73850 100644 --- a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py +++ b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py @@ -90,7 +90,7 @@ def bwInfo_2_service(client, bwInfo: dict) -> Service: port_name = 'PORT-' + match_subif.groups(0)[0] ep_id = EndPointId() ep_id.endpoint_uuid.uuid = device_endpoint_uuids[port_name] - ep_id.device_id.device_uuid.uuid = device.device_id.device_uuid + ep_id.device_id.device_uuid.uuid = device.device_id.device_uuid.uuid service.service_endpoint_ids.append(ep_id) service.service_type = ServiceTypeEnum.SERVICETYPE_L3NM -- GitLab From 4bbdf917ca1ea8a6a19a2ea9e5bfbe4b3ddf60dd Mon Sep 17 00:00:00 2001 From: hajipour Date: Sun, 28 Jan 2024 17:26:48 +0100 Subject: [PATCH 005/602] bug fix: json_to_list function bug when json_str is empty list resolved. --- src/webui/service/__init__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/webui/service/__init__.py b/src/webui/service/__init__.py index 5211ad935..7146f321b 100644 --- a/src/webui/service/__init__.py +++ b/src/webui/service/__init__.py @@ -45,10 +45,12 @@ def json_to_list(json_str : str) -> List[Union[str, Tuple[str, str]]]: data = json.loads(json_str) except: # pylint: disable=bare-except return [('item', str(json_str))] - + if isinstance(data, dict): return [('kv', (key, value)) for key, value in data.items()] - elif isinstance(data, list) and not isinstance(data[0], dict): + elif isinstance(data, list) and len(data) == 1 and isinstance(data[0], dict): # BWM use-case + return [('kv', (key, value)) for key, value in data[0].items()] + elif isinstance(data, list) and all(isinstance(d, str) for d in data): return [('item', ', '.join(data))] else: return [('item', str(data))] -- GitLab From f10241a6c1228d1100750f5e79bdff1e88fbce02 Mon Sep 17 00:00:00 2001 From: hajipour Date: Mon, 12 Feb 2024 12:24:01 +0000 Subject: [PATCH 006/602] bug fix: temporary fix for MEC PoC demo. Config rules and OpenConfig driver for L3VPN should change based on telefonica recipe. --- .../drivers/openconfig/OpenConfigDriver.py | 5 +- .../drivers/openconfig/templates/Tools.py | 3 +- .../VPN/Network_instance_multivendor.py | 36 ++++- .../nbi_plugins/etsi_bwm/Resources.py | 15 +- .../rest_server/nbi_plugins/etsi_bwm/Tools.py | 140 +++++++++++++----- .../algorithms/tools/ComposeConfigRules.py | 18 +++ .../l3nm_openconfig/ConfigRules.py | 66 +++++++-- 7 files changed, 229 insertions(+), 54 deletions(-) diff --git a/src/device/service/drivers/openconfig/OpenConfigDriver.py b/src/device/service/drivers/openconfig/OpenConfigDriver.py index 8c6e07b3f..99ae1c8db 100644 --- a/src/device/service/drivers/openconfig/OpenConfigDriver.py +++ b/src/device/service/drivers/openconfig/OpenConfigDriver.py @@ -226,8 +226,11 @@ def edit_config( chk_length(str_resource_name, resource, min_length=2, max_length=2) resource_key,resource_value = resource chk_string(str_resource_name + '.key', resource_key, allow_empty=False) + str_config_messages = compose_config( # get template for configuration - resource_key, resource_value, delete=delete, vendor=netconf_handler.vendor, message_renderer=netconf_handler.message_renderer) + resource_key, resource_value, delete=delete, vendor=netconf_handler.vendor, message_renderer='pyangbind') + # str_config_messages = compose_config( # get template for configuration + # resource_key, resource_value, delete=delete, vendor=netconf_handler.vendor, message_renderer=netconf_handler.message_renderer) for str_config_message in str_config_messages: # configuration of the received templates if str_config_message is None: raise UnsupportedResourceKeyException(resource_key) logger.debug('[{:s}] str_config_message[{:d}] = {:s}'.format( diff --git a/src/device/service/drivers/openconfig/templates/Tools.py b/src/device/service/drivers/openconfig/templates/Tools.py index 79bebef51..3e8043680 100644 --- a/src/device/service/drivers/openconfig/templates/Tools.py +++ b/src/device/service/drivers/openconfig/templates/Tools.py @@ -61,7 +61,8 @@ def generate_templates(resource_key: str, resource_value: str, delete: bool,vend elif "inter_instance_policies" in resource_key: result_templates.append(associate_RP_to_NI(data)) elif "protocols" in resource_key: - if vendor == "ADVA": result_templates.append(add_protocol_NI(data, vendor, delete)) + result_templates.append(add_protocol_NI(data, vendor, delete)) + # if vendor == "ADVA": result_templates.append(add_protocol_NI(data, vendor, delete)) elif "table_connections" in resource_key: result_templates.append(create_table_conns(data, delete)) elif "interface" in resource_key: diff --git a/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py b/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py index c4d494ea6..e36955a0d 100644 --- a/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py +++ b/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py @@ -116,6 +116,9 @@ def add_protocol_NI(parameters,vendor, DEL): else: with tag('network-instance'): with tag('name'):text(parameters['name']) + with tag('config'): + with tag('name'): text(parameters['name']) + with tag('type', 'xmlns:oc-ni-types="http://openconfig.net/yang/network-instance-types"'): text('oc-ni-types:DEFAULT_INSTANCE') with tag('protocols'): with tag('protocol'): with tag('identifier', 'xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):text('oc-pol-types:',parameters['identifier']) @@ -123,14 +126,41 @@ def add_protocol_NI(parameters,vendor, DEL): with tag('config'): with tag('identifier', 'xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):text('oc-pol-types:',parameters['identifier']) with tag('name') :text(parameters['protocol_name']) + with tag('enabled'): text('true') if "BGP" in parameters['identifier']: with tag('bgp'): with tag('global'): + with tag('afi-safis'): + with tag('afi-safi'): + with tag('afi-safi-name', 'xmlns:oc-bgp-types="http://openconfig.net/yang/bgp-types"'): text('oc-bgp-types:IPV4_UNICAST') + with tag('config'): + with tag('afi-safi-name', 'xmlns:oc-bgp-types="http://openconfig.net/yang/bgp-types"'): text('oc-bgp-types:IPV4_UNICAST') + with tag('enabled'): text('true') with tag('config'): with tag('as') :text(parameters['as']) - if "router-id" in parameters: - with tag('router-id'):text(parameters['router-id']) - if vendor == "ADVA": + with tag('peer-groups'): + with tag('peer-group'): + with tag('peer-group-name'): text('IBGP') + with tag('config'): + with tag('peer-group-name'): text('IBGP') + with tag('peer-as'): text(parameters['protocol_name']) + with tag('afi-safis'): + with tag('afi-safi'): + with tag('afi-safi-name', 'xmlns:oc-bgp-types="http://openconfig.net/yang/bgp-types"'): text('oc-bgp-types:IPV4_UNICAST') + with tag('config'): + with tag('afi-safi-name', 'xmlns:oc-bgp-types="http://openconfig.net/yang/bgp-types"'): text('oc-bgp-types:IPV4_UNICAST') + with tag('enabled'): text('true') + + if 'neighbors' in parameters: + with tag('neighbors'): + for neighbor in parameters['neighbors']: + with tag('neighbor'): + with tag('neighbor-address'): text(neighbor['ip_address']) + with tag('config'): + with tag('neighbor-address'): text(neighbor['ip_address']) + with tag('peer-group'): text('IBGP') + # if vendor == "ADVA": + if True: with tag('tables'): with tag('table'): with tag('protocol', 'xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):text('oc-pol-types:',parameters['identifier']) diff --git a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Resources.py b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Resources.py index 3fccbbb55..394b50de8 100644 --- a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Resources.py +++ b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Resources.py @@ -13,7 +13,9 @@ # limitations under the License. import copy, deepmerge, json, logging +from typing import Dict from common.Constants import DEFAULT_CONTEXT_NAME +from werkzeug.exceptions import UnsupportedMediaType from context.client.ContextClient import ContextClient from flask_restful import Resource, request from service.client.ServiceClient import ServiceClient @@ -37,15 +39,20 @@ class BwInfo(_Resource): return bw_allocations def post(self): - bwinfo = request.get_json() - service = bwInfo_2_service(self.client, bwinfo) + if not request.is_json: + raise UnsupportedMediaType('JSON payload is required') + request_data: Dict = request.get_json() + service = bwInfo_2_service(self.client, request_data) stripped_service = copy.deepcopy(service) stripped_service.ClearField('service_endpoint_ids') stripped_service.ClearField('service_constraints') stripped_service.ClearField('service_config') - response = format_grpc_to_json(self.service_client.CreateService(stripped_service)) - response = format_grpc_to_json(self.service_client.UpdateService(service)) + try: + response = format_grpc_to_json(self.service_client.CreateService(stripped_service)) + response = format_grpc_to_json(self.service_client.UpdateService(service)) + except Exception as e: # pylint: disable=broad-except + return e return response diff --git a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py index a78d28193..d3be769c9 100644 --- a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py +++ b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py @@ -14,22 +14,35 @@ import json import logging +import re import time from decimal import ROUND_HALF_EVEN, Decimal from flask.json import jsonify from common.proto.context_pb2 import ( - ContextId, Empty, EndPointId, ServiceId, ServiceTypeEnum, Service, Constraint, Constraint_SLA_Capacity, + ContextId, Empty, EndPointId, ServiceId, ServiceTypeEnum, Service, ServiceStatusEnum, Constraint, Constraint_SLA_Capacity, ConfigRule, ConfigRule_Custom, ConfigActionEnum) from common.tools.grpc.Tools import grpc_message_to_json +from common.tools.grpc.ConfigRules import update_config_rule_custom from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id LOGGER = logging.getLogger(__name__) +ENDPOINT_SETTINGS_KEY = '/device[{:s}]/endpoint[{:s}]/vlan[{:d}]/settings' +RE_CONFIG_RULE_IF_SUBIF = re.compile(r'^\/interface\[([^\]]+)\]\/subinterface\[([^\]]+)\]$') +MEC_CONSIDERED_FIELDS = ['requestType', 'sessionFilter', 'fixedAllocation', 'allocationDirection'] +ALLOCATION_DIRECTION_DESCRIPTIONS = { + '00' : 'Downlink (towards the UE)', + '01' : 'Uplink (towards the application/session)', + '10' : 'Symmetrical'} +VLAN_TAG = 0 +PREFIX_LENGTH = 24 +BGP_AS = 65000 +policy_AZ = 'srv_{:d}_a'.format(VLAN_TAG) +policy_ZA = 'srv_{:d}_b'.format(VLAN_TAG) def service_2_bwInfo(service: Service) -> dict: response = {} - # allocationDirection = '??' # String: 00 = Downlink (towards the UE); 01 = Uplink (towards the application/session); 10 = Symmetrical response['appInsId'] = service.service_id.service_uuid.uuid # String: Application instance identifier for constraint in service.service_constraints: if constraint.WhichOneof('constraint') == 'sla_capacity': @@ -55,47 +68,108 @@ def service_2_bwInfo(service: Service) -> dict: return response -def bwInfo_2_service(client, bwInfo: dict) -> Service: +def bwInfo_2_service(client, bw_info: dict) -> Service: + # add description to allocationDirection code + if ad_code := bw_info.get('allocationDirection'): + bw_info['allocationDirection'] = {'code': ad_code, 'description': ALLOCATION_DIRECTION_DESCRIPTIONS[ad_code]} + if 'sessionFilter' in bw_info: + bw_info['sessionFilter'] = bw_info['sessionFilter'][0] # Discard other items in sessionFilter field + service = Service() - for key in ['allocationDirection', 'fixedBWPriority', 'requestType', 'timeStamp', 'sessionFilter']: - if key not in bwInfo: - continue - config_rule = ConfigRule() - config_rule.action = ConfigActionEnum.CONFIGACTION_SET - config_rule_custom = ConfigRule_Custom() - config_rule_custom.resource_key = key - if key != 'sessionFilter': - config_rule_custom.resource_value = str(bwInfo[key]) - else: - config_rule_custom.resource_value = json.dumps(bwInfo[key]) - config_rule.custom.CopyFrom(config_rule_custom) - service.service_config.config_rules.append(config_rule) - - if 'sessionFilter' in bwInfo: - a_ip = bwInfo['sessionFilter'][0]['sourceIp'] - z_ip = bwInfo['sessionFilter'][0]['dstAddress'] + + service_config_rules = service.service_config.config_rules + + route_distinguisher = '{:5d}:{:03d}'.format(BGP_AS, VLAN_TAG) + settings_cr_key = '/settings' + settings_cr_value = {'bgp_as':(BGP_AS, True), 'route_distinguisher': (route_distinguisher, True)} + update_config_rule_custom(service_config_rules, settings_cr_key, settings_cr_value) + + request_cr_key = '/request' + request_cr_value = {k:bw_info[k] for k in MEC_CONSIDERED_FIELDS} + + config_rule = ConfigRule() + config_rule.action = ConfigActionEnum.CONFIGACTION_SET + config_rule_custom = ConfigRule_Custom() + config_rule_custom.resource_key = request_cr_key + config_rule_custom.resource_value = json.dumps(request_cr_value) + config_rule.custom.CopyFrom(config_rule_custom) + service_config_rules.append(config_rule) + + if 'sessionFilter' in bw_info: + a_ip = bw_info['sessionFilter']['sourceIp'] + z_ip = bw_info['sessionFilter']['dstAddress'] devices = client.ListDevices(Empty()).devices + router_id_counter = 1 for device in devices: + device_endpoint_uuids = {ep.name:ep.endpoint_id.endpoint_uuid.uuid for ep in device.device_endpoints} for cr in device.device_config.config_rules: - if cr.WhichOneof('config_rule') == 'custom' and cr.custom.resource_key == '_connect/settings': - for ep in json.loads(cr.custom.resource_value)['endpoints']: - if 'ip' in ep and (ep['ip'] == a_ip or ep['ip'] == z_ip): - ep_id = EndPointId() - ep_id.endpoint_uuid.uuid = ep['uuid'] - ep_id.device_id.device_uuid.uuid = device.device_id.device_uuid.uuid - service.service_endpoint_ids.append(ep_id) - + if cr.WhichOneof('config_rule') != 'custom': + continue + match_subif = RE_CONFIG_RULE_IF_SUBIF.match(cr.custom.resource_key) + if not match_subif: + continue + address_ip = json.loads(cr.custom.resource_value).get('address_ip') + if address_ip not in [a_ip, z_ip]: + continue + port_name = 'PORT-' + match_subif.groups(0)[0] # `PORT-` added as prefix + ep_id = EndPointId() + ep_id.endpoint_uuid.uuid = device_endpoint_uuids[port_name] + ep_id.device_id.device_uuid.uuid = device.device_id.device_uuid.uuid + service.service_endpoint_ids.append(ep_id) + + # add interface config rules + endpoint_settings_key = ENDPOINT_SETTINGS_KEY.format(device.name, port_name, VLAN_TAG) + if address_ip == a_ip: + field_updates = { + 'address_ip': (address_ip, True), + # 'router_id': ('.'.join([str(router_id_counter)]*4), True), + 'router_id': ('200.1.1.1', True), + 'neighbor_address_ip': ('192.168.150.2', True), + 'route_distinguisher': (route_distinguisher, True), + 'sub_interface_index': (0, True), + 'vlan_id' : (VLAN_TAG, True), + # 'bgp_as': (BGP_AS+router_id_counter, True), + 'bgp_as': (BGP_AS, True), + 'ip_address': (address_ip, True), + 'prefix_length': (PREFIX_LENGTH, True), + 'policy_AZ' : (policy_AZ, True), + 'policy_ZA' : (policy_ZA, True), + 'address_prefix' : (PREFIX_LENGTH, True), + } + elif address_ip == z_ip: + field_updates = { + 'address_ip': (address_ip, True), + # 'router_id': ('.'.join([str(router_id_counter)]*4), True), + 'router_id': ('200.1.1.2', True), + 'neighbor_address_ip': ('192.168.150.1', True), + 'route_distinguisher': (route_distinguisher, True), + 'sub_interface_index': (0, True), + 'vlan_id' : (VLAN_TAG, True), + # 'bgp_as': (BGP_AS+router_id_counter, True), + 'bgp_as': (BGP_AS, True), + 'ip_address': (address_ip, True), + 'prefix_length': (PREFIX_LENGTH, True), + 'policy_AZ' : (policy_ZA, True), + 'policy_ZA' : (policy_AZ, True), + 'address_prefix' : (PREFIX_LENGTH, True), + } + router_id_counter += 1 + LOGGER.debug(f'BEFORE UPDATE -> device.device_config.config_rules: {service_config_rules}') + update_config_rule_custom(service_config_rules, endpoint_settings_key, field_updates) + LOGGER.debug(f'AFTER UPDATE -> device.device_config.config_rules: {service_config_rules}') + + service.service_status.service_status = ServiceStatusEnum.SERVICESTATUS_PLANNED service.service_type = ServiceTypeEnum.SERVICETYPE_L3NM - if 'appInsId' in bwInfo: - service.service_id.service_uuid.uuid = bwInfo['appInsId'] + if 'appInsId' in bw_info: + service.service_id.service_uuid.uuid = bw_info['appInsId'] service.service_id.context_id.context_uuid.uuid = 'admin' - service.name = bwInfo['appInsId'] + service.name = bw_info['appInsId'] - if 'fixedAllocation' in bwInfo: + if 'fixedAllocation' in bw_info: capacity = Constraint_SLA_Capacity() - capacity.capacity_gbps = float(bwInfo['fixedAllocation']) / 1.e9 + capacity.capacity_gbps = float(bw_info['fixedAllocation']) / 1.e9 constraint = Constraint() constraint.sla_capacity.CopyFrom(capacity) service.service_constraints.append(constraint) diff --git a/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py b/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py index 329552a91..498db7dcd 100644 --- a/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py +++ b/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py @@ -24,6 +24,7 @@ SETTINGS_RULE_NAME = '/settings' DEVICE_SETTINGS = re.compile(r'\/device\[([^\]]+)\]\/settings') ENDPOINT_SETTINGS = re.compile(r'\/device\[([^\]]+)\]\/endpoint\[([^\]]+)\]\/settings') +RE_ENDPOINT_VLAN_SETTINGS = re.compile(r'\/device\[([^\]]+)\]\/endpoint\[([^\]]+)\]\/vlan\[([^\]]+)\]\/settings') L2NM_SETTINGS_FIELD_DEFAULTS = { 'encapsulation_type': 'dot1q', @@ -150,6 +151,23 @@ def compose_device_config_rules( device_endpoint_keys = set(itertools.product(device_keys, endpoint_keys)) if len(device_endpoint_keys.intersection(endpoints_traversed)) == 0: continue subservice_config_rules.append(config_rule) + + match = RE_ENDPOINT_VLAN_SETTINGS.match(config_rule.custom.resource_key) + if match is not None: + device_uuid_or_name = match.group(1) + device_name_or_uuid = device_name_mapping[device_uuid_or_name] + device_keys = {device_uuid_or_name, device_name_or_uuid} + + endpoint_uuid_or_name = match.group(2) + endpoint_name_or_uuid_1 = endpoint_name_mapping[(device_uuid_or_name, endpoint_uuid_or_name)] + endpoint_name_or_uuid_2 = endpoint_name_mapping[(device_name_or_uuid, endpoint_uuid_or_name)] + endpoint_keys = {endpoint_uuid_or_name, endpoint_name_or_uuid_1, endpoint_name_or_uuid_2} + + device_endpoint_keys = set(itertools.product(device_keys, endpoint_keys)) + if len(device_endpoint_keys.intersection(endpoints_traversed)) == 0: continue + # ! check later: vlan removed from config_rule + config_rule.custom.resource_key = re.sub('\/vlan\[[^\]]+\]', '', config_rule.custom.resource_key) + subservice_config_rules.append(config_rule) else: continue diff --git a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py index 1e4425cdb..0369d6207 100644 --- a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py +++ b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py @@ -37,6 +37,7 @@ def setup_config_rules( vlan_id = json_endpoint_settings.get('vlan_id', 1 ) # 400 address_ip = json_endpoint_settings.get('address_ip', '0.0.0.0') # '2.2.2.1' address_prefix = json_endpoint_settings.get('address_prefix', 24 ) # 30 + neighbor_address_ip = json_endpoint_settings.get('neighbor_address_ip', '0.0.0.0') # '2.2.2.1' policy_import = json_endpoint_settings.get('policy_AZ', '2' ) # 2 policy_export = json_endpoint_settings.get('policy_ZA', '7' ) # 30 @@ -46,18 +47,21 @@ def setup_config_rules( network_subinterface_desc = json_endpoint_settings.get('subif_description','') #service_short_uuid = service_uuid.split('-')[-1] #network_instance_name = '{:s}-NetInst'.format(service_short_uuid) - network_instance_name = json_endpoint_settings.get('ni_name', service_uuid.split('-')[-1]) #ELAN-AC:1 + # network_instance_name = json_endpoint_settings.get('ni_name', service_uuid.split('-')[-1]) #ELAN-AC:1 + network_instance_name = 'default' - if_subif_name = '{:s}.{:d}'.format(endpoint_name, vlan_id) + ''' + # if_subif_name = '{:s}.{:d}'.format(endpoint_name, vlan_id) + if_subif_name = '{:s}'.format(endpoint_name[5:]) json_config_rules = [ - # Configure Interface (not used) - #json_config_rule_set( + # # Configure Interface (not used) + # json_config_rule_set( # '/interface[{:s}]'.format(endpoint_name), { # 'name': endpoint_name, # 'description': network_interface_desc, # 'mtu': mtu, - #}), + # }), #Create network instance json_config_rule_set( @@ -74,8 +78,10 @@ def setup_config_rules( json_config_rule_set( '/network_instance[{:s}]/protocols[BGP]'.format(network_instance_name), { 'name': network_instance_name, - 'protocol_name': 'BGP', + # 'protocol_name': 'BGP', + 'protocol_name': bgp_as, 'identifier': 'BGP', + # 'identifier': bgp_as, 'as': bgp_as, 'router_id': router_id, }), @@ -101,7 +107,8 @@ def setup_config_rules( json_config_rule_set( '/interface[{:s}]/subinterface[{:d}]'.format(if_subif_name, sub_interface_index), { 'name' : if_subif_name, - 'type' :'l3ipvlan', + # 'type' :'l3ipvlan', + 'type' :'ethernetCsmacd', 'mtu' : mtu, 'index' : sub_interface_index, 'description' : network_subinterface_desc, @@ -183,6 +190,40 @@ def setup_config_rules( }), ] + ''' + if_subif_name = '{:s}'.format(endpoint_name[5:]) + + json_config_rules = [ + + #Add DIRECTLY CONNECTED protocol to network instance + json_config_rule_set( + '/network_instance[{:s}]/protocols[DIRECTLY_CONNECTED]'.format(network_instance_name), { + 'name': network_instance_name, + 'identifier': 'DIRECTLY_CONNECTED', + 'protocol_name': 'DIRECTLY_CONNECTED', + }), + + # Add BGP neighbors + json_config_rule_set( + '/network_instance[{:s}]/protocols[BGP]'.format(network_instance_name), { + 'name': network_instance_name, + 'protocol_name': bgp_as, + 'identifier': 'BGP', + 'as': bgp_as, + 'router_id': router_id, + 'neighbors': [{'ip_address': neighbor_address_ip, 'remote_as': bgp_as}] + }), + json_config_rule_set( + '/network_instance[{:s}]/table_connections[DIRECTLY_CONNECTED][BGP][IPV4]'.format(network_instance_name), { + 'name' : network_instance_name, + 'src_protocol' : 'DIRECTLY_CONNECTED', + 'dst_protocol' : 'BGP', + 'address_family' : 'IPV4', + 'default_import_policy': 'ACCEPT_ROUTE', + }), + + ] + for res_key, res_value in endpoint_acls: json_config_rules.append( {'action': 1, 'acl': res_value} @@ -201,7 +242,8 @@ def teardown_config_rules( json_endpoint_settings : Dict = endpoint_settings.value service_short_uuid = service_uuid.split('-')[-1] - network_instance_name = '{:s}-NetInst'.format(service_short_uuid) + # network_instance_name = '{:s}-NetInst'.format(service_short_uuid) + network_instance_name = json_endpoint_settings.get('ni_name', service_short_uuid) #ELAN-AC:1 #network_interface_desc = '{:s}-NetIf'.format(service_uuid) #network_subinterface_desc = '{:s}-NetSubIf'.format(service_uuid) @@ -262,10 +304,10 @@ def teardown_config_rules( #Delete interface; automatically deletes: # - /interface[]/subinterface[] - json_config_rule_delete('/interface[{:s}]/subinterface[0]'.format(if_subif_name), - { - 'name': if_subif_name, - }), + # json_config_rule_delete('/interface[{:s}]/subinterface[0]'.format(if_subif_name), + # { + # 'name': if_subif_name, + # }), #Delete network instance; automatically deletes: # - /network_instance[]/interface[] -- GitLab From 5d9967880633c624761e6089a8592ec74959d299 Mon Sep 17 00:00:00 2001 From: kpoulakakis Date: Wed, 14 Feb 2024 14:04:11 +0200 Subject: [PATCH 007/602] refactor: Decouple services that needed for monitoring (alarms) and based common policy services. Didn't change any of th existing implementation. --- .../policy/policy/AddPolicyDeviceImpl.java | 80 ++ .../policy/policy/AddPolicyServiceImpl.java | 78 ++ .../tfs/policy/policy/CommonAlarmService.java | 173 ++++ .../policy/CommonPolicyServiceImpl.java | 525 ++++++++++++ .../tfs/policy/policy/DeletePolicyImpl.java | 3 + .../tfs/policy/policy/PolicyServiceImpl.java | 774 +----------------- 6 files changed, 880 insertions(+), 753 deletions(-) create mode 100644 src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyDeviceImpl.java create mode 100644 src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java create mode 100644 src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonAlarmService.java create mode 100644 src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java create mode 100644 src/policy/src/main/java/org/etsi/tfs/policy/policy/DeletePolicyImpl.java diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyDeviceImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyDeviceImpl.java new file mode 100644 index 000000000..1d6302a28 --- /dev/null +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyDeviceImpl.java @@ -0,0 +1,80 @@ +package org.etsi.tfs.policy.policy; + +import static org.etsi.tfs.policy.common.ApplicationProperties.INVALID_MESSAGE; +import static org.etsi.tfs.policy.common.ApplicationProperties.VALIDATED_POLICYRULE_STATE; + +import io.smallrye.mutiny.Uni; +import io.smallrye.mutiny.groups.UniJoin; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import java.util.List; +import org.etsi.tfs.policy.context.ContextService; +import org.etsi.tfs.policy.exception.ExternalServiceFailureException; +import org.etsi.tfs.policy.policy.model.PolicyRule; +import org.etsi.tfs.policy.policy.model.PolicyRuleBasic; +import org.etsi.tfs.policy.policy.model.PolicyRuleDevice; +import org.etsi.tfs.policy.policy.model.PolicyRuleState; +import org.etsi.tfs.policy.policy.model.PolicyRuleStateEnum; +import org.etsi.tfs.policy.policy.model.PolicyRuleTypeDevice; +import org.etsi.tfs.policy.policy.service.PolicyRuleConditionValidator; + +@ApplicationScoped +public class AddPolicyDeviceImpl { + + @Inject private PolicyRuleConditionValidator policyRuleConditionValidator; + + @Inject private CommonPolicyServiceImpl commonPolicyServiceImpl; + @Inject private CommonAlarmService commonAlarmService; + + @Inject private ContextService contextService; + + public Uni> returnInvalidDeviceIds(List deviceIds) { + UniJoin.Builder builder = Uni.join().builder(); + for (String deviceId : deviceIds) { + final var validatedDeviceId = policyRuleConditionValidator.isDeviceIdValid(deviceId); + builder.add(validatedDeviceId); + } + return builder.joinAll().andFailFast(); + } + + public Uni areDeviceOnContext( + List areDevices, + PolicyRuleDevice policyRuleDevice, + PolicyRuleBasic policyRuleBasic) { + if (areDevices.contains(false)) { + var policyRuleState = + new PolicyRuleState( + PolicyRuleStateEnum.POLICY_FAILED, + String.format( + INVALID_MESSAGE, policyRuleDevice.getPolicyRuleBasic().getPolicyRuleId())); + + return Uni.createFrom().item(policyRuleState); + } + + final var policyRuleTypeDevice = new PolicyRuleTypeDevice(policyRuleDevice); + final var policyRule = new PolicyRule(policyRuleTypeDevice); + + final var alarmDescriptorList = commonPolicyServiceImpl.createAlarmDescriptorList(policyRule); + if (alarmDescriptorList.isEmpty()) { + var policyRuleState = + new PolicyRuleState( + PolicyRuleStateEnum.POLICY_FAILED, + String.format( + "Invalid PolicyRuleConditions in PolicyRule with ID: %s", + policyRuleBasic.getPolicyRuleId())); + return Uni.createFrom().item(policyRuleState); + } + + return contextService + .setPolicyRule(policyRule) + .onFailure() + .transform(failure -> new ExternalServiceFailureException(failure.getMessage())) + .onItem() + .transform( + policyId -> { + commonAlarmService.startMonitoringBasedOnAlarmDescriptors( + policyId, policyRuleDevice, alarmDescriptorList); + return VALIDATED_POLICYRULE_STATE; + }); + } +} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java new file mode 100644 index 000000000..978484130 --- /dev/null +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java @@ -0,0 +1,78 @@ +package org.etsi.tfs.policy.policy; + +import static org.etsi.tfs.policy.common.ApplicationProperties.INVALID_MESSAGE; +import static org.etsi.tfs.policy.common.ApplicationProperties.VALIDATED_POLICYRULE_STATE; + +import io.smallrye.mutiny.Uni; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import java.util.List; +import org.etsi.tfs.policy.context.ContextService; +import org.etsi.tfs.policy.context.model.ServiceId; +import org.etsi.tfs.policy.exception.NewException; +import org.etsi.tfs.policy.monitoring.model.AlarmDescriptor; +import org.etsi.tfs.policy.policy.model.PolicyRule; +import org.etsi.tfs.policy.policy.model.PolicyRuleBasic; +import org.etsi.tfs.policy.policy.model.PolicyRuleService; +import org.etsi.tfs.policy.policy.model.PolicyRuleState; +import org.etsi.tfs.policy.policy.model.PolicyRuleStateEnum; +import org.etsi.tfs.policy.policy.model.PolicyRuleTypeService; +import org.jboss.logging.Logger; + +@ApplicationScoped +public class AddPolicyServiceImpl { + private static final Logger LOGGER = Logger.getLogger(AddPolicyServiceImpl.class); + + @Inject private CommonPolicyServiceImpl commonPolicyService; + @Inject private CommonAlarmService commonAlarmService; + @Inject private ContextService contextService; + + public Uni constructPolicyStateBasedOnCriteria( + Boolean isService, + ServiceId serviceId, + PolicyRuleService policyRuleService, + PolicyRuleBasic policyRuleBasic) { + + if (!isService) { + var policyRuleState = + new PolicyRuleState( + PolicyRuleStateEnum.POLICY_FAILED, String.format(INVALID_MESSAGE, serviceId)); + + return Uni.createFrom().item(policyRuleState); + } + + final var policyRuleTypeService = new PolicyRuleTypeService(policyRuleService); + final var policyRule = new PolicyRule(policyRuleTypeService); + final var alarmDescriptorList = commonPolicyService.createAlarmDescriptorList(policyRule); + + if (alarmDescriptorList.isEmpty()) { + var policyRuleState = + new PolicyRuleState( + PolicyRuleStateEnum.POLICY_FAILED, + String.format( + "Invalid PolicyRuleConditions in PolicyRule with ID: %s", + policyRuleBasic.getPolicyRuleId())); + return Uni.createFrom().item(policyRuleState); + } + + return setPolicyRuleOnContextAndReturnState(policyRule, policyRuleService, alarmDescriptorList); + } + + private Uni setPolicyRuleOnContextAndReturnState( + PolicyRule policyRule, + PolicyRuleService policyRuleService, + List alarmDescriptorList) { + return contextService + .setPolicyRule(policyRule) + .onFailure() + .transform(failure -> new NewException(failure.getMessage())) + .onItem() + .transform( + policyId -> { + commonAlarmService.startMonitoringBasedOnAlarmDescriptors( + policyId, policyRuleService, alarmDescriptorList); + + return VALIDATED_POLICYRULE_STATE; + }); + } +} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonAlarmService.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonAlarmService.java new file mode 100644 index 000000000..a5bb7df21 --- /dev/null +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonAlarmService.java @@ -0,0 +1,173 @@ +package org.etsi.tfs.policy.policy; + +import static org.etsi.tfs.policy.common.ApplicationProperties.PROVISIONED_POLICYRULE_STATE; +import static org.etsi.tfs.policy.common.ApplicationProperties.VALIDATED_POLICYRULE_STATE; + +import io.smallrye.mutiny.Multi; +import io.smallrye.mutiny.Uni; +import io.smallrye.mutiny.subscription.Cancellable; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import java.util.ArrayList; +import java.util.List; +import org.etsi.tfs.policy.monitoring.MonitoringService; +import org.etsi.tfs.policy.monitoring.model.AlarmDescriptor; +import org.etsi.tfs.policy.monitoring.model.AlarmResponse; +import org.etsi.tfs.policy.monitoring.model.AlarmSubscription; +import org.etsi.tfs.policy.policy.model.PolicyRuleDevice; +import org.etsi.tfs.policy.policy.model.PolicyRuleService; +import org.jboss.logging.Logger; + +@ApplicationScoped +public class CommonAlarmService { + private static final Logger LOGGER = Logger.getLogger(CommonAlarmService.class); + + @Inject private CommonPolicyServiceImpl commonPolicyServiceImpl; + @Inject private MonitoringService monitoringService; + + public void startMonitoringBasedOnAlarmDescriptors( + String policyId, + PolicyRuleDevice policyRuleDevice, + List alarmDescriptorList) { + commonPolicyServiceImpl.setPolicyRuleDeviceToContext( + policyRuleDevice, VALIDATED_POLICYRULE_STATE); + commonPolicyServiceImpl.noAlarms = 0; + + List> alarmIds = createAlarmList(alarmDescriptorList); + + List> alarmResponseStreamList = + transformAlarmIds(alarmIds, policyRuleDevice); + + // Merge the promised alarms into one stream (Multi Object) + final var multi = Multi.createBy().merging().streams(alarmResponseStreamList); + commonPolicyServiceImpl.setPolicyRuleDeviceToContext( + policyRuleDevice, PROVISIONED_POLICYRULE_STATE); + + commonPolicyServiceImpl + .getSubscriptionList() + .put(policyId, monitorAlarmResponseForDevice(multi)); + + // TODO: Resubscribe to the stream, if it has ended + + // TODO: Redesign evaluation of action + // evaluateAction(policyRule, alarmDescriptorList, multi); + } + + public void startMonitoringBasedOnAlarmDescriptors( + String policyId, + PolicyRuleService policyRuleService, + List alarmDescriptorList) { + commonPolicyServiceImpl.setPolicyRuleServiceToContext( + policyRuleService, VALIDATED_POLICYRULE_STATE); + commonPolicyServiceImpl.noAlarms = 0; + + List> alarmIds = + createAlarmList(alarmDescriptorList); // setAllarmtomonitoring get back alarmid + + List> alarmResponseStreamList = + transformAlarmIds(alarmIds, policyRuleService); + + // Merge the promised alarms into one stream (Multi Object) + final var multi = Multi.createBy().merging().streams(alarmResponseStreamList); + commonPolicyServiceImpl.setPolicyRuleServiceToContext( + policyRuleService, PROVISIONED_POLICYRULE_STATE); + + commonPolicyServiceImpl + .getSubscriptionList() + .put(policyId, monitorAlarmResponseForService(multi)); + + // TODO: Resubscribe to the stream, if it has ended + + // TODO: Redesign evaluation of action + // evaluateAction(policyRule, alarmDescriptorList, multi); + } + + /** + * Transform the alarmIds into promised alarms returned from the getAlarmResponseStream + * + * @param alarmIds the list of alarm ids + * @param policyRuleService the policy rule service + * @return + */ + private List> transformAlarmIds( + List> alarmIds, PolicyRuleService policyRuleService) { + List> alarmResponseStreamList = new ArrayList<>(); + for (Uni alarmId : alarmIds) { + Multi alarmResponseStream = + alarmId.onItem().transformToMulti(id -> setPolicyMonitor(policyRuleService, id)); + + alarmResponseStreamList.add(alarmResponseStream); + } + return alarmResponseStreamList; + } + + private List> transformAlarmIds( + List> alarmIds, PolicyRuleDevice policyRuleDevice) { + // Transform the alarmIds into promised alarms returned from the + // getAlarmResponseStream + List> alarmResponseStreamList = new ArrayList<>(); + for (Uni alarmId : alarmIds) { + alarmResponseStreamList.add( + alarmId.onItem().transformToMulti(id -> setPolicyMonitor(policyRuleDevice, id))); + } + return alarmResponseStreamList; + } + + private Multi setPolicyMonitor(PolicyRuleService policyRuleService, String id) { + commonPolicyServiceImpl.getAlarmPolicyRuleServiceMap().put(id, policyRuleService); + + // TODO: Create infinite subscription + var alarmSubscription = new AlarmSubscription(id, 259200, 5000); + return monitoringService.getAlarmResponseStream(alarmSubscription); + } + + private Multi setPolicyMonitor(PolicyRuleDevice policyRuleDevice, String id) { + commonPolicyServiceImpl.getAlarmPolicyRuleDeviceMap().put(id, policyRuleDevice); + + // TODO: Create infinite subscription + var alarmSubscription = new AlarmSubscription(id, 259200, 5000); + return monitoringService.getAlarmResponseStream(alarmSubscription); + } + + /** + * Create an alarmIds list that contains the promised ids returned from setKpiAlarm + * + * @param alarmDescriptorList the list of alarm descriptors + * @return the list of alarm descriptors + */ + public List> createAlarmList(List alarmDescriptorList) { + List> alarmIds = new ArrayList>(); + for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { + LOGGER.infof("alarmDescriptor:"); + LOGGER.infof(alarmDescriptor.toString()); + alarmIds.add(monitoringService.setKpiAlarm(alarmDescriptor)); + } + return alarmIds; + } + + private Cancellable monitorAlarmResponseForService(Multi multi) { + return multi + .subscribe() + .with( + alarmResponse -> { + LOGGER.infof("**************************Received Alarm!**************************"); + LOGGER.infof("alarmResponse:"); + LOGGER.info(alarmResponse); + LOGGER.info(alarmResponse.getAlarmId()); + commonPolicyServiceImpl.applyActionService(alarmResponse.getAlarmId()); + }); + } + + private Cancellable monitorAlarmResponseForDevice(Multi multi) { + return multi + .subscribe() + .with( + alarmResponse -> { + LOGGER.infof("**************************Received Alarm!**************************"); + LOGGER.infof("alarmResponse:"); + LOGGER.info(alarmResponse); + LOGGER.info(alarmResponse.getAlarmId()); + commonPolicyServiceImpl.applyActionDevice(alarmResponse.getAlarmId()); + }); + } +} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java new file mode 100644 index 000000000..263619f81 --- /dev/null +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java @@ -0,0 +1,525 @@ +package org.etsi.tfs.policy.policy; + +import static org.etsi.tfs.policy.common.ApplicationProperties.ACTIVE_POLICYRULE_STATE; +import static org.etsi.tfs.policy.common.ApplicationProperties.ENFORCED_POLICYRULE_STATE; +import static org.etsi.tfs.policy.common.ApplicationProperties.INVALID_MESSAGE; + +import io.smallrye.mutiny.subscription.Cancellable; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Random; +import java.util.concurrent.ConcurrentHashMap; +import org.etsi.tfs.policy.context.ContextService; +import org.etsi.tfs.policy.context.model.ConfigActionEnum; +import org.etsi.tfs.policy.context.model.ConfigRule; +import org.etsi.tfs.policy.context.model.ConfigRuleCustom; +import org.etsi.tfs.policy.context.model.ConfigRuleTypeCustom; +import org.etsi.tfs.policy.context.model.Constraint; +import org.etsi.tfs.policy.context.model.ConstraintCustom; +import org.etsi.tfs.policy.context.model.ConstraintTypeCustom; +import org.etsi.tfs.policy.context.model.ServiceConfig; +import org.etsi.tfs.policy.device.DeviceService; +import org.etsi.tfs.policy.monitoring.MonitoringService; +import org.etsi.tfs.policy.monitoring.model.AlarmDescriptor; +import org.etsi.tfs.policy.monitoring.model.KpiValueRange; +import org.etsi.tfs.policy.policy.model.BooleanOperator; +import org.etsi.tfs.policy.policy.model.PolicyRule; +import org.etsi.tfs.policy.policy.model.PolicyRuleAction; +import org.etsi.tfs.policy.policy.model.PolicyRuleActionConfig; +import org.etsi.tfs.policy.policy.model.PolicyRuleActionEnum; +import org.etsi.tfs.policy.policy.model.PolicyRuleBasic; +import org.etsi.tfs.policy.policy.model.PolicyRuleCondition; +import org.etsi.tfs.policy.policy.model.PolicyRuleDevice; +import org.etsi.tfs.policy.policy.model.PolicyRuleService; +import org.etsi.tfs.policy.policy.model.PolicyRuleState; +import org.etsi.tfs.policy.policy.model.PolicyRuleStateEnum; +import org.etsi.tfs.policy.policy.model.PolicyRuleTypeDevice; +import org.etsi.tfs.policy.policy.model.PolicyRuleTypeService; +import org.etsi.tfs.policy.service.ServiceService; +import org.jboss.logging.Logger; + +@ApplicationScoped +public class CommonPolicyServiceImpl { + + private static final Logger LOGGER = Logger.getLogger(CommonPolicyServiceImpl.class); + + @Inject private MonitoringService monitoringService; + @Inject private ContextService contextService; + @Inject private ServiceService serviceService; + @Inject private DeviceService deviceService; + + private static final int POLICY_EVALUATION_TIMEOUT = 5; + private static final int ACCEPTABLE_NUMBER_OF_ALARMS = 3; + private static final int MONITORING_WINDOW_IN_SECONDS = 5; + private static final int SAMPLING_RATE_PER_SECOND = 1; + + // TODO: Find a better way to disregard alarms while reconfiguring path + // Temporary solution for not calling the same rpc more than it's needed + public static int noAlarms = 0; + + private ConcurrentHashMap alarmPolicyRuleServiceMap = + new ConcurrentHashMap<>(); + private ConcurrentHashMap alarmPolicyRuleDeviceMap = + new ConcurrentHashMap<>(); + private ConcurrentHashMap subscriptionList = new ConcurrentHashMap<>(); + private HashMap policyRuleActionMap = new HashMap<>(); + + public ConcurrentHashMap getSubscriptionList() { + return subscriptionList; + } + + public ConcurrentHashMap getAlarmPolicyRuleServiceMap() { + return alarmPolicyRuleServiceMap; + } + + public ConcurrentHashMap getAlarmPolicyRuleDeviceMap() { + return alarmPolicyRuleDeviceMap; + } + + public HashMap getPolicyRuleActionMap() { + return policyRuleActionMap; + } + + private static String gen() { + Random r = new Random(System.currentTimeMillis()); + return String.valueOf((1 + r.nextInt(2)) * 10000 + r.nextInt(10000)); + } + + private static double getTimeStamp() { + long now = Instant.now().getEpochSecond(); + return Long.valueOf(now).doubleValue(); + } + + public void applyActionService(String alarmId) { + PolicyRuleService policyRuleService = alarmPolicyRuleServiceMap.get(alarmId); + PolicyRuleAction policyRuleAction = + policyRuleService.getPolicyRuleBasic().getPolicyRuleActions().get(0); + + if (noAlarms == 0) { + noAlarms++; + setPolicyRuleServiceToContext(policyRuleService, ACTIVE_POLICYRULE_STATE); + + switch (policyRuleAction.getPolicyRuleActionEnum()) { + case POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT: + addServiceConstraint(policyRuleService, policyRuleAction); + case POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE: + addServiceConfigRule(policyRuleService, policyRuleAction); + case POLICY_RULE_ACTION_RECALCULATE_PATH: + callRecalculatePathRPC(policyRuleService, policyRuleAction); + default: + LOGGER.errorf(INVALID_MESSAGE, policyRuleAction.getPolicyRuleActionEnum()); + return; + } + } else if (noAlarms == 2) { + noAlarms = 0; + } else { + noAlarms++; + } + } + + public List createAlarmDescriptorList(PolicyRule policyRule) { + final var policyRuleType = policyRule.getPolicyRuleType(); + final var policyRuleTypeSpecificType = policyRuleType.getPolicyRuleType(); + + List alarmDescriptorList = new ArrayList<>(); + if (policyRuleTypeSpecificType instanceof PolicyRuleService) { + final var policyRuleService = (PolicyRuleService) policyRuleTypeSpecificType; + final var policyRuleBasic = policyRuleService.getPolicyRuleBasic(); + + alarmDescriptorList = parsePolicyRuleCondition(policyRuleBasic); + if (alarmDescriptorList.isEmpty()) { + return List.of(); + } + } else { + final var policyRuleDevice = (PolicyRuleDevice) policyRuleTypeSpecificType; + final var policyRuleBasic = policyRuleDevice.getPolicyRuleBasic(); + + alarmDescriptorList = parsePolicyRuleCondition(policyRuleBasic); + if (alarmDescriptorList.isEmpty()) { + return List.of(); + } + for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { + alarmPolicyRuleDeviceMap.put(alarmDescriptor.getAlarmId(), policyRuleDevice); + } + } + + return alarmDescriptorList; + } + + private List parsePolicyRuleCondition(PolicyRuleBasic policyRuleBasic) { + BooleanOperator booleanOperator = policyRuleBasic.getBooleanOperator(); + if (booleanOperator == BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR) { + return parsePolicyRuleConditionOr(policyRuleBasic); + } + if (booleanOperator == BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_AND) { + return Arrays.asList(parsePolicyRuleConditionAnd(policyRuleBasic)); + } + return List.of(); + } + + private List parsePolicyRuleConditionOr(PolicyRuleBasic policyRuleBasic) { + + List policyRuleConditions = policyRuleBasic.getPolicyRuleConditions(); + List alarmDescriptorList = new ArrayList<>(); + + for (PolicyRuleCondition policyRuleCondition : policyRuleConditions) { + var kpiValueRange = convertPolicyRuleConditionToKpiValueRange(policyRuleCondition); + + // TODO: Temp fix for AlarmDescriptor object + AlarmDescriptor alarmDescriptor = + new AlarmDescriptor( + "", + "alarmDescription", + "alarmName-" + gen(), + policyRuleCondition.getKpiId(), + kpiValueRange, + getTimeStamp()); + + alarmDescriptorList.add(alarmDescriptor); + } + + HashMap policyRuleActionMap = new HashMap<>(); + List policyRuleActions = policyRuleBasic.getPolicyRuleActions(); + + for (int i = 0; i < policyRuleActions.size(); i++) { + policyRuleActionMap.put(alarmDescriptorList.get(i).getAlarmId(), policyRuleActions.get(i)); + } + + return alarmDescriptorList; + } + + private AlarmDescriptor parsePolicyRuleConditionAnd(PolicyRuleBasic policyRuleBasic) { + + // TODO: KpiIds should be the same. Add check. + + List policyRuleConditionList = policyRuleBasic.getPolicyRuleConditions(); + List kpisList = new ArrayList(); + + for (PolicyRuleCondition policyRuleCondition : policyRuleConditionList) { + kpisList.add(policyRuleCondition.getKpiId()); + } + + if (policyRuleConditionList.size() > 1) { + return createAlarmDescriptorWithRange(policyRuleConditionList); + } + + return createAlarmDescriptorWithoutRange(policyRuleConditionList.get(0)); + } + + private AlarmDescriptor createAlarmDescriptorWithRange( + List policyRuleConditionList) { + + final var kpiId = policyRuleConditionList.get(0).getKpiId(); + + HashMap KpiValueRangeMap = new HashMap<>(); + for (PolicyRuleCondition policyRuleCondition : policyRuleConditionList) { + + if (!KpiValueRangeMap.containsKey(kpiId)) { + var kpiValueRange = convertPolicyRuleConditionToKpiValueRange(policyRuleCondition); + KpiValueRangeMap.put(kpiId, kpiValueRange); + continue; + } + + var kpiValueRange = convertPolicyRuleConditionToKpiValueRange(policyRuleCondition); + // TODO: Handle combineKpiValueRanges exceptions + var combinedKpiValueRange = + combineKpiValueRanges(kpiId, KpiValueRangeMap.get(kpiId), kpiValueRange); + KpiValueRangeMap.put(kpiId, combinedKpiValueRange); + } + + return new AlarmDescriptor( + "", + "alarmDescription", + "alarmName-" + gen(), + kpiId, + KpiValueRangeMap.get(kpiId), + getTimeStamp()); + } + + private KpiValueRange convertPolicyRuleConditionToKpiValueRange( + PolicyRuleCondition policyRuleCondition) { + + switch (policyRuleCondition.getNumericalOperator()) { + case POLICY_RULE_CONDITION_NUMERICAL_EQUAL: + return new KpiValueRange( + policyRuleCondition.getKpiValue(), policyRuleCondition.getKpiValue(), true, true, true); + case POLICY_RULE_CONDITION_NUMERICAL_NOT_EQUAL: + return new KpiValueRange( + policyRuleCondition.getKpiValue(), + policyRuleCondition.getKpiValue(), + true, + false, + false); + + case POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN: + return new KpiValueRange(null, policyRuleCondition.getKpiValue(), true, false, false); + + case POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL: + return new KpiValueRange(null, policyRuleCondition.getKpiValue(), true, true, false); + + case POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN: + return new KpiValueRange(policyRuleCondition.getKpiValue(), null, true, false, false); + + case POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL: + return new KpiValueRange(policyRuleCondition.getKpiValue(), null, true, false, true); + default: + return null; + } + } + + private KpiValueRange combineKpiValueRanges( + String kpiId, KpiValueRange firstKpiValueRange, KpiValueRange secondKpiValueRange) { + if (secondKpiValueRange.getInRange() == true) { + LOGGER.errorf("KpiId: %s, has already range values", kpiId); + return null; + } + + if ((firstKpiValueRange.getKpiMinValue() != null) + && (secondKpiValueRange.getKpiMinValue() != null)) { + LOGGER.errorf("KpiId: %s, has already min value", kpiId); + return null; + } + + if ((firstKpiValueRange.getKpiMaxValue() != null) + && (secondKpiValueRange.getKpiMinValue() != null)) { + LOGGER.errorf("KpiId: %s, has already max value", kpiId); + return null; + } + + // Objects.nonNull(secondKpiValueRange); + + var kpiMinValue = + firstKpiValueRange.getKpiMinValue() != null + ? firstKpiValueRange.getKpiMinValue() + : secondKpiValueRange.getKpiMinValue(); + var kpiMaxValue = + firstKpiValueRange.getKpiMaxValue() != null + ? firstKpiValueRange.getKpiMaxValue() + : secondKpiValueRange.getKpiMaxValue(); + boolean includeMinValue = + firstKpiValueRange.getIncludeMinValue() || secondKpiValueRange.getIncludeMinValue(); + boolean includeMaxValue = + firstKpiValueRange.getIncludeMaxValue() || secondKpiValueRange.getIncludeMaxValue(); + + return new KpiValueRange(kpiMinValue, kpiMaxValue, true, includeMinValue, includeMaxValue); + } + + private AlarmDescriptor createAlarmDescriptorWithoutRange( + PolicyRuleCondition policyRuleCondition) { + + final var kpiId = policyRuleCondition.getKpiId(); + final var kpiValueRange = convertPolicyRuleConditionToKpiValueRange(policyRuleCondition); + + return new AlarmDescriptor( + "", "alarmDescription", "alarmName-" + gen(), kpiId, kpiValueRange, getTimeStamp()); + } + + // TODO: To be refactored or deprecated + // private void evaluateAction( + // PolicyRule policyRule, + // List alarmDescriptorList, + // Multi multi) { + // + // Long count = + // multi + // .collect() + // .with(Collectors.counting()) + // .await() + // .atMost(Duration.ofMinutes(POLICY_EVALUATION_TIMEOUT)); + // + // if (count > ACCEPTABLE_NUMBER_OF_ALARMS) { + // for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { + // monitoringService + // .deleteAlarm(alarmDescriptor.getAlarmId()) + // .subscribe() + // .with( + // emptyMessage -> + // LOGGER.infof( + // "Alarm [%s] has been deleted as ineffective.\n", + // alarmDescriptor.getAlarmId())); + // } + // setPolicyRuleToContext(policyRule, INEFFECTIVE_POLICYRULE_STATE); + // } else { + // setPolicyRuleToContext(policyRule, EFFECTIVE_POLICYRULE_STATE); + // } + // } + + public void applyActionDevice(String alarmId) { + PolicyRuleDevice policyRuleDevice = alarmPolicyRuleDeviceMap.get(alarmId); + + if (policyRuleActionMap.get(alarmId).getPolicyRuleActionEnum() + == PolicyRuleActionEnum.POLICY_RULE_ACTION_SET_DEVICE_STATUS) { + // In case additional PolicyRuleAction for Devices will be added + } + + setPolicyRuleDeviceToContext(policyRuleDevice, ACTIVE_POLICYRULE_STATE); + + List deviceIds = policyRuleDevice.getDeviceIds(); + List actionConfigs = + policyRuleActionMap.get(alarmId).getPolicyRuleActionConfigs(); + + if (deviceIds.size() != actionConfigs.size()) { + String message = + String.format( + "The number of action parameters in PolicyRuleDevice with ID: %s, is not aligned with the number of devices.", + policyRuleDevice.getPolicyRuleBasic().getPolicyRuleId()); + setPolicyRuleDeviceToContext( + policyRuleDevice, new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, message)); + return; + } + + for (var i = 0; i < deviceIds.size(); i++) { + activateDevice(deviceIds.get(i), actionConfigs.get(i)); + } + + setPolicyRuleDeviceToContext(policyRuleDevice, ENFORCED_POLICYRULE_STATE); + } + + private void activateDevice(String deviceId, PolicyRuleActionConfig actionConfig) { + + Boolean toBeEnabled; + if (actionConfig.getActionKey() == "ENABLED") { + toBeEnabled = true; + } else if (actionConfig.getActionKey() == "DISABLED") { + toBeEnabled = false; + } else { + LOGGER.errorf(INVALID_MESSAGE, actionConfig.getActionKey()); + return; + } + + final var deserializedDeviceUni = contextService.getDevice(deviceId); + + deserializedDeviceUni + .subscribe() + .with( + device -> { + if (toBeEnabled && device.isDisabled()) { + device.enableDevice(); + } else if (!toBeEnabled && device.isEnabled()) { + device.disableDevice(); + } else { + LOGGER.errorf(INVALID_MESSAGE, "Device is already in the desired state"); + return; + } + + deviceService.configureDevice(device); + }); + } + + private void addServiceConfigRule( + PolicyRuleService policyRuleService, PolicyRuleAction policyRuleAction) { + + ConfigActionEnum configActionEnum = ConfigActionEnum.SET; + List actionConfigs = policyRuleAction.getPolicyRuleActionConfigs(); + List newConfigRules = new ArrayList<>(); + + for (PolicyRuleActionConfig actionConfig : actionConfigs) { + ConfigRuleCustom configRuleCustom = + new ConfigRuleCustom(actionConfig.getActionKey(), actionConfig.getActionValue()); + ConfigRuleTypeCustom configRuleType = new ConfigRuleTypeCustom(configRuleCustom); + ConfigRule configRule = new ConfigRule(configActionEnum, configRuleType); + newConfigRules.add(configRule); + } + + var deserializedServiceUni = contextService.getService(policyRuleService.getServiceId()); + deserializedServiceUni + .subscribe() + .with( + deserializedService -> { + List configRules = + deserializedService.getServiceConfig().getConfigRules(); + configRules.addAll(newConfigRules); + deserializedService.setServiceConfig(new ServiceConfig(configRules)); + }); + } + + private void addServiceConstraint( + PolicyRuleService policyRuleService, PolicyRuleAction policyRuleAction) { + + List actionConfigs = policyRuleAction.getPolicyRuleActionConfigs(); + List constraintList = new ArrayList<>(); + + for (PolicyRuleActionConfig actionConfig : actionConfigs) { + var constraintCustom = + new ConstraintCustom(actionConfig.getActionKey(), actionConfig.getActionValue()); + var constraintTypeCustom = new ConstraintTypeCustom(constraintCustom); + constraintList.add(new Constraint(constraintTypeCustom)); + } + + final var deserializedServiceUni = contextService.getService(policyRuleService.getServiceId()); + + deserializedServiceUni + .subscribe() + .with( + deserializedService -> { + deserializedService.appendServiceConstraints(constraintList); + serviceService.updateService(deserializedService); + setPolicyRuleServiceToContext(policyRuleService, ENFORCED_POLICYRULE_STATE); + }); + } + + private void callRecalculatePathRPC( + PolicyRuleService policyRuleService, PolicyRuleAction policyRuleAction) { + + final var deserializedServiceUni = contextService.getService(policyRuleService.getServiceId()); + + deserializedServiceUni + .subscribe() + .with( + deserializedService -> { + serviceService + .recomputeConnections(deserializedService) + .subscribe() + .with( + x -> { + LOGGER.info("called recomputeConnections with:"); + LOGGER.info(deserializedService); + setPolicyRuleServiceToContext(policyRuleService, ENFORCED_POLICYRULE_STATE); + }); + }); + } + + private void setPolicyRuleToContext(PolicyRule policyRule, PolicyRuleState policyRuleState) { + final var policyRuleType = policyRule.getPolicyRuleType(); + final var policyRuleTypeSpecificType = policyRuleType.getPolicyRuleType(); + + if (policyRuleTypeSpecificType instanceof PolicyRuleService) { + setPolicyRuleServiceToContext( + (PolicyRuleService) policyRuleTypeSpecificType, policyRuleState); + } + if (policyRuleTypeSpecificType instanceof PolicyRuleDevice) { + setPolicyRuleDeviceToContext((PolicyRuleDevice) policyRuleTypeSpecificType, policyRuleState); + } + } + + public void setPolicyRuleServiceToContext( + PolicyRuleService policyRuleService, PolicyRuleState policyRuleState) { + LOGGER.infof("Setting Policy Rule state to [%s]", policyRuleState.toString()); + + final var policyRuleBasic = policyRuleService.getPolicyRuleBasic(); + policyRuleBasic.setPolicyRuleState(policyRuleState); + policyRuleService.setPolicyRuleBasic(policyRuleBasic); + + final var policyRuleTypeService = new PolicyRuleTypeService(policyRuleService); + final var policyRule = new PolicyRule(policyRuleTypeService); + contextService.setPolicyRule(policyRule).subscribe().with(x -> {}); + } + + public void setPolicyRuleDeviceToContext( + PolicyRuleDevice policyRuleDevice, PolicyRuleState policyRuleState) { + LOGGER.infof("Setting Policy Rule state to [%s]", policyRuleState.toString()); + + final var policyRuleBasic = policyRuleDevice.getPolicyRuleBasic(); + policyRuleBasic.setPolicyRuleState(policyRuleState); + policyRuleDevice.setPolicyRuleBasic(policyRuleBasic); + + final var policyRuleTypeService = new PolicyRuleTypeDevice(policyRuleDevice); + final var policyRule = new PolicyRule(policyRuleTypeService); + contextService.setPolicyRule(policyRule).subscribe().with(x -> {}); + } +} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/DeletePolicyImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/DeletePolicyImpl.java new file mode 100644 index 000000000..d78d00b83 --- /dev/null +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/DeletePolicyImpl.java @@ -0,0 +1,3 @@ +package org.etsi.tfs.policy.policy; + +public class DeletePolicyImpl {} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/PolicyServiceImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/PolicyServiceImpl.java index 984276f59..8a3a86508 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/PolicyServiceImpl.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/PolicyServiceImpl.java @@ -18,54 +18,18 @@ package org.etsi.tfs.policy.policy; import static org.etsi.tfs.policy.common.ApplicationProperties.*; -import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.Uni; -import io.smallrye.mutiny.groups.UniJoin; -import io.smallrye.mutiny.subscription.Cancellable; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Random; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import org.etsi.tfs.policy.context.ContextService; -import org.etsi.tfs.policy.context.model.ConfigActionEnum; -import org.etsi.tfs.policy.context.model.ConfigRule; -import org.etsi.tfs.policy.context.model.ConfigRuleCustom; -import org.etsi.tfs.policy.context.model.ConfigRuleTypeCustom; -import org.etsi.tfs.policy.context.model.Constraint; -import org.etsi.tfs.policy.context.model.ConstraintCustom; -import org.etsi.tfs.policy.context.model.ConstraintTypeCustom; -import org.etsi.tfs.policy.context.model.ServiceConfig; -import org.etsi.tfs.policy.context.model.ServiceId; -import org.etsi.tfs.policy.device.DeviceService; import org.etsi.tfs.policy.exception.ExternalServiceFailureException; -import org.etsi.tfs.policy.exception.NewException; -import org.etsi.tfs.policy.monitoring.MonitoringService; -import org.etsi.tfs.policy.monitoring.model.AlarmDescriptor; -import org.etsi.tfs.policy.monitoring.model.AlarmResponse; -import org.etsi.tfs.policy.monitoring.model.AlarmSubscription; -import org.etsi.tfs.policy.monitoring.model.KpiValueRange; -import org.etsi.tfs.policy.policy.model.BooleanOperator; import org.etsi.tfs.policy.policy.model.PolicyRule; -import org.etsi.tfs.policy.policy.model.PolicyRuleAction; -import org.etsi.tfs.policy.policy.model.PolicyRuleActionConfig; -import org.etsi.tfs.policy.policy.model.PolicyRuleActionEnum; -import org.etsi.tfs.policy.policy.model.PolicyRuleBasic; -import org.etsi.tfs.policy.policy.model.PolicyRuleCondition; import org.etsi.tfs.policy.policy.model.PolicyRuleDevice; import org.etsi.tfs.policy.policy.model.PolicyRuleService; import org.etsi.tfs.policy.policy.model.PolicyRuleState; import org.etsi.tfs.policy.policy.model.PolicyRuleStateEnum; -import org.etsi.tfs.policy.policy.model.PolicyRuleTypeDevice; -import org.etsi.tfs.policy.policy.model.PolicyRuleTypeService; -import org.etsi.tfs.policy.policy.service.PolicyRuleConditionFieldsGetter; import org.etsi.tfs.policy.policy.service.PolicyRuleConditionValidator; -import org.etsi.tfs.policy.service.ServiceService; import org.jboss.logging.Logger; @ApplicationScoped @@ -73,52 +37,24 @@ public class PolicyServiceImpl implements PolicyService { private static final Logger LOGGER = Logger.getLogger(PolicyServiceImpl.class); - private static final int POLICY_EVALUATION_TIMEOUT = 5; - private static final int ACCEPTABLE_NUMBER_OF_ALARMS = 3; - private static final int MONITORING_WINDOW_IN_SECONDS = 5; - private static final int SAMPLING_RATE_PER_SECOND = 1; - // TODO: Find a better way to disregard alarms while reconfiguring path - // Temporary solution for not calling the same rpc more than it's needed - private static int noAlarms = 0; - private final ContextService contextService; - private final MonitoringService monitoringService; - private final ServiceService serviceService; - private final DeviceService deviceService; private final PolicyRuleConditionValidator policyRuleConditionValidator; - private final PolicyRuleConditionFieldsGetter policyRuleConditionFieldsGetter; - - private HashMap policyRuleActionMap = new HashMap<>(); - private ConcurrentHashMap alarmPolicyRuleServiceMap = - new ConcurrentHashMap<>(); - private ConcurrentHashMap alarmPolicyRuleDeviceMap = - new ConcurrentHashMap<>(); - private ConcurrentHashMap subscriptionList = new ConcurrentHashMap<>(); + private final CommonPolicyServiceImpl commonPolicyServiceImpl; + private final AddPolicyServiceImpl addPolicyServiceImpl; + private final AddPolicyDeviceImpl addPolicyDeviceImpl; @Inject public PolicyServiceImpl( ContextService contextService, - MonitoringService monitoringService, - ServiceService serviceService, - DeviceService deviceService, PolicyRuleConditionValidator policyRuleConditionValidator, - PolicyRuleConditionFieldsGetter policyRuleConditionFieldsGetter) { + CommonPolicyServiceImpl commonPolicyServiceImpl, + AddPolicyServiceImpl addPolicyServiceImpl, + AddPolicyDeviceImpl addPolicyDeviceImpl) { this.contextService = contextService; - this.monitoringService = monitoringService; - this.serviceService = serviceService; - this.deviceService = deviceService; this.policyRuleConditionValidator = policyRuleConditionValidator; - this.policyRuleConditionFieldsGetter = policyRuleConditionFieldsGetter; - } - - private static String gen() { - Random r = new Random(System.currentTimeMillis()); - return String.valueOf((1 + r.nextInt(2)) * 10000 + r.nextInt(10000)); - } - - private static double getTimeStamp() { - long now = Instant.now().getEpochSecond(); - return Long.valueOf(now).doubleValue(); + this.commonPolicyServiceImpl = commonPolicyServiceImpl; + this.addPolicyServiceImpl = addPolicyServiceImpl; + this.addPolicyDeviceImpl = addPolicyDeviceImpl; } @Override @@ -153,128 +89,11 @@ public class PolicyServiceImpl implements PolicyService { .onItem() .transform( isService -> - constructPolicyStateBasedOnCriteria( + addPolicyServiceImpl.constructPolicyStateBasedOnCriteria( isService, serviceId, policyRuleService, policyRuleBasic)) .flatMap(Function.identity()); } - private Uni constructPolicyStateBasedOnCriteria( - Boolean isService, - ServiceId serviceId, - PolicyRuleService policyRuleService, - PolicyRuleBasic policyRuleBasic) { - - if (!isService) { - var policyRuleState = - new PolicyRuleState( - PolicyRuleStateEnum.POLICY_FAILED, String.format(INVALID_MESSAGE, serviceId)); - - return Uni.createFrom().item(policyRuleState); - } - - final var policyRuleTypeService = new PolicyRuleTypeService(policyRuleService); - final var policyRule = new PolicyRule(policyRuleTypeService); - final var alarmDescriptorList = createAlarmDescriptorList(policyRule); - - if (alarmDescriptorList.isEmpty()) { - var policyRuleState = - new PolicyRuleState( - PolicyRuleStateEnum.POLICY_FAILED, - String.format( - "Invalid PolicyRuleConditions in PolicyRule with ID: %s", - policyRuleBasic.getPolicyRuleId())); - return Uni.createFrom().item(policyRuleState); - } - - return setPolicyRuleOnContextAndReturnState(policyRule, policyRuleService, alarmDescriptorList); - } - - private Uni setPolicyRuleOnContextAndReturnState( - PolicyRule policyRule, - PolicyRuleService policyRuleService, - List alarmDescriptorList) { - return contextService - .setPolicyRule(policyRule) - .onFailure() - .transform(failure -> new NewException(failure.getMessage())) - .onItem() - .transform( - policyId -> { - startMonitoringBasedOnAlarmDescriptors( - policyId, policyRuleService, alarmDescriptorList); - - return VALIDATED_POLICYRULE_STATE; - }); - } - - private void startMonitoringBasedOnAlarmDescriptors( - String policyId, - PolicyRuleService policyRuleService, - List alarmDescriptorList) { - setPolicyRuleServiceToContext(policyRuleService, VALIDATED_POLICYRULE_STATE); - noAlarms = 0; - - List> alarmIds = - createAlarmList(alarmDescriptorList); // setAllarmtomonitoring get back alarmid - - List> alarmResponseStreamList = - transformAlarmIds(alarmIds, policyRuleService); - - // Merge the promised alarms into one stream (Multi Object) - final var multi = Multi.createBy().merging().streams(alarmResponseStreamList); - setPolicyRuleServiceToContext(policyRuleService, PROVISIONED_POLICYRULE_STATE); - - subscriptionList.put(policyId, monitorAlarmResponseForService(multi)); - - // TODO: Resubscribe to the stream, if it has ended - - // TODO: Redesign evaluation of action - // evaluateAction(policyRule, alarmDescriptorList, multi); - } - - /** - * Transform the alarmIds into promised alarms returned from the getAlarmResponseStream - * - * @param alarmIds the list of alarm ids - * @param policyRuleService the policy rule service - * @return - */ - private List> transformAlarmIds( - List> alarmIds, PolicyRuleService policyRuleService) { - List> alarmResponseStreamList = new ArrayList<>(); - for (Uni alarmId : alarmIds) { - Multi alarmResponseStream = - alarmId.onItem().transformToMulti(id -> setPolicyMonitor(policyRuleService, id)); - - alarmResponseStreamList.add(alarmResponseStream); - } - return alarmResponseStreamList; - } - - private Multi setPolicyMonitor(PolicyRuleService policyRuleService, String id) { - alarmPolicyRuleServiceMap.put(id, policyRuleService); - - // TODO: Create infinite subscription - var alarmSubscription = new AlarmSubscription(id, 259200, 5000); - return monitoringService.getAlarmResponseStream(alarmSubscription); - } - - /** - * Create an alarmIds list that contains the promised ids returned from setKpiAlarm - * - * @param alarmDescriptorList the list of alarm descriptors - * @return the list of alarm descriptors - */ - public List> createAlarmList(List alarmDescriptorList) { - List> alarmIds = new ArrayList>(); - for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { - LOGGER.infof("alarmDescriptor:"); - LOGGER.infof(alarmDescriptor.toString()); - alarmIds.add(monitoringService.setKpiAlarm(alarmDescriptor)); - } - return alarmIds; - } - @Override public Uni addPolicyDevice(PolicyRuleDevice policyRuleDevice) { LOGGER.infof("Received %s", policyRuleDevice); @@ -298,110 +117,17 @@ public class PolicyServiceImpl implements PolicyService { } final var deviceIds = policyRuleDevice.getDeviceIds(); - final var areDevicesValid = returnInvalidDeviceIds(deviceIds); + final var areDevicesValid = addPolicyDeviceImpl.returnInvalidDeviceIds(deviceIds); return areDevicesValid - .onFailure() - .transform(failure -> new ExternalServiceFailureException(failure.getMessage())) - .onItem() - .transform(areDevices -> areDeviceOnContext(areDevices, policyRuleDevice, policyRuleBasic)) - .flatMap(Function.identity()); - } - - private Uni areDeviceOnContext( - List areDevices, - PolicyRuleDevice policyRuleDevice, - PolicyRuleBasic policyRuleBasic) { - if (areDevices.contains(false)) { - var policyRuleState = - new PolicyRuleState( - PolicyRuleStateEnum.POLICY_FAILED, - String.format( - INVALID_MESSAGE, policyRuleDevice.getPolicyRuleBasic().getPolicyRuleId())); - - return Uni.createFrom().item(policyRuleState); - } - - final var policyRuleTypeDevice = new PolicyRuleTypeDevice(policyRuleDevice); - final var policyRule = new PolicyRule(policyRuleTypeDevice); - - final var alarmDescriptorList = createAlarmDescriptorList(policyRule); - if (alarmDescriptorList.isEmpty()) { - var policyRuleState = - new PolicyRuleState( - PolicyRuleStateEnum.POLICY_FAILED, - String.format( - "Invalid PolicyRuleConditions in PolicyRule with ID: %s", - policyRuleBasic.getPolicyRuleId())); - return Uni.createFrom().item(policyRuleState); - } - - return contextService - .setPolicyRule(policyRule) .onFailure() .transform(failure -> new ExternalServiceFailureException(failure.getMessage())) .onItem() .transform( - policyId -> { - startMonitoringBasedOnAlarmDescriptors( - policyId, policyRuleDevice, alarmDescriptorList); - return VALIDATED_POLICYRULE_STATE; - }); - } - - private void startMonitoringBasedOnAlarmDescriptors( - String policyId, - PolicyRuleDevice policyRuleDevice, - List alarmDescriptorList) { - setPolicyRuleDeviceToContext(policyRuleDevice, VALIDATED_POLICYRULE_STATE); - noAlarms = 0; - - List> alarmIds = getAlarmIds(alarmDescriptorList); - - List> alarmResponseStreamList = - getAlarmResponse(alarmIds, policyRuleDevice); - - // Merge the promised alarms into one stream (Multi Object) - final var multi = Multi.createBy().merging().streams(alarmResponseStreamList); - setPolicyRuleDeviceToContext(policyRuleDevice, PROVISIONED_POLICYRULE_STATE); - - subscriptionList.put(policyId, monitorAlarmResponseForDevice(multi)); - - // TODO: Resubscribe to the stream, if it has ended - - // TODO: Redesign evaluation of action - // evaluateAction(policyRule, alarmDescriptorList, multi); - } - - private List> getAlarmResponse( - List> alarmIds, PolicyRuleDevice policyRuleDevice) { - // Transform the alarmIds into promised alarms returned from the - // getAlarmResponseStream - List> alarmResponseStreamList = new ArrayList<>(); - for (Uni alarmId : alarmIds) { - alarmResponseStreamList.add( - alarmId.onItem().transformToMulti(id -> setPolicyMonitoringDevice(policyRuleDevice, id))); - } - return alarmResponseStreamList; - } - - private Multi setPolicyMonitoringDevice( - PolicyRuleDevice policyRuleDevice, String id) { - alarmPolicyRuleDeviceMap.put(id, policyRuleDevice); - - // TODO: Create infinite subscription - var alarmSubscription = new AlarmSubscription(id, 259200, 5000); - return monitoringService.getAlarmResponseStream(alarmSubscription); - } - - private List> getAlarmIds(List alarmDescriptorList) { - List> alarmIds = new ArrayList>(); - for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { - LOGGER.infof("alarmDescriptor:"); - LOGGER.infof(alarmDescriptor.toString()); - alarmIds.add(monitoringService.setKpiAlarm(alarmDescriptor)); - } - return alarmIds; + areDevices -> + addPolicyDeviceImpl.areDeviceOnContext( + areDevices, policyRuleDevice, policyRuleBasic)) + .flatMap(Function.identity()); } @Override @@ -472,6 +198,8 @@ public class PolicyServiceImpl implements PolicyService { policyRuleConditionValidator.isUpdatedPolicyRuleIdValid(policyRuleId); return isPolicyRuleValid + .onFailure() + .transform(failure -> new ExternalServiceFailureException(failure.getMessage())) .onItem() .transform( isPolicyRuleService -> { @@ -505,6 +233,8 @@ public class PolicyServiceImpl implements PolicyService { contextService .setPolicyRule(policyRule) + .onFailure() + .transform(failure -> new ExternalServiceFailureException(failure.getMessage())) .subscribe() .with( tmp -> @@ -514,471 +244,9 @@ public class PolicyServiceImpl implements PolicyService { contextService.removePolicyRule(policyId).subscribe().with(x -> {}); // TODO: When the Map doesn't contains the policyId we should throw an exception? - if (subscriptionList.contains(policyId)) subscriptionList.get(policyId).cancel(); + if (commonPolicyServiceImpl.getSubscriptionList().contains(policyId)) + commonPolicyServiceImpl.getSubscriptionList().get(policyId).cancel(); return policyRuleBasic.getPolicyRuleState(); } - - private Uni> returnInvalidDeviceIds(List deviceIds) { - UniJoin.Builder builder = Uni.join().builder(); - for (String deviceId : deviceIds) { - final var validatedDeviceId = policyRuleConditionValidator.isDeviceIdValid(deviceId); - builder.add(validatedDeviceId); - } - return builder.joinAll().andFailFast(); - } - - private List createAlarmDescriptorList(PolicyRule policyRule) { - final var policyRuleType = policyRule.getPolicyRuleType(); - final var policyRuleTypeSpecificType = policyRuleType.getPolicyRuleType(); - - List alarmDescriptorList = new ArrayList<>(); - if (policyRuleTypeSpecificType instanceof PolicyRuleService) { - final var policyRuleService = (PolicyRuleService) policyRuleTypeSpecificType; - final var policyRuleBasic = policyRuleService.getPolicyRuleBasic(); - - alarmDescriptorList = parsePolicyRuleCondition(policyRuleBasic); - if (alarmDescriptorList.isEmpty()) { - return List.of(); - } - } else { - final var policyRuleDevice = (PolicyRuleDevice) policyRuleTypeSpecificType; - final var policyRuleBasic = policyRuleDevice.getPolicyRuleBasic(); - - alarmDescriptorList = parsePolicyRuleCondition(policyRuleBasic); - if (alarmDescriptorList.isEmpty()) { - return List.of(); - } - for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { - alarmPolicyRuleDeviceMap.put(alarmDescriptor.getAlarmId(), policyRuleDevice); - } - } - - return alarmDescriptorList; - } - - private Cancellable monitorAlarmResponseForService(Multi multi) { - return multi - .subscribe() - .with( - alarmResponse -> { - LOGGER.infof("**************************Received Alarm!**************************"); - LOGGER.infof("alarmResponse:"); - LOGGER.info(alarmResponse); - LOGGER.info(alarmResponse.getAlarmId()); - applyActionService(alarmResponse.getAlarmId()); - }); - } - - private Cancellable monitorAlarmResponseForDevice(Multi multi) { - return multi - .subscribe() - .with( - alarmResponse -> { - LOGGER.infof("**************************Received Alarm!**************************"); - LOGGER.infof("alarmResponse:"); - LOGGER.info(alarmResponse); - LOGGER.info(alarmResponse.getAlarmId()); - applyActionDevice(alarmResponse.getAlarmId()); - }); - } - - // TODO: To be refactored or deprecated - // private void evaluateAction( - // PolicyRule policyRule, - // List alarmDescriptorList, - // Multi multi) { - // - // Long count = - // multi - // .collect() - // .with(Collectors.counting()) - // .await() - // .atMost(Duration.ofMinutes(POLICY_EVALUATION_TIMEOUT)); - // - // if (count > ACCEPTABLE_NUMBER_OF_ALARMS) { - // for (AlarmDescriptor alarmDescriptor : alarmDescriptorList) { - // monitoringService - // .deleteAlarm(alarmDescriptor.getAlarmId()) - // .subscribe() - // .with( - // emptyMessage -> - // LOGGER.infof( - // "Alarm [%s] has been deleted as ineffective.\n", - // alarmDescriptor.getAlarmId())); - // } - // setPolicyRuleToContext(policyRule, INEFFECTIVE_POLICYRULE_STATE); - // } else { - // setPolicyRuleToContext(policyRule, EFFECTIVE_POLICYRULE_STATE); - // } - // } - - private void applyActionDevice(String alarmId) { - PolicyRuleDevice policyRuleDevice = alarmPolicyRuleDeviceMap.get(alarmId); - - if (policyRuleActionMap.get(alarmId).getPolicyRuleActionEnum() - == PolicyRuleActionEnum.POLICY_RULE_ACTION_SET_DEVICE_STATUS) { - // In case additional PolicyRuleAction for Devices will be added - } - - setPolicyRuleDeviceToContext(policyRuleDevice, ACTIVE_POLICYRULE_STATE); - - List deviceIds = policyRuleDevice.getDeviceIds(); - List actionConfigs = - policyRuleActionMap.get(alarmId).getPolicyRuleActionConfigs(); - - if (deviceIds.size() != actionConfigs.size()) { - String message = - String.format( - "The number of action parameters in PolicyRuleDevice with ID: %s, is not aligned with the number of devices.", - policyRuleDevice.getPolicyRuleBasic().getPolicyRuleId()); - setPolicyRuleDeviceToContext( - policyRuleDevice, new PolicyRuleState(PolicyRuleStateEnum.POLICY_FAILED, message)); - return; - } - - for (var i = 0; i < deviceIds.size(); i++) { - activateDevice(deviceIds.get(i), actionConfigs.get(i)); - } - - setPolicyRuleDeviceToContext(policyRuleDevice, ENFORCED_POLICYRULE_STATE); - } - - private void activateDevice(String deviceId, PolicyRuleActionConfig actionConfig) { - - Boolean toBeEnabled; - if (actionConfig.getActionKey() == "ENABLED") { - toBeEnabled = true; - } else if (actionConfig.getActionKey() == "DISABLED") { - toBeEnabled = false; - } else { - LOGGER.errorf(INVALID_MESSAGE, actionConfig.getActionKey()); - return; - } - - final var deserializedDeviceUni = contextService.getDevice(deviceId); - - deserializedDeviceUni - .subscribe() - .with( - device -> { - if (toBeEnabled && device.isDisabled()) { - device.enableDevice(); - } else if (!toBeEnabled && device.isEnabled()) { - device.disableDevice(); - } else { - LOGGER.errorf(INVALID_MESSAGE, "Device is already in the desired state"); - return; - } - - deviceService.configureDevice(device); - }); - } - - private void addServiceConfigRule( - PolicyRuleService policyRuleService, PolicyRuleAction policyRuleAction) { - - ConfigActionEnum configActionEnum = ConfigActionEnum.SET; - List actionConfigs = policyRuleAction.getPolicyRuleActionConfigs(); - List newConfigRules = new ArrayList<>(); - - for (PolicyRuleActionConfig actionConfig : actionConfigs) { - ConfigRuleCustom configRuleCustom = - new ConfigRuleCustom(actionConfig.getActionKey(), actionConfig.getActionValue()); - ConfigRuleTypeCustom configRuleType = new ConfigRuleTypeCustom(configRuleCustom); - ConfigRule configRule = new ConfigRule(configActionEnum, configRuleType); - newConfigRules.add(configRule); - } - - var deserializedServiceUni = contextService.getService(policyRuleService.getServiceId()); - deserializedServiceUni - .subscribe() - .with( - deserializedService -> { - List configRules = - deserializedService.getServiceConfig().getConfigRules(); - configRules.addAll(newConfigRules); - deserializedService.setServiceConfig(new ServiceConfig(configRules)); - }); - } - - private void addServiceConstraint( - PolicyRuleService policyRuleService, PolicyRuleAction policyRuleAction) { - - List actionConfigs = policyRuleAction.getPolicyRuleActionConfigs(); - List constraintList = new ArrayList<>(); - - for (PolicyRuleActionConfig actionConfig : actionConfigs) { - var constraintCustom = - new ConstraintCustom(actionConfig.getActionKey(), actionConfig.getActionValue()); - var constraintTypeCustom = new ConstraintTypeCustom(constraintCustom); - constraintList.add(new Constraint(constraintTypeCustom)); - } - - final var deserializedServiceUni = contextService.getService(policyRuleService.getServiceId()); - - deserializedServiceUni - .subscribe() - .with( - deserializedService -> { - deserializedService.appendServiceConstraints(constraintList); - serviceService.updateService(deserializedService); - setPolicyRuleServiceToContext(policyRuleService, ENFORCED_POLICYRULE_STATE); - }); - } - - private void callRecalculatePathRPC( - PolicyRuleService policyRuleService, PolicyRuleAction policyRuleAction) { - - final var deserializedServiceUni = contextService.getService(policyRuleService.getServiceId()); - - deserializedServiceUni - .subscribe() - .with( - deserializedService -> { - serviceService - .recomputeConnections(deserializedService) - .subscribe() - .with( - x -> { - LOGGER.info("called recomputeConnections with:"); - LOGGER.info(deserializedService); - setPolicyRuleServiceToContext(policyRuleService, ENFORCED_POLICYRULE_STATE); - }); - }); - } - - private void applyActionService(String alarmId) { - PolicyRuleService policyRuleService = alarmPolicyRuleServiceMap.get(alarmId); - PolicyRuleAction policyRuleAction = - policyRuleService.getPolicyRuleBasic().getPolicyRuleActions().get(0); - - if (noAlarms == 0) { - noAlarms++; - setPolicyRuleServiceToContext(policyRuleService, ACTIVE_POLICYRULE_STATE); - - switch (policyRuleAction.getPolicyRuleActionEnum()) { - case POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT: - addServiceConstraint(policyRuleService, policyRuleAction); - case POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE: - addServiceConfigRule(policyRuleService, policyRuleAction); - case POLICY_RULE_ACTION_RECALCULATE_PATH: - callRecalculatePathRPC(policyRuleService, policyRuleAction); - default: - LOGGER.errorf(INVALID_MESSAGE, policyRuleAction.getPolicyRuleActionEnum()); - return; - } - } else if (noAlarms == 2) { - noAlarms = 0; - } else { - noAlarms++; - } - } - - private List parsePolicyRuleCondition(PolicyRuleBasic policyRuleBasic) { - BooleanOperator booleanOperator = policyRuleBasic.getBooleanOperator(); - if (booleanOperator == BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_OR) { - return parsePolicyRuleConditionOr(policyRuleBasic); - } - if (booleanOperator == BooleanOperator.POLICYRULE_CONDITION_BOOLEAN_AND) { - return Arrays.asList(parsePolicyRuleConditionAnd(policyRuleBasic)); - } - return List.of(); - } - - private List parsePolicyRuleConditionOr(PolicyRuleBasic policyRuleBasic) { - - List policyRuleConditions = policyRuleBasic.getPolicyRuleConditions(); - List alarmDescriptorList = new ArrayList<>(); - - for (PolicyRuleCondition policyRuleCondition : policyRuleConditions) { - var kpiValueRange = convertPolicyRuleConditionToKpiValueRange(policyRuleCondition); - - // TODO: Temp fix for AlarmDescriptor object - AlarmDescriptor alarmDescriptor = - new AlarmDescriptor( - "", - "alarmDescription", - "alarmName-" + gen(), - policyRuleCondition.getKpiId(), - kpiValueRange, - getTimeStamp()); - - alarmDescriptorList.add(alarmDescriptor); - } - - HashMap policyRuleActionMap = new HashMap<>(); - List policyRuleActions = policyRuleBasic.getPolicyRuleActions(); - - for (int i = 0; i < policyRuleActions.size(); i++) { - policyRuleActionMap.put(alarmDescriptorList.get(i).getAlarmId(), policyRuleActions.get(i)); - } - - return alarmDescriptorList; - } - - private AlarmDescriptor parsePolicyRuleConditionAnd(PolicyRuleBasic policyRuleBasic) { - - // TODO: KpiIds should be the same. Add check. - - List policyRuleConditionList = policyRuleBasic.getPolicyRuleConditions(); - List kpisList = new ArrayList(); - - for (PolicyRuleCondition policyRuleCondition : policyRuleConditionList) { - kpisList.add(policyRuleCondition.getKpiId()); - } - - if (policyRuleConditionList.size() > 1) { - return createAlarmDescriptorWithRange(policyRuleConditionList); - } - - return createAlarmDescriptorWithoutRange(policyRuleConditionList.get(0)); - } - - private AlarmDescriptor createAlarmDescriptorWithoutRange( - PolicyRuleCondition policyRuleCondition) { - - final var kpiId = policyRuleCondition.getKpiId(); - final var kpiValueRange = convertPolicyRuleConditionToKpiValueRange(policyRuleCondition); - - return new AlarmDescriptor( - "", "alarmDescription", "alarmName-" + gen(), kpiId, kpiValueRange, getTimeStamp()); - } - - private AlarmDescriptor createAlarmDescriptorWithRange( - List policyRuleConditionList) { - - final var kpiId = policyRuleConditionList.get(0).getKpiId(); - - HashMap KpiValueRangeMap = new HashMap<>(); - for (PolicyRuleCondition policyRuleCondition : policyRuleConditionList) { - - if (!KpiValueRangeMap.containsKey(kpiId)) { - var kpiValueRange = convertPolicyRuleConditionToKpiValueRange(policyRuleCondition); - KpiValueRangeMap.put(kpiId, kpiValueRange); - continue; - } - - var kpiValueRange = convertPolicyRuleConditionToKpiValueRange(policyRuleCondition); - // TODO: Handle combineKpiValueRanges exceptions - var combinedKpiValueRange = - combineKpiValueRanges(kpiId, KpiValueRangeMap.get(kpiId), kpiValueRange); - KpiValueRangeMap.put(kpiId, combinedKpiValueRange); - } - - return new AlarmDescriptor( - "", - "alarmDescription", - "alarmName-" + gen(), - kpiId, - KpiValueRangeMap.get(kpiId), - getTimeStamp()); - } - - private KpiValueRange convertPolicyRuleConditionToKpiValueRange( - PolicyRuleCondition policyRuleCondition) { - - switch (policyRuleCondition.getNumericalOperator()) { - case POLICY_RULE_CONDITION_NUMERICAL_EQUAL: - return new KpiValueRange( - policyRuleCondition.getKpiValue(), policyRuleCondition.getKpiValue(), true, true, true); - case POLICY_RULE_CONDITION_NUMERICAL_NOT_EQUAL: - return new KpiValueRange( - policyRuleCondition.getKpiValue(), - policyRuleCondition.getKpiValue(), - true, - false, - false); - - case POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN: - return new KpiValueRange(null, policyRuleCondition.getKpiValue(), true, false, false); - - case POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL: - return new KpiValueRange(null, policyRuleCondition.getKpiValue(), true, true, false); - - case POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN: - return new KpiValueRange(policyRuleCondition.getKpiValue(), null, true, false, false); - - case POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL: - return new KpiValueRange(policyRuleCondition.getKpiValue(), null, true, false, true); - default: - return null; - } - } - - private KpiValueRange combineKpiValueRanges( - String kpiId, KpiValueRange firstKpiValueRange, KpiValueRange secondKpiValueRange) { - if (secondKpiValueRange.getInRange() == true) { - LOGGER.errorf("KpiId: %s, has already range values", kpiId); - return null; - } - - if ((firstKpiValueRange.getKpiMinValue() != null) - && (secondKpiValueRange.getKpiMinValue() != null)) { - LOGGER.errorf("KpiId: %s, has already min value", kpiId); - return null; - } - - if ((firstKpiValueRange.getKpiMaxValue() != null) - && (secondKpiValueRange.getKpiMinValue() != null)) { - LOGGER.errorf("KpiId: %s, has already max value", kpiId); - return null; - } - - // Objects.nonNull(secondKpiValueRange); - - var kpiMinValue = - firstKpiValueRange.getKpiMinValue() != null - ? firstKpiValueRange.getKpiMinValue() - : secondKpiValueRange.getKpiMinValue(); - var kpiMaxValue = - firstKpiValueRange.getKpiMaxValue() != null - ? firstKpiValueRange.getKpiMaxValue() - : secondKpiValueRange.getKpiMaxValue(); - boolean includeMinValue = - firstKpiValueRange.getIncludeMinValue() || secondKpiValueRange.getIncludeMinValue(); - boolean includeMaxValue = - firstKpiValueRange.getIncludeMaxValue() || secondKpiValueRange.getIncludeMaxValue(); - - return new KpiValueRange(kpiMinValue, kpiMaxValue, true, includeMinValue, includeMaxValue); - } - - private void setPolicyRuleToContext(PolicyRule policyRule, PolicyRuleState policyRuleState) { - final var policyRuleType = policyRule.getPolicyRuleType(); - final var policyRuleTypeSpecificType = policyRuleType.getPolicyRuleType(); - - if (policyRuleTypeSpecificType instanceof PolicyRuleService) { - setPolicyRuleServiceToContext( - (PolicyRuleService) policyRuleTypeSpecificType, policyRuleState); - } - if (policyRuleTypeSpecificType instanceof PolicyRuleDevice) { - setPolicyRuleDeviceToContext((PolicyRuleDevice) policyRuleTypeSpecificType, policyRuleState); - } - } - - private void setPolicyRuleServiceToContext( - PolicyRuleService policyRuleService, PolicyRuleState policyRuleState) { - LOGGER.infof("Setting Policy Rule state to [%s]", policyRuleState.toString()); - - final var policyRuleBasic = policyRuleService.getPolicyRuleBasic(); - policyRuleBasic.setPolicyRuleState(policyRuleState); - policyRuleService.setPolicyRuleBasic(policyRuleBasic); - - final var policyRuleTypeService = new PolicyRuleTypeService(policyRuleService); - final var policyRule = new PolicyRule(policyRuleTypeService); - contextService.setPolicyRule(policyRule).subscribe().with(x -> {}); - } - - private void setPolicyRuleDeviceToContext( - PolicyRuleDevice policyRuleDevice, PolicyRuleState policyRuleState) { - LOGGER.infof("Setting Policy Rule state to [%s]", policyRuleState.toString()); - - final var policyRuleBasic = policyRuleDevice.getPolicyRuleBasic(); - policyRuleBasic.setPolicyRuleState(policyRuleState); - policyRuleDevice.setPolicyRuleBasic(policyRuleBasic); - - final var policyRuleTypeService = new PolicyRuleTypeDevice(policyRuleDevice); - final var policyRule = new PolicyRule(policyRuleTypeService); - contextService.setPolicyRule(policyRule).subscribe().with(x -> {}); - } } -- GitLab From 85ba5e458329734fe377eb7110151eccf9d4d966 Mon Sep 17 00:00:00 2001 From: hajipour Date: Tue, 27 Feb 2024 08:23:26 +0000 Subject: [PATCH 008/602] bgp configuration with VRF support added --- .../templates/VPN/Interfaces_multivendor.py | 3 +- .../VPN/Network_instance_multivendor.py | 73 +++++++++++-------- .../templates/VPN/Routing_policy.py | 13 ++-- .../rest_server/nbi_plugins/etsi_bwm/Tools.py | 29 ++++---- .../l3nm_openconfig/ConfigRules.py | 65 ++++++----------- 5 files changed, 91 insertions(+), 92 deletions(-) diff --git a/src/device/service/drivers/openconfig/templates/VPN/Interfaces_multivendor.py b/src/device/service/drivers/openconfig/templates/VPN/Interfaces_multivendor.py index d6f72ee65..12411bd8a 100644 --- a/src/device/service/drivers/openconfig/templates/VPN/Interfaces_multivendor.py +++ b/src/device/service/drivers/openconfig/templates/VPN/Interfaces_multivendor.py @@ -54,7 +54,8 @@ def create_If_SubIf(data,vendor, DEL): with tag('enabled'):text('true') with tag('subinterfaces'): with tag('subinterface'): - if vendor == 'ADVA': + # if vendor == 'ADVA': + if True: with tag('index'): text('0') with tag('config'): with tag('index'): text('0') diff --git a/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py b/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py index e36955a0d..a8fc97cf9 100644 --- a/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py +++ b/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py @@ -64,10 +64,14 @@ def create_NI(parameters,vendor,DEL): elif "L3VRF" in parameters['type']: with tag('config'): with tag('name'):text(parameters['name']) - if vendor == "ADVA": + if "router_id" in parameters: + with tag('router-id'):text(parameters['router_id']) + # if vendor == "ADVA": + if True: with tag('type', 'xmlns:oc-ni-types="http://openconfig.net/yang/network-instance-types"'):text('oc-ni-types:',parameters['type']) with tag('route-distinguisher'):text(parameters['route_distinguisher']) - if vendor == "ADVA": + # if vendor == "ADVA": + if True: with tag('encapsulation'): with tag('config'): with tag('encapsulation-type', 'xmlns:oc-ni-types="http://openconfig.net/yang/network-instance-types"') :text('oc-ni-types:MPLS') @@ -116,9 +120,6 @@ def add_protocol_NI(parameters,vendor, DEL): else: with tag('network-instance'): with tag('name'):text(parameters['name']) - with tag('config'): - with tag('name'): text(parameters['name']) - with tag('type', 'xmlns:oc-ni-types="http://openconfig.net/yang/network-instance-types"'): text('oc-ni-types:DEFAULT_INSTANCE') with tag('protocols'): with tag('protocol'): with tag('identifier', 'xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):text('oc-pol-types:',parameters['identifier']) @@ -129,36 +130,25 @@ def add_protocol_NI(parameters,vendor, DEL): with tag('enabled'): text('true') if "BGP" in parameters['identifier']: with tag('bgp'): + with tag('name'): text(parameters['as']) with tag('global'): - with tag('afi-safis'): - with tag('afi-safi'): - with tag('afi-safi-name', 'xmlns:oc-bgp-types="http://openconfig.net/yang/bgp-types"'): text('oc-bgp-types:IPV4_UNICAST') - with tag('config'): - with tag('afi-safi-name', 'xmlns:oc-bgp-types="http://openconfig.net/yang/bgp-types"'): text('oc-bgp-types:IPV4_UNICAST') - with tag('enabled'): text('true') with tag('config'): with tag('as') :text(parameters['as']) - with tag('peer-groups'): - with tag('peer-group'): - with tag('peer-group-name'): text('IBGP') - with tag('config'): - with tag('peer-group-name'): text('IBGP') - with tag('peer-as'): text(parameters['protocol_name']) - with tag('afi-safis'): - with tag('afi-safi'): - with tag('afi-safi-name', 'xmlns:oc-bgp-types="http://openconfig.net/yang/bgp-types"'): text('oc-bgp-types:IPV4_UNICAST') - with tag('config'): - with tag('afi-safi-name', 'xmlns:oc-bgp-types="http://openconfig.net/yang/bgp-types"'): text('oc-bgp-types:IPV4_UNICAST') - with tag('enabled'): text('true') - + if "router_id" in parameters: + with tag('router-id'):text(parameters['router_id']) if 'neighbors' in parameters: with tag('neighbors'): - for neighbor in parameters['neighbors']: - with tag('neighbor'): - with tag('neighbor-address'): text(neighbor['ip_address']) - with tag('config'): - with tag('neighbor-address'): text(neighbor['ip_address']) - with tag('peer-group'): text('IBGP') + for neighbor in parameters['neighbors']: + with tag('neighbor'): + with tag('neighbor-address'): text(neighbor['ip_address']) + with tag('afi-safis'): + with tag('afi-safi', 'xmlns:oc-bgp-types="http://openconfig.net/yang/bgp-types"'): + with tag('afi-safi-name'): text('oc-bgp-types:IPV4_UNICAST') + with tag('enabled'): text('true') + with tag('config'): + with tag('neighbor-address'): text(neighbor['ip_address']) + with tag('enabled'): text('true') + with tag('peer-as'): text(parameters['as']) # if vendor == "ADVA": if True: with tag('tables'): @@ -207,6 +197,9 @@ def associate_If_to_NI(parameters, DEL): else: with tag('network-instance'): with tag('name'):text(parameters['name']) + with tag('config'): + with tag('name'):text(parameters['name']) + with tag('type', 'xmlns:oc-ni-types="http://openconfig.net/yang/network-instance-types"'):text('oc-ni-types:L3VRF') with tag('interfaces'): with tag('interface'): with tag('id'):text(parameters['id']) @@ -214,6 +207,25 @@ def associate_If_to_NI(parameters, DEL): with tag('id') :text(parameters['id']) with tag('interface') :text(parameters['interface']) with tag('subinterface'):text(parameters['subinterface']) + with tag('interfaces', 'xmlns="http://openconfig.net/yang/interfaces"'): + with tag('interface'): + with tag('name'):text(parameters['interface']) + with tag('config'): + with tag('name'):text(parameters['interface']) + with tag('subinterfaces'): + with tag('subinterface'): + with tag('index'): text(parameters['subinterface']) + with tag('config'): + with tag('index'): text(parameters['subinterface']) + with tag('ipv4', 'xmlns="http://openconfig.net/yang/interfaces/ip"'): + with tag('config'): + with tag('mtu'): text('1500') + with tag('addresses'): + with tag('address'): + with tag('ip'):text(parameters['address_ip']) + with tag('config'): + with tag('ip'):text(parameters['address_ip']) + with tag('prefix-length'):text(parameters['address_prefix']) result = indent( doc.getvalue(), @@ -356,6 +368,7 @@ def create_table_conns(parameters,DEL): with tag('src-protocol','xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'): text('oc-pol-types:',parameters['src_protocol']) with tag('dst-protocol','xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'): text('oc-pol-types:',parameters['dst_protocol']) with tag('address-family', 'xmlns:oc-types="http://openconfig.net/yang/openconfig-types"'):text('oc-types:',parameters['address_family']) + with tag('dst-instance', 'xmlns="http://www.ipinfusion.com/yang/ocnos/ipi-oc-ni-augments"'):text('65000') if len(parameters['default_import_policy']) != 0: with tag('default-import-policy'):text(parameters['default_import_policy']) result = indent( diff --git a/src/device/service/drivers/openconfig/templates/VPN/Routing_policy.py b/src/device/service/drivers/openconfig/templates/VPN/Routing_policy.py index 54e6c1c01..e1287f9f8 100644 --- a/src/device/service/drivers/openconfig/templates/VPN/Routing_policy.py +++ b/src/device/service/drivers/openconfig/templates/VPN/Routing_policy.py @@ -40,6 +40,7 @@ def create_rp_statement(data, DEL): RP_statement_name = data['statement_name'] RP_policy_result = data['policy_result'] RP_ext_comm_set_name = data['ext_community_set_name'] + RP_sequence_id = data['sequence_id'] with tag('routing-policy', xmlns="http://openconfig.net/yang/routing-policy"): @@ -55,9 +56,9 @@ def create_rp_statement(data, DEL): with tag('name'):text(RP_policy_name) with tag('statements'): with tag('statement'): - with tag('name'):text(RP_statement_name) + with tag('name'):text(RP_sequence_id) with tag('config'): - with tag('name'):text(RP_statement_name) + with tag('name'):text(RP_sequence_id) with tag('conditions'): with tag('config'): with tag('install-protocol-eq', **{'xmlns:openconfig-policy-types': 'http://openconfig.net/yang/policy-types'}):text('openconfig-policy-types:DIRECTLY_CONNECTED') @@ -133,14 +134,14 @@ data_2 = {'ext_community_member' : '65001:101', 'ext_community_set_name' : 'set_srv_101_a'} print('\nRouting Policy Statement - CREATE\n') -print(rp_statement(data_1, False)) +print(create_rp_statement(data_1, False)) print('\nRouting Policy Statement - DELETE\n') -print(rp_statement(data_1, True)) +print(create_rp_statement(data_1, True)) print('\nRouting Policy Defined Set - CREATE\n') -print(rp_defined_set(data_2, False)) +print(create_rp_def(data_2, False)) print('\nRouting Policy Defined Set - DELETE\n') -print(rp_defined_set(data_2, True)) +print(create_rp_def(data_2, True)) ''' ''' diff --git a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py index 3c5d4b5e6..4b7ee7b39 100644 --- a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py +++ b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py @@ -38,8 +38,9 @@ ALLOCATION_DIRECTION_DESCRIPTIONS = { VLAN_TAG = 0 PREFIX_LENGTH = 24 BGP_AS = 65000 -policy_AZ = 'srv_{:d}_a'.format(VLAN_TAG) -policy_ZA = 'srv_{:d}_b'.format(VLAN_TAG) +POLICY_AZ = 'srv_{:d}_a'.format(VLAN_TAG) +POLICY_ZA = 'srv_{:d}_b'.format(VLAN_TAG) +BGP_NETWORK_CIDR = '192.168.150.0/24' def service_2_bwInfo(service: Service) -> dict: response = {} @@ -102,7 +103,6 @@ def bwInfo_2_service(client, bw_info: dict) -> Service: devices = client.ListDevices(Empty()).devices router_id_counter = 1 for device in devices: - device_endpoint_uuids = {ep.name:ep.endpoint_id.endpoint_uuid.uuid for ep in device.device_endpoints} for cr in device.device_config.config_rules: if cr.WhichOneof('config_rule') != 'custom': @@ -118,41 +118,42 @@ def bwInfo_2_service(client, bw_info: dict) -> Service: ep_id.endpoint_uuid.uuid = device_endpoint_uuids[port_name] ep_id.device_id.device_uuid.uuid = device.device_id.device_uuid.uuid service.service_endpoint_ids.append(ep_id) - # add interface config rules endpoint_settings_key = ENDPOINT_SETTINGS_KEY.format(device.name, port_name, VLAN_TAG) if address_ip == a_ip: field_updates = { 'address_ip': (address_ip, True), - # 'router_id': ('.'.join([str(router_id_counter)]*4), True), 'router_id': ('200.1.1.1', True), 'neighbor_address_ip': ('192.168.150.2', True), + 'self_bgp_interface_name': ('xe5', True), + 'self_bgp_interface_address_ip': ('192.168.150.1', True), + 'self_bgp_interface_address_prefix': (PREFIX_LENGTH, True), + 'self_bgp_sub_interface_index': (0, True), 'route_distinguisher': (route_distinguisher, True), 'sub_interface_index': (0, True), - 'vlan_id' : (VLAN_TAG, True), - # 'bgp_as': (BGP_AS+router_id_counter, True), 'bgp_as': (BGP_AS, True), 'ip_address': (address_ip, True), 'prefix_length': (PREFIX_LENGTH, True), - 'policy_AZ' : (policy_AZ, True), - 'policy_ZA' : (policy_ZA, True), + 'policy_AZ' : (POLICY_AZ, True), + 'policy_ZA' : (POLICY_ZA, True), 'address_prefix' : (PREFIX_LENGTH, True), } elif address_ip == z_ip: field_updates = { 'address_ip': (address_ip, True), - # 'router_id': ('.'.join([str(router_id_counter)]*4), True), 'router_id': ('200.1.1.2', True), 'neighbor_address_ip': ('192.168.150.1', True), + 'self_bgp_interface_name': ('xe5', True), + 'self_bgp_interface_address_ip': ('192.168.150.2', True), + 'self_bgp_interface_address_prefix': (PREFIX_LENGTH, True), + 'self_bgp_sub_interface_index': (0, True), 'route_distinguisher': (route_distinguisher, True), 'sub_interface_index': (0, True), - 'vlan_id' : (VLAN_TAG, True), - # 'bgp_as': (BGP_AS+router_id_counter, True), 'bgp_as': (BGP_AS, True), 'ip_address': (address_ip, True), 'prefix_length': (PREFIX_LENGTH, True), - 'policy_AZ' : (policy_ZA, True), - 'policy_ZA' : (policy_AZ, True), + 'policy_AZ' : (POLICY_ZA, True), + 'policy_ZA' : (POLICY_AZ, True), 'address_prefix' : (PREFIX_LENGTH, True), } router_id_counter += 1 diff --git a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py index 0369d6207..2f518d56a 100644 --- a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py +++ b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py @@ -47,11 +47,14 @@ def setup_config_rules( network_subinterface_desc = json_endpoint_settings.get('subif_description','') #service_short_uuid = service_uuid.split('-')[-1] #network_instance_name = '{:s}-NetInst'.format(service_short_uuid) - # network_instance_name = json_endpoint_settings.get('ni_name', service_uuid.split('-')[-1]) #ELAN-AC:1 - network_instance_name = 'default' + network_instance_name = json_endpoint_settings.get('ni_name', service_uuid.split('-')[-1]) #ELAN-AC:1 - ''' - # if_subif_name = '{:s}.{:d}'.format(endpoint_name, vlan_id) + bgp_if_name = json_endpoint_settings.get('self_bgp_interface_name','') + bgp_address_ip = json_endpoint_settings.get('self_bgp_interface_address_ip','') + bgp_address_prefix = json_endpoint_settings.get('self_bgp_interface_address_prefix','') + bgp_sub_interface_index = json_endpoint_settings.get('self_bgp_sub_interface_index', 0 ) + + # if_subif_name = '{:s}.{:d}'.format(endpoint_name, 0) if_subif_name = '{:s}'.format(endpoint_name[5:]) json_config_rules = [ @@ -70,7 +73,7 @@ def setup_config_rules( 'description': network_interface_desc, 'type': 'L3VRF', 'route_distinguisher': route_distinguisher, - #'router_id': router_id, + 'router_id': router_id, #'address_families': address_families, }), @@ -78,12 +81,12 @@ def setup_config_rules( json_config_rule_set( '/network_instance[{:s}]/protocols[BGP]'.format(network_instance_name), { 'name': network_instance_name, - # 'protocol_name': 'BGP', 'protocol_name': bgp_as, 'identifier': 'BGP', - # 'identifier': bgp_as, + 'type': 'L3VRF', 'as': bgp_as, 'router_id': router_id, + 'neighbors': [{'ip_address': neighbor_address_ip, 'remote_as': bgp_as}] }), #Add DIRECTLY CONNECTED protocol to network instance @@ -107,7 +110,6 @@ def setup_config_rules( json_config_rule_set( '/interface[{:s}]/subinterface[{:d}]'.format(if_subif_name, sub_interface_index), { 'name' : if_subif_name, - # 'type' :'l3ipvlan', 'type' :'ethernetCsmacd', 'mtu' : mtu, 'index' : sub_interface_index, @@ -124,6 +126,18 @@ def setup_config_rules( 'id' : if_subif_name, 'interface' : if_subif_name, 'subinterface': sub_interface_index, + 'address_ip' : address_ip, + 'address_prefix': address_prefix, + }), + + json_config_rule_set( + '/network_instance[{:s}]/interface[{:s}]'.format(network_instance_name, bgp_if_name), { + 'name' : network_instance_name, + 'id' : bgp_if_name, + 'interface' : bgp_if_name, + 'subinterface': bgp_sub_interface_index, + 'address_ip' : bgp_address_ip, + 'address_prefix': bgp_address_prefix, }), #Create routing policy @@ -139,6 +153,7 @@ def setup_config_rules( 'statement_name' : 'stm_{:s}'.format(policy_import), 'ext_community_set_name': 'set_{:s}'.format(policy_import), 'policy_result' : 'ACCEPT_ROUTE', + 'sequence_id' : '10' }), #Associate routing policy to network instance @@ -161,6 +176,7 @@ def setup_config_rules( 'statement_name' : 'stm_{:s}'.format(policy_export), 'ext_community_set_name': 'set_{:s}'.format(policy_export), 'policy_result' : 'ACCEPT_ROUTE', + 'sequence_id' : '10' }), #Associate routing policy to network instance @@ -189,39 +205,6 @@ def setup_config_rules( 'default_import_policy': 'ACCEPT_ROUTE', }), - ] - ''' - if_subif_name = '{:s}'.format(endpoint_name[5:]) - - json_config_rules = [ - - #Add DIRECTLY CONNECTED protocol to network instance - json_config_rule_set( - '/network_instance[{:s}]/protocols[DIRECTLY_CONNECTED]'.format(network_instance_name), { - 'name': network_instance_name, - 'identifier': 'DIRECTLY_CONNECTED', - 'protocol_name': 'DIRECTLY_CONNECTED', - }), - - # Add BGP neighbors - json_config_rule_set( - '/network_instance[{:s}]/protocols[BGP]'.format(network_instance_name), { - 'name': network_instance_name, - 'protocol_name': bgp_as, - 'identifier': 'BGP', - 'as': bgp_as, - 'router_id': router_id, - 'neighbors': [{'ip_address': neighbor_address_ip, 'remote_as': bgp_as}] - }), - json_config_rule_set( - '/network_instance[{:s}]/table_connections[DIRECTLY_CONNECTED][BGP][IPV4]'.format(network_instance_name), { - 'name' : network_instance_name, - 'src_protocol' : 'DIRECTLY_CONNECTED', - 'dst_protocol' : 'BGP', - 'address_family' : 'IPV4', - 'default_import_policy': 'ACCEPT_ROUTE', - }), - ] for res_key, res_value in endpoint_acls: -- GitLab From 8f65918fa23fbe19796917affff3f18bec4c62ff Mon Sep 17 00:00:00 2001 From: hajipour Date: Wed, 28 Feb 2024 12:29:12 +0000 Subject: [PATCH 009/602] service creation and deletion with webui added to pyangbind mode and tested --- .../drivers/openconfig/OpenConfigDriver.py | 3 + .../VPN/Network_instance_multivendor.py | 2 +- .../rest_server/nbi_plugins/etsi_bwm/Tools.py | 88 ++++++------ .../l3nm_openconfig/ConfigRules.py | 132 ++++++++++-------- .../L3NMOpenConfigServiceHandler.py | 6 +- 5 files changed, 131 insertions(+), 100 deletions(-) diff --git a/src/device/service/drivers/openconfig/OpenConfigDriver.py b/src/device/service/drivers/openconfig/OpenConfigDriver.py index 99ae1c8db..452f2f7c8 100644 --- a/src/device/service/drivers/openconfig/OpenConfigDriver.py +++ b/src/device/service/drivers/openconfig/OpenConfigDriver.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import time import json import anytree, copy, logging, pytz, queue, re, threading #import lxml.etree as ET @@ -240,6 +241,8 @@ def edit_config( test_option=test_option, error_option=error_option, format=format) if commit_per_rule: netconf_handler.commit() # configuration commit + if 'table_connections' in resource_key: + time.sleep(5) # CPU usage might exceed critical level after route redistribution, BGP daemon needs time to reload #results[i] = True results.append(True) diff --git a/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py b/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py index a8fc97cf9..13612b607 100644 --- a/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py +++ b/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py @@ -357,7 +357,7 @@ def create_table_conns(parameters,DEL): with tag('table-connection','xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete"'): with tag('src-protocol','xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'): text('oc-pol-types:',parameters['src_protocol']) with tag('dst-protocol','xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'): text('oc-pol-types:',parameters['dst_protocol']) - with tag('address-family', 'xmlns:oc-types="http://openconfig.net/yang/openconfig-types"'):text('oc-types:',parameters['dst_protocol']) + with tag('address-family', 'xmlns:oc-types="http://openconfig.net/yang/openconfig-types"'):text('oc-types:',parameters['address_family']) else: with tag('table-connections'): with tag('table-connection'): diff --git a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py index 4b7ee7b39..f32fe5699 100644 --- a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py +++ b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py @@ -29,6 +29,7 @@ from common.tools.object_factory.Service import json_service_id LOGGER = logging.getLogger(__name__) ENDPOINT_SETTINGS_KEY = '/device[{:s}]/endpoint[{:s}]/vlan[{:d}]/settings' +DEVICE_SETTINGS_KEY = '/device[{:s}]/settings' RE_CONFIG_RULE_IF_SUBIF = re.compile(r'^\/interface\[([^\]]+)\]\/subinterface\[([^\]]+)\]$') MEC_CONSIDERED_FIELDS = ['requestType', 'sessionFilter', 'fixedAllocation', 'allocationDirection'] ALLOCATION_DIRECTION_DESCRIPTIONS = { @@ -40,7 +41,11 @@ PREFIX_LENGTH = 24 BGP_AS = 65000 POLICY_AZ = 'srv_{:d}_a'.format(VLAN_TAG) POLICY_ZA = 'srv_{:d}_b'.format(VLAN_TAG) -BGP_NETWORK_CIDR = '192.168.150.0/24' +BGP_NEIGHBOR_IP_A = '192.168.150.1' +BGP_NEIGHBOR_IP_Z = '192.168.150.2' +ROUTER_ID_A = '200.1.1.1' +ROUTER_ID_Z = '200.1.1.2' +ROUTE_DISTINGUISHER = '{:5d}:{:03d}'.format(BGP_AS, VLAN_TAG) def service_2_bwInfo(service: Service) -> dict: response = {} @@ -80,10 +85,6 @@ def bwInfo_2_service(client, bw_info: dict) -> Service: service_config_rules = service.service_config.config_rules - route_distinguisher = '{:5d}:{:03d}'.format(BGP_AS, VLAN_TAG) - settings_cr_key = '/settings' - settings_cr_value = {'bgp_as':(BGP_AS, True), 'route_distinguisher': (route_distinguisher, True)} - update_config_rule_custom(service_config_rules, settings_cr_key, settings_cr_value) request_cr_key = '/request' request_cr_value = {k:bw_info[k] for k in MEC_CONSIDERED_FIELDS} @@ -101,9 +102,10 @@ def bwInfo_2_service(client, bw_info: dict) -> Service: z_ip = bw_info['sessionFilter']['dstAddress'] devices = client.ListDevices(Empty()).devices - router_id_counter = 1 + ip_interface_name_dict = {} for device in devices: device_endpoint_uuids = {ep.name:ep.endpoint_id.endpoint_uuid.uuid for ep in device.device_endpoints} + skip_device = True for cr in device.device_config.config_rules: if cr.WhichOneof('config_rule') != 'custom': continue @@ -111,55 +113,59 @@ def bwInfo_2_service(client, bw_info: dict) -> Service: if not match_subif: continue address_ip = json.loads(cr.custom.resource_value).get('address_ip') + short_port_name = match_subif.groups(0)[0] + ip_interface_name_dict[address_ip] = short_port_name if address_ip not in [a_ip, z_ip]: continue - port_name = 'PORT-' + match_subif.groups(0)[0] # `PORT-` added as prefix + port_name = 'PORT-' + short_port_name # `PORT-` added as prefix ep_id = EndPointId() ep_id.endpoint_uuid.uuid = device_endpoint_uuids[port_name] ep_id.device_id.device_uuid.uuid = device.device_id.device_uuid.uuid service.service_endpoint_ids.append(ep_id) # add interface config rules endpoint_settings_key = ENDPOINT_SETTINGS_KEY.format(device.name, port_name, VLAN_TAG) - if address_ip == a_ip: - field_updates = { + if address_ip in a_ip: + router_id = ROUTER_ID_A + policy_az = POLICY_AZ + policy_za = POLICY_ZA + neighbor_bgp_interface_address_ip = BGP_NEIGHBOR_IP_Z + self_bgp_interface_address_ip = BGP_NEIGHBOR_IP_A + else: + router_id = ROUTER_ID_Z + policy_az = POLICY_ZA + policy_za = POLICY_AZ + neighbor_bgp_interface_address_ip= BGP_NEIGHBOR_IP_A + self_bgp_interface_address_ip = BGP_NEIGHBOR_IP_Z + endpoint_field_updates = { 'address_ip': (address_ip, True), - 'router_id': ('200.1.1.1', True), - 'neighbor_address_ip': ('192.168.150.2', True), - 'self_bgp_interface_name': ('xe5', True), - 'self_bgp_interface_address_ip': ('192.168.150.1', True), - 'self_bgp_interface_address_prefix': (PREFIX_LENGTH, True), - 'self_bgp_sub_interface_index': (0, True), - 'route_distinguisher': (route_distinguisher, True), - 'sub_interface_index': (0, True), - 'bgp_as': (BGP_AS, True), - 'ip_address': (address_ip, True), - 'prefix_length': (PREFIX_LENGTH, True), - 'policy_AZ' : (POLICY_AZ, True), - 'policy_ZA' : (POLICY_ZA, True), 'address_prefix' : (PREFIX_LENGTH, True), - } - elif address_ip == z_ip: - field_updates = { - 'address_ip': (address_ip, True), - 'router_id': ('200.1.1.2', True), - 'neighbor_address_ip': ('192.168.150.1', True), - 'self_bgp_interface_name': ('xe5', True), - 'self_bgp_interface_address_ip': ('192.168.150.2', True), - 'self_bgp_interface_address_prefix': (PREFIX_LENGTH, True), - 'self_bgp_sub_interface_index': (0, True), - 'route_distinguisher': (route_distinguisher, True), 'sub_interface_index': (0, True), - 'bgp_as': (BGP_AS, True), - 'ip_address': (address_ip, True), - 'prefix_length': (PREFIX_LENGTH, True), - 'policy_AZ' : (POLICY_ZA, True), - 'policy_ZA' : (POLICY_AZ, True), - 'address_prefix' : (PREFIX_LENGTH, True), } - router_id_counter += 1 LOGGER.debug(f'BEFORE UPDATE -> device.device_config.config_rules: {service_config_rules}') - update_config_rule_custom(service_config_rules, endpoint_settings_key, field_updates) + update_config_rule_custom(service_config_rules, endpoint_settings_key, endpoint_field_updates) LOGGER.debug(f'AFTER UPDATE -> device.device_config.config_rules: {service_config_rules}') + skip_device = False + if skip_device: + continue + device_field_updates = { + 'bgp_as':(BGP_AS, True), + 'route_distinguisher': (ROUTE_DISTINGUISHER, True), + 'router_id': (router_id, True), + 'policy_AZ': (policy_az, True), + 'policy_ZA': (policy_za, True), + 'neighbor_bgp_interface_address_ip': (neighbor_bgp_interface_address_ip, True), + 'self_bgp_interface_name': (ip_interface_name_dict[self_bgp_interface_address_ip], True), + 'self_bgp_interface_address_ip': (self_bgp_interface_address_ip, True), + 'bgp_interface_address_prefix': (PREFIX_LENGTH, True) + } + device_settings_key = DEVICE_SETTINGS_KEY.format(device.name) + LOGGER.debug(f'BEFORE UPDATE -> device.device_config.config_rules: {service_config_rules}') + update_config_rule_custom(service_config_rules, device_settings_key, device_field_updates) + LOGGER.debug(f'AFTER UPDATE -> device.device_config.config_rules: {service_config_rules}') + + settings_cr_key = '/settings' + settings_cr_value = {} + update_config_rule_custom(service_config_rules, settings_cr_key, settings_cr_value) service.service_status.service_status = ServiceStatusEnum.SERVICESTATUS_PLANNED service.service_type = ServiceTypeEnum.SERVICETYPE_L3NM diff --git a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py index 2f518d56a..cee44641a 100644 --- a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py +++ b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py @@ -18,29 +18,30 @@ from service.service.service_handler_api.AnyTreeTools import TreeNode def setup_config_rules( service_uuid : str, connection_uuid : str, device_uuid : str, endpoint_uuid : str, endpoint_name : str, - service_settings : TreeNode, endpoint_settings : TreeNode, endpoint_acls : List [Tuple] + service_settings : TreeNode, endpoint_settings : TreeNode, endpoint_acls : List [Tuple], device_settings: TreeNode ) -> List[Dict]: if service_settings is None: return [] if endpoint_settings is None: return [] + if device_settings is None: return [] json_settings : Dict = service_settings.value json_endpoint_settings : Dict = endpoint_settings.value + json_device_settings : Dict = device_settings.value mtu = json_settings.get('mtu', 1450 ) # 1512 #address_families = json_settings.get('address_families', [] ) # ['IPV4'] - bgp_as = json_settings.get('bgp_as', 65000 ) # 65000 + bgp_as = json_device_settings.get('bgp_as', 65000 ) # 65000 - router_id = json_endpoint_settings.get('router_id', '0.0.0.0') # '10.95.0.10' - route_distinguisher = json_settings.get('route_distinguisher', '65000:101' ) # '60001:801' + router_id = json_device_settings.get('router_id', '0.0.0.0') # '10.95.0.10' + route_distinguisher = json_device_settings.get('route_distinguisher', '65000:101' ) # '60001:801' sub_interface_index = json_endpoint_settings.get('sub_interface_index', 0 ) # 1 vlan_id = json_endpoint_settings.get('vlan_id', 1 ) # 400 address_ip = json_endpoint_settings.get('address_ip', '0.0.0.0') # '2.2.2.1' address_prefix = json_endpoint_settings.get('address_prefix', 24 ) # 30 - neighbor_address_ip = json_endpoint_settings.get('neighbor_address_ip', '0.0.0.0') # '2.2.2.1' - policy_import = json_endpoint_settings.get('policy_AZ', '2' ) # 2 - policy_export = json_endpoint_settings.get('policy_ZA', '7' ) # 30 + policy_import = json_device_settings.get('policy_AZ', '2' ) # 2 + policy_export = json_device_settings.get('policy_ZA', '7' ) # 30 #network_interface_desc = '{:s}-NetIf'.format(service_uuid) network_interface_desc = json_endpoint_settings.get('ni_description','') #network_subinterface_desc = '{:s}-NetSubIf'.format(service_uuid) @@ -49,10 +50,11 @@ def setup_config_rules( #network_instance_name = '{:s}-NetInst'.format(service_short_uuid) network_instance_name = json_endpoint_settings.get('ni_name', service_uuid.split('-')[-1]) #ELAN-AC:1 - bgp_if_name = json_endpoint_settings.get('self_bgp_interface_name','') - bgp_address_ip = json_endpoint_settings.get('self_bgp_interface_address_ip','') - bgp_address_prefix = json_endpoint_settings.get('self_bgp_interface_address_prefix','') - bgp_sub_interface_index = json_endpoint_settings.get('self_bgp_sub_interface_index', 0 ) + self_bgp_if_name = json_device_settings.get('self_bgp_interface_name', '') + self_bgp_address_ip = json_device_settings.get('self_bgp_interface_address_ip', '') + bgp_address_prefix = json_device_settings.get('bgp_interface_address_prefix', '') + bgp_sub_interface_index = json_device_settings.get('self_bgp_sub_interface_index', 0) + neighbor_bgp_if_address_ip= json_device_settings.get('neighbor_bgp_interface_address_ip', '0.0.0.0') # '2.2.2.1' # if_subif_name = '{:s}.{:d}'.format(endpoint_name, 0) if_subif_name = '{:s}'.format(endpoint_name[5:]) @@ -86,7 +88,7 @@ def setup_config_rules( 'type': 'L3VRF', 'as': bgp_as, 'router_id': router_id, - 'neighbors': [{'ip_address': neighbor_address_ip, 'remote_as': bgp_as}] + 'neighbors': [{'ip_address': neighbor_bgp_if_address_ip, 'remote_as': bgp_as}] }), #Add DIRECTLY CONNECTED protocol to network instance @@ -96,7 +98,6 @@ def setup_config_rules( 'identifier': 'DIRECTLY_CONNECTED', 'protocol_name': 'DIRECTLY_CONNECTED', }), - #Add STATIC protocol to network instance json_config_rule_set( @@ -131,12 +132,12 @@ def setup_config_rules( }), json_config_rule_set( - '/network_instance[{:s}]/interface[{:s}]'.format(network_instance_name, bgp_if_name), { + '/network_instance[{:s}]/interface[{:s}]'.format(network_instance_name, self_bgp_if_name), { 'name' : network_instance_name, - 'id' : bgp_if_name, - 'interface' : bgp_if_name, + 'id' : self_bgp_if_name, + 'interface' : self_bgp_if_name, 'subinterface': bgp_sub_interface_index, - 'address_ip' : bgp_address_ip, + 'address_ip' : self_bgp_address_ip, 'address_prefix': bgp_address_prefix, }), @@ -215,76 +216,75 @@ def setup_config_rules( def teardown_config_rules( service_uuid : str, connection_uuid : str, device_uuid : str, endpoint_uuid : str, endpoint_name : str, - service_settings : TreeNode, endpoint_settings : TreeNode + service_settings : TreeNode, endpoint_settings : TreeNode, device_settings: TreeNode ) -> List[Dict]: if service_settings is None: return [] if endpoint_settings is None: return [] + if device_settings is None: return [] json_settings : Dict = service_settings.value json_endpoint_settings : Dict = endpoint_settings.value + json_device_settings : Dict = device_settings.value service_short_uuid = service_uuid.split('-')[-1] # network_instance_name = '{:s}-NetInst'.format(service_short_uuid) network_instance_name = json_endpoint_settings.get('ni_name', service_short_uuid) #ELAN-AC:1 #network_interface_desc = '{:s}-NetIf'.format(service_uuid) - #network_subinterface_desc = '{:s}-NetSubIf'.format(service_uuid) + # network_subinterface_desc = '{:s}-NetSubIf'.format(service_uuid) + network_subinterface_desc = '' - #mtu = json_settings.get('mtu', 1450 ) # 1512 + mtu = json_settings.get('mtu', 1450 ) # 1512 #address_families = json_settings.get('address_families', [] ) # ['IPV4'] - #bgp_as = json_settings.get('bgp_as', 65000 ) # 65000 - route_distinguisher = json_settings.get('route_distinguisher', '0:0' ) # '60001:801' - #sub_interface_index = json_endpoint_settings.get('sub_interface_index', 0 ) # 1 - #router_id = json_endpoint_settings.get('router_id', '0.0.0.0') # '10.95.0.10' - vlan_id = json_endpoint_settings.get('vlan_id', 1 ) # 400 - #address_ip = json_endpoint_settings.get('address_ip', '0.0.0.0') # '2.2.2.1' - #address_prefix = json_endpoint_settings.get('address_prefix', 24 ) # 30 - policy_import = json_endpoint_settings.get('policy_AZ', '2' ) # 2 - policy_export = json_endpoint_settings.get('policy_ZA', '7' ) # 30 - - if_subif_name = '{:s}.{:d}'.format(endpoint_name, vlan_id) + bgp_as = json_device_settings.get('bgp_as', 65000 ) # 65000 + route_distinguisher = json_device_settings.get('route_distinguisher', '0:0' ) # '60001:801' + sub_interface_index = json_endpoint_settings.get('sub_interface_index', 0 ) # 1 + router_id = json_device_settings.get('router_id', '0.0.0.0') # '10.95.0.10' + vlan_id = json_endpoint_settings.get('vlan_id', 1 ) # 400 + address_ip = json_endpoint_settings.get('address_ip', '0.0.0.0') # '2.2.2.1' + address_prefix = json_endpoint_settings.get('address_prefix', 24 ) # 30 + policy_import = json_device_settings.get('policy_AZ', '2' ) # 2 + policy_export = json_device_settings.get('policy_ZA', '7' ) # 30 - json_config_rules = [ - #Delete table connections - json_config_rule_delete( - '/network_instance[{:s}]/table_connections[DIRECTLY_CONNECTED][BGP][IPV4]'.format(network_instance_name),{ - 'name' : network_instance_name, - 'src_protocol' : 'DIRECTLY_CONNECTED', - 'dst_protocol' : 'BGP', - 'address_family': 'IPV4', - }), + self_bgp_if_name = json_device_settings.get('self_bgp_interface_name', '') + self_bgp_address_ip = json_device_settings.get('self_bgp_interface_address_ip', '') + bgp_address_prefix = json_device_settings.get('bgp_interface_address_prefix', '') + bgp_sub_interface_index = json_device_settings.get('self_bgp_sub_interface_index', 0) - - json_config_rule_delete( - '/network_instance[{:s}]/table_connections[STATIC][BGP][IPV4]'.format(network_instance_name), { - 'name' : network_instance_name, - 'src_protocol' : 'STATIC', - 'dst_protocol' : 'BGP', - 'address_family': 'IPV4', - }), + # if_subif_name = '{:s}.{:d}'.format(endpoint_name, vlan_id) + if_subif_name = '{:s}'.format(endpoint_name[5:]) + json_config_rules = [ #Delete export routing policy - json_config_rule_delete( - '/routing_policy/policy_definition[{:s}_export]'.format(network_instance_name), { - 'policy_name': '{:s}_export'.format(network_instance_name), + # pylint: disable=duplicate-string-formatting-argument + '/routing_policy/policy_definition[{:s}_export]/statement[{:s}]'.format(policy_export, policy_export), { + 'policy_name' : policy_export, + 'statement_name' : 'stm_{:s}'.format(policy_export), + 'ext_community_set_name': 'set_{:s}'.format(policy_export), + 'policy_result' : 'ACCEPT_ROUTE', + 'sequence_id' : '10' }), json_config_rule_delete( '/routing_policy/bgp_defined_set[{:s}_rt_export][{:s}]'.format(policy_export, route_distinguisher), { 'ext_community_set_name': 'set_{:s}'.format(policy_export), + 'ext_community_member' : route_distinguisher, }), - #Delete import routing policy - json_config_rule_delete( - '/routing_policy/policy_definition[{:s}_import]'.format(network_instance_name), { - 'policy_name': '{:s}_import'.format(network_instance_name), + # pylint: disable=duplicate-string-formatting-argument + '/routing_policy/policy_definition[{:s}_import]/statement[{:s}]'.format(policy_import, policy_import), { + 'policy_name' : policy_import, + 'statement_name' : 'stm_{:s}'.format(policy_import), + 'ext_community_set_name': 'set_{:s}'.format(policy_import), + 'policy_result' : 'ACCEPT_ROUTE', + 'sequence_id' : '10' }), json_config_rule_delete( '/routing_policy/bgp_defined_set[{:s}_rt_import][{:s}]'.format(policy_import, route_distinguisher), { 'ext_community_set_name': 'set_{:s}'.format(policy_import), + 'ext_community_member' : route_distinguisher, }), - #Delete interface; automatically deletes: # - /interface[]/subinterface[] # json_config_rule_delete('/interface[{:s}]/subinterface[0]'.format(if_subif_name), @@ -296,6 +296,26 @@ def teardown_config_rules( # - /network_instance[]/interface[] # - /network_instance[]/protocols[] # - /network_instance[]/inter_instance_policies[] + + #Associate interface to network instance + json_config_rule_set( + '/network_instance[{:s}]/interface[{:s}]'.format('default', if_subif_name), { + 'name' : 'default', + 'id' : if_subif_name, + 'interface' : if_subif_name, + 'subinterface': sub_interface_index, + 'address_ip' : address_ip, + 'address_prefix': address_prefix, + }), + json_config_rule_set( + '/network_instance[{:s}]/interface[{:s}]'.format('default', self_bgp_if_name), { + 'name' : 'default', + 'id' : self_bgp_if_name, + 'interface' : self_bgp_if_name, + 'subinterface': bgp_sub_interface_index, + 'address_ip' : self_bgp_address_ip, + 'address_prefix': bgp_address_prefix, + }), json_config_rule_delete('/network_instance[{:s}]'.format(network_instance_name), { 'name': network_instance_name diff --git a/src/service/service/service_handlers/l3nm_openconfig/L3NMOpenConfigServiceHandler.py b/src/service/service/service_handlers/l3nm_openconfig/L3NMOpenConfigServiceHandler.py index 3f8a6d9dd..d061573db 100644 --- a/src/service/service/service_handlers/l3nm_openconfig/L3NMOpenConfigServiceHandler.py +++ b/src/service/service/service_handlers/l3nm_openconfig/L3NMOpenConfigServiceHandler.py @@ -52,6 +52,7 @@ class L3NMOpenConfigServiceHandler(_ServiceHandler): device_uuid, endpoint_uuid = get_device_endpoint_uuids(endpoint) device_obj = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) + device_settings = self.__settings_handler.get_device_settings(device_obj) endpoint_obj = get_endpoint_matching(device_obj, endpoint_uuid) endpoint_settings = self.__settings_handler.get_endpoint_settings(device_obj, endpoint_obj) endpoint_acls = self.__settings_handler.get_endpoint_acls(device_obj, endpoint_obj) @@ -59,7 +60,7 @@ class L3NMOpenConfigServiceHandler(_ServiceHandler): json_config_rules = setup_config_rules( service_uuid, connection_uuid, device_uuid, endpoint_uuid, endpoint_name, - settings, endpoint_settings, endpoint_acls) + settings, endpoint_settings, endpoint_acls, device_settings) if len(json_config_rules) > 0: del device_obj.device_config.config_rules[:] @@ -90,13 +91,14 @@ class L3NMOpenConfigServiceHandler(_ServiceHandler): device_uuid, endpoint_uuid = get_device_endpoint_uuids(endpoint) device_obj = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) + device_settings = self.__settings_handler.get_device_settings(device_obj) endpoint_obj = get_endpoint_matching(device_obj, endpoint_uuid) endpoint_settings = self.__settings_handler.get_endpoint_settings(device_obj, endpoint_obj) endpoint_name = endpoint_obj.name json_config_rules = teardown_config_rules( service_uuid, connection_uuid, device_uuid, endpoint_uuid, endpoint_name, - settings, endpoint_settings) + settings, endpoint_settings, device_settings) if len(json_config_rules) > 0: del device_obj.device_config.config_rules[:] -- GitLab From f6afa0c7cebe50e35ad3abe59b1dbe15e06c8294 Mon Sep 17 00:00:00 2001 From: hajipour Date: Wed, 28 Feb 2024 16:28:34 +0000 Subject: [PATCH 010/602] service creation and deletion with webui added to jinja mode --- .../drivers/openconfig/OpenConfigDriver.py | 5 +-- .../drivers/openconfig/templates/__init__.py | 2 +- .../interface/subinterface/edit_config.xml | 13 ------- .../network_instance/edit_config.xml | 2 +- .../interface/edit_config.xml | 34 +++++++++++++++++++ .../protocols/edit_config.xml | 22 ++++++++++++ .../table_connections/edit_config.xml | 1 + .../statement/edit_config.xml | 4 +-- .../l3nm_openconfig/ConfigRules.py | 2 ++ 9 files changed, 64 insertions(+), 21 deletions(-) diff --git a/src/device/service/drivers/openconfig/OpenConfigDriver.py b/src/device/service/drivers/openconfig/OpenConfigDriver.py index 452f2f7c8..476c2f0cc 100644 --- a/src/device/service/drivers/openconfig/OpenConfigDriver.py +++ b/src/device/service/drivers/openconfig/OpenConfigDriver.py @@ -227,11 +227,8 @@ def edit_config( chk_length(str_resource_name, resource, min_length=2, max_length=2) resource_key,resource_value = resource chk_string(str_resource_name + '.key', resource_key, allow_empty=False) - str_config_messages = compose_config( # get template for configuration - resource_key, resource_value, delete=delete, vendor=netconf_handler.vendor, message_renderer='pyangbind') - # str_config_messages = compose_config( # get template for configuration - # resource_key, resource_value, delete=delete, vendor=netconf_handler.vendor, message_renderer=netconf_handler.message_renderer) + resource_key, resource_value, delete=delete, vendor=netconf_handler.vendor, message_renderer=netconf_handler.message_renderer) for str_config_message in str_config_messages: # configuration of the received templates if str_config_message is None: raise UnsupportedResourceKeyException(resource_key) logger.debug('[{:s}] str_config_message[{:d}] = {:s}'.format( diff --git a/src/device/service/drivers/openconfig/templates/__init__.py b/src/device/service/drivers/openconfig/templates/__init__.py index 87eea1f0b..b1d8de511 100644 --- a/src/device/service/drivers/openconfig/templates/__init__.py +++ b/src/device/service/drivers/openconfig/templates/__init__.py @@ -121,7 +121,7 @@ def compose_config( # template generation templates.append(JINJA_ENV.get_template('acl/acl-set/acl-entry/edit_config.xml')) templates.append(JINJA_ENV.get_template('acl/interfaces/ingress/edit_config.xml')) data : Dict[str, Any] = json.loads(resource_value) - operation = 'delete' if delete else 'merge' + operation = 'delete' if delete else '' return [ '{:s}'.format( diff --git a/src/device/service/drivers/openconfig/templates/interface/subinterface/edit_config.xml b/src/device/service/drivers/openconfig/templates/interface/subinterface/edit_config.xml index e44100400..9cff1afd3 100644 --- a/src/device/service/drivers/openconfig/templates/interface/subinterface/edit_config.xml +++ b/src/device/service/drivers/openconfig/templates/interface/subinterface/edit_config.xml @@ -30,19 +30,6 @@ {% endif %} - {% if address_ip is defined %} - - - - {{address_ip}} - - {{address_ip}} - {{address_prefix}} - - - - - {% endif %} {% endif %} diff --git a/src/device/service/drivers/openconfig/templates/network_instance/edit_config.xml b/src/device/service/drivers/openconfig/templates/network_instance/edit_config.xml index 6b6b733da..891881867 100644 --- a/src/device/service/drivers/openconfig/templates/network_instance/edit_config.xml +++ b/src/device/service/drivers/openconfig/templates/network_instance/edit_config.xml @@ -1,5 +1,5 @@ - + {{name}} {% if operation is not defined or operation != 'delete' %} diff --git a/src/device/service/drivers/openconfig/templates/network_instance/interface/edit_config.xml b/src/device/service/drivers/openconfig/templates/network_instance/interface/edit_config.xml index 855f321b4..96e13cc37 100644 --- a/src/device/service/drivers/openconfig/templates/network_instance/interface/edit_config.xml +++ b/src/device/service/drivers/openconfig/templates/network_instance/interface/edit_config.xml @@ -1,6 +1,10 @@ {{name}} + + {{name}} + oc-ni-types:L3VRF + {{id}} @@ -13,3 +17,33 @@ + + + {{interface}} + + {{interface}} + + + + {{subinterface}} + + {{subinterface}} + + + + 1500 + + +
+ {{address_ip}} + + {{address_ip}} + {{address_prefix}} + +
+
+
+
+
+
+
diff --git a/src/device/service/drivers/openconfig/templates/network_instance/protocols/edit_config.xml b/src/device/service/drivers/openconfig/templates/network_instance/protocols/edit_config.xml index c9c068e48..da66d97f0 100644 --- a/src/device/service/drivers/openconfig/templates/network_instance/protocols/edit_config.xml +++ b/src/device/service/drivers/openconfig/templates/network_instance/protocols/edit_config.xml @@ -9,15 +9,37 @@ oc-pol-types:{{identifier}} {{protocol_name}} + true {% if identifier=='BGP' %} + {{as}} {{as}} {{router_id}} + {% if neighbors is defined %} + + {% for neighbor in neighbors %} + + {{neighbor['ip_address']}} + + + oc-bgp-types:IPV4_UNICAST + true + + + + {{neighbor['ip_address']}} + true + {{as}} + + + {% endfor %} + + {% endif %} {% endif %} {% endif %} diff --git a/src/device/service/drivers/openconfig/templates/network_instance/table_connections/edit_config.xml b/src/device/service/drivers/openconfig/templates/network_instance/table_connections/edit_config.xml index 46bf5e387..bd1dac1b3 100644 --- a/src/device/service/drivers/openconfig/templates/network_instance/table_connections/edit_config.xml +++ b/src/device/service/drivers/openconfig/templates/network_instance/table_connections/edit_config.xml @@ -11,6 +11,7 @@ oc-pol-types:{{src_protocol}} oc-pol-types:{{dst_protocol}} oc-types:{{address_family}} + {{as}} {% if default_import_policy is defined %}{{default_import_policy}}{% endif %}
{% endif %} diff --git a/src/device/service/drivers/openconfig/templates/routing_policy/policy_definition/statement/edit_config.xml b/src/device/service/drivers/openconfig/templates/routing_policy/policy_definition/statement/edit_config.xml index eda2d99c9..1bf1cf322 100644 --- a/src/device/service/drivers/openconfig/templates/routing_policy/policy_definition/statement/edit_config.xml +++ b/src/device/service/drivers/openconfig/templates/routing_policy/policy_definition/statement/edit_config.xml @@ -8,9 +8,9 @@ - {{statement_name}} + {{sequence_id}} - {{statement_name}} + {{sequence_id}} diff --git a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py index cee44641a..87556c36b 100644 --- a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py +++ b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py @@ -195,6 +195,7 @@ def setup_config_rules( 'dst_protocol' : 'BGP', 'address_family' : 'IPV4', 'default_import_policy': 'ACCEPT_ROUTE', + 'as' : bgp_as, }), json_config_rule_set( @@ -204,6 +205,7 @@ def setup_config_rules( 'dst_protocol' : 'BGP', 'address_family' : 'IPV4', 'default_import_policy': 'ACCEPT_ROUTE', + 'as' : bgp_as, }), ] -- GitLab From 5f64f0ea74e6a69b63b177a2fd2adceca33f030a Mon Sep 17 00:00:00 2001 From: hajipour Date: Thu, 29 Feb 2024 21:38:18 +0000 Subject: [PATCH 011/602] service_2_bwInfo function bug resolved: change in config rules applied in the function --- .../rest_server/nbi_plugins/etsi_bwm/Tools.py | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py index f32fe5699..c39a380dc 100644 --- a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py +++ b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py @@ -31,7 +31,7 @@ LOGGER = logging.getLogger(__name__) ENDPOINT_SETTINGS_KEY = '/device[{:s}]/endpoint[{:s}]/vlan[{:d}]/settings' DEVICE_SETTINGS_KEY = '/device[{:s}]/settings' RE_CONFIG_RULE_IF_SUBIF = re.compile(r'^\/interface\[([^\]]+)\]\/subinterface\[([^\]]+)\]$') -MEC_CONSIDERED_FIELDS = ['requestType', 'sessionFilter', 'fixedAllocation', 'allocationDirection'] +MEC_CONSIDERED_FIELDS = ['requestType', 'sessionFilter', 'fixedAllocation', 'allocationDirection', 'fixedBWPriority'] ALLOCATION_DIRECTION_DESCRIPTIONS = { '00' : 'Downlink (towards the UE)', '01' : 'Uplink (towards the application/session)', @@ -59,12 +59,19 @@ def service_2_bwInfo(service: Service) -> dict: break for config_rule in service.service_config.config_rules: + resource_value_json = json.loads(config_rule.custom.resource_value) + if config_rule.custom.resource_key != '/request': + continue for key in ['allocationDirection', 'fixedBWPriority', 'requestType', 'sourceIp', 'sourcePort', 'dstPort', 'protocol', 'sessionFilter']: - if config_rule.custom.resource_key == key: - if key != 'sessionFilter': - response[key] = config_rule.custom.resource_value - else: - response[key] = json.loads(config_rule.custom.resource_value) + if key not in resource_value_json: + continue + + if key == 'sessionFilter': + response[key] = [resource_value_json[key]] + elif key == 'requestType': + response[key] = str(resource_value_json[key]) + else: + response[key] = resource_value_json[key] unixtime = time.time() response['timeStamp'] = { # Time stamp to indicate when the corresponding information elements are sent @@ -76,8 +83,6 @@ def service_2_bwInfo(service: Service) -> dict: def bwInfo_2_service(client, bw_info: dict) -> Service: # add description to allocationDirection code - if ad_code := bw_info.get('allocationDirection'): - bw_info['allocationDirection'] = {'code': ad_code, 'description': ALLOCATION_DIRECTION_DESCRIPTIONS[ad_code]} if 'sessionFilter' in bw_info: bw_info['sessionFilter'] = bw_info['sessionFilter'][0] # Discard other items in sessionFilter field -- GitLab From ee3d0767356b3b7c198fd28d4737bc97a8eaa72d Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 11 Mar 2024 08:43:30 +0000 Subject: [PATCH 012/602] Changes are made to activate monitoring module, e2e Orchestrator, enable drop cocDB --- my_deploy.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/my_deploy.sh b/my_deploy.sh index 0fcb51f90..5bd58d0dc 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -23,7 +23,7 @@ export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/" export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_generator" # Uncomment to activate Monitoring -#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" +export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" # Uncomment to activate ZTP #export TFS_COMPONENTS="${TFS_COMPONENTS} ztp" @@ -44,7 +44,7 @@ export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_gene #export TFS_COMPONENTS="${TFS_COMPONENTS} forecaster" # Uncomment to activate E2E Orchestrator -#export TFS_COMPONENTS="${TFS_COMPONENTS} e2e_orchestrator" +export TFS_COMPONENTS="${TFS_COMPONENTS} e2e_orchestrator" # Set the tag you want to use for your images. export TFS_IMAGE_TAG="dev" @@ -93,7 +93,7 @@ export CRDB_DATABASE="tfs" export CRDB_DEPLOY_MODE="single" # Disable flag for dropping database, if it exists. -export CRDB_DROP_DATABASE_IF_EXISTS="" +export CRDB_DROP_DATABASE_IF_EXISTS="YES" # Disable flag for re-deploying CockroachDB from scratch. export CRDB_REDEPLOY="" @@ -141,7 +141,7 @@ export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis" export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups" # Disable flag for dropping tables if they exist. -export QDB_DROP_TABLES_IF_EXIST="" +export QDB_DROP_TABLES_IF_EXIST="YES" # Disable flag for re-deploying QuestDB from scratch. export QDB_REDEPLOY="" -- GitLab From afc009ba8234cc7d6d2f291d92a0f35679e2e492 Mon Sep 17 00:00:00 2001 From: hajipour Date: Tue, 12 Mar 2024 11:45:33 +0000 Subject: [PATCH 013/602] feat: e2e acl installation added: 1.post, get, delete endpoints of acl added to nbi 2.ipinfusion netconf proprietary acl recipe added since openconfig recipe does not create acl entries in the router --- proto/acl.proto | 1 + proto/context.proto | 1 + .../drivers/openconfig/templates/__init__.py | 29 +++- .../openconfig/templates/acl/__init__.py | 13 ++ .../edit_config_ipinfusion_proprietary.xml | 34 ++++ .../openconfig/templates/acl/acl_adapter.py | 75 ++++++++ .../acl/acl_adapter_ipinfusion_proprietary.py | 65 +++++++ .../edit_config_ipinfusion_proprietary.xml | 26 +++ src/nbi/requirements.in | 1 + src/nbi/service/__main__.py | 2 + .../nbi_plugins/ietf_acl/__init__.py | 42 +++++ .../nbi_plugins/ietf_acl/acl_service.py | 98 +++++++++++ .../nbi_plugins/ietf_acl/acl_services.py | 68 ++++++++ .../nbi_plugins/ietf_acl/ietf_acl_parser.py | 164 ++++++++++++++++++ src/nbi/tests/data/ietf_acl.json | 56 ++++++ 15 files changed, 667 insertions(+), 8 deletions(-) create mode 100644 src/device/service/drivers/openconfig/templates/acl/__init__.py create mode 100644 src/device/service/drivers/openconfig/templates/acl/acl-set/acl-entry/edit_config_ipinfusion_proprietary.xml create mode 100644 src/device/service/drivers/openconfig/templates/acl/acl_adapter.py create mode 100644 src/device/service/drivers/openconfig/templates/acl/acl_adapter_ipinfusion_proprietary.py create mode 100644 src/device/service/drivers/openconfig/templates/acl/interfaces/ingress/edit_config_ipinfusion_proprietary.xml create mode 100644 src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py create mode 100644 src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_service.py create mode 100644 src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_services.py create mode 100644 src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py create mode 100644 src/nbi/tests/data/ietf_acl.json diff --git a/proto/acl.proto b/proto/acl.proto index 3dba735dc..f691c3dbd 100644 --- a/proto/acl.proto +++ b/proto/acl.proto @@ -46,6 +46,7 @@ message AclMatch { uint32 dst_port = 6; uint32 start_mpls_label = 7; uint32 end_mpls_label = 8; + string flags = 9; } message AclAction { diff --git a/proto/context.proto b/proto/context.proto index d5022ac29..1f8b0ce19 100644 --- a/proto/context.proto +++ b/proto/context.proto @@ -498,6 +498,7 @@ message ConfigRule_Custom { message ConfigRule_ACL { EndPointId endpoint_id = 1; acl.AclRuleSet rule_set = 2; + string interface = 3; } message ConfigRule { diff --git a/src/device/service/drivers/openconfig/templates/__init__.py b/src/device/service/drivers/openconfig/templates/__init__.py index 87eea1f0b..dcd3cf683 100644 --- a/src/device/service/drivers/openconfig/templates/__init__.py +++ b/src/device/service/drivers/openconfig/templates/__init__.py @@ -27,6 +27,9 @@ from .NetworkInstances import parse as parse_network_instances from .RoutingPolicy import parse as parse_routing_policy from .Acl import parse as parse_acl from .Inventory import parse as parse_inventory +from .acl.acl_adapter import acl_cr_to_dict +from .acl.acl_adapter_ipinfusion_proprietary import acl_cr_to_dict_ipinfusion_proprietary + LOGGER = logging.getLogger(__name__) ALL_RESOURCE_KEYS = [ @@ -113,16 +116,26 @@ def compose_config( # template generation elif (message_renderer == "jinja"): templates =[] - template_name = '{:s}/edit_config.xml'.format(RE_REMOVE_FILTERS.sub('', resource_key)) - templates.append(JINJA_ENV.get_template(template_name)) - if "acl_ruleset" in resource_key: # MANAGING ACLs - templates =[] - templates.append(JINJA_ENV.get_template('acl/acl-set/acl-entry/edit_config.xml')) - templates.append(JINJA_ENV.get_template('acl/interfaces/ingress/edit_config.xml')) - data : Dict[str, Any] = json.loads(resource_value) + if True: #vendor == 'ipinfusion': #! ipinfusion proprietary netconf receipe is used temporarily + acl_entry_path = 'acl/acl-set/acl-entry/edit_config_ipinfusion_proprietary.xml' + acl_ingress_path = 'acl/interfaces/ingress/edit_config_ipinfusion_proprietary.xml' + data : Dict[str, Any] = acl_cr_to_dict_ipinfusion_proprietary(resource_value, delete=delete) + else: + acl_entry_path = 'acl/acl-set/acl-entry/edit_config.xml' + acl_ingress_path = 'acl/interfaces/ingress/edit_config.xml' + data : Dict[str, Any] = acl_cr_to_dict(resource_value, delete=delete) + if delete: # unpair acl and interface before removing acl + templates.append(JINJA_ENV.get_template(acl_ingress_path)) + templates.append(JINJA_ENV.get_template(acl_entry_path)) + else: + templates.append(JINJA_ENV.get_template(acl_entry_path)) + templates.append(JINJA_ENV.get_template(acl_ingress_path)) + else: + template_name = '{:s}/edit_config.xml'.format(RE_REMOVE_FILTERS.sub('', resource_key)) + templates.append(JINJA_ENV.get_template(template_name)) + data : Dict[str, Any] = json.loads(resource_value) operation = 'delete' if delete else 'merge' - return [ '{:s}'.format( template.render(**data, operation=operation, vendor=vendor).strip()) diff --git a/src/device/service/drivers/openconfig/templates/acl/__init__.py b/src/device/service/drivers/openconfig/templates/acl/__init__.py new file mode 100644 index 000000000..f80ccfd52 --- /dev/null +++ b/src/device/service/drivers/openconfig/templates/acl/__init__.py @@ -0,0 +1,13 @@ +# 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. \ No newline at end of file diff --git a/src/device/service/drivers/openconfig/templates/acl/acl-set/acl-entry/edit_config_ipinfusion_proprietary.xml b/src/device/service/drivers/openconfig/templates/acl/acl-set/acl-entry/edit_config_ipinfusion_proprietary.xml new file mode 100644 index 000000000..d0210a66c --- /dev/null +++ b/src/device/service/drivers/openconfig/templates/acl/acl-set/acl-entry/edit_config_ipinfusion_proprietary.xml @@ -0,0 +1,34 @@ + + + + {{name}} + {% if type is defined %}{{type}}{% endif %} + + {{name}} + {% if type is defined %}{{type}}{% endif %} + + {% if operation != 'delete' %} + + + {{sequence_id}} + + {{sequence_id}} + + + + {{source_address}} + {{destination_address}} + {{dscp}} + + {{source_port}} + {{destination_port}} + {{tcp_flags}} + {{forwarding_action}} + + + + + {% endif %} + + + \ No newline at end of file diff --git a/src/device/service/drivers/openconfig/templates/acl/acl_adapter.py b/src/device/service/drivers/openconfig/templates/acl/acl_adapter.py new file mode 100644 index 000000000..244c4b616 --- /dev/null +++ b/src/device/service/drivers/openconfig/templates/acl/acl_adapter.py @@ -0,0 +1,75 @@ +# 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. + +from typing import Dict, TypedDict + +from ..ACL.ACL_multivendor import RULE_TYPE_MAPPING, FORWARDING_ACTION_MAPPING, LOG_ACTION_MAPPING + +class ACLRequestData(TypedDict): + name: str # acl-set name + type: str # acl-set type + sequence_id: int # acl-entry sequence-id + source_address: str + destination_address: str + forwarding_action: str + id: str # interface id + interface: str + subinterface: int + set_name_ingress: str # ingress-acl-set name + type_ingress: str # ingress-acl-set type + all: bool + dscp: int + protocol: int + tcp_flags: str + source_port: int + destination_port: int + +def acl_cr_to_dict(acl_cr_dict: Dict, subinterface:int = 0) -> Dict: + rule_set = acl_cr_dict['rule_set'] + rule_set_entry = rule_set['entries'][0] + rule_set_entry_match = rule_set_entry['match'] + rule_set_entry_action = rule_set_entry['action'] + + name: str = rule_set['name'] + type: str = RULE_TYPE_MAPPING[rule_set["type"]] + sequence_id = rule_set_entry['sequence_id'] + source_address = rule_set_entry_match['src_address'] + destination_address = rule_set_entry_match['dst_address'] + forwarding_action: str = FORWARDING_ACTION_MAPPING[rule_set_entry_action['forward_action']] + interface_id = acl_cr_dict['interface'] + interface = interface_id + set_name_ingress = name + type_ingress = type + + return ACLRequestData( + name=name, + type=type, + sequence_id=sequence_id, + source_address=source_address, + destination_address=destination_address, + forwarding_action=forwarding_action, + id=interface_id, + interface=interface, + # subinterface=subinterface, + set_name_ingress=set_name_ingress, + type_ingress=type_ingress, + all=True, + dscp=18, + protocol=6, + tcp_flags='TCP_SYN', + source_port=22, + destination_port=80 + ) + + \ No newline at end of file diff --git a/src/device/service/drivers/openconfig/templates/acl/acl_adapter_ipinfusion_proprietary.py b/src/device/service/drivers/openconfig/templates/acl/acl_adapter_ipinfusion_proprietary.py new file mode 100644 index 000000000..79db6ad98 --- /dev/null +++ b/src/device/service/drivers/openconfig/templates/acl/acl_adapter_ipinfusion_proprietary.py @@ -0,0 +1,65 @@ +# 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. + +from typing import Dict, TypedDict + + +RULE_TYPE_MAPPING = { + 'ACLRULETYPE_IPV4' : 'ip', +} + +FORWARDING_ACTION_MAPPING = { + 'ACLFORWARDINGACTION_DROP' : 'deny', + 'ACLFORWARDINGACTION_ACCEPT' : 'permit', +} + +class ACLRequestData(TypedDict): + name: str # acl-set name + type: str # acl-set type + sequence_id: int # acl-entry sequence-id + source_address: str + destination_address: str + forwarding_action: str + interface: str + dscp: int + tcp_flags: str + source_port: int + destination_port: int + +def acl_cr_to_dict_ipinfusion_proprietary(acl_cr_dict: Dict, delete: bool = False) -> Dict: + rule_set = acl_cr_dict['rule_set'] + name: str = rule_set['name'] + type: str = RULE_TYPE_MAPPING[rule_set["type"]] + interface = acl_cr_dict['interface'][5:] # remove preceding `PORT-` characters + if delete: + return ACLRequestData(name=name, type=type, interface=interface) + rule_set_entry = rule_set['entries'][0] + rule_set_entry_match = rule_set_entry['match'] + rule_set_entry_action = rule_set_entry['action'] + + return ACLRequestData( + name=name, + type=type, + sequence_id=rule_set_entry['sequence_id'], + source_address=rule_set_entry_match['src_address'], + destination_address=rule_set_entry_match['dst_address'], + forwarding_action=FORWARDING_ACTION_MAPPING[rule_set_entry_action['forward_action']], + interface=interface, + dscp=rule_set_entry_match["dscp"], + tcp_flags=rule_set_entry_match["flags"], + source_port=rule_set_entry_match['src_port'], + destination_port=rule_set_entry_match['dst_port'] + ) + + \ No newline at end of file diff --git a/src/device/service/drivers/openconfig/templates/acl/interfaces/ingress/edit_config_ipinfusion_proprietary.xml b/src/device/service/drivers/openconfig/templates/acl/interfaces/ingress/edit_config_ipinfusion_proprietary.xml new file mode 100644 index 000000000..6e502154f --- /dev/null +++ b/src/device/service/drivers/openconfig/templates/acl/interfaces/ingress/edit_config_ipinfusion_proprietary.xml @@ -0,0 +1,26 @@ + + + + {{interface}} + + {{interface}} + + + + {% if type is defined %}{{type}}{% endif %} + + + {{name}} + + {{name}} + + + + + {% if type is defined %}{{type}}{% endif %} + + + + + + \ No newline at end of file diff --git a/src/nbi/requirements.in b/src/nbi/requirements.in index 6e3eb9440..7a7b1cffb 100644 --- a/src/nbi/requirements.in +++ b/src/nbi/requirements.in @@ -24,3 +24,4 @@ pyang==2.6.0 git+https://github.com/robshakir/pyangbind.git requests==2.27.1 werkzeug==2.3.7 +pydantic==2.6.3 diff --git a/src/nbi/service/__main__.py b/src/nbi/service/__main__.py index 8834e45a2..2a8a2251d 100644 --- a/src/nbi/service/__main__.py +++ b/src/nbi/service/__main__.py @@ -26,6 +26,7 @@ from .rest_server.nbi_plugins.ietf_l2vpn import register_ietf_l2vpn from .rest_server.nbi_plugins.ietf_l3vpn import register_ietf_l3vpn from .rest_server.nbi_plugins.ietf_network import register_ietf_network from .rest_server.nbi_plugins.ietf_network_slice import register_ietf_nss +from .rest_server.nbi_plugins.ietf_acl import register_ietf_acl terminate = threading.Event() LOGGER = None @@ -68,6 +69,7 @@ def main(): register_ietf_l3vpn(rest_server) # Registering L3VPN entrypoint register_ietf_network(rest_server) register_ietf_nss(rest_server) # Registering NSS entrypoint + register_ietf_acl(rest_server) rest_server.start() # Wait for Ctrl+C or termination signal diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py new file mode 100644 index 000000000..6c1353bff --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py @@ -0,0 +1,42 @@ +# 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. + +from flask_restful import Resource + +from nbi.service.rest_server.nbi_plugins.ietf_acl.acl_service import ACL +from nbi.service.rest_server.nbi_plugins.ietf_acl.acl_services import ACLs +from nbi.service.rest_server.RestServer import RestServer + +URL_PREFIX = "/restconf/data" + + +def __add_resource(rest_server: RestServer, resource: Resource, *urls, **kwargs): + urls = [(URL_PREFIX + url) for url in urls] + rest_server.add_resource(resource, *urls, **kwargs) + + +def register_ietf_acl(rest_server: RestServer): + __add_resource( + rest_server, + ACLs, + "/device=/ietf-access-control-list:acls", + "/device=/ietf-access-control-list:acls", + ) + + __add_resource( + rest_server, + ACL, + "/device=/ietf-access-control-list:acl=", + "/device=/ietf-access-control-list:acl=/", + ) diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_service.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_service.py new file mode 100644 index 000000000..466a68efc --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_service.py @@ -0,0 +1,98 @@ +# 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 logging +import re +import json + +from flask_restful import Resource +from werkzeug.exceptions import NotFound + +from nbi.service.rest_server.nbi_plugins.tools.Authentication import HTTP_AUTH +from common.proto.acl_pb2 import AclRuleTypeEnum +from common.proto.context_pb2 import ( + ConfigActionEnum, + ConfigRule, + Device, + DeviceId, +) +from common.tools.object_factory.Device import json_device_id +from common.tools.grpc.Tools import grpc_message_to_json_string +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient + + +from .ietf_acl_parser import ietf_acl_from_config_rule_resource_value + +LOGGER = logging.getLogger(__name__) + +ACL_CONIG_RULE_KEY = r'\/device\[.+\]\/endpoint\[(.+)\]/acl_ruleset\[{}\]' + + +class ACL(Resource): + # @HTTP_AUTH.login_required + def get(self, device_uuid: str, acl_name: str): + RE_ACL_CONIG_RULE_KEY = re.compile(ACL_CONIG_RULE_KEY.format(acl_name)) + + context_client = ContextClient() + device_client = DeviceClient() + + _device = context_client.GetDevice(DeviceId(**json_device_id(device_uuid))) + + + for cr in _device.device_config.config_rules: + if cr.WhichOneof('config_rule') == 'custom': + if ep_uuid_match := RE_ACL_CONIG_RULE_KEY.match(cr.custom.resource_key): + endpoint_uuid = ep_uuid_match.groups(0)[0] + resource_value_dict = json.loads(cr.custom.resource_value) + LOGGER.debug(f'P99: {resource_value_dict}') + return ietf_acl_from_config_rule_resource_value(resource_value_dict) + else: + raise NotFound(f'ACL not found') + + # @HTTP_AUTH.login_required + def delete(self, device_uuid: str, acl_name: str): + RE_ACL_CONIG_RULE_KEY = re.compile(ACL_CONIG_RULE_KEY.format(acl_name)) + + context_client = ContextClient() + device_client = DeviceClient() + + _device = context_client.GetDevice(DeviceId(**json_device_id(device_uuid))) + + + for cr in _device.device_config.config_rules: + if cr.WhichOneof('config_rule') == 'custom': + if ep_uuid_match := RE_ACL_CONIG_RULE_KEY.match(cr.custom.resource_key): + endpoint_uuid = ep_uuid_match.groups(0)[0] + resource_value_dict = json.loads(cr.custom.resource_value) + type_str = resource_value_dict['rule_set']['type'] + interface = resource_value_dict['interface'] + break + else: + raise NotFound(f'ACL not found') + + acl_config_rule = ConfigRule() + acl_config_rule.action = ConfigActionEnum.CONFIGACTION_DELETE + acl_config_rule.acl.rule_set.name = acl_name + acl_config_rule.acl.interface = interface + acl_config_rule.acl.rule_set.type = getattr(AclRuleTypeEnum, type_str) + acl_config_rule.acl.endpoint_id.device_id.device_uuid.uuid = device_uuid + acl_config_rule.acl.endpoint_id.endpoint_uuid.uuid = endpoint_uuid + + device = Device() + device.CopyFrom(_device) + del device.device_config.config_rules[:] + device.device_config.config_rules.append(acl_config_rule) + response = device_client.ConfigureDevice(device) + return (response.device_uuid.uuid).strip("\"\n") diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_services.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_services.py new file mode 100644 index 000000000..2d03e61b6 --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_services.py @@ -0,0 +1,68 @@ +# 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 logging +from typing import Dict + +from flask import request +from flask_restful import Resource +from werkzeug.exceptions import NotFound + +from common.proto.context_pb2 import Device, DeviceId +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Device import json_device_id +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient + +from nbi.service.rest_server.nbi_plugins.tools.Authentication import HTTP_AUTH + +from .ietf_acl_parser import config_rule_from_ietf_acl + +LOGGER = logging.getLogger(__name__) + +class ACLs(Resource): + # @HTTP_AUTH.login_required + def get(self): + return {} + + # @HTTP_AUTH.login_required + def post(self, device_uuid: str): + if not request.is_json: + raise UnsupportedMediaType("JSON pyload is required") + request_data: Dict = request.json + LOGGER.debug("Request: {:s}".format(str(request_data))) + attached_interface = request_data["ietf-access-control-list"]["acls"]['attachment-points']['interface'][0]['interface-id'] + + context_client = ContextClient() + device_client = DeviceClient() + + _device = context_client.GetDevice(DeviceId(**json_device_id(device_uuid))) + + for ep in _device.device_endpoints: + if ep.name == attached_interface: + endpoint_uuid = ep.endpoint_id.endpoint_uuid.uuid + break + else: + raise NotFound(f'interface {attached_interface} not found in device {device_uuid}') + + acl_config_rule = config_rule_from_ietf_acl(request_data, device_uuid, endpoint_uuid, sequence_id=1, subinterface=0) + + LOGGER.info(f"ACL Config Rule: {grpc_message_to_json_string(acl_config_rule)}") + + device = Device() + device.CopyFrom(_device) + del device.device_config.config_rules[:] + device.device_config.config_rules.append(acl_config_rule) + response = device_client.ConfigureDevice(device) + return (response.device_uuid.uuid).strip("\"\n") diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py new file mode 100644 index 000000000..b378153f8 --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py @@ -0,0 +1,164 @@ +# 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. + +from typing import List, Dict, Optional, TypedDict +from pydantic import BaseModel, Field + +from common.proto.acl_pb2 import AclForwardActionEnum, AclRuleTypeEnum, AclEntry +from common.proto.context_pb2 import ConfigActionEnum, ConfigRule + +class Ipv4(BaseModel): + dscp: int = 0 + source_ipv4_network: str = Field(serialization_alias="source-ipv4-network", default="") + destination_ipv4_network: str = Field(serialization_alias="destination-ipv4-network", default="") + +class Port(BaseModel): + port: int = 0 + operator: str = "eq" + +class Tcp(BaseModel): + flags: str = "" + source_port: Port = Field(serialization_alias="source-port", default_factory=lambda: Port()) + destination_port: Port = Field(serialization_alias="destination-port", default_factory=lambda: Port()) + +class Matches(BaseModel): + ipv4: Ipv4 = Ipv4() + tcp: Tcp = Tcp() + +class Action(BaseModel): + forwarding: str = "" + +class Ace(BaseModel): + name: str = "custom_rule" + matches: Matches = Matches() + actions: Action = Action() + +class Aces(BaseModel): + ace: List[Ace] = [Ace()] + +class Acl(BaseModel): + name: str = "" + type: str = "" + aces: Aces = Aces() + +class Name(BaseModel): + name: str = "" + +class AclSet(BaseModel): + acl_set: List[Name] = Field(serialization_alias="acl-set", default=[Name()]) + +class AclSets(BaseModel): + acl_sets: AclSet = Field(serialization_alias="acl-sets", default=AclSet()) + +class Ingress(BaseModel): + ingress: AclSets = AclSets() + +class Interface(BaseModel): + interface_id: str = Field(serialization_alias="interface-id", default="") + ingress: Ingress = Ingress() + +class Interfaces(BaseModel): + interface: List[Interface] = [Interface()] + +class AttachmentPoints(BaseModel): + attachment_points: Interfaces = Field(serialization_alias="attachment-points", default=Interfaces()) + +class Acls(BaseModel): + acl: List[Acl] = [Acl()] + attachment_points: AttachmentPoints = Field(serialization_alias="attachment-points", default=AttachmentPoints()) + +class IETF_ACL(BaseModel): + acls: Acls = Acls() + + +IETF_TFS_RULE_TYPE_MAPPING = { + "ipv4-acl-type": "ACLRULETYPE_IPV4", + "ipv6-acl-type": "ACLRULETYPE_IPV6", +} + +IETF_TFS_FORWARDING_ACTION_MAPPING = { + "drop": "ACLFORWARDINGACTION_DROP", + "accept": "ACLFORWARDINGACTION_ACCEPT", +} + +TFS_IETF_RULE_TYPE_MAPPING = { + "ACLRULETYPE_IPV4": "ipv4-acl-type", + "ACLRULETYPE_IPV6": "ipv6-acl-type", +} + +TFS_IETF_FORWARDING_ACTION_MAPPING = { + "ACLFORWARDINGACTION_DROP": "drop", + "ACLFORWARDINGACTION_ACCEPT": "accept", +} + +def config_rule_from_ietf_acl( + request: Dict, + device_uuid: str, + endpoint_uuid: str, + sequence_id: int, + subinterface: int, +) -> ConfigRule: + the_acl = request["ietf-access-control-list"]["acls"]["acl"][0] + acl_ip_data = the_acl["aces"]["ace"][0]["matches"]["ipv4"] + acl_tcp_data = the_acl["aces"]["ace"][0]["matches"]["tcp"] + attachemnt_interface = request["ietf-access-control-list"]["acls"]['attachment-points']['interface'][0] + source_address = acl_ip_data["source-ipv4-network"] + destination_address = acl_ip_data["destination-ipv4-network"] + source_port = acl_tcp_data['source-port']['port'] + destination_port = acl_tcp_data['destination-port']['port'] + ietf_action = the_acl["aces"]["ace"][0]["actions"]["forwarding"] + interface_id = attachemnt_interface['interface-id'] + + acl_config_rule = ConfigRule() + acl_config_rule.action = ConfigActionEnum.CONFIGACTION_SET + acl_config_rule.acl.interface = interface_id + acl_endpoint_id = acl_config_rule.acl.endpoint_id + acl_endpoint_id.device_id.device_uuid.uuid = device_uuid + acl_endpoint_id.endpoint_uuid.uuid = endpoint_uuid + acl_rule_set = acl_config_rule.acl.rule_set + acl_rule_set.name = the_acl["name"] + acl_rule_set.type = getattr(AclRuleTypeEnum, IETF_TFS_RULE_TYPE_MAPPING[the_acl['type']]) + acl_rule_set.description = ( + f'{ietf_action} {the_acl["type"]}: {source_address}:{source_port}->{destination_address}:{destination_port}' + ) + acl_entry = AclEntry() + acl_entry.sequence_id = sequence_id + acl_entry.match.src_address = source_address + acl_entry.match.dst_address = destination_address + acl_entry.match.src_port = source_port + acl_entry.match.dst_port = destination_port + acl_entry.match.dscp = acl_ip_data["dscp"] + acl_entry.match.flags = acl_tcp_data["flags"] + acl_entry.action.forward_action = getattr(AclForwardActionEnum, IETF_TFS_FORWARDING_ACTION_MAPPING[ietf_action]) + acl_rule_set.entries.append(acl_entry) + + return acl_config_rule + +def ietf_acl_from_config_rule_resource_value(config_rule_rv: Dict) -> Dict: + rule_set = config_rule_rv['rule_set'] + acl_entry = rule_set['entries'][0] + match_ = acl_entry['match'] + + ipv4 = Ipv4(dscp=match_["dscp"], source_ipv4_network=match_["src_address"], destination_ipv4_network=match_["dst_address"]) + tcp = Tcp(flags=match_["flags"], source_port=Port(port=match_["src_port"]), destination_port=Port(port=match_["dst_port"])) + matches = Matches(ipvr=ipv4, tcp=tcp) + aces = Aces(ace=[Ace(matches=matches, actions=Action(forwarding=TFS_IETF_FORWARDING_ACTION_MAPPING[acl_entry["action"]["forward_action"]]))]) + acl = Acl(name=rule_set["name"], type=TFS_IETF_RULE_TYPE_MAPPING[rule_set["type"]], aces=aces) + acl_sets = AclSets(acl_sets=AclSet(acl_set=[Name(name=rule_set["name"])])) + ingress = Ingress(ingress=acl_sets) + interfaces = Interfaces(interface=[Interface(interface_id=config_rule_rv["interface"], ingress=ingress)]) + acls = Acls(acl=[acl], attachment_points=AttachmentPoints(attachment_points=interfaces)) + ietf_acl = IETF_ACL(acls=acls) + + return ietf_acl.model_dump(by_alias=True) \ No newline at end of file diff --git a/src/nbi/tests/data/ietf_acl.json b/src/nbi/tests/data/ietf_acl.json new file mode 100644 index 000000000..3cbdd0c67 --- /dev/null +++ b/src/nbi/tests/data/ietf_acl.json @@ -0,0 +1,56 @@ +{ + "ietf-access-control-list": { + "acls": { + "acl": [ + { + "name": "sample-ipv4-acl", + "type": "ipv4-acl-type", + "aces": { + "ace": [ + { + "name": "rule1", + "matches": { + "ipv4": { + "dscp": 18, + "source-ipv4-network": "192.168.10.6/24", + "destination-ipv4-network": "192.168.20.6/24" + }, + "tcp": { + "flags": "syn", + "source-port": { + "port": 1444, + "operator": "eq" + }, + "destination-port": { + "port": 1333, + "operator": "eq" + } + } + }, + "actions": { + "forwarding": "drop" + } + } + ] + } + } + ], + "attachment-points": { + "interface": [ + { + "interface-id": "PORT-ce1", + "ingress": { + "acl-sets": { + "acl-set": [ + { + "name": "sample-ipv4-acl" + } + ] + } + } + } + ] + } + } + } +} \ No newline at end of file -- GitLab From 14072dc13e8fae70853fd5edbbfe4c811a322690 Mon Sep 17 00:00:00 2001 From: hajipour Date: Tue, 12 Mar 2024 12:15:39 +0000 Subject: [PATCH 014/602] ietf acl client for tfs nbi interaction added --- .../nbi_plugins/ietf_acl/ietf_acl_client.py | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_client.py diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_client.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_client.py new file mode 100644 index 000000000..79ec388a2 --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_client.py @@ -0,0 +1,69 @@ +# 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 requests +import json +import time + +BASE_URL = "/restconf/data" +POST_URL = "/device={}/ietf-access-control-list:acls" +DELETE_URL = "/device={}/ietf-access-control-list:acl={}" + +class IetfTfsClient: + def __init__(self, + tfs_host: str = "10.1.1.119", + tfs_port: int = 80, + username: str = "admin", + password: str = "admin", + timeout: int = 10, + allow_redirects: bool = True, + ) -> None: + self.host = tfs_host + self.port = tfs_port + self.username = username + self.password = password + self.timeout = timeout + self.allow_redirects = allow_redirects + + def post(self, device_uuid: str, ietf_acl_data: dict) -> str: + request_url = "http://{:s}:{:d}{:s}{:s}".format(self.host, self.port, BASE_URL, POST_URL.format(device_uuid)) + reply = requests.request("post", request_url, timeout=self.timeout, json=ietf_acl_data, allow_redirects=self.allow_redirects) + return reply.text + + def get(self, device_uuid: str, acl_name: str) -> str: + request_url = "http://{:s}:{:d}{:s}{:s}".format(self.host, self.port, BASE_URL, DELETE_URL.format(device_uuid, acl_name)) + reply = requests.request("get", request_url, timeout=self.timeout, allow_redirects=self.allow_redirects) + return reply.text + + def delete(self, device_uuid: str, acl_name: str) -> str: + request_url = "http://{:s}:{:d}{:s}{:s}".format(self.host, self.port, BASE_URL, DELETE_URL.format(device_uuid, acl_name)) + reply = requests.request("delete", request_url, timeout=self.timeout, allow_redirects=self.allow_redirects) + return reply.text + +if __name__ == "__main__": + csg1_device_uuid = 'b71fd62f-e3d4-5956-93b9-3139094836cf' + acl_name = 'sample-ipv4-acl' + acl_request_path = 'src/nbi/tests/data/ietf_acl.json' + with open(acl_request_path, 'r') as afile: + acl_request_data = json.load(afile) + + ietf_tfs_client = IetfTfsClient() + post_response = ietf_tfs_client.post(csg1_device_uuid, acl_request_data) + print(f"post response: {post_response}") + time.sleep(.5) + get_response = ietf_tfs_client.get(csg1_device_uuid, acl_name) + print(f"get response: {get_response}") + time.sleep(.5) + delete_response = ietf_tfs_client.delete(csg1_device_uuid, acl_name) + print(f"delete response: {delete_response}") \ No newline at end of file -- GitLab From ef19aedcd200b0d00a715cc0696c506062a793e6 Mon Sep 17 00:00:00 2001 From: hajipour Date: Tue, 12 Mar 2024 14:45:51 +0000 Subject: [PATCH 015/602] enabling ipv4 ingress filter for acl support xml in ipinfusion added to acl recipe and xml renderer changed to jinja2 --- .../service/drivers/openconfig/OpenConfigDriver.py | 6 +++--- .../service/drivers/openconfig/templates/__init__.py | 4 ++++ .../acl/interfaces/ingress/enable_ingress_filter.xml | 9 +++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 src/device/service/drivers/openconfig/templates/acl/interfaces/ingress/enable_ingress_filter.xml diff --git a/src/device/service/drivers/openconfig/OpenConfigDriver.py b/src/device/service/drivers/openconfig/OpenConfigDriver.py index 99ae1c8db..793b292c7 100644 --- a/src/device/service/drivers/openconfig/OpenConfigDriver.py +++ b/src/device/service/drivers/openconfig/OpenConfigDriver.py @@ -227,10 +227,10 @@ def edit_config( resource_key,resource_value = resource chk_string(str_resource_name + '.key', resource_key, allow_empty=False) - str_config_messages = compose_config( # get template for configuration - resource_key, resource_value, delete=delete, vendor=netconf_handler.vendor, message_renderer='pyangbind') # str_config_messages = compose_config( # get template for configuration - # resource_key, resource_value, delete=delete, vendor=netconf_handler.vendor, message_renderer=netconf_handler.message_renderer) + # resource_key, resource_value, delete=delete, vendor=netconf_handler.vendor, message_renderer='pyangbind') + str_config_messages = compose_config( # get template for configuration + resource_key, resource_value, delete=delete, vendor=netconf_handler.vendor, message_renderer=netconf_handler.message_renderer) for str_config_message in str_config_messages: # configuration of the received templates if str_config_message is None: raise UnsupportedResourceKeyException(resource_key) logger.debug('[{:s}] str_config_message[{:d}] = {:s}'.format( diff --git a/src/device/service/drivers/openconfig/templates/__init__.py b/src/device/service/drivers/openconfig/templates/__init__.py index dcd3cf683..8df8fa28f 100644 --- a/src/device/service/drivers/openconfig/templates/__init__.py +++ b/src/device/service/drivers/openconfig/templates/__init__.py @@ -118,17 +118,21 @@ def compose_config( # template generation templates =[] if "acl_ruleset" in resource_key: # MANAGING ACLs if True: #vendor == 'ipinfusion': #! ipinfusion proprietary netconf receipe is used temporarily + enable_ingress_filter_path = 'acl/interfaces/ingress/enable_ingress_filter.xml' acl_entry_path = 'acl/acl-set/acl-entry/edit_config_ipinfusion_proprietary.xml' acl_ingress_path = 'acl/interfaces/ingress/edit_config_ipinfusion_proprietary.xml' data : Dict[str, Any] = acl_cr_to_dict_ipinfusion_proprietary(resource_value, delete=delete) else: + enable_ingress_filter_path = 'acl/interfaces/ingress/enable_ingress_filter.xml' acl_entry_path = 'acl/acl-set/acl-entry/edit_config.xml' acl_ingress_path = 'acl/interfaces/ingress/edit_config.xml' data : Dict[str, Any] = acl_cr_to_dict(resource_value, delete=delete) if delete: # unpair acl and interface before removing acl templates.append(JINJA_ENV.get_template(acl_ingress_path)) templates.append(JINJA_ENV.get_template(acl_entry_path)) + templates.append(JINJA_ENV.get_template(enable_ingress_filter_path)) else: + templates.append(JINJA_ENV.get_template(enable_ingress_filter_path)) templates.append(JINJA_ENV.get_template(acl_entry_path)) templates.append(JINJA_ENV.get_template(acl_ingress_path)) else: diff --git a/src/device/service/drivers/openconfig/templates/acl/interfaces/ingress/enable_ingress_filter.xml b/src/device/service/drivers/openconfig/templates/acl/interfaces/ingress/enable_ingress_filter.xml new file mode 100644 index 000000000..274028657 --- /dev/null +++ b/src/device/service/drivers/openconfig/templates/acl/interfaces/ingress/enable_ingress_filter.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file -- GitLab From 582d324933ae6b5acf89c842fd145e4521c045ed Mon Sep 17 00:00:00 2001 From: hajipour Date: Tue, 12 Mar 2024 16:09:11 +0000 Subject: [PATCH 016/602] removin changes of commit f10241a6 as it is related to MEC-PoC --- .../drivers/openconfig/OpenConfigDriver.py | 3 - .../drivers/openconfig/templates/Tools.py | 3 +- .../VPN/Network_instance_multivendor.py | 36 +---- .../nbi_plugins/etsi_bwm/Resources.py | 15 +- .../rest_server/nbi_plugins/etsi_bwm/Tools.py | 140 +++++------------- .../l3nm_openconfig/ConfigRules.py | 66 ++------- 6 files changed, 53 insertions(+), 210 deletions(-) diff --git a/src/device/service/drivers/openconfig/OpenConfigDriver.py b/src/device/service/drivers/openconfig/OpenConfigDriver.py index 793b292c7..8c6e07b3f 100644 --- a/src/device/service/drivers/openconfig/OpenConfigDriver.py +++ b/src/device/service/drivers/openconfig/OpenConfigDriver.py @@ -226,9 +226,6 @@ def edit_config( chk_length(str_resource_name, resource, min_length=2, max_length=2) resource_key,resource_value = resource chk_string(str_resource_name + '.key', resource_key, allow_empty=False) - - # str_config_messages = compose_config( # get template for configuration - # resource_key, resource_value, delete=delete, vendor=netconf_handler.vendor, message_renderer='pyangbind') str_config_messages = compose_config( # get template for configuration resource_key, resource_value, delete=delete, vendor=netconf_handler.vendor, message_renderer=netconf_handler.message_renderer) for str_config_message in str_config_messages: # configuration of the received templates diff --git a/src/device/service/drivers/openconfig/templates/Tools.py b/src/device/service/drivers/openconfig/templates/Tools.py index 3e8043680..79bebef51 100644 --- a/src/device/service/drivers/openconfig/templates/Tools.py +++ b/src/device/service/drivers/openconfig/templates/Tools.py @@ -61,8 +61,7 @@ def generate_templates(resource_key: str, resource_value: str, delete: bool,vend elif "inter_instance_policies" in resource_key: result_templates.append(associate_RP_to_NI(data)) elif "protocols" in resource_key: - result_templates.append(add_protocol_NI(data, vendor, delete)) - # if vendor == "ADVA": result_templates.append(add_protocol_NI(data, vendor, delete)) + if vendor == "ADVA": result_templates.append(add_protocol_NI(data, vendor, delete)) elif "table_connections" in resource_key: result_templates.append(create_table_conns(data, delete)) elif "interface" in resource_key: diff --git a/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py b/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py index e36955a0d..c4d494ea6 100644 --- a/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py +++ b/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py @@ -116,9 +116,6 @@ def add_protocol_NI(parameters,vendor, DEL): else: with tag('network-instance'): with tag('name'):text(parameters['name']) - with tag('config'): - with tag('name'): text(parameters['name']) - with tag('type', 'xmlns:oc-ni-types="http://openconfig.net/yang/network-instance-types"'): text('oc-ni-types:DEFAULT_INSTANCE') with tag('protocols'): with tag('protocol'): with tag('identifier', 'xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):text('oc-pol-types:',parameters['identifier']) @@ -126,41 +123,14 @@ def add_protocol_NI(parameters,vendor, DEL): with tag('config'): with tag('identifier', 'xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):text('oc-pol-types:',parameters['identifier']) with tag('name') :text(parameters['protocol_name']) - with tag('enabled'): text('true') if "BGP" in parameters['identifier']: with tag('bgp'): with tag('global'): - with tag('afi-safis'): - with tag('afi-safi'): - with tag('afi-safi-name', 'xmlns:oc-bgp-types="http://openconfig.net/yang/bgp-types"'): text('oc-bgp-types:IPV4_UNICAST') - with tag('config'): - with tag('afi-safi-name', 'xmlns:oc-bgp-types="http://openconfig.net/yang/bgp-types"'): text('oc-bgp-types:IPV4_UNICAST') - with tag('enabled'): text('true') with tag('config'): with tag('as') :text(parameters['as']) - with tag('peer-groups'): - with tag('peer-group'): - with tag('peer-group-name'): text('IBGP') - with tag('config'): - with tag('peer-group-name'): text('IBGP') - with tag('peer-as'): text(parameters['protocol_name']) - with tag('afi-safis'): - with tag('afi-safi'): - with tag('afi-safi-name', 'xmlns:oc-bgp-types="http://openconfig.net/yang/bgp-types"'): text('oc-bgp-types:IPV4_UNICAST') - with tag('config'): - with tag('afi-safi-name', 'xmlns:oc-bgp-types="http://openconfig.net/yang/bgp-types"'): text('oc-bgp-types:IPV4_UNICAST') - with tag('enabled'): text('true') - - if 'neighbors' in parameters: - with tag('neighbors'): - for neighbor in parameters['neighbors']: - with tag('neighbor'): - with tag('neighbor-address'): text(neighbor['ip_address']) - with tag('config'): - with tag('neighbor-address'): text(neighbor['ip_address']) - with tag('peer-group'): text('IBGP') - # if vendor == "ADVA": - if True: + if "router-id" in parameters: + with tag('router-id'):text(parameters['router-id']) + if vendor == "ADVA": with tag('tables'): with tag('table'): with tag('protocol', 'xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):text('oc-pol-types:',parameters['identifier']) diff --git a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Resources.py b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Resources.py index 394b50de8..3fccbbb55 100644 --- a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Resources.py +++ b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Resources.py @@ -13,9 +13,7 @@ # limitations under the License. import copy, deepmerge, json, logging -from typing import Dict from common.Constants import DEFAULT_CONTEXT_NAME -from werkzeug.exceptions import UnsupportedMediaType from context.client.ContextClient import ContextClient from flask_restful import Resource, request from service.client.ServiceClient import ServiceClient @@ -39,20 +37,15 @@ class BwInfo(_Resource): return bw_allocations def post(self): - if not request.is_json: - raise UnsupportedMediaType('JSON payload is required') - request_data: Dict = request.get_json() - service = bwInfo_2_service(self.client, request_data) + bwinfo = request.get_json() + service = bwInfo_2_service(self.client, bwinfo) stripped_service = copy.deepcopy(service) stripped_service.ClearField('service_endpoint_ids') stripped_service.ClearField('service_constraints') stripped_service.ClearField('service_config') - try: - response = format_grpc_to_json(self.service_client.CreateService(stripped_service)) - response = format_grpc_to_json(self.service_client.UpdateService(service)) - except Exception as e: # pylint: disable=broad-except - return e + response = format_grpc_to_json(self.service_client.CreateService(stripped_service)) + response = format_grpc_to_json(self.service_client.UpdateService(service)) return response diff --git a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py index d3be769c9..a78d28193 100644 --- a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py +++ b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py @@ -14,35 +14,22 @@ import json import logging -import re import time from decimal import ROUND_HALF_EVEN, Decimal from flask.json import jsonify from common.proto.context_pb2 import ( - ContextId, Empty, EndPointId, ServiceId, ServiceTypeEnum, Service, ServiceStatusEnum, Constraint, Constraint_SLA_Capacity, + ContextId, Empty, EndPointId, ServiceId, ServiceTypeEnum, Service, Constraint, Constraint_SLA_Capacity, ConfigRule, ConfigRule_Custom, ConfigActionEnum) from common.tools.grpc.Tools import grpc_message_to_json -from common.tools.grpc.ConfigRules import update_config_rule_custom from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id LOGGER = logging.getLogger(__name__) -ENDPOINT_SETTINGS_KEY = '/device[{:s}]/endpoint[{:s}]/vlan[{:d}]/settings' -RE_CONFIG_RULE_IF_SUBIF = re.compile(r'^\/interface\[([^\]]+)\]\/subinterface\[([^\]]+)\]$') -MEC_CONSIDERED_FIELDS = ['requestType', 'sessionFilter', 'fixedAllocation', 'allocationDirection'] -ALLOCATION_DIRECTION_DESCRIPTIONS = { - '00' : 'Downlink (towards the UE)', - '01' : 'Uplink (towards the application/session)', - '10' : 'Symmetrical'} -VLAN_TAG = 0 -PREFIX_LENGTH = 24 -BGP_AS = 65000 -policy_AZ = 'srv_{:d}_a'.format(VLAN_TAG) -policy_ZA = 'srv_{:d}_b'.format(VLAN_TAG) def service_2_bwInfo(service: Service) -> dict: response = {} + # allocationDirection = '??' # String: 00 = Downlink (towards the UE); 01 = Uplink (towards the application/session); 10 = Symmetrical response['appInsId'] = service.service_id.service_uuid.uuid # String: Application instance identifier for constraint in service.service_constraints: if constraint.WhichOneof('constraint') == 'sla_capacity': @@ -68,108 +55,47 @@ def service_2_bwInfo(service: Service) -> dict: return response -def bwInfo_2_service(client, bw_info: dict) -> Service: - # add description to allocationDirection code - if ad_code := bw_info.get('allocationDirection'): - bw_info['allocationDirection'] = {'code': ad_code, 'description': ALLOCATION_DIRECTION_DESCRIPTIONS[ad_code]} - if 'sessionFilter' in bw_info: - bw_info['sessionFilter'] = bw_info['sessionFilter'][0] # Discard other items in sessionFilter field - +def bwInfo_2_service(client, bwInfo: dict) -> Service: service = Service() - - service_config_rules = service.service_config.config_rules - - route_distinguisher = '{:5d}:{:03d}'.format(BGP_AS, VLAN_TAG) - settings_cr_key = '/settings' - settings_cr_value = {'bgp_as':(BGP_AS, True), 'route_distinguisher': (route_distinguisher, True)} - update_config_rule_custom(service_config_rules, settings_cr_key, settings_cr_value) - - request_cr_key = '/request' - request_cr_value = {k:bw_info[k] for k in MEC_CONSIDERED_FIELDS} - - config_rule = ConfigRule() - config_rule.action = ConfigActionEnum.CONFIGACTION_SET - config_rule_custom = ConfigRule_Custom() - config_rule_custom.resource_key = request_cr_key - config_rule_custom.resource_value = json.dumps(request_cr_value) - config_rule.custom.CopyFrom(config_rule_custom) - service_config_rules.append(config_rule) - - if 'sessionFilter' in bw_info: - a_ip = bw_info['sessionFilter']['sourceIp'] - z_ip = bw_info['sessionFilter']['dstAddress'] + for key in ['allocationDirection', 'fixedBWPriority', 'requestType', 'timeStamp', 'sessionFilter']: + if key not in bwInfo: + continue + config_rule = ConfigRule() + config_rule.action = ConfigActionEnum.CONFIGACTION_SET + config_rule_custom = ConfigRule_Custom() + config_rule_custom.resource_key = key + if key != 'sessionFilter': + config_rule_custom.resource_value = str(bwInfo[key]) + else: + config_rule_custom.resource_value = json.dumps(bwInfo[key]) + config_rule.custom.CopyFrom(config_rule_custom) + service.service_config.config_rules.append(config_rule) + + if 'sessionFilter' in bwInfo: + a_ip = bwInfo['sessionFilter'][0]['sourceIp'] + z_ip = bwInfo['sessionFilter'][0]['dstAddress'] devices = client.ListDevices(Empty()).devices - router_id_counter = 1 for device in devices: - device_endpoint_uuids = {ep.name:ep.endpoint_id.endpoint_uuid.uuid for ep in device.device_endpoints} for cr in device.device_config.config_rules: - if cr.WhichOneof('config_rule') != 'custom': - continue - match_subif = RE_CONFIG_RULE_IF_SUBIF.match(cr.custom.resource_key) - if not match_subif: - continue - address_ip = json.loads(cr.custom.resource_value).get('address_ip') - if address_ip not in [a_ip, z_ip]: - continue - port_name = 'PORT-' + match_subif.groups(0)[0] # `PORT-` added as prefix - ep_id = EndPointId() - ep_id.endpoint_uuid.uuid = device_endpoint_uuids[port_name] - ep_id.device_id.device_uuid.uuid = device.device_id.device_uuid.uuid - service.service_endpoint_ids.append(ep_id) - - # add interface config rules - endpoint_settings_key = ENDPOINT_SETTINGS_KEY.format(device.name, port_name, VLAN_TAG) - if address_ip == a_ip: - field_updates = { - 'address_ip': (address_ip, True), - # 'router_id': ('.'.join([str(router_id_counter)]*4), True), - 'router_id': ('200.1.1.1', True), - 'neighbor_address_ip': ('192.168.150.2', True), - 'route_distinguisher': (route_distinguisher, True), - 'sub_interface_index': (0, True), - 'vlan_id' : (VLAN_TAG, True), - # 'bgp_as': (BGP_AS+router_id_counter, True), - 'bgp_as': (BGP_AS, True), - 'ip_address': (address_ip, True), - 'prefix_length': (PREFIX_LENGTH, True), - 'policy_AZ' : (policy_AZ, True), - 'policy_ZA' : (policy_ZA, True), - 'address_prefix' : (PREFIX_LENGTH, True), - } - elif address_ip == z_ip: - field_updates = { - 'address_ip': (address_ip, True), - # 'router_id': ('.'.join([str(router_id_counter)]*4), True), - 'router_id': ('200.1.1.2', True), - 'neighbor_address_ip': ('192.168.150.1', True), - 'route_distinguisher': (route_distinguisher, True), - 'sub_interface_index': (0, True), - 'vlan_id' : (VLAN_TAG, True), - # 'bgp_as': (BGP_AS+router_id_counter, True), - 'bgp_as': (BGP_AS, True), - 'ip_address': (address_ip, True), - 'prefix_length': (PREFIX_LENGTH, True), - 'policy_AZ' : (policy_ZA, True), - 'policy_ZA' : (policy_AZ, True), - 'address_prefix' : (PREFIX_LENGTH, True), - } - router_id_counter += 1 - LOGGER.debug(f'BEFORE UPDATE -> device.device_config.config_rules: {service_config_rules}') - update_config_rule_custom(service_config_rules, endpoint_settings_key, field_updates) - LOGGER.debug(f'AFTER UPDATE -> device.device_config.config_rules: {service_config_rules}') - - service.service_status.service_status = ServiceStatusEnum.SERVICESTATUS_PLANNED + if cr.WhichOneof('config_rule') == 'custom' and cr.custom.resource_key == '_connect/settings': + for ep in json.loads(cr.custom.resource_value)['endpoints']: + if 'ip' in ep and (ep['ip'] == a_ip or ep['ip'] == z_ip): + ep_id = EndPointId() + ep_id.endpoint_uuid.uuid = ep['uuid'] + ep_id.device_id.device_uuid.uuid = device.device_id.device_uuid.uuid + service.service_endpoint_ids.append(ep_id) + service.service_type = ServiceTypeEnum.SERVICETYPE_L3NM - if 'appInsId' in bw_info: - service.service_id.service_uuid.uuid = bw_info['appInsId'] + if 'appInsId' in bwInfo: + service.service_id.service_uuid.uuid = bwInfo['appInsId'] service.service_id.context_id.context_uuid.uuid = 'admin' - service.name = bw_info['appInsId'] + service.name = bwInfo['appInsId'] - if 'fixedAllocation' in bw_info: + if 'fixedAllocation' in bwInfo: capacity = Constraint_SLA_Capacity() - capacity.capacity_gbps = float(bw_info['fixedAllocation']) / 1.e9 + capacity.capacity_gbps = float(bwInfo['fixedAllocation']) / 1.e9 constraint = Constraint() constraint.sla_capacity.CopyFrom(capacity) service.service_constraints.append(constraint) diff --git a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py index 0369d6207..1e4425cdb 100644 --- a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py +++ b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py @@ -37,7 +37,6 @@ def setup_config_rules( vlan_id = json_endpoint_settings.get('vlan_id', 1 ) # 400 address_ip = json_endpoint_settings.get('address_ip', '0.0.0.0') # '2.2.2.1' address_prefix = json_endpoint_settings.get('address_prefix', 24 ) # 30 - neighbor_address_ip = json_endpoint_settings.get('neighbor_address_ip', '0.0.0.0') # '2.2.2.1' policy_import = json_endpoint_settings.get('policy_AZ', '2' ) # 2 policy_export = json_endpoint_settings.get('policy_ZA', '7' ) # 30 @@ -47,21 +46,18 @@ def setup_config_rules( network_subinterface_desc = json_endpoint_settings.get('subif_description','') #service_short_uuid = service_uuid.split('-')[-1] #network_instance_name = '{:s}-NetInst'.format(service_short_uuid) - # network_instance_name = json_endpoint_settings.get('ni_name', service_uuid.split('-')[-1]) #ELAN-AC:1 - network_instance_name = 'default' + network_instance_name = json_endpoint_settings.get('ni_name', service_uuid.split('-')[-1]) #ELAN-AC:1 - ''' - # if_subif_name = '{:s}.{:d}'.format(endpoint_name, vlan_id) - if_subif_name = '{:s}'.format(endpoint_name[5:]) + if_subif_name = '{:s}.{:d}'.format(endpoint_name, vlan_id) json_config_rules = [ - # # Configure Interface (not used) - # json_config_rule_set( + # Configure Interface (not used) + #json_config_rule_set( # '/interface[{:s}]'.format(endpoint_name), { # 'name': endpoint_name, # 'description': network_interface_desc, # 'mtu': mtu, - # }), + #}), #Create network instance json_config_rule_set( @@ -78,10 +74,8 @@ def setup_config_rules( json_config_rule_set( '/network_instance[{:s}]/protocols[BGP]'.format(network_instance_name), { 'name': network_instance_name, - # 'protocol_name': 'BGP', - 'protocol_name': bgp_as, + 'protocol_name': 'BGP', 'identifier': 'BGP', - # 'identifier': bgp_as, 'as': bgp_as, 'router_id': router_id, }), @@ -107,8 +101,7 @@ def setup_config_rules( json_config_rule_set( '/interface[{:s}]/subinterface[{:d}]'.format(if_subif_name, sub_interface_index), { 'name' : if_subif_name, - # 'type' :'l3ipvlan', - 'type' :'ethernetCsmacd', + 'type' :'l3ipvlan', 'mtu' : mtu, 'index' : sub_interface_index, 'description' : network_subinterface_desc, @@ -190,40 +183,6 @@ def setup_config_rules( }), ] - ''' - if_subif_name = '{:s}'.format(endpoint_name[5:]) - - json_config_rules = [ - - #Add DIRECTLY CONNECTED protocol to network instance - json_config_rule_set( - '/network_instance[{:s}]/protocols[DIRECTLY_CONNECTED]'.format(network_instance_name), { - 'name': network_instance_name, - 'identifier': 'DIRECTLY_CONNECTED', - 'protocol_name': 'DIRECTLY_CONNECTED', - }), - - # Add BGP neighbors - json_config_rule_set( - '/network_instance[{:s}]/protocols[BGP]'.format(network_instance_name), { - 'name': network_instance_name, - 'protocol_name': bgp_as, - 'identifier': 'BGP', - 'as': bgp_as, - 'router_id': router_id, - 'neighbors': [{'ip_address': neighbor_address_ip, 'remote_as': bgp_as}] - }), - json_config_rule_set( - '/network_instance[{:s}]/table_connections[DIRECTLY_CONNECTED][BGP][IPV4]'.format(network_instance_name), { - 'name' : network_instance_name, - 'src_protocol' : 'DIRECTLY_CONNECTED', - 'dst_protocol' : 'BGP', - 'address_family' : 'IPV4', - 'default_import_policy': 'ACCEPT_ROUTE', - }), - - ] - for res_key, res_value in endpoint_acls: json_config_rules.append( {'action': 1, 'acl': res_value} @@ -242,8 +201,7 @@ def teardown_config_rules( json_endpoint_settings : Dict = endpoint_settings.value service_short_uuid = service_uuid.split('-')[-1] - # network_instance_name = '{:s}-NetInst'.format(service_short_uuid) - network_instance_name = json_endpoint_settings.get('ni_name', service_short_uuid) #ELAN-AC:1 + network_instance_name = '{:s}-NetInst'.format(service_short_uuid) #network_interface_desc = '{:s}-NetIf'.format(service_uuid) #network_subinterface_desc = '{:s}-NetSubIf'.format(service_uuid) @@ -304,10 +262,10 @@ def teardown_config_rules( #Delete interface; automatically deletes: # - /interface[]/subinterface[] - # json_config_rule_delete('/interface[{:s}]/subinterface[0]'.format(if_subif_name), - # { - # 'name': if_subif_name, - # }), + json_config_rule_delete('/interface[{:s}]/subinterface[0]'.format(if_subif_name), + { + 'name': if_subif_name, + }), #Delete network instance; automatically deletes: # - /network_instance[]/interface[] -- GitLab From 78ebaf0fa77e9a4f6991a5aa9934efed7c89125a Mon Sep 17 00:00:00 2001 From: armingol Date: Mon, 18 Mar 2024 14:40:57 +0100 Subject: [PATCH 017/602] Add interface information to network instance --- .../openconfig/templates/NetworkInstances.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/device/service/drivers/openconfig/templates/NetworkInstances.py b/src/device/service/drivers/openconfig/templates/NetworkInstances.py index c00995b3a..9de16d0e9 100644 --- a/src/device/service/drivers/openconfig/templates/NetworkInstances.py +++ b/src/device/service/drivers/openconfig/templates/NetworkInstances.py @@ -23,6 +23,8 @@ XPATH_NETWORK_INSTANCES = "//ocni:network-instances/ocni:network-instance" XPATH_NI_PROTOCOLS = ".//ocni:protocols/ocni:protocol" XPATH_NI_TABLE_CONNECTS = ".//ocni:table-connections/ocni:table-connection" +XPATH_NI_INTERFACE = ".//ocni:interfaces/ocni:interface" + XPATH_NI_IIP_AP = ".//ocni:inter-instance-policies/ocni:apply-policy" XPATH_NI_IIP_AP_IMPORT = ".//ocni:config/ocni:import-policy" XPATH_NI_IIP_AP_EXPORT = ".//ocni:config/ocni:export-policy" @@ -136,6 +138,21 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: table_connection['address_family']) response.append((resource_key, table_connection)) + for xml_interface in xml_network_instance.xpath(XPATH_NI_INTERFACE, namespaces=NAMESPACES): + LOGGER.info('xml_interfaces = {:s}'.format(str(ET.tostring(xml_interface)))) + + interface = {} + name_iface = xml_interface.find('ocni:config/ocni:interface', namespaces=NAMESPACES) + if name_iface is None or name_iface.text is None: continue + add_value_from_tag(interface, 'name_iface', name_iface) + + name_subiface = xml_interface.find('ocni:config/ocni:subinterface', namespaces=NAMESPACES) + add_value_from_tag(interface, 'name_subiface', name_subiface) + + resource_key = '/network_instance[{:s}]/interface[{:s}]'.format( + network_instance['name'], interface['name_iface']) + response.append((resource_key, interface)) + for xml_iip_ap in xml_network_instance.xpath(XPATH_NI_IIP_AP, namespaces=NAMESPACES): #LOGGER.info('xml_iip_ap = {:s}'.format(str(ET.tostring(xml_iip_ap)))) -- GitLab From c67611f30b5fce1d88e718e89288810a7c5a6e73 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 19 Mar 2024 07:07:36 +0000 Subject: [PATCH 018/602] New kpi_manger.proto file is created. --- proto/kpi_manager.proto | 47 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 proto/kpi_manager.proto diff --git a/proto/kpi_manager.proto b/proto/kpi_manager.proto new file mode 100644 index 000000000..f5769ed37 --- /dev/null +++ b/proto/kpi_manager.proto @@ -0,0 +1,47 @@ +// 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. + +syntax = "proto3"; +package kpi_manager; + +import "context.proto"; +import "kpi_sample_types.proto"; + +service KpiManagerService{ + rpc SetKpi (KpiDescriptor ) returns (KpiId ) {} // Stable not final + rpc DeleteKpi (KpiId ) returns (context.Empty ) {} // Stable and final + rpc GetKpiDescriptor (KpiId ) returns (KpiDescriptor ) {} // Stable and final + rpc GetKpiDescriptorList (context.Empty ) returns (KpiDescriptorList ) {} // Stable and final +} + +message KpiDescriptor { + KpiId kpi_id = 1; + string kpi_description = 2; + repeated KpiId kpi_id_list = 3; + kpi_sample_types.KpiSampleType kpi_sample_type = 4; + context.DeviceId device_id = 5; + context.EndPointId endpoint_id = 6; + context.ServiceId service_id = 7; + context.SliceId slice_id = 8; + context.ConnectionId connection_id = 9; + context.LinkId link_id = 10; +} + +message KpiId { + context.Uuid kpi_id = 1; +} + +message KpiDescriptorList { + repeated KpiDescriptor kpi_descriptor_list = 1; +} \ No newline at end of file -- GitLab From 5a85e8f320c5b0e9492436c2a9c09f6f8ba25074 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 19 Mar 2024 07:08:52 +0000 Subject: [PATCH 019/602] imports are updated to refer to kpi_manager.proto --- proto/device.proto | 7 ++++--- proto/optical_attack_detector.proto | 5 +++-- proto/policy_condition.proto | 3 ++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/proto/device.proto b/proto/device.proto index 30e60079d..98cca8ce9 100644 --- a/proto/device.proto +++ b/proto/device.proto @@ -16,7 +16,8 @@ syntax = "proto3"; package device; import "context.proto"; -import "monitoring.proto"; +//import "monitoring.proto"; +import "kpi_manager.proto"; service DeviceService { rpc AddDevice (context.Device ) returns (context.DeviceId ) {} @@ -27,8 +28,8 @@ service DeviceService { } message MonitoringSettings { - monitoring.KpiId kpi_id = 1; - monitoring.KpiDescriptor kpi_descriptor = 2; + kpi_manager.KpiId kpi_id = 1; + kpi_manager.KpiDescriptor kpi_descriptor = 2; float sampling_duration_s = 3; float sampling_interval_s = 4; } diff --git a/proto/optical_attack_detector.proto b/proto/optical_attack_detector.proto index ebe3b5e06..0d3ed58de 100644 --- a/proto/optical_attack_detector.proto +++ b/proto/optical_attack_detector.proto @@ -17,7 +17,8 @@ syntax = "proto3"; package optical_attack_detector; import "context.proto"; -import "monitoring.proto"; +//import "monitoring.proto"; +import "kpi_manager.proto"; service OpticalAttackDetectorService { @@ -28,5 +29,5 @@ service OpticalAttackDetectorService { message DetectionRequest { context.ServiceId service_id = 1; - monitoring.KpiId kpi_id = 2; + kpi_manager.KpiId kpi_id = 2; } diff --git a/proto/policy_condition.proto b/proto/policy_condition.proto index 2037af93c..c0af929ef 100644 --- a/proto/policy_condition.proto +++ b/proto/policy_condition.proto @@ -16,10 +16,11 @@ syntax = "proto3"; package policy; import "monitoring.proto"; +import "kpi_manager.proto"; // Condition message PolicyRuleCondition { - monitoring.KpiId kpiId = 1; + kpi_manager.KpiId kpiId = 1; NumericalOperator numericalOperator = 2; monitoring.KpiValue kpiValue = 3; } -- GitLab From a78bcae188ec444a5e78f8a30df6488814d26176 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 19 Mar 2024 07:10:14 +0000 Subject: [PATCH 020/602] few methods and messages are moved to kpi_manager.ptoto --- proto/monitoring.proto | 58 ++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 36 deletions(-) mode change 100644 => 100755 proto/monitoring.proto diff --git a/proto/monitoring.proto b/proto/monitoring.proto old mode 100644 new mode 100755 index 45ba48b02..2706988aa --- a/proto/monitoring.proto +++ b/proto/monitoring.proto @@ -16,13 +16,14 @@ syntax = "proto3"; package monitoring; import "context.proto"; -import "kpi_sample_types.proto"; +import "kpi_manager.proto"; +//import "kpi_sample_types.proto"; service MonitoringService { - rpc SetKpi (KpiDescriptor ) returns (KpiId ) {} // Stable not final - rpc DeleteKpi (KpiId ) returns (context.Empty ) {} // Stable and final - rpc GetKpiDescriptor (KpiId ) returns (KpiDescriptor ) {} // Stable and final - rpc GetKpiDescriptorList (context.Empty ) returns (KpiDescriptorList ) {} // Stable and final +// rpc SetKpi (KpiDescriptor ) returns (KpiId ) {} // Stable not final +// rpc DeleteKpi (KpiId ) returns (context.Empty ) {} // Stable and final +// rpc GetKpiDescriptor (KpiId ) returns (KpiDescriptor ) {} // Stable and final +// rpc GetKpiDescriptorList (context.Empty ) returns (KpiDescriptorList ) {} // Stable and final rpc IncludeKpi (Kpi ) returns (context.Empty ) {} // Stable and final rpc MonitorKpi (MonitorKpiRequest ) returns (context.Empty ) {} // Stable and final rpc QueryKpiData (KpiQuery ) returns (RawKpiTable ) {} // Not implemented @@ -35,36 +36,25 @@ service MonitoringService { rpc GetAlarmDescriptor (AlarmID ) returns (AlarmDescriptor ) {} // Stable and final rpc GetAlarmResponseStream(AlarmSubscription ) returns (stream AlarmResponse) {} // Not Stable not final rpc DeleteAlarm (AlarmID ) returns (context.Empty ) {} // Stable and final - rpc GetStreamKpi (KpiId ) returns (stream Kpi ) {} // Stable not final - rpc GetInstantKpi (KpiId ) returns (Kpi ) {} // Stable not final +// rpc GetStreamKpi (KpiId ) returns (stream Kpi ) {} // Stable not final +// rpc GetInstantKpi (KpiId ) returns (Kpi ) {} // Stable not final } -message KpiDescriptor { - KpiId kpi_id = 1; - string kpi_description = 2; - repeated KpiId kpi_id_list = 3; - kpi_sample_types.KpiSampleType kpi_sample_type = 4; - context.DeviceId device_id = 5; - context.EndPointId endpoint_id = 6; - context.ServiceId service_id = 7; - context.SliceId slice_id = 8; - context.ConnectionId connection_id = 9; - context.LinkId link_id = 10; -} + message MonitorKpiRequest { - KpiId kpi_id = 1; + kpi_manager.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 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" - context.Timestamp end_timestamp = 5; // used when you want something like "get the samples until X date/time" + repeated kpi_manager.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" + context.Timestamp end_timestamp = 5; // used when you want something like "get the samples until X date/time" } @@ -74,20 +64,18 @@ message RawKpi { // cell } message RawKpiList { // column - KpiId kpi_id = 1; - repeated RawKpi raw_kpis = 2; + kpi_manager.KpiId kpi_id = 1; + repeated RawKpi raw_kpis = 2; } message RawKpiTable { // table repeated RawKpiList raw_kpi_lists = 1; } -message KpiId { - context.Uuid kpi_id = 1; -} + message Kpi { - KpiId kpi_id = 1; + kpi_manager.KpiId kpi_id = 1; context.Timestamp timestamp = 2; KpiValue kpi_value = 3; } @@ -117,13 +105,11 @@ message KpiList { repeated Kpi kpi = 1; } -message KpiDescriptorList { - repeated KpiDescriptor kpi_descriptor_list = 1; -} + message SubsDescriptor{ SubscriptionID subs_id = 1; - KpiId kpi_id = 2; + kpi_manager.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" @@ -148,7 +134,7 @@ message AlarmDescriptor { AlarmID alarm_id = 1; string alarm_description = 2; string name = 3; - KpiId kpi_id = 4; + kpi_manager.KpiId kpi_id = 4; KpiValueRange kpi_value_range = 5; context.Timestamp timestamp = 6; } -- GitLab From c02883ed78e500104a4f57cdbd2f9aa9f7315cc4 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 19 Mar 2024 07:11:13 +0000 Subject: [PATCH 021/602] service name enum and default grpc port is added --- src/common/Constants.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/common/Constants.py b/src/common/Constants.py index 30aa09b4c..838b028a7 100644 --- a/src/common/Constants.py +++ b/src/common/Constants.py @@ -43,6 +43,7 @@ class ServiceNameEnum(Enum): ZTP = 'ztp' POLICY = 'policy' MONITORING = 'monitoring' + KPIMANGER = 'kpiManager' DLT = 'dlt' NBI = 'nbi' CYBERSECURITY = 'cybersecurity' @@ -73,6 +74,7 @@ DEFAULT_SERVICE_GRPC_PORTS = { ServiceNameEnum.ZTP .value : 5050, ServiceNameEnum.POLICY .value : 6060, ServiceNameEnum.MONITORING .value : 7070, + ServiceNameEnum.KPIMANGER .value : 7071, ServiceNameEnum.DLT .value : 8080, ServiceNameEnum.NBI .value : 9090, ServiceNameEnum.L3_CAD .value : 10001, -- GitLab From 65fd027c946f5e266311877f0541e030867fd1ee Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 19 Mar 2024 07:11:59 +0000 Subject: [PATCH 022/602] initial client file for kpi manager --- src/kpi_manager/client/KpiManagerClient.py | 76 ++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/kpi_manager/client/KpiManagerClient.py diff --git a/src/kpi_manager/client/KpiManagerClient.py b/src/kpi_manager/client/KpiManagerClient.py new file mode 100644 index 000000000..3aa6fc65d --- /dev/null +++ b/src/kpi_manager/client/KpiManagerClient.py @@ -0,0 +1,76 @@ +# 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 grpc, logging +from common.Constants import ServiceNameEnum +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_manager_pb2_grpc import KpiManagerServiceStub + +LOGGER = logging.getLogger(__name__) +MAX_RETRIES = 15 +DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) +RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') + +class KpiManagerclient: + def __init__(self, host=None, port=None): + if not host: host = get_service_host(ServiceNameEnum.KPIMANGER) # update enum + if not port: port = get_service_port_grpc(ServiceNameEnum.KPIMANGER) # update enum + self.endpoint = '{:s}:{:s}'.format(str(host), str(port)) + LOGGER.debug('Creating channel to {:s}...'.format(str(self.endpoint))) + self.channel = None + self.stub = None + self.connect() + LOGGER.debug('Channel created') + + def connect(self): + self.channel = grpc.insecure_channel(self.endpoint) + self.stub = KpiManagerServiceStub(self.channel) + + def close(self): + if self.channel is not None: self.channel.close() + self.channel = None + self.stub = None + + @RETRY_DECORATOR + def SetKpi(self, request : KpiDescriptor) -> KpiId: + LOGGER.debug('SetKpi: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.SetKpi(request) + LOGGER.debug('SetKpi result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def DeleteKpi(self,request : KpiId) -> Empty: + LOGGER.debug('DeleteKpi: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.DeleteKpi(request) + LOGGER.info('DeleteKpi result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def GetKpiDescriptor(self, request : KpiId) -> KpiDescriptor: + LOGGER.debug('GetKpiDescriptor: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.GetKpiDescriptor(request) + LOGGER.debug('GetKpiDescriptor result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def GetKpiDescriptorList(self, request : Empty) -> KpiDescriptorList: + LOGGER.debug('GetKpiDescriptorList: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.GetKpiDescriptorList(request) + LOGGER.debug('GetKpiDescriptorList result: {:s}'.format(grpc_message_to_json_string(response))) + return response \ No newline at end of file -- GitLab From 0b5fd79d8270475cf0e38cc3970ad77a14e8a08e Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 19 Mar 2024 07:13:09 +0000 Subject: [PATCH 023/602] initial service file for kpi manager --- src/kpi_manager/server/KpiManagerServer.py | 122 +++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 src/kpi_manager/server/KpiManagerServer.py diff --git a/src/kpi_manager/server/KpiManagerServer.py b/src/kpi_manager/server/KpiManagerServer.py new file mode 100644 index 000000000..0a8932aab --- /dev/null +++ b/src/kpi_manager/server/KpiManagerServer.py @@ -0,0 +1,122 @@ +# 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 logging, os, grpc +from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method +from common.proto.context_pb2 import Empty + +from common.Constants import ServiceNameEnum +from common.Settings import get_service_port_grpc +from common.proto.kpi_manager_pb2_grpc import add_KpiManagerServiceServicer_to_server +from common.proto.kpi_manager_pb2_grpc import KpiManagerServiceServicer +from monitoring.service.NameMapping import NameMapping + +from common.proto.kpi_manager_pb2 import kpiDescriptor, KpiId, KpiDescriptorList +from monitoring.service import ManagementDBTools + +from common.tools.service.GenericGrpcService import GenericGrpcService + +LOGGER = logging.getLogger(__name__) + +METRICSDB_HOSTNAME = os.environ.get("METRICSDB_HOSTNAME") +METRICSDB_ILP_PORT = os.environ.get("METRICSDB_ILP_PORT") +METRICSDB_REST_PORT = os.environ.get("METRICSDB_REST_PORT") +METRICSDB_TABLE_MONITORING_KPIS = os.environ.get("METRICSDB_TABLE_MONITORING_KPIS") + +METRICS_POOL = MetricsPool('Monitoring', 'RPC') + +class KpiManagerServer(KpiManagerServiceServicer): + def __init__(self, cls_name: str = __name__): + LOGGER.info('Init KpiManagerService') + port = get_service_port_grpc(ServiceNameEnum.KPIMANGER) # port updated + GenericGrpcService(port, cls_name = cls_name) # class inheretence was removed + + # Init sqlite monitoring db + self.management_db = ManagementDBTools.ManagementDB('monitoring.db') # why monitoring.db here??? + LOGGER.info('MetricsDB initialized --- KPI Manager Service') + + def install_servicers(self): + # There is no need to create the "MonitoringServiceServicerImpl" instance because actual class + # implementation exists in the same class. + add_KpiManagerServiceServicer_to_server(KpiManagerServer(), self.server) + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def SetKpi( + self, request: KpiDescriptor, grpc_context: grpc.ServicerContext + ) -> KpiId: + response = KpiId() + kpi_description = request.kpi_description + kpi_sample_type = request.kpi_sample_type + kpi_device_id = request.device_id.device_uuid.uuid + kpi_endpoint_id = request.endpoint_id.endpoint_uuid.uuid + kpi_service_id = request.service_id.service_uuid.uuid + kpi_slice_id = request.slice_id.slice_uuid.uuid + kpi_connection_id = request.connection_id.connection_uuid.uuid + kpi_link_id = request.link_id.link_uuid.uuid + if request.kpi_id.kpi_id.uuid != "": + response.kpi_id.uuid = request.kpi_id.kpi_id.uuid + # Here the code to modify an existing kpi + else: + data = self.management_db.insert_KPI( + kpi_description, kpi_sample_type, kpi_device_id, kpi_endpoint_id, + kpi_service_id, kpi_slice_id, kpi_connection_id, kpi_link_id) + response.kpi_id.uuid = str(data) + return response + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def DeleteKpi(self, request: KpiId, grpc_context: grpc.ServicerContext) -> Empty: + kpi_id = int(request.kpi_id.uuid) + kpi = self.management_db.get_KPI(kpi_id) + if kpi: + self.management_db.delete_KPI(kpi_id) + else: + LOGGER.info('DeleteKpi error: KpiID({:s}): not found in database'.format(str(kpi_id))) + return Empty() + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> KpiDescriptor: + kpi_id = request.kpi_id.uuid + kpi_db = self.management_db.get_KPI(int(kpi_id)) + kpiDescriptor = KpiDescriptor() + if kpi_db is None: + LOGGER.info('GetKpiDescriptor error: KpiID({:s}): not found in database'.format(str(kpi_id))) + else: + kpiDescriptor.kpi_description = kpi_db[1] + kpiDescriptor.kpi_sample_type = kpi_db[2] + kpiDescriptor.device_id.device_uuid.uuid = str(kpi_db[3]) + kpiDescriptor.endpoint_id.endpoint_uuid.uuid = str(kpi_db[4]) + kpiDescriptor.service_id.service_uuid.uuid = str(kpi_db[5]) + kpiDescriptor.slice_id.slice_uuid.uuid = str(kpi_db[6]) + kpiDescriptor.connection_id.connection_uuid.uuid = str(kpi_db[7]) + kpiDescriptor.link_id.link_uuid.uuid = str(kpi_db[8]) + return kpiDescriptor + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def GetKpiDescriptorList(self, request: Empty, grpc_context: grpc.ServicerContext) -> KpiDescriptorList: + kpi_descriptor_list = KpiDescriptorList() + data = self.management_db.get_KPIS() + LOGGER.debug(f"data: {data}") + for item in data: + kpi_descriptor = KpiDescriptor() + kpi_descriptor.kpi_id.kpi_id.uuid = str(item[0]) + kpi_descriptor.kpi_description = item[1] + kpi_descriptor.kpi_sample_type = item[2] + kpi_descriptor.device_id.device_uuid.uuid = str(item[3]) + kpi_descriptor.endpoint_id.endpoint_uuid.uuid = str(item[4]) + kpi_descriptor.service_id.service_uuid.uuid = str(item[5]) + kpi_descriptor.slice_id.slice_uuid.uuid = str(item[6]) + kpi_descriptor.connection_id.connection_uuid.uuid = str(item[7]) + kpi_descriptor.link_id.link_uuid.uuid = str(item[8]) + kpi_descriptor_list.kpi_descriptor_list.append(kpi_descriptor) + return kpi_descriptor_list \ No newline at end of file -- GitLab From 5b6399dc2bb9665bbcfc4207239923f82549d938 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 19 Mar 2024 07:36:20 +0000 Subject: [PATCH 024/602] TYPO - "KPIMANGER" changed to "KPIMANAGER" --- src/common/Constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/Constants.py b/src/common/Constants.py index 838b028a7..4a0f3a226 100644 --- a/src/common/Constants.py +++ b/src/common/Constants.py @@ -43,7 +43,7 @@ class ServiceNameEnum(Enum): ZTP = 'ztp' POLICY = 'policy' MONITORING = 'monitoring' - KPIMANGER = 'kpiManager' + KPIMANAGER = 'kpiManager' DLT = 'dlt' NBI = 'nbi' CYBERSECURITY = 'cybersecurity' -- GitLab From 67146f1e6061f3190659ef1d0f87e07b270c746c Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 19 Mar 2024 07:37:23 +0000 Subject: [PATCH 025/602] updated KPIMANAGER ServiceEnumName --- src/kpi_manager/client/KpiManagerClient.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/kpi_manager/client/KpiManagerClient.py b/src/kpi_manager/client/KpiManagerClient.py index 3aa6fc65d..d31a8b60f 100644 --- a/src/kpi_manager/client/KpiManagerClient.py +++ b/src/kpi_manager/client/KpiManagerClient.py @@ -29,8 +29,8 @@ RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, class KpiManagerclient: def __init__(self, host=None, port=None): - if not host: host = get_service_host(ServiceNameEnum.KPIMANGER) # update enum - if not port: port = get_service_port_grpc(ServiceNameEnum.KPIMANGER) # update enum + if not host: host = get_service_host(ServiceNameEnum.KPIMANAGER) # update enum + if not port: port = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # update enum self.endpoint = '{:s}:{:s}'.format(str(host), str(port)) LOGGER.debug('Creating channel to {:s}...'.format(str(self.endpoint))) self.channel = None -- GitLab From 2223326625edeeab4a89e0535ce490e73725db1d Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 19 Mar 2024 07:38:50 +0000 Subject: [PATCH 026/602] updation of KPIMANAGER ServiceEnumName and removal of unnecssary variables. --- src/kpi_manager/server/KpiManagerServer.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/kpi_manager/server/KpiManagerServer.py b/src/kpi_manager/server/KpiManagerServer.py index 0a8932aab..d42ce14eb 100644 --- a/src/kpi_manager/server/KpiManagerServer.py +++ b/src/kpi_manager/server/KpiManagerServer.py @@ -29,17 +29,12 @@ from common.tools.service.GenericGrpcService import GenericGrpcService LOGGER = logging.getLogger(__name__) -METRICSDB_HOSTNAME = os.environ.get("METRICSDB_HOSTNAME") -METRICSDB_ILP_PORT = os.environ.get("METRICSDB_ILP_PORT") -METRICSDB_REST_PORT = os.environ.get("METRICSDB_REST_PORT") -METRICSDB_TABLE_MONITORING_KPIS = os.environ.get("METRICSDB_TABLE_MONITORING_KPIS") - METRICS_POOL = MetricsPool('Monitoring', 'RPC') class KpiManagerServer(KpiManagerServiceServicer): def __init__(self, cls_name: str = __name__): LOGGER.info('Init KpiManagerService') - port = get_service_port_grpc(ServiceNameEnum.KPIMANGER) # port updated + port = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # port updated GenericGrpcService(port, cls_name = cls_name) # class inheretence was removed # Init sqlite monitoring db -- GitLab From 5ae5b5479580345b5a2b42b49bc2fb5544d88a48 Mon Sep 17 00:00:00 2001 From: armingol Date: Thu, 21 Mar 2024 10:58:38 +0100 Subject: [PATCH 027/602] Logical Inventory: First version 1) Modify device component to store ACL data 2) New WebUI tab with logical inventory --- .../drivers/openconfig/templates/Acl.py | 64 +-- src/webui/service/device/routes.py | 10 + src/webui/service/templates/device/home.html | 9 + .../service/templates/device/logical.html | 397 ++++++++++++++++++ 4 files changed, 449 insertions(+), 31 deletions(-) create mode 100644 src/webui/service/templates/device/logical.html diff --git a/src/device/service/drivers/openconfig/templates/Acl.py b/src/device/service/drivers/openconfig/templates/Acl.py index c316772a5..e9a9119c5 100644 --- a/src/device/service/drivers/openconfig/templates/Acl.py +++ b/src/device/service/drivers/openconfig/templates/Acl.py @@ -20,7 +20,7 @@ from .Tools import add_value_from_tag LOGGER = logging.getLogger(__name__) XPATH_ACL_SET = "//ocacl:acl/ocacl:acl-sets/ocacl:acl-set" -XPATH_A_ACL_ENTRY = ".//ocacl:acl-entries/ocacl:ecl-entry" +XPATH_A_ACL_ENTRY = ".//ocacl:acl-entries/ocacl:acl-entry" XPATH_A_IPv4 = ".//ocacl:ipv4/ocacl:config" XPATH_A_TRANSPORT = ".//ocacl:transport/ocacl:config" XPATH_A_ACTIONS = ".//ocacl:actions/ocacl:config" @@ -34,29 +34,31 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: response = [] acl = {} + name = {} for xml_acl in xml_data.xpath(XPATH_ACL_SET, namespaces=NAMESPACES): #LOGGER.info('xml_acl = {:s}'.format(str(ET.tostring(xml_acl)))) acl_name = xml_acl.find('ocacl:name', namespaces=NAMESPACES) if acl_name is None or acl_name.text is None: continue - add_value_from_tag(acl, 'name', acl_name) + add_value_from_tag(name, 'name', acl_name) acl_type = xml_acl.find('ocacl:type', namespaces=NAMESPACES) add_value_from_tag(acl, 'type', acl_type) for xml_acl_entries in xml_acl.xpath(XPATH_A_ACL_ENTRY, namespaces=NAMESPACES): - acl_id = xml_acl_entries.find('ocacl:sequence_id', namespaces=NAMESPACES) - add_value_from_tag(acl, 'sequence_id', acl_id) + acl_id = xml_acl_entries.find('ocacl:sequence-id', namespaces=NAMESPACES) + add_value_from_tag(acl, 'sequence-id', acl_id) + LOGGER.info('xml_acl_id = {:s}'.format(str(ET.tostring(acl_id)))) for xml_ipv4 in xml_acl_entries.xpath(XPATH_A_IPv4, namespaces=NAMESPACES): - ipv4_source = xml_ipv4.find('ocacl:source_address', namespaces=NAMESPACES) - add_value_from_tag(acl, 'source_address' , ipv4_source) + ipv4_source = xml_ipv4.find('ocacl:source-address', namespaces=NAMESPACES) + add_value_from_tag(acl, 'source-address' , ipv4_source) - ipv4_destination = xml_ipv4.find('ocacl:destination_address', namespaces=NAMESPACES) - add_value_from_tag(acl, 'destination_address' , ipv4_destination) + ipv4_destination = xml_ipv4.find('ocacl:destination-address', namespaces=NAMESPACES) + add_value_from_tag(acl, 'destination-address' , ipv4_destination) ipv4_protocol = xml_ipv4.find('ocacl:protocol', namespaces=NAMESPACES) add_value_from_tag(acl, 'protocol' , ipv4_protocol) @@ -64,30 +66,30 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: ipv4_dscp = xml_ipv4.find('ocacl:dscp', namespaces=NAMESPACES) add_value_from_tag(acl, 'dscp' , ipv4_dscp) - ipv4_hop_limit = xml_ipv4.find('ocacl:hop_limit', namespaces=NAMESPACES) - add_value_from_tag(acl, 'hop_limit' , ipv4_hop_limit) + ipv4_hop_limit = xml_ipv4.find('ocacl:hop-limit', namespaces=NAMESPACES) + add_value_from_tag(acl, 'hop-limit' , ipv4_hop_limit) for xml_transport in xml_acl_entries.xpath(XPATH_A_TRANSPORT, namespaces=NAMESPACES): - transport_source = xml_transport.find('ocacl:source_port', namespaces=NAMESPACES) - add_value_from_tag(acl, 'source_port' ,transport_source) + transport_source = xml_transport.find('ocacl:source-port', namespaces=NAMESPACES) + add_value_from_tag(acl, 'source-port' ,transport_source) - transport_destination = xml_transport.find('ocacl:destination_port', namespaces=NAMESPACES) - add_value_from_tag(acl, 'destination_port' ,transport_destination) + transport_destination = xml_transport.find('ocacl:destination-port', namespaces=NAMESPACES) + add_value_from_tag(acl, 'destination-port' ,transport_destination) - transport_tcp_flags = xml_transport.find('ocacl:tcp_flags', namespaces=NAMESPACES) - add_value_from_tag(acl, 'tcp_flags' ,transport_tcp_flags) + transport_tcp_flags = xml_transport.find('ocacl:tcp-flags', namespaces=NAMESPACES) + add_value_from_tag(acl, 'tcp-flags' ,transport_tcp_flags) for xml_action in xml_acl_entries.xpath(XPATH_A_ACTIONS, namespaces=NAMESPACES): - action = xml_action.find('ocacl:forwarding_action', namespaces=NAMESPACES) - add_value_from_tag(acl, 'forwarding_action' ,action) + action = xml_action.find('ocacl:forwarding-action', namespaces=NAMESPACES) + add_value_from_tag(acl, 'forwarding-action' ,action) - log_action = xml_action.find('ocacl:log_action', namespaces=NAMESPACES) - add_value_from_tag(acl, 'log_action' ,log_action) + log_action = xml_action.find('ocacl:log-action', namespaces=NAMESPACES) + add_value_from_tag(acl, 'log-action' ,log_action) resource_key = '/acl/acl-set[{:s}][{:s}]/acl-entry[{:s}]'.format( - acl['name'], acl['type'], acl['sequence-id']) + name['name'], acl['type'], acl['sequence-id']) response.append((resource_key,acl)) for xml_interface in xml_data.xpath(XPATH_INTERFACE, namespaces=NAMESPACES): @@ -99,25 +101,25 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: for xml_ingress in xml_interface.xpath(XPATH_I_INGRESS, namespaces=NAMESPACES): - i_name = xml_ingress.find('ocacl:set_name_ingress', namespaces=NAMESPACES) - add_value_from_tag(interface, 'ingress_set_name' , i_name) + i_name = xml_ingress.find('ocacl:set-name-ingress', namespaces=NAMESPACES) + add_value_from_tag(interface, 'ingress-set-name' , i_name) - i_type = xml_ingress.find('ocacl:type_ingress', namespaces=NAMESPACES) - add_value_from_tag(interface, 'ingress_type' , i_type) + i_type = xml_ingress.find('ocacl:type-ingress', namespaces=NAMESPACES) + add_value_from_tag(interface, 'ingress-type' , i_type) resource_key = '/acl/interfaces/ingress[{:s}][{:s}]'.format( - acl['name'], acl['type']) + name['name'], acl['type']) response.append((resource_key,interface)) for xml_egress in xml_interface.xpath(XPATH_I_EGRESS, namespaces=NAMESPACES): - e_name = xml_egress.find('ocacl:set_name_egress', namespaces=NAMESPACES) - add_value_from_tag(interface, 'egress_set_name' , e_name) + e_name = xml_egress.find('ocacl:set-name-egress', namespaces=NAMESPACES) + add_value_from_tag(interface, 'egress-set-name' , e_name) - e_type = xml_egress.find('ocacl:type_egress', namespaces=NAMESPACES) - add_value_from_tag(interface, 'egress_type' , e_type) + e_type = xml_egress.find('ocacl:type-egress', namespaces=NAMESPACES) + add_value_from_tag(interface, 'egress-type' , e_type) resource_key = '/acl/interfaces/egress[{:s}][{:s}]'.format( - acl['name'], acl['type']) + name['name'], acl['type']) response.append((resource_key,interface)) return response diff --git a/src/webui/service/device/routes.py b/src/webui/service/device/routes.py index 8b8bc236a..b579094e3 100644 --- a/src/webui/service/device/routes.py +++ b/src/webui/service/device/routes.py @@ -165,6 +165,16 @@ def inventory(device_uuid: str): context_client.close() return render_template('device/inventory.html', device=device_obj) +@device.route('logical/', methods=['GET', 'POST']) +def logical(device_uuid: str): + context_client.connect() + device_obj = get_device(context_client, device_uuid, rw_copy=False) + if device_obj is None: + flash('Device({:s}) not found'.format(str(device_uuid)), 'danger') + device_obj = Device() + context_client.close() + return render_template('device/logical.html', device=device_obj) + @device.get('/delete') def delete(device_uuid): try: diff --git a/src/webui/service/templates/device/home.html b/src/webui/service/templates/device/home.html index e356fd4fb..b6c50c8dd 100644 --- a/src/webui/service/templates/device/home.html +++ b/src/webui/service/templates/device/home.html @@ -51,6 +51,7 @@ Config Rules + @@ -83,6 +84,14 @@ + + + + + + + + {% endfor %} {% else %} diff --git a/src/webui/service/templates/device/logical.html b/src/webui/service/templates/device/logical.html new file mode 100644 index 000000000..1287c20cf --- /dev/null +++ b/src/webui/service/templates/device/logical.html @@ -0,0 +1,397 @@ + + +{% extends 'base.html' %} + +{% block content %} + + +

Device {{ device.name }} ({{ device.device_id.device_uuid.uuid }})

+ +
+
+ +
+
+
+ +
+
+
    +
  • ACL +
      + {% set acl_names = [] %} + {% for config in device.device_config.config_rules %} + {% if config.WhichOneof('config_rule') == 'custom' %} + {% if '/acl/' in config.custom.resource_key %} + {% if 'acl-set' in config.custom.resource_key %} + {% set acl_name = config.custom.resource_key.split('acl-set[')[1].split('][')[0] %} + {% else %} + {% set acl_name = config.custom.resource_key.split('ress[')[1].split('][')[0] %} + {% endif %} + {% if acl_name|length == 0 %} + {% set acl_name = 'Undefined' %} + {% endif %} + {% if acl_name not in acl_names %} + {% set _ = acl_names.append(acl_name) %} + {% endif %} + {% endif %} + {% endif %} + {% endfor %} + {% for acl_name in acl_names %} +
    • {{ acl_name }} +
        + {% for config in device.device_config.config_rules %} + {% if config.WhichOneof('config_rule') == 'custom' %} + {% if '/acl/' in config.custom.resource_key and acl_name in config.custom.resource_key.split('][')[0] %} + {% if 'acl-entry' in config.custom.resource_key %} + {% set rule_number = config.custom.resource_key.split('acl-entry[')[1].split(']')[0] %} +
      • Rule {{ rule_number }}: {{ config.custom.resource_value }}
      • + {% else %} +
      • Interface: {{ config.custom.resource_value }}
      • + {% endif %} + {% endif %} + {% endif %} + {% endfor %} +
      +
    • + {% endfor %} +
    +
  • +
+ +
    +
  • Routing Policy +
      + {% set pol_names = [] %} + {% for config in device.device_config.config_rules %} + {% if config.WhichOneof('config_rule') == 'custom' %} + {% if '/routing_policy/' in config.custom.resource_key %} + {% if 'policy_definition' in config.custom.resource_key %} + {% set pol_name = config.custom.resource_key.split('policy_definition[')[1].split(']')[0] %} + {% endif %} + {% if pol_name|length == 0 %} + {% set pol_name = 'Undefined' %} + {% endif %} + {% if pol_name not in pol_names %} + {% set _ = pol_names.append(pol_name) %} + {% endif %} + {% endif %} + {% endif %} + {% endfor %} + {% for pol_name in pol_names %} +
    • {{ pol_name }} +
        + {% for config in device.device_config.config_rules %} + {% if config.WhichOneof('config_rule') == 'custom' %} + {% if '/routing_policy/' in config.custom.resource_key and pol_name in config.custom.resource_key.split('[')[1].split(']')[0] %} + {% if 'policy_definition' not in config.custom.resource_key %} +
      • {{ config.custom.resource_value }}
      • + {% endif %} + {% endif %} + {% endif %} + {% endfor %} +
      +
    • + {% endfor %} +
    +
  • +
+ +
    +
  • VRFs +
      +
    • VRF default +
        + {% for config in device.device_config.config_rules %} + {% if config.WhichOneof('config_rule') == 'custom' %} + {% if '/network_instance' in config.custom.resource_key and config.custom.resource_key.split('[')[1].split(']')[0] in 'default' %} + {% if ']/' in config.custom.resource_key%} + {% set aux = config.custom.resource_key.split(']/')[1].split('[')[0] %} +
      • {{ aux.replace('_', ' ').title() }}: {{ config.custom.resource_value }}
      • + {% else %} +
      • Network Instance: {{ config.custom.resource_value }}
      • + {% endif %} + {% endif %} + {% endif %} + {% endfor %} +
      +
    • + +
    • L3VPN +
        + {% set vpn_names = [] %} + {% for config in device.device_config.config_rules %} + {% if config.WhichOneof('config_rule') == 'custom' %} + {% if '/network_instance' in config.custom.resource_key %} + + {% if 'L3VRF' in config.custom.resource_value %} + {% set vpn_name = config.custom.resource_key.split('network_instance[')[1].split(']')[0] %} + {% if vpn_name not in vpn_names %} + {% set _ = vpn_names.append(vpn_name) %} + {% endif %} + {% endif %} + {% endif %} + {% endif %} + {% endfor %} + {% for vpn_name in vpn_names %} +
      • {{ vpn_name }} +
          + {% for config in device.device_config.config_rules %} + {% if config.WhichOneof('config_rule') == 'custom' %} + {% if '/network_instance' in config.custom.resource_key and config.custom.resource_key.split('[')[1].split(']')[0] in vpn_name %} + {% if ']/' in config.custom.resource_key%} + {% set aux = config.custom.resource_key.split(']/')[1].split('[')[0] %} +
        • {{ aux.replace('_', ' ').title() }}: {{ config.custom.resource_value }}
        • + {% else %} +
        • Network Instance: {{ config.custom.resource_value }}
        • + {% endif %} + {% endif %} + {% endif %} + {% endfor %} +
        +
      • + {% endfor %} +
      +
    • + +
    • L2VPN +
        + {% set vpn_names = [] %} + {% for config in device.device_config.config_rules %} + {% if config.WhichOneof('config_rule') == 'custom' %} + {% if '/network_instance' in config.custom.resource_key %} + + {% if 'L2VSI' in config.custom.resource_value %} + {% set vpn_name = config.custom.resource_key.split('network_instance[')[1].split(']')[0] %} + {% if vpn_name not in vpn_names %} + {% set _ = vpn_names.append(vpn_name) %} + {% endif %} + {% endif %} + {% endif %} + {% endif %} + {% endfor %} + {% for vpn_name in vpn_names %} +
      • {{ vpn_name }} +
          + {% for config in device.device_config.config_rules %} + {% if config.WhichOneof('config_rule') == 'custom' %} + {% if '/network_instance' in config.custom.resource_key and config.custom.resource_key.split('[')[1].split(']')[0] in vpn_name %} + {% if ']/' in config.custom.resource_key%} + {% set aux = config.custom.resource_key.split(']/')[1].split('[')[0] %} +
        • {{ aux.replace('_', ' ').title() }}: {{ config.custom.resource_value }}
        • + {% else %} +
        • Network Instance: {{ config.custom.resource_value }}
        • + {% endif %} + {% endif %} + {% endif %} + {% endfor %} +
        +
      • + {% endfor %} +
      +
    • +
    +
  • +
+ +
    +
  • Interfaces +
      +
    • Logical Interfaces +
        + {% set interface_names = [] %} + {% for config in device.device_config.config_rules %} + {% if config.WhichOneof('config_rule') == 'custom' %} + {% if '/interface[' in config.custom.resource_key %} + {% if 'ethernetCsmacd' in config.custom.resource_value %} + {% set interface_name = config.custom.resource_key.split('interface[')[1].split(']')[0] %} +
      • {{ interface_name}}: {{config.custom.resource_value}}
      • + {% endif %} + {% endif %} + {% endif %} + {% endfor %} +
      +
    • + +
    • Loopback +
        + {% set interface_names = [] %} + {% for config in device.device_config.config_rules %} + {% if config.WhichOneof('config_rule') == 'custom' %} + {% if '/interface[' in config.custom.resource_key %} + {% if 'softwareLoopback' in config.custom.resource_value %} + {% set interface_name = config.custom.resource_key.split('interface[')[1].split(']')[0] %} + {% if interface_name not in interface_names %} + {% set _ = interface_names.append(interface_name) %} + {% endif %} + {% endif %} + {% endif %} + {% endif %} + {% endfor %} + {% for interface_name in interface_names %} +
      • {{ interface_name }} +
          + {% for config in device.device_config.config_rules %} + {% if config.WhichOneof('config_rule') == 'custom' %} + {% if '/interface' in config.custom.resource_key and config.custom.resource_key.split('[')[1].split(']')[0] in interface_name %} + {% if 'subinterface' in config.custom.resource_key %} + {% set subinterface_name = config.custom.resource_key.split('subinterface[')[1].split(']')[0] %} +
        • Subinterface {{subinterface_name}}: {{ config.custom.resource_value }}
        • + {% else %} +
        • {{ config.custom.resource_value }}
        • + {% endif %} + {% endif %} + {% endif %} + {% endfor %} +
        +
      • + {% endfor %} +
      +
    • + +
    • Interfaces L3 +
        + {% set interface_names = [] %} + {% for config in device.device_config.config_rules %} + {% if config.WhichOneof('config_rule') == 'custom' %} + {% if '/interface[' in config.custom.resource_key %} + {% if 'l3ipvlan' in config.custom.resource_value %} + {% set interface_name = config.custom.resource_key.split('interface[')[1].split(']')[0] %} + {% if interface_name not in interface_names %} + {% set _ = interface_names.append(interface_name) %} + {% endif %} + {% endif %} + {% endif %} + {% endif %} + {% endfor %} + {% for interface_name in interface_names %} +
      • {{ interface_name }} +
          + {% for config in device.device_config.config_rules %} + {% if config.WhichOneof('config_rule') == 'custom' %} + {% if '/interface' in config.custom.resource_key and '/subinterface' in config.custom.resource_key and config.custom.resource_key.split('[')[1].split(']')[0] in interface_name %} +
        • {{ config.custom.resource_value }}
        • + {% endif %} + {% endif %} + {% endfor %} +
        +
      • + {% endfor %} +
      +
    • + +
    • Interfaces L2 +
        + {% set interface_names = [] %} + {% for config in device.device_config.config_rules %} + {% if config.WhichOneof('config_rule') == 'custom' %} + {% if '/interface[' in config.custom.resource_key %} + {% if 'l2vlan' in config.custom.resource_value or 'mplsTunnel' in config.custom.resource_value %} + {% set interface_name = config.custom.resource_key.split('interface[')[1].split(']')[0] %} + {% if interface_name not in interface_names %} + {% set _ = interface_names.append(interface_name) %} + {% endif %} + {% endif %} + {% endif %} + {% endif %} + {% endfor %} + {% for interface_name in interface_names %} +
      • {{ interface_name }} +
          + {% for config in device.device_config.config_rules %} + {% if config.WhichOneof('config_rule') == 'custom' %} + {% if 'subinterface' in config.custom.resource_key %} + {% if '/interface' in config.custom.resource_key and '/subinterface' in config.custom.resource_key and config.custom.resource_key.split('[')[1].split(']')[0] in interface_name %} +
        • {{ config.custom.resource_value }}
        • + {% endif %} + {% else %} + {% if '/interface' in config.custom.resource_key and config.custom.resource_key.split('[')[1].split(']')[0] in interface_name %} +
        • {{ config.custom.resource_value }}
        • + {% endif %} + {% endif %} + {% endif %} + {% endfor %} +
        +
      • + {% endfor %} +
      +
    • +
    +
  • +
+ + +
+
+ +{% endblock %} -- GitLab From e5bfc7b10d25c24d03ecc348d948dba4d0639529 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 22 Mar 2024 08:21:45 +0000 Subject: [PATCH 028/602] blank line is removed --- src/kpi_manager/__init__.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/kpi_manager/__init__.py diff --git a/src/kpi_manager/__init__.py b/src/kpi_manager/__init__.py new file mode 100644 index 000000000..1549d9811 --- /dev/null +++ b/src/kpi_manager/__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. + -- GitLab From 7ef9ed5c57db3a562f10453958baf18cff6c5ef0 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 22 Mar 2024 08:23:44 +0000 Subject: [PATCH 029/602] Class name is changed from "KpiManagerclient" to "KpiManagerClient" --- src/kpi_manager/client/KpiManagerClient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kpi_manager/client/KpiManagerClient.py b/src/kpi_manager/client/KpiManagerClient.py index d31a8b60f..6baca7cef 100644 --- a/src/kpi_manager/client/KpiManagerClient.py +++ b/src/kpi_manager/client/KpiManagerClient.py @@ -27,7 +27,7 @@ MAX_RETRIES = 15 DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') -class KpiManagerclient: +class KpiManagerClient: def __init__(self, host=None, port=None): if not host: host = get_service_host(ServiceNameEnum.KPIMANAGER) # update enum if not port: port = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # update enum -- GitLab From e6b8b7a57ad254ae12bf705238f6b8d6e72c01af Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 22 Mar 2024 08:24:11 +0000 Subject: [PATCH 030/602] blank line is removed --- src/kpi_manager/service/KpiManagerService.py | 117 +++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 src/kpi_manager/service/KpiManagerService.py diff --git a/src/kpi_manager/service/KpiManagerService.py b/src/kpi_manager/service/KpiManagerService.py new file mode 100644 index 000000000..d42ce14eb --- /dev/null +++ b/src/kpi_manager/service/KpiManagerService.py @@ -0,0 +1,117 @@ +# 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 logging, os, grpc +from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method +from common.proto.context_pb2 import Empty + +from common.Constants import ServiceNameEnum +from common.Settings import get_service_port_grpc +from common.proto.kpi_manager_pb2_grpc import add_KpiManagerServiceServicer_to_server +from common.proto.kpi_manager_pb2_grpc import KpiManagerServiceServicer +from monitoring.service.NameMapping import NameMapping + +from common.proto.kpi_manager_pb2 import kpiDescriptor, KpiId, KpiDescriptorList +from monitoring.service import ManagementDBTools + +from common.tools.service.GenericGrpcService import GenericGrpcService + +LOGGER = logging.getLogger(__name__) + +METRICS_POOL = MetricsPool('Monitoring', 'RPC') + +class KpiManagerServer(KpiManagerServiceServicer): + def __init__(self, cls_name: str = __name__): + LOGGER.info('Init KpiManagerService') + port = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # port updated + GenericGrpcService(port, cls_name = cls_name) # class inheretence was removed + + # Init sqlite monitoring db + self.management_db = ManagementDBTools.ManagementDB('monitoring.db') # why monitoring.db here??? + LOGGER.info('MetricsDB initialized --- KPI Manager Service') + + def install_servicers(self): + # There is no need to create the "MonitoringServiceServicerImpl" instance because actual class + # implementation exists in the same class. + add_KpiManagerServiceServicer_to_server(KpiManagerServer(), self.server) + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def SetKpi( + self, request: KpiDescriptor, grpc_context: grpc.ServicerContext + ) -> KpiId: + response = KpiId() + kpi_description = request.kpi_description + kpi_sample_type = request.kpi_sample_type + kpi_device_id = request.device_id.device_uuid.uuid + kpi_endpoint_id = request.endpoint_id.endpoint_uuid.uuid + kpi_service_id = request.service_id.service_uuid.uuid + kpi_slice_id = request.slice_id.slice_uuid.uuid + kpi_connection_id = request.connection_id.connection_uuid.uuid + kpi_link_id = request.link_id.link_uuid.uuid + if request.kpi_id.kpi_id.uuid != "": + response.kpi_id.uuid = request.kpi_id.kpi_id.uuid + # Here the code to modify an existing kpi + else: + data = self.management_db.insert_KPI( + kpi_description, kpi_sample_type, kpi_device_id, kpi_endpoint_id, + kpi_service_id, kpi_slice_id, kpi_connection_id, kpi_link_id) + response.kpi_id.uuid = str(data) + return response + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def DeleteKpi(self, request: KpiId, grpc_context: grpc.ServicerContext) -> Empty: + kpi_id = int(request.kpi_id.uuid) + kpi = self.management_db.get_KPI(kpi_id) + if kpi: + self.management_db.delete_KPI(kpi_id) + else: + LOGGER.info('DeleteKpi error: KpiID({:s}): not found in database'.format(str(kpi_id))) + return Empty() + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> KpiDescriptor: + kpi_id = request.kpi_id.uuid + kpi_db = self.management_db.get_KPI(int(kpi_id)) + kpiDescriptor = KpiDescriptor() + if kpi_db is None: + LOGGER.info('GetKpiDescriptor error: KpiID({:s}): not found in database'.format(str(kpi_id))) + else: + kpiDescriptor.kpi_description = kpi_db[1] + kpiDescriptor.kpi_sample_type = kpi_db[2] + kpiDescriptor.device_id.device_uuid.uuid = str(kpi_db[3]) + kpiDescriptor.endpoint_id.endpoint_uuid.uuid = str(kpi_db[4]) + kpiDescriptor.service_id.service_uuid.uuid = str(kpi_db[5]) + kpiDescriptor.slice_id.slice_uuid.uuid = str(kpi_db[6]) + kpiDescriptor.connection_id.connection_uuid.uuid = str(kpi_db[7]) + kpiDescriptor.link_id.link_uuid.uuid = str(kpi_db[8]) + return kpiDescriptor + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def GetKpiDescriptorList(self, request: Empty, grpc_context: grpc.ServicerContext) -> KpiDescriptorList: + kpi_descriptor_list = KpiDescriptorList() + data = self.management_db.get_KPIS() + LOGGER.debug(f"data: {data}") + for item in data: + kpi_descriptor = KpiDescriptor() + kpi_descriptor.kpi_id.kpi_id.uuid = str(item[0]) + kpi_descriptor.kpi_description = item[1] + kpi_descriptor.kpi_sample_type = item[2] + kpi_descriptor.device_id.device_uuid.uuid = str(item[3]) + kpi_descriptor.endpoint_id.endpoint_uuid.uuid = str(item[4]) + kpi_descriptor.service_id.service_uuid.uuid = str(item[5]) + kpi_descriptor.slice_id.slice_uuid.uuid = str(item[6]) + kpi_descriptor.connection_id.connection_uuid.uuid = str(item[7]) + kpi_descriptor.link_id.link_uuid.uuid = str(item[8]) + kpi_descriptor_list.kpi_descriptor_list.append(kpi_descriptor) + return kpi_descriptor_list \ No newline at end of file -- GitLab From 90ffb7281d4db0a987d1902640949ad4153f0462 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 22 Mar 2024 08:25:57 +0000 Subject: [PATCH 031/602] KpiManager test messages file initial version. --- src/kpi_manager/tests/test_messages.py | 69 ++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/kpi_manager/tests/test_messages.py diff --git a/src/kpi_manager/tests/test_messages.py b/src/kpi_manager/tests/test_messages.py new file mode 100644 index 000000000..589d6cb84 --- /dev/null +++ b/src/kpi_manager/tests/test_messages.py @@ -0,0 +1,69 @@ +# 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. + +from common.proto import kpi_manager_pb2 +from common.proto.kpi_sample_types_pb2 import KpiSampleType + +def kpi_id(): + _kpi_id = kpi_manager_pb2.KpiId() + _kpi_id.kpi_id.uuid = str(1) # pylint: disable=maybe-no-member + return _kpi_id + +def create_kpi_request(kpi_id_str): + _create_kpi_request = kpi_manager_pb2.KpiDescriptor() + _create_kpi_request.kpi_description = 'KPI Description Test' + _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED + _create_kpi_request.device_id.device_uuid.uuid = 'DEV' + str(kpi_id_str) + _create_kpi_request.service_id.service_uuid.uuid = 'SERV' + str(kpi_id_str) + _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC' + str(kpi_id_str) + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END' + str(kpi_id_str) + _create_kpi_request.connection_id.connection_uuid.uuid = 'CON' + str(kpi_id_str) + return _create_kpi_request + +def create_kpi_request_b(): + _create_kpi_request = kpi_manager_pb2.KpiDescriptor() + _create_kpi_request.kpi_description = 'KPI Description Test' + _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED + _create_kpi_request.device_id.device_uuid.uuid = 'DEV2' # pylint: disable=maybe-no-member + _create_kpi_request.service_id.service_uuid.uuid = 'SERV2' # pylint: disable=maybe-no-member + _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC2' # pylint: disable=maybe-no-member + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END2' # pylint: disable=maybe-no-member + _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2' # pylint: disable=maybe-no-member + return _create_kpi_request + +def create_kpi_request_c(): + _create_kpi_request = kpi_manager_pb2.KpiDescriptor() + _create_kpi_request.kpi_description = 'KPI Description Test' + _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED + _create_kpi_request.device_id.device_uuid.uuid = 'DEV3' # pylint: disable=maybe-no-member + _create_kpi_request.service_id.service_uuid.uuid = 'SERV3' # pylint: disable=maybe-no-member + _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC3' # pylint: disable=maybe-no-member + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END3' # pylint: disable=maybe-no-member + _create_kpi_request.connection_id.connection_uuid.uuid = 'CON3' # pylint: disable=maybe-no-member + return _create_kpi_request + +def create_kpi_request_d(): + _create_kpi_request = kpi_manager_pb2.KpiDescriptor() + _create_kpi_request.kpi_description = 'KPI Description Test' + _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED + _create_kpi_request.device_id.device_uuid.uuid = 'DEV4' # pylint: disable=maybe-no-member + _create_kpi_request.service_id.service_uuid.uuid = 'SERV4' # pylint: disable=maybe-no-member + _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC4' # pylint: disable=maybe-no-member + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END4' # pylint: disable=maybe-no-member + _create_kpi_request.connection_id.connection_uuid.uuid = 'CON4' # pylint: disable=maybe-no-member + return _create_kpi_request + +def kpi_descriptor_list(): + _kpi_descriptor_list = kpi_manager_pb2.KpiDescriptorList() + return _kpi_descriptor_list \ No newline at end of file -- GitLab From 7fdc29ac02f3a8dc0f35b5fb1d8cca0af3edf4da Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 22 Mar 2024 08:28:35 +0000 Subject: [PATCH 032/602] The methods moved to KpiManagerMessages file are removed. --- src/monitoring/tests/Messages.py | 102 +++++++++++++++---------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/src/monitoring/tests/Messages.py b/src/monitoring/tests/Messages.py index a56207d9a..23f4db017 100644 --- a/src/monitoring/tests/Messages.py +++ b/src/monitoring/tests/Messages.py @@ -17,54 +17,54 @@ from common.proto import monitoring_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType from common.tools.timestamp.Converters import timestamp_utcnow_to_float -def kpi_id(): - _kpi_id = monitoring_pb2.KpiId() - _kpi_id.kpi_id.uuid = str(1) # pylint: disable=maybe-no-member - return _kpi_id - -def create_kpi_request(kpi_id_str): - _create_kpi_request = monitoring_pb2.KpiDescriptor() - _create_kpi_request.kpi_description = 'KPI Description Test' - _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED - _create_kpi_request.device_id.device_uuid.uuid = 'DEV' + str(kpi_id_str) - _create_kpi_request.service_id.service_uuid.uuid = 'SERV' + str(kpi_id_str) - _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC' + str(kpi_id_str) - _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END' + str(kpi_id_str) - _create_kpi_request.connection_id.connection_uuid.uuid = 'CON' + str(kpi_id_str) - return _create_kpi_request - -def create_kpi_request_b(): - _create_kpi_request = monitoring_pb2.KpiDescriptor() - _create_kpi_request.kpi_description = 'KPI Description Test' - _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED - _create_kpi_request.device_id.device_uuid.uuid = 'DEV2' # pylint: disable=maybe-no-member - _create_kpi_request.service_id.service_uuid.uuid = 'SERV2' # pylint: disable=maybe-no-member - _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC2' # pylint: disable=maybe-no-member - _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END2' # pylint: disable=maybe-no-member - _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2' # pylint: disable=maybe-no-member - return _create_kpi_request - -def create_kpi_request_c(): - _create_kpi_request = monitoring_pb2.KpiDescriptor() - _create_kpi_request.kpi_description = 'KPI Description Test' - _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED - _create_kpi_request.device_id.device_uuid.uuid = 'DEV3' # pylint: disable=maybe-no-member - _create_kpi_request.service_id.service_uuid.uuid = 'SERV3' # pylint: disable=maybe-no-member - _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC3' # pylint: disable=maybe-no-member - _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END3' # pylint: disable=maybe-no-member - _create_kpi_request.connection_id.connection_uuid.uuid = 'CON3' # pylint: disable=maybe-no-member - return _create_kpi_request - -def create_kpi_request_d(): - _create_kpi_request = monitoring_pb2.KpiDescriptor() - _create_kpi_request.kpi_description = 'KPI Description Test' - _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED - _create_kpi_request.device_id.device_uuid.uuid = 'DEV4' # pylint: disable=maybe-no-member - _create_kpi_request.service_id.service_uuid.uuid = 'SERV4' # pylint: disable=maybe-no-member - _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC4' # pylint: disable=maybe-no-member - _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END4' # pylint: disable=maybe-no-member - _create_kpi_request.connection_id.connection_uuid.uuid = 'CON4' # pylint: disable=maybe-no-member - return _create_kpi_request +# def kpi_id(): +# _kpi_id = monitoring_pb2.KpiId() +# _kpi_id.kpi_id.uuid = str(1) # pylint: disable=maybe-no-member +# return _kpi_id + +# def create_kpi_request(kpi_id_str): +# _create_kpi_request = monitoring_pb2.KpiDescriptor() +# _create_kpi_request.kpi_description = 'KPI Description Test' +# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED +# _create_kpi_request.device_id.device_uuid.uuid = 'DEV' + str(kpi_id_str) +# _create_kpi_request.service_id.service_uuid.uuid = 'SERV' + str(kpi_id_str) +# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC' + str(kpi_id_str) +# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END' + str(kpi_id_str) +# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON' + str(kpi_id_str) +# return _create_kpi_request + +# def create_kpi_request_b(): +# _create_kpi_request = monitoring_pb2.KpiDescriptor() +# _create_kpi_request.kpi_description = 'KPI Description Test' +# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED +# _create_kpi_request.device_id.device_uuid.uuid = 'DEV2' # pylint: disable=maybe-no-member +# _create_kpi_request.service_id.service_uuid.uuid = 'SERV2' # pylint: disable=maybe-no-member +# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC2' # pylint: disable=maybe-no-member +# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END2' # pylint: disable=maybe-no-member +# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2' # pylint: disable=maybe-no-member +# return _create_kpi_request + +# def create_kpi_request_c(): +# _create_kpi_request = monitoring_pb2.KpiDescriptor() +# _create_kpi_request.kpi_description = 'KPI Description Test' +# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED +# _create_kpi_request.device_id.device_uuid.uuid = 'DEV3' # pylint: disable=maybe-no-member +# _create_kpi_request.service_id.service_uuid.uuid = 'SERV3' # pylint: disable=maybe-no-member +# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC3' # pylint: disable=maybe-no-member +# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END3' # pylint: disable=maybe-no-member +# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON3' # pylint: disable=maybe-no-member +# return _create_kpi_request + +# def create_kpi_request_d(): +# _create_kpi_request = monitoring_pb2.KpiDescriptor() +# _create_kpi_request.kpi_description = 'KPI Description Test' +# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED +# _create_kpi_request.device_id.device_uuid.uuid = 'DEV4' # pylint: disable=maybe-no-member +# _create_kpi_request.service_id.service_uuid.uuid = 'SERV4' # pylint: disable=maybe-no-member +# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC4' # pylint: disable=maybe-no-member +# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END4' # pylint: disable=maybe-no-member +# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON4' # pylint: disable=maybe-no-member +# return _create_kpi_request def monitor_kpi_request(kpi_uuid, monitoring_window_s, sampling_rate_s): _monitor_kpi_request = monitoring_pb2.MonitorKpiRequest() @@ -80,10 +80,10 @@ def include_kpi_request(kpi_id): _include_kpi_request.kpi_value.floatVal = 500*random() # pylint: disable=maybe-no-member return _include_kpi_request -def kpi_descriptor_list(): - _kpi_descriptor_list = monitoring_pb2.KpiDescriptorList() +# def kpi_descriptor_list(): +# _kpi_descriptor_list = monitoring_pb2.KpiDescriptorList() - return _kpi_descriptor_list +# return _kpi_descriptor_list def kpi_query(kpi_id_list): _kpi_query = monitoring_pb2.KpiQuery() -- GitLab From 7386b351cb42c83fd428d35129dbb44a54e5bbaf Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 22 Mar 2024 08:29:55 +0000 Subject: [PATCH 033/602] Blank line from the top is removed. --- src/kpi_manager/tests/test_unitary.py | 267 ++++++++++++++++++++++++++ 1 file changed, 267 insertions(+) create mode 100644 src/kpi_manager/tests/test_unitary.py diff --git a/src/kpi_manager/tests/test_unitary.py b/src/kpi_manager/tests/test_unitary.py new file mode 100644 index 000000000..39d2b2874 --- /dev/null +++ b/src/kpi_manager/tests/test_unitary.py @@ -0,0 +1,267 @@ +# 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 os, pytest +import logging, json + +from apscheduler.schedulers.background import BackgroundScheduler + +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.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.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, KpiDescriptorList + + +from device.service.driver_api.DriverFactory import DriverFactory +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_request, create_kpi_request_b, create_kpi_request_c, create_kpi_request_d +# from monitoring.service.MonitoringService import MonitoringService +from kpi_manager.service.KpiManagerService import KpiManagerService +# from monitoring.client.MonitoringClient import MonitoringClient +from kpi_manager.client.KpiManagerClient import KpiManagerClient + +from monitoring.service.ManagementDBTools import ManagementDB +from monitoring.service.MetricsDBTools import MetricsDB +from monitoring.service.NameMapping import NameMapping + +########################### +# Tests Setup +########################### + +LOCAL_HOST = '127.0.0.1' +MOCKSERVICE_PORT = 10000 + +KPIMANAGER_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # avoid privileged ports +os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) +os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(KPIMANAGER_SERVICE_PORT) + +METRICSDB_HOSTNAME = os.environ.get('METRICSDB_HOSTNAME') + +LOGGER = logging.getLogger(__name__) + +class MockContextService(GenericGrpcService): + # Mock Service implementing Context to simplify unitary tests of Monitoring + + def __init__(self, bind_port: Union[str, int]) -> None: + super().__init__(bind_port, LOCAL_HOST, enable_health_servicer=False, cls_name='MockService') + + # pylint: disable=attribute-defined-outside-init + def install_servicers(self): + self.context_servicer = MockServicerImpl_Context() + add_ContextServiceServicer_to_server(self.context_servicer, self.server) + +@pytest.fixture(scope='session') +def context_service(): + LOGGER.info('Initializing MockContextService...') + _service = MockContextService(MOCKSERVICE_PORT) + _service.start() + + LOGGER.info('Yielding MockContextService...') + yield _service + + LOGGER.info('Terminating MockContextService...') + _service.context_servicer.msg_broker.terminate() + _service.stop() + + LOGGER.info('Terminated MockContextService...') + +@pytest.fixture(scope='session') +def context_client(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument + LOGGER.info('Initializing ContextClient...') + _client = ContextClient() + + LOGGER.info('Yielding ContextClient...') + yield _client + + LOGGER.info('Closing ContextClient...') + _client.close() + + LOGGER.info('Closed ContextClient...') + +@pytest.fixture(scope='session') +def device_service(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument + LOGGER.info('Initializing DeviceService...') + driver_factory = DriverFactory(DRIVERS) + driver_instance_cache = DriverInstanceCache(driver_factory) + _service = DeviceService(driver_instance_cache) + _service.start() + + # yield the server, when test finishes, execution will resume to stop it + LOGGER.info('Yielding DeviceService...') + yield _service + + LOGGER.info('Terminating DeviceService...') + _service.stop() + + LOGGER.info('Terminated DeviceService...') + +@pytest.fixture(scope='session') +def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument + LOGGER.info('Initializing DeviceClient...') + _client = DeviceClient() + + LOGGER.info('Yielding DeviceClient...') + yield _client + + LOGGER.info('Closing DeviceClient...') + _client.close() + + LOGGER.info('Closed DeviceClient...') + +@pytest.fixture(scope='session') +def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument + LOGGER.info('Initializing DeviceClient...') + _client = DeviceClient() + + LOGGER.info('Yielding DeviceClient...') + yield _client + + LOGGER.info('Closing DeviceClient...') + _client.close() + + LOGGER.info('Closed DeviceClient...') + +# This fixture will be requested by test cases and last during testing session +@pytest.fixture(scope='session') +def kpi_manager_service( + context_service : MockContextService, # pylint: disable=redefined-outer-name,unused-argument + device_service : DeviceService # pylint: disable=redefined-outer-name,unused-argument + ): + LOGGER.info('Initializing KpiManagerService...') + name_mapping = NameMapping() + # _service = MonitoringService(name_mapping) + _service = KpiManagerService(name_mapping) + _service.start() + + # yield the server, when test finishes, execution will resume to stop it + LOGGER.info('Yielding KpiManagerService...') + yield _service + + LOGGER.info('Terminating KpiManagerService...') + _service.stop() + + LOGGER.info('Terminated KpiManagerService...') + +# This fixture will be requested by test cases and last during testing session. +# The client requires the server, so client fixture has the server as dependency. +# def monitoring_client(monitoring_service : MonitoringService): (Add for better understanding) +@pytest.fixture(scope='session') +def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disable=redefined-outer-name,unused-argument + LOGGER.info('Initializing KpiManagerClient...') + _client = KpiManagerClient() + + # yield the server, when test finishes, execution will resume to stop it + LOGGER.info('Yielding KpiManagerClient...') + yield _client + + LOGGER.info('Closing KpiManagerClient...') + _client.close() + + LOGGER.info('Closed KpiManagerClient...') + +@pytest.fixture(scope='session') +def management_db(): + _management_db = ManagementDB('monitoring.db') + return _management_db + +@pytest.fixture(scope='session') +def metrics_db(kpi_manager_service : KpiManagerService): # pylint: disable=redefined-outer-name + return monitoring_service.monitoring_servicer.metrics_db + +# This function os not clear to me (Changes should me made before execution) +@pytest.fixture(scope='session') +def metrics_db(monitoring_service : MonitoringService): # pylint: disable=redefined-outer-name + return monitoring_service.monitoring_servicer.metrics_db + #_metrics_db = MetricsDBTools.MetricsDB( + # METRICSDB_HOSTNAME, METRICSDB_ILP_PORT, METRICSDB_REST_PORT, METRICSDB_TABLE_MONITORING_KPIS) + #return _metrics_db + +@pytest.fixture(scope='session') +def subs_scheduler(): + _scheduler = BackgroundScheduler(executors={'processpool': ProcessPoolExecutor(max_workers=20)}) + _scheduler.start() + return _scheduler + +def ingestion_data(kpi_id_int): + # pylint: disable=redefined-outer-name,unused-argument + metrics_db = MetricsDB('localhost', '9009', '9000', 'monitoring') + + kpiSampleType = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED + kpiSampleType_name = KpiSampleType.Name(kpiSampleType).upper().replace('KPISAMPLETYPE_', '') + for _ in range(50): + kpiSampleType = kpiSampleType_name + kpiId = kpi_id_int + deviceId = 'DEV'+ str(kpi_id_int) + endpointId = 'END' + str(kpi_id_int) + serviceId = 'SERV' + str(kpi_id_int) + sliceId = 'SLC' + str(kpi_id_int) + connectionId = 'CON' + str(kpi_id_int) + time_stamp = timestamp_utcnow_to_float() + kpi_value = 500*random() + + metrics_db.write_KPI(time_stamp, kpiId, kpiSampleType, deviceId, endpointId, serviceId, sliceId, connectionId, + kpi_value) + sleep(0.1) + +################################################## +# Prepare Environment, should be the first test +################################################## + +def test_prepare_environment( + context_client : ContextClient, # pylint: disable=redefined-outer-name,unused-argument +): + context_id = json_context_id(DEFAULT_CONTEXT_NAME) + context_client.SetContext(Context(**json_context(DEFAULT_CONTEXT_NAME))) + context_client.SetTopology(Topology(**json_topology(DEFAULT_TOPOLOGY_NAME, context_id=context_id))) + +########################### +# Tests Implementation +########################### + +# Test case that makes use of client fixture to test server's CreateKpi method +def test_set_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name + # make call to server + LOGGER.warning('test_create_kpi requesting') + for i in range(3): + response = kpi_manager_client.SetKpi(create_kpi_request(str(i+1))) + LOGGER.debug(str(response)) + assert isinstance(response, KpiId) + +# Test case that makes use of client fixture to test server's DeleteKpi method +def test_delete_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name + # make call to server + LOGGER.warning('delete_kpi requesting') + response = kpi_manager_client.SetKpi(create_kpi_request('4')) + response = kpi_manager_client.DeleteKpi(response) + LOGGER.debug(str(response)) + assert isinstance(response, Empty) + +# Test case that makes use of client fixture to test server's GetKpiDescriptor method +def test_get_kpi_descriptor_list(kpi_manager_client): # pylint: disable=redefined-outer-name + LOGGER.warning('test_getkpidescritor_kpi begin') + response = kpi_manager_client.GetKpiDescriptorList(Empty()) + LOGGER.debug(str(response)) + assert isinstance(response, KpiDescriptorList) -- GitLab From 124d09dec46e2477c23304605e3628200efc84a7 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 22 Mar 2024 08:30:45 +0000 Subject: [PATCH 034/602] File name changed from "KpiManagerServer" to "KpiManagerService" --- src/kpi_manager/server/KpiManagerServer.py | 117 --------------------- 1 file changed, 117 deletions(-) delete mode 100644 src/kpi_manager/server/KpiManagerServer.py diff --git a/src/kpi_manager/server/KpiManagerServer.py b/src/kpi_manager/server/KpiManagerServer.py deleted file mode 100644 index d42ce14eb..000000000 --- a/src/kpi_manager/server/KpiManagerServer.py +++ /dev/null @@ -1,117 +0,0 @@ -# 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 logging, os, grpc -from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method -from common.proto.context_pb2 import Empty - -from common.Constants import ServiceNameEnum -from common.Settings import get_service_port_grpc -from common.proto.kpi_manager_pb2_grpc import add_KpiManagerServiceServicer_to_server -from common.proto.kpi_manager_pb2_grpc import KpiManagerServiceServicer -from monitoring.service.NameMapping import NameMapping - -from common.proto.kpi_manager_pb2 import kpiDescriptor, KpiId, KpiDescriptorList -from monitoring.service import ManagementDBTools - -from common.tools.service.GenericGrpcService import GenericGrpcService - -LOGGER = logging.getLogger(__name__) - -METRICS_POOL = MetricsPool('Monitoring', 'RPC') - -class KpiManagerServer(KpiManagerServiceServicer): - def __init__(self, cls_name: str = __name__): - LOGGER.info('Init KpiManagerService') - port = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # port updated - GenericGrpcService(port, cls_name = cls_name) # class inheretence was removed - - # Init sqlite monitoring db - self.management_db = ManagementDBTools.ManagementDB('monitoring.db') # why monitoring.db here??? - LOGGER.info('MetricsDB initialized --- KPI Manager Service') - - def install_servicers(self): - # There is no need to create the "MonitoringServiceServicerImpl" instance because actual class - # implementation exists in the same class. - add_KpiManagerServiceServicer_to_server(KpiManagerServer(), self.server) - - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def SetKpi( - self, request: KpiDescriptor, grpc_context: grpc.ServicerContext - ) -> KpiId: - response = KpiId() - kpi_description = request.kpi_description - kpi_sample_type = request.kpi_sample_type - kpi_device_id = request.device_id.device_uuid.uuid - kpi_endpoint_id = request.endpoint_id.endpoint_uuid.uuid - kpi_service_id = request.service_id.service_uuid.uuid - kpi_slice_id = request.slice_id.slice_uuid.uuid - kpi_connection_id = request.connection_id.connection_uuid.uuid - kpi_link_id = request.link_id.link_uuid.uuid - if request.kpi_id.kpi_id.uuid != "": - response.kpi_id.uuid = request.kpi_id.kpi_id.uuid - # Here the code to modify an existing kpi - else: - data = self.management_db.insert_KPI( - kpi_description, kpi_sample_type, kpi_device_id, kpi_endpoint_id, - kpi_service_id, kpi_slice_id, kpi_connection_id, kpi_link_id) - response.kpi_id.uuid = str(data) - return response - - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def DeleteKpi(self, request: KpiId, grpc_context: grpc.ServicerContext) -> Empty: - kpi_id = int(request.kpi_id.uuid) - kpi = self.management_db.get_KPI(kpi_id) - if kpi: - self.management_db.delete_KPI(kpi_id) - else: - LOGGER.info('DeleteKpi error: KpiID({:s}): not found in database'.format(str(kpi_id))) - return Empty() - - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> KpiDescriptor: - kpi_id = request.kpi_id.uuid - kpi_db = self.management_db.get_KPI(int(kpi_id)) - kpiDescriptor = KpiDescriptor() - if kpi_db is None: - LOGGER.info('GetKpiDescriptor error: KpiID({:s}): not found in database'.format(str(kpi_id))) - else: - kpiDescriptor.kpi_description = kpi_db[1] - kpiDescriptor.kpi_sample_type = kpi_db[2] - kpiDescriptor.device_id.device_uuid.uuid = str(kpi_db[3]) - kpiDescriptor.endpoint_id.endpoint_uuid.uuid = str(kpi_db[4]) - kpiDescriptor.service_id.service_uuid.uuid = str(kpi_db[5]) - kpiDescriptor.slice_id.slice_uuid.uuid = str(kpi_db[6]) - kpiDescriptor.connection_id.connection_uuid.uuid = str(kpi_db[7]) - kpiDescriptor.link_id.link_uuid.uuid = str(kpi_db[8]) - return kpiDescriptor - - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def GetKpiDescriptorList(self, request: Empty, grpc_context: grpc.ServicerContext) -> KpiDescriptorList: - kpi_descriptor_list = KpiDescriptorList() - data = self.management_db.get_KPIS() - LOGGER.debug(f"data: {data}") - for item in data: - kpi_descriptor = KpiDescriptor() - kpi_descriptor.kpi_id.kpi_id.uuid = str(item[0]) - kpi_descriptor.kpi_description = item[1] - kpi_descriptor.kpi_sample_type = item[2] - kpi_descriptor.device_id.device_uuid.uuid = str(item[3]) - kpi_descriptor.endpoint_id.endpoint_uuid.uuid = str(item[4]) - kpi_descriptor.service_id.service_uuid.uuid = str(item[5]) - kpi_descriptor.slice_id.slice_uuid.uuid = str(item[6]) - kpi_descriptor.connection_id.connection_uuid.uuid = str(item[7]) - kpi_descriptor.link_id.link_uuid.uuid = str(item[8]) - kpi_descriptor_list.kpi_descriptor_list.append(kpi_descriptor) - return kpi_descriptor_list \ No newline at end of file -- GitLab From 71b8b5362b17711d2a4bc2eeaf0c5c17b7a2b827 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 22 Mar 2024 10:33:29 +0000 Subject: [PATCH 035/602] imports of KpiId-Descriptor-List is changed from monitoring_pb2 to kpi_manger_pb2 --- src/monitoring/client/MonitoringClient.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/monitoring/client/MonitoringClient.py b/src/monitoring/client/MonitoringClient.py index 751ff6e38..493e96ca8 100644 --- a/src/monitoring/client/MonitoringClient.py +++ b/src/monitoring/client/MonitoringClient.py @@ -20,8 +20,9 @@ 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.monitoring_pb2 import Kpi, KpiDescriptor, KpiId, MonitorKpiRequest, \ - KpiDescriptorList, KpiQuery, KpiList, SubsDescriptor, SubscriptionID, SubsList, \ +from common.proto.kpi_manager_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 from common.proto.monitoring_pb2_grpc import MonitoringServiceStub -- GitLab From 3e7573750600b730873138e2a765a0cdabd992a7 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 22 Mar 2024 10:35:10 +0000 Subject: [PATCH 036/602] Spelling correction from "KPIMANGER" to "KPIMANAGER" --- src/common/Constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/Constants.py b/src/common/Constants.py index 4a0f3a226..ee737d2bd 100644 --- a/src/common/Constants.py +++ b/src/common/Constants.py @@ -74,7 +74,7 @@ DEFAULT_SERVICE_GRPC_PORTS = { ServiceNameEnum.ZTP .value : 5050, ServiceNameEnum.POLICY .value : 6060, ServiceNameEnum.MONITORING .value : 7070, - ServiceNameEnum.KPIMANGER .value : 7071, + ServiceNameEnum.KPIMANAGER .value : 7071, ServiceNameEnum.DLT .value : 8080, ServiceNameEnum.NBI .value : 9090, ServiceNameEnum.L3_CAD .value : 10001, -- GitLab From 9f70a96cf4530bc074f98f4e030e6dca5e94fa57 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 22 Mar 2024 10:35:41 +0000 Subject: [PATCH 037/602] files permission changed --- src/kpi_manager/client/KpiManagerClient.py | 0 src/kpi_manager/service/KpiManagerService.py | 0 src/kpi_manager/tests/test_messages.py | 0 3 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 src/kpi_manager/client/KpiManagerClient.py mode change 100644 => 100755 src/kpi_manager/service/KpiManagerService.py mode change 100644 => 100755 src/kpi_manager/tests/test_messages.py diff --git a/src/kpi_manager/client/KpiManagerClient.py b/src/kpi_manager/client/KpiManagerClient.py old mode 100644 new mode 100755 diff --git a/src/kpi_manager/service/KpiManagerService.py b/src/kpi_manager/service/KpiManagerService.py old mode 100644 new mode 100755 diff --git a/src/kpi_manager/tests/test_messages.py b/src/kpi_manager/tests/test_messages.py old mode 100644 new mode 100755 -- GitLab From 95ebbc734aeb400fc7b453878733eb5d7489a963 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 26 Mar 2024 10:01:45 +0000 Subject: [PATCH 038/602] tests file for Kpi Manager is added --- scripts/run_tests_locally_kpi_manager.sh | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100755 scripts/run_tests_locally_kpi_manager.sh diff --git a/scripts/run_tests_locally_kpi_manager.sh b/scripts/run_tests_locally_kpi_manager.sh new file mode 100755 index 000000000..eeeec4bb2 --- /dev/null +++ b/scripts/run_tests_locally_kpi_manager.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# 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. + + +PROJECTDIR=`pwd` + +cd $PROJECTDIR/src +RCFILE=$PROJECTDIR/coverage/.coveragerc +coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \ + kpi_manager/tests/test_unitary.py + +# python3 kpi_manager/tests/test_unitary.py \ No newline at end of file -- GitLab From 50bbeb104476a21c4b981ae37ab75566d48438f4 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 26 Mar 2024 10:05:36 +0000 Subject: [PATCH 039/602] Docker build command for Kpi Manager is added and Docker file paths are updated to correct directories. --- src/build.sh | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/build.sh b/src/build.sh index b1a7d299e..9ae91ef10 100755 --- a/src/build.sh +++ b/src/build.sh @@ -18,16 +18,20 @@ cd $(dirname $0) echo "BUILD context" -context/genproto.sh +# context/genproto.sh # genproto.sh file doesn't exist docker build -t "context:develop" -f context/Dockerfile --quiet . -docker build -t "context:test" -f context/tests/Dockerfile --quiet . +# docker build -t "context:test" -f context/tests/Dockerfile --quiet . # Dockerfile doesn't exist -cd monitoring -./genproto.sh -cd .. +# genproto.sh file doesn't exist +# cd monitoring +# ./genproto.sh +# cd .. echo "BUILD monitoring" docker build -t "monitoring:dockerfile" -f monitoring/Dockerfile . +echo "BUILD kpi manager" +docker build -t "kpi_manager:dockerfile" -f kpi_manager/Dockerfile . + echo "Prune unused images" docker image prune --force -- GitLab From e28b5ce2fcde8a28564a864c5d221d4e3e57ed63 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 26 Mar 2024 10:07:58 +0000 Subject: [PATCH 040/602] Docker name and ports are added according to Kpi Manager Service --- src/start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/start.sh b/src/start.sh index 32a016cc0..c3b5d8375 100755 --- a/src/start.sh +++ b/src/start.sh @@ -15,4 +15,4 @@ docker network create -d bridge teraflowbridge -docker run -d -p 7070:7070 --name monitoring --network=teraflowbridge monitoring:dockerfile +docker run -d -p 7071:7071 --name kpi_manager --network=teraflowbridge kpi_manager:dockerfile -- GitLab From f19ae7505ffeb37b9b4c128ac7440ebe504e8aa7 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 26 Mar 2024 10:09:28 +0000 Subject: [PATCH 041/602] monitoring docker command is added for the reference --- src/start.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/start.sh b/src/start.sh index c3b5d8375..8c3fafe6e 100755 --- a/src/start.sh +++ b/src/start.sh @@ -15,4 +15,5 @@ docker network create -d bridge teraflowbridge -docker run -d -p 7071:7071 --name kpi_manager --network=teraflowbridge kpi_manager:dockerfile +# docker run -d -p 7070:7070 --name monitoring --network=teraflowbridge monitoring:dockerfile +docker run -d -p 7071:7071 --name kpi_manager --network=teraflowbridge kpi_manager:dockerfile \ No newline at end of file -- GitLab From cb1bddd6a5516fcaa1fb035ec276766f8246bf21 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 26 Mar 2024 10:10:00 +0000 Subject: [PATCH 042/602] Kpi Manager Service docker file is created --- src/kpi_manager/Dockerfile | 71 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/kpi_manager/Dockerfile diff --git a/src/kpi_manager/Dockerfile b/src/kpi_manager/Dockerfile new file mode 100644 index 000000000..d3d962b9f --- /dev/null +++ b/src/kpi_manager/Dockerfile @@ -0,0 +1,71 @@ +# 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. + +FROM python:3.9-slim + +# Install dependencies +RUN apt-get --yes --quiet --quiet update && \ + apt-get --yes --quiet --quiet install wget g++ git && \ + rm -rf /var/lib/apt/lists/* + +# Set Python to show logs as they occur +ENV PYTHONUNBUFFERED=0 + +# Download the gRPC health probe +RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \ + chmod +x /bin/grpc_health_probe + +# Get generic Python packages +RUN python3 -m pip install --upgrade pip +RUN python3 -m pip install --upgrade setuptools wheel +RUN python3 -m pip install --upgrade pip-tools + +# Get common Python packages +# Note: this step enables sharing the previous Docker build steps among all the Python components +WORKDIR /var/teraflow +COPY common_requirements.in common_requirements.in +RUN pip-compile --quiet --output-file=common_requirements.txt common_requirements.in +RUN python3 -m pip install -r common_requirements.txt + +# Add common files into working directory +WORKDIR /var/teraflow/common +COPY src/common/. ./ +RUN rm -rf proto + +# Create proto sub-folder, copy .proto files, and generate Python code +RUN mkdir -p /var/teraflow/common/proto +WORKDIR /var/teraflow/common/proto +RUN touch __init__.py +COPY proto/*.proto ./ +RUN python3 -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. *.proto +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 pip-compile --quiet --output-file=requirements.txt requirements.in +RUN python3 -m pip install -r requirements.txt + +# Add component files into working directory +WORKDIR /var/teraflow +COPY src/context/. context/ +COPY src/device/. device/ +COPY src/monitoring/. monitoring/ +COPY src/kpi_manager/. kpi_manager/ + +# Start the service +ENTRYPOINT ["python", "-m", "kpi_manager.service"] -- GitLab From 82cb396dad0a10eda54d73d70155f256b6f1f7e1 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 26 Mar 2024 10:16:43 +0000 Subject: [PATCH 043/602] temporary requirements file is added. --- src/kpi_manager/requirements.in | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/kpi_manager/requirements.in diff --git a/src/kpi_manager/requirements.in b/src/kpi_manager/requirements.in new file mode 100644 index 000000000..a6183b57e --- /dev/null +++ b/src/kpi_manager/requirements.in @@ -0,0 +1,24 @@ +# 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. + +anytree==2.8.0 +APScheduler==3.10.1 +influx-line-protocol==0.1.4 +psycopg2-binary==2.9.3 +python-dateutil==2.8.2 +python-json-logger==2.0.2 +questdb==1.0.1 +requests==2.27.1 +xmltodict==0.12.0 +# grpc_health_probe==0.2.0 #getting error on this library \ No newline at end of file -- GitLab From 2d868d953730ab675d629aadb74d69d297c61d89 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 26 Mar 2024 10:17:13 +0000 Subject: [PATCH 044/602] __init__.py is added is sevice directory --- src/kpi_manager/service/__init__.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/kpi_manager/service/__init__.py diff --git a/src/kpi_manager/service/__init__.py b/src/kpi_manager/service/__init__.py new file mode 100644 index 000000000..1549d9811 --- /dev/null +++ b/src/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. + -- GitLab From d1d7b89af69076bad27762048422a573eab6efe0 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 26 Mar 2024 10:17:48 +0000 Subject: [PATCH 045/602] __main__.py file added in Kpi Manager service directory. --- src/kpi_manager/service/__main__.py | 107 ++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 src/kpi_manager/service/__main__.py diff --git a/src/kpi_manager/service/__main__.py b/src/kpi_manager/service/__main__.py new file mode 100644 index 000000000..9f0e53246 --- /dev/null +++ b/src/kpi_manager/service/__main__.py @@ -0,0 +1,107 @@ +# 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 logging, signal, sys, threading, time +from prometheus_client import start_http_server +from common.Constants import ServiceNameEnum +from common.Settings import ( + ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_log_level, get_metrics_port, + wait_for_environment_variables) +from common.proto import monitoring_pb2 +from monitoring.service.EventTools import EventsDeviceCollector # import updated +from monitoring.service.NameMapping import NameMapping # import updated +# from .MonitoringService import MonitoringService +from .KpiManagerService import KpiManagerService + +terminate = threading.Event() +LOGGER = None + +def signal_handler(signal, frame): # pylint: disable=redefined-outer-name + LOGGER.warning('Terminate signal received') + terminate.set() + +def start_kpi_manager(name_mapping : NameMapping): + LOGGER.info('Start Monitoring...',) + + events_collector = EventsDeviceCollector(name_mapping) + events_collector.start() + + # TODO: redesign this method to be more clear and clean + + # Iterate while terminate is not set + while not terminate.is_set(): + list_new_kpi_ids = events_collector.listen_events() + + # Monitor Kpis + if bool(list_new_kpi_ids): + for kpi_id in list_new_kpi_ids: + # Create Monitor Kpi Requests + monitor_kpi_request = monitoring_pb2.MonitorKpiRequest() + monitor_kpi_request.kpi_id.CopyFrom(kpi_id) + monitor_kpi_request.monitoring_window_s = 86400 + monitor_kpi_request.sampling_rate_s = 10 + events_collector._monitoring_client.MonitorKpi(monitor_kpi_request) + + time.sleep(0.5) # let other tasks run; do not overload CPU + else: + # Terminate is set, looping terminates + LOGGER.warning("Stopping execution...") + + events_collector.start() + +def main(): + global LOGGER # pylint: disable=global-statement + + log_level = get_log_level() + logging.basicConfig(level=log_level) + LOGGER = logging.getLogger(__name__) + + wait_for_environment_variables([ + get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST ), + get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), + get_env_var_name(ServiceNameEnum.DEVICE, ENVVAR_SUFIX_SERVICE_HOST ), + get_env_var_name(ServiceNameEnum.DEVICE, ENVVAR_SUFIX_SERVICE_PORT_GRPC), + ]) + + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + + LOGGER.info('Starting...') + + # Start metrics server + metrics_port = get_metrics_port() + start_http_server(metrics_port) + + name_mapping = NameMapping() + # Starting monitoring service + # grpc_service = MonitoringService(name_mapping) + # grpc_service.start() + # start_monitoring(name_mapping) + + grpc_service = KpiManagerService(name_mapping) + grpc_service.start() + + start_kpi_manager(name_mapping) + + # Wait for Ctrl+C or termination signal + while not terminate.wait(timeout=1.0): pass + + LOGGER.info('Terminating...') + grpc_service.stop() + + LOGGER.info('Bye') + return 0 + +if __name__ == '__main__': + sys.exit(main()) -- GitLab From 343483c835443c26603ca23b152294225fe0fbf3 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 26 Mar 2024 10:19:02 +0000 Subject: [PATCH 046/602] KpiManagerService file re-structred into generic KpiManagerSevice file. --- src/kpi_manager/service/KpiManagerService.py | 106 ++----------------- 1 file changed, 10 insertions(+), 96 deletions(-) diff --git a/src/kpi_manager/service/KpiManagerService.py b/src/kpi_manager/service/KpiManagerService.py index d42ce14eb..dbbcec2cf 100755 --- a/src/kpi_manager/service/KpiManagerService.py +++ b/src/kpi_manager/service/KpiManagerService.py @@ -12,106 +12,20 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, os, grpc -from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method -from common.proto.context_pb2 import Empty - 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_manager_pb2_grpc import KpiManagerServiceServicer -from monitoring.service.NameMapping import NameMapping - -from common.proto.kpi_manager_pb2 import kpiDescriptor, KpiId, KpiDescriptorList -from monitoring.service import ManagementDBTools - from common.tools.service.GenericGrpcService import GenericGrpcService +from kpi_manager.service.KpiManagerServiceServicerImpl import KpiManagerServiceServicerImpl +# from monitoring.service.MonitoringServiceServicerImpl import MonitoringServiceServicerImpl +from monitoring.service.NameMapping import NameMapping -LOGGER = logging.getLogger(__name__) - -METRICS_POOL = MetricsPool('Monitoring', 'RPC') - -class KpiManagerServer(KpiManagerServiceServicer): - def __init__(self, cls_name: str = __name__): - LOGGER.info('Init KpiManagerService') - port = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # port updated - GenericGrpcService(port, cls_name = cls_name) # class inheretence was removed - - # Init sqlite monitoring db - self.management_db = ManagementDBTools.ManagementDB('monitoring.db') # why monitoring.db here??? - LOGGER.info('MetricsDB initialized --- KPI Manager Service') +class KpiManagerService(GenericGrpcService): + def __init__(self, name_mapping : NameMapping, cls_name: str = __name__) -> None: + port = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) + super().__init__(port, cls_name=cls_name) + self.kpiManagerService_servicer = KpiManagerServiceServicerImpl(name_mapping) def install_servicers(self): - # There is no need to create the "MonitoringServiceServicerImpl" instance because actual class - # implementation exists in the same class. - add_KpiManagerServiceServicer_to_server(KpiManagerServer(), self.server) - - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def SetKpi( - self, request: KpiDescriptor, grpc_context: grpc.ServicerContext - ) -> KpiId: - response = KpiId() - kpi_description = request.kpi_description - kpi_sample_type = request.kpi_sample_type - kpi_device_id = request.device_id.device_uuid.uuid - kpi_endpoint_id = request.endpoint_id.endpoint_uuid.uuid - kpi_service_id = request.service_id.service_uuid.uuid - kpi_slice_id = request.slice_id.slice_uuid.uuid - kpi_connection_id = request.connection_id.connection_uuid.uuid - kpi_link_id = request.link_id.link_uuid.uuid - if request.kpi_id.kpi_id.uuid != "": - response.kpi_id.uuid = request.kpi_id.kpi_id.uuid - # Here the code to modify an existing kpi - else: - data = self.management_db.insert_KPI( - kpi_description, kpi_sample_type, kpi_device_id, kpi_endpoint_id, - kpi_service_id, kpi_slice_id, kpi_connection_id, kpi_link_id) - response.kpi_id.uuid = str(data) - return response - - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def DeleteKpi(self, request: KpiId, grpc_context: grpc.ServicerContext) -> Empty: - kpi_id = int(request.kpi_id.uuid) - kpi = self.management_db.get_KPI(kpi_id) - if kpi: - self.management_db.delete_KPI(kpi_id) - else: - LOGGER.info('DeleteKpi error: KpiID({:s}): not found in database'.format(str(kpi_id))) - return Empty() - - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> KpiDescriptor: - kpi_id = request.kpi_id.uuid - kpi_db = self.management_db.get_KPI(int(kpi_id)) - kpiDescriptor = KpiDescriptor() - if kpi_db is None: - LOGGER.info('GetKpiDescriptor error: KpiID({:s}): not found in database'.format(str(kpi_id))) - else: - kpiDescriptor.kpi_description = kpi_db[1] - kpiDescriptor.kpi_sample_type = kpi_db[2] - kpiDescriptor.device_id.device_uuid.uuid = str(kpi_db[3]) - kpiDescriptor.endpoint_id.endpoint_uuid.uuid = str(kpi_db[4]) - kpiDescriptor.service_id.service_uuid.uuid = str(kpi_db[5]) - kpiDescriptor.slice_id.slice_uuid.uuid = str(kpi_db[6]) - kpiDescriptor.connection_id.connection_uuid.uuid = str(kpi_db[7]) - kpiDescriptor.link_id.link_uuid.uuid = str(kpi_db[8]) - return kpiDescriptor - - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def GetKpiDescriptorList(self, request: Empty, grpc_context: grpc.ServicerContext) -> KpiDescriptorList: - kpi_descriptor_list = KpiDescriptorList() - data = self.management_db.get_KPIS() - LOGGER.debug(f"data: {data}") - for item in data: - kpi_descriptor = KpiDescriptor() - kpi_descriptor.kpi_id.kpi_id.uuid = str(item[0]) - kpi_descriptor.kpi_description = item[1] - kpi_descriptor.kpi_sample_type = item[2] - kpi_descriptor.device_id.device_uuid.uuid = str(item[3]) - kpi_descriptor.endpoint_id.endpoint_uuid.uuid = str(item[4]) - kpi_descriptor.service_id.service_uuid.uuid = str(item[5]) - kpi_descriptor.slice_id.slice_uuid.uuid = str(item[6]) - kpi_descriptor.connection_id.connection_uuid.uuid = str(item[7]) - kpi_descriptor.link_id.link_uuid.uuid = str(item[8]) - kpi_descriptor_list.kpi_descriptor_list.append(kpi_descriptor) - return kpi_descriptor_list \ No newline at end of file + add_KpiManagerServiceServicer_to_server(self.kpiManagerService_servicer, self.server) -- GitLab From 6e9b010e3a52f467f88a1c4c3181c44171295664 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 26 Mar 2024 10:19:36 +0000 Subject: [PATCH 047/602] KpiManagerServiceImpl file is created. --- .../service/KpiManagerServiceServicerImpl.py | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 src/kpi_manager/service/KpiManagerServiceServicerImpl.py diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py new file mode 100644 index 000000000..3a40195da --- /dev/null +++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -0,0 +1,104 @@ +# 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 logging, grpc +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, KpiDescriptorList +from monitoring.service.NameMapping import NameMapping +from monitoring.service import ManagementDBTools + + +LOGGER = logging.getLogger(__name__) + +METRICS_POOL = MetricsPool('Monitoring', 'RPC') + +class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): + def __init__(self, name_mapping : NameMapping): + LOGGER.info('Init KpiManagerService') + + # Init sqlite monitoring db + self.management_db = ManagementDBTools.ManagementDB('monitoring.db') # why monitoring.db here??? + LOGGER.info('MetricsDB initialized --- KPI Manager Service') + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def SetKpi( + self, request: KpiDescriptor, grpc_context: grpc.ServicerContext + ) -> KpiId: + response = KpiId() + kpi_description = request.kpi_description + kpi_sample_type = request.kpi_sample_type + kpi_device_id = request.device_id.device_uuid.uuid + kpi_endpoint_id = request.endpoint_id.endpoint_uuid.uuid + kpi_service_id = request.service_id.service_uuid.uuid + kpi_slice_id = request.slice_id.slice_uuid.uuid + kpi_connection_id = request.connection_id.connection_uuid.uuid + kpi_link_id = request.link_id.link_uuid.uuid + if request.kpi_id.kpi_id.uuid != "": + response.kpi_id.uuid = request.kpi_id.kpi_id.uuid + # Here the code to modify an existing kpi + else: + data = self.management_db.insert_KPI( + kpi_description, kpi_sample_type, kpi_device_id, kpi_endpoint_id, + kpi_service_id, kpi_slice_id, kpi_connection_id, kpi_link_id) + response.kpi_id.uuid = str(data) + return response + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def DeleteKpi(self, request: KpiId, grpc_context: grpc.ServicerContext) -> Empty: + kpi_id = int(request.kpi_id.uuid) + kpi = self.management_db.get_KPI(kpi_id) + if kpi: + self.management_db.delete_KPI(kpi_id) + else: + LOGGER.info('DeleteKpi error: KpiID({:s}): not found in database'.format(str(kpi_id))) + return Empty() + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> KpiDescriptor: + kpi_id = request.kpi_id.uuid + kpi_db = self.management_db.get_KPI(int(kpi_id)) + kpiDescriptor = KpiDescriptor() + if kpi_db is None: + LOGGER.info('GetKpiDescriptor error: KpiID({:s}): not found in database'.format(str(kpi_id))) + else: + kpiDescriptor.kpi_description = kpi_db[1] + kpiDescriptor.kpi_sample_type = kpi_db[2] + kpiDescriptor.device_id.device_uuid.uuid = str(kpi_db[3]) + kpiDescriptor.endpoint_id.endpoint_uuid.uuid = str(kpi_db[4]) + kpiDescriptor.service_id.service_uuid.uuid = str(kpi_db[5]) + kpiDescriptor.slice_id.slice_uuid.uuid = str(kpi_db[6]) + kpiDescriptor.connection_id.connection_uuid.uuid = str(kpi_db[7]) + kpiDescriptor.link_id.link_uuid.uuid = str(kpi_db[8]) + return kpiDescriptor + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def GetKpiDescriptorList(self, request: Empty, grpc_context: grpc.ServicerContext) -> KpiDescriptorList: + kpi_descriptor_list = KpiDescriptorList() + data = self.management_db.get_KPIS() + LOGGER.debug(f"data: {data}") + for item in data: + kpi_descriptor = KpiDescriptor() + kpi_descriptor.kpi_id.kpi_id.uuid = str(item[0]) + kpi_descriptor.kpi_description = item[1] + kpi_descriptor.kpi_sample_type = item[2] + kpi_descriptor.device_id.device_uuid.uuid = str(item[3]) + kpi_descriptor.endpoint_id.endpoint_uuid.uuid = str(item[4]) + kpi_descriptor.service_id.service_uuid.uuid = str(item[5]) + kpi_descriptor.slice_id.slice_uuid.uuid = str(item[6]) + kpi_descriptor.connection_id.connection_uuid.uuid = str(item[7]) + kpi_descriptor.link_id.link_uuid.uuid = str(item[8]) + kpi_descriptor_list.kpi_descriptor_list.append(kpi_descriptor) + return kpi_descriptor_list \ No newline at end of file -- GitLab From ab122c221a6b64283f0afd4b21093e48e1fe54c8 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 26 Mar 2024 10:32:21 +0000 Subject: [PATCH 048/602] These imports were added temporily --- src/kpi_manager/tests/test_unitary.py | 3 +++ 1 file changed, 3 insertions(+) mode change 100644 => 100755 src/kpi_manager/tests/test_unitary.py diff --git a/src/kpi_manager/tests/test_unitary.py b/src/kpi_manager/tests/test_unitary.py old mode 100644 new mode 100755 index 39d2b2874..b75ea5751 --- a/src/kpi_manager/tests/test_unitary.py +++ b/src/kpi_manager/tests/test_unitary.py @@ -12,6 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. + +# import sys +# sys.path.append('.') import os, pytest import logging, json -- GitLab From 16666d8b744200e973fa30600342a9053aaada65 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 26 Mar 2024 10:34:08 +0000 Subject: [PATCH 049/602] Imports of Kpi, KpiList and KpiDescriptor is changed to kpi_manager_pb2 file. --- src/monitoring/service/MonitoringServiceServicerImpl.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/monitoring/service/MonitoringServiceServicerImpl.py b/src/monitoring/service/MonitoringServiceServicerImpl.py index 608b0bad9..e98cfa236 100644 --- a/src/monitoring/service/MonitoringServiceServicerImpl.py +++ b/src/monitoring/service/MonitoringServiceServicerImpl.py @@ -20,8 +20,8 @@ from common.proto.context_pb2 import Empty from common.proto.device_pb2 import MonitoringSettings from common.proto.kpi_sample_types_pb2 import KpiSampleType from common.proto.monitoring_pb2_grpc import MonitoringServiceServicer -from common.proto.monitoring_pb2 import AlarmResponse, AlarmDescriptor, AlarmList, SubsList, KpiId, \ - KpiDescriptor, KpiList, KpiQuery, SubsDescriptor, SubscriptionID, AlarmID, KpiDescriptorList, \ +from common.proto.monitoring_pb2 import AlarmResponse, AlarmDescriptor, AlarmList, SubsList, \ + KpiQuery, SubsDescriptor, SubscriptionID, AlarmID, KpiList,\ MonitorKpiRequest, Kpi, AlarmSubscription, SubsResponse, RawKpiTable, RawKpi, RawKpiList from common.tools.timestamp.Converters import timestamp_string_to_float, timestamp_utcnow_to_float from device.client.DeviceClient import DeviceClient @@ -30,6 +30,8 @@ from monitoring.service.AlarmManager import AlarmManager from monitoring.service.NameMapping import NameMapping from monitoring.service.SubscriptionManager import SubscriptionManager +from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorList + LOGGER = logging.getLogger(__name__) METRICSDB_HOSTNAME = os.environ.get("METRICSDB_HOSTNAME") -- GitLab From a3ca5899e477d26085cb239f14e5fe1d01fb8803 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 27 Mar 2024 06:37:57 +0000 Subject: [PATCH 050/602] after temporarily removal of --rcfile file --- scripts/run_tests_locally_kpi_manager.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/scripts/run_tests_locally_kpi_manager.sh b/scripts/run_tests_locally_kpi_manager.sh index eeeec4bb2..8ed855a8e 100755 --- a/scripts/run_tests_locally_kpi_manager.sh +++ b/scripts/run_tests_locally_kpi_manager.sh @@ -17,8 +17,12 @@ PROJECTDIR=`pwd` cd $PROJECTDIR/src -RCFILE=$PROJECTDIR/coverage/.coveragerc -coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \ - kpi_manager/tests/test_unitary.py +# RCFILE=$PROJECTDIR/coverage/.coveragerc +# coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \ +# kpi_manager/tests/test_unitary.py + +# python3 kpi_manager/tests/test_unitary.py -# python3 kpi_manager/tests/test_unitary.py \ No newline at end of file +RCFILE=$PROJECTDIR/coverage/.coveragerc +python3 -m pytest --log-level=INFO --verbose \ + kpi_manager/tests/test_unitary.py \ No newline at end of file -- GitLab From 92ea40f1cd78480b7c457444b6a9861c39e935b7 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 27 Mar 2024 06:38:48 +0000 Subject: [PATCH 051/602] removal of unexpected "," --- src/kpi_manager/client/KpiManagerClient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kpi_manager/client/KpiManagerClient.py b/src/kpi_manager/client/KpiManagerClient.py index 6baca7cef..a129cd327 100755 --- a/src/kpi_manager/client/KpiManagerClient.py +++ b/src/kpi_manager/client/KpiManagerClient.py @@ -19,7 +19,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_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorList from common.proto.kpi_manager_pb2_grpc import KpiManagerServiceStub LOGGER = logging.getLogger(__name__) -- GitLab From 7b88c37fde4204b2bf73ead2b6f0deb0ab4a7e8a Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 27 Mar 2024 06:39:29 +0000 Subject: [PATCH 052/602] __init__.py is added in kpi_manager/client directory --- src/kpi_manager/client/__init__.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/kpi_manager/client/__init__.py diff --git a/src/kpi_manager/client/__init__.py b/src/kpi_manager/client/__init__.py new file mode 100644 index 000000000..1549d9811 --- /dev/null +++ b/src/kpi_manager/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. + -- GitLab From e50c6e937c4832a868dd5851586d175f8d78c638 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 27 Mar 2024 06:40:27 +0000 Subject: [PATCH 053/602] some missing imports were added and some methods are commented temporarily --- src/kpi_manager/tests/test_unitary.py | 92 ++++++++++++++------------- 1 file changed, 49 insertions(+), 43 deletions(-) diff --git a/src/kpi_manager/tests/test_unitary.py b/src/kpi_manager/tests/test_unitary.py index b75ea5751..113b26890 100755 --- a/src/kpi_manager/tests/test_unitary.py +++ b/src/kpi_manager/tests/test_unitary.py @@ -17,6 +17,7 @@ # sys.path.append('.') import os, pytest import logging, json +from typing import Union from apscheduler.schedulers.background import BackgroundScheduler @@ -33,6 +34,8 @@ 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, KpiDescriptorList +from common.tools.service.GenericGrpcService import GenericGrpcService +from context.client.ContextClient import ContextClient from device.service.driver_api.DriverFactory import DriverFactory @@ -50,6 +53,9 @@ from monitoring.service.ManagementDBTools import ManagementDB from monitoring.service.MetricsDBTools import MetricsDB from monitoring.service.NameMapping import NameMapping +os.environ['DEVICE_EMULATED_ONLY'] = 'TRUE' +from device.service.drivers import DRIVERS + ########################### # Tests Setup ########################### @@ -185,49 +191,49 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab LOGGER.info('Closed KpiManagerClient...') -@pytest.fixture(scope='session') -def management_db(): - _management_db = ManagementDB('monitoring.db') - return _management_db - -@pytest.fixture(scope='session') -def metrics_db(kpi_manager_service : KpiManagerService): # pylint: disable=redefined-outer-name - return monitoring_service.monitoring_servicer.metrics_db - -# This function os not clear to me (Changes should me made before execution) -@pytest.fixture(scope='session') -def metrics_db(monitoring_service : MonitoringService): # pylint: disable=redefined-outer-name - return monitoring_service.monitoring_servicer.metrics_db - #_metrics_db = MetricsDBTools.MetricsDB( - # METRICSDB_HOSTNAME, METRICSDB_ILP_PORT, METRICSDB_REST_PORT, METRICSDB_TABLE_MONITORING_KPIS) - #return _metrics_db - -@pytest.fixture(scope='session') -def subs_scheduler(): - _scheduler = BackgroundScheduler(executors={'processpool': ProcessPoolExecutor(max_workers=20)}) - _scheduler.start() - return _scheduler - -def ingestion_data(kpi_id_int): - # pylint: disable=redefined-outer-name,unused-argument - metrics_db = MetricsDB('localhost', '9009', '9000', 'monitoring') - - kpiSampleType = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED - kpiSampleType_name = KpiSampleType.Name(kpiSampleType).upper().replace('KPISAMPLETYPE_', '') - for _ in range(50): - kpiSampleType = kpiSampleType_name - kpiId = kpi_id_int - deviceId = 'DEV'+ str(kpi_id_int) - endpointId = 'END' + str(kpi_id_int) - serviceId = 'SERV' + str(kpi_id_int) - sliceId = 'SLC' + str(kpi_id_int) - connectionId = 'CON' + str(kpi_id_int) - time_stamp = timestamp_utcnow_to_float() - kpi_value = 500*random() - - metrics_db.write_KPI(time_stamp, kpiId, kpiSampleType, deviceId, endpointId, serviceId, sliceId, connectionId, - kpi_value) - sleep(0.1) +# @pytest.fixture(scope='session') +# def management_db(): +# _management_db = ManagementDB('monitoring.db') +# return _management_db + +# @pytest.fixture(scope='session') +# def metrics_db(kpi_manager_service : KpiManagerService): # pylint: disable=redefined-outer-name +# return monitoring_service.monitoring_servicer.metrics_db + +# # This function os not clear to me (Changes should me made before execution) +# @pytest.fixture(scope='session') +# def metrics_db(monitoring_service : MonitoringService): # pylint: disable=redefined-outer-name +# return monitoring_service.monitoring_servicer.metrics_db +# #_metrics_db = MetricsDBTools.MetricsDB( +# # METRICSDB_HOSTNAME, METRICSDB_ILP_PORT, METRICSDB_REST_PORT, METRICSDB_TABLE_MONITORING_KPIS) +# #return _metrics_db + +# @pytest.fixture(scope='session') +# def subs_scheduler(): +# _scheduler = BackgroundScheduler(executors={'processpool': ProcessPoolExecutor(max_workers=20)}) +# _scheduler.start() +# return _scheduler + +# def ingestion_data(kpi_id_int): +# # pylint: disable=redefined-outer-name,unused-argument +# metrics_db = MetricsDB('localhost', '9009', '9000', 'monitoring') + +# kpiSampleType = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED +# kpiSampleType_name = KpiSampleType.Name(kpiSampleType).upper().replace('KPISAMPLETYPE_', '') +# for _ in range(50): +# kpiSampleType = kpiSampleType_name +# kpiId = kpi_id_int +# deviceId = 'DEV'+ str(kpi_id_int) +# endpointId = 'END' + str(kpi_id_int) +# serviceId = 'SERV' + str(kpi_id_int) +# sliceId = 'SLC' + str(kpi_id_int) +# connectionId = 'CON' + str(kpi_id_int) +# time_stamp = timestamp_utcnow_to_float() +# kpi_value = 500*random() + +# metrics_db.write_KPI(time_stamp, kpiId, kpiSampleType, deviceId, endpointId, serviceId, sliceId, connectionId, +# kpi_value) +# sleep(0.1) ################################################## # Prepare Environment, should be the first test -- GitLab From 957f904f8ab4154aff01a7bfb3c7dcdecd53259a Mon Sep 17 00:00:00 2001 From: kpoulakakis Date: Thu, 28 Mar 2024 16:40:56 +0200 Subject: [PATCH 054/602] refactor: Remove test exception. Add the correct exception to failure mechanism. Add kubernetes yml --- .../exception/GeneralExceptionHandler.java | 2 - .../tfs/policy/exception/NewException.java | 12 -- .../policy/policy/AddPolicyServiceImpl.java | 5 +- src/policy/target/kubernetes/kubernetes.yml | 133 ++++++++++++++++++ 4 files changed, 135 insertions(+), 17 deletions(-) delete mode 100644 src/policy/src/main/java/org/etsi/tfs/policy/exception/NewException.java create mode 100644 src/policy/target/kubernetes/kubernetes.yml diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/exception/GeneralExceptionHandler.java b/src/policy/src/main/java/org/etsi/tfs/policy/exception/GeneralExceptionHandler.java index 9c92ef758..b1c89db56 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/exception/GeneralExceptionHandler.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/exception/GeneralExceptionHandler.java @@ -20,8 +20,6 @@ public class GeneralExceptionHandler implements ExceptionHandlerProvider { public Throwable transform(Throwable t) { if (t instanceof ExternalServiceFailureException) { return new StatusRuntimeException(Status.INTERNAL.withDescription(t.getMessage())); - } else if (t instanceof NewException) { - return new StatusRuntimeException(Status.UNIMPLEMENTED.withDescription(t.getMessage())); } else { return ExceptionHandlerProvider.toStatusException(t, true); } diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/exception/NewException.java b/src/policy/src/main/java/org/etsi/tfs/policy/exception/NewException.java deleted file mode 100644 index 96010e9c4..000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/exception/NewException.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.etsi.tfs.policy.exception; - -public class NewException extends RuntimeException { - - public NewException(String message, Exception e) { - super(message, e); - } - - public NewException(String message) { - super(message); - } -} diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java index 978484130..1247f9c0f 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java @@ -9,7 +9,7 @@ import jakarta.inject.Inject; import java.util.List; import org.etsi.tfs.policy.context.ContextService; import org.etsi.tfs.policy.context.model.ServiceId; -import org.etsi.tfs.policy.exception.NewException; +import org.etsi.tfs.policy.exception.ExternalServiceFailureException; import org.etsi.tfs.policy.monitoring.model.AlarmDescriptor; import org.etsi.tfs.policy.policy.model.PolicyRule; import org.etsi.tfs.policy.policy.model.PolicyRuleBasic; @@ -21,7 +21,6 @@ import org.jboss.logging.Logger; @ApplicationScoped public class AddPolicyServiceImpl { - private static final Logger LOGGER = Logger.getLogger(AddPolicyServiceImpl.class); @Inject private CommonPolicyServiceImpl commonPolicyService; @Inject private CommonAlarmService commonAlarmService; @@ -65,7 +64,7 @@ public class AddPolicyServiceImpl { return contextService .setPolicyRule(policyRule) .onFailure() - .transform(failure -> new NewException(failure.getMessage())) + .transform(failure -> new ExternalServiceFailureException(failure.getMessage())) .onItem() .transform( policyId -> { diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml new file mode 100644 index 000000000..e30bc89af --- /dev/null +++ b/src/policy/target/kubernetes/kubernetes.yml @@ -0,0 +1,133 @@ +--- +apiVersion: v1 +kind: Service +metadata: + annotations: + app.quarkus.io/commit-id: 5d9967880633c624761e6089a8592ec74959d299 + app.quarkus.io/build-timestamp: 2024-03-28 - 14:39:32 +0000 + prometheus.io/scrape: "true" + prometheus.io/path: /q/metrics + prometheus.io/port: "8080" + prometheus.io/scheme: http + labels: + app.kubernetes.io/name: policyservice + app.kubernetes.io/version: 0.1.0 + app: policyservice + app.kubernetes.io/managed-by: quarkus + name: policyservice +spec: + ports: + - name: https + port: 443 + protocol: TCP + targetPort: 8443 + - name: http + port: 9192 + protocol: TCP + targetPort: 8080 + - name: grpc + port: 6060 + protocol: TCP + targetPort: 6060 + selector: + app.kubernetes.io/name: policyservice + type: ClusterIP +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + app.quarkus.io/commit-id: 5d9967880633c624761e6089a8592ec74959d299 + app.quarkus.io/build-timestamp: 2024-03-28 - 14:39:32 +0000 + prometheus.io/scrape: "true" + prometheus.io/path: /q/metrics + prometheus.io/port: "8080" + prometheus.io/scheme: http + labels: + app: policyservice + app.kubernetes.io/managed-by: quarkus + app.kubernetes.io/name: policyservice + app.kubernetes.io/version: 0.1.0 + name: policyservice +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: policyservice + template: + metadata: + annotations: + app.quarkus.io/commit-id: 5d9967880633c624761e6089a8592ec74959d299 + app.quarkus.io/build-timestamp: 2024-03-28 - 14:39:32 +0000 + prometheus.io/scrape: "true" + prometheus.io/path: /q/metrics + prometheus.io/port: "8080" + prometheus.io/scheme: http + labels: + app: policyservice + app.kubernetes.io/managed-by: quarkus + app.kubernetes.io/name: policyservice + app.kubernetes.io/version: 0.1.0 + spec: + containers: + - env: + - name: KUBERNETES_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: CONTEXT_SERVICE_HOST + value: contextservice + - name: MONITORING_SERVICE_HOST + value: monitoringservice + - name: SERVICE_SERVICE_HOST + value: serviceservice + image: labs.etsi.org:5050/tfs/controller/policy:0.1.0 + imagePullPolicy: Always + livenessProbe: + failureThreshold: 3 + httpGet: + path: /q/health/live + port: 8080 + scheme: HTTP + initialDelaySeconds: 2 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 10 + name: policyservice + ports: + - containerPort: 8443 + name: https + protocol: TCP + - containerPort: 8080 + name: http + protocol: TCP + - containerPort: 6060 + name: grpc + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /q/health/ready + port: 8080 + scheme: HTTP + initialDelaySeconds: 2 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 10 + resources: + limits: + cpu: 500m + memory: 2048Mi + requests: + cpu: 50m + memory: 512Mi + startupProbe: + failureThreshold: 3 + httpGet: + path: /q/health/started + port: 8080 + scheme: HTTP + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 10 -- GitLab From fd131107a144bd11de19737ff580b5c174eacff1 Mon Sep 17 00:00:00 2001 From: kpoulakakis Date: Fri, 29 Mar 2024 13:59:07 +0200 Subject: [PATCH 055/602] refactor: spotless apply --- .../policy/policy/AddPolicyServiceImpl.java | 1 - src/policy/target/kubernetes/kubernetes.yml | 26 +++++++++---------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java index 1247f9c0f..0ee7ba3ee 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java @@ -17,7 +17,6 @@ import org.etsi.tfs.policy.policy.model.PolicyRuleService; import org.etsi.tfs.policy.policy.model.PolicyRuleState; import org.etsi.tfs.policy.policy.model.PolicyRuleStateEnum; import org.etsi.tfs.policy.policy.model.PolicyRuleTypeService; -import org.jboss.logging.Logger; @ApplicationScoped public class AddPolicyServiceImpl { diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml index e30bc89af..a07d73c02 100644 --- a/src/policy/target/kubernetes/kubernetes.yml +++ b/src/policy/target/kubernetes/kubernetes.yml @@ -3,8 +3,8 @@ apiVersion: v1 kind: Service metadata: annotations: - app.quarkus.io/commit-id: 5d9967880633c624761e6089a8592ec74959d299 - app.quarkus.io/build-timestamp: 2024-03-28 - 14:39:32 +0000 + app.quarkus.io/commit-id: 957f904f8ab4154aff01a7bfb3c7dcdecd53259a + app.quarkus.io/build-timestamp: 2024-03-29 - 11:30:06 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -21,14 +21,14 @@ spec: port: 443 protocol: TCP targetPort: 8443 - - name: http - port: 9192 - protocol: TCP - targetPort: 8080 - name: grpc port: 6060 protocol: TCP targetPort: 6060 + - name: http + port: 9192 + protocol: TCP + targetPort: 8080 selector: app.kubernetes.io/name: policyservice type: ClusterIP @@ -37,8 +37,8 @@ apiVersion: apps/v1 kind: Deployment metadata: annotations: - app.quarkus.io/commit-id: 5d9967880633c624761e6089a8592ec74959d299 - app.quarkus.io/build-timestamp: 2024-03-28 - 14:39:32 +0000 + app.quarkus.io/commit-id: 957f904f8ab4154aff01a7bfb3c7dcdecd53259a + app.quarkus.io/build-timestamp: 2024-03-29 - 11:30:06 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -57,8 +57,8 @@ spec: template: metadata: annotations: - app.quarkus.io/commit-id: 5d9967880633c624761e6089a8592ec74959d299 - app.quarkus.io/build-timestamp: 2024-03-28 - 14:39:32 +0000 + app.quarkus.io/commit-id: 957f904f8ab4154aff01a7bfb3c7dcdecd53259a + app.quarkus.io/build-timestamp: 2024-03-29 - 11:30:06 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -98,12 +98,12 @@ spec: - containerPort: 8443 name: https protocol: TCP - - containerPort: 8080 - name: http - protocol: TCP - containerPort: 6060 name: grpc protocol: TCP + - containerPort: 8080 + name: http + protocol: TCP readinessProbe: failureThreshold: 3 httpGet: -- GitLab From 872beaea149552efa0ee9a8a38c5a2cc2d8e586f Mon Sep 17 00:00:00 2001 From: kpoulakakis Date: Wed, 3 Apr 2024 14:34:06 +0300 Subject: [PATCH 056/602] refactor: change the Add , Delete , Update ztp services . Add exception handling for external services and remove unnecessary device==null exception handling. Create an internal exception handling mechanism for all the uni failures. --- .../java/org/etsi/tfs/ztp/ZtpServiceImpl.java | 168 ++++++++---------- .../ExternalServiceFailureException.java | 28 +++ .../exception/GeneralExceptionHandler.java | 57 ++++++ src/ztp/src/main/resources/application.yml | 5 + 4 files changed, 162 insertions(+), 96 deletions(-) create mode 100644 src/ztp/src/main/java/org/etsi/tfs/ztp/exception/ExternalServiceFailureException.java create mode 100644 src/ztp/src/main/java/org/etsi/tfs/ztp/exception/GeneralExceptionHandler.java diff --git a/src/ztp/src/main/java/org/etsi/tfs/ztp/ZtpServiceImpl.java b/src/ztp/src/main/java/org/etsi/tfs/ztp/ZtpServiceImpl.java index 0f0f502d5..953d84aa3 100644 --- a/src/ztp/src/main/java/org/etsi/tfs/ztp/ZtpServiceImpl.java +++ b/src/ztp/src/main/java/org/etsi/tfs/ztp/ZtpServiceImpl.java @@ -23,12 +23,12 @@ import org.etsi.tfs.ztp.context.ContextService; import org.etsi.tfs.ztp.context.model.Device; import org.etsi.tfs.ztp.context.model.DeviceConfig; import org.etsi.tfs.ztp.device.DeviceService; +import org.etsi.tfs.ztp.exception.ExternalServiceFailureException; import org.jboss.logging.Logger; @ApplicationScoped public class ZtpServiceImpl implements ZtpService { private static final Logger LOGGER = Logger.getLogger(ZtpServiceImpl.class); - // private static final String MESSAGE = "Retrieved %s"; private final DeviceService deviceService; private final ContextService contextService; @@ -41,128 +41,104 @@ public class ZtpServiceImpl implements ZtpService { @Override public Uni addDevice(String deviceId) { - final var deserializedDeviceUni = contextService.getDevice(deviceId); - - deserializedDeviceUni + return contextService + .getDevice(deviceId) .onFailure() - .recoverWithNull() - .subscribe() - .with( + .transform(failure -> new ExternalServiceFailureException(failure.getMessage())) + .onItem() + .transformToUni( device -> { - final var id = deviceId; - - if (device == null) { - LOGGER.warnf("%s is null. Ignoring...", device); - return; - } - if (device.isEnabled()) { LOGGER.warnf("%s has already been enabled. Ignoring...", device); - return; + return Uni.createFrom().failure(new Exception("Device is already enabled")); + } else { + return addDeviceTo(device, deviceId); } + }); + } - // LOGGER.infof(MESSAGE, device); - - final var initialConfiguration = - deviceService.getInitialConfiguration(device.getDeviceId()); - - device.enableDevice(); - LOGGER.infof("Enabled device [%s]", id); + public Uni addDeviceTo(Device device, String deviceId) { + LOGGER.infof("Enabling device with ID [%s]", deviceId); + device.enableDevice(); - initialConfiguration - .subscribe() - .with( - deviceConfig -> { - device.setDeviceConfiguration(deviceConfig); - final var configuredDeviceIdUni = deviceService.configureDevice(device); + final Uni initialConfiguration = deviceService.getInitialConfiguration(deviceId); - configuredDeviceIdUni - .subscribe() - .with( - configuredDeviceId -> - LOGGER.infof( - "Device [%s] has been successfully enabled and configured with %s.\n", - id, deviceConfig)); + return initialConfiguration + .onItem() + .transformToUni( + deviceConfig -> { + device.setDeviceConfiguration(deviceConfig); + LOGGER.infof( + "Configuring device with ID [%s] with initial configuration %s", + deviceId, deviceConfig); + return deviceService + .configureDevice(device) + .map( + configuredDeviceId -> { + LOGGER.infof( + "Device with ID [%s] has been successfully enabled and configured.", + deviceId); + return device; }); }); - - return deserializedDeviceUni; } @Override public Uni deleteDevice(String deviceId) { - final var deserializedDeviceUni = contextService.getDevice(deviceId); - - deserializedDeviceUni + return contextService + .getDevice(deviceId) .onFailure() - .recoverWithNull() - .subscribe() - .with( + .transform(failure -> new ExternalServiceFailureException(failure.getMessage())) + .onItem() + .transformToUni( device -> { - final var id = deviceId; - - if (device == null) { - LOGGER.warnf("%s is null. Ignoring...", device); - return; - } - if (device.isDisabled()) { - LOGGER.warnf("%s has already been disabled. Ignoring...", device); - return; + LOGGER.warnf("Device with ID %s has already been disabled. Ignoring...", deviceId); + return Uni.createFrom().nullItem(); + } else { + LOGGER.infof("Disabling device with ID [%s]", deviceId); + device.disableDevice(); + + return deviceService + .deleteDevice(deviceId) + .onItem() + .transform( + emptyMessage -> { + LOGGER.infof( + "Device with ID [%s] has been successfully deleted.", deviceId); + return device; + }); } - - device.disableDevice(); - LOGGER.infof("Disabled device [%s]", id); - - // LOGGER.infof(MESSAGE, device); - - final var empty = deviceService.deleteDevice(device.getDeviceId()); - - empty - .subscribe() - .with( - emptyMessage -> - LOGGER.infof("Device [%s] has been successfully deleted.\n", id)); }); - - return deserializedDeviceUni; } @Override public Uni updateDevice(String deviceId, DeviceConfig deviceConfig) { - final var deserializedDeviceUni = contextService.getDevice(deviceId); - - deserializedDeviceUni + return contextService + .getDevice(deviceId) .onFailure() - .recoverWithNull() - .subscribe() - .with( + .transform(failure -> new ExternalServiceFailureException(failure.getMessage())) + .onItem() + .transformToUni( device -> { - final var id = deviceId; - - if (device == null) { - LOGGER.warnf("%s is null. Ignoring...", device); - return; - } - if (!device.isEnabled()) { - LOGGER.warnf("Cannot update disabled device %s. Ignoring...", device); - return; - } - - // LOGGER.infof(MESSAGE, device); - device.setDeviceConfiguration(deviceConfig); - final var updatedDeviceIdUni = deviceService.configureDevice(device); - - updatedDeviceIdUni - .subscribe() - .with( - configuredDeviceId -> + LOGGER.warnf("Cannot update disabled device %s. Ignoring...", deviceId); + return Uni.createFrom().nullItem(); + } else { + LOGGER.infof("Updating configuration of device with ID [%s]", deviceId); + device.setDeviceConfiguration(deviceConfig); + + return deviceService + .configureDevice(device) + .onItem() + .transform( + configuredDeviceId -> { LOGGER.infof( - "Device [%s] has been successfully updated with %s.\n", - id, deviceConfig)); + "Device with ID [%s] has been successfully updated with %s.", + deviceId, deviceConfig); + return device; + }); + } }); - - return deserializedDeviceUni; } } diff --git a/src/ztp/src/main/java/org/etsi/tfs/ztp/exception/ExternalServiceFailureException.java b/src/ztp/src/main/java/org/etsi/tfs/ztp/exception/ExternalServiceFailureException.java new file mode 100644 index 000000000..fe25f18c3 --- /dev/null +++ b/src/ztp/src/main/java/org/etsi/tfs/ztp/exception/ExternalServiceFailureException.java @@ -0,0 +1,28 @@ +/* +* 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. +*/ + +package org.etsi.tfs.ztp.exception; + +public class ExternalServiceFailureException extends RuntimeException { + + public ExternalServiceFailureException(String message, Exception e) { + super(message, e); + } + + public ExternalServiceFailureException(String message) { + super(message); + } +} diff --git a/src/ztp/src/main/java/org/etsi/tfs/ztp/exception/GeneralExceptionHandler.java b/src/ztp/src/main/java/org/etsi/tfs/ztp/exception/GeneralExceptionHandler.java new file mode 100644 index 000000000..45886e975 --- /dev/null +++ b/src/ztp/src/main/java/org/etsi/tfs/ztp/exception/GeneralExceptionHandler.java @@ -0,0 +1,57 @@ +/* +* 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. +*/ + +package org.etsi.tfs.ztp.exception; + +import io.grpc.Metadata; +import io.grpc.ServerCall; +import io.grpc.Status; +import io.grpc.StatusRuntimeException; +import io.quarkus.grpc.ExceptionHandlerProvider; +import jakarta.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class GeneralExceptionHandler implements ExceptionHandlerProvider { + @Override + public io.quarkus.grpc.ExceptionHandler createHandler( + ServerCall.Listener listener, ServerCall serverCall, Metadata metadata) { + return new HelloExceptionHandler<>(listener, serverCall, metadata); + } + + @Override + public Throwable transform(Throwable t) { + if (t instanceof ExternalServiceFailureException) { + return new StatusRuntimeException(Status.INTERNAL.withDescription(t.getMessage())); + } else { + return ExceptionHandlerProvider.toStatusException(t, true); + } + } + + private static class HelloExceptionHandler extends io.quarkus.grpc.ExceptionHandler { + public HelloExceptionHandler( + ServerCall.Listener listener, ServerCall call, Metadata metadata) { + super(listener, call, metadata); + } + + @Override + protected void handleException(Throwable t, ServerCall call, Metadata metadata) { + StatusRuntimeException sre = + (StatusRuntimeException) ExceptionHandlerProvider.toStatusException(t, true); + Metadata trailers = sre.getTrailers() != null ? sre.getTrailers() : metadata; + call.close(sre.getStatus(), trailers); + } + } +} diff --git a/src/ztp/src/main/resources/application.yml b/src/ztp/src/main/resources/application.yml index c551759ef..91f40d0c2 100644 --- a/src/ztp/src/main/resources/application.yml +++ b/src/ztp/src/main/resources/application.yml @@ -15,6 +15,11 @@ ztp: should-subscribe-to-context-component: true quarkus: + package: + type: mutable-jar + live-reload: + password: 1234 + url: http://0.0.0.0:8080 banner: path: teraflow-ztp-banner.txt grpc: -- GitLab From 7fce72764fa6bb9b37b407bbcba502cc0a23735f Mon Sep 17 00:00:00 2001 From: kpoulakakis Date: Thu, 4 Apr 2024 12:34:39 +0300 Subject: [PATCH 057/602] refactor: update some proto grpc classes. --- .../grpc/context/ContextOuterClass.java | 7290 ++++++++++++++++- .../grpc/context/ContextService.java | 17 + .../grpc/context/ContextServiceBean.java | 54 + .../grpc/context/ContextServiceClient.java | 30 + .../grpc/context/ContextServiceGrpc.java | 280 +- .../context/MutinyContextServiceGrpc.java | 90 +- src/ztp/target/kubernetes/kubernetes.yml | 40 +- 7 files changed, 7677 insertions(+), 124 deletions(-) diff --git a/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java b/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java index 22679d792..9bcff8a50 100644 --- a/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java +++ b/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java @@ -191,6 +191,10 @@ public final class ContextOuterClass { * DEVICEDRIVER_IETF_ACTN = 10; */ DEVICEDRIVER_IETF_ACTN(10), + /** + * DEVICEDRIVER_OC = 11; + */ + DEVICEDRIVER_OC(11), UNRECOGNIZED(-1); /** @@ -252,6 +256,11 @@ public final class ContextOuterClass { */ public static final int DEVICEDRIVER_IETF_ACTN_VALUE = 10; + /** + * DEVICEDRIVER_OC = 11; + */ + public static final int DEVICEDRIVER_OC_VALUE = 11; + public final int getNumber() { if (this == UNRECOGNIZED) { throw new java.lang.IllegalArgumentException("Can't get the number of an unknown enum value."); @@ -297,6 +306,8 @@ public final class ContextOuterClass { return DEVICEDRIVER_FLEXSCALE; case 10: return DEVICEDRIVER_IETF_ACTN; + case 11: + return DEVICEDRIVER_OC; default: return null; } @@ -489,6 +500,10 @@ public final class ContextOuterClass { * SERVICETYPE_E2E = 5; */ SERVICETYPE_E2E(5), + /** + * SERVICETYPE_OPTICAL_CONNECTIVITY = 6; + */ + SERVICETYPE_OPTICAL_CONNECTIVITY(6), UNRECOGNIZED(-1); /** @@ -521,6 +536,11 @@ public final class ContextOuterClass { */ public static final int SERVICETYPE_E2E_VALUE = 5; + /** + * SERVICETYPE_OPTICAL_CONNECTIVITY = 6; + */ + public static final int SERVICETYPE_OPTICAL_CONNECTIVITY_VALUE = 6; + public final int getNumber() { if (this == UNRECOGNIZED) { throw new java.lang.IllegalArgumentException("Can't get the number of an unknown enum value."); @@ -556,6 +576,8 @@ public final class ContextOuterClass { return SERVICETYPE_TE; case 5: return SERVICETYPE_E2E; + case 6: + return SERVICETYPE_OPTICAL_CONNECTIVITY; default: return null; } @@ -69295,199 +69317,7217 @@ public final class ContextOuterClass { } } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Empty_descriptor; - - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Empty_fieldAccessorTable; - - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Uuid_descriptor; - - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Uuid_fieldAccessorTable; + public interface OpticalConfigIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfigId) + com.google.protobuf.MessageOrBuilder { - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Timestamp_descriptor; + /** + * string opticalconfig_uuid = 1; + * @return The opticalconfigUuid. + */ + java.lang.String getOpticalconfigUuid(); - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Timestamp_fieldAccessorTable; + /** + * string opticalconfig_uuid = 1; + * @return The bytes for opticalconfigUuid. + */ + com.google.protobuf.ByteString getOpticalconfigUuidBytes(); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Event_descriptor; + /** + *
+     * ---------------- Experimental ------------------------
+     * 
+ * + * Protobuf type {@code context.OpticalConfigId} + */ + public static final class OpticalConfigId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfigId) + OpticalConfigIdOrBuilder { - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Event_fieldAccessorTable; + private static final long serialVersionUID = 0L; - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ContextId_descriptor; + // Use OpticalConfigId.newBuilder() to construct. + private OpticalConfigId(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ContextId_fieldAccessorTable; + private OpticalConfigId() { + opticalconfigUuid_ = ""; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Context_descriptor; + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new OpticalConfigId(); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Context_fieldAccessorTable; + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalConfigId_descriptor; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ContextIdList_descriptor; + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalConfigId_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalConfigId.class, context.ContextOuterClass.OpticalConfigId.Builder.class); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ContextIdList_fieldAccessorTable; + public static final int OPTICALCONFIG_UUID_FIELD_NUMBER = 1; - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ContextList_descriptor; + @SuppressWarnings("serial") + private volatile java.lang.Object opticalconfigUuid_ = ""; - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ContextList_fieldAccessorTable; + /** + * string opticalconfig_uuid = 1; + * @return The opticalconfigUuid. + */ + @java.lang.Override + public java.lang.String getOpticalconfigUuid() { + java.lang.Object ref = opticalconfigUuid_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + opticalconfigUuid_ = s; + return s; + } + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ContextEvent_descriptor; + /** + * string opticalconfig_uuid = 1; + * @return The bytes for opticalconfigUuid. + */ + @java.lang.Override + public com.google.protobuf.ByteString getOpticalconfigUuidBytes() { + java.lang.Object ref = opticalconfigUuid_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + opticalconfigUuid_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ContextEvent_fieldAccessorTable; + private byte memoizedIsInitialized = -1; - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyId_descriptor; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + memoizedIsInitialized = 1; + return true; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyId_fieldAccessorTable; + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(opticalconfigUuid_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, opticalconfigUuid_); + } + getUnknownFields().writeTo(output); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Topology_descriptor; + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(opticalconfigUuid_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, opticalconfigUuid_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Topology_fieldAccessorTable; + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof context.ContextOuterClass.OpticalConfigId)) { + return super.equals(obj); + } + context.ContextOuterClass.OpticalConfigId other = (context.ContextOuterClass.OpticalConfigId) obj; + if (!getOpticalconfigUuid().equals(other.getOpticalconfigUuid())) + return false; + if (!getUnknownFields().equals(other.getUnknownFields())) + return false; + return true; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyDetails_descriptor; + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + OPTICALCONFIG_UUID_FIELD_NUMBER; + hash = (53 * hash) + getOpticalconfigUuid().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyDetails_fieldAccessorTable; + public static context.ContextOuterClass.OpticalConfigId parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyIdList_descriptor; + public static context.ContextOuterClass.OpticalConfigId parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyIdList_fieldAccessorTable; + public static context.ContextOuterClass.OpticalConfigId parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyList_descriptor; + public static context.ContextOuterClass.OpticalConfigId parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyList_fieldAccessorTable; + public static context.ContextOuterClass.OpticalConfigId parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyEvent_descriptor; + public static context.ContextOuterClass.OpticalConfigId parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyEvent_fieldAccessorTable; + public static context.ContextOuterClass.OpticalConfigId parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceId_descriptor; + public static context.ContextOuterClass.OpticalConfigId parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceId_fieldAccessorTable; + public static context.ContextOuterClass.OpticalConfigId parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Device_descriptor; + public static context.ContextOuterClass.OpticalConfigId parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Device_fieldAccessorTable; + public static context.ContextOuterClass.OpticalConfigId parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Component_descriptor; + public static context.ContextOuterClass.OpticalConfigId parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Component_fieldAccessorTable; + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Component_AttributesEntry_descriptor; + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Component_AttributesEntry_fieldAccessorTable; + public static Builder newBuilder(context.ContextOuterClass.OpticalConfigId prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceConfig_descriptor; + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceConfig_fieldAccessorTable; + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceIdList_descriptor; + /** + *
+         * ---------------- Experimental ------------------------
+         * 
+ * + * Protobuf type {@code context.OpticalConfigId} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalConfigId) + context.ContextOuterClass.OpticalConfigIdOrBuilder { - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceIdList_fieldAccessorTable; + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalConfigId_descriptor; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceList_descriptor; + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalConfigId_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalConfigId.class, context.ContextOuterClass.OpticalConfigId.Builder.class); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceList_fieldAccessorTable; + // Construct using context.ContextOuterClass.OpticalConfigId.newBuilder() + private Builder() { + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceFilter_descriptor; + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceFilter_fieldAccessorTable; + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + opticalconfigUuid_ = ""; + return this; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceEvent_descriptor; + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return context.ContextOuterClass.internal_static_context_OpticalConfigId_descriptor; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceEvent_fieldAccessorTable; + @java.lang.Override + public context.ContextOuterClass.OpticalConfigId getDefaultInstanceForType() { + return context.ContextOuterClass.OpticalConfigId.getDefaultInstance(); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkId_descriptor; + @java.lang.Override + public context.ContextOuterClass.OpticalConfigId build() { + context.ContextOuterClass.OpticalConfigId result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkId_fieldAccessorTable; + @java.lang.Override + public context.ContextOuterClass.OpticalConfigId buildPartial() { + context.ContextOuterClass.OpticalConfigId result = new context.ContextOuterClass.OpticalConfigId(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkAttributes_descriptor; + private void buildPartial0(context.ContextOuterClass.OpticalConfigId result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.opticalconfigUuid_ = opticalconfigUuid_; + } + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkAttributes_fieldAccessorTable; + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof context.ContextOuterClass.OpticalConfigId) { + return mergeFrom((context.ContextOuterClass.OpticalConfigId) other); + } else { + super.mergeFrom(other); + return this; + } + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Link_descriptor; + public Builder mergeFrom(context.ContextOuterClass.OpticalConfigId other) { + if (other == context.ContextOuterClass.OpticalConfigId.getDefaultInstance()) + return this; + if (!other.getOpticalconfigUuid().isEmpty()) { + opticalconfigUuid_ = other.opticalconfigUuid_; + bitField0_ |= 0x00000001; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Link_fieldAccessorTable; + @java.lang.Override + public final boolean isInitialized() { + return true; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkIdList_descriptor; + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + opticalconfigUuid_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } + // case 10 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkIdList_fieldAccessorTable; + private int bitField0_; - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkList_descriptor; + private java.lang.Object opticalconfigUuid_ = ""; - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkList_fieldAccessorTable; + /** + * string opticalconfig_uuid = 1; + * @return The opticalconfigUuid. + */ + public java.lang.String getOpticalconfigUuid() { + java.lang.Object ref = opticalconfigUuid_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + opticalconfigUuid_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkEvent_descriptor; + /** + * string opticalconfig_uuid = 1; + * @return The bytes for opticalconfigUuid. + */ + public com.google.protobuf.ByteString getOpticalconfigUuidBytes() { + java.lang.Object ref = opticalconfigUuid_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + opticalconfigUuid_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkEvent_fieldAccessorTable; + /** + * string opticalconfig_uuid = 1; + * @param value The opticalconfigUuid to set. + * @return This builder for chaining. + */ + public Builder setOpticalconfigUuid(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + opticalconfigUuid_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceId_descriptor; + /** + * string opticalconfig_uuid = 1; + * @return This builder for chaining. + */ + public Builder clearOpticalconfigUuid() { + opticalconfigUuid_ = getDefaultInstance().getOpticalconfigUuid(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceId_fieldAccessorTable; + /** + * string opticalconfig_uuid = 1; + * @param value The bytes for opticalconfigUuid to set. + * @return This builder for chaining. + */ + public Builder setOpticalconfigUuidBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + opticalconfigUuid_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Service_descriptor; + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Service_fieldAccessorTable; + @java.lang.Override + public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + // @@protoc_insertion_point(builder_scope:context.OpticalConfigId) + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceStatus_descriptor; + // @@protoc_insertion_point(class_scope:context.OpticalConfigId) + private static final context.ContextOuterClass.OpticalConfigId DEFAULT_INSTANCE; - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceStatus_fieldAccessorTable; + static { + DEFAULT_INSTANCE = new context.ContextOuterClass.OpticalConfigId(); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceConfig_descriptor; + public static context.ContextOuterClass.OpticalConfigId getDefaultInstance() { + return DEFAULT_INSTANCE; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceConfig_fieldAccessorTable; + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceIdList_descriptor; + @java.lang.Override + public OpticalConfigId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceIdList_fieldAccessorTable; + public static com.google.protobuf.Parser parser() { + return PARSER; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceList_descriptor; + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceList_fieldAccessorTable; + @java.lang.Override + public context.ContextOuterClass.OpticalConfigId getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceFilter_descriptor; + public interface OpticalConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfig) + com.google.protobuf.MessageOrBuilder { - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceFilter_fieldAccessorTable; + /** + * .context.OpticalConfigId opticalconfig_id = 1; + * @return Whether the opticalconfigId field is set. + */ + boolean hasOpticalconfigId(); - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceEvent_descriptor; + /** + * .context.OpticalConfigId opticalconfig_id = 1; + * @return The opticalconfigId. + */ + context.ContextOuterClass.OpticalConfigId getOpticalconfigId(); - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceEvent_fieldAccessorTable; + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + context.ContextOuterClass.OpticalConfigIdOrBuilder getOpticalconfigIdOrBuilder(); - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceId_descriptor; + /** + * string config = 2; + * @return The config. + */ + java.lang.String getConfig(); - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceId_fieldAccessorTable; + /** + * string config = 2; + * @return The bytes for config. + */ + com.google.protobuf.ByteString getConfigBytes(); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Slice_descriptor; + /** + * Protobuf type {@code context.OpticalConfig} + */ + public static final class OpticalConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfig) + OpticalConfigOrBuilder { - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Slice_fieldAccessorTable; + private static final long serialVersionUID = 0L; - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceOwner_descriptor; + // Use OpticalConfig.newBuilder() to construct. + private OpticalConfig(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceOwner_fieldAccessorTable; + private OpticalConfig() { + config_ = ""; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceStatus_descriptor; + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new OpticalConfig(); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceStatus_fieldAccessorTable; + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalConfig_descriptor; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceConfig_descriptor; + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalConfig_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalConfig.class, context.ContextOuterClass.OpticalConfig.Builder.class); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceConfig_fieldAccessorTable; + public static final int OPTICALCONFIG_ID_FIELD_NUMBER = 1; - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceIdList_descriptor; + private context.ContextOuterClass.OpticalConfigId opticalconfigId_; - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceIdList_fieldAccessorTable; + /** + * .context.OpticalConfigId opticalconfig_id = 1; + * @return Whether the opticalconfigId field is set. + */ + @java.lang.Override + public boolean hasOpticalconfigId() { + return opticalconfigId_ != null; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceList_descriptor; + /** + * .context.OpticalConfigId opticalconfig_id = 1; + * @return The opticalconfigId. + */ + @java.lang.Override + public context.ContextOuterClass.OpticalConfigId getOpticalconfigId() { + return opticalconfigId_ == null ? context.ContextOuterClass.OpticalConfigId.getDefaultInstance() : opticalconfigId_; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceList_fieldAccessorTable; + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + @java.lang.Override + public context.ContextOuterClass.OpticalConfigIdOrBuilder getOpticalconfigIdOrBuilder() { + return opticalconfigId_ == null ? context.ContextOuterClass.OpticalConfigId.getDefaultInstance() : opticalconfigId_; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceFilter_descriptor; + public static final int CONFIG_FIELD_NUMBER = 2; - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceFilter_fieldAccessorTable; + @SuppressWarnings("serial") + private volatile java.lang.Object config_ = ""; - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceEvent_descriptor; + /** + * string config = 2; + * @return The config. + */ + @java.lang.Override + public java.lang.String getConfig() { + java.lang.Object ref = config_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + config_ = s; + return s; + } + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceEvent_fieldAccessorTable; + /** + * string config = 2; + * @return The bytes for config. + */ + @java.lang.Override + public com.google.protobuf.ByteString getConfigBytes() { + java.lang.Object ref = config_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + config_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ConnectionId_descriptor; + private byte memoizedIsInitialized = -1; - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ConnectionId_fieldAccessorTable; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + memoizedIsInitialized = 1; + return true; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ConnectionSettings_L0_descriptor; + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (opticalconfigId_ != null) { + output.writeMessage(1, getOpticalconfigId()); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(config_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, config_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + if (opticalconfigId_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getOpticalconfigId()); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(config_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, config_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof context.ContextOuterClass.OpticalConfig)) { + return super.equals(obj); + } + context.ContextOuterClass.OpticalConfig other = (context.ContextOuterClass.OpticalConfig) obj; + if (hasOpticalconfigId() != other.hasOpticalconfigId()) + return false; + if (hasOpticalconfigId()) { + if (!getOpticalconfigId().equals(other.getOpticalconfigId())) + return false; + } + if (!getConfig().equals(other.getConfig())) + return false; + if (!getUnknownFields().equals(other.getUnknownFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasOpticalconfigId()) { + hash = (37 * hash) + OPTICALCONFIG_ID_FIELD_NUMBER; + hash = (53 * hash) + getOpticalconfigId().hashCode(); + } + hash = (37 * hash) + CONFIG_FIELD_NUMBER; + hash = (53 * hash) + getConfig().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfig parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalConfig parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(context.ContextOuterClass.OpticalConfig prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code context.OpticalConfig} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalConfig) + context.ContextOuterClass.OpticalConfigOrBuilder { + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalConfig_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalConfig_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalConfig.class, context.ContextOuterClass.OpticalConfig.Builder.class); + } + + // Construct using context.ContextOuterClass.OpticalConfig.newBuilder() + private Builder() { + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + opticalconfigId_ = null; + if (opticalconfigIdBuilder_ != null) { + opticalconfigIdBuilder_.dispose(); + opticalconfigIdBuilder_ = null; + } + config_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return context.ContextOuterClass.internal_static_context_OpticalConfig_descriptor; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalConfig getDefaultInstanceForType() { + return context.ContextOuterClass.OpticalConfig.getDefaultInstance(); + } + + @java.lang.Override + public context.ContextOuterClass.OpticalConfig build() { + context.ContextOuterClass.OpticalConfig result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalConfig buildPartial() { + context.ContextOuterClass.OpticalConfig result = new context.ContextOuterClass.OpticalConfig(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(context.ContextOuterClass.OpticalConfig result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.opticalconfigId_ = opticalconfigIdBuilder_ == null ? opticalconfigId_ : opticalconfigIdBuilder_.build(); + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.config_ = config_; + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof context.ContextOuterClass.OpticalConfig) { + return mergeFrom((context.ContextOuterClass.OpticalConfig) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(context.ContextOuterClass.OpticalConfig other) { + if (other == context.ContextOuterClass.OpticalConfig.getDefaultInstance()) + return this; + if (other.hasOpticalconfigId()) { + mergeOpticalconfigId(other.getOpticalconfigId()); + } + if (!other.getConfig().isEmpty()) { + config_ = other.config_; + bitField0_ |= 0x00000002; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + input.readMessage(getOpticalconfigIdFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000001; + break; + } + // case 10 + case 18: + { + config_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000002; + break; + } + // case 18 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } + + private int bitField0_; + + private context.ContextOuterClass.OpticalConfigId opticalconfigId_; + + private com.google.protobuf.SingleFieldBuilderV3 opticalconfigIdBuilder_; + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + * @return Whether the opticalconfigId field is set. + */ + public boolean hasOpticalconfigId() { + return ((bitField0_ & 0x00000001) != 0); + } + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + * @return The opticalconfigId. + */ + public context.ContextOuterClass.OpticalConfigId getOpticalconfigId() { + if (opticalconfigIdBuilder_ == null) { + return opticalconfigId_ == null ? context.ContextOuterClass.OpticalConfigId.getDefaultInstance() : opticalconfigId_; + } else { + return opticalconfigIdBuilder_.getMessage(); + } + } + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + public Builder setOpticalconfigId(context.ContextOuterClass.OpticalConfigId value) { + if (opticalconfigIdBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + opticalconfigId_ = value; + } else { + opticalconfigIdBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + public Builder setOpticalconfigId(context.ContextOuterClass.OpticalConfigId.Builder builderForValue) { + if (opticalconfigIdBuilder_ == null) { + opticalconfigId_ = builderForValue.build(); + } else { + opticalconfigIdBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + public Builder mergeOpticalconfigId(context.ContextOuterClass.OpticalConfigId value) { + if (opticalconfigIdBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && opticalconfigId_ != null && opticalconfigId_ != context.ContextOuterClass.OpticalConfigId.getDefaultInstance()) { + getOpticalconfigIdBuilder().mergeFrom(value); + } else { + opticalconfigId_ = value; + } + } else { + opticalconfigIdBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + public Builder clearOpticalconfigId() { + bitField0_ = (bitField0_ & ~0x00000001); + opticalconfigId_ = null; + if (opticalconfigIdBuilder_ != null) { + opticalconfigIdBuilder_.dispose(); + opticalconfigIdBuilder_ = null; + } + onChanged(); + return this; + } + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + public context.ContextOuterClass.OpticalConfigId.Builder getOpticalconfigIdBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getOpticalconfigIdFieldBuilder().getBuilder(); + } + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + public context.ContextOuterClass.OpticalConfigIdOrBuilder getOpticalconfigIdOrBuilder() { + if (opticalconfigIdBuilder_ != null) { + return opticalconfigIdBuilder_.getMessageOrBuilder(); + } else { + return opticalconfigId_ == null ? context.ContextOuterClass.OpticalConfigId.getDefaultInstance() : opticalconfigId_; + } + } + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3 getOpticalconfigIdFieldBuilder() { + if (opticalconfigIdBuilder_ == null) { + opticalconfigIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getOpticalconfigId(), getParentForChildren(), isClean()); + opticalconfigId_ = null; + } + return opticalconfigIdBuilder_; + } + + private java.lang.Object config_ = ""; + + /** + * string config = 2; + * @return The config. + */ + public java.lang.String getConfig() { + java.lang.Object ref = config_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + config_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string config = 2; + * @return The bytes for config. + */ + public com.google.protobuf.ByteString getConfigBytes() { + java.lang.Object ref = config_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + config_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string config = 2; + * @param value The config to set. + * @return This builder for chaining. + */ + public Builder setConfig(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + config_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * string config = 2; + * @return This builder for chaining. + */ + public Builder clearConfig() { + config_ = getDefaultInstance().getConfig(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + + /** + * string config = 2; + * @param value The bytes for config to set. + * @return This builder for chaining. + */ + public Builder setConfigBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + config_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + // @@protoc_insertion_point(builder_scope:context.OpticalConfig) + } + + // @@protoc_insertion_point(class_scope:context.OpticalConfig) + private static final context.ContextOuterClass.OpticalConfig DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new context.ContextOuterClass.OpticalConfig(); + } + + public static context.ContextOuterClass.OpticalConfig getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + + @java.lang.Override + public OpticalConfig parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalConfig getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface OpticalConfigListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfigList) + com.google.protobuf.MessageOrBuilder { + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + java.util.List getOpticalconfigsList(); + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + context.ContextOuterClass.OpticalConfig getOpticalconfigs(int index); + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + int getOpticalconfigsCount(); + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + java.util.List getOpticalconfigsOrBuilderList(); + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + context.ContextOuterClass.OpticalConfigOrBuilder getOpticalconfigsOrBuilder(int index); + } + + /** + * Protobuf type {@code context.OpticalConfigList} + */ + public static final class OpticalConfigList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfigList) + OpticalConfigListOrBuilder { + + private static final long serialVersionUID = 0L; + + // Use OpticalConfigList.newBuilder() to construct. + private OpticalConfigList(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private OpticalConfigList() { + opticalconfigs_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new OpticalConfigList(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalConfigList_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalConfigList_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalConfigList.class, context.ContextOuterClass.OpticalConfigList.Builder.class); + } + + public static final int OPTICALCONFIGS_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private java.util.List opticalconfigs_; + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + @java.lang.Override + public java.util.List getOpticalconfigsList() { + return opticalconfigs_; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + @java.lang.Override + public java.util.List getOpticalconfigsOrBuilderList() { + return opticalconfigs_; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + @java.lang.Override + public int getOpticalconfigsCount() { + return opticalconfigs_.size(); + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + @java.lang.Override + public context.ContextOuterClass.OpticalConfig getOpticalconfigs(int index) { + return opticalconfigs_.get(index); + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + @java.lang.Override + public context.ContextOuterClass.OpticalConfigOrBuilder getOpticalconfigsOrBuilder(int index) { + return opticalconfigs_.get(index); + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + for (int i = 0; i < opticalconfigs_.size(); i++) { + output.writeMessage(1, opticalconfigs_.get(i)); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + for (int i = 0; i < opticalconfigs_.size(); i++) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, opticalconfigs_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof context.ContextOuterClass.OpticalConfigList)) { + return super.equals(obj); + } + context.ContextOuterClass.OpticalConfigList other = (context.ContextOuterClass.OpticalConfigList) obj; + if (!getOpticalconfigsList().equals(other.getOpticalconfigsList())) + return false; + if (!getUnknownFields().equals(other.getUnknownFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getOpticalconfigsCount() > 0) { + hash = (37 * hash) + OPTICALCONFIGS_FIELD_NUMBER; + hash = (53 * hash) + getOpticalconfigsList().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfigList parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalConfigList parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(context.ContextOuterClass.OpticalConfigList prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code context.OpticalConfigList} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalConfigList) + context.ContextOuterClass.OpticalConfigListOrBuilder { + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalConfigList_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalConfigList_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalConfigList.class, context.ContextOuterClass.OpticalConfigList.Builder.class); + } + + // Construct using context.ContextOuterClass.OpticalConfigList.newBuilder() + private Builder() { + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + if (opticalconfigsBuilder_ == null) { + opticalconfigs_ = java.util.Collections.emptyList(); + } else { + opticalconfigs_ = null; + opticalconfigsBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return context.ContextOuterClass.internal_static_context_OpticalConfigList_descriptor; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalConfigList getDefaultInstanceForType() { + return context.ContextOuterClass.OpticalConfigList.getDefaultInstance(); + } + + @java.lang.Override + public context.ContextOuterClass.OpticalConfigList build() { + context.ContextOuterClass.OpticalConfigList result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalConfigList buildPartial() { + context.ContextOuterClass.OpticalConfigList result = new context.ContextOuterClass.OpticalConfigList(this); + buildPartialRepeatedFields(result); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartialRepeatedFields(context.ContextOuterClass.OpticalConfigList result) { + if (opticalconfigsBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + opticalconfigs_ = java.util.Collections.unmodifiableList(opticalconfigs_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.opticalconfigs_ = opticalconfigs_; + } else { + result.opticalconfigs_ = opticalconfigsBuilder_.build(); + } + } + + private void buildPartial0(context.ContextOuterClass.OpticalConfigList result) { + int from_bitField0_ = bitField0_; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof context.ContextOuterClass.OpticalConfigList) { + return mergeFrom((context.ContextOuterClass.OpticalConfigList) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(context.ContextOuterClass.OpticalConfigList other) { + if (other == context.ContextOuterClass.OpticalConfigList.getDefaultInstance()) + return this; + if (opticalconfigsBuilder_ == null) { + if (!other.opticalconfigs_.isEmpty()) { + if (opticalconfigs_.isEmpty()) { + opticalconfigs_ = other.opticalconfigs_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureOpticalconfigsIsMutable(); + opticalconfigs_.addAll(other.opticalconfigs_); + } + onChanged(); + } + } else { + if (!other.opticalconfigs_.isEmpty()) { + if (opticalconfigsBuilder_.isEmpty()) { + opticalconfigsBuilder_.dispose(); + opticalconfigsBuilder_ = null; + opticalconfigs_ = other.opticalconfigs_; + bitField0_ = (bitField0_ & ~0x00000001); + opticalconfigsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getOpticalconfigsFieldBuilder() : null; + } else { + opticalconfigsBuilder_.addAllMessages(other.opticalconfigs_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + context.ContextOuterClass.OpticalConfig m = input.readMessage(context.ContextOuterClass.OpticalConfig.parser(), extensionRegistry); + if (opticalconfigsBuilder_ == null) { + ensureOpticalconfigsIsMutable(); + opticalconfigs_.add(m); + } else { + opticalconfigsBuilder_.addMessage(m); + } + break; + } + // case 10 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } + + private int bitField0_; + + private java.util.List opticalconfigs_ = java.util.Collections.emptyList(); + + private void ensureOpticalconfigsIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + opticalconfigs_ = new java.util.ArrayList(opticalconfigs_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3 opticalconfigsBuilder_; + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public java.util.List getOpticalconfigsList() { + if (opticalconfigsBuilder_ == null) { + return java.util.Collections.unmodifiableList(opticalconfigs_); + } else { + return opticalconfigsBuilder_.getMessageList(); + } + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public int getOpticalconfigsCount() { + if (opticalconfigsBuilder_ == null) { + return opticalconfigs_.size(); + } else { + return opticalconfigsBuilder_.getCount(); + } + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public context.ContextOuterClass.OpticalConfig getOpticalconfigs(int index) { + if (opticalconfigsBuilder_ == null) { + return opticalconfigs_.get(index); + } else { + return opticalconfigsBuilder_.getMessage(index); + } + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder setOpticalconfigs(int index, context.ContextOuterClass.OpticalConfig value) { + if (opticalconfigsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOpticalconfigsIsMutable(); + opticalconfigs_.set(index, value); + onChanged(); + } else { + opticalconfigsBuilder_.setMessage(index, value); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder setOpticalconfigs(int index, context.ContextOuterClass.OpticalConfig.Builder builderForValue) { + if (opticalconfigsBuilder_ == null) { + ensureOpticalconfigsIsMutable(); + opticalconfigs_.set(index, builderForValue.build()); + onChanged(); + } else { + opticalconfigsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder addOpticalconfigs(context.ContextOuterClass.OpticalConfig value) { + if (opticalconfigsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOpticalconfigsIsMutable(); + opticalconfigs_.add(value); + onChanged(); + } else { + opticalconfigsBuilder_.addMessage(value); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder addOpticalconfigs(int index, context.ContextOuterClass.OpticalConfig value) { + if (opticalconfigsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOpticalconfigsIsMutable(); + opticalconfigs_.add(index, value); + onChanged(); + } else { + opticalconfigsBuilder_.addMessage(index, value); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder addOpticalconfigs(context.ContextOuterClass.OpticalConfig.Builder builderForValue) { + if (opticalconfigsBuilder_ == null) { + ensureOpticalconfigsIsMutable(); + opticalconfigs_.add(builderForValue.build()); + onChanged(); + } else { + opticalconfigsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder addOpticalconfigs(int index, context.ContextOuterClass.OpticalConfig.Builder builderForValue) { + if (opticalconfigsBuilder_ == null) { + ensureOpticalconfigsIsMutable(); + opticalconfigs_.add(index, builderForValue.build()); + onChanged(); + } else { + opticalconfigsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder addAllOpticalconfigs(java.lang.Iterable values) { + if (opticalconfigsBuilder_ == null) { + ensureOpticalconfigsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll(values, opticalconfigs_); + onChanged(); + } else { + opticalconfigsBuilder_.addAllMessages(values); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder clearOpticalconfigs() { + if (opticalconfigsBuilder_ == null) { + opticalconfigs_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + opticalconfigsBuilder_.clear(); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder removeOpticalconfigs(int index) { + if (opticalconfigsBuilder_ == null) { + ensureOpticalconfigsIsMutable(); + opticalconfigs_.remove(index); + onChanged(); + } else { + opticalconfigsBuilder_.remove(index); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public context.ContextOuterClass.OpticalConfig.Builder getOpticalconfigsBuilder(int index) { + return getOpticalconfigsFieldBuilder().getBuilder(index); + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public context.ContextOuterClass.OpticalConfigOrBuilder getOpticalconfigsOrBuilder(int index) { + if (opticalconfigsBuilder_ == null) { + return opticalconfigs_.get(index); + } else { + return opticalconfigsBuilder_.getMessageOrBuilder(index); + } + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public java.util.List getOpticalconfigsOrBuilderList() { + if (opticalconfigsBuilder_ != null) { + return opticalconfigsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(opticalconfigs_); + } + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public context.ContextOuterClass.OpticalConfig.Builder addOpticalconfigsBuilder() { + return getOpticalconfigsFieldBuilder().addBuilder(context.ContextOuterClass.OpticalConfig.getDefaultInstance()); + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public context.ContextOuterClass.OpticalConfig.Builder addOpticalconfigsBuilder(int index) { + return getOpticalconfigsFieldBuilder().addBuilder(index, context.ContextOuterClass.OpticalConfig.getDefaultInstance()); + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public java.util.List getOpticalconfigsBuilderList() { + return getOpticalconfigsFieldBuilder().getBuilderList(); + } + + private com.google.protobuf.RepeatedFieldBuilderV3 getOpticalconfigsFieldBuilder() { + if (opticalconfigsBuilder_ == null) { + opticalconfigsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(opticalconfigs_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean()); + opticalconfigs_ = null; + } + return opticalconfigsBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + // @@protoc_insertion_point(builder_scope:context.OpticalConfigList) + } + + // @@protoc_insertion_point(class_scope:context.OpticalConfigList) + private static final context.ContextOuterClass.OpticalConfigList DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new context.ContextOuterClass.OpticalConfigList(); + } + + public static context.ContextOuterClass.OpticalConfigList getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + + @java.lang.Override + public OpticalConfigList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalConfigList getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface OpticalLinkIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLinkId) + com.google.protobuf.MessageOrBuilder { + + /** + * .context.Uuid optical_link_uuid = 1; + * @return Whether the opticalLinkUuid field is set. + */ + boolean hasOpticalLinkUuid(); + + /** + * .context.Uuid optical_link_uuid = 1; + * @return The opticalLinkUuid. + */ + context.ContextOuterClass.Uuid getOpticalLinkUuid(); + + /** + * .context.Uuid optical_link_uuid = 1; + */ + context.ContextOuterClass.UuidOrBuilder getOpticalLinkUuidOrBuilder(); + } + + /** + * Protobuf type {@code context.OpticalLinkId} + */ + public static final class OpticalLinkId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalLinkId) + OpticalLinkIdOrBuilder { + + private static final long serialVersionUID = 0L; + + // Use OpticalLinkId.newBuilder() to construct. + private OpticalLinkId(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private OpticalLinkId() { + } + + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new OpticalLinkId(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalLinkId_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalLinkId_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalLinkId.class, context.ContextOuterClass.OpticalLinkId.Builder.class); + } + + public static final int OPTICAL_LINK_UUID_FIELD_NUMBER = 1; + + private context.ContextOuterClass.Uuid opticalLinkUuid_; + + /** + * .context.Uuid optical_link_uuid = 1; + * @return Whether the opticalLinkUuid field is set. + */ + @java.lang.Override + public boolean hasOpticalLinkUuid() { + return opticalLinkUuid_ != null; + } + + /** + * .context.Uuid optical_link_uuid = 1; + * @return The opticalLinkUuid. + */ + @java.lang.Override + public context.ContextOuterClass.Uuid getOpticalLinkUuid() { + return opticalLinkUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : opticalLinkUuid_; + } + + /** + * .context.Uuid optical_link_uuid = 1; + */ + @java.lang.Override + public context.ContextOuterClass.UuidOrBuilder getOpticalLinkUuidOrBuilder() { + return opticalLinkUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : opticalLinkUuid_; + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (opticalLinkUuid_ != null) { + output.writeMessage(1, getOpticalLinkUuid()); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + if (opticalLinkUuid_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getOpticalLinkUuid()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof context.ContextOuterClass.OpticalLinkId)) { + return super.equals(obj); + } + context.ContextOuterClass.OpticalLinkId other = (context.ContextOuterClass.OpticalLinkId) obj; + if (hasOpticalLinkUuid() != other.hasOpticalLinkUuid()) + return false; + if (hasOpticalLinkUuid()) { + if (!getOpticalLinkUuid().equals(other.getOpticalLinkUuid())) + return false; + } + if (!getUnknownFields().equals(other.getUnknownFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasOpticalLinkUuid()) { + hash = (37 * hash) + OPTICAL_LINK_UUID_FIELD_NUMBER; + hash = (53 * hash) + getOpticalLinkUuid().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkId parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLinkId parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(context.ContextOuterClass.OpticalLinkId prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code context.OpticalLinkId} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalLinkId) + context.ContextOuterClass.OpticalLinkIdOrBuilder { + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalLinkId_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalLinkId_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalLinkId.class, context.ContextOuterClass.OpticalLinkId.Builder.class); + } + + // Construct using context.ContextOuterClass.OpticalLinkId.newBuilder() + private Builder() { + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + opticalLinkUuid_ = null; + if (opticalLinkUuidBuilder_ != null) { + opticalLinkUuidBuilder_.dispose(); + opticalLinkUuidBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return context.ContextOuterClass.internal_static_context_OpticalLinkId_descriptor; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLinkId getDefaultInstanceForType() { + return context.ContextOuterClass.OpticalLinkId.getDefaultInstance(); + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLinkId build() { + context.ContextOuterClass.OpticalLinkId result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLinkId buildPartial() { + context.ContextOuterClass.OpticalLinkId result = new context.ContextOuterClass.OpticalLinkId(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(context.ContextOuterClass.OpticalLinkId result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.opticalLinkUuid_ = opticalLinkUuidBuilder_ == null ? opticalLinkUuid_ : opticalLinkUuidBuilder_.build(); + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof context.ContextOuterClass.OpticalLinkId) { + return mergeFrom((context.ContextOuterClass.OpticalLinkId) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(context.ContextOuterClass.OpticalLinkId other) { + if (other == context.ContextOuterClass.OpticalLinkId.getDefaultInstance()) + return this; + if (other.hasOpticalLinkUuid()) { + mergeOpticalLinkUuid(other.getOpticalLinkUuid()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + input.readMessage(getOpticalLinkUuidFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000001; + break; + } + // case 10 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } + + private int bitField0_; + + private context.ContextOuterClass.Uuid opticalLinkUuid_; + + private com.google.protobuf.SingleFieldBuilderV3 opticalLinkUuidBuilder_; + + /** + * .context.Uuid optical_link_uuid = 1; + * @return Whether the opticalLinkUuid field is set. + */ + public boolean hasOpticalLinkUuid() { + return ((bitField0_ & 0x00000001) != 0); + } + + /** + * .context.Uuid optical_link_uuid = 1; + * @return The opticalLinkUuid. + */ + public context.ContextOuterClass.Uuid getOpticalLinkUuid() { + if (opticalLinkUuidBuilder_ == null) { + return opticalLinkUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : opticalLinkUuid_; + } else { + return opticalLinkUuidBuilder_.getMessage(); + } + } + + /** + * .context.Uuid optical_link_uuid = 1; + */ + public Builder setOpticalLinkUuid(context.ContextOuterClass.Uuid value) { + if (opticalLinkUuidBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + opticalLinkUuid_ = value; + } else { + opticalLinkUuidBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.Uuid optical_link_uuid = 1; + */ + public Builder setOpticalLinkUuid(context.ContextOuterClass.Uuid.Builder builderForValue) { + if (opticalLinkUuidBuilder_ == null) { + opticalLinkUuid_ = builderForValue.build(); + } else { + opticalLinkUuidBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.Uuid optical_link_uuid = 1; + */ + public Builder mergeOpticalLinkUuid(context.ContextOuterClass.Uuid value) { + if (opticalLinkUuidBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && opticalLinkUuid_ != null && opticalLinkUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) { + getOpticalLinkUuidBuilder().mergeFrom(value); + } else { + opticalLinkUuid_ = value; + } + } else { + opticalLinkUuidBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.Uuid optical_link_uuid = 1; + */ + public Builder clearOpticalLinkUuid() { + bitField0_ = (bitField0_ & ~0x00000001); + opticalLinkUuid_ = null; + if (opticalLinkUuidBuilder_ != null) { + opticalLinkUuidBuilder_.dispose(); + opticalLinkUuidBuilder_ = null; + } + onChanged(); + return this; + } + + /** + * .context.Uuid optical_link_uuid = 1; + */ + public context.ContextOuterClass.Uuid.Builder getOpticalLinkUuidBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getOpticalLinkUuidFieldBuilder().getBuilder(); + } + + /** + * .context.Uuid optical_link_uuid = 1; + */ + public context.ContextOuterClass.UuidOrBuilder getOpticalLinkUuidOrBuilder() { + if (opticalLinkUuidBuilder_ != null) { + return opticalLinkUuidBuilder_.getMessageOrBuilder(); + } else { + return opticalLinkUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : opticalLinkUuid_; + } + } + + /** + * .context.Uuid optical_link_uuid = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3 getOpticalLinkUuidFieldBuilder() { + if (opticalLinkUuidBuilder_ == null) { + opticalLinkUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getOpticalLinkUuid(), getParentForChildren(), isClean()); + opticalLinkUuid_ = null; + } + return opticalLinkUuidBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + // @@protoc_insertion_point(builder_scope:context.OpticalLinkId) + } + + // @@protoc_insertion_point(class_scope:context.OpticalLinkId) + private static final context.ContextOuterClass.OpticalLinkId DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new context.ContextOuterClass.OpticalLinkId(); + } + + public static context.ContextOuterClass.OpticalLinkId getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + + @java.lang.Override + public OpticalLinkId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLinkId getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface FiberIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.FiberId) + com.google.protobuf.MessageOrBuilder { + + /** + * .context.Uuid fiber_uuid = 1; + * @return Whether the fiberUuid field is set. + */ + boolean hasFiberUuid(); + + /** + * .context.Uuid fiber_uuid = 1; + * @return The fiberUuid. + */ + context.ContextOuterClass.Uuid getFiberUuid(); + + /** + * .context.Uuid fiber_uuid = 1; + */ + context.ContextOuterClass.UuidOrBuilder getFiberUuidOrBuilder(); + } + + /** + * Protobuf type {@code context.FiberId} + */ + public static final class FiberId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.FiberId) + FiberIdOrBuilder { + + private static final long serialVersionUID = 0L; + + // Use FiberId.newBuilder() to construct. + private FiberId(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private FiberId() { + } + + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new FiberId(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_FiberId_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_FiberId_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.FiberId.class, context.ContextOuterClass.FiberId.Builder.class); + } + + public static final int FIBER_UUID_FIELD_NUMBER = 1; + + private context.ContextOuterClass.Uuid fiberUuid_; + + /** + * .context.Uuid fiber_uuid = 1; + * @return Whether the fiberUuid field is set. + */ + @java.lang.Override + public boolean hasFiberUuid() { + return fiberUuid_ != null; + } + + /** + * .context.Uuid fiber_uuid = 1; + * @return The fiberUuid. + */ + @java.lang.Override + public context.ContextOuterClass.Uuid getFiberUuid() { + return fiberUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : fiberUuid_; + } + + /** + * .context.Uuid fiber_uuid = 1; + */ + @java.lang.Override + public context.ContextOuterClass.UuidOrBuilder getFiberUuidOrBuilder() { + return fiberUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : fiberUuid_; + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (fiberUuid_ != null) { + output.writeMessage(1, getFiberUuid()); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + if (fiberUuid_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getFiberUuid()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof context.ContextOuterClass.FiberId)) { + return super.equals(obj); + } + context.ContextOuterClass.FiberId other = (context.ContextOuterClass.FiberId) obj; + if (hasFiberUuid() != other.hasFiberUuid()) + return false; + if (hasFiberUuid()) { + if (!getFiberUuid().equals(other.getFiberUuid())) + return false; + } + if (!getUnknownFields().equals(other.getUnknownFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasFiberUuid()) { + hash = (37 * hash) + FIBER_UUID_FIELD_NUMBER; + hash = (53 * hash) + getFiberUuid().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static context.ContextOuterClass.FiberId parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.FiberId parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.FiberId parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.FiberId parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.FiberId parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.FiberId parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.FiberId parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.FiberId parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.FiberId parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.FiberId parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.FiberId parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.FiberId parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(context.ContextOuterClass.FiberId prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code context.FiberId} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.FiberId) + context.ContextOuterClass.FiberIdOrBuilder { + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_FiberId_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_FiberId_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.FiberId.class, context.ContextOuterClass.FiberId.Builder.class); + } + + // Construct using context.ContextOuterClass.FiberId.newBuilder() + private Builder() { + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + fiberUuid_ = null; + if (fiberUuidBuilder_ != null) { + fiberUuidBuilder_.dispose(); + fiberUuidBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return context.ContextOuterClass.internal_static_context_FiberId_descriptor; + } + + @java.lang.Override + public context.ContextOuterClass.FiberId getDefaultInstanceForType() { + return context.ContextOuterClass.FiberId.getDefaultInstance(); + } + + @java.lang.Override + public context.ContextOuterClass.FiberId build() { + context.ContextOuterClass.FiberId result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public context.ContextOuterClass.FiberId buildPartial() { + context.ContextOuterClass.FiberId result = new context.ContextOuterClass.FiberId(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(context.ContextOuterClass.FiberId result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.fiberUuid_ = fiberUuidBuilder_ == null ? fiberUuid_ : fiberUuidBuilder_.build(); + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof context.ContextOuterClass.FiberId) { + return mergeFrom((context.ContextOuterClass.FiberId) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(context.ContextOuterClass.FiberId other) { + if (other == context.ContextOuterClass.FiberId.getDefaultInstance()) + return this; + if (other.hasFiberUuid()) { + mergeFiberUuid(other.getFiberUuid()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + input.readMessage(getFiberUuidFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000001; + break; + } + // case 10 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } + + private int bitField0_; + + private context.ContextOuterClass.Uuid fiberUuid_; + + private com.google.protobuf.SingleFieldBuilderV3 fiberUuidBuilder_; + + /** + * .context.Uuid fiber_uuid = 1; + * @return Whether the fiberUuid field is set. + */ + public boolean hasFiberUuid() { + return ((bitField0_ & 0x00000001) != 0); + } + + /** + * .context.Uuid fiber_uuid = 1; + * @return The fiberUuid. + */ + public context.ContextOuterClass.Uuid getFiberUuid() { + if (fiberUuidBuilder_ == null) { + return fiberUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : fiberUuid_; + } else { + return fiberUuidBuilder_.getMessage(); + } + } + + /** + * .context.Uuid fiber_uuid = 1; + */ + public Builder setFiberUuid(context.ContextOuterClass.Uuid value) { + if (fiberUuidBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + fiberUuid_ = value; + } else { + fiberUuidBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.Uuid fiber_uuid = 1; + */ + public Builder setFiberUuid(context.ContextOuterClass.Uuid.Builder builderForValue) { + if (fiberUuidBuilder_ == null) { + fiberUuid_ = builderForValue.build(); + } else { + fiberUuidBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.Uuid fiber_uuid = 1; + */ + public Builder mergeFiberUuid(context.ContextOuterClass.Uuid value) { + if (fiberUuidBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && fiberUuid_ != null && fiberUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) { + getFiberUuidBuilder().mergeFrom(value); + } else { + fiberUuid_ = value; + } + } else { + fiberUuidBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.Uuid fiber_uuid = 1; + */ + public Builder clearFiberUuid() { + bitField0_ = (bitField0_ & ~0x00000001); + fiberUuid_ = null; + if (fiberUuidBuilder_ != null) { + fiberUuidBuilder_.dispose(); + fiberUuidBuilder_ = null; + } + onChanged(); + return this; + } + + /** + * .context.Uuid fiber_uuid = 1; + */ + public context.ContextOuterClass.Uuid.Builder getFiberUuidBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getFiberUuidFieldBuilder().getBuilder(); + } + + /** + * .context.Uuid fiber_uuid = 1; + */ + public context.ContextOuterClass.UuidOrBuilder getFiberUuidOrBuilder() { + if (fiberUuidBuilder_ != null) { + return fiberUuidBuilder_.getMessageOrBuilder(); + } else { + return fiberUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : fiberUuid_; + } + } + + /** + * .context.Uuid fiber_uuid = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3 getFiberUuidFieldBuilder() { + if (fiberUuidBuilder_ == null) { + fiberUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getFiberUuid(), getParentForChildren(), isClean()); + fiberUuid_ = null; + } + return fiberUuidBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + // @@protoc_insertion_point(builder_scope:context.FiberId) + } + + // @@protoc_insertion_point(class_scope:context.FiberId) + private static final context.ContextOuterClass.FiberId DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new context.ContextOuterClass.FiberId(); + } + + public static context.ContextOuterClass.FiberId getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + + @java.lang.Override + public FiberId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public context.ContextOuterClass.FiberId getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface FiberOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Fiber) + com.google.protobuf.MessageOrBuilder { + + /** + * string ID = 10; + * @return The iD. + */ + java.lang.String getID(); + + /** + * string ID = 10; + * @return The bytes for iD. + */ + com.google.protobuf.ByteString getIDBytes(); + + /** + * string src_port = 1; + * @return The srcPort. + */ + java.lang.String getSrcPort(); + + /** + * string src_port = 1; + * @return The bytes for srcPort. + */ + com.google.protobuf.ByteString getSrcPortBytes(); + + /** + * string dst_port = 2; + * @return The dstPort. + */ + java.lang.String getDstPort(); + + /** + * string dst_port = 2; + * @return The bytes for dstPort. + */ + com.google.protobuf.ByteString getDstPortBytes(); + + /** + * string local_peer_port = 3; + * @return The localPeerPort. + */ + java.lang.String getLocalPeerPort(); + + /** + * string local_peer_port = 3; + * @return The bytes for localPeerPort. + */ + com.google.protobuf.ByteString getLocalPeerPortBytes(); + + /** + * string remote_peer_port = 4; + * @return The remotePeerPort. + */ + java.lang.String getRemotePeerPort(); + + /** + * string remote_peer_port = 4; + * @return The bytes for remotePeerPort. + */ + com.google.protobuf.ByteString getRemotePeerPortBytes(); + + /** + * repeated int32 c_slots = 5; + * @return A list containing the cSlots. + */ + java.util.List getCSlotsList(); + + /** + * repeated int32 c_slots = 5; + * @return The count of cSlots. + */ + int getCSlotsCount(); + + /** + * repeated int32 c_slots = 5; + * @param index The index of the element to return. + * @return The cSlots at the given index. + */ + int getCSlots(int index); + + /** + * repeated int32 l_slots = 6; + * @return A list containing the lSlots. + */ + java.util.List getLSlotsList(); + + /** + * repeated int32 l_slots = 6; + * @return The count of lSlots. + */ + int getLSlotsCount(); + + /** + * repeated int32 l_slots = 6; + * @param index The index of the element to return. + * @return The lSlots at the given index. + */ + int getLSlots(int index); + + /** + * repeated int32 s_slots = 7; + * @return A list containing the sSlots. + */ + java.util.List getSSlotsList(); + + /** + * repeated int32 s_slots = 7; + * @return The count of sSlots. + */ + int getSSlotsCount(); + + /** + * repeated int32 s_slots = 7; + * @param index The index of the element to return. + * @return The sSlots at the given index. + */ + int getSSlots(int index); + + /** + * float length = 8; + * @return The length. + */ + float getLength(); + + /** + * bool used = 9; + * @return The used. + */ + boolean getUsed(); + + /** + * .context.FiberId fiber_uuid = 11; + * @return Whether the fiberUuid field is set. + */ + boolean hasFiberUuid(); + + /** + * .context.FiberId fiber_uuid = 11; + * @return The fiberUuid. + */ + context.ContextOuterClass.FiberId getFiberUuid(); + + /** + * .context.FiberId fiber_uuid = 11; + */ + context.ContextOuterClass.FiberIdOrBuilder getFiberUuidOrBuilder(); + } + + /** + * Protobuf type {@code context.Fiber} + */ + public static final class Fiber extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Fiber) + FiberOrBuilder { + + private static final long serialVersionUID = 0L; + + // Use Fiber.newBuilder() to construct. + private Fiber(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private Fiber() { + iD_ = ""; + srcPort_ = ""; + dstPort_ = ""; + localPeerPort_ = ""; + remotePeerPort_ = ""; + cSlots_ = emptyIntList(); + lSlots_ = emptyIntList(); + sSlots_ = emptyIntList(); + } + + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new Fiber(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_Fiber_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_Fiber_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.Fiber.class, context.ContextOuterClass.Fiber.Builder.class); + } + + public static final int ID_FIELD_NUMBER = 10; + + @SuppressWarnings("serial") + private volatile java.lang.Object iD_ = ""; + + /** + * string ID = 10; + * @return The iD. + */ + @java.lang.Override + public java.lang.String getID() { + java.lang.Object ref = iD_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + iD_ = s; + return s; + } + } + + /** + * string ID = 10; + * @return The bytes for iD. + */ + @java.lang.Override + public com.google.protobuf.ByteString getIDBytes() { + java.lang.Object ref = iD_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + iD_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int SRC_PORT_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private volatile java.lang.Object srcPort_ = ""; + + /** + * string src_port = 1; + * @return The srcPort. + */ + @java.lang.Override + public java.lang.String getSrcPort() { + java.lang.Object ref = srcPort_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + srcPort_ = s; + return s; + } + } + + /** + * string src_port = 1; + * @return The bytes for srcPort. + */ + @java.lang.Override + public com.google.protobuf.ByteString getSrcPortBytes() { + java.lang.Object ref = srcPort_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + srcPort_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int DST_PORT_FIELD_NUMBER = 2; + + @SuppressWarnings("serial") + private volatile java.lang.Object dstPort_ = ""; + + /** + * string dst_port = 2; + * @return The dstPort. + */ + @java.lang.Override + public java.lang.String getDstPort() { + java.lang.Object ref = dstPort_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + dstPort_ = s; + return s; + } + } + + /** + * string dst_port = 2; + * @return The bytes for dstPort. + */ + @java.lang.Override + public com.google.protobuf.ByteString getDstPortBytes() { + java.lang.Object ref = dstPort_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + dstPort_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int LOCAL_PEER_PORT_FIELD_NUMBER = 3; + + @SuppressWarnings("serial") + private volatile java.lang.Object localPeerPort_ = ""; + + /** + * string local_peer_port = 3; + * @return The localPeerPort. + */ + @java.lang.Override + public java.lang.String getLocalPeerPort() { + java.lang.Object ref = localPeerPort_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + localPeerPort_ = s; + return s; + } + } + + /** + * string local_peer_port = 3; + * @return The bytes for localPeerPort. + */ + @java.lang.Override + public com.google.protobuf.ByteString getLocalPeerPortBytes() { + java.lang.Object ref = localPeerPort_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + localPeerPort_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int REMOTE_PEER_PORT_FIELD_NUMBER = 4; + + @SuppressWarnings("serial") + private volatile java.lang.Object remotePeerPort_ = ""; + + /** + * string remote_peer_port = 4; + * @return The remotePeerPort. + */ + @java.lang.Override + public java.lang.String getRemotePeerPort() { + java.lang.Object ref = remotePeerPort_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + remotePeerPort_ = s; + return s; + } + } + + /** + * string remote_peer_port = 4; + * @return The bytes for remotePeerPort. + */ + @java.lang.Override + public com.google.protobuf.ByteString getRemotePeerPortBytes() { + java.lang.Object ref = remotePeerPort_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + remotePeerPort_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int C_SLOTS_FIELD_NUMBER = 5; + + @SuppressWarnings("serial") + private com.google.protobuf.Internal.IntList cSlots_; + + /** + * repeated int32 c_slots = 5; + * @return A list containing the cSlots. + */ + @java.lang.Override + public java.util.List getCSlotsList() { + return cSlots_; + } + + /** + * repeated int32 c_slots = 5; + * @return The count of cSlots. + */ + public int getCSlotsCount() { + return cSlots_.size(); + } + + /** + * repeated int32 c_slots = 5; + * @param index The index of the element to return. + * @return The cSlots at the given index. + */ + public int getCSlots(int index) { + return cSlots_.getInt(index); + } + + private int cSlotsMemoizedSerializedSize = -1; + + public static final int L_SLOTS_FIELD_NUMBER = 6; + + @SuppressWarnings("serial") + private com.google.protobuf.Internal.IntList lSlots_; + + /** + * repeated int32 l_slots = 6; + * @return A list containing the lSlots. + */ + @java.lang.Override + public java.util.List getLSlotsList() { + return lSlots_; + } + + /** + * repeated int32 l_slots = 6; + * @return The count of lSlots. + */ + public int getLSlotsCount() { + return lSlots_.size(); + } + + /** + * repeated int32 l_slots = 6; + * @param index The index of the element to return. + * @return The lSlots at the given index. + */ + public int getLSlots(int index) { + return lSlots_.getInt(index); + } + + private int lSlotsMemoizedSerializedSize = -1; + + public static final int S_SLOTS_FIELD_NUMBER = 7; + + @SuppressWarnings("serial") + private com.google.protobuf.Internal.IntList sSlots_; + + /** + * repeated int32 s_slots = 7; + * @return A list containing the sSlots. + */ + @java.lang.Override + public java.util.List getSSlotsList() { + return sSlots_; + } + + /** + * repeated int32 s_slots = 7; + * @return The count of sSlots. + */ + public int getSSlotsCount() { + return sSlots_.size(); + } + + /** + * repeated int32 s_slots = 7; + * @param index The index of the element to return. + * @return The sSlots at the given index. + */ + public int getSSlots(int index) { + return sSlots_.getInt(index); + } + + private int sSlotsMemoizedSerializedSize = -1; + + public static final int LENGTH_FIELD_NUMBER = 8; + + private float length_ = 0F; + + /** + * float length = 8; + * @return The length. + */ + @java.lang.Override + public float getLength() { + return length_; + } + + public static final int USED_FIELD_NUMBER = 9; + + private boolean used_ = false; + + /** + * bool used = 9; + * @return The used. + */ + @java.lang.Override + public boolean getUsed() { + return used_; + } + + public static final int FIBER_UUID_FIELD_NUMBER = 11; + + private context.ContextOuterClass.FiberId fiberUuid_; + + /** + * .context.FiberId fiber_uuid = 11; + * @return Whether the fiberUuid field is set. + */ + @java.lang.Override + public boolean hasFiberUuid() { + return fiberUuid_ != null; + } + + /** + * .context.FiberId fiber_uuid = 11; + * @return The fiberUuid. + */ + @java.lang.Override + public context.ContextOuterClass.FiberId getFiberUuid() { + return fiberUuid_ == null ? context.ContextOuterClass.FiberId.getDefaultInstance() : fiberUuid_; + } + + /** + * .context.FiberId fiber_uuid = 11; + */ + @java.lang.Override + public context.ContextOuterClass.FiberIdOrBuilder getFiberUuidOrBuilder() { + return fiberUuid_ == null ? context.ContextOuterClass.FiberId.getDefaultInstance() : fiberUuid_; + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + getSerializedSize(); + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcPort_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, srcPort_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstPort_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, dstPort_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(localPeerPort_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, localPeerPort_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(remotePeerPort_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, remotePeerPort_); + } + if (getCSlotsList().size() > 0) { + output.writeUInt32NoTag(42); + output.writeUInt32NoTag(cSlotsMemoizedSerializedSize); + } + for (int i = 0; i < cSlots_.size(); i++) { + output.writeInt32NoTag(cSlots_.getInt(i)); + } + if (getLSlotsList().size() > 0) { + output.writeUInt32NoTag(50); + output.writeUInt32NoTag(lSlotsMemoizedSerializedSize); + } + for (int i = 0; i < lSlots_.size(); i++) { + output.writeInt32NoTag(lSlots_.getInt(i)); + } + if (getSSlotsList().size() > 0) { + output.writeUInt32NoTag(58); + output.writeUInt32NoTag(sSlotsMemoizedSerializedSize); + } + for (int i = 0; i < sSlots_.size(); i++) { + output.writeInt32NoTag(sSlots_.getInt(i)); + } + if (java.lang.Float.floatToRawIntBits(length_) != 0) { + output.writeFloat(8, length_); + } + if (used_ != false) { + output.writeBool(9, used_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(iD_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 10, iD_); + } + if (fiberUuid_ != null) { + output.writeMessage(11, getFiberUuid()); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcPort_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, srcPort_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstPort_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, dstPort_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(localPeerPort_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, localPeerPort_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(remotePeerPort_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, remotePeerPort_); + } + { + int dataSize = 0; + for (int i = 0; i < cSlots_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream.computeInt32SizeNoTag(cSlots_.getInt(i)); + } + size += dataSize; + if (!getCSlotsList().isEmpty()) { + size += 1; + size += com.google.protobuf.CodedOutputStream.computeInt32SizeNoTag(dataSize); + } + cSlotsMemoizedSerializedSize = dataSize; + } + { + int dataSize = 0; + for (int i = 0; i < lSlots_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream.computeInt32SizeNoTag(lSlots_.getInt(i)); + } + size += dataSize; + if (!getLSlotsList().isEmpty()) { + size += 1; + size += com.google.protobuf.CodedOutputStream.computeInt32SizeNoTag(dataSize); + } + lSlotsMemoizedSerializedSize = dataSize; + } + { + int dataSize = 0; + for (int i = 0; i < sSlots_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream.computeInt32SizeNoTag(sSlots_.getInt(i)); + } + size += dataSize; + if (!getSSlotsList().isEmpty()) { + size += 1; + size += com.google.protobuf.CodedOutputStream.computeInt32SizeNoTag(dataSize); + } + sSlotsMemoizedSerializedSize = dataSize; + } + if (java.lang.Float.floatToRawIntBits(length_) != 0) { + size += com.google.protobuf.CodedOutputStream.computeFloatSize(8, length_); + } + if (used_ != false) { + size += com.google.protobuf.CodedOutputStream.computeBoolSize(9, used_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(iD_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(10, iD_); + } + if (fiberUuid_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(11, getFiberUuid()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof context.ContextOuterClass.Fiber)) { + return super.equals(obj); + } + context.ContextOuterClass.Fiber other = (context.ContextOuterClass.Fiber) obj; + if (!getID().equals(other.getID())) + return false; + if (!getSrcPort().equals(other.getSrcPort())) + return false; + if (!getDstPort().equals(other.getDstPort())) + return false; + if (!getLocalPeerPort().equals(other.getLocalPeerPort())) + return false; + if (!getRemotePeerPort().equals(other.getRemotePeerPort())) + return false; + if (!getCSlotsList().equals(other.getCSlotsList())) + return false; + if (!getLSlotsList().equals(other.getLSlotsList())) + return false; + if (!getSSlotsList().equals(other.getSSlotsList())) + return false; + if (java.lang.Float.floatToIntBits(getLength()) != java.lang.Float.floatToIntBits(other.getLength())) + return false; + if (getUsed() != other.getUsed()) + return false; + if (hasFiberUuid() != other.hasFiberUuid()) + return false; + if (hasFiberUuid()) { + if (!getFiberUuid().equals(other.getFiberUuid())) + return false; + } + if (!getUnknownFields().equals(other.getUnknownFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + ID_FIELD_NUMBER; + hash = (53 * hash) + getID().hashCode(); + hash = (37 * hash) + SRC_PORT_FIELD_NUMBER; + hash = (53 * hash) + getSrcPort().hashCode(); + hash = (37 * hash) + DST_PORT_FIELD_NUMBER; + hash = (53 * hash) + getDstPort().hashCode(); + hash = (37 * hash) + LOCAL_PEER_PORT_FIELD_NUMBER; + hash = (53 * hash) + getLocalPeerPort().hashCode(); + hash = (37 * hash) + REMOTE_PEER_PORT_FIELD_NUMBER; + hash = (53 * hash) + getRemotePeerPort().hashCode(); + if (getCSlotsCount() > 0) { + hash = (37 * hash) + C_SLOTS_FIELD_NUMBER; + hash = (53 * hash) + getCSlotsList().hashCode(); + } + if (getLSlotsCount() > 0) { + hash = (37 * hash) + L_SLOTS_FIELD_NUMBER; + hash = (53 * hash) + getLSlotsList().hashCode(); + } + if (getSSlotsCount() > 0) { + hash = (37 * hash) + S_SLOTS_FIELD_NUMBER; + hash = (53 * hash) + getSSlotsList().hashCode(); + } + hash = (37 * hash) + LENGTH_FIELD_NUMBER; + hash = (53 * hash) + java.lang.Float.floatToIntBits(getLength()); + hash = (37 * hash) + USED_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getUsed()); + if (hasFiberUuid()) { + hash = (37 * hash) + FIBER_UUID_FIELD_NUMBER; + hash = (53 * hash) + getFiberUuid().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static context.ContextOuterClass.Fiber parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.Fiber parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.Fiber parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.Fiber parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.Fiber parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.Fiber parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.Fiber parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.Fiber parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.Fiber parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.Fiber parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.Fiber parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.Fiber parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(context.ContextOuterClass.Fiber prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code context.Fiber} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Fiber) + context.ContextOuterClass.FiberOrBuilder { + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_Fiber_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_Fiber_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.Fiber.class, context.ContextOuterClass.Fiber.Builder.class); + } + + // Construct using context.ContextOuterClass.Fiber.newBuilder() + private Builder() { + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + iD_ = ""; + srcPort_ = ""; + dstPort_ = ""; + localPeerPort_ = ""; + remotePeerPort_ = ""; + cSlots_ = emptyIntList(); + lSlots_ = emptyIntList(); + sSlots_ = emptyIntList(); + length_ = 0F; + used_ = false; + fiberUuid_ = null; + if (fiberUuidBuilder_ != null) { + fiberUuidBuilder_.dispose(); + fiberUuidBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return context.ContextOuterClass.internal_static_context_Fiber_descriptor; + } + + @java.lang.Override + public context.ContextOuterClass.Fiber getDefaultInstanceForType() { + return context.ContextOuterClass.Fiber.getDefaultInstance(); + } + + @java.lang.Override + public context.ContextOuterClass.Fiber build() { + context.ContextOuterClass.Fiber result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public context.ContextOuterClass.Fiber buildPartial() { + context.ContextOuterClass.Fiber result = new context.ContextOuterClass.Fiber(this); + buildPartialRepeatedFields(result); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartialRepeatedFields(context.ContextOuterClass.Fiber result) { + if (((bitField0_ & 0x00000020) != 0)) { + cSlots_.makeImmutable(); + bitField0_ = (bitField0_ & ~0x00000020); + } + result.cSlots_ = cSlots_; + if (((bitField0_ & 0x00000040) != 0)) { + lSlots_.makeImmutable(); + bitField0_ = (bitField0_ & ~0x00000040); + } + result.lSlots_ = lSlots_; + if (((bitField0_ & 0x00000080) != 0)) { + sSlots_.makeImmutable(); + bitField0_ = (bitField0_ & ~0x00000080); + } + result.sSlots_ = sSlots_; + } + + private void buildPartial0(context.ContextOuterClass.Fiber result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.iD_ = iD_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.srcPort_ = srcPort_; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.dstPort_ = dstPort_; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.localPeerPort_ = localPeerPort_; + } + if (((from_bitField0_ & 0x00000010) != 0)) { + result.remotePeerPort_ = remotePeerPort_; + } + if (((from_bitField0_ & 0x00000100) != 0)) { + result.length_ = length_; + } + if (((from_bitField0_ & 0x00000200) != 0)) { + result.used_ = used_; + } + if (((from_bitField0_ & 0x00000400) != 0)) { + result.fiberUuid_ = fiberUuidBuilder_ == null ? fiberUuid_ : fiberUuidBuilder_.build(); + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof context.ContextOuterClass.Fiber) { + return mergeFrom((context.ContextOuterClass.Fiber) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(context.ContextOuterClass.Fiber other) { + if (other == context.ContextOuterClass.Fiber.getDefaultInstance()) + return this; + if (!other.getID().isEmpty()) { + iD_ = other.iD_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (!other.getSrcPort().isEmpty()) { + srcPort_ = other.srcPort_; + bitField0_ |= 0x00000002; + onChanged(); + } + if (!other.getDstPort().isEmpty()) { + dstPort_ = other.dstPort_; + bitField0_ |= 0x00000004; + onChanged(); + } + if (!other.getLocalPeerPort().isEmpty()) { + localPeerPort_ = other.localPeerPort_; + bitField0_ |= 0x00000008; + onChanged(); + } + if (!other.getRemotePeerPort().isEmpty()) { + remotePeerPort_ = other.remotePeerPort_; + bitField0_ |= 0x00000010; + onChanged(); + } + if (!other.cSlots_.isEmpty()) { + if (cSlots_.isEmpty()) { + cSlots_ = other.cSlots_; + bitField0_ = (bitField0_ & ~0x00000020); + } else { + ensureCSlotsIsMutable(); + cSlots_.addAll(other.cSlots_); + } + onChanged(); + } + if (!other.lSlots_.isEmpty()) { + if (lSlots_.isEmpty()) { + lSlots_ = other.lSlots_; + bitField0_ = (bitField0_ & ~0x00000040); + } else { + ensureLSlotsIsMutable(); + lSlots_.addAll(other.lSlots_); + } + onChanged(); + } + if (!other.sSlots_.isEmpty()) { + if (sSlots_.isEmpty()) { + sSlots_ = other.sSlots_; + bitField0_ = (bitField0_ & ~0x00000080); + } else { + ensureSSlotsIsMutable(); + sSlots_.addAll(other.sSlots_); + } + onChanged(); + } + if (other.getLength() != 0F) { + setLength(other.getLength()); + } + if (other.getUsed() != false) { + setUsed(other.getUsed()); + } + if (other.hasFiberUuid()) { + mergeFiberUuid(other.getFiberUuid()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + srcPort_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000002; + break; + } + // case 10 + case 18: + { + dstPort_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000004; + break; + } + // case 18 + case 26: + { + localPeerPort_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000008; + break; + } + // case 26 + case 34: + { + remotePeerPort_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000010; + break; + } + // case 34 + case 40: + { + int v = input.readInt32(); + ensureCSlotsIsMutable(); + cSlots_.addInt(v); + break; + } + // case 40 + case 42: + { + int length = input.readRawVarint32(); + int limit = input.pushLimit(length); + ensureCSlotsIsMutable(); + while (input.getBytesUntilLimit() > 0) { + cSlots_.addInt(input.readInt32()); + } + input.popLimit(limit); + break; + } + // case 42 + case 48: + { + int v = input.readInt32(); + ensureLSlotsIsMutable(); + lSlots_.addInt(v); + break; + } + // case 48 + case 50: + { + int length = input.readRawVarint32(); + int limit = input.pushLimit(length); + ensureLSlotsIsMutable(); + while (input.getBytesUntilLimit() > 0) { + lSlots_.addInt(input.readInt32()); + } + input.popLimit(limit); + break; + } + // case 50 + case 56: + { + int v = input.readInt32(); + ensureSSlotsIsMutable(); + sSlots_.addInt(v); + break; + } + // case 56 + case 58: + { + int length = input.readRawVarint32(); + int limit = input.pushLimit(length); + ensureSSlotsIsMutable(); + while (input.getBytesUntilLimit() > 0) { + sSlots_.addInt(input.readInt32()); + } + input.popLimit(limit); + break; + } + // case 58 + case 69: + { + length_ = input.readFloat(); + bitField0_ |= 0x00000100; + break; + } + // case 69 + case 72: + { + used_ = input.readBool(); + bitField0_ |= 0x00000200; + break; + } + // case 72 + case 82: + { + iD_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } + // case 82 + case 90: + { + input.readMessage(getFiberUuidFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000400; + break; + } + // case 90 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } + + private int bitField0_; + + private java.lang.Object iD_ = ""; + + /** + * string ID = 10; + * @return The iD. + */ + public java.lang.String getID() { + java.lang.Object ref = iD_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + iD_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string ID = 10; + * @return The bytes for iD. + */ + public com.google.protobuf.ByteString getIDBytes() { + java.lang.Object ref = iD_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + iD_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string ID = 10; + * @param value The iD to set. + * @return This builder for chaining. + */ + public Builder setID(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + iD_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * string ID = 10; + * @return This builder for chaining. + */ + public Builder clearID() { + iD_ = getDefaultInstance().getID(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + + /** + * string ID = 10; + * @param value The bytes for iD to set. + * @return This builder for chaining. + */ + public Builder setIDBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + iD_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private java.lang.Object srcPort_ = ""; + + /** + * string src_port = 1; + * @return The srcPort. + */ + public java.lang.String getSrcPort() { + java.lang.Object ref = srcPort_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + srcPort_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string src_port = 1; + * @return The bytes for srcPort. + */ + public com.google.protobuf.ByteString getSrcPortBytes() { + java.lang.Object ref = srcPort_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + srcPort_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string src_port = 1; + * @param value The srcPort to set. + * @return This builder for chaining. + */ + public Builder setSrcPort(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + srcPort_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * string src_port = 1; + * @return This builder for chaining. + */ + public Builder clearSrcPort() { + srcPort_ = getDefaultInstance().getSrcPort(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + + /** + * string src_port = 1; + * @param value The bytes for srcPort to set. + * @return This builder for chaining. + */ + public Builder setSrcPortBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + srcPort_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + private java.lang.Object dstPort_ = ""; + + /** + * string dst_port = 2; + * @return The dstPort. + */ + public java.lang.String getDstPort() { + java.lang.Object ref = dstPort_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + dstPort_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string dst_port = 2; + * @return The bytes for dstPort. + */ + public com.google.protobuf.ByteString getDstPortBytes() { + java.lang.Object ref = dstPort_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + dstPort_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string dst_port = 2; + * @param value The dstPort to set. + * @return This builder for chaining. + */ + public Builder setDstPort(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + dstPort_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + /** + * string dst_port = 2; + * @return This builder for chaining. + */ + public Builder clearDstPort() { + dstPort_ = getDefaultInstance().getDstPort(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + return this; + } + + /** + * string dst_port = 2; + * @param value The bytes for dstPort to set. + * @return This builder for chaining. + */ + public Builder setDstPortBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + dstPort_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + private java.lang.Object localPeerPort_ = ""; + + /** + * string local_peer_port = 3; + * @return The localPeerPort. + */ + public java.lang.String getLocalPeerPort() { + java.lang.Object ref = localPeerPort_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + localPeerPort_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string local_peer_port = 3; + * @return The bytes for localPeerPort. + */ + public com.google.protobuf.ByteString getLocalPeerPortBytes() { + java.lang.Object ref = localPeerPort_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + localPeerPort_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string local_peer_port = 3; + * @param value The localPeerPort to set. + * @return This builder for chaining. + */ + public Builder setLocalPeerPort(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + localPeerPort_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + + /** + * string local_peer_port = 3; + * @return This builder for chaining. + */ + public Builder clearLocalPeerPort() { + localPeerPort_ = getDefaultInstance().getLocalPeerPort(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + return this; + } + + /** + * string local_peer_port = 3; + * @param value The bytes for localPeerPort to set. + * @return This builder for chaining. + */ + public Builder setLocalPeerPortBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + localPeerPort_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + + private java.lang.Object remotePeerPort_ = ""; + + /** + * string remote_peer_port = 4; + * @return The remotePeerPort. + */ + public java.lang.String getRemotePeerPort() { + java.lang.Object ref = remotePeerPort_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + remotePeerPort_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string remote_peer_port = 4; + * @return The bytes for remotePeerPort. + */ + public com.google.protobuf.ByteString getRemotePeerPortBytes() { + java.lang.Object ref = remotePeerPort_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + remotePeerPort_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string remote_peer_port = 4; + * @param value The remotePeerPort to set. + * @return This builder for chaining. + */ + public Builder setRemotePeerPort(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + remotePeerPort_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + + /** + * string remote_peer_port = 4; + * @return This builder for chaining. + */ + public Builder clearRemotePeerPort() { + remotePeerPort_ = getDefaultInstance().getRemotePeerPort(); + bitField0_ = (bitField0_ & ~0x00000010); + onChanged(); + return this; + } + + /** + * string remote_peer_port = 4; + * @param value The bytes for remotePeerPort to set. + * @return This builder for chaining. + */ + public Builder setRemotePeerPortBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + remotePeerPort_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + + private com.google.protobuf.Internal.IntList cSlots_ = emptyIntList(); + + private void ensureCSlotsIsMutable() { + if (!((bitField0_ & 0x00000020) != 0)) { + cSlots_ = mutableCopy(cSlots_); + bitField0_ |= 0x00000020; + } + } + + /** + * repeated int32 c_slots = 5; + * @return A list containing the cSlots. + */ + public java.util.List getCSlotsList() { + return ((bitField0_ & 0x00000020) != 0) ? java.util.Collections.unmodifiableList(cSlots_) : cSlots_; + } + + /** + * repeated int32 c_slots = 5; + * @return The count of cSlots. + */ + public int getCSlotsCount() { + return cSlots_.size(); + } + + /** + * repeated int32 c_slots = 5; + * @param index The index of the element to return. + * @return The cSlots at the given index. + */ + public int getCSlots(int index) { + return cSlots_.getInt(index); + } + + /** + * repeated int32 c_slots = 5; + * @param index The index to set the value at. + * @param value The cSlots to set. + * @return This builder for chaining. + */ + public Builder setCSlots(int index, int value) { + ensureCSlotsIsMutable(); + cSlots_.setInt(index, value); + onChanged(); + return this; + } + + /** + * repeated int32 c_slots = 5; + * @param value The cSlots to add. + * @return This builder for chaining. + */ + public Builder addCSlots(int value) { + ensureCSlotsIsMutable(); + cSlots_.addInt(value); + onChanged(); + return this; + } + + /** + * repeated int32 c_slots = 5; + * @param values The cSlots to add. + * @return This builder for chaining. + */ + public Builder addAllCSlots(java.lang.Iterable values) { + ensureCSlotsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll(values, cSlots_); + onChanged(); + return this; + } + + /** + * repeated int32 c_slots = 5; + * @return This builder for chaining. + */ + public Builder clearCSlots() { + cSlots_ = emptyIntList(); + bitField0_ = (bitField0_ & ~0x00000020); + onChanged(); + return this; + } + + private com.google.protobuf.Internal.IntList lSlots_ = emptyIntList(); + + private void ensureLSlotsIsMutable() { + if (!((bitField0_ & 0x00000040) != 0)) { + lSlots_ = mutableCopy(lSlots_); + bitField0_ |= 0x00000040; + } + } + + /** + * repeated int32 l_slots = 6; + * @return A list containing the lSlots. + */ + public java.util.List getLSlotsList() { + return ((bitField0_ & 0x00000040) != 0) ? java.util.Collections.unmodifiableList(lSlots_) : lSlots_; + } + + /** + * repeated int32 l_slots = 6; + * @return The count of lSlots. + */ + public int getLSlotsCount() { + return lSlots_.size(); + } + + /** + * repeated int32 l_slots = 6; + * @param index The index of the element to return. + * @return The lSlots at the given index. + */ + public int getLSlots(int index) { + return lSlots_.getInt(index); + } + + /** + * repeated int32 l_slots = 6; + * @param index The index to set the value at. + * @param value The lSlots to set. + * @return This builder for chaining. + */ + public Builder setLSlots(int index, int value) { + ensureLSlotsIsMutable(); + lSlots_.setInt(index, value); + onChanged(); + return this; + } + + /** + * repeated int32 l_slots = 6; + * @param value The lSlots to add. + * @return This builder for chaining. + */ + public Builder addLSlots(int value) { + ensureLSlotsIsMutable(); + lSlots_.addInt(value); + onChanged(); + return this; + } + + /** + * repeated int32 l_slots = 6; + * @param values The lSlots to add. + * @return This builder for chaining. + */ + public Builder addAllLSlots(java.lang.Iterable values) { + ensureLSlotsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll(values, lSlots_); + onChanged(); + return this; + } + + /** + * repeated int32 l_slots = 6; + * @return This builder for chaining. + */ + public Builder clearLSlots() { + lSlots_ = emptyIntList(); + bitField0_ = (bitField0_ & ~0x00000040); + onChanged(); + return this; + } + + private com.google.protobuf.Internal.IntList sSlots_ = emptyIntList(); + + private void ensureSSlotsIsMutable() { + if (!((bitField0_ & 0x00000080) != 0)) { + sSlots_ = mutableCopy(sSlots_); + bitField0_ |= 0x00000080; + } + } + + /** + * repeated int32 s_slots = 7; + * @return A list containing the sSlots. + */ + public java.util.List getSSlotsList() { + return ((bitField0_ & 0x00000080) != 0) ? java.util.Collections.unmodifiableList(sSlots_) : sSlots_; + } + + /** + * repeated int32 s_slots = 7; + * @return The count of sSlots. + */ + public int getSSlotsCount() { + return sSlots_.size(); + } + + /** + * repeated int32 s_slots = 7; + * @param index The index of the element to return. + * @return The sSlots at the given index. + */ + public int getSSlots(int index) { + return sSlots_.getInt(index); + } + + /** + * repeated int32 s_slots = 7; + * @param index The index to set the value at. + * @param value The sSlots to set. + * @return This builder for chaining. + */ + public Builder setSSlots(int index, int value) { + ensureSSlotsIsMutable(); + sSlots_.setInt(index, value); + onChanged(); + return this; + } + + /** + * repeated int32 s_slots = 7; + * @param value The sSlots to add. + * @return This builder for chaining. + */ + public Builder addSSlots(int value) { + ensureSSlotsIsMutable(); + sSlots_.addInt(value); + onChanged(); + return this; + } + + /** + * repeated int32 s_slots = 7; + * @param values The sSlots to add. + * @return This builder for chaining. + */ + public Builder addAllSSlots(java.lang.Iterable values) { + ensureSSlotsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll(values, sSlots_); + onChanged(); + return this; + } + + /** + * repeated int32 s_slots = 7; + * @return This builder for chaining. + */ + public Builder clearSSlots() { + sSlots_ = emptyIntList(); + bitField0_ = (bitField0_ & ~0x00000080); + onChanged(); + return this; + } + + private float length_; + + /** + * float length = 8; + * @return The length. + */ + @java.lang.Override + public float getLength() { + return length_; + } + + /** + * float length = 8; + * @param value The length to set. + * @return This builder for chaining. + */ + public Builder setLength(float value) { + length_ = value; + bitField0_ |= 0x00000100; + onChanged(); + return this; + } + + /** + * float length = 8; + * @return This builder for chaining. + */ + public Builder clearLength() { + bitField0_ = (bitField0_ & ~0x00000100); + length_ = 0F; + onChanged(); + return this; + } + + private boolean used_; + + /** + * bool used = 9; + * @return The used. + */ + @java.lang.Override + public boolean getUsed() { + return used_; + } + + /** + * bool used = 9; + * @param value The used to set. + * @return This builder for chaining. + */ + public Builder setUsed(boolean value) { + used_ = value; + bitField0_ |= 0x00000200; + onChanged(); + return this; + } + + /** + * bool used = 9; + * @return This builder for chaining. + */ + public Builder clearUsed() { + bitField0_ = (bitField0_ & ~0x00000200); + used_ = false; + onChanged(); + return this; + } + + private context.ContextOuterClass.FiberId fiberUuid_; + + private com.google.protobuf.SingleFieldBuilderV3 fiberUuidBuilder_; + + /** + * .context.FiberId fiber_uuid = 11; + * @return Whether the fiberUuid field is set. + */ + public boolean hasFiberUuid() { + return ((bitField0_ & 0x00000400) != 0); + } + + /** + * .context.FiberId fiber_uuid = 11; + * @return The fiberUuid. + */ + public context.ContextOuterClass.FiberId getFiberUuid() { + if (fiberUuidBuilder_ == null) { + return fiberUuid_ == null ? context.ContextOuterClass.FiberId.getDefaultInstance() : fiberUuid_; + } else { + return fiberUuidBuilder_.getMessage(); + } + } + + /** + * .context.FiberId fiber_uuid = 11; + */ + public Builder setFiberUuid(context.ContextOuterClass.FiberId value) { + if (fiberUuidBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + fiberUuid_ = value; + } else { + fiberUuidBuilder_.setMessage(value); + } + bitField0_ |= 0x00000400; + onChanged(); + return this; + } + + /** + * .context.FiberId fiber_uuid = 11; + */ + public Builder setFiberUuid(context.ContextOuterClass.FiberId.Builder builderForValue) { + if (fiberUuidBuilder_ == null) { + fiberUuid_ = builderForValue.build(); + } else { + fiberUuidBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000400; + onChanged(); + return this; + } + + /** + * .context.FiberId fiber_uuid = 11; + */ + public Builder mergeFiberUuid(context.ContextOuterClass.FiberId value) { + if (fiberUuidBuilder_ == null) { + if (((bitField0_ & 0x00000400) != 0) && fiberUuid_ != null && fiberUuid_ != context.ContextOuterClass.FiberId.getDefaultInstance()) { + getFiberUuidBuilder().mergeFrom(value); + } else { + fiberUuid_ = value; + } + } else { + fiberUuidBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000400; + onChanged(); + return this; + } + + /** + * .context.FiberId fiber_uuid = 11; + */ + public Builder clearFiberUuid() { + bitField0_ = (bitField0_ & ~0x00000400); + fiberUuid_ = null; + if (fiberUuidBuilder_ != null) { + fiberUuidBuilder_.dispose(); + fiberUuidBuilder_ = null; + } + onChanged(); + return this; + } + + /** + * .context.FiberId fiber_uuid = 11; + */ + public context.ContextOuterClass.FiberId.Builder getFiberUuidBuilder() { + bitField0_ |= 0x00000400; + onChanged(); + return getFiberUuidFieldBuilder().getBuilder(); + } + + /** + * .context.FiberId fiber_uuid = 11; + */ + public context.ContextOuterClass.FiberIdOrBuilder getFiberUuidOrBuilder() { + if (fiberUuidBuilder_ != null) { + return fiberUuidBuilder_.getMessageOrBuilder(); + } else { + return fiberUuid_ == null ? context.ContextOuterClass.FiberId.getDefaultInstance() : fiberUuid_; + } + } + + /** + * .context.FiberId fiber_uuid = 11; + */ + private com.google.protobuf.SingleFieldBuilderV3 getFiberUuidFieldBuilder() { + if (fiberUuidBuilder_ == null) { + fiberUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getFiberUuid(), getParentForChildren(), isClean()); + fiberUuid_ = null; + } + return fiberUuidBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + // @@protoc_insertion_point(builder_scope:context.Fiber) + } + + // @@protoc_insertion_point(class_scope:context.Fiber) + private static final context.ContextOuterClass.Fiber DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new context.ContextOuterClass.Fiber(); + } + + public static context.ContextOuterClass.Fiber getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + + @java.lang.Override + public Fiber parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public context.ContextOuterClass.Fiber getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface OpticalLinkDetailsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLinkDetails) + com.google.protobuf.MessageOrBuilder { + + /** + * float length = 1; + * @return The length. + */ + float getLength(); + + /** + * string source = 2; + * @return The source. + */ + java.lang.String getSource(); + + /** + * string source = 2; + * @return The bytes for source. + */ + com.google.protobuf.ByteString getSourceBytes(); + + /** + * string target = 3; + * @return The target. + */ + java.lang.String getTarget(); + + /** + * string target = 3; + * @return The bytes for target. + */ + com.google.protobuf.ByteString getTargetBytes(); + + /** + * repeated .context.Fiber fibers = 4; + */ + java.util.List getFibersList(); + + /** + * repeated .context.Fiber fibers = 4; + */ + context.ContextOuterClass.Fiber getFibers(int index); + + /** + * repeated .context.Fiber fibers = 4; + */ + int getFibersCount(); + + /** + * repeated .context.Fiber fibers = 4; + */ + java.util.List getFibersOrBuilderList(); + + /** + * repeated .context.Fiber fibers = 4; + */ + context.ContextOuterClass.FiberOrBuilder getFibersOrBuilder(int index); + } + + /** + * Protobuf type {@code context.OpticalLinkDetails} + */ + public static final class OpticalLinkDetails extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalLinkDetails) + OpticalLinkDetailsOrBuilder { + + private static final long serialVersionUID = 0L; + + // Use OpticalLinkDetails.newBuilder() to construct. + private OpticalLinkDetails(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private OpticalLinkDetails() { + source_ = ""; + target_ = ""; + fibers_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new OpticalLinkDetails(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalLinkDetails_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalLinkDetails_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalLinkDetails.class, context.ContextOuterClass.OpticalLinkDetails.Builder.class); + } + + public static final int LENGTH_FIELD_NUMBER = 1; + + private float length_ = 0F; + + /** + * float length = 1; + * @return The length. + */ + @java.lang.Override + public float getLength() { + return length_; + } + + public static final int SOURCE_FIELD_NUMBER = 2; + + @SuppressWarnings("serial") + private volatile java.lang.Object source_ = ""; + + /** + * string source = 2; + * @return The source. + */ + @java.lang.Override + public java.lang.String getSource() { + java.lang.Object ref = source_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + source_ = s; + return s; + } + } + + /** + * string source = 2; + * @return The bytes for source. + */ + @java.lang.Override + public com.google.protobuf.ByteString getSourceBytes() { + java.lang.Object ref = source_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + source_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TARGET_FIELD_NUMBER = 3; + + @SuppressWarnings("serial") + private volatile java.lang.Object target_ = ""; + + /** + * string target = 3; + * @return The target. + */ + @java.lang.Override + public java.lang.String getTarget() { + java.lang.Object ref = target_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + target_ = s; + return s; + } + } + + /** + * string target = 3; + * @return The bytes for target. + */ + @java.lang.Override + public com.google.protobuf.ByteString getTargetBytes() { + java.lang.Object ref = target_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + target_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int FIBERS_FIELD_NUMBER = 4; + + @SuppressWarnings("serial") + private java.util.List fibers_; + + /** + * repeated .context.Fiber fibers = 4; + */ + @java.lang.Override + public java.util.List getFibersList() { + return fibers_; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + @java.lang.Override + public java.util.List getFibersOrBuilderList() { + return fibers_; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + @java.lang.Override + public int getFibersCount() { + return fibers_.size(); + } + + /** + * repeated .context.Fiber fibers = 4; + */ + @java.lang.Override + public context.ContextOuterClass.Fiber getFibers(int index) { + return fibers_.get(index); + } + + /** + * repeated .context.Fiber fibers = 4; + */ + @java.lang.Override + public context.ContextOuterClass.FiberOrBuilder getFibersOrBuilder(int index) { + return fibers_.get(index); + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (java.lang.Float.floatToRawIntBits(length_) != 0) { + output.writeFloat(1, length_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(source_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, source_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(target_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, target_); + } + for (int i = 0; i < fibers_.size(); i++) { + output.writeMessage(4, fibers_.get(i)); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + if (java.lang.Float.floatToRawIntBits(length_) != 0) { + size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, length_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(source_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, source_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(target_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, target_); + } + for (int i = 0; i < fibers_.size(); i++) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, fibers_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof context.ContextOuterClass.OpticalLinkDetails)) { + return super.equals(obj); + } + context.ContextOuterClass.OpticalLinkDetails other = (context.ContextOuterClass.OpticalLinkDetails) obj; + if (java.lang.Float.floatToIntBits(getLength()) != java.lang.Float.floatToIntBits(other.getLength())) + return false; + if (!getSource().equals(other.getSource())) + return false; + if (!getTarget().equals(other.getTarget())) + return false; + if (!getFibersList().equals(other.getFibersList())) + return false; + if (!getUnknownFields().equals(other.getUnknownFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + LENGTH_FIELD_NUMBER; + hash = (53 * hash) + java.lang.Float.floatToIntBits(getLength()); + hash = (37 * hash) + SOURCE_FIELD_NUMBER; + hash = (53 * hash) + getSource().hashCode(); + hash = (37 * hash) + TARGET_FIELD_NUMBER; + hash = (53 * hash) + getTarget().hashCode(); + if (getFibersCount() > 0) { + hash = (37 * hash) + FIBERS_FIELD_NUMBER; + hash = (53 * hash) + getFibersList().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(context.ContextOuterClass.OpticalLinkDetails prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code context.OpticalLinkDetails} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalLinkDetails) + context.ContextOuterClass.OpticalLinkDetailsOrBuilder { + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalLinkDetails_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalLinkDetails_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalLinkDetails.class, context.ContextOuterClass.OpticalLinkDetails.Builder.class); + } + + // Construct using context.ContextOuterClass.OpticalLinkDetails.newBuilder() + private Builder() { + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + length_ = 0F; + source_ = ""; + target_ = ""; + if (fibersBuilder_ == null) { + fibers_ = java.util.Collections.emptyList(); + } else { + fibers_ = null; + fibersBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return context.ContextOuterClass.internal_static_context_OpticalLinkDetails_descriptor; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLinkDetails getDefaultInstanceForType() { + return context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance(); + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLinkDetails build() { + context.ContextOuterClass.OpticalLinkDetails result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLinkDetails buildPartial() { + context.ContextOuterClass.OpticalLinkDetails result = new context.ContextOuterClass.OpticalLinkDetails(this); + buildPartialRepeatedFields(result); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartialRepeatedFields(context.ContextOuterClass.OpticalLinkDetails result) { + if (fibersBuilder_ == null) { + if (((bitField0_ & 0x00000008) != 0)) { + fibers_ = java.util.Collections.unmodifiableList(fibers_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.fibers_ = fibers_; + } else { + result.fibers_ = fibersBuilder_.build(); + } + } + + private void buildPartial0(context.ContextOuterClass.OpticalLinkDetails result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.length_ = length_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.source_ = source_; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.target_ = target_; + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof context.ContextOuterClass.OpticalLinkDetails) { + return mergeFrom((context.ContextOuterClass.OpticalLinkDetails) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(context.ContextOuterClass.OpticalLinkDetails other) { + if (other == context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance()) + return this; + if (other.getLength() != 0F) { + setLength(other.getLength()); + } + if (!other.getSource().isEmpty()) { + source_ = other.source_; + bitField0_ |= 0x00000002; + onChanged(); + } + if (!other.getTarget().isEmpty()) { + target_ = other.target_; + bitField0_ |= 0x00000004; + onChanged(); + } + if (fibersBuilder_ == null) { + if (!other.fibers_.isEmpty()) { + if (fibers_.isEmpty()) { + fibers_ = other.fibers_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureFibersIsMutable(); + fibers_.addAll(other.fibers_); + } + onChanged(); + } + } else { + if (!other.fibers_.isEmpty()) { + if (fibersBuilder_.isEmpty()) { + fibersBuilder_.dispose(); + fibersBuilder_ = null; + fibers_ = other.fibers_; + bitField0_ = (bitField0_ & ~0x00000008); + fibersBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getFibersFieldBuilder() : null; + } else { + fibersBuilder_.addAllMessages(other.fibers_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 13: + { + length_ = input.readFloat(); + bitField0_ |= 0x00000001; + break; + } + // case 13 + case 18: + { + source_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000002; + break; + } + // case 18 + case 26: + { + target_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000004; + break; + } + // case 26 + case 34: + { + context.ContextOuterClass.Fiber m = input.readMessage(context.ContextOuterClass.Fiber.parser(), extensionRegistry); + if (fibersBuilder_ == null) { + ensureFibersIsMutable(); + fibers_.add(m); + } else { + fibersBuilder_.addMessage(m); + } + break; + } + // case 34 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } + + private int bitField0_; + + private float length_; + + /** + * float length = 1; + * @return The length. + */ + @java.lang.Override + public float getLength() { + return length_; + } + + /** + * float length = 1; + * @param value The length to set. + * @return This builder for chaining. + */ + public Builder setLength(float value) { + length_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * float length = 1; + * @return This builder for chaining. + */ + public Builder clearLength() { + bitField0_ = (bitField0_ & ~0x00000001); + length_ = 0F; + onChanged(); + return this; + } + + private java.lang.Object source_ = ""; + + /** + * string source = 2; + * @return The source. + */ + public java.lang.String getSource() { + java.lang.Object ref = source_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + source_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string source = 2; + * @return The bytes for source. + */ + public com.google.protobuf.ByteString getSourceBytes() { + java.lang.Object ref = source_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + source_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string source = 2; + * @param value The source to set. + * @return This builder for chaining. + */ + public Builder setSource(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + source_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * string source = 2; + * @return This builder for chaining. + */ + public Builder clearSource() { + source_ = getDefaultInstance().getSource(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + + /** + * string source = 2; + * @param value The bytes for source to set. + * @return This builder for chaining. + */ + public Builder setSourceBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + source_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + private java.lang.Object target_ = ""; + + /** + * string target = 3; + * @return The target. + */ + public java.lang.String getTarget() { + java.lang.Object ref = target_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + target_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string target = 3; + * @return The bytes for target. + */ + public com.google.protobuf.ByteString getTargetBytes() { + java.lang.Object ref = target_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + target_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string target = 3; + * @param value The target to set. + * @return This builder for chaining. + */ + public Builder setTarget(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + target_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + /** + * string target = 3; + * @return This builder for chaining. + */ + public Builder clearTarget() { + target_ = getDefaultInstance().getTarget(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + return this; + } + + /** + * string target = 3; + * @param value The bytes for target to set. + * @return This builder for chaining. + */ + public Builder setTargetBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + target_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + private java.util.List fibers_ = java.util.Collections.emptyList(); + + private void ensureFibersIsMutable() { + if (!((bitField0_ & 0x00000008) != 0)) { + fibers_ = new java.util.ArrayList(fibers_); + bitField0_ |= 0x00000008; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3 fibersBuilder_; + + /** + * repeated .context.Fiber fibers = 4; + */ + public java.util.List getFibersList() { + if (fibersBuilder_ == null) { + return java.util.Collections.unmodifiableList(fibers_); + } else { + return fibersBuilder_.getMessageList(); + } + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public int getFibersCount() { + if (fibersBuilder_ == null) { + return fibers_.size(); + } else { + return fibersBuilder_.getCount(); + } + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public context.ContextOuterClass.Fiber getFibers(int index) { + if (fibersBuilder_ == null) { + return fibers_.get(index); + } else { + return fibersBuilder_.getMessage(index); + } + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder setFibers(int index, context.ContextOuterClass.Fiber value) { + if (fibersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFibersIsMutable(); + fibers_.set(index, value); + onChanged(); + } else { + fibersBuilder_.setMessage(index, value); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder setFibers(int index, context.ContextOuterClass.Fiber.Builder builderForValue) { + if (fibersBuilder_ == null) { + ensureFibersIsMutable(); + fibers_.set(index, builderForValue.build()); + onChanged(); + } else { + fibersBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder addFibers(context.ContextOuterClass.Fiber value) { + if (fibersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFibersIsMutable(); + fibers_.add(value); + onChanged(); + } else { + fibersBuilder_.addMessage(value); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder addFibers(int index, context.ContextOuterClass.Fiber value) { + if (fibersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFibersIsMutable(); + fibers_.add(index, value); + onChanged(); + } else { + fibersBuilder_.addMessage(index, value); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder addFibers(context.ContextOuterClass.Fiber.Builder builderForValue) { + if (fibersBuilder_ == null) { + ensureFibersIsMutable(); + fibers_.add(builderForValue.build()); + onChanged(); + } else { + fibersBuilder_.addMessage(builderForValue.build()); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder addFibers(int index, context.ContextOuterClass.Fiber.Builder builderForValue) { + if (fibersBuilder_ == null) { + ensureFibersIsMutable(); + fibers_.add(index, builderForValue.build()); + onChanged(); + } else { + fibersBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder addAllFibers(java.lang.Iterable values) { + if (fibersBuilder_ == null) { + ensureFibersIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll(values, fibers_); + onChanged(); + } else { + fibersBuilder_.addAllMessages(values); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder clearFibers() { + if (fibersBuilder_ == null) { + fibers_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + } else { + fibersBuilder_.clear(); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder removeFibers(int index) { + if (fibersBuilder_ == null) { + ensureFibersIsMutable(); + fibers_.remove(index); + onChanged(); + } else { + fibersBuilder_.remove(index); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public context.ContextOuterClass.Fiber.Builder getFibersBuilder(int index) { + return getFibersFieldBuilder().getBuilder(index); + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public context.ContextOuterClass.FiberOrBuilder getFibersOrBuilder(int index) { + if (fibersBuilder_ == null) { + return fibers_.get(index); + } else { + return fibersBuilder_.getMessageOrBuilder(index); + } + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public java.util.List getFibersOrBuilderList() { + if (fibersBuilder_ != null) { + return fibersBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(fibers_); + } + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public context.ContextOuterClass.Fiber.Builder addFibersBuilder() { + return getFibersFieldBuilder().addBuilder(context.ContextOuterClass.Fiber.getDefaultInstance()); + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public context.ContextOuterClass.Fiber.Builder addFibersBuilder(int index) { + return getFibersFieldBuilder().addBuilder(index, context.ContextOuterClass.Fiber.getDefaultInstance()); + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public java.util.List getFibersBuilderList() { + return getFibersFieldBuilder().getBuilderList(); + } + + private com.google.protobuf.RepeatedFieldBuilderV3 getFibersFieldBuilder() { + if (fibersBuilder_ == null) { + fibersBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(fibers_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean()); + fibers_ = null; + } + return fibersBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + // @@protoc_insertion_point(builder_scope:context.OpticalLinkDetails) + } + + // @@protoc_insertion_point(class_scope:context.OpticalLinkDetails) + private static final context.ContextOuterClass.OpticalLinkDetails DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new context.ContextOuterClass.OpticalLinkDetails(); + } + + public static context.ContextOuterClass.OpticalLinkDetails getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + + @java.lang.Override + public OpticalLinkDetails parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLinkDetails getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface OpticalLinkOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLink) + com.google.protobuf.MessageOrBuilder { + + /** + * string name = 1; + * @return The name. + */ + java.lang.String getName(); + + /** + * string name = 1; + * @return The bytes for name. + */ + com.google.protobuf.ByteString getNameBytes(); + + /** + * .context.OpticalLinkDetails details = 2; + * @return Whether the details field is set. + */ + boolean hasDetails(); + + /** + * .context.OpticalLinkDetails details = 2; + * @return The details. + */ + context.ContextOuterClass.OpticalLinkDetails getDetails(); + + /** + * .context.OpticalLinkDetails details = 2; + */ + context.ContextOuterClass.OpticalLinkDetailsOrBuilder getDetailsOrBuilder(); + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + * @return Whether the opticalLinkUuid field is set. + */ + boolean hasOpticalLinkUuid(); + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + * @return The opticalLinkUuid. + */ + context.ContextOuterClass.OpticalLinkId getOpticalLinkUuid(); + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + context.ContextOuterClass.OpticalLinkIdOrBuilder getOpticalLinkUuidOrBuilder(); + } + + /** + * Protobuf type {@code context.OpticalLink} + */ + public static final class OpticalLink extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalLink) + OpticalLinkOrBuilder { + + private static final long serialVersionUID = 0L; + + // Use OpticalLink.newBuilder() to construct. + private OpticalLink(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private OpticalLink() { + name_ = ""; + } + + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new OpticalLink(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalLink_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalLink_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalLink.class, context.ContextOuterClass.OpticalLink.Builder.class); + } + + public static final int NAME_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private volatile java.lang.Object name_ = ""; + + /** + * string name = 1; + * @return The name. + */ + @java.lang.Override + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } + } + + /** + * string name = 1; + * @return The bytes for name. + */ + @java.lang.Override + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int DETAILS_FIELD_NUMBER = 2; + + private context.ContextOuterClass.OpticalLinkDetails details_; + + /** + * .context.OpticalLinkDetails details = 2; + * @return Whether the details field is set. + */ + @java.lang.Override + public boolean hasDetails() { + return details_ != null; + } + + /** + * .context.OpticalLinkDetails details = 2; + * @return The details. + */ + @java.lang.Override + public context.ContextOuterClass.OpticalLinkDetails getDetails() { + return details_ == null ? context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance() : details_; + } + + /** + * .context.OpticalLinkDetails details = 2; + */ + @java.lang.Override + public context.ContextOuterClass.OpticalLinkDetailsOrBuilder getDetailsOrBuilder() { + return details_ == null ? context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance() : details_; + } + + public static final int OPTICAL_LINK_UUID_FIELD_NUMBER = 3; + + private context.ContextOuterClass.OpticalLinkId opticalLinkUuid_; + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + * @return Whether the opticalLinkUuid field is set. + */ + @java.lang.Override + public boolean hasOpticalLinkUuid() { + return opticalLinkUuid_ != null; + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + * @return The opticalLinkUuid. + */ + @java.lang.Override + public context.ContextOuterClass.OpticalLinkId getOpticalLinkUuid() { + return opticalLinkUuid_ == null ? context.ContextOuterClass.OpticalLinkId.getDefaultInstance() : opticalLinkUuid_; + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + @java.lang.Override + public context.ContextOuterClass.OpticalLinkIdOrBuilder getOpticalLinkUuidOrBuilder() { + return opticalLinkUuid_ == null ? context.ContextOuterClass.OpticalLinkId.getDefaultInstance() : opticalLinkUuid_; + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_); + } + if (details_ != null) { + output.writeMessage(2, getDetails()); + } + if (opticalLinkUuid_ != null) { + output.writeMessage(3, getOpticalLinkUuid()); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_); + } + if (details_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getDetails()); + } + if (opticalLinkUuid_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getOpticalLinkUuid()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof context.ContextOuterClass.OpticalLink)) { + return super.equals(obj); + } + context.ContextOuterClass.OpticalLink other = (context.ContextOuterClass.OpticalLink) obj; + if (!getName().equals(other.getName())) + return false; + if (hasDetails() != other.hasDetails()) + return false; + if (hasDetails()) { + if (!getDetails().equals(other.getDetails())) + return false; + } + if (hasOpticalLinkUuid() != other.hasOpticalLinkUuid()) + return false; + if (hasOpticalLinkUuid()) { + if (!getOpticalLinkUuid().equals(other.getOpticalLinkUuid())) + return false; + } + if (!getUnknownFields().equals(other.getUnknownFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + if (hasDetails()) { + hash = (37 * hash) + DETAILS_FIELD_NUMBER; + hash = (53 * hash) + getDetails().hashCode(); + } + if (hasOpticalLinkUuid()) { + hash = (37 * hash) + OPTICAL_LINK_UUID_FIELD_NUMBER; + hash = (53 * hash) + getOpticalLinkUuid().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static context.ContextOuterClass.OpticalLink parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLink parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLink parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(context.ContextOuterClass.OpticalLink prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code context.OpticalLink} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalLink) + context.ContextOuterClass.OpticalLinkOrBuilder { + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalLink_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalLink_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalLink.class, context.ContextOuterClass.OpticalLink.Builder.class); + } + + // Construct using context.ContextOuterClass.OpticalLink.newBuilder() + private Builder() { + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + name_ = ""; + details_ = null; + if (detailsBuilder_ != null) { + detailsBuilder_.dispose(); + detailsBuilder_ = null; + } + opticalLinkUuid_ = null; + if (opticalLinkUuidBuilder_ != null) { + opticalLinkUuidBuilder_.dispose(); + opticalLinkUuidBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return context.ContextOuterClass.internal_static_context_OpticalLink_descriptor; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLink getDefaultInstanceForType() { + return context.ContextOuterClass.OpticalLink.getDefaultInstance(); + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLink build() { + context.ContextOuterClass.OpticalLink result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLink buildPartial() { + context.ContextOuterClass.OpticalLink result = new context.ContextOuterClass.OpticalLink(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(context.ContextOuterClass.OpticalLink result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.name_ = name_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.details_ = detailsBuilder_ == null ? details_ : detailsBuilder_.build(); + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.opticalLinkUuid_ = opticalLinkUuidBuilder_ == null ? opticalLinkUuid_ : opticalLinkUuidBuilder_.build(); + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof context.ContextOuterClass.OpticalLink) { + return mergeFrom((context.ContextOuterClass.OpticalLink) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(context.ContextOuterClass.OpticalLink other) { + if (other == context.ContextOuterClass.OpticalLink.getDefaultInstance()) + return this; + if (!other.getName().isEmpty()) { + name_ = other.name_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.hasDetails()) { + mergeDetails(other.getDetails()); + } + if (other.hasOpticalLinkUuid()) { + mergeOpticalLinkUuid(other.getOpticalLinkUuid()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + name_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } + // case 10 + case 18: + { + input.readMessage(getDetailsFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000002; + break; + } + // case 18 + case 26: + { + input.readMessage(getOpticalLinkUuidFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000004; + break; + } + // case 26 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } + + private int bitField0_; + + private java.lang.Object name_ = ""; + + /** + * string name = 1; + * @return The name. + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string name = 1; + * @return The bytes for name. + */ + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string name = 1; + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + name_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * string name = 1; + * @return This builder for chaining. + */ + public Builder clearName() { + name_ = getDefaultInstance().getName(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + + /** + * string name = 1; + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + name_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private context.ContextOuterClass.OpticalLinkDetails details_; + + private com.google.protobuf.SingleFieldBuilderV3 detailsBuilder_; + + /** + * .context.OpticalLinkDetails details = 2; + * @return Whether the details field is set. + */ + public boolean hasDetails() { + return ((bitField0_ & 0x00000002) != 0); + } + + /** + * .context.OpticalLinkDetails details = 2; + * @return The details. + */ + public context.ContextOuterClass.OpticalLinkDetails getDetails() { + if (detailsBuilder_ == null) { + return details_ == null ? context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance() : details_; + } else { + return detailsBuilder_.getMessage(); + } + } + + /** + * .context.OpticalLinkDetails details = 2; + */ + public Builder setDetails(context.ContextOuterClass.OpticalLinkDetails value) { + if (detailsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + details_ = value; + } else { + detailsBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * .context.OpticalLinkDetails details = 2; + */ + public Builder setDetails(context.ContextOuterClass.OpticalLinkDetails.Builder builderForValue) { + if (detailsBuilder_ == null) { + details_ = builderForValue.build(); + } else { + detailsBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * .context.OpticalLinkDetails details = 2; + */ + public Builder mergeDetails(context.ContextOuterClass.OpticalLinkDetails value) { + if (detailsBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) && details_ != null && details_ != context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance()) { + getDetailsBuilder().mergeFrom(value); + } else { + details_ = value; + } + } else { + detailsBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * .context.OpticalLinkDetails details = 2; + */ + public Builder clearDetails() { + bitField0_ = (bitField0_ & ~0x00000002); + details_ = null; + if (detailsBuilder_ != null) { + detailsBuilder_.dispose(); + detailsBuilder_ = null; + } + onChanged(); + return this; + } + + /** + * .context.OpticalLinkDetails details = 2; + */ + public context.ContextOuterClass.OpticalLinkDetails.Builder getDetailsBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getDetailsFieldBuilder().getBuilder(); + } + + /** + * .context.OpticalLinkDetails details = 2; + */ + public context.ContextOuterClass.OpticalLinkDetailsOrBuilder getDetailsOrBuilder() { + if (detailsBuilder_ != null) { + return detailsBuilder_.getMessageOrBuilder(); + } else { + return details_ == null ? context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance() : details_; + } + } + + /** + * .context.OpticalLinkDetails details = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3 getDetailsFieldBuilder() { + if (detailsBuilder_ == null) { + detailsBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getDetails(), getParentForChildren(), isClean()); + details_ = null; + } + return detailsBuilder_; + } + + private context.ContextOuterClass.OpticalLinkId opticalLinkUuid_; + + private com.google.protobuf.SingleFieldBuilderV3 opticalLinkUuidBuilder_; + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + * @return Whether the opticalLinkUuid field is set. + */ + public boolean hasOpticalLinkUuid() { + return ((bitField0_ & 0x00000004) != 0); + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + * @return The opticalLinkUuid. + */ + public context.ContextOuterClass.OpticalLinkId getOpticalLinkUuid() { + if (opticalLinkUuidBuilder_ == null) { + return opticalLinkUuid_ == null ? context.ContextOuterClass.OpticalLinkId.getDefaultInstance() : opticalLinkUuid_; + } else { + return opticalLinkUuidBuilder_.getMessage(); + } + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + public Builder setOpticalLinkUuid(context.ContextOuterClass.OpticalLinkId value) { + if (opticalLinkUuidBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + opticalLinkUuid_ = value; + } else { + opticalLinkUuidBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + public Builder setOpticalLinkUuid(context.ContextOuterClass.OpticalLinkId.Builder builderForValue) { + if (opticalLinkUuidBuilder_ == null) { + opticalLinkUuid_ = builderForValue.build(); + } else { + opticalLinkUuidBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + public Builder mergeOpticalLinkUuid(context.ContextOuterClass.OpticalLinkId value) { + if (opticalLinkUuidBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0) && opticalLinkUuid_ != null && opticalLinkUuid_ != context.ContextOuterClass.OpticalLinkId.getDefaultInstance()) { + getOpticalLinkUuidBuilder().mergeFrom(value); + } else { + opticalLinkUuid_ = value; + } + } else { + opticalLinkUuidBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + public Builder clearOpticalLinkUuid() { + bitField0_ = (bitField0_ & ~0x00000004); + opticalLinkUuid_ = null; + if (opticalLinkUuidBuilder_ != null) { + opticalLinkUuidBuilder_.dispose(); + opticalLinkUuidBuilder_ = null; + } + onChanged(); + return this; + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + public context.ContextOuterClass.OpticalLinkId.Builder getOpticalLinkUuidBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getOpticalLinkUuidFieldBuilder().getBuilder(); + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + public context.ContextOuterClass.OpticalLinkIdOrBuilder getOpticalLinkUuidOrBuilder() { + if (opticalLinkUuidBuilder_ != null) { + return opticalLinkUuidBuilder_.getMessageOrBuilder(); + } else { + return opticalLinkUuid_ == null ? context.ContextOuterClass.OpticalLinkId.getDefaultInstance() : opticalLinkUuid_; + } + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + private com.google.protobuf.SingleFieldBuilderV3 getOpticalLinkUuidFieldBuilder() { + if (opticalLinkUuidBuilder_ == null) { + opticalLinkUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getOpticalLinkUuid(), getParentForChildren(), isClean()); + opticalLinkUuid_ = null; + } + return opticalLinkUuidBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + // @@protoc_insertion_point(builder_scope:context.OpticalLink) + } + + // @@protoc_insertion_point(class_scope:context.OpticalLink) + private static final context.ContextOuterClass.OpticalLink DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new context.ContextOuterClass.OpticalLink(); + } + + public static context.ContextOuterClass.OpticalLink getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + + @java.lang.Override + public OpticalLink parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLink getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Empty_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Empty_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Uuid_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Uuid_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Timestamp_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Timestamp_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Event_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Event_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ContextId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ContextId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Context_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Context_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ContextIdList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ContextIdList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ContextList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ContextList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ContextEvent_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ContextEvent_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Topology_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Topology_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyDetails_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyDetails_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyIdList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyIdList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyEvent_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyEvent_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Device_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Device_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Component_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Component_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Component_AttributesEntry_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Component_AttributesEntry_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceConfig_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceConfig_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceIdList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceIdList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceFilter_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceFilter_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceEvent_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceEvent_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkAttributes_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkAttributes_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Link_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Link_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkIdList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkIdList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkEvent_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkEvent_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Service_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Service_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceStatus_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceStatus_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceConfig_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceConfig_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceIdList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceIdList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceFilter_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceFilter_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceEvent_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceEvent_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Slice_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Slice_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceOwner_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceOwner_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceStatus_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceStatus_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceConfig_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceConfig_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceIdList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceIdList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceFilter_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceFilter_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceEvent_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceEvent_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ConnectionId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ConnectionId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ConnectionSettings_L0_descriptor; private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ConnectionSettings_L0_fieldAccessorTable; @@ -69611,6 +76651,38 @@ public final class ContextOuterClass { private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_AuthenticationResult_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_OpticalConfigId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_OpticalConfigId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_OpticalConfig_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_OpticalConfig_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_OpticalConfigList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_OpticalConfigList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_OpticalLinkId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_OpticalLinkId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_FiberId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_FiberId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Fiber_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Fiber_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_OpticalLinkDetails_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_OpticalLinkDetails_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_OpticalLink_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_OpticalLink_fieldAccessorTable; + public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { return descriptor; } @@ -69618,7 +76690,7 @@ public final class ContextOuterClass { private static com.google.protobuf.Descriptors.FileDescriptor descriptor; static { - java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\tacl.proto\032\026kpi" + "_sample_types.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004" + "uuid\030\001 \001(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001" + "(\001\"Z\n\005Event\022%\n\ttimestamp\030\001 \001(\0132\022.context" + ".Timestamp\022*\n\nevent_type\030\002 \001(\0162\026.context" + ".EventTypeEnum\"0\n\tContextId\022#\n\014context_u" + "uid\030\001 \001(\0132\r.context.Uuid\"\351\001\n\007Context\022&\n\n" + "context_id\030\001 \001(\0132\022.context.ContextId\022\014\n\004" + "name\030\002 \001(\t\022)\n\014topology_ids\030\003 \003(\0132\023.conte" + "xt.TopologyId\022\'\n\013service_ids\030\004 \003(\0132\022.con" + "text.ServiceId\022#\n\tslice_ids\030\005 \003(\0132\020.cont" + "ext.SliceId\022/\n\ncontroller\030\006 \001(\0132\033.contex" + "t.TeraFlowController\"8\n\rContextIdList\022\'\n" + "\013context_ids\030\001 \003(\0132\022.context.ContextId\"1" + "\n\013ContextList\022\"\n\010contexts\030\001 \003(\0132\020.contex" + "t.Context\"U\n\014ContextEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022&\n\ncontext_id\030\002 \001(\0132\022.c" + "ontext.ContextId\"Z\n\nTopologyId\022&\n\ncontex" + "t_id\030\001 \001(\0132\022.context.ContextId\022$\n\rtopolo" + "gy_uuid\030\002 \001(\0132\r.context.Uuid\"\214\001\n\010Topolog" + "y\022(\n\013topology_id\030\001 \001(\0132\023.context.Topolog" + "yId\022\014\n\004name\030\002 \001(\t\022%\n\ndevice_ids\030\003 \003(\0132\021." + "context.DeviceId\022!\n\010link_ids\030\004 \003(\0132\017.con" + "text.LinkId\"\211\001\n\017TopologyDetails\022(\n\013topol" + "ogy_id\030\001 \001(\0132\023.context.TopologyId\022\014\n\004nam" + "e\030\002 \001(\t\022 \n\007devices\030\003 \003(\0132\017.context.Devic" + "e\022\034\n\005links\030\004 \003(\0132\r.context.Link\";\n\016Topol" + "ogyIdList\022)\n\014topology_ids\030\001 \003(\0132\023.contex" + "t.TopologyId\"5\n\014TopologyList\022%\n\ntopologi" + "es\030\001 \003(\0132\021.context.Topology\"X\n\rTopologyE" + "vent\022\035\n\005event\030\001 \001(\0132\016.context.Event\022(\n\013t" + "opology_id\030\002 \001(\0132\023.context.TopologyId\".\n" + "\010DeviceId\022\"\n\013device_uuid\030\001 \001(\0132\r.context" + ".Uuid\"\372\002\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.co" + "ntext.DeviceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_t" + "ype\030\003 \001(\t\022,\n\rdevice_config\030\004 \001(\0132\025.conte" + "xt.DeviceConfig\022G\n\031device_operational_st" + "atus\030\005 \001(\0162$.context.DeviceOperationalSt" + "atusEnum\0221\n\016device_drivers\030\006 \003(\0162\031.conte" + "xt.DeviceDriverEnum\022+\n\020device_endpoints\030" + "\007 \003(\0132\021.context.EndPoint\022&\n\ncomponents\030\010" + " \003(\0132\022.context.Component\022(\n\rcontroller_i" + "d\030\t \001(\0132\021.context.DeviceId\"\311\001\n\tComponent" + "\022%\n\016component_uuid\030\001 \001(\0132\r.context.Uuid\022" + "\014\n\004name\030\002 \001(\t\022\014\n\004type\030\003 \001(\t\0226\n\nattribute" + "s\030\004 \003(\0132\".context.Component.AttributesEn" + "try\022\016\n\006parent\030\005 \001(\t\0321\n\017AttributesEntry\022\013" + "\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"9\n\014Device" + "Config\022)\n\014config_rules\030\001 \003(\0132\023.context.C" + "onfigRule\"5\n\014DeviceIdList\022%\n\ndevice_ids\030" + "\001 \003(\0132\021.context.DeviceId\".\n\nDeviceList\022 " + "\n\007devices\030\001 \003(\0132\017.context.Device\"\216\001\n\014Dev" + "iceFilter\022)\n\ndevice_ids\030\001 \001(\0132\025.context." + "DeviceIdList\022\031\n\021include_endpoints\030\002 \001(\010\022" + "\034\n\024include_config_rules\030\003 \001(\010\022\032\n\022include" + "_components\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005eve" + "nt\030\001 \001(\0132\016.context.Event\022$\n\tdevice_id\030\002 " + "\001(\0132\021.context.DeviceId\022,\n\rdevice_config\030" + "\003 \001(\0132\025.context.DeviceConfig\"*\n\006LinkId\022 " + "\n\tlink_uuid\030\001 \001(\0132\r.context.Uuid\"I\n\016Link" + "Attributes\022\033\n\023total_capacity_gbps\030\001 \001(\002\022" + "\032\n\022used_capacity_gbps\030\002 \001(\002\"\223\001\n\004Link\022 \n\007" + "link_id\030\001 \001(\0132\017.context.LinkId\022\014\n\004name\030\002" + " \001(\t\022.\n\021link_endpoint_ids\030\003 \003(\0132\023.contex" + "t.EndPointId\022+\n\nattributes\030\004 \001(\0132\027.conte" + "xt.LinkAttributes\"/\n\nLinkIdList\022!\n\010link_" + "ids\030\001 \003(\0132\017.context.LinkId\"(\n\010LinkList\022\034" + "\n\005links\030\001 \003(\0132\r.context.Link\"L\n\tLinkEven" + "t\022\035\n\005event\030\001 \001(\0132\016.context.Event\022 \n\007link" + "_id\030\002 \001(\0132\017.context.LinkId\"X\n\tServiceId\022" + "&\n\ncontext_id\030\001 \001(\0132\022.context.ContextId\022" + "#\n\014service_uuid\030\002 \001(\0132\r.context.Uuid\"\333\002\n" + "\007Service\022&\n\nservice_id\030\001 \001(\0132\022.context.S" + "erviceId\022\014\n\004name\030\002 \001(\t\022.\n\014service_type\030\003" + " \001(\0162\030.context.ServiceTypeEnum\0221\n\024servic" + "e_endpoint_ids\030\004 \003(\0132\023.context.EndPointI" + "d\0220\n\023service_constraints\030\005 \003(\0132\023.context" + ".Constraint\022.\n\016service_status\030\006 \001(\0132\026.co" + "ntext.ServiceStatus\022.\n\016service_config\030\007 " + "\001(\0132\026.context.ServiceConfig\022%\n\ttimestamp" + "\030\010 \001(\0132\022.context.Timestamp\"C\n\rServiceSta" + "tus\0222\n\016service_status\030\001 \001(\0162\032.context.Se" + "rviceStatusEnum\":\n\rServiceConfig\022)\n\014conf" + "ig_rules\030\001 \003(\0132\023.context.ConfigRule\"8\n\rS" + "erviceIdList\022\'\n\013service_ids\030\001 \003(\0132\022.cont" + "ext.ServiceId\"1\n\013ServiceList\022\"\n\010services" + "\030\001 \003(\0132\020.context.Service\"\225\001\n\rServiceFilt" + "er\022+\n\013service_ids\030\001 \001(\0132\026.context.Servic" + "eIdList\022\034\n\024include_endpoint_ids\030\002 \001(\010\022\033\n" + "\023include_constraints\030\003 \001(\010\022\034\n\024include_co" + "nfig_rules\030\004 \001(\010\"U\n\014ServiceEvent\022\035\n\005even" + "t\030\001 \001(\0132\016.context.Event\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\"T\n\007SliceId\022&\n\nco" + "ntext_id\030\001 \001(\0132\022.context.ContextId\022!\n\nsl" + "ice_uuid\030\002 \001(\0132\r.context.Uuid\"\240\003\n\005Slice\022" + "\"\n\010slice_id\030\001 \001(\0132\020.context.SliceId\022\014\n\004n" + "ame\030\002 \001(\t\022/\n\022slice_endpoint_ids\030\003 \003(\0132\023." + "context.EndPointId\022.\n\021slice_constraints\030" + "\004 \003(\0132\023.context.Constraint\022-\n\021slice_serv" + "ice_ids\030\005 \003(\0132\022.context.ServiceId\022,\n\022sli" + "ce_subslice_ids\030\006 \003(\0132\020.context.SliceId\022" + "*\n\014slice_status\030\007 \001(\0132\024.context.SliceSta" + "tus\022*\n\014slice_config\030\010 \001(\0132\024.context.Slic" + "eConfig\022(\n\013slice_owner\030\t \001(\0132\023.context.S" + "liceOwner\022%\n\ttimestamp\030\n \001(\0132\022.context.T" + "imestamp\"E\n\nSliceOwner\022!\n\nowner_uuid\030\001 \001" + "(\0132\r.context.Uuid\022\024\n\014owner_string\030\002 \001(\t\"" + "=\n\013SliceStatus\022.\n\014slice_status\030\001 \001(\0162\030.c" + "ontext.SliceStatusEnum\"8\n\013SliceConfig\022)\n" + "\014config_rules\030\001 \003(\0132\023.context.ConfigRule" + "\"2\n\013SliceIdList\022#\n\tslice_ids\030\001 \003(\0132\020.con" + "text.SliceId\"+\n\tSliceList\022\036\n\006slices\030\001 \003(" + "\0132\016.context.Slice\"\312\001\n\013SliceFilter\022\'\n\tsli" + "ce_ids\030\001 \001(\0132\024.context.SliceIdList\022\034\n\024in" + "clude_endpoint_ids\030\002 \001(\010\022\033\n\023include_cons" + "traints\030\003 \001(\010\022\033\n\023include_service_ids\030\004 \001" + "(\010\022\034\n\024include_subslice_ids\030\005 \001(\010\022\034\n\024incl" + "ude_config_rules\030\006 \001(\010\"O\n\nSliceEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022\"\n\010slice_id\030" + "\002 \001(\0132\020.context.SliceId\"6\n\014ConnectionId\022" + "&\n\017connection_uuid\030\001 \001(\0132\r.context.Uuid\"" + "2\n\025ConnectionSettings_L0\022\031\n\021lsp_symbolic" + "_name\030\001 \001(\t\"\236\001\n\025ConnectionSettings_L2\022\027\n" + "\017src_mac_address\030\001 \001(\t\022\027\n\017dst_mac_addres" + "s\030\002 \001(\t\022\022\n\nether_type\030\003 \001(\r\022\017\n\007vlan_id\030\004" + " \001(\r\022\022\n\nmpls_label\030\005 \001(\r\022\032\n\022mpls_traffic" + "_class\030\006 \001(\r\"t\n\025ConnectionSettings_L3\022\026\n" + "\016src_ip_address\030\001 \001(\t\022\026\n\016dst_ip_address\030" + "\002 \001(\t\022\014\n\004dscp\030\003 \001(\r\022\020\n\010protocol\030\004 \001(\r\022\013\n" + "\003ttl\030\005 \001(\r\"[\n\025ConnectionSettings_L4\022\020\n\010s" + "rc_port\030\001 \001(\r\022\020\n\010dst_port\030\002 \001(\r\022\021\n\ttcp_f" + "lags\030\003 \001(\r\022\013\n\003ttl\030\004 \001(\r\"\304\001\n\022ConnectionSe" + "ttings\022*\n\002l0\030\001 \001(\0132\036.context.ConnectionS" + "ettings_L0\022*\n\002l2\030\002 \001(\0132\036.context.Connect" + "ionSettings_L2\022*\n\002l3\030\003 \001(\0132\036.context.Con" + "nectionSettings_L3\022*\n\002l4\030\004 \001(\0132\036.context" + ".ConnectionSettings_L4\"\363\001\n\nConnection\022,\n" + "\rconnection_id\030\001 \001(\0132\025.context.Connectio" + "nId\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\0223\n\026path_hops_endpoint_ids\030\003 \003(\0132\023.co" + "ntext.EndPointId\022+\n\017sub_service_ids\030\004 \003(" + "\0132\022.context.ServiceId\022-\n\010settings\030\005 \001(\0132" + "\033.context.ConnectionSettings\"A\n\020Connecti" + "onIdList\022-\n\016connection_ids\030\001 \003(\0132\025.conte" + "xt.ConnectionId\":\n\016ConnectionList\022(\n\013con" + "nections\030\001 \003(\0132\023.context.Connection\"^\n\017C" + "onnectionEvent\022\035\n\005event\030\001 \001(\0132\016.context." + "Event\022,\n\rconnection_id\030\002 \001(\0132\025.context.C" + "onnectionId\"\202\001\n\nEndPointId\022(\n\013topology_i" + "d\030\001 \001(\0132\023.context.TopologyId\022$\n\tdevice_i" + "d\030\002 \001(\0132\021.context.DeviceId\022$\n\rendpoint_u" + "uid\030\003 \001(\0132\r.context.Uuid\"\302\001\n\010EndPoint\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "\014\n\004name\030\002 \001(\t\022\025\n\rendpoint_type\030\003 \001(\t\0229\n\020" + "kpi_sample_types\030\004 \003(\0162\037.kpi_sample_type" + "s.KpiSampleType\022,\n\021endpoint_location\030\005 \001" + "(\0132\021.context.Location\"{\n\014EndPointName\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "\023\n\013device_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 " + "\001(\t\022\025\n\rendpoint_type\030\004 \001(\t\";\n\016EndPointId" + "List\022)\n\014endpoint_ids\030\001 \003(\0132\023.context.End" + "PointId\"A\n\020EndPointNameList\022-\n\016endpoint_" + "names\030\001 \003(\0132\025.context.EndPointName\"A\n\021Co" + "nfigRule_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n" + "\016resource_value\030\002 \001(\t\"]\n\016ConfigRule_ACL\022" + "(\n\013endpoint_id\030\001 \001(\0132\023.context.EndPointI" + "d\022!\n\010rule_set\030\002 \001(\0132\017.acl.AclRuleSet\"\234\001\n" + "\nConfigRule\022)\n\006action\030\001 \001(\0162\031.context.Co" + "nfigActionEnum\022,\n\006custom\030\002 \001(\0132\032.context" + ".ConfigRule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.cont" + "ext.ConfigRule_ACLH\000B\r\n\013config_rule\"F\n\021C" + "onstraint_Custom\022\027\n\017constraint_type\030\001 \001(" + "\t\022\030\n\020constraint_value\030\002 \001(\t\"E\n\023Constrain" + "t_Schedule\022\027\n\017start_timestamp\030\001 \001(\002\022\025\n\rd" + "uration_days\030\002 \001(\002\"3\n\014GPS_Position\022\020\n\010la" + "titude\030\001 \001(\002\022\021\n\tlongitude\030\002 \001(\002\"W\n\010Locat" + "ion\022\020\n\006region\030\001 \001(\tH\000\022-\n\014gps_position\030\002 " + "\001(\0132\025.context.GPS_PositionH\000B\n\n\010location" + "\"l\n\033Constraint_EndPointLocation\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022#\n\010loc" + "ation\030\002 \001(\0132\021.context.Location\"Y\n\033Constr" + "aint_EndPointPriority\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022\020\n\010priority\030\002 \001(" + "\r\"0\n\026Constraint_SLA_Latency\022\026\n\016e2e_laten" + "cy_ms\030\001 \001(\002\"0\n\027Constraint_SLA_Capacity\022\025" + "\n\rcapacity_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_" + "Availability\022\032\n\022num_disjoint_paths\030\001 \001(\r" + "\022\022\n\nall_active\030\002 \001(\010\022\024\n\014availability\030\003 \001" + "(\002\"V\n\036Constraint_SLA_Isolation_level\0224\n\017" + "isolation_level\030\001 \003(\0162\033.context.Isolatio" + "nLevelEnum\"\242\001\n\025Constraint_Exclusions\022\024\n\014" + "is_permanent\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021" + ".context.DeviceId\022)\n\014endpoint_ids\030\003 \003(\0132" + "\023.context.EndPointId\022!\n\010link_ids\030\004 \003(\0132\017" + ".context.LinkId\"\333\004\n\nConstraint\022-\n\006action" + "\030\001 \001(\0162\035.context.ConstraintActionEnum\022,\n" + "\006custom\030\002 \001(\0132\032.context.Constraint_Custo" + "mH\000\0220\n\010schedule\030\003 \001(\0132\034.context.Constrai" + "nt_ScheduleH\000\022A\n\021endpoint_location\030\004 \001(\013" + "2$.context.Constraint_EndPointLocationH\000" + "\022A\n\021endpoint_priority\030\005 \001(\0132$.context.Co" + "nstraint_EndPointPriorityH\000\0228\n\014sla_capac" + "ity\030\006 \001(\0132 .context.Constraint_SLA_Capac" + "ityH\000\0226\n\013sla_latency\030\007 \001(\0132\037.context.Con" + "straint_SLA_LatencyH\000\022@\n\020sla_availabilit" + "y\030\010 \001(\0132$.context.Constraint_SLA_Availab" + "ilityH\000\022@\n\rsla_isolation\030\t \001(\0132\'.context" + ".Constraint_SLA_Isolation_levelH\000\0224\n\nexc" + "lusions\030\n \001(\0132\036.context.Constraint_Exclu" + "sionsH\000B\014\n\nconstraint\"^\n\022TeraFlowControl" + "ler\022&\n\ncontext_id\030\001 \001(\0132\022.context.Contex" + "tId\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n" + "\024AuthenticationResult\022&\n\ncontext_id\030\001 \001(" + "\0132\022.context.ContextId\022\025\n\rauthenticated\030\002" + " \001(\010*j\n\rEventTypeEnum\022\027\n\023EVENTTYPE_UNDEF" + "INED\020\000\022\024\n\020EVENTTYPE_CREATE\020\001\022\024\n\020EVENTTYP" + "E_UPDATE\020\002\022\024\n\020EVENTTYPE_REMOVE\020\003*\321\002\n\020Dev" + "iceDriverEnum\022\032\n\026DEVICEDRIVER_UNDEFINED\020" + "\000\022\033\n\027DEVICEDRIVER_OPENCONFIG\020\001\022\036\n\032DEVICE" + "DRIVER_TRANSPORT_API\020\002\022\023\n\017DEVICEDRIVER_P" + "4\020\003\022&\n\"DEVICEDRIVER_IETF_NETWORK_TOPOLOG" + "Y\020\004\022\033\n\027DEVICEDRIVER_ONF_TR_532\020\005\022\023\n\017DEVI" + "CEDRIVER_XR\020\006\022\033\n\027DEVICEDRIVER_IETF_L2VPN" + "\020\007\022 \n\034DEVICEDRIVER_GNMI_OPENCONFIG\020\010\022\032\n\026" + "DEVICEDRIVER_FLEXSCALE\020\t\022\032\n\026DEVICEDRIVER" + "_IETF_ACTN\020\n*\217\001\n\033DeviceOperationalStatus" + "Enum\022%\n!DEVICEOPERATIONALSTATUS_UNDEFINE" + "D\020\000\022$\n DEVICEOPERATIONALSTATUS_DISABLED\020" + "\001\022#\n\037DEVICEOPERATIONALSTATUS_ENABLED\020\002*\252" + "\001\n\017ServiceTypeEnum\022\027\n\023SERVICETYPE_UNKNOW" + "N\020\000\022\024\n\020SERVICETYPE_L3NM\020\001\022\024\n\020SERVICETYPE" + "_L2NM\020\002\022)\n%SERVICETYPE_TAPI_CONNECTIVITY" + "_SERVICE\020\003\022\022\n\016SERVICETYPE_TE\020\004\022\023\n\017SERVIC" + "ETYPE_E2E\020\005*\304\001\n\021ServiceStatusEnum\022\033\n\027SER" + "VICESTATUS_UNDEFINED\020\000\022\031\n\025SERVICESTATUS_" + "PLANNED\020\001\022\030\n\024SERVICESTATUS_ACTIVE\020\002\022\032\n\026S" + "ERVICESTATUS_UPDATING\020\003\022!\n\035SERVICESTATUS" + "_PENDING_REMOVAL\020\004\022\036\n\032SERVICESTATUS_SLA_" + "VIOLATED\020\005*\251\001\n\017SliceStatusEnum\022\031\n\025SLICES" + "TATUS_UNDEFINED\020\000\022\027\n\023SLICESTATUS_PLANNED" + "\020\001\022\024\n\020SLICESTATUS_INIT\020\002\022\026\n\022SLICESTATUS_" + "ACTIVE\020\003\022\026\n\022SLICESTATUS_DEINIT\020\004\022\034\n\030SLIC" + "ESTATUS_SLA_VIOLATED\020\005*]\n\020ConfigActionEn" + "um\022\032\n\026CONFIGACTION_UNDEFINED\020\000\022\024\n\020CONFIG" + "ACTION_SET\020\001\022\027\n\023CONFIGACTION_DELETE\020\002*m\n" + "\024ConstraintActionEnum\022\036\n\032CONSTRAINTACTIO" + "N_UNDEFINED\020\000\022\030\n\024CONSTRAINTACTION_SET\020\001\022" + "\033\n\027CONSTRAINTACTION_DELETE\020\002*\203\002\n\022Isolati" + "onLevelEnum\022\020\n\014NO_ISOLATION\020\000\022\026\n\022PHYSICA" + "L_ISOLATION\020\001\022\025\n\021LOGICAL_ISOLATION\020\002\022\025\n\021" + "PROCESS_ISOLATION\020\003\022\035\n\031PHYSICAL_MEMORY_I" + "SOLATION\020\004\022\036\n\032PHYSICAL_NETWORK_ISOLATION" + "\020\005\022\036\n\032VIRTUAL_RESOURCE_ISOLATION\020\006\022\037\n\033NE" + "TWORK_FUNCTIONS_ISOLATION\020\007\022\025\n\021SERVICE_I" + "SOLATION\020\0102\245\026\n\016ContextService\022:\n\016ListCon" + "textIds\022\016.context.Empty\032\026.context.Contex" + "tIdList\"\000\0226\n\014ListContexts\022\016.context.Empt" + "y\032\024.context.ContextList\"\000\0224\n\nGetContext\022" + "\022.context.ContextId\032\020.context.Context\"\000\022" + "4\n\nSetContext\022\020.context.Context\032\022.contex" + "t.ContextId\"\000\0225\n\rRemoveContext\022\022.context" + ".ContextId\032\016.context.Empty\"\000\022=\n\020GetConte" + "xtEvents\022\016.context.Empty\032\025.context.Conte" + "xtEvent\"\0000\001\022@\n\017ListTopologyIds\022\022.context" + ".ContextId\032\027.context.TopologyIdList\"\000\022=\n" + "\016ListTopologies\022\022.context.ContextId\032\025.co" + "ntext.TopologyList\"\000\0227\n\013GetTopology\022\023.co" + "ntext.TopologyId\032\021.context.Topology\"\000\022E\n" + "\022GetTopologyDetails\022\023.context.TopologyId" + "\032\030.context.TopologyDetails\"\000\0227\n\013SetTopol" + "ogy\022\021.context.Topology\032\023.context.Topolog" + "yId\"\000\0227\n\016RemoveTopology\022\023.context.Topolo" + "gyId\032\016.context.Empty\"\000\022?\n\021GetTopologyEve" + "nts\022\016.context.Empty\032\026.context.TopologyEv" + "ent\"\0000\001\0228\n\rListDeviceIds\022\016.context.Empty" + "\032\025.context.DeviceIdList\"\000\0224\n\013ListDevices" + "\022\016.context.Empty\032\023.context.DeviceList\"\000\022" + "1\n\tGetDevice\022\021.context.DeviceId\032\017.contex" + "t.Device\"\000\0221\n\tSetDevice\022\017.context.Device" + "\032\021.context.DeviceId\"\000\0223\n\014RemoveDevice\022\021." + "context.DeviceId\032\016.context.Empty\"\000\022;\n\017Ge" + "tDeviceEvents\022\016.context.Empty\032\024.context." + "DeviceEvent\"\0000\001\022<\n\014SelectDevice\022\025.contex" + "t.DeviceFilter\032\023.context.DeviceList\"\000\022I\n" + "\021ListEndPointNames\022\027.context.EndPointIdL" + "ist\032\031.context.EndPointNameList\"\000\0224\n\013List" + "LinkIds\022\016.context.Empty\032\023.context.LinkId" + "List\"\000\0220\n\tListLinks\022\016.context.Empty\032\021.co" + "ntext.LinkList\"\000\022+\n\007GetLink\022\017.context.Li" + "nkId\032\r.context.Link\"\000\022+\n\007SetLink\022\r.conte" + "xt.Link\032\017.context.LinkId\"\000\022/\n\nRemoveLink" + "\022\017.context.LinkId\032\016.context.Empty\"\000\0227\n\rG" + "etLinkEvents\022\016.context.Empty\032\022.context.L" + "inkEvent\"\0000\001\022>\n\016ListServiceIds\022\022.context" + ".ContextId\032\026.context.ServiceIdList\"\000\022:\n\014" + "ListServices\022\022.context.ContextId\032\024.conte" + "xt.ServiceList\"\000\0224\n\nGetService\022\022.context" + ".ServiceId\032\020.context.Service\"\000\0224\n\nSetSer" + "vice\022\020.context.Service\032\022.context.Service" + "Id\"\000\0226\n\014UnsetService\022\020.context.Service\032\022" + ".context.ServiceId\"\000\0225\n\rRemoveService\022\022." + "context.ServiceId\032\016.context.Empty\"\000\022=\n\020G" + "etServiceEvents\022\016.context.Empty\032\025.contex" + "t.ServiceEvent\"\0000\001\022?\n\rSelectService\022\026.co" + "ntext.ServiceFilter\032\024.context.ServiceLis" + "t\"\000\022:\n\014ListSliceIds\022\022.context.ContextId\032" + "\024.context.SliceIdList\"\000\0226\n\nListSlices\022\022." + "context.ContextId\032\022.context.SliceList\"\000\022" + ".\n\010GetSlice\022\020.context.SliceId\032\016.context." + "Slice\"\000\022.\n\010SetSlice\022\016.context.Slice\032\020.co" + "ntext.SliceId\"\000\0220\n\nUnsetSlice\022\016.context." + "Slice\032\020.context.SliceId\"\000\0221\n\013RemoveSlice" + "\022\020.context.SliceId\032\016.context.Empty\"\000\0229\n\016" + "GetSliceEvents\022\016.context.Empty\032\023.context" + ".SliceEvent\"\0000\001\0229\n\013SelectSlice\022\024.context" + ".SliceFilter\032\022.context.SliceList\"\000\022D\n\021Li" + "stConnectionIds\022\022.context.ServiceId\032\031.co" + "ntext.ConnectionIdList\"\000\022@\n\017ListConnecti" + "ons\022\022.context.ServiceId\032\027.context.Connec" + "tionList\"\000\022=\n\rGetConnection\022\025.context.Co" + "nnectionId\032\023.context.Connection\"\000\022=\n\rSet" + "Connection\022\023.context.Connection\032\025.contex" + "t.ConnectionId\"\000\022;\n\020RemoveConnection\022\025.c" + "ontext.ConnectionId\032\016.context.Empty\"\000\022C\n" + "\023GetConnectionEvents\022\016.context.Empty\032\030.c" + "ontext.ConnectionEvent\"\0000\001b\006proto3" }; + java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\tacl.proto\032\026kpi" + "_sample_types.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004" + "uuid\030\001 \001(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001" + "(\001\"Z\n\005Event\022%\n\ttimestamp\030\001 \001(\0132\022.context" + ".Timestamp\022*\n\nevent_type\030\002 \001(\0162\026.context" + ".EventTypeEnum\"0\n\tContextId\022#\n\014context_u" + "uid\030\001 \001(\0132\r.context.Uuid\"\351\001\n\007Context\022&\n\n" + "context_id\030\001 \001(\0132\022.context.ContextId\022\014\n\004" + "name\030\002 \001(\t\022)\n\014topology_ids\030\003 \003(\0132\023.conte" + "xt.TopologyId\022\'\n\013service_ids\030\004 \003(\0132\022.con" + "text.ServiceId\022#\n\tslice_ids\030\005 \003(\0132\020.cont" + "ext.SliceId\022/\n\ncontroller\030\006 \001(\0132\033.contex" + "t.TeraFlowController\"8\n\rContextIdList\022\'\n" + "\013context_ids\030\001 \003(\0132\022.context.ContextId\"1" + "\n\013ContextList\022\"\n\010contexts\030\001 \003(\0132\020.contex" + "t.Context\"U\n\014ContextEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022&\n\ncontext_id\030\002 \001(\0132\022.c" + "ontext.ContextId\"Z\n\nTopologyId\022&\n\ncontex" + "t_id\030\001 \001(\0132\022.context.ContextId\022$\n\rtopolo" + "gy_uuid\030\002 \001(\0132\r.context.Uuid\"\214\001\n\010Topolog" + "y\022(\n\013topology_id\030\001 \001(\0132\023.context.Topolog" + "yId\022\014\n\004name\030\002 \001(\t\022%\n\ndevice_ids\030\003 \003(\0132\021." + "context.DeviceId\022!\n\010link_ids\030\004 \003(\0132\017.con" + "text.LinkId\"\211\001\n\017TopologyDetails\022(\n\013topol" + "ogy_id\030\001 \001(\0132\023.context.TopologyId\022\014\n\004nam" + "e\030\002 \001(\t\022 \n\007devices\030\003 \003(\0132\017.context.Devic" + "e\022\034\n\005links\030\004 \003(\0132\r.context.Link\";\n\016Topol" + "ogyIdList\022)\n\014topology_ids\030\001 \003(\0132\023.contex" + "t.TopologyId\"5\n\014TopologyList\022%\n\ntopologi" + "es\030\001 \003(\0132\021.context.Topology\"X\n\rTopologyE" + "vent\022\035\n\005event\030\001 \001(\0132\016.context.Event\022(\n\013t" + "opology_id\030\002 \001(\0132\023.context.TopologyId\".\n" + "\010DeviceId\022\"\n\013device_uuid\030\001 \001(\0132\r.context" + ".Uuid\"\372\002\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.co" + "ntext.DeviceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_t" + "ype\030\003 \001(\t\022,\n\rdevice_config\030\004 \001(\0132\025.conte" + "xt.DeviceConfig\022G\n\031device_operational_st" + "atus\030\005 \001(\0162$.context.DeviceOperationalSt" + "atusEnum\0221\n\016device_drivers\030\006 \003(\0162\031.conte" + "xt.DeviceDriverEnum\022+\n\020device_endpoints\030" + "\007 \003(\0132\021.context.EndPoint\022&\n\ncomponents\030\010" + " \003(\0132\022.context.Component\022(\n\rcontroller_i" + "d\030\t \001(\0132\021.context.DeviceId\"\311\001\n\tComponent" + "\022%\n\016component_uuid\030\001 \001(\0132\r.context.Uuid\022" + "\014\n\004name\030\002 \001(\t\022\014\n\004type\030\003 \001(\t\0226\n\nattribute" + "s\030\004 \003(\0132\".context.Component.AttributesEn" + "try\022\016\n\006parent\030\005 \001(\t\0321\n\017AttributesEntry\022\013" + "\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"9\n\014Device" + "Config\022)\n\014config_rules\030\001 \003(\0132\023.context.C" + "onfigRule\"5\n\014DeviceIdList\022%\n\ndevice_ids\030" + "\001 \003(\0132\021.context.DeviceId\".\n\nDeviceList\022 " + "\n\007devices\030\001 \003(\0132\017.context.Device\"\216\001\n\014Dev" + "iceFilter\022)\n\ndevice_ids\030\001 \001(\0132\025.context." + "DeviceIdList\022\031\n\021include_endpoints\030\002 \001(\010\022" + "\034\n\024include_config_rules\030\003 \001(\010\022\032\n\022include" + "_components\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005eve" + "nt\030\001 \001(\0132\016.context.Event\022$\n\tdevice_id\030\002 " + "\001(\0132\021.context.DeviceId\022,\n\rdevice_config\030" + "\003 \001(\0132\025.context.DeviceConfig\"*\n\006LinkId\022 " + "\n\tlink_uuid\030\001 \001(\0132\r.context.Uuid\"I\n\016Link" + "Attributes\022\033\n\023total_capacity_gbps\030\001 \001(\002\022" + "\032\n\022used_capacity_gbps\030\002 \001(\002\"\223\001\n\004Link\022 \n\007" + "link_id\030\001 \001(\0132\017.context.LinkId\022\014\n\004name\030\002" + " \001(\t\022.\n\021link_endpoint_ids\030\003 \003(\0132\023.contex" + "t.EndPointId\022+\n\nattributes\030\004 \001(\0132\027.conte" + "xt.LinkAttributes\"/\n\nLinkIdList\022!\n\010link_" + "ids\030\001 \003(\0132\017.context.LinkId\"(\n\010LinkList\022\034" + "\n\005links\030\001 \003(\0132\r.context.Link\"L\n\tLinkEven" + "t\022\035\n\005event\030\001 \001(\0132\016.context.Event\022 \n\007link" + "_id\030\002 \001(\0132\017.context.LinkId\"X\n\tServiceId\022" + "&\n\ncontext_id\030\001 \001(\0132\022.context.ContextId\022" + "#\n\014service_uuid\030\002 \001(\0132\r.context.Uuid\"\333\002\n" + "\007Service\022&\n\nservice_id\030\001 \001(\0132\022.context.S" + "erviceId\022\014\n\004name\030\002 \001(\t\022.\n\014service_type\030\003" + " \001(\0162\030.context.ServiceTypeEnum\0221\n\024servic" + "e_endpoint_ids\030\004 \003(\0132\023.context.EndPointI" + "d\0220\n\023service_constraints\030\005 \003(\0132\023.context" + ".Constraint\022.\n\016service_status\030\006 \001(\0132\026.co" + "ntext.ServiceStatus\022.\n\016service_config\030\007 " + "\001(\0132\026.context.ServiceConfig\022%\n\ttimestamp" + "\030\010 \001(\0132\022.context.Timestamp\"C\n\rServiceSta" + "tus\0222\n\016service_status\030\001 \001(\0162\032.context.Se" + "rviceStatusEnum\":\n\rServiceConfig\022)\n\014conf" + "ig_rules\030\001 \003(\0132\023.context.ConfigRule\"8\n\rS" + "erviceIdList\022\'\n\013service_ids\030\001 \003(\0132\022.cont" + "ext.ServiceId\"1\n\013ServiceList\022\"\n\010services" + "\030\001 \003(\0132\020.context.Service\"\225\001\n\rServiceFilt" + "er\022+\n\013service_ids\030\001 \001(\0132\026.context.Servic" + "eIdList\022\034\n\024include_endpoint_ids\030\002 \001(\010\022\033\n" + "\023include_constraints\030\003 \001(\010\022\034\n\024include_co" + "nfig_rules\030\004 \001(\010\"U\n\014ServiceEvent\022\035\n\005even" + "t\030\001 \001(\0132\016.context.Event\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\"T\n\007SliceId\022&\n\nco" + "ntext_id\030\001 \001(\0132\022.context.ContextId\022!\n\nsl" + "ice_uuid\030\002 \001(\0132\r.context.Uuid\"\240\003\n\005Slice\022" + "\"\n\010slice_id\030\001 \001(\0132\020.context.SliceId\022\014\n\004n" + "ame\030\002 \001(\t\022/\n\022slice_endpoint_ids\030\003 \003(\0132\023." + "context.EndPointId\022.\n\021slice_constraints\030" + "\004 \003(\0132\023.context.Constraint\022-\n\021slice_serv" + "ice_ids\030\005 \003(\0132\022.context.ServiceId\022,\n\022sli" + "ce_subslice_ids\030\006 \003(\0132\020.context.SliceId\022" + "*\n\014slice_status\030\007 \001(\0132\024.context.SliceSta" + "tus\022*\n\014slice_config\030\010 \001(\0132\024.context.Slic" + "eConfig\022(\n\013slice_owner\030\t \001(\0132\023.context.S" + "liceOwner\022%\n\ttimestamp\030\n \001(\0132\022.context.T" + "imestamp\"E\n\nSliceOwner\022!\n\nowner_uuid\030\001 \001" + "(\0132\r.context.Uuid\022\024\n\014owner_string\030\002 \001(\t\"" + "=\n\013SliceStatus\022.\n\014slice_status\030\001 \001(\0162\030.c" + "ontext.SliceStatusEnum\"8\n\013SliceConfig\022)\n" + "\014config_rules\030\001 \003(\0132\023.context.ConfigRule" + "\"2\n\013SliceIdList\022#\n\tslice_ids\030\001 \003(\0132\020.con" + "text.SliceId\"+\n\tSliceList\022\036\n\006slices\030\001 \003(" + "\0132\016.context.Slice\"\312\001\n\013SliceFilter\022\'\n\tsli" + "ce_ids\030\001 \001(\0132\024.context.SliceIdList\022\034\n\024in" + "clude_endpoint_ids\030\002 \001(\010\022\033\n\023include_cons" + "traints\030\003 \001(\010\022\033\n\023include_service_ids\030\004 \001" + "(\010\022\034\n\024include_subslice_ids\030\005 \001(\010\022\034\n\024incl" + "ude_config_rules\030\006 \001(\010\"O\n\nSliceEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022\"\n\010slice_id\030" + "\002 \001(\0132\020.context.SliceId\"6\n\014ConnectionId\022" + "&\n\017connection_uuid\030\001 \001(\0132\r.context.Uuid\"" + "2\n\025ConnectionSettings_L0\022\031\n\021lsp_symbolic" + "_name\030\001 \001(\t\"\236\001\n\025ConnectionSettings_L2\022\027\n" + "\017src_mac_address\030\001 \001(\t\022\027\n\017dst_mac_addres" + "s\030\002 \001(\t\022\022\n\nether_type\030\003 \001(\r\022\017\n\007vlan_id\030\004" + " \001(\r\022\022\n\nmpls_label\030\005 \001(\r\022\032\n\022mpls_traffic" + "_class\030\006 \001(\r\"t\n\025ConnectionSettings_L3\022\026\n" + "\016src_ip_address\030\001 \001(\t\022\026\n\016dst_ip_address\030" + "\002 \001(\t\022\014\n\004dscp\030\003 \001(\r\022\020\n\010protocol\030\004 \001(\r\022\013\n" + "\003ttl\030\005 \001(\r\"[\n\025ConnectionSettings_L4\022\020\n\010s" + "rc_port\030\001 \001(\r\022\020\n\010dst_port\030\002 \001(\r\022\021\n\ttcp_f" + "lags\030\003 \001(\r\022\013\n\003ttl\030\004 \001(\r\"\304\001\n\022ConnectionSe" + "ttings\022*\n\002l0\030\001 \001(\0132\036.context.ConnectionS" + "ettings_L0\022*\n\002l2\030\002 \001(\0132\036.context.Connect" + "ionSettings_L2\022*\n\002l3\030\003 \001(\0132\036.context.Con" + "nectionSettings_L3\022*\n\002l4\030\004 \001(\0132\036.context" + ".ConnectionSettings_L4\"\363\001\n\nConnection\022,\n" + "\rconnection_id\030\001 \001(\0132\025.context.Connectio" + "nId\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\0223\n\026path_hops_endpoint_ids\030\003 \003(\0132\023.co" + "ntext.EndPointId\022+\n\017sub_service_ids\030\004 \003(" + "\0132\022.context.ServiceId\022-\n\010settings\030\005 \001(\0132" + "\033.context.ConnectionSettings\"A\n\020Connecti" + "onIdList\022-\n\016connection_ids\030\001 \003(\0132\025.conte" + "xt.ConnectionId\":\n\016ConnectionList\022(\n\013con" + "nections\030\001 \003(\0132\023.context.Connection\"^\n\017C" + "onnectionEvent\022\035\n\005event\030\001 \001(\0132\016.context." + "Event\022,\n\rconnection_id\030\002 \001(\0132\025.context.C" + "onnectionId\"\202\001\n\nEndPointId\022(\n\013topology_i" + "d\030\001 \001(\0132\023.context.TopologyId\022$\n\tdevice_i" + "d\030\002 \001(\0132\021.context.DeviceId\022$\n\rendpoint_u" + "uid\030\003 \001(\0132\r.context.Uuid\"\302\001\n\010EndPoint\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "\014\n\004name\030\002 \001(\t\022\025\n\rendpoint_type\030\003 \001(\t\0229\n\020" + "kpi_sample_types\030\004 \003(\0162\037.kpi_sample_type" + "s.KpiSampleType\022,\n\021endpoint_location\030\005 \001" + "(\0132\021.context.Location\"{\n\014EndPointName\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "\023\n\013device_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 " + "\001(\t\022\025\n\rendpoint_type\030\004 \001(\t\";\n\016EndPointId" + "List\022)\n\014endpoint_ids\030\001 \003(\0132\023.context.End" + "PointId\"A\n\020EndPointNameList\022-\n\016endpoint_" + "names\030\001 \003(\0132\025.context.EndPointName\"A\n\021Co" + "nfigRule_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n" + "\016resource_value\030\002 \001(\t\"]\n\016ConfigRule_ACL\022" + "(\n\013endpoint_id\030\001 \001(\0132\023.context.EndPointI" + "d\022!\n\010rule_set\030\002 \001(\0132\017.acl.AclRuleSet\"\234\001\n" + "\nConfigRule\022)\n\006action\030\001 \001(\0162\031.context.Co" + "nfigActionEnum\022,\n\006custom\030\002 \001(\0132\032.context" + ".ConfigRule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.cont" + "ext.ConfigRule_ACLH\000B\r\n\013config_rule\"F\n\021C" + "onstraint_Custom\022\027\n\017constraint_type\030\001 \001(" + "\t\022\030\n\020constraint_value\030\002 \001(\t\"E\n\023Constrain" + "t_Schedule\022\027\n\017start_timestamp\030\001 \001(\002\022\025\n\rd" + "uration_days\030\002 \001(\002\"3\n\014GPS_Position\022\020\n\010la" + "titude\030\001 \001(\002\022\021\n\tlongitude\030\002 \001(\002\"W\n\010Locat" + "ion\022\020\n\006region\030\001 \001(\tH\000\022-\n\014gps_position\030\002 " + "\001(\0132\025.context.GPS_PositionH\000B\n\n\010location" + "\"l\n\033Constraint_EndPointLocation\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022#\n\010loc" + "ation\030\002 \001(\0132\021.context.Location\"Y\n\033Constr" + "aint_EndPointPriority\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022\020\n\010priority\030\002 \001(" + "\r\"0\n\026Constraint_SLA_Latency\022\026\n\016e2e_laten" + "cy_ms\030\001 \001(\002\"0\n\027Constraint_SLA_Capacity\022\025" + "\n\rcapacity_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_" + "Availability\022\032\n\022num_disjoint_paths\030\001 \001(\r" + "\022\022\n\nall_active\030\002 \001(\010\022\024\n\014availability\030\003 \001" + "(\002\"V\n\036Constraint_SLA_Isolation_level\0224\n\017" + "isolation_level\030\001 \003(\0162\033.context.Isolatio" + "nLevelEnum\"\242\001\n\025Constraint_Exclusions\022\024\n\014" + "is_permanent\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021" + ".context.DeviceId\022)\n\014endpoint_ids\030\003 \003(\0132" + "\023.context.EndPointId\022!\n\010link_ids\030\004 \003(\0132\017" + ".context.LinkId\"\333\004\n\nConstraint\022-\n\006action" + "\030\001 \001(\0162\035.context.ConstraintActionEnum\022,\n" + "\006custom\030\002 \001(\0132\032.context.Constraint_Custo" + "mH\000\0220\n\010schedule\030\003 \001(\0132\034.context.Constrai" + "nt_ScheduleH\000\022A\n\021endpoint_location\030\004 \001(\013" + "2$.context.Constraint_EndPointLocationH\000" + "\022A\n\021endpoint_priority\030\005 \001(\0132$.context.Co" + "nstraint_EndPointPriorityH\000\0228\n\014sla_capac" + "ity\030\006 \001(\0132 .context.Constraint_SLA_Capac" + "ityH\000\0226\n\013sla_latency\030\007 \001(\0132\037.context.Con" + "straint_SLA_LatencyH\000\022@\n\020sla_availabilit" + "y\030\010 \001(\0132$.context.Constraint_SLA_Availab" + "ilityH\000\022@\n\rsla_isolation\030\t \001(\0132\'.context" + ".Constraint_SLA_Isolation_levelH\000\0224\n\nexc" + "lusions\030\n \001(\0132\036.context.Constraint_Exclu" + "sionsH\000B\014\n\nconstraint\"^\n\022TeraFlowControl" + "ler\022&\n\ncontext_id\030\001 \001(\0132\022.context.Contex" + "tId\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n" + "\024AuthenticationResult\022&\n\ncontext_id\030\001 \001(" + "\0132\022.context.ContextId\022\025\n\rauthenticated\030\002" + " \001(\010\"-\n\017OpticalConfigId\022\032\n\022opticalconfig" + "_uuid\030\001 \001(\t\"S\n\rOpticalConfig\0222\n\020opticalc" + "onfig_id\030\001 \001(\0132\030.context.OpticalConfigId" + "\022\016\n\006config\030\002 \001(\t\"C\n\021OpticalConfigList\022.\n" + "\016opticalconfigs\030\001 \003(\0132\026.context.OpticalC" + "onfig\"9\n\rOpticalLinkId\022(\n\021optical_link_u" + "uid\030\001 \001(\0132\r.context.Uuid\",\n\007FiberId\022!\n\nf" + "iber_uuid\030\001 \001(\0132\r.context.Uuid\"\341\001\n\005Fiber" + "\022\n\n\002ID\030\n \001(\t\022\020\n\010src_port\030\001 \001(\t\022\020\n\010dst_po" + "rt\030\002 \001(\t\022\027\n\017local_peer_port\030\003 \001(\t\022\030\n\020rem" + "ote_peer_port\030\004 \001(\t\022\017\n\007c_slots\030\005 \003(\005\022\017\n\007" + "l_slots\030\006 \003(\005\022\017\n\007s_slots\030\007 \003(\005\022\016\n\006length" + "\030\010 \001(\002\022\014\n\004used\030\t \001(\010\022$\n\nfiber_uuid\030\013 \001(\013" + "2\020.context.FiberId\"d\n\022OpticalLinkDetails" + "\022\016\n\006length\030\001 \001(\002\022\016\n\006source\030\002 \001(\t\022\016\n\006targ" + "et\030\003 \001(\t\022\036\n\006fibers\030\004 \003(\0132\016.context.Fiber" + "\"|\n\013OpticalLink\022\014\n\004name\030\001 \001(\t\022,\n\007details" + "\030\002 \001(\0132\033.context.OpticalLinkDetails\0221\n\021o" + "ptical_link_uuid\030\003 \001(\0132\026.context.Optical" + "LinkId*j\n\rEventTypeEnum\022\027\n\023EVENTTYPE_UND" + "EFINED\020\000\022\024\n\020EVENTTYPE_CREATE\020\001\022\024\n\020EVENTT" + "YPE_UPDATE\020\002\022\024\n\020EVENTTYPE_REMOVE\020\003*\346\002\n\020D" + "eviceDriverEnum\022\032\n\026DEVICEDRIVER_UNDEFINE" + "D\020\000\022\033\n\027DEVICEDRIVER_OPENCONFIG\020\001\022\036\n\032DEVI" + "CEDRIVER_TRANSPORT_API\020\002\022\023\n\017DEVICEDRIVER" + "_P4\020\003\022&\n\"DEVICEDRIVER_IETF_NETWORK_TOPOL" + "OGY\020\004\022\033\n\027DEVICEDRIVER_ONF_TR_532\020\005\022\023\n\017DE" + "VICEDRIVER_XR\020\006\022\033\n\027DEVICEDRIVER_IETF_L2V" + "PN\020\007\022 \n\034DEVICEDRIVER_GNMI_OPENCONFIG\020\010\022\032" + "\n\026DEVICEDRIVER_FLEXSCALE\020\t\022\032\n\026DEVICEDRIV" + "ER_IETF_ACTN\020\n\022\023\n\017DEVICEDRIVER_OC\020\013*\217\001\n\033" + "DeviceOperationalStatusEnum\022%\n!DEVICEOPE" + "RATIONALSTATUS_UNDEFINED\020\000\022$\n DEVICEOPER" + "ATIONALSTATUS_DISABLED\020\001\022#\n\037DEVICEOPERAT" + "IONALSTATUS_ENABLED\020\002*\320\001\n\017ServiceTypeEnu" + "m\022\027\n\023SERVICETYPE_UNKNOWN\020\000\022\024\n\020SERVICETYP" + "E_L3NM\020\001\022\024\n\020SERVICETYPE_L2NM\020\002\022)\n%SERVIC" + "ETYPE_TAPI_CONNECTIVITY_SERVICE\020\003\022\022\n\016SER" + "VICETYPE_TE\020\004\022\023\n\017SERVICETYPE_E2E\020\005\022$\n SE" + "RVICETYPE_OPTICAL_CONNECTIVITY\020\006*\304\001\n\021Ser" + "viceStatusEnum\022\033\n\027SERVICESTATUS_UNDEFINE" + "D\020\000\022\031\n\025SERVICESTATUS_PLANNED\020\001\022\030\n\024SERVIC" + "ESTATUS_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UPDATI" + "NG\020\003\022!\n\035SERVICESTATUS_PENDING_REMOVAL\020\004\022" + "\036\n\032SERVICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017Slic" + "eStatusEnum\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027" + "\n\023SLICESTATUS_PLANNED\020\001\022\024\n\020SLICESTATUS_I" + "NIT\020\002\022\026\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLICEST" + "ATUS_DEINIT\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATE" + "D\020\005*]\n\020ConfigActionEnum\022\032\n\026CONFIGACTION_" + "UNDEFINED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CON" + "FIGACTION_DELETE\020\002*m\n\024ConstraintActionEn" + "um\022\036\n\032CONSTRAINTACTION_UNDEFINED\020\000\022\030\n\024CO" + "NSTRAINTACTION_SET\020\001\022\033\n\027CONSTRAINTACTION" + "_DELETE\020\002*\203\002\n\022IsolationLevelEnum\022\020\n\014NO_I" + "SOLATION\020\000\022\026\n\022PHYSICAL_ISOLATION\020\001\022\025\n\021LO" + "GICAL_ISOLATION\020\002\022\025\n\021PROCESS_ISOLATION\020\003" + "\022\035\n\031PHYSICAL_MEMORY_ISOLATION\020\004\022\036\n\032PHYSI" + "CAL_NETWORK_ISOLATION\020\005\022\036\n\032VIRTUAL_RESOU" + "RCE_ISOLATION\020\006\022\037\n\033NETWORK_FUNCTIONS_ISO" + "LATION\020\007\022\025\n\021SERVICE_ISOLATION\020\0102\246\031\n\016Cont" + "extService\022:\n\016ListContextIds\022\016.context.E" + "mpty\032\026.context.ContextIdList\"\000\0226\n\014ListCo" + "ntexts\022\016.context.Empty\032\024.context.Context" + "List\"\000\0224\n\nGetContext\022\022.context.ContextId" + "\032\020.context.Context\"\000\0224\n\nSetContext\022\020.con" + "text.Context\032\022.context.ContextId\"\000\0225\n\rRe" + "moveContext\022\022.context.ContextId\032\016.contex" + "t.Empty\"\000\022=\n\020GetContextEvents\022\016.context." + "Empty\032\025.context.ContextEvent\"\0000\001\022@\n\017List" + "TopologyIds\022\022.context.ContextId\032\027.contex" + "t.TopologyIdList\"\000\022=\n\016ListTopologies\022\022.c" + "ontext.ContextId\032\025.context.TopologyList\"" + "\000\0227\n\013GetTopology\022\023.context.TopologyId\032\021." + "context.Topology\"\000\022E\n\022GetTopologyDetails" + "\022\023.context.TopologyId\032\030.context.Topology" + "Details\"\000\0227\n\013SetTopology\022\021.context.Topol" + "ogy\032\023.context.TopologyId\"\000\0227\n\016RemoveTopo" + "logy\022\023.context.TopologyId\032\016.context.Empt" + "y\"\000\022?\n\021GetTopologyEvents\022\016.context.Empty" + "\032\026.context.TopologyEvent\"\0000\001\0228\n\rListDevi" + "ceIds\022\016.context.Empty\032\025.context.DeviceId" + "List\"\000\0224\n\013ListDevices\022\016.context.Empty\032\023." + "context.DeviceList\"\000\0221\n\tGetDevice\022\021.cont" + "ext.DeviceId\032\017.context.Device\"\000\0221\n\tSetDe" + "vice\022\017.context.Device\032\021.context.DeviceId" + "\"\000\0223\n\014RemoveDevice\022\021.context.DeviceId\032\016." + "context.Empty\"\000\022;\n\017GetDeviceEvents\022\016.con" + "text.Empty\032\024.context.DeviceEvent\"\0000\001\022<\n\014" + "SelectDevice\022\025.context.DeviceFilter\032\023.co" + "ntext.DeviceList\"\000\022I\n\021ListEndPointNames\022" + "\027.context.EndPointIdList\032\031.context.EndPo" + "intNameList\"\000\0224\n\013ListLinkIds\022\016.context.E" + "mpty\032\023.context.LinkIdList\"\000\0220\n\tListLinks" + "\022\016.context.Empty\032\021.context.LinkList\"\000\022+\n" + "\007GetLink\022\017.context.LinkId\032\r.context.Link" + "\"\000\022+\n\007SetLink\022\r.context.Link\032\017.context.L" + "inkId\"\000\022/\n\nRemoveLink\022\017.context.LinkId\032\016" + ".context.Empty\"\000\0227\n\rGetLinkEvents\022\016.cont" + "ext.Empty\032\022.context.LinkEvent\"\0000\001\022>\n\016Lis" + "tServiceIds\022\022.context.ContextId\032\026.contex" + "t.ServiceIdList\"\000\022:\n\014ListServices\022\022.cont" + "ext.ContextId\032\024.context.ServiceList\"\000\0224\n" + "\nGetService\022\022.context.ServiceId\032\020.contex" + "t.Service\"\000\0224\n\nSetService\022\020.context.Serv" + "ice\032\022.context.ServiceId\"\000\0226\n\014UnsetServic" + "e\022\020.context.Service\032\022.context.ServiceId\"" + "\000\0225\n\rRemoveService\022\022.context.ServiceId\032\016" + ".context.Empty\"\000\022=\n\020GetServiceEvents\022\016.c" + "ontext.Empty\032\025.context.ServiceEvent\"\0000\001\022" + "?\n\rSelectService\022\026.context.ServiceFilter" + "\032\024.context.ServiceList\"\000\022:\n\014ListSliceIds" + "\022\022.context.ContextId\032\024.context.SliceIdLi" + "st\"\000\0226\n\nListSlices\022\022.context.ContextId\032\022" + ".context.SliceList\"\000\022.\n\010GetSlice\022\020.conte" + "xt.SliceId\032\016.context.Slice\"\000\022.\n\010SetSlice" + "\022\016.context.Slice\032\020.context.SliceId\"\000\0220\n\n" + "UnsetSlice\022\016.context.Slice\032\020.context.Sli" + "ceId\"\000\0221\n\013RemoveSlice\022\020.context.SliceId\032" + "\016.context.Empty\"\000\0229\n\016GetSliceEvents\022\016.co" + "ntext.Empty\032\023.context.SliceEvent\"\0000\001\0229\n\013" + "SelectSlice\022\024.context.SliceFilter\032\022.cont" + "ext.SliceList\"\000\022D\n\021ListConnectionIds\022\022.c" + "ontext.ServiceId\032\031.context.ConnectionIdL" + "ist\"\000\022@\n\017ListConnections\022\022.context.Servi" + "ceId\032\027.context.ConnectionList\"\000\022=\n\rGetCo" + "nnection\022\025.context.ConnectionId\032\023.contex" + "t.Connection\"\000\022=\n\rSetConnection\022\023.contex" + "t.Connection\032\025.context.ConnectionId\"\000\022;\n" + "\020RemoveConnection\022\025.context.ConnectionId" + "\032\016.context.Empty\"\000\022C\n\023GetConnectionEvent" + "s\022\016.context.Empty\032\030.context.ConnectionEv" + "ent\"\0000\001\022@\n\020GetOpticalConfig\022\016.context.Em" + "pty\032\032.context.OpticalConfigList\"\000\022F\n\020Set" + "OpticalConfig\022\026.context.OpticalConfig\032\030." + "context.OpticalConfigId\"\000\022I\n\023SelectOptic" + "alConfig\022\030.context.OpticalConfigId\032\026.con" + "text.OpticalConfig\"\000\0228\n\016SetOpticalLink\022\024" + ".context.OpticalLink\032\016.context.Empty\"\000\022@" + "\n\016GetOpticalLink\022\026.context.OpticalLinkId" + "\032\024.context.OpticalLink\"\000\022.\n\010GetFiber\022\020.c" + "ontext.FiberId\032\016.context.Fiber\"\000b\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { acl.Acl.getDescriptor(), kpi_sample_types.KpiSampleTypes.getDescriptor() }); internal_static_context_Empty_descriptor = getDescriptor().getMessageTypes().get(0); internal_static_context_Empty_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Empty_descriptor, new java.lang.String[] {}); @@ -69778,6 +76850,22 @@ public final class ContextOuterClass { internal_static_context_TeraFlowController_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_TeraFlowController_descriptor, new java.lang.String[] { "ContextId", "IpAddress", "Port" }); internal_static_context_AuthenticationResult_descriptor = getDescriptor().getMessageTypes().get(77); internal_static_context_AuthenticationResult_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_AuthenticationResult_descriptor, new java.lang.String[] { "ContextId", "Authenticated" }); + internal_static_context_OpticalConfigId_descriptor = getDescriptor().getMessageTypes().get(78); + internal_static_context_OpticalConfigId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalConfigId_descriptor, new java.lang.String[] { "OpticalconfigUuid" }); + internal_static_context_OpticalConfig_descriptor = getDescriptor().getMessageTypes().get(79); + internal_static_context_OpticalConfig_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalConfig_descriptor, new java.lang.String[] { "OpticalconfigId", "Config" }); + internal_static_context_OpticalConfigList_descriptor = getDescriptor().getMessageTypes().get(80); + internal_static_context_OpticalConfigList_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalConfigList_descriptor, new java.lang.String[] { "Opticalconfigs" }); + internal_static_context_OpticalLinkId_descriptor = getDescriptor().getMessageTypes().get(81); + internal_static_context_OpticalLinkId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLinkId_descriptor, new java.lang.String[] { "OpticalLinkUuid" }); + internal_static_context_FiberId_descriptor = getDescriptor().getMessageTypes().get(82); + internal_static_context_FiberId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_FiberId_descriptor, new java.lang.String[] { "FiberUuid" }); + internal_static_context_Fiber_descriptor = getDescriptor().getMessageTypes().get(83); + internal_static_context_Fiber_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Fiber_descriptor, new java.lang.String[] { "ID", "SrcPort", "DstPort", "LocalPeerPort", "RemotePeerPort", "CSlots", "LSlots", "SSlots", "Length", "Used", "FiberUuid" }); + internal_static_context_OpticalLinkDetails_descriptor = getDescriptor().getMessageTypes().get(84); + internal_static_context_OpticalLinkDetails_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLinkDetails_descriptor, new java.lang.String[] { "Length", "Source", "Target", "Fibers" }); + internal_static_context_OpticalLink_descriptor = getDescriptor().getMessageTypes().get(85); + internal_static_context_OpticalLink_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLink_descriptor, new java.lang.String[] { "Name", "Details", "OpticalLinkUuid" }); acl.Acl.getDescriptor(); kpi_sample_types.KpiSampleTypes.getDescriptor(); } diff --git a/src/ztp/target/generated-sources/grpc/context/ContextService.java b/src/ztp/target/generated-sources/grpc/context/ContextService.java index f1c089fb5..32544e6be 100644 --- a/src/ztp/target/generated-sources/grpc/context/ContextService.java +++ b/src/ztp/target/generated-sources/grpc/context/ContextService.java @@ -89,6 +89,23 @@ public interface ContextService extends MutinyService { io.smallrye.mutiny.Uni removeConnection(context.ContextOuterClass.ConnectionId request); + /** + *
+     *  ------------------------------ Experimental -----------------------------
+     * 
+ */ + io.smallrye.mutiny.Uni getOpticalConfig(context.ContextOuterClass.Empty request); + + io.smallrye.mutiny.Uni setOpticalConfig(context.ContextOuterClass.OpticalConfig request); + + io.smallrye.mutiny.Uni selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request); + + io.smallrye.mutiny.Uni setOpticalLink(context.ContextOuterClass.OpticalLink request); + + io.smallrye.mutiny.Uni getOpticalLink(context.ContextOuterClass.OpticalLinkId request); + + io.smallrye.mutiny.Uni getFiber(context.ContextOuterClass.FiberId request); + io.smallrye.mutiny.Multi getContextEvents(context.ContextOuterClass.Empty request); io.smallrye.mutiny.Multi getTopologyEvents(context.ContextOuterClass.Empty request); diff --git a/src/ztp/target/generated-sources/grpc/context/ContextServiceBean.java b/src/ztp/target/generated-sources/grpc/context/ContextServiceBean.java index db1b9c170..d3c1b6285 100644 --- a/src/ztp/target/generated-sources/grpc/context/ContextServiceBean.java +++ b/src/ztp/target/generated-sources/grpc/context/ContextServiceBean.java @@ -391,6 +391,60 @@ public class ContextServiceBean extends MutinyContextServiceGrpc.ContextServiceI } } + @Override + public io.smallrye.mutiny.Uni getOpticalConfig(context.ContextOuterClass.Empty request) { + try { + return delegate.getOpticalConfig(request); + } catch (UnsupportedOperationException e) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + } + + @Override + public io.smallrye.mutiny.Uni setOpticalConfig(context.ContextOuterClass.OpticalConfig request) { + try { + return delegate.setOpticalConfig(request); + } catch (UnsupportedOperationException e) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + } + + @Override + public io.smallrye.mutiny.Uni selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request) { + try { + return delegate.selectOpticalConfig(request); + } catch (UnsupportedOperationException e) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + } + + @Override + public io.smallrye.mutiny.Uni setOpticalLink(context.ContextOuterClass.OpticalLink request) { + try { + return delegate.setOpticalLink(request); + } catch (UnsupportedOperationException e) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + } + + @Override + public io.smallrye.mutiny.Uni getOpticalLink(context.ContextOuterClass.OpticalLinkId request) { + try { + return delegate.getOpticalLink(request); + } catch (UnsupportedOperationException e) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + } + + @Override + public io.smallrye.mutiny.Uni getFiber(context.ContextOuterClass.FiberId request) { + try { + return delegate.getFiber(request); + } catch (UnsupportedOperationException e) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + } + @Override public io.smallrye.mutiny.Multi getContextEvents(context.ContextOuterClass.Empty request) { try { diff --git a/src/ztp/target/generated-sources/grpc/context/ContextServiceClient.java b/src/ztp/target/generated-sources/grpc/context/ContextServiceClient.java index 88ab831f5..b1773578d 100644 --- a/src/ztp/target/generated-sources/grpc/context/ContextServiceClient.java +++ b/src/ztp/target/generated-sources/grpc/context/ContextServiceClient.java @@ -235,6 +235,36 @@ public class ContextServiceClient implements ContextService, MutinyClient getOpticalConfig(context.ContextOuterClass.Empty request) { + return stub.getOpticalConfig(request); + } + + @Override + public io.smallrye.mutiny.Uni setOpticalConfig(context.ContextOuterClass.OpticalConfig request) { + return stub.setOpticalConfig(request); + } + + @Override + public io.smallrye.mutiny.Uni selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request) { + return stub.selectOpticalConfig(request); + } + + @Override + public io.smallrye.mutiny.Uni setOpticalLink(context.ContextOuterClass.OpticalLink request) { + return stub.setOpticalLink(request); + } + + @Override + public io.smallrye.mutiny.Uni getOpticalLink(context.ContextOuterClass.OpticalLinkId request) { + return stub.getOpticalLink(request); + } + + @Override + public io.smallrye.mutiny.Uni getFiber(context.ContextOuterClass.FiberId request) { + return stub.getFiber(request); + } + @Override public io.smallrye.mutiny.Multi getContextEvents(context.ContextOuterClass.Empty request) { return stub.getContextEvents(request); diff --git a/src/ztp/target/generated-sources/grpc/context/ContextServiceGrpc.java b/src/ztp/target/generated-sources/grpc/context/ContextServiceGrpc.java index defb37810..233312dd7 100644 --- a/src/ztp/target/generated-sources/grpc/context/ContextServiceGrpc.java +++ b/src/ztp/target/generated-sources/grpc/context/ContextServiceGrpc.java @@ -749,6 +749,96 @@ public final class ContextServiceGrpc { return getGetConnectionEventsMethod; } + private static volatile io.grpc.MethodDescriptor getGetOpticalConfigMethod; + + @io.grpc.stub.annotations.RpcMethod(fullMethodName = SERVICE_NAME + '/' + "GetOpticalConfig", requestType = context.ContextOuterClass.Empty.class, responseType = context.ContextOuterClass.OpticalConfigList.class, methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getGetOpticalConfigMethod() { + io.grpc.MethodDescriptor getGetOpticalConfigMethod; + if ((getGetOpticalConfigMethod = ContextServiceGrpc.getGetOpticalConfigMethod) == null) { + synchronized (ContextServiceGrpc.class) { + if ((getGetOpticalConfigMethod = ContextServiceGrpc.getGetOpticalConfigMethod) == null) { + ContextServiceGrpc.getGetOpticalConfigMethod = getGetOpticalConfigMethod = io.grpc.MethodDescriptor.newBuilder().setType(io.grpc.MethodDescriptor.MethodType.UNARY).setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetOpticalConfig")).setSampledToLocalTracing(true).setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.Empty.getDefaultInstance())).setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.OpticalConfigList.getDefaultInstance())).setSchemaDescriptor(new ContextServiceMethodDescriptorSupplier("GetOpticalConfig")).build(); + } + } + } + return getGetOpticalConfigMethod; + } + + private static volatile io.grpc.MethodDescriptor getSetOpticalConfigMethod; + + @io.grpc.stub.annotations.RpcMethod(fullMethodName = SERVICE_NAME + '/' + "SetOpticalConfig", requestType = context.ContextOuterClass.OpticalConfig.class, responseType = context.ContextOuterClass.OpticalConfigId.class, methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getSetOpticalConfigMethod() { + io.grpc.MethodDescriptor getSetOpticalConfigMethod; + if ((getSetOpticalConfigMethod = ContextServiceGrpc.getSetOpticalConfigMethod) == null) { + synchronized (ContextServiceGrpc.class) { + if ((getSetOpticalConfigMethod = ContextServiceGrpc.getSetOpticalConfigMethod) == null) { + ContextServiceGrpc.getSetOpticalConfigMethod = getSetOpticalConfigMethod = io.grpc.MethodDescriptor.newBuilder().setType(io.grpc.MethodDescriptor.MethodType.UNARY).setFullMethodName(generateFullMethodName(SERVICE_NAME, "SetOpticalConfig")).setSampledToLocalTracing(true).setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.OpticalConfig.getDefaultInstance())).setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.OpticalConfigId.getDefaultInstance())).setSchemaDescriptor(new ContextServiceMethodDescriptorSupplier("SetOpticalConfig")).build(); + } + } + } + return getSetOpticalConfigMethod; + } + + private static volatile io.grpc.MethodDescriptor getSelectOpticalConfigMethod; + + @io.grpc.stub.annotations.RpcMethod(fullMethodName = SERVICE_NAME + '/' + "SelectOpticalConfig", requestType = context.ContextOuterClass.OpticalConfigId.class, responseType = context.ContextOuterClass.OpticalConfig.class, methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getSelectOpticalConfigMethod() { + io.grpc.MethodDescriptor getSelectOpticalConfigMethod; + if ((getSelectOpticalConfigMethod = ContextServiceGrpc.getSelectOpticalConfigMethod) == null) { + synchronized (ContextServiceGrpc.class) { + if ((getSelectOpticalConfigMethod = ContextServiceGrpc.getSelectOpticalConfigMethod) == null) { + ContextServiceGrpc.getSelectOpticalConfigMethod = getSelectOpticalConfigMethod = io.grpc.MethodDescriptor.newBuilder().setType(io.grpc.MethodDescriptor.MethodType.UNARY).setFullMethodName(generateFullMethodName(SERVICE_NAME, "SelectOpticalConfig")).setSampledToLocalTracing(true).setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.OpticalConfigId.getDefaultInstance())).setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.OpticalConfig.getDefaultInstance())).setSchemaDescriptor(new ContextServiceMethodDescriptorSupplier("SelectOpticalConfig")).build(); + } + } + } + return getSelectOpticalConfigMethod; + } + + private static volatile io.grpc.MethodDescriptor getSetOpticalLinkMethod; + + @io.grpc.stub.annotations.RpcMethod(fullMethodName = SERVICE_NAME + '/' + "SetOpticalLink", requestType = context.ContextOuterClass.OpticalLink.class, responseType = context.ContextOuterClass.Empty.class, methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getSetOpticalLinkMethod() { + io.grpc.MethodDescriptor getSetOpticalLinkMethod; + if ((getSetOpticalLinkMethod = ContextServiceGrpc.getSetOpticalLinkMethod) == null) { + synchronized (ContextServiceGrpc.class) { + if ((getSetOpticalLinkMethod = ContextServiceGrpc.getSetOpticalLinkMethod) == null) { + ContextServiceGrpc.getSetOpticalLinkMethod = getSetOpticalLinkMethod = io.grpc.MethodDescriptor.newBuilder().setType(io.grpc.MethodDescriptor.MethodType.UNARY).setFullMethodName(generateFullMethodName(SERVICE_NAME, "SetOpticalLink")).setSampledToLocalTracing(true).setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.OpticalLink.getDefaultInstance())).setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.Empty.getDefaultInstance())).setSchemaDescriptor(new ContextServiceMethodDescriptorSupplier("SetOpticalLink")).build(); + } + } + } + return getSetOpticalLinkMethod; + } + + private static volatile io.grpc.MethodDescriptor getGetOpticalLinkMethod; + + @io.grpc.stub.annotations.RpcMethod(fullMethodName = SERVICE_NAME + '/' + "GetOpticalLink", requestType = context.ContextOuterClass.OpticalLinkId.class, responseType = context.ContextOuterClass.OpticalLink.class, methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getGetOpticalLinkMethod() { + io.grpc.MethodDescriptor getGetOpticalLinkMethod; + if ((getGetOpticalLinkMethod = ContextServiceGrpc.getGetOpticalLinkMethod) == null) { + synchronized (ContextServiceGrpc.class) { + if ((getGetOpticalLinkMethod = ContextServiceGrpc.getGetOpticalLinkMethod) == null) { + ContextServiceGrpc.getGetOpticalLinkMethod = getGetOpticalLinkMethod = io.grpc.MethodDescriptor.newBuilder().setType(io.grpc.MethodDescriptor.MethodType.UNARY).setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetOpticalLink")).setSampledToLocalTracing(true).setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.OpticalLinkId.getDefaultInstance())).setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.OpticalLink.getDefaultInstance())).setSchemaDescriptor(new ContextServiceMethodDescriptorSupplier("GetOpticalLink")).build(); + } + } + } + return getGetOpticalLinkMethod; + } + + private static volatile io.grpc.MethodDescriptor getGetFiberMethod; + + @io.grpc.stub.annotations.RpcMethod(fullMethodName = SERVICE_NAME + '/' + "GetFiber", requestType = context.ContextOuterClass.FiberId.class, responseType = context.ContextOuterClass.Fiber.class, methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getGetFiberMethod() { + io.grpc.MethodDescriptor getGetFiberMethod; + if ((getGetFiberMethod = ContextServiceGrpc.getGetFiberMethod) == null) { + synchronized (ContextServiceGrpc.class) { + if ((getGetFiberMethod = ContextServiceGrpc.getGetFiberMethod) == null) { + ContextServiceGrpc.getGetFiberMethod = getGetFiberMethod = io.grpc.MethodDescriptor.newBuilder().setType(io.grpc.MethodDescriptor.MethodType.UNARY).setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetFiber")).setSampledToLocalTracing(true).setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.FiberId.getDefaultInstance())).setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.Fiber.getDefaultInstance())).setSchemaDescriptor(new ContextServiceMethodDescriptorSupplier("GetFiber")).build(); + } + } + } + return getGetFiberMethod; + } + /** * Creates a new async stub that supports all call types for the service */ @@ -1088,6 +1178,45 @@ public final class ContextServiceGrpc { default void getConnectionEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetConnectionEventsMethod(), responseObserver); } + + /** + *
+         * ------------------------------ Experimental -----------------------------
+         * 
+ */ + default void getOpticalConfig(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetOpticalConfigMethod(), responseObserver); + } + + /** + */ + default void setOpticalConfig(context.ContextOuterClass.OpticalConfig request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetOpticalConfigMethod(), responseObserver); + } + + /** + */ + default void selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSelectOpticalConfigMethod(), responseObserver); + } + + /** + */ + default void setOpticalLink(context.ContextOuterClass.OpticalLink request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetOpticalLinkMethod(), responseObserver); + } + + /** + */ + default void getOpticalLink(context.ContextOuterClass.OpticalLinkId request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetOpticalLinkMethod(), responseObserver); + } + + /** + */ + default void getFiber(context.ContextOuterClass.FiberId request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetFiberMethod(), responseObserver); + } } /** @@ -1408,6 +1537,45 @@ public final class ContextServiceGrpc { public void getConnectionEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ClientCalls.asyncServerStreamingCall(getChannel().newCall(getGetConnectionEventsMethod(), getCallOptions()), request, responseObserver); } + + /** + *
+         * ------------------------------ Experimental -----------------------------
+         * 
+ */ + public void getOpticalConfig(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall(getChannel().newCall(getGetOpticalConfigMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void setOpticalConfig(context.ContextOuterClass.OpticalConfig request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall(getChannel().newCall(getSetOpticalConfigMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall(getChannel().newCall(getSelectOpticalConfigMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void setOpticalLink(context.ContextOuterClass.OpticalLink request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall(getChannel().newCall(getSetOpticalLinkMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void getOpticalLink(context.ContextOuterClass.OpticalLinkId request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall(getChannel().newCall(getGetOpticalLinkMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void getFiber(context.ContextOuterClass.FiberId request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall(getChannel().newCall(getGetFiberMethod(), getCallOptions()), request, responseObserver); + } } /** @@ -1717,6 +1885,45 @@ public final class ContextServiceGrpc { public java.util.Iterator getConnectionEvents(context.ContextOuterClass.Empty request) { return io.grpc.stub.ClientCalls.blockingServerStreamingCall(getChannel(), getGetConnectionEventsMethod(), getCallOptions(), request); } + + /** + *
+         * ------------------------------ Experimental -----------------------------
+         * 
+ */ + public context.ContextOuterClass.OpticalConfigList getOpticalConfig(context.ContextOuterClass.Empty request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall(getChannel(), getGetOpticalConfigMethod(), getCallOptions(), request); + } + + /** + */ + public context.ContextOuterClass.OpticalConfigId setOpticalConfig(context.ContextOuterClass.OpticalConfig request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall(getChannel(), getSetOpticalConfigMethod(), getCallOptions(), request); + } + + /** + */ + public context.ContextOuterClass.OpticalConfig selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall(getChannel(), getSelectOpticalConfigMethod(), getCallOptions(), request); + } + + /** + */ + public context.ContextOuterClass.Empty setOpticalLink(context.ContextOuterClass.OpticalLink request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall(getChannel(), getSetOpticalLinkMethod(), getCallOptions(), request); + } + + /** + */ + public context.ContextOuterClass.OpticalLink getOpticalLink(context.ContextOuterClass.OpticalLinkId request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall(getChannel(), getGetOpticalLinkMethod(), getCallOptions(), request); + } + + /** + */ + public context.ContextOuterClass.Fiber getFiber(context.ContextOuterClass.FiberId request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall(getChannel(), getGetFiberMethod(), getCallOptions(), request); + } } /** @@ -1984,6 +2191,45 @@ public final class ContextServiceGrpc { public com.google.common.util.concurrent.ListenableFuture removeConnection(context.ContextOuterClass.ConnectionId request) { return io.grpc.stub.ClientCalls.futureUnaryCall(getChannel().newCall(getRemoveConnectionMethod(), getCallOptions()), request); } + + /** + *
+         * ------------------------------ Experimental -----------------------------
+         * 
+ */ + public com.google.common.util.concurrent.ListenableFuture getOpticalConfig(context.ContextOuterClass.Empty request) { + return io.grpc.stub.ClientCalls.futureUnaryCall(getChannel().newCall(getGetOpticalConfigMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture setOpticalConfig(context.ContextOuterClass.OpticalConfig request) { + return io.grpc.stub.ClientCalls.futureUnaryCall(getChannel().newCall(getSetOpticalConfigMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request) { + return io.grpc.stub.ClientCalls.futureUnaryCall(getChannel().newCall(getSelectOpticalConfigMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture setOpticalLink(context.ContextOuterClass.OpticalLink request) { + return io.grpc.stub.ClientCalls.futureUnaryCall(getChannel().newCall(getSetOpticalLinkMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture getOpticalLink(context.ContextOuterClass.OpticalLinkId request) { + return io.grpc.stub.ClientCalls.futureUnaryCall(getChannel().newCall(getGetOpticalLinkMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture getFiber(context.ContextOuterClass.FiberId request) { + return io.grpc.stub.ClientCalls.futureUnaryCall(getChannel().newCall(getGetFiberMethod(), getCallOptions()), request); + } } private static final int METHODID_LIST_CONTEXT_IDS = 0; @@ -2084,6 +2330,18 @@ public final class ContextServiceGrpc { private static final int METHODID_GET_CONNECTION_EVENTS = 48; + private static final int METHODID_GET_OPTICAL_CONFIG = 49; + + private static final int METHODID_SET_OPTICAL_CONFIG = 50; + + private static final int METHODID_SELECT_OPTICAL_CONFIG = 51; + + private static final int METHODID_SET_OPTICAL_LINK = 52; + + private static final int METHODID_GET_OPTICAL_LINK = 53; + + private static final int METHODID_GET_FIBER = 54; + private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, io.grpc.stub.ServerCalls.ServerStreamingMethod, io.grpc.stub.ServerCalls.ClientStreamingMethod, io.grpc.stub.ServerCalls.BidiStreamingMethod { private final AsyncService serviceImpl; @@ -2246,6 +2504,24 @@ public final class ContextServiceGrpc { case METHODID_GET_CONNECTION_EVENTS: serviceImpl.getConnectionEvents((context.ContextOuterClass.Empty) request, (io.grpc.stub.StreamObserver) responseObserver); break; + case METHODID_GET_OPTICAL_CONFIG: + serviceImpl.getOpticalConfig((context.ContextOuterClass.Empty) request, (io.grpc.stub.StreamObserver) responseObserver); + break; + case METHODID_SET_OPTICAL_CONFIG: + serviceImpl.setOpticalConfig((context.ContextOuterClass.OpticalConfig) request, (io.grpc.stub.StreamObserver) responseObserver); + break; + case METHODID_SELECT_OPTICAL_CONFIG: + serviceImpl.selectOpticalConfig((context.ContextOuterClass.OpticalConfigId) request, (io.grpc.stub.StreamObserver) responseObserver); + break; + case METHODID_SET_OPTICAL_LINK: + serviceImpl.setOpticalLink((context.ContextOuterClass.OpticalLink) request, (io.grpc.stub.StreamObserver) responseObserver); + break; + case METHODID_GET_OPTICAL_LINK: + serviceImpl.getOpticalLink((context.ContextOuterClass.OpticalLinkId) request, (io.grpc.stub.StreamObserver) responseObserver); + break; + case METHODID_GET_FIBER: + serviceImpl.getFiber((context.ContextOuterClass.FiberId) request, (io.grpc.stub.StreamObserver) responseObserver); + break; default: throw new AssertionError(); } @@ -2262,7 +2538,7 @@ public final class ContextServiceGrpc { } public static io.grpc.ServerServiceDefinition bindService(AsyncService service) { - return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getListContextIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONTEXT_IDS))).addMethod(getListContextsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONTEXTS))).addMethod(getGetContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_CONTEXT))).addMethod(getSetContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_CONTEXT))).addMethod(getRemoveContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_CONTEXT))).addMethod(getGetContextEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_CONTEXT_EVENTS))).addMethod(getListTopologyIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_TOPOLOGY_IDS))).addMethod(getListTopologiesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_TOPOLOGIES))).addMethod(getGetTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY))).addMethod(getGetTopologyDetailsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY_DETAILS))).addMethod(getSetTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_TOPOLOGY))).addMethod(getRemoveTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_TOPOLOGY))).addMethod(getGetTopologyEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY_EVENTS))).addMethod(getListDeviceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_DEVICE_IDS))).addMethod(getListDevicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_DEVICES))).addMethod(getGetDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_DEVICE))).addMethod(getSetDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_DEVICE))).addMethod(getRemoveDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_DEVICE))).addMethod(getGetDeviceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_DEVICE_EVENTS))).addMethod(getSelectDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_DEVICE))).addMethod(getListEndPointNamesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_END_POINT_NAMES))).addMethod(getListLinkIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_LINK_IDS))).addMethod(getListLinksMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_LINKS))).addMethod(getGetLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_LINK))).addMethod(getSetLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_LINK))).addMethod(getRemoveLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_LINK))).addMethod(getGetLinkEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_LINK_EVENTS))).addMethod(getListServiceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SERVICE_IDS))).addMethod(getListServicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SERVICES))).addMethod(getGetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_SERVICE))).addMethod(getSetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_SERVICE))).addMethod(getUnsetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_UNSET_SERVICE))).addMethod(getRemoveServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_SERVICE))).addMethod(getGetServiceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_SERVICE_EVENTS))).addMethod(getSelectServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_SERVICE))).addMethod(getListSliceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SLICE_IDS))).addMethod(getListSlicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SLICES))).addMethod(getGetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_SLICE))).addMethod(getSetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_SLICE))).addMethod(getUnsetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_UNSET_SLICE))).addMethod(getRemoveSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_SLICE))).addMethod(getGetSliceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_SLICE_EVENTS))).addMethod(getSelectSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_SLICE))).addMethod(getListConnectionIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONNECTION_IDS))).addMethod(getListConnectionsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONNECTIONS))).addMethod(getGetConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_CONNECTION))).addMethod(getSetConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_CONNECTION))).addMethod(getRemoveConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_CONNECTION))).addMethod(getGetConnectionEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_CONNECTION_EVENTS))).build(); + return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getListContextIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONTEXT_IDS))).addMethod(getListContextsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONTEXTS))).addMethod(getGetContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_CONTEXT))).addMethod(getSetContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_CONTEXT))).addMethod(getRemoveContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_CONTEXT))).addMethod(getGetContextEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_CONTEXT_EVENTS))).addMethod(getListTopologyIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_TOPOLOGY_IDS))).addMethod(getListTopologiesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_TOPOLOGIES))).addMethod(getGetTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY))).addMethod(getGetTopologyDetailsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY_DETAILS))).addMethod(getSetTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_TOPOLOGY))).addMethod(getRemoveTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_TOPOLOGY))).addMethod(getGetTopologyEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY_EVENTS))).addMethod(getListDeviceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_DEVICE_IDS))).addMethod(getListDevicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_DEVICES))).addMethod(getGetDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_DEVICE))).addMethod(getSetDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_DEVICE))).addMethod(getRemoveDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_DEVICE))).addMethod(getGetDeviceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_DEVICE_EVENTS))).addMethod(getSelectDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_DEVICE))).addMethod(getListEndPointNamesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_END_POINT_NAMES))).addMethod(getListLinkIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_LINK_IDS))).addMethod(getListLinksMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_LINKS))).addMethod(getGetLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_LINK))).addMethod(getSetLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_LINK))).addMethod(getRemoveLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_LINK))).addMethod(getGetLinkEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_LINK_EVENTS))).addMethod(getListServiceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SERVICE_IDS))).addMethod(getListServicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SERVICES))).addMethod(getGetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_SERVICE))).addMethod(getSetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_SERVICE))).addMethod(getUnsetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_UNSET_SERVICE))).addMethod(getRemoveServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_SERVICE))).addMethod(getGetServiceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_SERVICE_EVENTS))).addMethod(getSelectServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_SERVICE))).addMethod(getListSliceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SLICE_IDS))).addMethod(getListSlicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SLICES))).addMethod(getGetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_SLICE))).addMethod(getSetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_SLICE))).addMethod(getUnsetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_UNSET_SLICE))).addMethod(getRemoveSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_SLICE))).addMethod(getGetSliceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_SLICE_EVENTS))).addMethod(getSelectSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_SLICE))).addMethod(getListConnectionIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONNECTION_IDS))).addMethod(getListConnectionsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONNECTIONS))).addMethod(getGetConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_CONNECTION))).addMethod(getSetConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_CONNECTION))).addMethod(getRemoveConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_CONNECTION))).addMethod(getGetConnectionEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_CONNECTION_EVENTS))).addMethod(getGetOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_OPTICAL_CONFIG))).addMethod(getSetOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_OPTICAL_CONFIG))).addMethod(getSelectOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_OPTICAL_CONFIG))).addMethod(getSetOpticalLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_OPTICAL_LINK))).addMethod(getGetOpticalLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_OPTICAL_LINK))).addMethod(getGetFiberMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_FIBER))).build(); } private static abstract class ContextServiceBaseDescriptorSupplier implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier { @@ -2309,7 +2585,7 @@ public final class ContextServiceGrpc { synchronized (ContextServiceGrpc.class) { result = serviceDescriptor; if (result == null) { - serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME).setSchemaDescriptor(new ContextServiceFileDescriptorSupplier()).addMethod(getListContextIdsMethod()).addMethod(getListContextsMethod()).addMethod(getGetContextMethod()).addMethod(getSetContextMethod()).addMethod(getRemoveContextMethod()).addMethod(getGetContextEventsMethod()).addMethod(getListTopologyIdsMethod()).addMethod(getListTopologiesMethod()).addMethod(getGetTopologyMethod()).addMethod(getGetTopologyDetailsMethod()).addMethod(getSetTopologyMethod()).addMethod(getRemoveTopologyMethod()).addMethod(getGetTopologyEventsMethod()).addMethod(getListDeviceIdsMethod()).addMethod(getListDevicesMethod()).addMethod(getGetDeviceMethod()).addMethod(getSetDeviceMethod()).addMethod(getRemoveDeviceMethod()).addMethod(getGetDeviceEventsMethod()).addMethod(getSelectDeviceMethod()).addMethod(getListEndPointNamesMethod()).addMethod(getListLinkIdsMethod()).addMethod(getListLinksMethod()).addMethod(getGetLinkMethod()).addMethod(getSetLinkMethod()).addMethod(getRemoveLinkMethod()).addMethod(getGetLinkEventsMethod()).addMethod(getListServiceIdsMethod()).addMethod(getListServicesMethod()).addMethod(getGetServiceMethod()).addMethod(getSetServiceMethod()).addMethod(getUnsetServiceMethod()).addMethod(getRemoveServiceMethod()).addMethod(getGetServiceEventsMethod()).addMethod(getSelectServiceMethod()).addMethod(getListSliceIdsMethod()).addMethod(getListSlicesMethod()).addMethod(getGetSliceMethod()).addMethod(getSetSliceMethod()).addMethod(getUnsetSliceMethod()).addMethod(getRemoveSliceMethod()).addMethod(getGetSliceEventsMethod()).addMethod(getSelectSliceMethod()).addMethod(getListConnectionIdsMethod()).addMethod(getListConnectionsMethod()).addMethod(getGetConnectionMethod()).addMethod(getSetConnectionMethod()).addMethod(getRemoveConnectionMethod()).addMethod(getGetConnectionEventsMethod()).build(); + serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME).setSchemaDescriptor(new ContextServiceFileDescriptorSupplier()).addMethod(getListContextIdsMethod()).addMethod(getListContextsMethod()).addMethod(getGetContextMethod()).addMethod(getSetContextMethod()).addMethod(getRemoveContextMethod()).addMethod(getGetContextEventsMethod()).addMethod(getListTopologyIdsMethod()).addMethod(getListTopologiesMethod()).addMethod(getGetTopologyMethod()).addMethod(getGetTopologyDetailsMethod()).addMethod(getSetTopologyMethod()).addMethod(getRemoveTopologyMethod()).addMethod(getGetTopologyEventsMethod()).addMethod(getListDeviceIdsMethod()).addMethod(getListDevicesMethod()).addMethod(getGetDeviceMethod()).addMethod(getSetDeviceMethod()).addMethod(getRemoveDeviceMethod()).addMethod(getGetDeviceEventsMethod()).addMethod(getSelectDeviceMethod()).addMethod(getListEndPointNamesMethod()).addMethod(getListLinkIdsMethod()).addMethod(getListLinksMethod()).addMethod(getGetLinkMethod()).addMethod(getSetLinkMethod()).addMethod(getRemoveLinkMethod()).addMethod(getGetLinkEventsMethod()).addMethod(getListServiceIdsMethod()).addMethod(getListServicesMethod()).addMethod(getGetServiceMethod()).addMethod(getSetServiceMethod()).addMethod(getUnsetServiceMethod()).addMethod(getRemoveServiceMethod()).addMethod(getGetServiceEventsMethod()).addMethod(getSelectServiceMethod()).addMethod(getListSliceIdsMethod()).addMethod(getListSlicesMethod()).addMethod(getGetSliceMethod()).addMethod(getSetSliceMethod()).addMethod(getUnsetSliceMethod()).addMethod(getRemoveSliceMethod()).addMethod(getGetSliceEventsMethod()).addMethod(getSelectSliceMethod()).addMethod(getListConnectionIdsMethod()).addMethod(getListConnectionsMethod()).addMethod(getGetConnectionMethod()).addMethod(getSetConnectionMethod()).addMethod(getRemoveConnectionMethod()).addMethod(getGetConnectionEventsMethod()).addMethod(getGetOpticalConfigMethod()).addMethod(getSetOpticalConfigMethod()).addMethod(getSelectOpticalConfigMethod()).addMethod(getSetOpticalLinkMethod()).addMethod(getGetOpticalLinkMethod()).addMethod(getGetFiberMethod()).build(); } } } diff --git a/src/ztp/target/generated-sources/grpc/context/MutinyContextServiceGrpc.java b/src/ztp/target/generated-sources/grpc/context/MutinyContextServiceGrpc.java index 247bf18ae..c6dbb1e92 100644 --- a/src/ztp/target/generated-sources/grpc/context/MutinyContextServiceGrpc.java +++ b/src/ztp/target/generated-sources/grpc/context/MutinyContextServiceGrpc.java @@ -203,6 +203,35 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.MutinyGrp return io.quarkus.grpc.stubs.ClientCalls.oneToOne(request, delegateStub::removeConnection); } + /** + *
+         *  ------------------------------ Experimental -----------------------------
+         * 
+ */ + public io.smallrye.mutiny.Uni getOpticalConfig(context.ContextOuterClass.Empty request) { + return io.quarkus.grpc.stubs.ClientCalls.oneToOne(request, delegateStub::getOpticalConfig); + } + + public io.smallrye.mutiny.Uni setOpticalConfig(context.ContextOuterClass.OpticalConfig request) { + return io.quarkus.grpc.stubs.ClientCalls.oneToOne(request, delegateStub::setOpticalConfig); + } + + public io.smallrye.mutiny.Uni selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request) { + return io.quarkus.grpc.stubs.ClientCalls.oneToOne(request, delegateStub::selectOpticalConfig); + } + + public io.smallrye.mutiny.Uni setOpticalLink(context.ContextOuterClass.OpticalLink request) { + return io.quarkus.grpc.stubs.ClientCalls.oneToOne(request, delegateStub::setOpticalLink); + } + + public io.smallrye.mutiny.Uni getOpticalLink(context.ContextOuterClass.OpticalLinkId request) { + return io.quarkus.grpc.stubs.ClientCalls.oneToOne(request, delegateStub::getOpticalLink); + } + + public io.smallrye.mutiny.Uni getFiber(context.ContextOuterClass.FiberId request) { + return io.quarkus.grpc.stubs.ClientCalls.oneToOne(request, delegateStub::getFiber); + } + public io.smallrye.mutiny.Multi getContextEvents(context.ContextOuterClass.Empty request) { return io.quarkus.grpc.stubs.ClientCalls.oneToMany(request, delegateStub::getContextEvents); } @@ -414,6 +443,35 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.MutinyGrp throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); } + /** + *
+         *  ------------------------------ Experimental -----------------------------
+         * 
+ */ + public io.smallrye.mutiny.Uni getOpticalConfig(context.ContextOuterClass.Empty request) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + + public io.smallrye.mutiny.Uni setOpticalConfig(context.ContextOuterClass.OpticalConfig request) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + + public io.smallrye.mutiny.Uni selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + + public io.smallrye.mutiny.Uni setOpticalLink(context.ContextOuterClass.OpticalLink request) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + + public io.smallrye.mutiny.Uni getOpticalLink(context.ContextOuterClass.OpticalLinkId request) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + + public io.smallrye.mutiny.Uni getFiber(context.ContextOuterClass.FiberId request) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + public io.smallrye.mutiny.Multi getContextEvents(context.ContextOuterClass.Empty request) { throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); } @@ -444,7 +502,7 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.MutinyGrp @java.lang.Override public io.grpc.ServerServiceDefinition bindService() { - return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(context.ContextServiceGrpc.getListContextIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONTEXT_IDS, compression))).addMethod(context.ContextServiceGrpc.getListContextsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONTEXTS, compression))).addMethod(context.ContextServiceGrpc.getGetContextMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_CONTEXT, compression))).addMethod(context.ContextServiceGrpc.getSetContextMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_CONTEXT, compression))).addMethod(context.ContextServiceGrpc.getRemoveContextMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_CONTEXT, compression))).addMethod(context.ContextServiceGrpc.getGetContextEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_CONTEXT_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getListTopologyIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_TOPOLOGY_IDS, compression))).addMethod(context.ContextServiceGrpc.getListTopologiesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_TOPOLOGIES, compression))).addMethod(context.ContextServiceGrpc.getGetTopologyMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY, compression))).addMethod(context.ContextServiceGrpc.getGetTopologyDetailsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY_DETAILS, compression))).addMethod(context.ContextServiceGrpc.getSetTopologyMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_TOPOLOGY, compression))).addMethod(context.ContextServiceGrpc.getRemoveTopologyMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_TOPOLOGY, compression))).addMethod(context.ContextServiceGrpc.getGetTopologyEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getListDeviceIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_DEVICE_IDS, compression))).addMethod(context.ContextServiceGrpc.getListDevicesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_DEVICES, compression))).addMethod(context.ContextServiceGrpc.getGetDeviceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_DEVICE, compression))).addMethod(context.ContextServiceGrpc.getSetDeviceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_DEVICE, compression))).addMethod(context.ContextServiceGrpc.getRemoveDeviceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_DEVICE, compression))).addMethod(context.ContextServiceGrpc.getGetDeviceEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_DEVICE_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getSelectDeviceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_DEVICE, compression))).addMethod(context.ContextServiceGrpc.getListEndPointNamesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_END_POINT_NAMES, compression))).addMethod(context.ContextServiceGrpc.getListLinkIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_LINK_IDS, compression))).addMethod(context.ContextServiceGrpc.getListLinksMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_LINKS, compression))).addMethod(context.ContextServiceGrpc.getGetLinkMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_LINK, compression))).addMethod(context.ContextServiceGrpc.getSetLinkMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_LINK, compression))).addMethod(context.ContextServiceGrpc.getRemoveLinkMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_LINK, compression))).addMethod(context.ContextServiceGrpc.getGetLinkEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_LINK_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getListServiceIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SERVICE_IDS, compression))).addMethod(context.ContextServiceGrpc.getListServicesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SERVICES, compression))).addMethod(context.ContextServiceGrpc.getGetServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getSetServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getUnsetServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_UNSET_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getRemoveServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getGetServiceEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_SERVICE_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getSelectServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getListSliceIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SLICE_IDS, compression))).addMethod(context.ContextServiceGrpc.getListSlicesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SLICES, compression))).addMethod(context.ContextServiceGrpc.getGetSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_SLICE, compression))).addMethod(context.ContextServiceGrpc.getSetSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_SLICE, compression))).addMethod(context.ContextServiceGrpc.getUnsetSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_UNSET_SLICE, compression))).addMethod(context.ContextServiceGrpc.getRemoveSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_SLICE, compression))).addMethod(context.ContextServiceGrpc.getGetSliceEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_SLICE_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getSelectSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_SLICE, compression))).addMethod(context.ContextServiceGrpc.getListConnectionIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONNECTION_IDS, compression))).addMethod(context.ContextServiceGrpc.getListConnectionsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONNECTIONS, compression))).addMethod(context.ContextServiceGrpc.getGetConnectionMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_CONNECTION, compression))).addMethod(context.ContextServiceGrpc.getSetConnectionMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_CONNECTION, compression))).addMethod(context.ContextServiceGrpc.getRemoveConnectionMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_CONNECTION, compression))).addMethod(context.ContextServiceGrpc.getGetConnectionEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_CONNECTION_EVENTS, compression))).build(); + return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(context.ContextServiceGrpc.getListContextIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONTEXT_IDS, compression))).addMethod(context.ContextServiceGrpc.getListContextsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONTEXTS, compression))).addMethod(context.ContextServiceGrpc.getGetContextMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_CONTEXT, compression))).addMethod(context.ContextServiceGrpc.getSetContextMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_CONTEXT, compression))).addMethod(context.ContextServiceGrpc.getRemoveContextMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_CONTEXT, compression))).addMethod(context.ContextServiceGrpc.getGetContextEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_CONTEXT_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getListTopologyIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_TOPOLOGY_IDS, compression))).addMethod(context.ContextServiceGrpc.getListTopologiesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_TOPOLOGIES, compression))).addMethod(context.ContextServiceGrpc.getGetTopologyMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY, compression))).addMethod(context.ContextServiceGrpc.getGetTopologyDetailsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY_DETAILS, compression))).addMethod(context.ContextServiceGrpc.getSetTopologyMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_TOPOLOGY, compression))).addMethod(context.ContextServiceGrpc.getRemoveTopologyMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_TOPOLOGY, compression))).addMethod(context.ContextServiceGrpc.getGetTopologyEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getListDeviceIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_DEVICE_IDS, compression))).addMethod(context.ContextServiceGrpc.getListDevicesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_DEVICES, compression))).addMethod(context.ContextServiceGrpc.getGetDeviceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_DEVICE, compression))).addMethod(context.ContextServiceGrpc.getSetDeviceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_DEVICE, compression))).addMethod(context.ContextServiceGrpc.getRemoveDeviceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_DEVICE, compression))).addMethod(context.ContextServiceGrpc.getGetDeviceEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_DEVICE_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getSelectDeviceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_DEVICE, compression))).addMethod(context.ContextServiceGrpc.getListEndPointNamesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_END_POINT_NAMES, compression))).addMethod(context.ContextServiceGrpc.getListLinkIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_LINK_IDS, compression))).addMethod(context.ContextServiceGrpc.getListLinksMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_LINKS, compression))).addMethod(context.ContextServiceGrpc.getGetLinkMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_LINK, compression))).addMethod(context.ContextServiceGrpc.getSetLinkMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_LINK, compression))).addMethod(context.ContextServiceGrpc.getRemoveLinkMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_LINK, compression))).addMethod(context.ContextServiceGrpc.getGetLinkEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_LINK_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getListServiceIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SERVICE_IDS, compression))).addMethod(context.ContextServiceGrpc.getListServicesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SERVICES, compression))).addMethod(context.ContextServiceGrpc.getGetServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getSetServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getUnsetServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_UNSET_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getRemoveServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getGetServiceEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_SERVICE_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getSelectServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getListSliceIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SLICE_IDS, compression))).addMethod(context.ContextServiceGrpc.getListSlicesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SLICES, compression))).addMethod(context.ContextServiceGrpc.getGetSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_SLICE, compression))).addMethod(context.ContextServiceGrpc.getSetSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_SLICE, compression))).addMethod(context.ContextServiceGrpc.getUnsetSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_UNSET_SLICE, compression))).addMethod(context.ContextServiceGrpc.getRemoveSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_SLICE, compression))).addMethod(context.ContextServiceGrpc.getGetSliceEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_SLICE_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getSelectSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_SLICE, compression))).addMethod(context.ContextServiceGrpc.getListConnectionIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONNECTION_IDS, compression))).addMethod(context.ContextServiceGrpc.getListConnectionsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONNECTIONS, compression))).addMethod(context.ContextServiceGrpc.getGetConnectionMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_CONNECTION, compression))).addMethod(context.ContextServiceGrpc.getSetConnectionMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_CONNECTION, compression))).addMethod(context.ContextServiceGrpc.getRemoveConnectionMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_CONNECTION, compression))).addMethod(context.ContextServiceGrpc.getGetConnectionEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_CONNECTION_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getGetOpticalConfigMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_OPTICAL_CONFIG, compression))).addMethod(context.ContextServiceGrpc.getSetOpticalConfigMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_OPTICAL_CONFIG, compression))).addMethod(context.ContextServiceGrpc.getSelectOpticalConfigMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_OPTICAL_CONFIG, compression))).addMethod(context.ContextServiceGrpc.getSetOpticalLinkMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_OPTICAL_LINK, compression))).addMethod(context.ContextServiceGrpc.getGetOpticalLinkMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_OPTICAL_LINK, compression))).addMethod(context.ContextServiceGrpc.getGetFiberMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_FIBER, compression))).build(); } } @@ -546,6 +604,18 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.MutinyGrp private static final int METHODID_GET_CONNECTION_EVENTS = 48; + private static final int METHODID_GET_OPTICAL_CONFIG = 49; + + private static final int METHODID_SET_OPTICAL_CONFIG = 50; + + private static final int METHODID_SELECT_OPTICAL_CONFIG = 51; + + private static final int METHODID_SET_OPTICAL_LINK = 52; + + private static final int METHODID_GET_OPTICAL_LINK = 53; + + private static final int METHODID_GET_FIBER = 54; + private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, io.grpc.stub.ServerCalls.ServerStreamingMethod, io.grpc.stub.ServerCalls.ClientStreamingMethod, io.grpc.stub.ServerCalls.BidiStreamingMethod { private final ContextServiceImplBase serviceImpl; @@ -711,6 +781,24 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.MutinyGrp case METHODID_GET_CONNECTION_EVENTS: io.quarkus.grpc.stubs.ServerCalls.oneToMany((context.ContextOuterClass.Empty) request, (io.grpc.stub.StreamObserver) responseObserver, compression, serviceImpl::getConnectionEvents); break; + case METHODID_GET_OPTICAL_CONFIG: + io.quarkus.grpc.stubs.ServerCalls.oneToOne((context.ContextOuterClass.Empty) request, (io.grpc.stub.StreamObserver) responseObserver, compression, serviceImpl::getOpticalConfig); + break; + case METHODID_SET_OPTICAL_CONFIG: + io.quarkus.grpc.stubs.ServerCalls.oneToOne((context.ContextOuterClass.OpticalConfig) request, (io.grpc.stub.StreamObserver) responseObserver, compression, serviceImpl::setOpticalConfig); + break; + case METHODID_SELECT_OPTICAL_CONFIG: + io.quarkus.grpc.stubs.ServerCalls.oneToOne((context.ContextOuterClass.OpticalConfigId) request, (io.grpc.stub.StreamObserver) responseObserver, compression, serviceImpl::selectOpticalConfig); + break; + case METHODID_SET_OPTICAL_LINK: + io.quarkus.grpc.stubs.ServerCalls.oneToOne((context.ContextOuterClass.OpticalLink) request, (io.grpc.stub.StreamObserver) responseObserver, compression, serviceImpl::setOpticalLink); + break; + case METHODID_GET_OPTICAL_LINK: + io.quarkus.grpc.stubs.ServerCalls.oneToOne((context.ContextOuterClass.OpticalLinkId) request, (io.grpc.stub.StreamObserver) responseObserver, compression, serviceImpl::getOpticalLink); + break; + case METHODID_GET_FIBER: + io.quarkus.grpc.stubs.ServerCalls.oneToOne((context.ContextOuterClass.FiberId) request, (io.grpc.stub.StreamObserver) responseObserver, compression, serviceImpl::getFiber); + break; default: throw new java.lang.AssertionError(); } diff --git a/src/ztp/target/kubernetes/kubernetes.yml b/src/ztp/target/kubernetes/kubernetes.yml index 9f78cd52f..3e619f614 100644 --- a/src/ztp/target/kubernetes/kubernetes.yml +++ b/src/ztp/target/kubernetes/kubernetes.yml @@ -3,8 +3,8 @@ apiVersion: v1 kind: Service metadata: annotations: - app.quarkus.io/commit-id: 9fcc34bb0e7806d8a5ca5f75cbf3cb9e3358d756 - app.quarkus.io/build-timestamp: 2024-02-15 - 11:02:55 +0000 + app.quarkus.io/commit-id: 872beaea149552efa0ee9a8a38c5a2cc2d8e586f + app.quarkus.io/build-timestamp: 2024-04-04 - 09:34:08 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -17,18 +17,18 @@ metadata: name: ztpservice spec: ports: - - name: https - port: 443 + - name: http + port: 9192 protocol: TCP - targetPort: 8443 + targetPort: 8080 - name: grpc port: 5050 protocol: TCP targetPort: 5050 - - name: http - port: 9192 + - name: https + port: 443 protocol: TCP - targetPort: 8080 + targetPort: 8443 selector: app.kubernetes.io/name: ztpservice type: ClusterIP @@ -37,8 +37,8 @@ apiVersion: apps/v1 kind: Deployment metadata: annotations: - app.quarkus.io/commit-id: 9fcc34bb0e7806d8a5ca5f75cbf3cb9e3358d756 - app.quarkus.io/build-timestamp: 2024-02-15 - 11:02:55 +0000 + app.quarkus.io/commit-id: 872beaea149552efa0ee9a8a38c5a2cc2d8e586f + app.quarkus.io/build-timestamp: 2024-04-04 - 09:34:08 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -46,8 +46,8 @@ metadata: labels: app: ztpservice app.kubernetes.io/managed-by: quarkus - app.kubernetes.io/version: 0.2.0 app.kubernetes.io/name: ztpservice + app.kubernetes.io/version: 0.2.0 name: ztpservice spec: replicas: 1 @@ -57,8 +57,8 @@ spec: template: metadata: annotations: - app.quarkus.io/commit-id: 9fcc34bb0e7806d8a5ca5f75cbf3cb9e3358d756 - app.quarkus.io/build-timestamp: 2024-02-15 - 11:02:55 +0000 + app.quarkus.io/commit-id: 872beaea149552efa0ee9a8a38c5a2cc2d8e586f + app.quarkus.io/build-timestamp: 2024-04-04 - 09:34:08 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -66,8 +66,8 @@ spec: labels: app: ztpservice app.kubernetes.io/managed-by: quarkus - app.kubernetes.io/version: 0.2.0 app.kubernetes.io/name: ztpservice + app.kubernetes.io/version: 0.2.0 spec: containers: - env: @@ -75,10 +75,10 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - - name: CONTEXT_SERVICE_HOST - value: contextservice - name: DEVICE_SERVICE_HOST value: deviceservice + - name: CONTEXT_SERVICE_HOST + value: contextservice image: labs.etsi.org:5050/tfs/controller/ztp:0.2.0 imagePullPolicy: Always livenessProbe: @@ -93,14 +93,14 @@ spec: timeoutSeconds: 10 name: ztpservice ports: - - containerPort: 8443 - name: https + - containerPort: 8080 + name: http protocol: TCP - containerPort: 5050 name: grpc protocol: TCP - - containerPort: 8080 - name: http + - containerPort: 8443 + name: https protocol: TCP readinessProbe: failureThreshold: 3 -- GitLab From 8613c5a503c65f450985a587a0889f2acac007a9 Mon Sep 17 00:00:00 2001 From: kpoulakakis Date: Thu, 4 Apr 2024 12:35:44 +0300 Subject: [PATCH 058/602] refactor: update kubernetes.yml --- src/ztp/target/kubernetes/kubernetes.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ztp/target/kubernetes/kubernetes.yml b/src/ztp/target/kubernetes/kubernetes.yml index 3e619f614..442ff876a 100644 --- a/src/ztp/target/kubernetes/kubernetes.yml +++ b/src/ztp/target/kubernetes/kubernetes.yml @@ -3,8 +3,8 @@ apiVersion: v1 kind: Service metadata: annotations: - app.quarkus.io/commit-id: 872beaea149552efa0ee9a8a38c5a2cc2d8e586f - app.quarkus.io/build-timestamp: 2024-04-04 - 09:34:08 +0000 + app.quarkus.io/commit-id: 7fce72764fa6bb9b37b407bbcba502cc0a23735f + app.quarkus.io/build-timestamp: 2024-04-04 - 09:35:22 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -37,8 +37,8 @@ apiVersion: apps/v1 kind: Deployment metadata: annotations: - app.quarkus.io/commit-id: 872beaea149552efa0ee9a8a38c5a2cc2d8e586f - app.quarkus.io/build-timestamp: 2024-04-04 - 09:34:08 +0000 + app.quarkus.io/commit-id: 7fce72764fa6bb9b37b407bbcba502cc0a23735f + app.quarkus.io/build-timestamp: 2024-04-04 - 09:35:22 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -57,8 +57,8 @@ spec: template: metadata: annotations: - app.quarkus.io/commit-id: 872beaea149552efa0ee9a8a38c5a2cc2d8e586f - app.quarkus.io/build-timestamp: 2024-04-04 - 09:34:08 +0000 + app.quarkus.io/commit-id: 7fce72764fa6bb9b37b407bbcba502cc0a23735f + app.quarkus.io/build-timestamp: 2024-04-04 - 09:35:22 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" -- GitLab From 182b55a46135040b71a5980de9f72d94a85db2e8 Mon Sep 17 00:00:00 2001 From: kpoulakakis Date: Thu, 4 Apr 2024 17:48:18 +0300 Subject: [PATCH 059/602] refactor: some changes from proto files. --- .../grpc/context/ContextOuterClass.java | 7290 ++++++++++++++++- .../grpc/context/ContextService.java | 17 + .../grpc/context/ContextServiceBean.java | 54 + .../grpc/context/ContextServiceClient.java | 30 + .../grpc/context/ContextServiceGrpc.java | 280 +- .../context/MutinyContextServiceGrpc.java | 90 +- src/policy/target/kubernetes/kubernetes.yml | 24 +- 7 files changed, 7669 insertions(+), 116 deletions(-) diff --git a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java index 22679d792..9bcff8a50 100644 --- a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java +++ b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java @@ -191,6 +191,10 @@ public final class ContextOuterClass { * DEVICEDRIVER_IETF_ACTN = 10; */ DEVICEDRIVER_IETF_ACTN(10), + /** + * DEVICEDRIVER_OC = 11; + */ + DEVICEDRIVER_OC(11), UNRECOGNIZED(-1); /** @@ -252,6 +256,11 @@ public final class ContextOuterClass { */ public static final int DEVICEDRIVER_IETF_ACTN_VALUE = 10; + /** + * DEVICEDRIVER_OC = 11; + */ + public static final int DEVICEDRIVER_OC_VALUE = 11; + public final int getNumber() { if (this == UNRECOGNIZED) { throw new java.lang.IllegalArgumentException("Can't get the number of an unknown enum value."); @@ -297,6 +306,8 @@ public final class ContextOuterClass { return DEVICEDRIVER_FLEXSCALE; case 10: return DEVICEDRIVER_IETF_ACTN; + case 11: + return DEVICEDRIVER_OC; default: return null; } @@ -489,6 +500,10 @@ public final class ContextOuterClass { * SERVICETYPE_E2E = 5; */ SERVICETYPE_E2E(5), + /** + * SERVICETYPE_OPTICAL_CONNECTIVITY = 6; + */ + SERVICETYPE_OPTICAL_CONNECTIVITY(6), UNRECOGNIZED(-1); /** @@ -521,6 +536,11 @@ public final class ContextOuterClass { */ public static final int SERVICETYPE_E2E_VALUE = 5; + /** + * SERVICETYPE_OPTICAL_CONNECTIVITY = 6; + */ + public static final int SERVICETYPE_OPTICAL_CONNECTIVITY_VALUE = 6; + public final int getNumber() { if (this == UNRECOGNIZED) { throw new java.lang.IllegalArgumentException("Can't get the number of an unknown enum value."); @@ -556,6 +576,8 @@ public final class ContextOuterClass { return SERVICETYPE_TE; case 5: return SERVICETYPE_E2E; + case 6: + return SERVICETYPE_OPTICAL_CONNECTIVITY; default: return null; } @@ -69295,199 +69317,7217 @@ public final class ContextOuterClass { } } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Empty_descriptor; - - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Empty_fieldAccessorTable; - - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Uuid_descriptor; - - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Uuid_fieldAccessorTable; + public interface OpticalConfigIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfigId) + com.google.protobuf.MessageOrBuilder { - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Timestamp_descriptor; + /** + * string opticalconfig_uuid = 1; + * @return The opticalconfigUuid. + */ + java.lang.String getOpticalconfigUuid(); - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Timestamp_fieldAccessorTable; + /** + * string opticalconfig_uuid = 1; + * @return The bytes for opticalconfigUuid. + */ + com.google.protobuf.ByteString getOpticalconfigUuidBytes(); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Event_descriptor; + /** + *
+     * ---------------- Experimental ------------------------
+     * 
+ * + * Protobuf type {@code context.OpticalConfigId} + */ + public static final class OpticalConfigId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfigId) + OpticalConfigIdOrBuilder { - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Event_fieldAccessorTable; + private static final long serialVersionUID = 0L; - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ContextId_descriptor; + // Use OpticalConfigId.newBuilder() to construct. + private OpticalConfigId(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ContextId_fieldAccessorTable; + private OpticalConfigId() { + opticalconfigUuid_ = ""; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Context_descriptor; + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new OpticalConfigId(); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Context_fieldAccessorTable; + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalConfigId_descriptor; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ContextIdList_descriptor; + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalConfigId_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalConfigId.class, context.ContextOuterClass.OpticalConfigId.Builder.class); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ContextIdList_fieldAccessorTable; + public static final int OPTICALCONFIG_UUID_FIELD_NUMBER = 1; - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ContextList_descriptor; + @SuppressWarnings("serial") + private volatile java.lang.Object opticalconfigUuid_ = ""; - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ContextList_fieldAccessorTable; + /** + * string opticalconfig_uuid = 1; + * @return The opticalconfigUuid. + */ + @java.lang.Override + public java.lang.String getOpticalconfigUuid() { + java.lang.Object ref = opticalconfigUuid_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + opticalconfigUuid_ = s; + return s; + } + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ContextEvent_descriptor; + /** + * string opticalconfig_uuid = 1; + * @return The bytes for opticalconfigUuid. + */ + @java.lang.Override + public com.google.protobuf.ByteString getOpticalconfigUuidBytes() { + java.lang.Object ref = opticalconfigUuid_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + opticalconfigUuid_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ContextEvent_fieldAccessorTable; + private byte memoizedIsInitialized = -1; - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyId_descriptor; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + memoizedIsInitialized = 1; + return true; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyId_fieldAccessorTable; + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(opticalconfigUuid_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, opticalconfigUuid_); + } + getUnknownFields().writeTo(output); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Topology_descriptor; + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(opticalconfigUuid_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, opticalconfigUuid_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Topology_fieldAccessorTable; + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof context.ContextOuterClass.OpticalConfigId)) { + return super.equals(obj); + } + context.ContextOuterClass.OpticalConfigId other = (context.ContextOuterClass.OpticalConfigId) obj; + if (!getOpticalconfigUuid().equals(other.getOpticalconfigUuid())) + return false; + if (!getUnknownFields().equals(other.getUnknownFields())) + return false; + return true; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyDetails_descriptor; + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + OPTICALCONFIG_UUID_FIELD_NUMBER; + hash = (53 * hash) + getOpticalconfigUuid().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyDetails_fieldAccessorTable; + public static context.ContextOuterClass.OpticalConfigId parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyIdList_descriptor; + public static context.ContextOuterClass.OpticalConfigId parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyIdList_fieldAccessorTable; + public static context.ContextOuterClass.OpticalConfigId parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyList_descriptor; + public static context.ContextOuterClass.OpticalConfigId parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyList_fieldAccessorTable; + public static context.ContextOuterClass.OpticalConfigId parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyEvent_descriptor; + public static context.ContextOuterClass.OpticalConfigId parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyEvent_fieldAccessorTable; + public static context.ContextOuterClass.OpticalConfigId parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceId_descriptor; + public static context.ContextOuterClass.OpticalConfigId parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceId_fieldAccessorTable; + public static context.ContextOuterClass.OpticalConfigId parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Device_descriptor; + public static context.ContextOuterClass.OpticalConfigId parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Device_fieldAccessorTable; + public static context.ContextOuterClass.OpticalConfigId parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Component_descriptor; + public static context.ContextOuterClass.OpticalConfigId parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Component_fieldAccessorTable; + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Component_AttributesEntry_descriptor; + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Component_AttributesEntry_fieldAccessorTable; + public static Builder newBuilder(context.ContextOuterClass.OpticalConfigId prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceConfig_descriptor; + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceConfig_fieldAccessorTable; + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceIdList_descriptor; + /** + *
+         * ---------------- Experimental ------------------------
+         * 
+ * + * Protobuf type {@code context.OpticalConfigId} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalConfigId) + context.ContextOuterClass.OpticalConfigIdOrBuilder { - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceIdList_fieldAccessorTable; + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalConfigId_descriptor; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceList_descriptor; + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalConfigId_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalConfigId.class, context.ContextOuterClass.OpticalConfigId.Builder.class); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceList_fieldAccessorTable; + // Construct using context.ContextOuterClass.OpticalConfigId.newBuilder() + private Builder() { + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceFilter_descriptor; + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceFilter_fieldAccessorTable; + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + opticalconfigUuid_ = ""; + return this; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceEvent_descriptor; + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return context.ContextOuterClass.internal_static_context_OpticalConfigId_descriptor; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceEvent_fieldAccessorTable; + @java.lang.Override + public context.ContextOuterClass.OpticalConfigId getDefaultInstanceForType() { + return context.ContextOuterClass.OpticalConfigId.getDefaultInstance(); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkId_descriptor; + @java.lang.Override + public context.ContextOuterClass.OpticalConfigId build() { + context.ContextOuterClass.OpticalConfigId result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkId_fieldAccessorTable; + @java.lang.Override + public context.ContextOuterClass.OpticalConfigId buildPartial() { + context.ContextOuterClass.OpticalConfigId result = new context.ContextOuterClass.OpticalConfigId(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkAttributes_descriptor; + private void buildPartial0(context.ContextOuterClass.OpticalConfigId result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.opticalconfigUuid_ = opticalconfigUuid_; + } + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkAttributes_fieldAccessorTable; + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof context.ContextOuterClass.OpticalConfigId) { + return mergeFrom((context.ContextOuterClass.OpticalConfigId) other); + } else { + super.mergeFrom(other); + return this; + } + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Link_descriptor; + public Builder mergeFrom(context.ContextOuterClass.OpticalConfigId other) { + if (other == context.ContextOuterClass.OpticalConfigId.getDefaultInstance()) + return this; + if (!other.getOpticalconfigUuid().isEmpty()) { + opticalconfigUuid_ = other.opticalconfigUuid_; + bitField0_ |= 0x00000001; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Link_fieldAccessorTable; + @java.lang.Override + public final boolean isInitialized() { + return true; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkIdList_descriptor; + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + opticalconfigUuid_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } + // case 10 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkIdList_fieldAccessorTable; + private int bitField0_; - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkList_descriptor; + private java.lang.Object opticalconfigUuid_ = ""; - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkList_fieldAccessorTable; + /** + * string opticalconfig_uuid = 1; + * @return The opticalconfigUuid. + */ + public java.lang.String getOpticalconfigUuid() { + java.lang.Object ref = opticalconfigUuid_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + opticalconfigUuid_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkEvent_descriptor; + /** + * string opticalconfig_uuid = 1; + * @return The bytes for opticalconfigUuid. + */ + public com.google.protobuf.ByteString getOpticalconfigUuidBytes() { + java.lang.Object ref = opticalconfigUuid_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + opticalconfigUuid_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkEvent_fieldAccessorTable; + /** + * string opticalconfig_uuid = 1; + * @param value The opticalconfigUuid to set. + * @return This builder for chaining. + */ + public Builder setOpticalconfigUuid(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + opticalconfigUuid_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceId_descriptor; + /** + * string opticalconfig_uuid = 1; + * @return This builder for chaining. + */ + public Builder clearOpticalconfigUuid() { + opticalconfigUuid_ = getDefaultInstance().getOpticalconfigUuid(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceId_fieldAccessorTable; + /** + * string opticalconfig_uuid = 1; + * @param value The bytes for opticalconfigUuid to set. + * @return This builder for chaining. + */ + public Builder setOpticalconfigUuidBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + opticalconfigUuid_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Service_descriptor; + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Service_fieldAccessorTable; + @java.lang.Override + public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + // @@protoc_insertion_point(builder_scope:context.OpticalConfigId) + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceStatus_descriptor; + // @@protoc_insertion_point(class_scope:context.OpticalConfigId) + private static final context.ContextOuterClass.OpticalConfigId DEFAULT_INSTANCE; - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceStatus_fieldAccessorTable; + static { + DEFAULT_INSTANCE = new context.ContextOuterClass.OpticalConfigId(); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceConfig_descriptor; + public static context.ContextOuterClass.OpticalConfigId getDefaultInstance() { + return DEFAULT_INSTANCE; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceConfig_fieldAccessorTable; + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceIdList_descriptor; + @java.lang.Override + public OpticalConfigId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceIdList_fieldAccessorTable; + public static com.google.protobuf.Parser parser() { + return PARSER; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceList_descriptor; + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceList_fieldAccessorTable; + @java.lang.Override + public context.ContextOuterClass.OpticalConfigId getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceFilter_descriptor; + public interface OpticalConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfig) + com.google.protobuf.MessageOrBuilder { - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceFilter_fieldAccessorTable; + /** + * .context.OpticalConfigId opticalconfig_id = 1; + * @return Whether the opticalconfigId field is set. + */ + boolean hasOpticalconfigId(); - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceEvent_descriptor; + /** + * .context.OpticalConfigId opticalconfig_id = 1; + * @return The opticalconfigId. + */ + context.ContextOuterClass.OpticalConfigId getOpticalconfigId(); - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceEvent_fieldAccessorTable; + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + context.ContextOuterClass.OpticalConfigIdOrBuilder getOpticalconfigIdOrBuilder(); - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceId_descriptor; + /** + * string config = 2; + * @return The config. + */ + java.lang.String getConfig(); - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceId_fieldAccessorTable; + /** + * string config = 2; + * @return The bytes for config. + */ + com.google.protobuf.ByteString getConfigBytes(); + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Slice_descriptor; + /** + * Protobuf type {@code context.OpticalConfig} + */ + public static final class OpticalConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfig) + OpticalConfigOrBuilder { - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Slice_fieldAccessorTable; + private static final long serialVersionUID = 0L; - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceOwner_descriptor; + // Use OpticalConfig.newBuilder() to construct. + private OpticalConfig(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceOwner_fieldAccessorTable; + private OpticalConfig() { + config_ = ""; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceStatus_descriptor; + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new OpticalConfig(); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceStatus_fieldAccessorTable; + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalConfig_descriptor; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceConfig_descriptor; + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalConfig_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalConfig.class, context.ContextOuterClass.OpticalConfig.Builder.class); + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceConfig_fieldAccessorTable; + public static final int OPTICALCONFIG_ID_FIELD_NUMBER = 1; - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceIdList_descriptor; + private context.ContextOuterClass.OpticalConfigId opticalconfigId_; - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceIdList_fieldAccessorTable; + /** + * .context.OpticalConfigId opticalconfig_id = 1; + * @return Whether the opticalconfigId field is set. + */ + @java.lang.Override + public boolean hasOpticalconfigId() { + return opticalconfigId_ != null; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceList_descriptor; + /** + * .context.OpticalConfigId opticalconfig_id = 1; + * @return The opticalconfigId. + */ + @java.lang.Override + public context.ContextOuterClass.OpticalConfigId getOpticalconfigId() { + return opticalconfigId_ == null ? context.ContextOuterClass.OpticalConfigId.getDefaultInstance() : opticalconfigId_; + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceList_fieldAccessorTable; + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + @java.lang.Override + public context.ContextOuterClass.OpticalConfigIdOrBuilder getOpticalconfigIdOrBuilder() { + return opticalconfigId_ == null ? context.ContextOuterClass.OpticalConfigId.getDefaultInstance() : opticalconfigId_; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceFilter_descriptor; + public static final int CONFIG_FIELD_NUMBER = 2; - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceFilter_fieldAccessorTable; + @SuppressWarnings("serial") + private volatile java.lang.Object config_ = ""; - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceEvent_descriptor; + /** + * string config = 2; + * @return The config. + */ + @java.lang.Override + public java.lang.String getConfig() { + java.lang.Object ref = config_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + config_ = s; + return s; + } + } - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceEvent_fieldAccessorTable; + /** + * string config = 2; + * @return The bytes for config. + */ + @java.lang.Override + public com.google.protobuf.ByteString getConfigBytes() { + java.lang.Object ref = config_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + config_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ConnectionId_descriptor; + private byte memoizedIsInitialized = -1; - private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ConnectionId_fieldAccessorTable; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + memoizedIsInitialized = 1; + return true; + } - private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ConnectionSettings_L0_descriptor; + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (opticalconfigId_ != null) { + output.writeMessage(1, getOpticalconfigId()); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(config_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, config_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + if (opticalconfigId_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getOpticalconfigId()); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(config_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, config_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof context.ContextOuterClass.OpticalConfig)) { + return super.equals(obj); + } + context.ContextOuterClass.OpticalConfig other = (context.ContextOuterClass.OpticalConfig) obj; + if (hasOpticalconfigId() != other.hasOpticalconfigId()) + return false; + if (hasOpticalconfigId()) { + if (!getOpticalconfigId().equals(other.getOpticalconfigId())) + return false; + } + if (!getConfig().equals(other.getConfig())) + return false; + if (!getUnknownFields().equals(other.getUnknownFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasOpticalconfigId()) { + hash = (37 * hash) + OPTICALCONFIG_ID_FIELD_NUMBER; + hash = (53 * hash) + getOpticalconfigId().hashCode(); + } + hash = (37 * hash) + CONFIG_FIELD_NUMBER; + hash = (53 * hash) + getConfig().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfig parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalConfig parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalConfig parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(context.ContextOuterClass.OpticalConfig prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code context.OpticalConfig} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalConfig) + context.ContextOuterClass.OpticalConfigOrBuilder { + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalConfig_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalConfig_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalConfig.class, context.ContextOuterClass.OpticalConfig.Builder.class); + } + + // Construct using context.ContextOuterClass.OpticalConfig.newBuilder() + private Builder() { + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + opticalconfigId_ = null; + if (opticalconfigIdBuilder_ != null) { + opticalconfigIdBuilder_.dispose(); + opticalconfigIdBuilder_ = null; + } + config_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return context.ContextOuterClass.internal_static_context_OpticalConfig_descriptor; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalConfig getDefaultInstanceForType() { + return context.ContextOuterClass.OpticalConfig.getDefaultInstance(); + } + + @java.lang.Override + public context.ContextOuterClass.OpticalConfig build() { + context.ContextOuterClass.OpticalConfig result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalConfig buildPartial() { + context.ContextOuterClass.OpticalConfig result = new context.ContextOuterClass.OpticalConfig(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(context.ContextOuterClass.OpticalConfig result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.opticalconfigId_ = opticalconfigIdBuilder_ == null ? opticalconfigId_ : opticalconfigIdBuilder_.build(); + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.config_ = config_; + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof context.ContextOuterClass.OpticalConfig) { + return mergeFrom((context.ContextOuterClass.OpticalConfig) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(context.ContextOuterClass.OpticalConfig other) { + if (other == context.ContextOuterClass.OpticalConfig.getDefaultInstance()) + return this; + if (other.hasOpticalconfigId()) { + mergeOpticalconfigId(other.getOpticalconfigId()); + } + if (!other.getConfig().isEmpty()) { + config_ = other.config_; + bitField0_ |= 0x00000002; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + input.readMessage(getOpticalconfigIdFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000001; + break; + } + // case 10 + case 18: + { + config_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000002; + break; + } + // case 18 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } + + private int bitField0_; + + private context.ContextOuterClass.OpticalConfigId opticalconfigId_; + + private com.google.protobuf.SingleFieldBuilderV3 opticalconfigIdBuilder_; + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + * @return Whether the opticalconfigId field is set. + */ + public boolean hasOpticalconfigId() { + return ((bitField0_ & 0x00000001) != 0); + } + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + * @return The opticalconfigId. + */ + public context.ContextOuterClass.OpticalConfigId getOpticalconfigId() { + if (opticalconfigIdBuilder_ == null) { + return opticalconfigId_ == null ? context.ContextOuterClass.OpticalConfigId.getDefaultInstance() : opticalconfigId_; + } else { + return opticalconfigIdBuilder_.getMessage(); + } + } + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + public Builder setOpticalconfigId(context.ContextOuterClass.OpticalConfigId value) { + if (opticalconfigIdBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + opticalconfigId_ = value; + } else { + opticalconfigIdBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + public Builder setOpticalconfigId(context.ContextOuterClass.OpticalConfigId.Builder builderForValue) { + if (opticalconfigIdBuilder_ == null) { + opticalconfigId_ = builderForValue.build(); + } else { + opticalconfigIdBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + public Builder mergeOpticalconfigId(context.ContextOuterClass.OpticalConfigId value) { + if (opticalconfigIdBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && opticalconfigId_ != null && opticalconfigId_ != context.ContextOuterClass.OpticalConfigId.getDefaultInstance()) { + getOpticalconfigIdBuilder().mergeFrom(value); + } else { + opticalconfigId_ = value; + } + } else { + opticalconfigIdBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + public Builder clearOpticalconfigId() { + bitField0_ = (bitField0_ & ~0x00000001); + opticalconfigId_ = null; + if (opticalconfigIdBuilder_ != null) { + opticalconfigIdBuilder_.dispose(); + opticalconfigIdBuilder_ = null; + } + onChanged(); + return this; + } + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + public context.ContextOuterClass.OpticalConfigId.Builder getOpticalconfigIdBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getOpticalconfigIdFieldBuilder().getBuilder(); + } + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + public context.ContextOuterClass.OpticalConfigIdOrBuilder getOpticalconfigIdOrBuilder() { + if (opticalconfigIdBuilder_ != null) { + return opticalconfigIdBuilder_.getMessageOrBuilder(); + } else { + return opticalconfigId_ == null ? context.ContextOuterClass.OpticalConfigId.getDefaultInstance() : opticalconfigId_; + } + } + + /** + * .context.OpticalConfigId opticalconfig_id = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3 getOpticalconfigIdFieldBuilder() { + if (opticalconfigIdBuilder_ == null) { + opticalconfigIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getOpticalconfigId(), getParentForChildren(), isClean()); + opticalconfigId_ = null; + } + return opticalconfigIdBuilder_; + } + + private java.lang.Object config_ = ""; + + /** + * string config = 2; + * @return The config. + */ + public java.lang.String getConfig() { + java.lang.Object ref = config_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + config_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string config = 2; + * @return The bytes for config. + */ + public com.google.protobuf.ByteString getConfigBytes() { + java.lang.Object ref = config_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + config_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string config = 2; + * @param value The config to set. + * @return This builder for chaining. + */ + public Builder setConfig(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + config_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * string config = 2; + * @return This builder for chaining. + */ + public Builder clearConfig() { + config_ = getDefaultInstance().getConfig(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + + /** + * string config = 2; + * @param value The bytes for config to set. + * @return This builder for chaining. + */ + public Builder setConfigBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + config_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + // @@protoc_insertion_point(builder_scope:context.OpticalConfig) + } + + // @@protoc_insertion_point(class_scope:context.OpticalConfig) + private static final context.ContextOuterClass.OpticalConfig DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new context.ContextOuterClass.OpticalConfig(); + } + + public static context.ContextOuterClass.OpticalConfig getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + + @java.lang.Override + public OpticalConfig parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalConfig getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface OpticalConfigListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfigList) + com.google.protobuf.MessageOrBuilder { + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + java.util.List getOpticalconfigsList(); + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + context.ContextOuterClass.OpticalConfig getOpticalconfigs(int index); + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + int getOpticalconfigsCount(); + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + java.util.List getOpticalconfigsOrBuilderList(); + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + context.ContextOuterClass.OpticalConfigOrBuilder getOpticalconfigsOrBuilder(int index); + } + + /** + * Protobuf type {@code context.OpticalConfigList} + */ + public static final class OpticalConfigList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfigList) + OpticalConfigListOrBuilder { + + private static final long serialVersionUID = 0L; + + // Use OpticalConfigList.newBuilder() to construct. + private OpticalConfigList(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private OpticalConfigList() { + opticalconfigs_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new OpticalConfigList(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalConfigList_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalConfigList_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalConfigList.class, context.ContextOuterClass.OpticalConfigList.Builder.class); + } + + public static final int OPTICALCONFIGS_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private java.util.List opticalconfigs_; + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + @java.lang.Override + public java.util.List getOpticalconfigsList() { + return opticalconfigs_; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + @java.lang.Override + public java.util.List getOpticalconfigsOrBuilderList() { + return opticalconfigs_; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + @java.lang.Override + public int getOpticalconfigsCount() { + return opticalconfigs_.size(); + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + @java.lang.Override + public context.ContextOuterClass.OpticalConfig getOpticalconfigs(int index) { + return opticalconfigs_.get(index); + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + @java.lang.Override + public context.ContextOuterClass.OpticalConfigOrBuilder getOpticalconfigsOrBuilder(int index) { + return opticalconfigs_.get(index); + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + for (int i = 0; i < opticalconfigs_.size(); i++) { + output.writeMessage(1, opticalconfigs_.get(i)); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + for (int i = 0; i < opticalconfigs_.size(); i++) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, opticalconfigs_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof context.ContextOuterClass.OpticalConfigList)) { + return super.equals(obj); + } + context.ContextOuterClass.OpticalConfigList other = (context.ContextOuterClass.OpticalConfigList) obj; + if (!getOpticalconfigsList().equals(other.getOpticalconfigsList())) + return false; + if (!getUnknownFields().equals(other.getUnknownFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getOpticalconfigsCount() > 0) { + hash = (37 * hash) + OPTICALCONFIGS_FIELD_NUMBER; + hash = (53 * hash) + getOpticalconfigsList().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfigList parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalConfigList parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalConfigList parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(context.ContextOuterClass.OpticalConfigList prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code context.OpticalConfigList} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalConfigList) + context.ContextOuterClass.OpticalConfigListOrBuilder { + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalConfigList_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalConfigList_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalConfigList.class, context.ContextOuterClass.OpticalConfigList.Builder.class); + } + + // Construct using context.ContextOuterClass.OpticalConfigList.newBuilder() + private Builder() { + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + if (opticalconfigsBuilder_ == null) { + opticalconfigs_ = java.util.Collections.emptyList(); + } else { + opticalconfigs_ = null; + opticalconfigsBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return context.ContextOuterClass.internal_static_context_OpticalConfigList_descriptor; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalConfigList getDefaultInstanceForType() { + return context.ContextOuterClass.OpticalConfigList.getDefaultInstance(); + } + + @java.lang.Override + public context.ContextOuterClass.OpticalConfigList build() { + context.ContextOuterClass.OpticalConfigList result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalConfigList buildPartial() { + context.ContextOuterClass.OpticalConfigList result = new context.ContextOuterClass.OpticalConfigList(this); + buildPartialRepeatedFields(result); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartialRepeatedFields(context.ContextOuterClass.OpticalConfigList result) { + if (opticalconfigsBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + opticalconfigs_ = java.util.Collections.unmodifiableList(opticalconfigs_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.opticalconfigs_ = opticalconfigs_; + } else { + result.opticalconfigs_ = opticalconfigsBuilder_.build(); + } + } + + private void buildPartial0(context.ContextOuterClass.OpticalConfigList result) { + int from_bitField0_ = bitField0_; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof context.ContextOuterClass.OpticalConfigList) { + return mergeFrom((context.ContextOuterClass.OpticalConfigList) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(context.ContextOuterClass.OpticalConfigList other) { + if (other == context.ContextOuterClass.OpticalConfigList.getDefaultInstance()) + return this; + if (opticalconfigsBuilder_ == null) { + if (!other.opticalconfigs_.isEmpty()) { + if (opticalconfigs_.isEmpty()) { + opticalconfigs_ = other.opticalconfigs_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureOpticalconfigsIsMutable(); + opticalconfigs_.addAll(other.opticalconfigs_); + } + onChanged(); + } + } else { + if (!other.opticalconfigs_.isEmpty()) { + if (opticalconfigsBuilder_.isEmpty()) { + opticalconfigsBuilder_.dispose(); + opticalconfigsBuilder_ = null; + opticalconfigs_ = other.opticalconfigs_; + bitField0_ = (bitField0_ & ~0x00000001); + opticalconfigsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getOpticalconfigsFieldBuilder() : null; + } else { + opticalconfigsBuilder_.addAllMessages(other.opticalconfigs_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + context.ContextOuterClass.OpticalConfig m = input.readMessage(context.ContextOuterClass.OpticalConfig.parser(), extensionRegistry); + if (opticalconfigsBuilder_ == null) { + ensureOpticalconfigsIsMutable(); + opticalconfigs_.add(m); + } else { + opticalconfigsBuilder_.addMessage(m); + } + break; + } + // case 10 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } + + private int bitField0_; + + private java.util.List opticalconfigs_ = java.util.Collections.emptyList(); + + private void ensureOpticalconfigsIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + opticalconfigs_ = new java.util.ArrayList(opticalconfigs_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3 opticalconfigsBuilder_; + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public java.util.List getOpticalconfigsList() { + if (opticalconfigsBuilder_ == null) { + return java.util.Collections.unmodifiableList(opticalconfigs_); + } else { + return opticalconfigsBuilder_.getMessageList(); + } + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public int getOpticalconfigsCount() { + if (opticalconfigsBuilder_ == null) { + return opticalconfigs_.size(); + } else { + return opticalconfigsBuilder_.getCount(); + } + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public context.ContextOuterClass.OpticalConfig getOpticalconfigs(int index) { + if (opticalconfigsBuilder_ == null) { + return opticalconfigs_.get(index); + } else { + return opticalconfigsBuilder_.getMessage(index); + } + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder setOpticalconfigs(int index, context.ContextOuterClass.OpticalConfig value) { + if (opticalconfigsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOpticalconfigsIsMutable(); + opticalconfigs_.set(index, value); + onChanged(); + } else { + opticalconfigsBuilder_.setMessage(index, value); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder setOpticalconfigs(int index, context.ContextOuterClass.OpticalConfig.Builder builderForValue) { + if (opticalconfigsBuilder_ == null) { + ensureOpticalconfigsIsMutable(); + opticalconfigs_.set(index, builderForValue.build()); + onChanged(); + } else { + opticalconfigsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder addOpticalconfigs(context.ContextOuterClass.OpticalConfig value) { + if (opticalconfigsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOpticalconfigsIsMutable(); + opticalconfigs_.add(value); + onChanged(); + } else { + opticalconfigsBuilder_.addMessage(value); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder addOpticalconfigs(int index, context.ContextOuterClass.OpticalConfig value) { + if (opticalconfigsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureOpticalconfigsIsMutable(); + opticalconfigs_.add(index, value); + onChanged(); + } else { + opticalconfigsBuilder_.addMessage(index, value); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder addOpticalconfigs(context.ContextOuterClass.OpticalConfig.Builder builderForValue) { + if (opticalconfigsBuilder_ == null) { + ensureOpticalconfigsIsMutable(); + opticalconfigs_.add(builderForValue.build()); + onChanged(); + } else { + opticalconfigsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder addOpticalconfigs(int index, context.ContextOuterClass.OpticalConfig.Builder builderForValue) { + if (opticalconfigsBuilder_ == null) { + ensureOpticalconfigsIsMutable(); + opticalconfigs_.add(index, builderForValue.build()); + onChanged(); + } else { + opticalconfigsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder addAllOpticalconfigs(java.lang.Iterable values) { + if (opticalconfigsBuilder_ == null) { + ensureOpticalconfigsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll(values, opticalconfigs_); + onChanged(); + } else { + opticalconfigsBuilder_.addAllMessages(values); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder clearOpticalconfigs() { + if (opticalconfigsBuilder_ == null) { + opticalconfigs_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + opticalconfigsBuilder_.clear(); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public Builder removeOpticalconfigs(int index) { + if (opticalconfigsBuilder_ == null) { + ensureOpticalconfigsIsMutable(); + opticalconfigs_.remove(index); + onChanged(); + } else { + opticalconfigsBuilder_.remove(index); + } + return this; + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public context.ContextOuterClass.OpticalConfig.Builder getOpticalconfigsBuilder(int index) { + return getOpticalconfigsFieldBuilder().getBuilder(index); + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public context.ContextOuterClass.OpticalConfigOrBuilder getOpticalconfigsOrBuilder(int index) { + if (opticalconfigsBuilder_ == null) { + return opticalconfigs_.get(index); + } else { + return opticalconfigsBuilder_.getMessageOrBuilder(index); + } + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public java.util.List getOpticalconfigsOrBuilderList() { + if (opticalconfigsBuilder_ != null) { + return opticalconfigsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(opticalconfigs_); + } + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public context.ContextOuterClass.OpticalConfig.Builder addOpticalconfigsBuilder() { + return getOpticalconfigsFieldBuilder().addBuilder(context.ContextOuterClass.OpticalConfig.getDefaultInstance()); + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public context.ContextOuterClass.OpticalConfig.Builder addOpticalconfigsBuilder(int index) { + return getOpticalconfigsFieldBuilder().addBuilder(index, context.ContextOuterClass.OpticalConfig.getDefaultInstance()); + } + + /** + * repeated .context.OpticalConfig opticalconfigs = 1; + */ + public java.util.List getOpticalconfigsBuilderList() { + return getOpticalconfigsFieldBuilder().getBuilderList(); + } + + private com.google.protobuf.RepeatedFieldBuilderV3 getOpticalconfigsFieldBuilder() { + if (opticalconfigsBuilder_ == null) { + opticalconfigsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(opticalconfigs_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean()); + opticalconfigs_ = null; + } + return opticalconfigsBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + // @@protoc_insertion_point(builder_scope:context.OpticalConfigList) + } + + // @@protoc_insertion_point(class_scope:context.OpticalConfigList) + private static final context.ContextOuterClass.OpticalConfigList DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new context.ContextOuterClass.OpticalConfigList(); + } + + public static context.ContextOuterClass.OpticalConfigList getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + + @java.lang.Override + public OpticalConfigList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalConfigList getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface OpticalLinkIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLinkId) + com.google.protobuf.MessageOrBuilder { + + /** + * .context.Uuid optical_link_uuid = 1; + * @return Whether the opticalLinkUuid field is set. + */ + boolean hasOpticalLinkUuid(); + + /** + * .context.Uuid optical_link_uuid = 1; + * @return The opticalLinkUuid. + */ + context.ContextOuterClass.Uuid getOpticalLinkUuid(); + + /** + * .context.Uuid optical_link_uuid = 1; + */ + context.ContextOuterClass.UuidOrBuilder getOpticalLinkUuidOrBuilder(); + } + + /** + * Protobuf type {@code context.OpticalLinkId} + */ + public static final class OpticalLinkId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalLinkId) + OpticalLinkIdOrBuilder { + + private static final long serialVersionUID = 0L; + + // Use OpticalLinkId.newBuilder() to construct. + private OpticalLinkId(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private OpticalLinkId() { + } + + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new OpticalLinkId(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalLinkId_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalLinkId_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalLinkId.class, context.ContextOuterClass.OpticalLinkId.Builder.class); + } + + public static final int OPTICAL_LINK_UUID_FIELD_NUMBER = 1; + + private context.ContextOuterClass.Uuid opticalLinkUuid_; + + /** + * .context.Uuid optical_link_uuid = 1; + * @return Whether the opticalLinkUuid field is set. + */ + @java.lang.Override + public boolean hasOpticalLinkUuid() { + return opticalLinkUuid_ != null; + } + + /** + * .context.Uuid optical_link_uuid = 1; + * @return The opticalLinkUuid. + */ + @java.lang.Override + public context.ContextOuterClass.Uuid getOpticalLinkUuid() { + return opticalLinkUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : opticalLinkUuid_; + } + + /** + * .context.Uuid optical_link_uuid = 1; + */ + @java.lang.Override + public context.ContextOuterClass.UuidOrBuilder getOpticalLinkUuidOrBuilder() { + return opticalLinkUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : opticalLinkUuid_; + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (opticalLinkUuid_ != null) { + output.writeMessage(1, getOpticalLinkUuid()); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + if (opticalLinkUuid_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getOpticalLinkUuid()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof context.ContextOuterClass.OpticalLinkId)) { + return super.equals(obj); + } + context.ContextOuterClass.OpticalLinkId other = (context.ContextOuterClass.OpticalLinkId) obj; + if (hasOpticalLinkUuid() != other.hasOpticalLinkUuid()) + return false; + if (hasOpticalLinkUuid()) { + if (!getOpticalLinkUuid().equals(other.getOpticalLinkUuid())) + return false; + } + if (!getUnknownFields().equals(other.getUnknownFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasOpticalLinkUuid()) { + hash = (37 * hash) + OPTICAL_LINK_UUID_FIELD_NUMBER; + hash = (53 * hash) + getOpticalLinkUuid().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkId parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLinkId parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLinkId parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(context.ContextOuterClass.OpticalLinkId prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code context.OpticalLinkId} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalLinkId) + context.ContextOuterClass.OpticalLinkIdOrBuilder { + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalLinkId_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalLinkId_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalLinkId.class, context.ContextOuterClass.OpticalLinkId.Builder.class); + } + + // Construct using context.ContextOuterClass.OpticalLinkId.newBuilder() + private Builder() { + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + opticalLinkUuid_ = null; + if (opticalLinkUuidBuilder_ != null) { + opticalLinkUuidBuilder_.dispose(); + opticalLinkUuidBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return context.ContextOuterClass.internal_static_context_OpticalLinkId_descriptor; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLinkId getDefaultInstanceForType() { + return context.ContextOuterClass.OpticalLinkId.getDefaultInstance(); + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLinkId build() { + context.ContextOuterClass.OpticalLinkId result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLinkId buildPartial() { + context.ContextOuterClass.OpticalLinkId result = new context.ContextOuterClass.OpticalLinkId(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(context.ContextOuterClass.OpticalLinkId result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.opticalLinkUuid_ = opticalLinkUuidBuilder_ == null ? opticalLinkUuid_ : opticalLinkUuidBuilder_.build(); + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof context.ContextOuterClass.OpticalLinkId) { + return mergeFrom((context.ContextOuterClass.OpticalLinkId) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(context.ContextOuterClass.OpticalLinkId other) { + if (other == context.ContextOuterClass.OpticalLinkId.getDefaultInstance()) + return this; + if (other.hasOpticalLinkUuid()) { + mergeOpticalLinkUuid(other.getOpticalLinkUuid()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + input.readMessage(getOpticalLinkUuidFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000001; + break; + } + // case 10 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } + + private int bitField0_; + + private context.ContextOuterClass.Uuid opticalLinkUuid_; + + private com.google.protobuf.SingleFieldBuilderV3 opticalLinkUuidBuilder_; + + /** + * .context.Uuid optical_link_uuid = 1; + * @return Whether the opticalLinkUuid field is set. + */ + public boolean hasOpticalLinkUuid() { + return ((bitField0_ & 0x00000001) != 0); + } + + /** + * .context.Uuid optical_link_uuid = 1; + * @return The opticalLinkUuid. + */ + public context.ContextOuterClass.Uuid getOpticalLinkUuid() { + if (opticalLinkUuidBuilder_ == null) { + return opticalLinkUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : opticalLinkUuid_; + } else { + return opticalLinkUuidBuilder_.getMessage(); + } + } + + /** + * .context.Uuid optical_link_uuid = 1; + */ + public Builder setOpticalLinkUuid(context.ContextOuterClass.Uuid value) { + if (opticalLinkUuidBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + opticalLinkUuid_ = value; + } else { + opticalLinkUuidBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.Uuid optical_link_uuid = 1; + */ + public Builder setOpticalLinkUuid(context.ContextOuterClass.Uuid.Builder builderForValue) { + if (opticalLinkUuidBuilder_ == null) { + opticalLinkUuid_ = builderForValue.build(); + } else { + opticalLinkUuidBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.Uuid optical_link_uuid = 1; + */ + public Builder mergeOpticalLinkUuid(context.ContextOuterClass.Uuid value) { + if (opticalLinkUuidBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && opticalLinkUuid_ != null && opticalLinkUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) { + getOpticalLinkUuidBuilder().mergeFrom(value); + } else { + opticalLinkUuid_ = value; + } + } else { + opticalLinkUuidBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.Uuid optical_link_uuid = 1; + */ + public Builder clearOpticalLinkUuid() { + bitField0_ = (bitField0_ & ~0x00000001); + opticalLinkUuid_ = null; + if (opticalLinkUuidBuilder_ != null) { + opticalLinkUuidBuilder_.dispose(); + opticalLinkUuidBuilder_ = null; + } + onChanged(); + return this; + } + + /** + * .context.Uuid optical_link_uuid = 1; + */ + public context.ContextOuterClass.Uuid.Builder getOpticalLinkUuidBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getOpticalLinkUuidFieldBuilder().getBuilder(); + } + + /** + * .context.Uuid optical_link_uuid = 1; + */ + public context.ContextOuterClass.UuidOrBuilder getOpticalLinkUuidOrBuilder() { + if (opticalLinkUuidBuilder_ != null) { + return opticalLinkUuidBuilder_.getMessageOrBuilder(); + } else { + return opticalLinkUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : opticalLinkUuid_; + } + } + + /** + * .context.Uuid optical_link_uuid = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3 getOpticalLinkUuidFieldBuilder() { + if (opticalLinkUuidBuilder_ == null) { + opticalLinkUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getOpticalLinkUuid(), getParentForChildren(), isClean()); + opticalLinkUuid_ = null; + } + return opticalLinkUuidBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + // @@protoc_insertion_point(builder_scope:context.OpticalLinkId) + } + + // @@protoc_insertion_point(class_scope:context.OpticalLinkId) + private static final context.ContextOuterClass.OpticalLinkId DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new context.ContextOuterClass.OpticalLinkId(); + } + + public static context.ContextOuterClass.OpticalLinkId getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + + @java.lang.Override + public OpticalLinkId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLinkId getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface FiberIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.FiberId) + com.google.protobuf.MessageOrBuilder { + + /** + * .context.Uuid fiber_uuid = 1; + * @return Whether the fiberUuid field is set. + */ + boolean hasFiberUuid(); + + /** + * .context.Uuid fiber_uuid = 1; + * @return The fiberUuid. + */ + context.ContextOuterClass.Uuid getFiberUuid(); + + /** + * .context.Uuid fiber_uuid = 1; + */ + context.ContextOuterClass.UuidOrBuilder getFiberUuidOrBuilder(); + } + + /** + * Protobuf type {@code context.FiberId} + */ + public static final class FiberId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.FiberId) + FiberIdOrBuilder { + + private static final long serialVersionUID = 0L; + + // Use FiberId.newBuilder() to construct. + private FiberId(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private FiberId() { + } + + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new FiberId(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_FiberId_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_FiberId_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.FiberId.class, context.ContextOuterClass.FiberId.Builder.class); + } + + public static final int FIBER_UUID_FIELD_NUMBER = 1; + + private context.ContextOuterClass.Uuid fiberUuid_; + + /** + * .context.Uuid fiber_uuid = 1; + * @return Whether the fiberUuid field is set. + */ + @java.lang.Override + public boolean hasFiberUuid() { + return fiberUuid_ != null; + } + + /** + * .context.Uuid fiber_uuid = 1; + * @return The fiberUuid. + */ + @java.lang.Override + public context.ContextOuterClass.Uuid getFiberUuid() { + return fiberUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : fiberUuid_; + } + + /** + * .context.Uuid fiber_uuid = 1; + */ + @java.lang.Override + public context.ContextOuterClass.UuidOrBuilder getFiberUuidOrBuilder() { + return fiberUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : fiberUuid_; + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (fiberUuid_ != null) { + output.writeMessage(1, getFiberUuid()); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + if (fiberUuid_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getFiberUuid()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof context.ContextOuterClass.FiberId)) { + return super.equals(obj); + } + context.ContextOuterClass.FiberId other = (context.ContextOuterClass.FiberId) obj; + if (hasFiberUuid() != other.hasFiberUuid()) + return false; + if (hasFiberUuid()) { + if (!getFiberUuid().equals(other.getFiberUuid())) + return false; + } + if (!getUnknownFields().equals(other.getUnknownFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasFiberUuid()) { + hash = (37 * hash) + FIBER_UUID_FIELD_NUMBER; + hash = (53 * hash) + getFiberUuid().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static context.ContextOuterClass.FiberId parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.FiberId parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.FiberId parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.FiberId parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.FiberId parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.FiberId parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.FiberId parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.FiberId parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.FiberId parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.FiberId parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.FiberId parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.FiberId parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(context.ContextOuterClass.FiberId prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code context.FiberId} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.FiberId) + context.ContextOuterClass.FiberIdOrBuilder { + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_FiberId_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_FiberId_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.FiberId.class, context.ContextOuterClass.FiberId.Builder.class); + } + + // Construct using context.ContextOuterClass.FiberId.newBuilder() + private Builder() { + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + fiberUuid_ = null; + if (fiberUuidBuilder_ != null) { + fiberUuidBuilder_.dispose(); + fiberUuidBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return context.ContextOuterClass.internal_static_context_FiberId_descriptor; + } + + @java.lang.Override + public context.ContextOuterClass.FiberId getDefaultInstanceForType() { + return context.ContextOuterClass.FiberId.getDefaultInstance(); + } + + @java.lang.Override + public context.ContextOuterClass.FiberId build() { + context.ContextOuterClass.FiberId result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public context.ContextOuterClass.FiberId buildPartial() { + context.ContextOuterClass.FiberId result = new context.ContextOuterClass.FiberId(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(context.ContextOuterClass.FiberId result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.fiberUuid_ = fiberUuidBuilder_ == null ? fiberUuid_ : fiberUuidBuilder_.build(); + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof context.ContextOuterClass.FiberId) { + return mergeFrom((context.ContextOuterClass.FiberId) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(context.ContextOuterClass.FiberId other) { + if (other == context.ContextOuterClass.FiberId.getDefaultInstance()) + return this; + if (other.hasFiberUuid()) { + mergeFiberUuid(other.getFiberUuid()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + input.readMessage(getFiberUuidFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000001; + break; + } + // case 10 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } + + private int bitField0_; + + private context.ContextOuterClass.Uuid fiberUuid_; + + private com.google.protobuf.SingleFieldBuilderV3 fiberUuidBuilder_; + + /** + * .context.Uuid fiber_uuid = 1; + * @return Whether the fiberUuid field is set. + */ + public boolean hasFiberUuid() { + return ((bitField0_ & 0x00000001) != 0); + } + + /** + * .context.Uuid fiber_uuid = 1; + * @return The fiberUuid. + */ + public context.ContextOuterClass.Uuid getFiberUuid() { + if (fiberUuidBuilder_ == null) { + return fiberUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : fiberUuid_; + } else { + return fiberUuidBuilder_.getMessage(); + } + } + + /** + * .context.Uuid fiber_uuid = 1; + */ + public Builder setFiberUuid(context.ContextOuterClass.Uuid value) { + if (fiberUuidBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + fiberUuid_ = value; + } else { + fiberUuidBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.Uuid fiber_uuid = 1; + */ + public Builder setFiberUuid(context.ContextOuterClass.Uuid.Builder builderForValue) { + if (fiberUuidBuilder_ == null) { + fiberUuid_ = builderForValue.build(); + } else { + fiberUuidBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.Uuid fiber_uuid = 1; + */ + public Builder mergeFiberUuid(context.ContextOuterClass.Uuid value) { + if (fiberUuidBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && fiberUuid_ != null && fiberUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) { + getFiberUuidBuilder().mergeFrom(value); + } else { + fiberUuid_ = value; + } + } else { + fiberUuidBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * .context.Uuid fiber_uuid = 1; + */ + public Builder clearFiberUuid() { + bitField0_ = (bitField0_ & ~0x00000001); + fiberUuid_ = null; + if (fiberUuidBuilder_ != null) { + fiberUuidBuilder_.dispose(); + fiberUuidBuilder_ = null; + } + onChanged(); + return this; + } + + /** + * .context.Uuid fiber_uuid = 1; + */ + public context.ContextOuterClass.Uuid.Builder getFiberUuidBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getFiberUuidFieldBuilder().getBuilder(); + } + + /** + * .context.Uuid fiber_uuid = 1; + */ + public context.ContextOuterClass.UuidOrBuilder getFiberUuidOrBuilder() { + if (fiberUuidBuilder_ != null) { + return fiberUuidBuilder_.getMessageOrBuilder(); + } else { + return fiberUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : fiberUuid_; + } + } + + /** + * .context.Uuid fiber_uuid = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3 getFiberUuidFieldBuilder() { + if (fiberUuidBuilder_ == null) { + fiberUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getFiberUuid(), getParentForChildren(), isClean()); + fiberUuid_ = null; + } + return fiberUuidBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + // @@protoc_insertion_point(builder_scope:context.FiberId) + } + + // @@protoc_insertion_point(class_scope:context.FiberId) + private static final context.ContextOuterClass.FiberId DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new context.ContextOuterClass.FiberId(); + } + + public static context.ContextOuterClass.FiberId getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + + @java.lang.Override + public FiberId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public context.ContextOuterClass.FiberId getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface FiberOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Fiber) + com.google.protobuf.MessageOrBuilder { + + /** + * string ID = 10; + * @return The iD. + */ + java.lang.String getID(); + + /** + * string ID = 10; + * @return The bytes for iD. + */ + com.google.protobuf.ByteString getIDBytes(); + + /** + * string src_port = 1; + * @return The srcPort. + */ + java.lang.String getSrcPort(); + + /** + * string src_port = 1; + * @return The bytes for srcPort. + */ + com.google.protobuf.ByteString getSrcPortBytes(); + + /** + * string dst_port = 2; + * @return The dstPort. + */ + java.lang.String getDstPort(); + + /** + * string dst_port = 2; + * @return The bytes for dstPort. + */ + com.google.protobuf.ByteString getDstPortBytes(); + + /** + * string local_peer_port = 3; + * @return The localPeerPort. + */ + java.lang.String getLocalPeerPort(); + + /** + * string local_peer_port = 3; + * @return The bytes for localPeerPort. + */ + com.google.protobuf.ByteString getLocalPeerPortBytes(); + + /** + * string remote_peer_port = 4; + * @return The remotePeerPort. + */ + java.lang.String getRemotePeerPort(); + + /** + * string remote_peer_port = 4; + * @return The bytes for remotePeerPort. + */ + com.google.protobuf.ByteString getRemotePeerPortBytes(); + + /** + * repeated int32 c_slots = 5; + * @return A list containing the cSlots. + */ + java.util.List getCSlotsList(); + + /** + * repeated int32 c_slots = 5; + * @return The count of cSlots. + */ + int getCSlotsCount(); + + /** + * repeated int32 c_slots = 5; + * @param index The index of the element to return. + * @return The cSlots at the given index. + */ + int getCSlots(int index); + + /** + * repeated int32 l_slots = 6; + * @return A list containing the lSlots. + */ + java.util.List getLSlotsList(); + + /** + * repeated int32 l_slots = 6; + * @return The count of lSlots. + */ + int getLSlotsCount(); + + /** + * repeated int32 l_slots = 6; + * @param index The index of the element to return. + * @return The lSlots at the given index. + */ + int getLSlots(int index); + + /** + * repeated int32 s_slots = 7; + * @return A list containing the sSlots. + */ + java.util.List getSSlotsList(); + + /** + * repeated int32 s_slots = 7; + * @return The count of sSlots. + */ + int getSSlotsCount(); + + /** + * repeated int32 s_slots = 7; + * @param index The index of the element to return. + * @return The sSlots at the given index. + */ + int getSSlots(int index); + + /** + * float length = 8; + * @return The length. + */ + float getLength(); + + /** + * bool used = 9; + * @return The used. + */ + boolean getUsed(); + + /** + * .context.FiberId fiber_uuid = 11; + * @return Whether the fiberUuid field is set. + */ + boolean hasFiberUuid(); + + /** + * .context.FiberId fiber_uuid = 11; + * @return The fiberUuid. + */ + context.ContextOuterClass.FiberId getFiberUuid(); + + /** + * .context.FiberId fiber_uuid = 11; + */ + context.ContextOuterClass.FiberIdOrBuilder getFiberUuidOrBuilder(); + } + + /** + * Protobuf type {@code context.Fiber} + */ + public static final class Fiber extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Fiber) + FiberOrBuilder { + + private static final long serialVersionUID = 0L; + + // Use Fiber.newBuilder() to construct. + private Fiber(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private Fiber() { + iD_ = ""; + srcPort_ = ""; + dstPort_ = ""; + localPeerPort_ = ""; + remotePeerPort_ = ""; + cSlots_ = emptyIntList(); + lSlots_ = emptyIntList(); + sSlots_ = emptyIntList(); + } + + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new Fiber(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_Fiber_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_Fiber_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.Fiber.class, context.ContextOuterClass.Fiber.Builder.class); + } + + public static final int ID_FIELD_NUMBER = 10; + + @SuppressWarnings("serial") + private volatile java.lang.Object iD_ = ""; + + /** + * string ID = 10; + * @return The iD. + */ + @java.lang.Override + public java.lang.String getID() { + java.lang.Object ref = iD_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + iD_ = s; + return s; + } + } + + /** + * string ID = 10; + * @return The bytes for iD. + */ + @java.lang.Override + public com.google.protobuf.ByteString getIDBytes() { + java.lang.Object ref = iD_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + iD_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int SRC_PORT_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private volatile java.lang.Object srcPort_ = ""; + + /** + * string src_port = 1; + * @return The srcPort. + */ + @java.lang.Override + public java.lang.String getSrcPort() { + java.lang.Object ref = srcPort_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + srcPort_ = s; + return s; + } + } + + /** + * string src_port = 1; + * @return The bytes for srcPort. + */ + @java.lang.Override + public com.google.protobuf.ByteString getSrcPortBytes() { + java.lang.Object ref = srcPort_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + srcPort_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int DST_PORT_FIELD_NUMBER = 2; + + @SuppressWarnings("serial") + private volatile java.lang.Object dstPort_ = ""; + + /** + * string dst_port = 2; + * @return The dstPort. + */ + @java.lang.Override + public java.lang.String getDstPort() { + java.lang.Object ref = dstPort_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + dstPort_ = s; + return s; + } + } + + /** + * string dst_port = 2; + * @return The bytes for dstPort. + */ + @java.lang.Override + public com.google.protobuf.ByteString getDstPortBytes() { + java.lang.Object ref = dstPort_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + dstPort_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int LOCAL_PEER_PORT_FIELD_NUMBER = 3; + + @SuppressWarnings("serial") + private volatile java.lang.Object localPeerPort_ = ""; + + /** + * string local_peer_port = 3; + * @return The localPeerPort. + */ + @java.lang.Override + public java.lang.String getLocalPeerPort() { + java.lang.Object ref = localPeerPort_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + localPeerPort_ = s; + return s; + } + } + + /** + * string local_peer_port = 3; + * @return The bytes for localPeerPort. + */ + @java.lang.Override + public com.google.protobuf.ByteString getLocalPeerPortBytes() { + java.lang.Object ref = localPeerPort_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + localPeerPort_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int REMOTE_PEER_PORT_FIELD_NUMBER = 4; + + @SuppressWarnings("serial") + private volatile java.lang.Object remotePeerPort_ = ""; + + /** + * string remote_peer_port = 4; + * @return The remotePeerPort. + */ + @java.lang.Override + public java.lang.String getRemotePeerPort() { + java.lang.Object ref = remotePeerPort_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + remotePeerPort_ = s; + return s; + } + } + + /** + * string remote_peer_port = 4; + * @return The bytes for remotePeerPort. + */ + @java.lang.Override + public com.google.protobuf.ByteString getRemotePeerPortBytes() { + java.lang.Object ref = remotePeerPort_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + remotePeerPort_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int C_SLOTS_FIELD_NUMBER = 5; + + @SuppressWarnings("serial") + private com.google.protobuf.Internal.IntList cSlots_; + + /** + * repeated int32 c_slots = 5; + * @return A list containing the cSlots. + */ + @java.lang.Override + public java.util.List getCSlotsList() { + return cSlots_; + } + + /** + * repeated int32 c_slots = 5; + * @return The count of cSlots. + */ + public int getCSlotsCount() { + return cSlots_.size(); + } + + /** + * repeated int32 c_slots = 5; + * @param index The index of the element to return. + * @return The cSlots at the given index. + */ + public int getCSlots(int index) { + return cSlots_.getInt(index); + } + + private int cSlotsMemoizedSerializedSize = -1; + + public static final int L_SLOTS_FIELD_NUMBER = 6; + + @SuppressWarnings("serial") + private com.google.protobuf.Internal.IntList lSlots_; + + /** + * repeated int32 l_slots = 6; + * @return A list containing the lSlots. + */ + @java.lang.Override + public java.util.List getLSlotsList() { + return lSlots_; + } + + /** + * repeated int32 l_slots = 6; + * @return The count of lSlots. + */ + public int getLSlotsCount() { + return lSlots_.size(); + } + + /** + * repeated int32 l_slots = 6; + * @param index The index of the element to return. + * @return The lSlots at the given index. + */ + public int getLSlots(int index) { + return lSlots_.getInt(index); + } + + private int lSlotsMemoizedSerializedSize = -1; + + public static final int S_SLOTS_FIELD_NUMBER = 7; + + @SuppressWarnings("serial") + private com.google.protobuf.Internal.IntList sSlots_; + + /** + * repeated int32 s_slots = 7; + * @return A list containing the sSlots. + */ + @java.lang.Override + public java.util.List getSSlotsList() { + return sSlots_; + } + + /** + * repeated int32 s_slots = 7; + * @return The count of sSlots. + */ + public int getSSlotsCount() { + return sSlots_.size(); + } + + /** + * repeated int32 s_slots = 7; + * @param index The index of the element to return. + * @return The sSlots at the given index. + */ + public int getSSlots(int index) { + return sSlots_.getInt(index); + } + + private int sSlotsMemoizedSerializedSize = -1; + + public static final int LENGTH_FIELD_NUMBER = 8; + + private float length_ = 0F; + + /** + * float length = 8; + * @return The length. + */ + @java.lang.Override + public float getLength() { + return length_; + } + + public static final int USED_FIELD_NUMBER = 9; + + private boolean used_ = false; + + /** + * bool used = 9; + * @return The used. + */ + @java.lang.Override + public boolean getUsed() { + return used_; + } + + public static final int FIBER_UUID_FIELD_NUMBER = 11; + + private context.ContextOuterClass.FiberId fiberUuid_; + + /** + * .context.FiberId fiber_uuid = 11; + * @return Whether the fiberUuid field is set. + */ + @java.lang.Override + public boolean hasFiberUuid() { + return fiberUuid_ != null; + } + + /** + * .context.FiberId fiber_uuid = 11; + * @return The fiberUuid. + */ + @java.lang.Override + public context.ContextOuterClass.FiberId getFiberUuid() { + return fiberUuid_ == null ? context.ContextOuterClass.FiberId.getDefaultInstance() : fiberUuid_; + } + + /** + * .context.FiberId fiber_uuid = 11; + */ + @java.lang.Override + public context.ContextOuterClass.FiberIdOrBuilder getFiberUuidOrBuilder() { + return fiberUuid_ == null ? context.ContextOuterClass.FiberId.getDefaultInstance() : fiberUuid_; + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + getSerializedSize(); + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcPort_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, srcPort_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstPort_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, dstPort_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(localPeerPort_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, localPeerPort_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(remotePeerPort_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, remotePeerPort_); + } + if (getCSlotsList().size() > 0) { + output.writeUInt32NoTag(42); + output.writeUInt32NoTag(cSlotsMemoizedSerializedSize); + } + for (int i = 0; i < cSlots_.size(); i++) { + output.writeInt32NoTag(cSlots_.getInt(i)); + } + if (getLSlotsList().size() > 0) { + output.writeUInt32NoTag(50); + output.writeUInt32NoTag(lSlotsMemoizedSerializedSize); + } + for (int i = 0; i < lSlots_.size(); i++) { + output.writeInt32NoTag(lSlots_.getInt(i)); + } + if (getSSlotsList().size() > 0) { + output.writeUInt32NoTag(58); + output.writeUInt32NoTag(sSlotsMemoizedSerializedSize); + } + for (int i = 0; i < sSlots_.size(); i++) { + output.writeInt32NoTag(sSlots_.getInt(i)); + } + if (java.lang.Float.floatToRawIntBits(length_) != 0) { + output.writeFloat(8, length_); + } + if (used_ != false) { + output.writeBool(9, used_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(iD_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 10, iD_); + } + if (fiberUuid_ != null) { + output.writeMessage(11, getFiberUuid()); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcPort_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, srcPort_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstPort_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, dstPort_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(localPeerPort_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, localPeerPort_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(remotePeerPort_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, remotePeerPort_); + } + { + int dataSize = 0; + for (int i = 0; i < cSlots_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream.computeInt32SizeNoTag(cSlots_.getInt(i)); + } + size += dataSize; + if (!getCSlotsList().isEmpty()) { + size += 1; + size += com.google.protobuf.CodedOutputStream.computeInt32SizeNoTag(dataSize); + } + cSlotsMemoizedSerializedSize = dataSize; + } + { + int dataSize = 0; + for (int i = 0; i < lSlots_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream.computeInt32SizeNoTag(lSlots_.getInt(i)); + } + size += dataSize; + if (!getLSlotsList().isEmpty()) { + size += 1; + size += com.google.protobuf.CodedOutputStream.computeInt32SizeNoTag(dataSize); + } + lSlotsMemoizedSerializedSize = dataSize; + } + { + int dataSize = 0; + for (int i = 0; i < sSlots_.size(); i++) { + dataSize += com.google.protobuf.CodedOutputStream.computeInt32SizeNoTag(sSlots_.getInt(i)); + } + size += dataSize; + if (!getSSlotsList().isEmpty()) { + size += 1; + size += com.google.protobuf.CodedOutputStream.computeInt32SizeNoTag(dataSize); + } + sSlotsMemoizedSerializedSize = dataSize; + } + if (java.lang.Float.floatToRawIntBits(length_) != 0) { + size += com.google.protobuf.CodedOutputStream.computeFloatSize(8, length_); + } + if (used_ != false) { + size += com.google.protobuf.CodedOutputStream.computeBoolSize(9, used_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(iD_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(10, iD_); + } + if (fiberUuid_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(11, getFiberUuid()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof context.ContextOuterClass.Fiber)) { + return super.equals(obj); + } + context.ContextOuterClass.Fiber other = (context.ContextOuterClass.Fiber) obj; + if (!getID().equals(other.getID())) + return false; + if (!getSrcPort().equals(other.getSrcPort())) + return false; + if (!getDstPort().equals(other.getDstPort())) + return false; + if (!getLocalPeerPort().equals(other.getLocalPeerPort())) + return false; + if (!getRemotePeerPort().equals(other.getRemotePeerPort())) + return false; + if (!getCSlotsList().equals(other.getCSlotsList())) + return false; + if (!getLSlotsList().equals(other.getLSlotsList())) + return false; + if (!getSSlotsList().equals(other.getSSlotsList())) + return false; + if (java.lang.Float.floatToIntBits(getLength()) != java.lang.Float.floatToIntBits(other.getLength())) + return false; + if (getUsed() != other.getUsed()) + return false; + if (hasFiberUuid() != other.hasFiberUuid()) + return false; + if (hasFiberUuid()) { + if (!getFiberUuid().equals(other.getFiberUuid())) + return false; + } + if (!getUnknownFields().equals(other.getUnknownFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + ID_FIELD_NUMBER; + hash = (53 * hash) + getID().hashCode(); + hash = (37 * hash) + SRC_PORT_FIELD_NUMBER; + hash = (53 * hash) + getSrcPort().hashCode(); + hash = (37 * hash) + DST_PORT_FIELD_NUMBER; + hash = (53 * hash) + getDstPort().hashCode(); + hash = (37 * hash) + LOCAL_PEER_PORT_FIELD_NUMBER; + hash = (53 * hash) + getLocalPeerPort().hashCode(); + hash = (37 * hash) + REMOTE_PEER_PORT_FIELD_NUMBER; + hash = (53 * hash) + getRemotePeerPort().hashCode(); + if (getCSlotsCount() > 0) { + hash = (37 * hash) + C_SLOTS_FIELD_NUMBER; + hash = (53 * hash) + getCSlotsList().hashCode(); + } + if (getLSlotsCount() > 0) { + hash = (37 * hash) + L_SLOTS_FIELD_NUMBER; + hash = (53 * hash) + getLSlotsList().hashCode(); + } + if (getSSlotsCount() > 0) { + hash = (37 * hash) + S_SLOTS_FIELD_NUMBER; + hash = (53 * hash) + getSSlotsList().hashCode(); + } + hash = (37 * hash) + LENGTH_FIELD_NUMBER; + hash = (53 * hash) + java.lang.Float.floatToIntBits(getLength()); + hash = (37 * hash) + USED_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getUsed()); + if (hasFiberUuid()) { + hash = (37 * hash) + FIBER_UUID_FIELD_NUMBER; + hash = (53 * hash) + getFiberUuid().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static context.ContextOuterClass.Fiber parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.Fiber parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.Fiber parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.Fiber parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.Fiber parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.Fiber parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.Fiber parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.Fiber parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.Fiber parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.Fiber parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.Fiber parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.Fiber parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(context.ContextOuterClass.Fiber prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code context.Fiber} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Fiber) + context.ContextOuterClass.FiberOrBuilder { + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_Fiber_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_Fiber_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.Fiber.class, context.ContextOuterClass.Fiber.Builder.class); + } + + // Construct using context.ContextOuterClass.Fiber.newBuilder() + private Builder() { + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + iD_ = ""; + srcPort_ = ""; + dstPort_ = ""; + localPeerPort_ = ""; + remotePeerPort_ = ""; + cSlots_ = emptyIntList(); + lSlots_ = emptyIntList(); + sSlots_ = emptyIntList(); + length_ = 0F; + used_ = false; + fiberUuid_ = null; + if (fiberUuidBuilder_ != null) { + fiberUuidBuilder_.dispose(); + fiberUuidBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return context.ContextOuterClass.internal_static_context_Fiber_descriptor; + } + + @java.lang.Override + public context.ContextOuterClass.Fiber getDefaultInstanceForType() { + return context.ContextOuterClass.Fiber.getDefaultInstance(); + } + + @java.lang.Override + public context.ContextOuterClass.Fiber build() { + context.ContextOuterClass.Fiber result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public context.ContextOuterClass.Fiber buildPartial() { + context.ContextOuterClass.Fiber result = new context.ContextOuterClass.Fiber(this); + buildPartialRepeatedFields(result); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartialRepeatedFields(context.ContextOuterClass.Fiber result) { + if (((bitField0_ & 0x00000020) != 0)) { + cSlots_.makeImmutable(); + bitField0_ = (bitField0_ & ~0x00000020); + } + result.cSlots_ = cSlots_; + if (((bitField0_ & 0x00000040) != 0)) { + lSlots_.makeImmutable(); + bitField0_ = (bitField0_ & ~0x00000040); + } + result.lSlots_ = lSlots_; + if (((bitField0_ & 0x00000080) != 0)) { + sSlots_.makeImmutable(); + bitField0_ = (bitField0_ & ~0x00000080); + } + result.sSlots_ = sSlots_; + } + + private void buildPartial0(context.ContextOuterClass.Fiber result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.iD_ = iD_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.srcPort_ = srcPort_; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.dstPort_ = dstPort_; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.localPeerPort_ = localPeerPort_; + } + if (((from_bitField0_ & 0x00000010) != 0)) { + result.remotePeerPort_ = remotePeerPort_; + } + if (((from_bitField0_ & 0x00000100) != 0)) { + result.length_ = length_; + } + if (((from_bitField0_ & 0x00000200) != 0)) { + result.used_ = used_; + } + if (((from_bitField0_ & 0x00000400) != 0)) { + result.fiberUuid_ = fiberUuidBuilder_ == null ? fiberUuid_ : fiberUuidBuilder_.build(); + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof context.ContextOuterClass.Fiber) { + return mergeFrom((context.ContextOuterClass.Fiber) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(context.ContextOuterClass.Fiber other) { + if (other == context.ContextOuterClass.Fiber.getDefaultInstance()) + return this; + if (!other.getID().isEmpty()) { + iD_ = other.iD_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (!other.getSrcPort().isEmpty()) { + srcPort_ = other.srcPort_; + bitField0_ |= 0x00000002; + onChanged(); + } + if (!other.getDstPort().isEmpty()) { + dstPort_ = other.dstPort_; + bitField0_ |= 0x00000004; + onChanged(); + } + if (!other.getLocalPeerPort().isEmpty()) { + localPeerPort_ = other.localPeerPort_; + bitField0_ |= 0x00000008; + onChanged(); + } + if (!other.getRemotePeerPort().isEmpty()) { + remotePeerPort_ = other.remotePeerPort_; + bitField0_ |= 0x00000010; + onChanged(); + } + if (!other.cSlots_.isEmpty()) { + if (cSlots_.isEmpty()) { + cSlots_ = other.cSlots_; + bitField0_ = (bitField0_ & ~0x00000020); + } else { + ensureCSlotsIsMutable(); + cSlots_.addAll(other.cSlots_); + } + onChanged(); + } + if (!other.lSlots_.isEmpty()) { + if (lSlots_.isEmpty()) { + lSlots_ = other.lSlots_; + bitField0_ = (bitField0_ & ~0x00000040); + } else { + ensureLSlotsIsMutable(); + lSlots_.addAll(other.lSlots_); + } + onChanged(); + } + if (!other.sSlots_.isEmpty()) { + if (sSlots_.isEmpty()) { + sSlots_ = other.sSlots_; + bitField0_ = (bitField0_ & ~0x00000080); + } else { + ensureSSlotsIsMutable(); + sSlots_.addAll(other.sSlots_); + } + onChanged(); + } + if (other.getLength() != 0F) { + setLength(other.getLength()); + } + if (other.getUsed() != false) { + setUsed(other.getUsed()); + } + if (other.hasFiberUuid()) { + mergeFiberUuid(other.getFiberUuid()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + srcPort_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000002; + break; + } + // case 10 + case 18: + { + dstPort_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000004; + break; + } + // case 18 + case 26: + { + localPeerPort_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000008; + break; + } + // case 26 + case 34: + { + remotePeerPort_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000010; + break; + } + // case 34 + case 40: + { + int v = input.readInt32(); + ensureCSlotsIsMutable(); + cSlots_.addInt(v); + break; + } + // case 40 + case 42: + { + int length = input.readRawVarint32(); + int limit = input.pushLimit(length); + ensureCSlotsIsMutable(); + while (input.getBytesUntilLimit() > 0) { + cSlots_.addInt(input.readInt32()); + } + input.popLimit(limit); + break; + } + // case 42 + case 48: + { + int v = input.readInt32(); + ensureLSlotsIsMutable(); + lSlots_.addInt(v); + break; + } + // case 48 + case 50: + { + int length = input.readRawVarint32(); + int limit = input.pushLimit(length); + ensureLSlotsIsMutable(); + while (input.getBytesUntilLimit() > 0) { + lSlots_.addInt(input.readInt32()); + } + input.popLimit(limit); + break; + } + // case 50 + case 56: + { + int v = input.readInt32(); + ensureSSlotsIsMutable(); + sSlots_.addInt(v); + break; + } + // case 56 + case 58: + { + int length = input.readRawVarint32(); + int limit = input.pushLimit(length); + ensureSSlotsIsMutable(); + while (input.getBytesUntilLimit() > 0) { + sSlots_.addInt(input.readInt32()); + } + input.popLimit(limit); + break; + } + // case 58 + case 69: + { + length_ = input.readFloat(); + bitField0_ |= 0x00000100; + break; + } + // case 69 + case 72: + { + used_ = input.readBool(); + bitField0_ |= 0x00000200; + break; + } + // case 72 + case 82: + { + iD_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } + // case 82 + case 90: + { + input.readMessage(getFiberUuidFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000400; + break; + } + // case 90 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } + + private int bitField0_; + + private java.lang.Object iD_ = ""; + + /** + * string ID = 10; + * @return The iD. + */ + public java.lang.String getID() { + java.lang.Object ref = iD_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + iD_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string ID = 10; + * @return The bytes for iD. + */ + public com.google.protobuf.ByteString getIDBytes() { + java.lang.Object ref = iD_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + iD_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string ID = 10; + * @param value The iD to set. + * @return This builder for chaining. + */ + public Builder setID(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + iD_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * string ID = 10; + * @return This builder for chaining. + */ + public Builder clearID() { + iD_ = getDefaultInstance().getID(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + + /** + * string ID = 10; + * @param value The bytes for iD to set. + * @return This builder for chaining. + */ + public Builder setIDBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + iD_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private java.lang.Object srcPort_ = ""; + + /** + * string src_port = 1; + * @return The srcPort. + */ + public java.lang.String getSrcPort() { + java.lang.Object ref = srcPort_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + srcPort_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string src_port = 1; + * @return The bytes for srcPort. + */ + public com.google.protobuf.ByteString getSrcPortBytes() { + java.lang.Object ref = srcPort_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + srcPort_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string src_port = 1; + * @param value The srcPort to set. + * @return This builder for chaining. + */ + public Builder setSrcPort(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + srcPort_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * string src_port = 1; + * @return This builder for chaining. + */ + public Builder clearSrcPort() { + srcPort_ = getDefaultInstance().getSrcPort(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + + /** + * string src_port = 1; + * @param value The bytes for srcPort to set. + * @return This builder for chaining. + */ + public Builder setSrcPortBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + srcPort_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + private java.lang.Object dstPort_ = ""; + + /** + * string dst_port = 2; + * @return The dstPort. + */ + public java.lang.String getDstPort() { + java.lang.Object ref = dstPort_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + dstPort_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string dst_port = 2; + * @return The bytes for dstPort. + */ + public com.google.protobuf.ByteString getDstPortBytes() { + java.lang.Object ref = dstPort_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + dstPort_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string dst_port = 2; + * @param value The dstPort to set. + * @return This builder for chaining. + */ + public Builder setDstPort(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + dstPort_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + /** + * string dst_port = 2; + * @return This builder for chaining. + */ + public Builder clearDstPort() { + dstPort_ = getDefaultInstance().getDstPort(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + return this; + } + + /** + * string dst_port = 2; + * @param value The bytes for dstPort to set. + * @return This builder for chaining. + */ + public Builder setDstPortBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + dstPort_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + private java.lang.Object localPeerPort_ = ""; + + /** + * string local_peer_port = 3; + * @return The localPeerPort. + */ + public java.lang.String getLocalPeerPort() { + java.lang.Object ref = localPeerPort_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + localPeerPort_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string local_peer_port = 3; + * @return The bytes for localPeerPort. + */ + public com.google.protobuf.ByteString getLocalPeerPortBytes() { + java.lang.Object ref = localPeerPort_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + localPeerPort_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string local_peer_port = 3; + * @param value The localPeerPort to set. + * @return This builder for chaining. + */ + public Builder setLocalPeerPort(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + localPeerPort_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + + /** + * string local_peer_port = 3; + * @return This builder for chaining. + */ + public Builder clearLocalPeerPort() { + localPeerPort_ = getDefaultInstance().getLocalPeerPort(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + return this; + } + + /** + * string local_peer_port = 3; + * @param value The bytes for localPeerPort to set. + * @return This builder for chaining. + */ + public Builder setLocalPeerPortBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + localPeerPort_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + + private java.lang.Object remotePeerPort_ = ""; + + /** + * string remote_peer_port = 4; + * @return The remotePeerPort. + */ + public java.lang.String getRemotePeerPort() { + java.lang.Object ref = remotePeerPort_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + remotePeerPort_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string remote_peer_port = 4; + * @return The bytes for remotePeerPort. + */ + public com.google.protobuf.ByteString getRemotePeerPortBytes() { + java.lang.Object ref = remotePeerPort_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + remotePeerPort_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string remote_peer_port = 4; + * @param value The remotePeerPort to set. + * @return This builder for chaining. + */ + public Builder setRemotePeerPort(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + remotePeerPort_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + + /** + * string remote_peer_port = 4; + * @return This builder for chaining. + */ + public Builder clearRemotePeerPort() { + remotePeerPort_ = getDefaultInstance().getRemotePeerPort(); + bitField0_ = (bitField0_ & ~0x00000010); + onChanged(); + return this; + } + + /** + * string remote_peer_port = 4; + * @param value The bytes for remotePeerPort to set. + * @return This builder for chaining. + */ + public Builder setRemotePeerPortBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + remotePeerPort_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + + private com.google.protobuf.Internal.IntList cSlots_ = emptyIntList(); + + private void ensureCSlotsIsMutable() { + if (!((bitField0_ & 0x00000020) != 0)) { + cSlots_ = mutableCopy(cSlots_); + bitField0_ |= 0x00000020; + } + } + + /** + * repeated int32 c_slots = 5; + * @return A list containing the cSlots. + */ + public java.util.List getCSlotsList() { + return ((bitField0_ & 0x00000020) != 0) ? java.util.Collections.unmodifiableList(cSlots_) : cSlots_; + } + + /** + * repeated int32 c_slots = 5; + * @return The count of cSlots. + */ + public int getCSlotsCount() { + return cSlots_.size(); + } + + /** + * repeated int32 c_slots = 5; + * @param index The index of the element to return. + * @return The cSlots at the given index. + */ + public int getCSlots(int index) { + return cSlots_.getInt(index); + } + + /** + * repeated int32 c_slots = 5; + * @param index The index to set the value at. + * @param value The cSlots to set. + * @return This builder for chaining. + */ + public Builder setCSlots(int index, int value) { + ensureCSlotsIsMutable(); + cSlots_.setInt(index, value); + onChanged(); + return this; + } + + /** + * repeated int32 c_slots = 5; + * @param value The cSlots to add. + * @return This builder for chaining. + */ + public Builder addCSlots(int value) { + ensureCSlotsIsMutable(); + cSlots_.addInt(value); + onChanged(); + return this; + } + + /** + * repeated int32 c_slots = 5; + * @param values The cSlots to add. + * @return This builder for chaining. + */ + public Builder addAllCSlots(java.lang.Iterable values) { + ensureCSlotsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll(values, cSlots_); + onChanged(); + return this; + } + + /** + * repeated int32 c_slots = 5; + * @return This builder for chaining. + */ + public Builder clearCSlots() { + cSlots_ = emptyIntList(); + bitField0_ = (bitField0_ & ~0x00000020); + onChanged(); + return this; + } + + private com.google.protobuf.Internal.IntList lSlots_ = emptyIntList(); + + private void ensureLSlotsIsMutable() { + if (!((bitField0_ & 0x00000040) != 0)) { + lSlots_ = mutableCopy(lSlots_); + bitField0_ |= 0x00000040; + } + } + + /** + * repeated int32 l_slots = 6; + * @return A list containing the lSlots. + */ + public java.util.List getLSlotsList() { + return ((bitField0_ & 0x00000040) != 0) ? java.util.Collections.unmodifiableList(lSlots_) : lSlots_; + } + + /** + * repeated int32 l_slots = 6; + * @return The count of lSlots. + */ + public int getLSlotsCount() { + return lSlots_.size(); + } + + /** + * repeated int32 l_slots = 6; + * @param index The index of the element to return. + * @return The lSlots at the given index. + */ + public int getLSlots(int index) { + return lSlots_.getInt(index); + } + + /** + * repeated int32 l_slots = 6; + * @param index The index to set the value at. + * @param value The lSlots to set. + * @return This builder for chaining. + */ + public Builder setLSlots(int index, int value) { + ensureLSlotsIsMutable(); + lSlots_.setInt(index, value); + onChanged(); + return this; + } + + /** + * repeated int32 l_slots = 6; + * @param value The lSlots to add. + * @return This builder for chaining. + */ + public Builder addLSlots(int value) { + ensureLSlotsIsMutable(); + lSlots_.addInt(value); + onChanged(); + return this; + } + + /** + * repeated int32 l_slots = 6; + * @param values The lSlots to add. + * @return This builder for chaining. + */ + public Builder addAllLSlots(java.lang.Iterable values) { + ensureLSlotsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll(values, lSlots_); + onChanged(); + return this; + } + + /** + * repeated int32 l_slots = 6; + * @return This builder for chaining. + */ + public Builder clearLSlots() { + lSlots_ = emptyIntList(); + bitField0_ = (bitField0_ & ~0x00000040); + onChanged(); + return this; + } + + private com.google.protobuf.Internal.IntList sSlots_ = emptyIntList(); + + private void ensureSSlotsIsMutable() { + if (!((bitField0_ & 0x00000080) != 0)) { + sSlots_ = mutableCopy(sSlots_); + bitField0_ |= 0x00000080; + } + } + + /** + * repeated int32 s_slots = 7; + * @return A list containing the sSlots. + */ + public java.util.List getSSlotsList() { + return ((bitField0_ & 0x00000080) != 0) ? java.util.Collections.unmodifiableList(sSlots_) : sSlots_; + } + + /** + * repeated int32 s_slots = 7; + * @return The count of sSlots. + */ + public int getSSlotsCount() { + return sSlots_.size(); + } + + /** + * repeated int32 s_slots = 7; + * @param index The index of the element to return. + * @return The sSlots at the given index. + */ + public int getSSlots(int index) { + return sSlots_.getInt(index); + } + + /** + * repeated int32 s_slots = 7; + * @param index The index to set the value at. + * @param value The sSlots to set. + * @return This builder for chaining. + */ + public Builder setSSlots(int index, int value) { + ensureSSlotsIsMutable(); + sSlots_.setInt(index, value); + onChanged(); + return this; + } + + /** + * repeated int32 s_slots = 7; + * @param value The sSlots to add. + * @return This builder for chaining. + */ + public Builder addSSlots(int value) { + ensureSSlotsIsMutable(); + sSlots_.addInt(value); + onChanged(); + return this; + } + + /** + * repeated int32 s_slots = 7; + * @param values The sSlots to add. + * @return This builder for chaining. + */ + public Builder addAllSSlots(java.lang.Iterable values) { + ensureSSlotsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll(values, sSlots_); + onChanged(); + return this; + } + + /** + * repeated int32 s_slots = 7; + * @return This builder for chaining. + */ + public Builder clearSSlots() { + sSlots_ = emptyIntList(); + bitField0_ = (bitField0_ & ~0x00000080); + onChanged(); + return this; + } + + private float length_; + + /** + * float length = 8; + * @return The length. + */ + @java.lang.Override + public float getLength() { + return length_; + } + + /** + * float length = 8; + * @param value The length to set. + * @return This builder for chaining. + */ + public Builder setLength(float value) { + length_ = value; + bitField0_ |= 0x00000100; + onChanged(); + return this; + } + + /** + * float length = 8; + * @return This builder for chaining. + */ + public Builder clearLength() { + bitField0_ = (bitField0_ & ~0x00000100); + length_ = 0F; + onChanged(); + return this; + } + + private boolean used_; + + /** + * bool used = 9; + * @return The used. + */ + @java.lang.Override + public boolean getUsed() { + return used_; + } + + /** + * bool used = 9; + * @param value The used to set. + * @return This builder for chaining. + */ + public Builder setUsed(boolean value) { + used_ = value; + bitField0_ |= 0x00000200; + onChanged(); + return this; + } + + /** + * bool used = 9; + * @return This builder for chaining. + */ + public Builder clearUsed() { + bitField0_ = (bitField0_ & ~0x00000200); + used_ = false; + onChanged(); + return this; + } + + private context.ContextOuterClass.FiberId fiberUuid_; + + private com.google.protobuf.SingleFieldBuilderV3 fiberUuidBuilder_; + + /** + * .context.FiberId fiber_uuid = 11; + * @return Whether the fiberUuid field is set. + */ + public boolean hasFiberUuid() { + return ((bitField0_ & 0x00000400) != 0); + } + + /** + * .context.FiberId fiber_uuid = 11; + * @return The fiberUuid. + */ + public context.ContextOuterClass.FiberId getFiberUuid() { + if (fiberUuidBuilder_ == null) { + return fiberUuid_ == null ? context.ContextOuterClass.FiberId.getDefaultInstance() : fiberUuid_; + } else { + return fiberUuidBuilder_.getMessage(); + } + } + + /** + * .context.FiberId fiber_uuid = 11; + */ + public Builder setFiberUuid(context.ContextOuterClass.FiberId value) { + if (fiberUuidBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + fiberUuid_ = value; + } else { + fiberUuidBuilder_.setMessage(value); + } + bitField0_ |= 0x00000400; + onChanged(); + return this; + } + + /** + * .context.FiberId fiber_uuid = 11; + */ + public Builder setFiberUuid(context.ContextOuterClass.FiberId.Builder builderForValue) { + if (fiberUuidBuilder_ == null) { + fiberUuid_ = builderForValue.build(); + } else { + fiberUuidBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000400; + onChanged(); + return this; + } + + /** + * .context.FiberId fiber_uuid = 11; + */ + public Builder mergeFiberUuid(context.ContextOuterClass.FiberId value) { + if (fiberUuidBuilder_ == null) { + if (((bitField0_ & 0x00000400) != 0) && fiberUuid_ != null && fiberUuid_ != context.ContextOuterClass.FiberId.getDefaultInstance()) { + getFiberUuidBuilder().mergeFrom(value); + } else { + fiberUuid_ = value; + } + } else { + fiberUuidBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000400; + onChanged(); + return this; + } + + /** + * .context.FiberId fiber_uuid = 11; + */ + public Builder clearFiberUuid() { + bitField0_ = (bitField0_ & ~0x00000400); + fiberUuid_ = null; + if (fiberUuidBuilder_ != null) { + fiberUuidBuilder_.dispose(); + fiberUuidBuilder_ = null; + } + onChanged(); + return this; + } + + /** + * .context.FiberId fiber_uuid = 11; + */ + public context.ContextOuterClass.FiberId.Builder getFiberUuidBuilder() { + bitField0_ |= 0x00000400; + onChanged(); + return getFiberUuidFieldBuilder().getBuilder(); + } + + /** + * .context.FiberId fiber_uuid = 11; + */ + public context.ContextOuterClass.FiberIdOrBuilder getFiberUuidOrBuilder() { + if (fiberUuidBuilder_ != null) { + return fiberUuidBuilder_.getMessageOrBuilder(); + } else { + return fiberUuid_ == null ? context.ContextOuterClass.FiberId.getDefaultInstance() : fiberUuid_; + } + } + + /** + * .context.FiberId fiber_uuid = 11; + */ + private com.google.protobuf.SingleFieldBuilderV3 getFiberUuidFieldBuilder() { + if (fiberUuidBuilder_ == null) { + fiberUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getFiberUuid(), getParentForChildren(), isClean()); + fiberUuid_ = null; + } + return fiberUuidBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + // @@protoc_insertion_point(builder_scope:context.Fiber) + } + + // @@protoc_insertion_point(class_scope:context.Fiber) + private static final context.ContextOuterClass.Fiber DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new context.ContextOuterClass.Fiber(); + } + + public static context.ContextOuterClass.Fiber getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + + @java.lang.Override + public Fiber parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public context.ContextOuterClass.Fiber getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface OpticalLinkDetailsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLinkDetails) + com.google.protobuf.MessageOrBuilder { + + /** + * float length = 1; + * @return The length. + */ + float getLength(); + + /** + * string source = 2; + * @return The source. + */ + java.lang.String getSource(); + + /** + * string source = 2; + * @return The bytes for source. + */ + com.google.protobuf.ByteString getSourceBytes(); + + /** + * string target = 3; + * @return The target. + */ + java.lang.String getTarget(); + + /** + * string target = 3; + * @return The bytes for target. + */ + com.google.protobuf.ByteString getTargetBytes(); + + /** + * repeated .context.Fiber fibers = 4; + */ + java.util.List getFibersList(); + + /** + * repeated .context.Fiber fibers = 4; + */ + context.ContextOuterClass.Fiber getFibers(int index); + + /** + * repeated .context.Fiber fibers = 4; + */ + int getFibersCount(); + + /** + * repeated .context.Fiber fibers = 4; + */ + java.util.List getFibersOrBuilderList(); + + /** + * repeated .context.Fiber fibers = 4; + */ + context.ContextOuterClass.FiberOrBuilder getFibersOrBuilder(int index); + } + + /** + * Protobuf type {@code context.OpticalLinkDetails} + */ + public static final class OpticalLinkDetails extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalLinkDetails) + OpticalLinkDetailsOrBuilder { + + private static final long serialVersionUID = 0L; + + // Use OpticalLinkDetails.newBuilder() to construct. + private OpticalLinkDetails(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private OpticalLinkDetails() { + source_ = ""; + target_ = ""; + fibers_ = java.util.Collections.emptyList(); + } + + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new OpticalLinkDetails(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalLinkDetails_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalLinkDetails_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalLinkDetails.class, context.ContextOuterClass.OpticalLinkDetails.Builder.class); + } + + public static final int LENGTH_FIELD_NUMBER = 1; + + private float length_ = 0F; + + /** + * float length = 1; + * @return The length. + */ + @java.lang.Override + public float getLength() { + return length_; + } + + public static final int SOURCE_FIELD_NUMBER = 2; + + @SuppressWarnings("serial") + private volatile java.lang.Object source_ = ""; + + /** + * string source = 2; + * @return The source. + */ + @java.lang.Override + public java.lang.String getSource() { + java.lang.Object ref = source_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + source_ = s; + return s; + } + } + + /** + * string source = 2; + * @return The bytes for source. + */ + @java.lang.Override + public com.google.protobuf.ByteString getSourceBytes() { + java.lang.Object ref = source_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + source_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TARGET_FIELD_NUMBER = 3; + + @SuppressWarnings("serial") + private volatile java.lang.Object target_ = ""; + + /** + * string target = 3; + * @return The target. + */ + @java.lang.Override + public java.lang.String getTarget() { + java.lang.Object ref = target_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + target_ = s; + return s; + } + } + + /** + * string target = 3; + * @return The bytes for target. + */ + @java.lang.Override + public com.google.protobuf.ByteString getTargetBytes() { + java.lang.Object ref = target_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + target_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int FIBERS_FIELD_NUMBER = 4; + + @SuppressWarnings("serial") + private java.util.List fibers_; + + /** + * repeated .context.Fiber fibers = 4; + */ + @java.lang.Override + public java.util.List getFibersList() { + return fibers_; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + @java.lang.Override + public java.util.List getFibersOrBuilderList() { + return fibers_; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + @java.lang.Override + public int getFibersCount() { + return fibers_.size(); + } + + /** + * repeated .context.Fiber fibers = 4; + */ + @java.lang.Override + public context.ContextOuterClass.Fiber getFibers(int index) { + return fibers_.get(index); + } + + /** + * repeated .context.Fiber fibers = 4; + */ + @java.lang.Override + public context.ContextOuterClass.FiberOrBuilder getFibersOrBuilder(int index) { + return fibers_.get(index); + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (java.lang.Float.floatToRawIntBits(length_) != 0) { + output.writeFloat(1, length_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(source_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, source_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(target_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, target_); + } + for (int i = 0; i < fibers_.size(); i++) { + output.writeMessage(4, fibers_.get(i)); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + if (java.lang.Float.floatToRawIntBits(length_) != 0) { + size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, length_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(source_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, source_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(target_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, target_); + } + for (int i = 0; i < fibers_.size(); i++) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, fibers_.get(i)); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof context.ContextOuterClass.OpticalLinkDetails)) { + return super.equals(obj); + } + context.ContextOuterClass.OpticalLinkDetails other = (context.ContextOuterClass.OpticalLinkDetails) obj; + if (java.lang.Float.floatToIntBits(getLength()) != java.lang.Float.floatToIntBits(other.getLength())) + return false; + if (!getSource().equals(other.getSource())) + return false; + if (!getTarget().equals(other.getTarget())) + return false; + if (!getFibersList().equals(other.getFibersList())) + return false; + if (!getUnknownFields().equals(other.getUnknownFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + LENGTH_FIELD_NUMBER; + hash = (53 * hash) + java.lang.Float.floatToIntBits(getLength()); + hash = (37 * hash) + SOURCE_FIELD_NUMBER; + hash = (53 * hash) + getSource().hashCode(); + hash = (37 * hash) + TARGET_FIELD_NUMBER; + hash = (53 * hash) + getTarget().hashCode(); + if (getFibersCount() > 0) { + hash = (37 * hash) + FIBERS_FIELD_NUMBER; + hash = (53 * hash) + getFibersList().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLinkDetails parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(context.ContextOuterClass.OpticalLinkDetails prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code context.OpticalLinkDetails} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalLinkDetails) + context.ContextOuterClass.OpticalLinkDetailsOrBuilder { + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalLinkDetails_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalLinkDetails_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalLinkDetails.class, context.ContextOuterClass.OpticalLinkDetails.Builder.class); + } + + // Construct using context.ContextOuterClass.OpticalLinkDetails.newBuilder() + private Builder() { + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + length_ = 0F; + source_ = ""; + target_ = ""; + if (fibersBuilder_ == null) { + fibers_ = java.util.Collections.emptyList(); + } else { + fibers_ = null; + fibersBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000008); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return context.ContextOuterClass.internal_static_context_OpticalLinkDetails_descriptor; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLinkDetails getDefaultInstanceForType() { + return context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance(); + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLinkDetails build() { + context.ContextOuterClass.OpticalLinkDetails result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLinkDetails buildPartial() { + context.ContextOuterClass.OpticalLinkDetails result = new context.ContextOuterClass.OpticalLinkDetails(this); + buildPartialRepeatedFields(result); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartialRepeatedFields(context.ContextOuterClass.OpticalLinkDetails result) { + if (fibersBuilder_ == null) { + if (((bitField0_ & 0x00000008) != 0)) { + fibers_ = java.util.Collections.unmodifiableList(fibers_); + bitField0_ = (bitField0_ & ~0x00000008); + } + result.fibers_ = fibers_; + } else { + result.fibers_ = fibersBuilder_.build(); + } + } + + private void buildPartial0(context.ContextOuterClass.OpticalLinkDetails result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.length_ = length_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.source_ = source_; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.target_ = target_; + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof context.ContextOuterClass.OpticalLinkDetails) { + return mergeFrom((context.ContextOuterClass.OpticalLinkDetails) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(context.ContextOuterClass.OpticalLinkDetails other) { + if (other == context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance()) + return this; + if (other.getLength() != 0F) { + setLength(other.getLength()); + } + if (!other.getSource().isEmpty()) { + source_ = other.source_; + bitField0_ |= 0x00000002; + onChanged(); + } + if (!other.getTarget().isEmpty()) { + target_ = other.target_; + bitField0_ |= 0x00000004; + onChanged(); + } + if (fibersBuilder_ == null) { + if (!other.fibers_.isEmpty()) { + if (fibers_.isEmpty()) { + fibers_ = other.fibers_; + bitField0_ = (bitField0_ & ~0x00000008); + } else { + ensureFibersIsMutable(); + fibers_.addAll(other.fibers_); + } + onChanged(); + } + } else { + if (!other.fibers_.isEmpty()) { + if (fibersBuilder_.isEmpty()) { + fibersBuilder_.dispose(); + fibersBuilder_ = null; + fibers_ = other.fibers_; + bitField0_ = (bitField0_ & ~0x00000008); + fibersBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getFibersFieldBuilder() : null; + } else { + fibersBuilder_.addAllMessages(other.fibers_); + } + } + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 13: + { + length_ = input.readFloat(); + bitField0_ |= 0x00000001; + break; + } + // case 13 + case 18: + { + source_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000002; + break; + } + // case 18 + case 26: + { + target_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000004; + break; + } + // case 26 + case 34: + { + context.ContextOuterClass.Fiber m = input.readMessage(context.ContextOuterClass.Fiber.parser(), extensionRegistry); + if (fibersBuilder_ == null) { + ensureFibersIsMutable(); + fibers_.add(m); + } else { + fibersBuilder_.addMessage(m); + } + break; + } + // case 34 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } + + private int bitField0_; + + private float length_; + + /** + * float length = 1; + * @return The length. + */ + @java.lang.Override + public float getLength() { + return length_; + } + + /** + * float length = 1; + * @param value The length to set. + * @return This builder for chaining. + */ + public Builder setLength(float value) { + length_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * float length = 1; + * @return This builder for chaining. + */ + public Builder clearLength() { + bitField0_ = (bitField0_ & ~0x00000001); + length_ = 0F; + onChanged(); + return this; + } + + private java.lang.Object source_ = ""; + + /** + * string source = 2; + * @return The source. + */ + public java.lang.String getSource() { + java.lang.Object ref = source_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + source_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string source = 2; + * @return The bytes for source. + */ + public com.google.protobuf.ByteString getSourceBytes() { + java.lang.Object ref = source_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + source_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string source = 2; + * @param value The source to set. + * @return This builder for chaining. + */ + public Builder setSource(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + source_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * string source = 2; + * @return This builder for chaining. + */ + public Builder clearSource() { + source_ = getDefaultInstance().getSource(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + + /** + * string source = 2; + * @param value The bytes for source to set. + * @return This builder for chaining. + */ + public Builder setSourceBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + source_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + private java.lang.Object target_ = ""; + + /** + * string target = 3; + * @return The target. + */ + public java.lang.String getTarget() { + java.lang.Object ref = target_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + target_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string target = 3; + * @return The bytes for target. + */ + public com.google.protobuf.ByteString getTargetBytes() { + java.lang.Object ref = target_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + target_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string target = 3; + * @param value The target to set. + * @return This builder for chaining. + */ + public Builder setTarget(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + target_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + /** + * string target = 3; + * @return This builder for chaining. + */ + public Builder clearTarget() { + target_ = getDefaultInstance().getTarget(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + return this; + } + + /** + * string target = 3; + * @param value The bytes for target to set. + * @return This builder for chaining. + */ + public Builder setTargetBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + target_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + private java.util.List fibers_ = java.util.Collections.emptyList(); + + private void ensureFibersIsMutable() { + if (!((bitField0_ & 0x00000008) != 0)) { + fibers_ = new java.util.ArrayList(fibers_); + bitField0_ |= 0x00000008; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3 fibersBuilder_; + + /** + * repeated .context.Fiber fibers = 4; + */ + public java.util.List getFibersList() { + if (fibersBuilder_ == null) { + return java.util.Collections.unmodifiableList(fibers_); + } else { + return fibersBuilder_.getMessageList(); + } + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public int getFibersCount() { + if (fibersBuilder_ == null) { + return fibers_.size(); + } else { + return fibersBuilder_.getCount(); + } + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public context.ContextOuterClass.Fiber getFibers(int index) { + if (fibersBuilder_ == null) { + return fibers_.get(index); + } else { + return fibersBuilder_.getMessage(index); + } + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder setFibers(int index, context.ContextOuterClass.Fiber value) { + if (fibersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFibersIsMutable(); + fibers_.set(index, value); + onChanged(); + } else { + fibersBuilder_.setMessage(index, value); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder setFibers(int index, context.ContextOuterClass.Fiber.Builder builderForValue) { + if (fibersBuilder_ == null) { + ensureFibersIsMutable(); + fibers_.set(index, builderForValue.build()); + onChanged(); + } else { + fibersBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder addFibers(context.ContextOuterClass.Fiber value) { + if (fibersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFibersIsMutable(); + fibers_.add(value); + onChanged(); + } else { + fibersBuilder_.addMessage(value); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder addFibers(int index, context.ContextOuterClass.Fiber value) { + if (fibersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureFibersIsMutable(); + fibers_.add(index, value); + onChanged(); + } else { + fibersBuilder_.addMessage(index, value); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder addFibers(context.ContextOuterClass.Fiber.Builder builderForValue) { + if (fibersBuilder_ == null) { + ensureFibersIsMutable(); + fibers_.add(builderForValue.build()); + onChanged(); + } else { + fibersBuilder_.addMessage(builderForValue.build()); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder addFibers(int index, context.ContextOuterClass.Fiber.Builder builderForValue) { + if (fibersBuilder_ == null) { + ensureFibersIsMutable(); + fibers_.add(index, builderForValue.build()); + onChanged(); + } else { + fibersBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder addAllFibers(java.lang.Iterable values) { + if (fibersBuilder_ == null) { + ensureFibersIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll(values, fibers_); + onChanged(); + } else { + fibersBuilder_.addAllMessages(values); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder clearFibers() { + if (fibersBuilder_ == null) { + fibers_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + } else { + fibersBuilder_.clear(); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public Builder removeFibers(int index) { + if (fibersBuilder_ == null) { + ensureFibersIsMutable(); + fibers_.remove(index); + onChanged(); + } else { + fibersBuilder_.remove(index); + } + return this; + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public context.ContextOuterClass.Fiber.Builder getFibersBuilder(int index) { + return getFibersFieldBuilder().getBuilder(index); + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public context.ContextOuterClass.FiberOrBuilder getFibersOrBuilder(int index) { + if (fibersBuilder_ == null) { + return fibers_.get(index); + } else { + return fibersBuilder_.getMessageOrBuilder(index); + } + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public java.util.List getFibersOrBuilderList() { + if (fibersBuilder_ != null) { + return fibersBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(fibers_); + } + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public context.ContextOuterClass.Fiber.Builder addFibersBuilder() { + return getFibersFieldBuilder().addBuilder(context.ContextOuterClass.Fiber.getDefaultInstance()); + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public context.ContextOuterClass.Fiber.Builder addFibersBuilder(int index) { + return getFibersFieldBuilder().addBuilder(index, context.ContextOuterClass.Fiber.getDefaultInstance()); + } + + /** + * repeated .context.Fiber fibers = 4; + */ + public java.util.List getFibersBuilderList() { + return getFibersFieldBuilder().getBuilderList(); + } + + private com.google.protobuf.RepeatedFieldBuilderV3 getFibersFieldBuilder() { + if (fibersBuilder_ == null) { + fibersBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(fibers_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean()); + fibers_ = null; + } + return fibersBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + // @@protoc_insertion_point(builder_scope:context.OpticalLinkDetails) + } + + // @@protoc_insertion_point(class_scope:context.OpticalLinkDetails) + private static final context.ContextOuterClass.OpticalLinkDetails DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new context.ContextOuterClass.OpticalLinkDetails(); + } + + public static context.ContextOuterClass.OpticalLinkDetails getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + + @java.lang.Override + public OpticalLinkDetails parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLinkDetails getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface OpticalLinkOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLink) + com.google.protobuf.MessageOrBuilder { + + /** + * string name = 1; + * @return The name. + */ + java.lang.String getName(); + + /** + * string name = 1; + * @return The bytes for name. + */ + com.google.protobuf.ByteString getNameBytes(); + + /** + * .context.OpticalLinkDetails details = 2; + * @return Whether the details field is set. + */ + boolean hasDetails(); + + /** + * .context.OpticalLinkDetails details = 2; + * @return The details. + */ + context.ContextOuterClass.OpticalLinkDetails getDetails(); + + /** + * .context.OpticalLinkDetails details = 2; + */ + context.ContextOuterClass.OpticalLinkDetailsOrBuilder getDetailsOrBuilder(); + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + * @return Whether the opticalLinkUuid field is set. + */ + boolean hasOpticalLinkUuid(); + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + * @return The opticalLinkUuid. + */ + context.ContextOuterClass.OpticalLinkId getOpticalLinkUuid(); + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + context.ContextOuterClass.OpticalLinkIdOrBuilder getOpticalLinkUuidOrBuilder(); + } + + /** + * Protobuf type {@code context.OpticalLink} + */ + public static final class OpticalLink extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalLink) + OpticalLinkOrBuilder { + + private static final long serialVersionUID = 0L; + + // Use OpticalLink.newBuilder() to construct. + private OpticalLink(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private OpticalLink() { + name_ = ""; + } + + @java.lang.Override + @SuppressWarnings({ "unused" }) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new OpticalLink(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalLink_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalLink_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalLink.class, context.ContextOuterClass.OpticalLink.Builder.class); + } + + public static final int NAME_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private volatile java.lang.Object name_ = ""; + + /** + * string name = 1; + * @return The name. + */ + @java.lang.Override + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } + } + + /** + * string name = 1; + * @return The bytes for name. + */ + @java.lang.Override + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int DETAILS_FIELD_NUMBER = 2; + + private context.ContextOuterClass.OpticalLinkDetails details_; + + /** + * .context.OpticalLinkDetails details = 2; + * @return Whether the details field is set. + */ + @java.lang.Override + public boolean hasDetails() { + return details_ != null; + } + + /** + * .context.OpticalLinkDetails details = 2; + * @return The details. + */ + @java.lang.Override + public context.ContextOuterClass.OpticalLinkDetails getDetails() { + return details_ == null ? context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance() : details_; + } + + /** + * .context.OpticalLinkDetails details = 2; + */ + @java.lang.Override + public context.ContextOuterClass.OpticalLinkDetailsOrBuilder getDetailsOrBuilder() { + return details_ == null ? context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance() : details_; + } + + public static final int OPTICAL_LINK_UUID_FIELD_NUMBER = 3; + + private context.ContextOuterClass.OpticalLinkId opticalLinkUuid_; + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + * @return Whether the opticalLinkUuid field is set. + */ + @java.lang.Override + public boolean hasOpticalLinkUuid() { + return opticalLinkUuid_ != null; + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + * @return The opticalLinkUuid. + */ + @java.lang.Override + public context.ContextOuterClass.OpticalLinkId getOpticalLinkUuid() { + return opticalLinkUuid_ == null ? context.ContextOuterClass.OpticalLinkId.getDefaultInstance() : opticalLinkUuid_; + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + @java.lang.Override + public context.ContextOuterClass.OpticalLinkIdOrBuilder getOpticalLinkUuidOrBuilder() { + return opticalLinkUuid_ == null ? context.ContextOuterClass.OpticalLinkId.getDefaultInstance() : opticalLinkUuid_; + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) + return true; + if (isInitialized == 0) + return false; + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_); + } + if (details_ != null) { + output.writeMessage(2, getDetails()); + } + if (opticalLinkUuid_ != null) { + output.writeMessage(3, getOpticalLinkUuid()); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) + return size; + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_); + } + if (details_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getDetails()); + } + if (opticalLinkUuid_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getOpticalLinkUuid()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof context.ContextOuterClass.OpticalLink)) { + return super.equals(obj); + } + context.ContextOuterClass.OpticalLink other = (context.ContextOuterClass.OpticalLink) obj; + if (!getName().equals(other.getName())) + return false; + if (hasDetails() != other.hasDetails()) + return false; + if (hasDetails()) { + if (!getDetails().equals(other.getDetails())) + return false; + } + if (hasOpticalLinkUuid() != other.hasOpticalLinkUuid()) + return false; + if (hasOpticalLinkUuid()) { + if (!getOpticalLinkUuid().equals(other.getOpticalLinkUuid())) + return false; + } + if (!getUnknownFields().equals(other.getUnknownFields())) + return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + if (hasDetails()) { + hash = (37 * hash) + DETAILS_FIELD_NUMBER; + hash = (53 * hash) + getDetails().hashCode(); + } + if (hasOpticalLinkUuid()) { + hash = (37 * hash) + OPTICAL_LINK_UUID_FIELD_NUMBER; + hash = (53 * hash) + getOpticalLinkUuid().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static context.ContextOuterClass.OpticalLink parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLink parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLink parseDelimitedFrom(java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static context.ContextOuterClass.OpticalLink parseFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(context.ContextOuterClass.OpticalLink prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** + * Protobuf type {@code context.OpticalLink} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalLink) + context.ContextOuterClass.OpticalLinkOrBuilder { + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return context.ContextOuterClass.internal_static_context_OpticalLink_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return context.ContextOuterClass.internal_static_context_OpticalLink_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.OpticalLink.class, context.ContextOuterClass.OpticalLink.Builder.class); + } + + // Construct using context.ContextOuterClass.OpticalLink.newBuilder() + private Builder() { + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + name_ = ""; + details_ = null; + if (detailsBuilder_ != null) { + detailsBuilder_.dispose(); + detailsBuilder_ = null; + } + opticalLinkUuid_ = null; + if (opticalLinkUuidBuilder_ != null) { + opticalLinkUuidBuilder_.dispose(); + opticalLinkUuidBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return context.ContextOuterClass.internal_static_context_OpticalLink_descriptor; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLink getDefaultInstanceForType() { + return context.ContextOuterClass.OpticalLink.getDefaultInstance(); + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLink build() { + context.ContextOuterClass.OpticalLink result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLink buildPartial() { + context.ContextOuterClass.OpticalLink result = new context.ContextOuterClass.OpticalLink(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(context.ContextOuterClass.OpticalLink result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.name_ = name_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.details_ = detailsBuilder_ == null ? details_ : detailsBuilder_.build(); + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.opticalLinkUuid_ = opticalLinkUuidBuilder_ == null ? opticalLinkUuid_ : opticalLinkUuidBuilder_.build(); + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof context.ContextOuterClass.OpticalLink) { + return mergeFrom((context.ContextOuterClass.OpticalLink) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(context.ContextOuterClass.OpticalLink other) { + if (other == context.ContextOuterClass.OpticalLink.getDefaultInstance()) + return this; + if (!other.getName().isEmpty()) { + name_ = other.name_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.hasDetails()) { + mergeDetails(other.getDetails()); + } + if (other.hasOpticalLinkUuid()) { + mergeOpticalLinkUuid(other.getOpticalLinkUuid()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + name_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } + // case 10 + case 18: + { + input.readMessage(getDetailsFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000002; + break; + } + // case 18 + case 26: + { + input.readMessage(getOpticalLinkUuidFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000004; + break; + } + // case 26 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + // was an endgroup tag + done = true; + } + break; + } + } + // switch (tag) + } + // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } + // finally + return this; + } + + private int bitField0_; + + private java.lang.Object name_ = ""; + + /** + * string name = 1; + * @return The name. + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string name = 1; + * @return The bytes for name. + */ + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string name = 1; + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + name_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * string name = 1; + * @return This builder for chaining. + */ + public Builder clearName() { + name_ = getDefaultInstance().getName(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + + /** + * string name = 1; + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + name_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private context.ContextOuterClass.OpticalLinkDetails details_; + + private com.google.protobuf.SingleFieldBuilderV3 detailsBuilder_; + + /** + * .context.OpticalLinkDetails details = 2; + * @return Whether the details field is set. + */ + public boolean hasDetails() { + return ((bitField0_ & 0x00000002) != 0); + } + + /** + * .context.OpticalLinkDetails details = 2; + * @return The details. + */ + public context.ContextOuterClass.OpticalLinkDetails getDetails() { + if (detailsBuilder_ == null) { + return details_ == null ? context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance() : details_; + } else { + return detailsBuilder_.getMessage(); + } + } + + /** + * .context.OpticalLinkDetails details = 2; + */ + public Builder setDetails(context.ContextOuterClass.OpticalLinkDetails value) { + if (detailsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + details_ = value; + } else { + detailsBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * .context.OpticalLinkDetails details = 2; + */ + public Builder setDetails(context.ContextOuterClass.OpticalLinkDetails.Builder builderForValue) { + if (detailsBuilder_ == null) { + details_ = builderForValue.build(); + } else { + detailsBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * .context.OpticalLinkDetails details = 2; + */ + public Builder mergeDetails(context.ContextOuterClass.OpticalLinkDetails value) { + if (detailsBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) && details_ != null && details_ != context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance()) { + getDetailsBuilder().mergeFrom(value); + } else { + details_ = value; + } + } else { + detailsBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * .context.OpticalLinkDetails details = 2; + */ + public Builder clearDetails() { + bitField0_ = (bitField0_ & ~0x00000002); + details_ = null; + if (detailsBuilder_ != null) { + detailsBuilder_.dispose(); + detailsBuilder_ = null; + } + onChanged(); + return this; + } + + /** + * .context.OpticalLinkDetails details = 2; + */ + public context.ContextOuterClass.OpticalLinkDetails.Builder getDetailsBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getDetailsFieldBuilder().getBuilder(); + } + + /** + * .context.OpticalLinkDetails details = 2; + */ + public context.ContextOuterClass.OpticalLinkDetailsOrBuilder getDetailsOrBuilder() { + if (detailsBuilder_ != null) { + return detailsBuilder_.getMessageOrBuilder(); + } else { + return details_ == null ? context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance() : details_; + } + } + + /** + * .context.OpticalLinkDetails details = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3 getDetailsFieldBuilder() { + if (detailsBuilder_ == null) { + detailsBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getDetails(), getParentForChildren(), isClean()); + details_ = null; + } + return detailsBuilder_; + } + + private context.ContextOuterClass.OpticalLinkId opticalLinkUuid_; + + private com.google.protobuf.SingleFieldBuilderV3 opticalLinkUuidBuilder_; + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + * @return Whether the opticalLinkUuid field is set. + */ + public boolean hasOpticalLinkUuid() { + return ((bitField0_ & 0x00000004) != 0); + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + * @return The opticalLinkUuid. + */ + public context.ContextOuterClass.OpticalLinkId getOpticalLinkUuid() { + if (opticalLinkUuidBuilder_ == null) { + return opticalLinkUuid_ == null ? context.ContextOuterClass.OpticalLinkId.getDefaultInstance() : opticalLinkUuid_; + } else { + return opticalLinkUuidBuilder_.getMessage(); + } + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + public Builder setOpticalLinkUuid(context.ContextOuterClass.OpticalLinkId value) { + if (opticalLinkUuidBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + opticalLinkUuid_ = value; + } else { + opticalLinkUuidBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + public Builder setOpticalLinkUuid(context.ContextOuterClass.OpticalLinkId.Builder builderForValue) { + if (opticalLinkUuidBuilder_ == null) { + opticalLinkUuid_ = builderForValue.build(); + } else { + opticalLinkUuidBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + public Builder mergeOpticalLinkUuid(context.ContextOuterClass.OpticalLinkId value) { + if (opticalLinkUuidBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0) && opticalLinkUuid_ != null && opticalLinkUuid_ != context.ContextOuterClass.OpticalLinkId.getDefaultInstance()) { + getOpticalLinkUuidBuilder().mergeFrom(value); + } else { + opticalLinkUuid_ = value; + } + } else { + opticalLinkUuidBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + public Builder clearOpticalLinkUuid() { + bitField0_ = (bitField0_ & ~0x00000004); + opticalLinkUuid_ = null; + if (opticalLinkUuidBuilder_ != null) { + opticalLinkUuidBuilder_.dispose(); + opticalLinkUuidBuilder_ = null; + } + onChanged(); + return this; + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + public context.ContextOuterClass.OpticalLinkId.Builder getOpticalLinkUuidBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getOpticalLinkUuidFieldBuilder().getBuilder(); + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + public context.ContextOuterClass.OpticalLinkIdOrBuilder getOpticalLinkUuidOrBuilder() { + if (opticalLinkUuidBuilder_ != null) { + return opticalLinkUuidBuilder_.getMessageOrBuilder(); + } else { + return opticalLinkUuid_ == null ? context.ContextOuterClass.OpticalLinkId.getDefaultInstance() : opticalLinkUuid_; + } + } + + /** + * .context.OpticalLinkId optical_link_uuid = 3; + */ + private com.google.protobuf.SingleFieldBuilderV3 getOpticalLinkUuidFieldBuilder() { + if (opticalLinkUuidBuilder_ == null) { + opticalLinkUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getOpticalLinkUuid(), getParentForChildren(), isClean()); + opticalLinkUuid_ = null; + } + return opticalLinkUuidBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + // @@protoc_insertion_point(builder_scope:context.OpticalLink) + } + + // @@protoc_insertion_point(class_scope:context.OpticalLink) + private static final context.ContextOuterClass.OpticalLink DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new context.ContextOuterClass.OpticalLink(); + } + + public static context.ContextOuterClass.OpticalLink getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() { + + @java.lang.Override + public OpticalLink parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public context.ContextOuterClass.OpticalLink getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Empty_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Empty_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Uuid_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Uuid_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Timestamp_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Timestamp_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Event_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Event_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ContextId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ContextId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Context_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Context_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ContextIdList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ContextIdList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ContextList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ContextList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ContextEvent_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ContextEvent_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Topology_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Topology_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyDetails_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyDetails_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyIdList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyIdList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_TopologyEvent_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_TopologyEvent_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Device_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Device_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Component_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Component_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Component_AttributesEntry_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Component_AttributesEntry_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceConfig_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceConfig_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceIdList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceIdList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceFilter_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceFilter_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_DeviceEvent_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_DeviceEvent_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkAttributes_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkAttributes_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Link_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Link_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkIdList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkIdList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_LinkEvent_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_LinkEvent_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Service_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Service_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceStatus_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceStatus_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceConfig_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceConfig_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceIdList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceIdList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceFilter_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceFilter_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ServiceEvent_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ServiceEvent_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Slice_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Slice_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceOwner_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceOwner_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceStatus_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceStatus_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceConfig_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceConfig_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceIdList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceIdList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceFilter_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceFilter_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_SliceEvent_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_SliceEvent_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ConnectionId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ConnectionId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ConnectionSettings_L0_descriptor; private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ConnectionSettings_L0_fieldAccessorTable; @@ -69611,6 +76651,38 @@ public final class ContextOuterClass { private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_AuthenticationResult_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_OpticalConfigId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_OpticalConfigId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_OpticalConfig_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_OpticalConfig_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_OpticalConfigList_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_OpticalConfigList_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_OpticalLinkId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_OpticalLinkId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_FiberId_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_FiberId_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_Fiber_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_Fiber_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_OpticalLinkDetails_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_OpticalLinkDetails_fieldAccessorTable; + + private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_OpticalLink_descriptor; + + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_OpticalLink_fieldAccessorTable; + public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { return descriptor; } @@ -69618,7 +76690,7 @@ public final class ContextOuterClass { private static com.google.protobuf.Descriptors.FileDescriptor descriptor; static { - java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\tacl.proto\032\026kpi" + "_sample_types.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004" + "uuid\030\001 \001(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001" + "(\001\"Z\n\005Event\022%\n\ttimestamp\030\001 \001(\0132\022.context" + ".Timestamp\022*\n\nevent_type\030\002 \001(\0162\026.context" + ".EventTypeEnum\"0\n\tContextId\022#\n\014context_u" + "uid\030\001 \001(\0132\r.context.Uuid\"\351\001\n\007Context\022&\n\n" + "context_id\030\001 \001(\0132\022.context.ContextId\022\014\n\004" + "name\030\002 \001(\t\022)\n\014topology_ids\030\003 \003(\0132\023.conte" + "xt.TopologyId\022\'\n\013service_ids\030\004 \003(\0132\022.con" + "text.ServiceId\022#\n\tslice_ids\030\005 \003(\0132\020.cont" + "ext.SliceId\022/\n\ncontroller\030\006 \001(\0132\033.contex" + "t.TeraFlowController\"8\n\rContextIdList\022\'\n" + "\013context_ids\030\001 \003(\0132\022.context.ContextId\"1" + "\n\013ContextList\022\"\n\010contexts\030\001 \003(\0132\020.contex" + "t.Context\"U\n\014ContextEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022&\n\ncontext_id\030\002 \001(\0132\022.c" + "ontext.ContextId\"Z\n\nTopologyId\022&\n\ncontex" + "t_id\030\001 \001(\0132\022.context.ContextId\022$\n\rtopolo" + "gy_uuid\030\002 \001(\0132\r.context.Uuid\"\214\001\n\010Topolog" + "y\022(\n\013topology_id\030\001 \001(\0132\023.context.Topolog" + "yId\022\014\n\004name\030\002 \001(\t\022%\n\ndevice_ids\030\003 \003(\0132\021." + "context.DeviceId\022!\n\010link_ids\030\004 \003(\0132\017.con" + "text.LinkId\"\211\001\n\017TopologyDetails\022(\n\013topol" + "ogy_id\030\001 \001(\0132\023.context.TopologyId\022\014\n\004nam" + "e\030\002 \001(\t\022 \n\007devices\030\003 \003(\0132\017.context.Devic" + "e\022\034\n\005links\030\004 \003(\0132\r.context.Link\";\n\016Topol" + "ogyIdList\022)\n\014topology_ids\030\001 \003(\0132\023.contex" + "t.TopologyId\"5\n\014TopologyList\022%\n\ntopologi" + "es\030\001 \003(\0132\021.context.Topology\"X\n\rTopologyE" + "vent\022\035\n\005event\030\001 \001(\0132\016.context.Event\022(\n\013t" + "opology_id\030\002 \001(\0132\023.context.TopologyId\".\n" + "\010DeviceId\022\"\n\013device_uuid\030\001 \001(\0132\r.context" + ".Uuid\"\372\002\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.co" + "ntext.DeviceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_t" + "ype\030\003 \001(\t\022,\n\rdevice_config\030\004 \001(\0132\025.conte" + "xt.DeviceConfig\022G\n\031device_operational_st" + "atus\030\005 \001(\0162$.context.DeviceOperationalSt" + "atusEnum\0221\n\016device_drivers\030\006 \003(\0162\031.conte" + "xt.DeviceDriverEnum\022+\n\020device_endpoints\030" + "\007 \003(\0132\021.context.EndPoint\022&\n\ncomponents\030\010" + " \003(\0132\022.context.Component\022(\n\rcontroller_i" + "d\030\t \001(\0132\021.context.DeviceId\"\311\001\n\tComponent" + "\022%\n\016component_uuid\030\001 \001(\0132\r.context.Uuid\022" + "\014\n\004name\030\002 \001(\t\022\014\n\004type\030\003 \001(\t\0226\n\nattribute" + "s\030\004 \003(\0132\".context.Component.AttributesEn" + "try\022\016\n\006parent\030\005 \001(\t\0321\n\017AttributesEntry\022\013" + "\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"9\n\014Device" + "Config\022)\n\014config_rules\030\001 \003(\0132\023.context.C" + "onfigRule\"5\n\014DeviceIdList\022%\n\ndevice_ids\030" + "\001 \003(\0132\021.context.DeviceId\".\n\nDeviceList\022 " + "\n\007devices\030\001 \003(\0132\017.context.Device\"\216\001\n\014Dev" + "iceFilter\022)\n\ndevice_ids\030\001 \001(\0132\025.context." + "DeviceIdList\022\031\n\021include_endpoints\030\002 \001(\010\022" + "\034\n\024include_config_rules\030\003 \001(\010\022\032\n\022include" + "_components\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005eve" + "nt\030\001 \001(\0132\016.context.Event\022$\n\tdevice_id\030\002 " + "\001(\0132\021.context.DeviceId\022,\n\rdevice_config\030" + "\003 \001(\0132\025.context.DeviceConfig\"*\n\006LinkId\022 " + "\n\tlink_uuid\030\001 \001(\0132\r.context.Uuid\"I\n\016Link" + "Attributes\022\033\n\023total_capacity_gbps\030\001 \001(\002\022" + "\032\n\022used_capacity_gbps\030\002 \001(\002\"\223\001\n\004Link\022 \n\007" + "link_id\030\001 \001(\0132\017.context.LinkId\022\014\n\004name\030\002" + " \001(\t\022.\n\021link_endpoint_ids\030\003 \003(\0132\023.contex" + "t.EndPointId\022+\n\nattributes\030\004 \001(\0132\027.conte" + "xt.LinkAttributes\"/\n\nLinkIdList\022!\n\010link_" + "ids\030\001 \003(\0132\017.context.LinkId\"(\n\010LinkList\022\034" + "\n\005links\030\001 \003(\0132\r.context.Link\"L\n\tLinkEven" + "t\022\035\n\005event\030\001 \001(\0132\016.context.Event\022 \n\007link" + "_id\030\002 \001(\0132\017.context.LinkId\"X\n\tServiceId\022" + "&\n\ncontext_id\030\001 \001(\0132\022.context.ContextId\022" + "#\n\014service_uuid\030\002 \001(\0132\r.context.Uuid\"\333\002\n" + "\007Service\022&\n\nservice_id\030\001 \001(\0132\022.context.S" + "erviceId\022\014\n\004name\030\002 \001(\t\022.\n\014service_type\030\003" + " \001(\0162\030.context.ServiceTypeEnum\0221\n\024servic" + "e_endpoint_ids\030\004 \003(\0132\023.context.EndPointI" + "d\0220\n\023service_constraints\030\005 \003(\0132\023.context" + ".Constraint\022.\n\016service_status\030\006 \001(\0132\026.co" + "ntext.ServiceStatus\022.\n\016service_config\030\007 " + "\001(\0132\026.context.ServiceConfig\022%\n\ttimestamp" + "\030\010 \001(\0132\022.context.Timestamp\"C\n\rServiceSta" + "tus\0222\n\016service_status\030\001 \001(\0162\032.context.Se" + "rviceStatusEnum\":\n\rServiceConfig\022)\n\014conf" + "ig_rules\030\001 \003(\0132\023.context.ConfigRule\"8\n\rS" + "erviceIdList\022\'\n\013service_ids\030\001 \003(\0132\022.cont" + "ext.ServiceId\"1\n\013ServiceList\022\"\n\010services" + "\030\001 \003(\0132\020.context.Service\"\225\001\n\rServiceFilt" + "er\022+\n\013service_ids\030\001 \001(\0132\026.context.Servic" + "eIdList\022\034\n\024include_endpoint_ids\030\002 \001(\010\022\033\n" + "\023include_constraints\030\003 \001(\010\022\034\n\024include_co" + "nfig_rules\030\004 \001(\010\"U\n\014ServiceEvent\022\035\n\005even" + "t\030\001 \001(\0132\016.context.Event\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\"T\n\007SliceId\022&\n\nco" + "ntext_id\030\001 \001(\0132\022.context.ContextId\022!\n\nsl" + "ice_uuid\030\002 \001(\0132\r.context.Uuid\"\240\003\n\005Slice\022" + "\"\n\010slice_id\030\001 \001(\0132\020.context.SliceId\022\014\n\004n" + "ame\030\002 \001(\t\022/\n\022slice_endpoint_ids\030\003 \003(\0132\023." + "context.EndPointId\022.\n\021slice_constraints\030" + "\004 \003(\0132\023.context.Constraint\022-\n\021slice_serv" + "ice_ids\030\005 \003(\0132\022.context.ServiceId\022,\n\022sli" + "ce_subslice_ids\030\006 \003(\0132\020.context.SliceId\022" + "*\n\014slice_status\030\007 \001(\0132\024.context.SliceSta" + "tus\022*\n\014slice_config\030\010 \001(\0132\024.context.Slic" + "eConfig\022(\n\013slice_owner\030\t \001(\0132\023.context.S" + "liceOwner\022%\n\ttimestamp\030\n \001(\0132\022.context.T" + "imestamp\"E\n\nSliceOwner\022!\n\nowner_uuid\030\001 \001" + "(\0132\r.context.Uuid\022\024\n\014owner_string\030\002 \001(\t\"" + "=\n\013SliceStatus\022.\n\014slice_status\030\001 \001(\0162\030.c" + "ontext.SliceStatusEnum\"8\n\013SliceConfig\022)\n" + "\014config_rules\030\001 \003(\0132\023.context.ConfigRule" + "\"2\n\013SliceIdList\022#\n\tslice_ids\030\001 \003(\0132\020.con" + "text.SliceId\"+\n\tSliceList\022\036\n\006slices\030\001 \003(" + "\0132\016.context.Slice\"\312\001\n\013SliceFilter\022\'\n\tsli" + "ce_ids\030\001 \001(\0132\024.context.SliceIdList\022\034\n\024in" + "clude_endpoint_ids\030\002 \001(\010\022\033\n\023include_cons" + "traints\030\003 \001(\010\022\033\n\023include_service_ids\030\004 \001" + "(\010\022\034\n\024include_subslice_ids\030\005 \001(\010\022\034\n\024incl" + "ude_config_rules\030\006 \001(\010\"O\n\nSliceEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022\"\n\010slice_id\030" + "\002 \001(\0132\020.context.SliceId\"6\n\014ConnectionId\022" + "&\n\017connection_uuid\030\001 \001(\0132\r.context.Uuid\"" + "2\n\025ConnectionSettings_L0\022\031\n\021lsp_symbolic" + "_name\030\001 \001(\t\"\236\001\n\025ConnectionSettings_L2\022\027\n" + "\017src_mac_address\030\001 \001(\t\022\027\n\017dst_mac_addres" + "s\030\002 \001(\t\022\022\n\nether_type\030\003 \001(\r\022\017\n\007vlan_id\030\004" + " \001(\r\022\022\n\nmpls_label\030\005 \001(\r\022\032\n\022mpls_traffic" + "_class\030\006 \001(\r\"t\n\025ConnectionSettings_L3\022\026\n" + "\016src_ip_address\030\001 \001(\t\022\026\n\016dst_ip_address\030" + "\002 \001(\t\022\014\n\004dscp\030\003 \001(\r\022\020\n\010protocol\030\004 \001(\r\022\013\n" + "\003ttl\030\005 \001(\r\"[\n\025ConnectionSettings_L4\022\020\n\010s" + "rc_port\030\001 \001(\r\022\020\n\010dst_port\030\002 \001(\r\022\021\n\ttcp_f" + "lags\030\003 \001(\r\022\013\n\003ttl\030\004 \001(\r\"\304\001\n\022ConnectionSe" + "ttings\022*\n\002l0\030\001 \001(\0132\036.context.ConnectionS" + "ettings_L0\022*\n\002l2\030\002 \001(\0132\036.context.Connect" + "ionSettings_L2\022*\n\002l3\030\003 \001(\0132\036.context.Con" + "nectionSettings_L3\022*\n\002l4\030\004 \001(\0132\036.context" + ".ConnectionSettings_L4\"\363\001\n\nConnection\022,\n" + "\rconnection_id\030\001 \001(\0132\025.context.Connectio" + "nId\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\0223\n\026path_hops_endpoint_ids\030\003 \003(\0132\023.co" + "ntext.EndPointId\022+\n\017sub_service_ids\030\004 \003(" + "\0132\022.context.ServiceId\022-\n\010settings\030\005 \001(\0132" + "\033.context.ConnectionSettings\"A\n\020Connecti" + "onIdList\022-\n\016connection_ids\030\001 \003(\0132\025.conte" + "xt.ConnectionId\":\n\016ConnectionList\022(\n\013con" + "nections\030\001 \003(\0132\023.context.Connection\"^\n\017C" + "onnectionEvent\022\035\n\005event\030\001 \001(\0132\016.context." + "Event\022,\n\rconnection_id\030\002 \001(\0132\025.context.C" + "onnectionId\"\202\001\n\nEndPointId\022(\n\013topology_i" + "d\030\001 \001(\0132\023.context.TopologyId\022$\n\tdevice_i" + "d\030\002 \001(\0132\021.context.DeviceId\022$\n\rendpoint_u" + "uid\030\003 \001(\0132\r.context.Uuid\"\302\001\n\010EndPoint\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "\014\n\004name\030\002 \001(\t\022\025\n\rendpoint_type\030\003 \001(\t\0229\n\020" + "kpi_sample_types\030\004 \003(\0162\037.kpi_sample_type" + "s.KpiSampleType\022,\n\021endpoint_location\030\005 \001" + "(\0132\021.context.Location\"{\n\014EndPointName\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "\023\n\013device_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 " + "\001(\t\022\025\n\rendpoint_type\030\004 \001(\t\";\n\016EndPointId" + "List\022)\n\014endpoint_ids\030\001 \003(\0132\023.context.End" + "PointId\"A\n\020EndPointNameList\022-\n\016endpoint_" + "names\030\001 \003(\0132\025.context.EndPointName\"A\n\021Co" + "nfigRule_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n" + "\016resource_value\030\002 \001(\t\"]\n\016ConfigRule_ACL\022" + "(\n\013endpoint_id\030\001 \001(\0132\023.context.EndPointI" + "d\022!\n\010rule_set\030\002 \001(\0132\017.acl.AclRuleSet\"\234\001\n" + "\nConfigRule\022)\n\006action\030\001 \001(\0162\031.context.Co" + "nfigActionEnum\022,\n\006custom\030\002 \001(\0132\032.context" + ".ConfigRule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.cont" + "ext.ConfigRule_ACLH\000B\r\n\013config_rule\"F\n\021C" + "onstraint_Custom\022\027\n\017constraint_type\030\001 \001(" + "\t\022\030\n\020constraint_value\030\002 \001(\t\"E\n\023Constrain" + "t_Schedule\022\027\n\017start_timestamp\030\001 \001(\002\022\025\n\rd" + "uration_days\030\002 \001(\002\"3\n\014GPS_Position\022\020\n\010la" + "titude\030\001 \001(\002\022\021\n\tlongitude\030\002 \001(\002\"W\n\010Locat" + "ion\022\020\n\006region\030\001 \001(\tH\000\022-\n\014gps_position\030\002 " + "\001(\0132\025.context.GPS_PositionH\000B\n\n\010location" + "\"l\n\033Constraint_EndPointLocation\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022#\n\010loc" + "ation\030\002 \001(\0132\021.context.Location\"Y\n\033Constr" + "aint_EndPointPriority\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022\020\n\010priority\030\002 \001(" + "\r\"0\n\026Constraint_SLA_Latency\022\026\n\016e2e_laten" + "cy_ms\030\001 \001(\002\"0\n\027Constraint_SLA_Capacity\022\025" + "\n\rcapacity_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_" + "Availability\022\032\n\022num_disjoint_paths\030\001 \001(\r" + "\022\022\n\nall_active\030\002 \001(\010\022\024\n\014availability\030\003 \001" + "(\002\"V\n\036Constraint_SLA_Isolation_level\0224\n\017" + "isolation_level\030\001 \003(\0162\033.context.Isolatio" + "nLevelEnum\"\242\001\n\025Constraint_Exclusions\022\024\n\014" + "is_permanent\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021" + ".context.DeviceId\022)\n\014endpoint_ids\030\003 \003(\0132" + "\023.context.EndPointId\022!\n\010link_ids\030\004 \003(\0132\017" + ".context.LinkId\"\333\004\n\nConstraint\022-\n\006action" + "\030\001 \001(\0162\035.context.ConstraintActionEnum\022,\n" + "\006custom\030\002 \001(\0132\032.context.Constraint_Custo" + "mH\000\0220\n\010schedule\030\003 \001(\0132\034.context.Constrai" + "nt_ScheduleH\000\022A\n\021endpoint_location\030\004 \001(\013" + "2$.context.Constraint_EndPointLocationH\000" + "\022A\n\021endpoint_priority\030\005 \001(\0132$.context.Co" + "nstraint_EndPointPriorityH\000\0228\n\014sla_capac" + "ity\030\006 \001(\0132 .context.Constraint_SLA_Capac" + "ityH\000\0226\n\013sla_latency\030\007 \001(\0132\037.context.Con" + "straint_SLA_LatencyH\000\022@\n\020sla_availabilit" + "y\030\010 \001(\0132$.context.Constraint_SLA_Availab" + "ilityH\000\022@\n\rsla_isolation\030\t \001(\0132\'.context" + ".Constraint_SLA_Isolation_levelH\000\0224\n\nexc" + "lusions\030\n \001(\0132\036.context.Constraint_Exclu" + "sionsH\000B\014\n\nconstraint\"^\n\022TeraFlowControl" + "ler\022&\n\ncontext_id\030\001 \001(\0132\022.context.Contex" + "tId\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n" + "\024AuthenticationResult\022&\n\ncontext_id\030\001 \001(" + "\0132\022.context.ContextId\022\025\n\rauthenticated\030\002" + " \001(\010*j\n\rEventTypeEnum\022\027\n\023EVENTTYPE_UNDEF" + "INED\020\000\022\024\n\020EVENTTYPE_CREATE\020\001\022\024\n\020EVENTTYP" + "E_UPDATE\020\002\022\024\n\020EVENTTYPE_REMOVE\020\003*\321\002\n\020Dev" + "iceDriverEnum\022\032\n\026DEVICEDRIVER_UNDEFINED\020" + "\000\022\033\n\027DEVICEDRIVER_OPENCONFIG\020\001\022\036\n\032DEVICE" + "DRIVER_TRANSPORT_API\020\002\022\023\n\017DEVICEDRIVER_P" + "4\020\003\022&\n\"DEVICEDRIVER_IETF_NETWORK_TOPOLOG" + "Y\020\004\022\033\n\027DEVICEDRIVER_ONF_TR_532\020\005\022\023\n\017DEVI" + "CEDRIVER_XR\020\006\022\033\n\027DEVICEDRIVER_IETF_L2VPN" + "\020\007\022 \n\034DEVICEDRIVER_GNMI_OPENCONFIG\020\010\022\032\n\026" + "DEVICEDRIVER_FLEXSCALE\020\t\022\032\n\026DEVICEDRIVER" + "_IETF_ACTN\020\n*\217\001\n\033DeviceOperationalStatus" + "Enum\022%\n!DEVICEOPERATIONALSTATUS_UNDEFINE" + "D\020\000\022$\n DEVICEOPERATIONALSTATUS_DISABLED\020" + "\001\022#\n\037DEVICEOPERATIONALSTATUS_ENABLED\020\002*\252" + "\001\n\017ServiceTypeEnum\022\027\n\023SERVICETYPE_UNKNOW" + "N\020\000\022\024\n\020SERVICETYPE_L3NM\020\001\022\024\n\020SERVICETYPE" + "_L2NM\020\002\022)\n%SERVICETYPE_TAPI_CONNECTIVITY" + "_SERVICE\020\003\022\022\n\016SERVICETYPE_TE\020\004\022\023\n\017SERVIC" + "ETYPE_E2E\020\005*\304\001\n\021ServiceStatusEnum\022\033\n\027SER" + "VICESTATUS_UNDEFINED\020\000\022\031\n\025SERVICESTATUS_" + "PLANNED\020\001\022\030\n\024SERVICESTATUS_ACTIVE\020\002\022\032\n\026S" + "ERVICESTATUS_UPDATING\020\003\022!\n\035SERVICESTATUS" + "_PENDING_REMOVAL\020\004\022\036\n\032SERVICESTATUS_SLA_" + "VIOLATED\020\005*\251\001\n\017SliceStatusEnum\022\031\n\025SLICES" + "TATUS_UNDEFINED\020\000\022\027\n\023SLICESTATUS_PLANNED" + "\020\001\022\024\n\020SLICESTATUS_INIT\020\002\022\026\n\022SLICESTATUS_" + "ACTIVE\020\003\022\026\n\022SLICESTATUS_DEINIT\020\004\022\034\n\030SLIC" + "ESTATUS_SLA_VIOLATED\020\005*]\n\020ConfigActionEn" + "um\022\032\n\026CONFIGACTION_UNDEFINED\020\000\022\024\n\020CONFIG" + "ACTION_SET\020\001\022\027\n\023CONFIGACTION_DELETE\020\002*m\n" + "\024ConstraintActionEnum\022\036\n\032CONSTRAINTACTIO" + "N_UNDEFINED\020\000\022\030\n\024CONSTRAINTACTION_SET\020\001\022" + "\033\n\027CONSTRAINTACTION_DELETE\020\002*\203\002\n\022Isolati" + "onLevelEnum\022\020\n\014NO_ISOLATION\020\000\022\026\n\022PHYSICA" + "L_ISOLATION\020\001\022\025\n\021LOGICAL_ISOLATION\020\002\022\025\n\021" + "PROCESS_ISOLATION\020\003\022\035\n\031PHYSICAL_MEMORY_I" + "SOLATION\020\004\022\036\n\032PHYSICAL_NETWORK_ISOLATION" + "\020\005\022\036\n\032VIRTUAL_RESOURCE_ISOLATION\020\006\022\037\n\033NE" + "TWORK_FUNCTIONS_ISOLATION\020\007\022\025\n\021SERVICE_I" + "SOLATION\020\0102\245\026\n\016ContextService\022:\n\016ListCon" + "textIds\022\016.context.Empty\032\026.context.Contex" + "tIdList\"\000\0226\n\014ListContexts\022\016.context.Empt" + "y\032\024.context.ContextList\"\000\0224\n\nGetContext\022" + "\022.context.ContextId\032\020.context.Context\"\000\022" + "4\n\nSetContext\022\020.context.Context\032\022.contex" + "t.ContextId\"\000\0225\n\rRemoveContext\022\022.context" + ".ContextId\032\016.context.Empty\"\000\022=\n\020GetConte" + "xtEvents\022\016.context.Empty\032\025.context.Conte" + "xtEvent\"\0000\001\022@\n\017ListTopologyIds\022\022.context" + ".ContextId\032\027.context.TopologyIdList\"\000\022=\n" + "\016ListTopologies\022\022.context.ContextId\032\025.co" + "ntext.TopologyList\"\000\0227\n\013GetTopology\022\023.co" + "ntext.TopologyId\032\021.context.Topology\"\000\022E\n" + "\022GetTopologyDetails\022\023.context.TopologyId" + "\032\030.context.TopologyDetails\"\000\0227\n\013SetTopol" + "ogy\022\021.context.Topology\032\023.context.Topolog" + "yId\"\000\0227\n\016RemoveTopology\022\023.context.Topolo" + "gyId\032\016.context.Empty\"\000\022?\n\021GetTopologyEve" + "nts\022\016.context.Empty\032\026.context.TopologyEv" + "ent\"\0000\001\0228\n\rListDeviceIds\022\016.context.Empty" + "\032\025.context.DeviceIdList\"\000\0224\n\013ListDevices" + "\022\016.context.Empty\032\023.context.DeviceList\"\000\022" + "1\n\tGetDevice\022\021.context.DeviceId\032\017.contex" + "t.Device\"\000\0221\n\tSetDevice\022\017.context.Device" + "\032\021.context.DeviceId\"\000\0223\n\014RemoveDevice\022\021." + "context.DeviceId\032\016.context.Empty\"\000\022;\n\017Ge" + "tDeviceEvents\022\016.context.Empty\032\024.context." + "DeviceEvent\"\0000\001\022<\n\014SelectDevice\022\025.contex" + "t.DeviceFilter\032\023.context.DeviceList\"\000\022I\n" + "\021ListEndPointNames\022\027.context.EndPointIdL" + "ist\032\031.context.EndPointNameList\"\000\0224\n\013List" + "LinkIds\022\016.context.Empty\032\023.context.LinkId" + "List\"\000\0220\n\tListLinks\022\016.context.Empty\032\021.co" + "ntext.LinkList\"\000\022+\n\007GetLink\022\017.context.Li" + "nkId\032\r.context.Link\"\000\022+\n\007SetLink\022\r.conte" + "xt.Link\032\017.context.LinkId\"\000\022/\n\nRemoveLink" + "\022\017.context.LinkId\032\016.context.Empty\"\000\0227\n\rG" + "etLinkEvents\022\016.context.Empty\032\022.context.L" + "inkEvent\"\0000\001\022>\n\016ListServiceIds\022\022.context" + ".ContextId\032\026.context.ServiceIdList\"\000\022:\n\014" + "ListServices\022\022.context.ContextId\032\024.conte" + "xt.ServiceList\"\000\0224\n\nGetService\022\022.context" + ".ServiceId\032\020.context.Service\"\000\0224\n\nSetSer" + "vice\022\020.context.Service\032\022.context.Service" + "Id\"\000\0226\n\014UnsetService\022\020.context.Service\032\022" + ".context.ServiceId\"\000\0225\n\rRemoveService\022\022." + "context.ServiceId\032\016.context.Empty\"\000\022=\n\020G" + "etServiceEvents\022\016.context.Empty\032\025.contex" + "t.ServiceEvent\"\0000\001\022?\n\rSelectService\022\026.co" + "ntext.ServiceFilter\032\024.context.ServiceLis" + "t\"\000\022:\n\014ListSliceIds\022\022.context.ContextId\032" + "\024.context.SliceIdList\"\000\0226\n\nListSlices\022\022." + "context.ContextId\032\022.context.SliceList\"\000\022" + ".\n\010GetSlice\022\020.context.SliceId\032\016.context." + "Slice\"\000\022.\n\010SetSlice\022\016.context.Slice\032\020.co" + "ntext.SliceId\"\000\0220\n\nUnsetSlice\022\016.context." + "Slice\032\020.context.SliceId\"\000\0221\n\013RemoveSlice" + "\022\020.context.SliceId\032\016.context.Empty\"\000\0229\n\016" + "GetSliceEvents\022\016.context.Empty\032\023.context" + ".SliceEvent\"\0000\001\0229\n\013SelectSlice\022\024.context" + ".SliceFilter\032\022.context.SliceList\"\000\022D\n\021Li" + "stConnectionIds\022\022.context.ServiceId\032\031.co" + "ntext.ConnectionIdList\"\000\022@\n\017ListConnecti" + "ons\022\022.context.ServiceId\032\027.context.Connec" + "tionList\"\000\022=\n\rGetConnection\022\025.context.Co" + "nnectionId\032\023.context.Connection\"\000\022=\n\rSet" + "Connection\022\023.context.Connection\032\025.contex" + "t.ConnectionId\"\000\022;\n\020RemoveConnection\022\025.c" + "ontext.ConnectionId\032\016.context.Empty\"\000\022C\n" + "\023GetConnectionEvents\022\016.context.Empty\032\030.c" + "ontext.ConnectionEvent\"\0000\001b\006proto3" }; + java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\tacl.proto\032\026kpi" + "_sample_types.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004" + "uuid\030\001 \001(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001" + "(\001\"Z\n\005Event\022%\n\ttimestamp\030\001 \001(\0132\022.context" + ".Timestamp\022*\n\nevent_type\030\002 \001(\0162\026.context" + ".EventTypeEnum\"0\n\tContextId\022#\n\014context_u" + "uid\030\001 \001(\0132\r.context.Uuid\"\351\001\n\007Context\022&\n\n" + "context_id\030\001 \001(\0132\022.context.ContextId\022\014\n\004" + "name\030\002 \001(\t\022)\n\014topology_ids\030\003 \003(\0132\023.conte" + "xt.TopologyId\022\'\n\013service_ids\030\004 \003(\0132\022.con" + "text.ServiceId\022#\n\tslice_ids\030\005 \003(\0132\020.cont" + "ext.SliceId\022/\n\ncontroller\030\006 \001(\0132\033.contex" + "t.TeraFlowController\"8\n\rContextIdList\022\'\n" + "\013context_ids\030\001 \003(\0132\022.context.ContextId\"1" + "\n\013ContextList\022\"\n\010contexts\030\001 \003(\0132\020.contex" + "t.Context\"U\n\014ContextEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022&\n\ncontext_id\030\002 \001(\0132\022.c" + "ontext.ContextId\"Z\n\nTopologyId\022&\n\ncontex" + "t_id\030\001 \001(\0132\022.context.ContextId\022$\n\rtopolo" + "gy_uuid\030\002 \001(\0132\r.context.Uuid\"\214\001\n\010Topolog" + "y\022(\n\013topology_id\030\001 \001(\0132\023.context.Topolog" + "yId\022\014\n\004name\030\002 \001(\t\022%\n\ndevice_ids\030\003 \003(\0132\021." + "context.DeviceId\022!\n\010link_ids\030\004 \003(\0132\017.con" + "text.LinkId\"\211\001\n\017TopologyDetails\022(\n\013topol" + "ogy_id\030\001 \001(\0132\023.context.TopologyId\022\014\n\004nam" + "e\030\002 \001(\t\022 \n\007devices\030\003 \003(\0132\017.context.Devic" + "e\022\034\n\005links\030\004 \003(\0132\r.context.Link\";\n\016Topol" + "ogyIdList\022)\n\014topology_ids\030\001 \003(\0132\023.contex" + "t.TopologyId\"5\n\014TopologyList\022%\n\ntopologi" + "es\030\001 \003(\0132\021.context.Topology\"X\n\rTopologyE" + "vent\022\035\n\005event\030\001 \001(\0132\016.context.Event\022(\n\013t" + "opology_id\030\002 \001(\0132\023.context.TopologyId\".\n" + "\010DeviceId\022\"\n\013device_uuid\030\001 \001(\0132\r.context" + ".Uuid\"\372\002\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.co" + "ntext.DeviceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_t" + "ype\030\003 \001(\t\022,\n\rdevice_config\030\004 \001(\0132\025.conte" + "xt.DeviceConfig\022G\n\031device_operational_st" + "atus\030\005 \001(\0162$.context.DeviceOperationalSt" + "atusEnum\0221\n\016device_drivers\030\006 \003(\0162\031.conte" + "xt.DeviceDriverEnum\022+\n\020device_endpoints\030" + "\007 \003(\0132\021.context.EndPoint\022&\n\ncomponents\030\010" + " \003(\0132\022.context.Component\022(\n\rcontroller_i" + "d\030\t \001(\0132\021.context.DeviceId\"\311\001\n\tComponent" + "\022%\n\016component_uuid\030\001 \001(\0132\r.context.Uuid\022" + "\014\n\004name\030\002 \001(\t\022\014\n\004type\030\003 \001(\t\0226\n\nattribute" + "s\030\004 \003(\0132\".context.Component.AttributesEn" + "try\022\016\n\006parent\030\005 \001(\t\0321\n\017AttributesEntry\022\013" + "\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"9\n\014Device" + "Config\022)\n\014config_rules\030\001 \003(\0132\023.context.C" + "onfigRule\"5\n\014DeviceIdList\022%\n\ndevice_ids\030" + "\001 \003(\0132\021.context.DeviceId\".\n\nDeviceList\022 " + "\n\007devices\030\001 \003(\0132\017.context.Device\"\216\001\n\014Dev" + "iceFilter\022)\n\ndevice_ids\030\001 \001(\0132\025.context." + "DeviceIdList\022\031\n\021include_endpoints\030\002 \001(\010\022" + "\034\n\024include_config_rules\030\003 \001(\010\022\032\n\022include" + "_components\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005eve" + "nt\030\001 \001(\0132\016.context.Event\022$\n\tdevice_id\030\002 " + "\001(\0132\021.context.DeviceId\022,\n\rdevice_config\030" + "\003 \001(\0132\025.context.DeviceConfig\"*\n\006LinkId\022 " + "\n\tlink_uuid\030\001 \001(\0132\r.context.Uuid\"I\n\016Link" + "Attributes\022\033\n\023total_capacity_gbps\030\001 \001(\002\022" + "\032\n\022used_capacity_gbps\030\002 \001(\002\"\223\001\n\004Link\022 \n\007" + "link_id\030\001 \001(\0132\017.context.LinkId\022\014\n\004name\030\002" + " \001(\t\022.\n\021link_endpoint_ids\030\003 \003(\0132\023.contex" + "t.EndPointId\022+\n\nattributes\030\004 \001(\0132\027.conte" + "xt.LinkAttributes\"/\n\nLinkIdList\022!\n\010link_" + "ids\030\001 \003(\0132\017.context.LinkId\"(\n\010LinkList\022\034" + "\n\005links\030\001 \003(\0132\r.context.Link\"L\n\tLinkEven" + "t\022\035\n\005event\030\001 \001(\0132\016.context.Event\022 \n\007link" + "_id\030\002 \001(\0132\017.context.LinkId\"X\n\tServiceId\022" + "&\n\ncontext_id\030\001 \001(\0132\022.context.ContextId\022" + "#\n\014service_uuid\030\002 \001(\0132\r.context.Uuid\"\333\002\n" + "\007Service\022&\n\nservice_id\030\001 \001(\0132\022.context.S" + "erviceId\022\014\n\004name\030\002 \001(\t\022.\n\014service_type\030\003" + " \001(\0162\030.context.ServiceTypeEnum\0221\n\024servic" + "e_endpoint_ids\030\004 \003(\0132\023.context.EndPointI" + "d\0220\n\023service_constraints\030\005 \003(\0132\023.context" + ".Constraint\022.\n\016service_status\030\006 \001(\0132\026.co" + "ntext.ServiceStatus\022.\n\016service_config\030\007 " + "\001(\0132\026.context.ServiceConfig\022%\n\ttimestamp" + "\030\010 \001(\0132\022.context.Timestamp\"C\n\rServiceSta" + "tus\0222\n\016service_status\030\001 \001(\0162\032.context.Se" + "rviceStatusEnum\":\n\rServiceConfig\022)\n\014conf" + "ig_rules\030\001 \003(\0132\023.context.ConfigRule\"8\n\rS" + "erviceIdList\022\'\n\013service_ids\030\001 \003(\0132\022.cont" + "ext.ServiceId\"1\n\013ServiceList\022\"\n\010services" + "\030\001 \003(\0132\020.context.Service\"\225\001\n\rServiceFilt" + "er\022+\n\013service_ids\030\001 \001(\0132\026.context.Servic" + "eIdList\022\034\n\024include_endpoint_ids\030\002 \001(\010\022\033\n" + "\023include_constraints\030\003 \001(\010\022\034\n\024include_co" + "nfig_rules\030\004 \001(\010\"U\n\014ServiceEvent\022\035\n\005even" + "t\030\001 \001(\0132\016.context.Event\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\"T\n\007SliceId\022&\n\nco" + "ntext_id\030\001 \001(\0132\022.context.ContextId\022!\n\nsl" + "ice_uuid\030\002 \001(\0132\r.context.Uuid\"\240\003\n\005Slice\022" + "\"\n\010slice_id\030\001 \001(\0132\020.context.SliceId\022\014\n\004n" + "ame\030\002 \001(\t\022/\n\022slice_endpoint_ids\030\003 \003(\0132\023." + "context.EndPointId\022.\n\021slice_constraints\030" + "\004 \003(\0132\023.context.Constraint\022-\n\021slice_serv" + "ice_ids\030\005 \003(\0132\022.context.ServiceId\022,\n\022sli" + "ce_subslice_ids\030\006 \003(\0132\020.context.SliceId\022" + "*\n\014slice_status\030\007 \001(\0132\024.context.SliceSta" + "tus\022*\n\014slice_config\030\010 \001(\0132\024.context.Slic" + "eConfig\022(\n\013slice_owner\030\t \001(\0132\023.context.S" + "liceOwner\022%\n\ttimestamp\030\n \001(\0132\022.context.T" + "imestamp\"E\n\nSliceOwner\022!\n\nowner_uuid\030\001 \001" + "(\0132\r.context.Uuid\022\024\n\014owner_string\030\002 \001(\t\"" + "=\n\013SliceStatus\022.\n\014slice_status\030\001 \001(\0162\030.c" + "ontext.SliceStatusEnum\"8\n\013SliceConfig\022)\n" + "\014config_rules\030\001 \003(\0132\023.context.ConfigRule" + "\"2\n\013SliceIdList\022#\n\tslice_ids\030\001 \003(\0132\020.con" + "text.SliceId\"+\n\tSliceList\022\036\n\006slices\030\001 \003(" + "\0132\016.context.Slice\"\312\001\n\013SliceFilter\022\'\n\tsli" + "ce_ids\030\001 \001(\0132\024.context.SliceIdList\022\034\n\024in" + "clude_endpoint_ids\030\002 \001(\010\022\033\n\023include_cons" + "traints\030\003 \001(\010\022\033\n\023include_service_ids\030\004 \001" + "(\010\022\034\n\024include_subslice_ids\030\005 \001(\010\022\034\n\024incl" + "ude_config_rules\030\006 \001(\010\"O\n\nSliceEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022\"\n\010slice_id\030" + "\002 \001(\0132\020.context.SliceId\"6\n\014ConnectionId\022" + "&\n\017connection_uuid\030\001 \001(\0132\r.context.Uuid\"" + "2\n\025ConnectionSettings_L0\022\031\n\021lsp_symbolic" + "_name\030\001 \001(\t\"\236\001\n\025ConnectionSettings_L2\022\027\n" + "\017src_mac_address\030\001 \001(\t\022\027\n\017dst_mac_addres" + "s\030\002 \001(\t\022\022\n\nether_type\030\003 \001(\r\022\017\n\007vlan_id\030\004" + " \001(\r\022\022\n\nmpls_label\030\005 \001(\r\022\032\n\022mpls_traffic" + "_class\030\006 \001(\r\"t\n\025ConnectionSettings_L3\022\026\n" + "\016src_ip_address\030\001 \001(\t\022\026\n\016dst_ip_address\030" + "\002 \001(\t\022\014\n\004dscp\030\003 \001(\r\022\020\n\010protocol\030\004 \001(\r\022\013\n" + "\003ttl\030\005 \001(\r\"[\n\025ConnectionSettings_L4\022\020\n\010s" + "rc_port\030\001 \001(\r\022\020\n\010dst_port\030\002 \001(\r\022\021\n\ttcp_f" + "lags\030\003 \001(\r\022\013\n\003ttl\030\004 \001(\r\"\304\001\n\022ConnectionSe" + "ttings\022*\n\002l0\030\001 \001(\0132\036.context.ConnectionS" + "ettings_L0\022*\n\002l2\030\002 \001(\0132\036.context.Connect" + "ionSettings_L2\022*\n\002l3\030\003 \001(\0132\036.context.Con" + "nectionSettings_L3\022*\n\002l4\030\004 \001(\0132\036.context" + ".ConnectionSettings_L4\"\363\001\n\nConnection\022,\n" + "\rconnection_id\030\001 \001(\0132\025.context.Connectio" + "nId\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\0223\n\026path_hops_endpoint_ids\030\003 \003(\0132\023.co" + "ntext.EndPointId\022+\n\017sub_service_ids\030\004 \003(" + "\0132\022.context.ServiceId\022-\n\010settings\030\005 \001(\0132" + "\033.context.ConnectionSettings\"A\n\020Connecti" + "onIdList\022-\n\016connection_ids\030\001 \003(\0132\025.conte" + "xt.ConnectionId\":\n\016ConnectionList\022(\n\013con" + "nections\030\001 \003(\0132\023.context.Connection\"^\n\017C" + "onnectionEvent\022\035\n\005event\030\001 \001(\0132\016.context." + "Event\022,\n\rconnection_id\030\002 \001(\0132\025.context.C" + "onnectionId\"\202\001\n\nEndPointId\022(\n\013topology_i" + "d\030\001 \001(\0132\023.context.TopologyId\022$\n\tdevice_i" + "d\030\002 \001(\0132\021.context.DeviceId\022$\n\rendpoint_u" + "uid\030\003 \001(\0132\r.context.Uuid\"\302\001\n\010EndPoint\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "\014\n\004name\030\002 \001(\t\022\025\n\rendpoint_type\030\003 \001(\t\0229\n\020" + "kpi_sample_types\030\004 \003(\0162\037.kpi_sample_type" + "s.KpiSampleType\022,\n\021endpoint_location\030\005 \001" + "(\0132\021.context.Location\"{\n\014EndPointName\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "\023\n\013device_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 " + "\001(\t\022\025\n\rendpoint_type\030\004 \001(\t\";\n\016EndPointId" + "List\022)\n\014endpoint_ids\030\001 \003(\0132\023.context.End" + "PointId\"A\n\020EndPointNameList\022-\n\016endpoint_" + "names\030\001 \003(\0132\025.context.EndPointName\"A\n\021Co" + "nfigRule_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n" + "\016resource_value\030\002 \001(\t\"]\n\016ConfigRule_ACL\022" + "(\n\013endpoint_id\030\001 \001(\0132\023.context.EndPointI" + "d\022!\n\010rule_set\030\002 \001(\0132\017.acl.AclRuleSet\"\234\001\n" + "\nConfigRule\022)\n\006action\030\001 \001(\0162\031.context.Co" + "nfigActionEnum\022,\n\006custom\030\002 \001(\0132\032.context" + ".ConfigRule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.cont" + "ext.ConfigRule_ACLH\000B\r\n\013config_rule\"F\n\021C" + "onstraint_Custom\022\027\n\017constraint_type\030\001 \001(" + "\t\022\030\n\020constraint_value\030\002 \001(\t\"E\n\023Constrain" + "t_Schedule\022\027\n\017start_timestamp\030\001 \001(\002\022\025\n\rd" + "uration_days\030\002 \001(\002\"3\n\014GPS_Position\022\020\n\010la" + "titude\030\001 \001(\002\022\021\n\tlongitude\030\002 \001(\002\"W\n\010Locat" + "ion\022\020\n\006region\030\001 \001(\tH\000\022-\n\014gps_position\030\002 " + "\001(\0132\025.context.GPS_PositionH\000B\n\n\010location" + "\"l\n\033Constraint_EndPointLocation\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022#\n\010loc" + "ation\030\002 \001(\0132\021.context.Location\"Y\n\033Constr" + "aint_EndPointPriority\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022\020\n\010priority\030\002 \001(" + "\r\"0\n\026Constraint_SLA_Latency\022\026\n\016e2e_laten" + "cy_ms\030\001 \001(\002\"0\n\027Constraint_SLA_Capacity\022\025" + "\n\rcapacity_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_" + "Availability\022\032\n\022num_disjoint_paths\030\001 \001(\r" + "\022\022\n\nall_active\030\002 \001(\010\022\024\n\014availability\030\003 \001" + "(\002\"V\n\036Constraint_SLA_Isolation_level\0224\n\017" + "isolation_level\030\001 \003(\0162\033.context.Isolatio" + "nLevelEnum\"\242\001\n\025Constraint_Exclusions\022\024\n\014" + "is_permanent\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021" + ".context.DeviceId\022)\n\014endpoint_ids\030\003 \003(\0132" + "\023.context.EndPointId\022!\n\010link_ids\030\004 \003(\0132\017" + ".context.LinkId\"\333\004\n\nConstraint\022-\n\006action" + "\030\001 \001(\0162\035.context.ConstraintActionEnum\022,\n" + "\006custom\030\002 \001(\0132\032.context.Constraint_Custo" + "mH\000\0220\n\010schedule\030\003 \001(\0132\034.context.Constrai" + "nt_ScheduleH\000\022A\n\021endpoint_location\030\004 \001(\013" + "2$.context.Constraint_EndPointLocationH\000" + "\022A\n\021endpoint_priority\030\005 \001(\0132$.context.Co" + "nstraint_EndPointPriorityH\000\0228\n\014sla_capac" + "ity\030\006 \001(\0132 .context.Constraint_SLA_Capac" + "ityH\000\0226\n\013sla_latency\030\007 \001(\0132\037.context.Con" + "straint_SLA_LatencyH\000\022@\n\020sla_availabilit" + "y\030\010 \001(\0132$.context.Constraint_SLA_Availab" + "ilityH\000\022@\n\rsla_isolation\030\t \001(\0132\'.context" + ".Constraint_SLA_Isolation_levelH\000\0224\n\nexc" + "lusions\030\n \001(\0132\036.context.Constraint_Exclu" + "sionsH\000B\014\n\nconstraint\"^\n\022TeraFlowControl" + "ler\022&\n\ncontext_id\030\001 \001(\0132\022.context.Contex" + "tId\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n" + "\024AuthenticationResult\022&\n\ncontext_id\030\001 \001(" + "\0132\022.context.ContextId\022\025\n\rauthenticated\030\002" + " \001(\010\"-\n\017OpticalConfigId\022\032\n\022opticalconfig" + "_uuid\030\001 \001(\t\"S\n\rOpticalConfig\0222\n\020opticalc" + "onfig_id\030\001 \001(\0132\030.context.OpticalConfigId" + "\022\016\n\006config\030\002 \001(\t\"C\n\021OpticalConfigList\022.\n" + "\016opticalconfigs\030\001 \003(\0132\026.context.OpticalC" + "onfig\"9\n\rOpticalLinkId\022(\n\021optical_link_u" + "uid\030\001 \001(\0132\r.context.Uuid\",\n\007FiberId\022!\n\nf" + "iber_uuid\030\001 \001(\0132\r.context.Uuid\"\341\001\n\005Fiber" + "\022\n\n\002ID\030\n \001(\t\022\020\n\010src_port\030\001 \001(\t\022\020\n\010dst_po" + "rt\030\002 \001(\t\022\027\n\017local_peer_port\030\003 \001(\t\022\030\n\020rem" + "ote_peer_port\030\004 \001(\t\022\017\n\007c_slots\030\005 \003(\005\022\017\n\007" + "l_slots\030\006 \003(\005\022\017\n\007s_slots\030\007 \003(\005\022\016\n\006length" + "\030\010 \001(\002\022\014\n\004used\030\t \001(\010\022$\n\nfiber_uuid\030\013 \001(\013" + "2\020.context.FiberId\"d\n\022OpticalLinkDetails" + "\022\016\n\006length\030\001 \001(\002\022\016\n\006source\030\002 \001(\t\022\016\n\006targ" + "et\030\003 \001(\t\022\036\n\006fibers\030\004 \003(\0132\016.context.Fiber" + "\"|\n\013OpticalLink\022\014\n\004name\030\001 \001(\t\022,\n\007details" + "\030\002 \001(\0132\033.context.OpticalLinkDetails\0221\n\021o" + "ptical_link_uuid\030\003 \001(\0132\026.context.Optical" + "LinkId*j\n\rEventTypeEnum\022\027\n\023EVENTTYPE_UND" + "EFINED\020\000\022\024\n\020EVENTTYPE_CREATE\020\001\022\024\n\020EVENTT" + "YPE_UPDATE\020\002\022\024\n\020EVENTTYPE_REMOVE\020\003*\346\002\n\020D" + "eviceDriverEnum\022\032\n\026DEVICEDRIVER_UNDEFINE" + "D\020\000\022\033\n\027DEVICEDRIVER_OPENCONFIG\020\001\022\036\n\032DEVI" + "CEDRIVER_TRANSPORT_API\020\002\022\023\n\017DEVICEDRIVER" + "_P4\020\003\022&\n\"DEVICEDRIVER_IETF_NETWORK_TOPOL" + "OGY\020\004\022\033\n\027DEVICEDRIVER_ONF_TR_532\020\005\022\023\n\017DE" + "VICEDRIVER_XR\020\006\022\033\n\027DEVICEDRIVER_IETF_L2V" + "PN\020\007\022 \n\034DEVICEDRIVER_GNMI_OPENCONFIG\020\010\022\032" + "\n\026DEVICEDRIVER_FLEXSCALE\020\t\022\032\n\026DEVICEDRIV" + "ER_IETF_ACTN\020\n\022\023\n\017DEVICEDRIVER_OC\020\013*\217\001\n\033" + "DeviceOperationalStatusEnum\022%\n!DEVICEOPE" + "RATIONALSTATUS_UNDEFINED\020\000\022$\n DEVICEOPER" + "ATIONALSTATUS_DISABLED\020\001\022#\n\037DEVICEOPERAT" + "IONALSTATUS_ENABLED\020\002*\320\001\n\017ServiceTypeEnu" + "m\022\027\n\023SERVICETYPE_UNKNOWN\020\000\022\024\n\020SERVICETYP" + "E_L3NM\020\001\022\024\n\020SERVICETYPE_L2NM\020\002\022)\n%SERVIC" + "ETYPE_TAPI_CONNECTIVITY_SERVICE\020\003\022\022\n\016SER" + "VICETYPE_TE\020\004\022\023\n\017SERVICETYPE_E2E\020\005\022$\n SE" + "RVICETYPE_OPTICAL_CONNECTIVITY\020\006*\304\001\n\021Ser" + "viceStatusEnum\022\033\n\027SERVICESTATUS_UNDEFINE" + "D\020\000\022\031\n\025SERVICESTATUS_PLANNED\020\001\022\030\n\024SERVIC" + "ESTATUS_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UPDATI" + "NG\020\003\022!\n\035SERVICESTATUS_PENDING_REMOVAL\020\004\022" + "\036\n\032SERVICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017Slic" + "eStatusEnum\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027" + "\n\023SLICESTATUS_PLANNED\020\001\022\024\n\020SLICESTATUS_I" + "NIT\020\002\022\026\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLICEST" + "ATUS_DEINIT\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATE" + "D\020\005*]\n\020ConfigActionEnum\022\032\n\026CONFIGACTION_" + "UNDEFINED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CON" + "FIGACTION_DELETE\020\002*m\n\024ConstraintActionEn" + "um\022\036\n\032CONSTRAINTACTION_UNDEFINED\020\000\022\030\n\024CO" + "NSTRAINTACTION_SET\020\001\022\033\n\027CONSTRAINTACTION" + "_DELETE\020\002*\203\002\n\022IsolationLevelEnum\022\020\n\014NO_I" + "SOLATION\020\000\022\026\n\022PHYSICAL_ISOLATION\020\001\022\025\n\021LO" + "GICAL_ISOLATION\020\002\022\025\n\021PROCESS_ISOLATION\020\003" + "\022\035\n\031PHYSICAL_MEMORY_ISOLATION\020\004\022\036\n\032PHYSI" + "CAL_NETWORK_ISOLATION\020\005\022\036\n\032VIRTUAL_RESOU" + "RCE_ISOLATION\020\006\022\037\n\033NETWORK_FUNCTIONS_ISO" + "LATION\020\007\022\025\n\021SERVICE_ISOLATION\020\0102\246\031\n\016Cont" + "extService\022:\n\016ListContextIds\022\016.context.E" + "mpty\032\026.context.ContextIdList\"\000\0226\n\014ListCo" + "ntexts\022\016.context.Empty\032\024.context.Context" + "List\"\000\0224\n\nGetContext\022\022.context.ContextId" + "\032\020.context.Context\"\000\0224\n\nSetContext\022\020.con" + "text.Context\032\022.context.ContextId\"\000\0225\n\rRe" + "moveContext\022\022.context.ContextId\032\016.contex" + "t.Empty\"\000\022=\n\020GetContextEvents\022\016.context." + "Empty\032\025.context.ContextEvent\"\0000\001\022@\n\017List" + "TopologyIds\022\022.context.ContextId\032\027.contex" + "t.TopologyIdList\"\000\022=\n\016ListTopologies\022\022.c" + "ontext.ContextId\032\025.context.TopologyList\"" + "\000\0227\n\013GetTopology\022\023.context.TopologyId\032\021." + "context.Topology\"\000\022E\n\022GetTopologyDetails" + "\022\023.context.TopologyId\032\030.context.Topology" + "Details\"\000\0227\n\013SetTopology\022\021.context.Topol" + "ogy\032\023.context.TopologyId\"\000\0227\n\016RemoveTopo" + "logy\022\023.context.TopologyId\032\016.context.Empt" + "y\"\000\022?\n\021GetTopologyEvents\022\016.context.Empty" + "\032\026.context.TopologyEvent\"\0000\001\0228\n\rListDevi" + "ceIds\022\016.context.Empty\032\025.context.DeviceId" + "List\"\000\0224\n\013ListDevices\022\016.context.Empty\032\023." + "context.DeviceList\"\000\0221\n\tGetDevice\022\021.cont" + "ext.DeviceId\032\017.context.Device\"\000\0221\n\tSetDe" + "vice\022\017.context.Device\032\021.context.DeviceId" + "\"\000\0223\n\014RemoveDevice\022\021.context.DeviceId\032\016." + "context.Empty\"\000\022;\n\017GetDeviceEvents\022\016.con" + "text.Empty\032\024.context.DeviceEvent\"\0000\001\022<\n\014" + "SelectDevice\022\025.context.DeviceFilter\032\023.co" + "ntext.DeviceList\"\000\022I\n\021ListEndPointNames\022" + "\027.context.EndPointIdList\032\031.context.EndPo" + "intNameList\"\000\0224\n\013ListLinkIds\022\016.context.E" + "mpty\032\023.context.LinkIdList\"\000\0220\n\tListLinks" + "\022\016.context.Empty\032\021.context.LinkList\"\000\022+\n" + "\007GetLink\022\017.context.LinkId\032\r.context.Link" + "\"\000\022+\n\007SetLink\022\r.context.Link\032\017.context.L" + "inkId\"\000\022/\n\nRemoveLink\022\017.context.LinkId\032\016" + ".context.Empty\"\000\0227\n\rGetLinkEvents\022\016.cont" + "ext.Empty\032\022.context.LinkEvent\"\0000\001\022>\n\016Lis" + "tServiceIds\022\022.context.ContextId\032\026.contex" + "t.ServiceIdList\"\000\022:\n\014ListServices\022\022.cont" + "ext.ContextId\032\024.context.ServiceList\"\000\0224\n" + "\nGetService\022\022.context.ServiceId\032\020.contex" + "t.Service\"\000\0224\n\nSetService\022\020.context.Serv" + "ice\032\022.context.ServiceId\"\000\0226\n\014UnsetServic" + "e\022\020.context.Service\032\022.context.ServiceId\"" + "\000\0225\n\rRemoveService\022\022.context.ServiceId\032\016" + ".context.Empty\"\000\022=\n\020GetServiceEvents\022\016.c" + "ontext.Empty\032\025.context.ServiceEvent\"\0000\001\022" + "?\n\rSelectService\022\026.context.ServiceFilter" + "\032\024.context.ServiceList\"\000\022:\n\014ListSliceIds" + "\022\022.context.ContextId\032\024.context.SliceIdLi" + "st\"\000\0226\n\nListSlices\022\022.context.ContextId\032\022" + ".context.SliceList\"\000\022.\n\010GetSlice\022\020.conte" + "xt.SliceId\032\016.context.Slice\"\000\022.\n\010SetSlice" + "\022\016.context.Slice\032\020.context.SliceId\"\000\0220\n\n" + "UnsetSlice\022\016.context.Slice\032\020.context.Sli" + "ceId\"\000\0221\n\013RemoveSlice\022\020.context.SliceId\032" + "\016.context.Empty\"\000\0229\n\016GetSliceEvents\022\016.co" + "ntext.Empty\032\023.context.SliceEvent\"\0000\001\0229\n\013" + "SelectSlice\022\024.context.SliceFilter\032\022.cont" + "ext.SliceList\"\000\022D\n\021ListConnectionIds\022\022.c" + "ontext.ServiceId\032\031.context.ConnectionIdL" + "ist\"\000\022@\n\017ListConnections\022\022.context.Servi" + "ceId\032\027.context.ConnectionList\"\000\022=\n\rGetCo" + "nnection\022\025.context.ConnectionId\032\023.contex" + "t.Connection\"\000\022=\n\rSetConnection\022\023.contex" + "t.Connection\032\025.context.ConnectionId\"\000\022;\n" + "\020RemoveConnection\022\025.context.ConnectionId" + "\032\016.context.Empty\"\000\022C\n\023GetConnectionEvent" + "s\022\016.context.Empty\032\030.context.ConnectionEv" + "ent\"\0000\001\022@\n\020GetOpticalConfig\022\016.context.Em" + "pty\032\032.context.OpticalConfigList\"\000\022F\n\020Set" + "OpticalConfig\022\026.context.OpticalConfig\032\030." + "context.OpticalConfigId\"\000\022I\n\023SelectOptic" + "alConfig\022\030.context.OpticalConfigId\032\026.con" + "text.OpticalConfig\"\000\0228\n\016SetOpticalLink\022\024" + ".context.OpticalLink\032\016.context.Empty\"\000\022@" + "\n\016GetOpticalLink\022\026.context.OpticalLinkId" + "\032\024.context.OpticalLink\"\000\022.\n\010GetFiber\022\020.c" + "ontext.FiberId\032\016.context.Fiber\"\000b\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { acl.Acl.getDescriptor(), kpi_sample_types.KpiSampleTypes.getDescriptor() }); internal_static_context_Empty_descriptor = getDescriptor().getMessageTypes().get(0); internal_static_context_Empty_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Empty_descriptor, new java.lang.String[] {}); @@ -69778,6 +76850,22 @@ public final class ContextOuterClass { internal_static_context_TeraFlowController_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_TeraFlowController_descriptor, new java.lang.String[] { "ContextId", "IpAddress", "Port" }); internal_static_context_AuthenticationResult_descriptor = getDescriptor().getMessageTypes().get(77); internal_static_context_AuthenticationResult_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_AuthenticationResult_descriptor, new java.lang.String[] { "ContextId", "Authenticated" }); + internal_static_context_OpticalConfigId_descriptor = getDescriptor().getMessageTypes().get(78); + internal_static_context_OpticalConfigId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalConfigId_descriptor, new java.lang.String[] { "OpticalconfigUuid" }); + internal_static_context_OpticalConfig_descriptor = getDescriptor().getMessageTypes().get(79); + internal_static_context_OpticalConfig_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalConfig_descriptor, new java.lang.String[] { "OpticalconfigId", "Config" }); + internal_static_context_OpticalConfigList_descriptor = getDescriptor().getMessageTypes().get(80); + internal_static_context_OpticalConfigList_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalConfigList_descriptor, new java.lang.String[] { "Opticalconfigs" }); + internal_static_context_OpticalLinkId_descriptor = getDescriptor().getMessageTypes().get(81); + internal_static_context_OpticalLinkId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLinkId_descriptor, new java.lang.String[] { "OpticalLinkUuid" }); + internal_static_context_FiberId_descriptor = getDescriptor().getMessageTypes().get(82); + internal_static_context_FiberId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_FiberId_descriptor, new java.lang.String[] { "FiberUuid" }); + internal_static_context_Fiber_descriptor = getDescriptor().getMessageTypes().get(83); + internal_static_context_Fiber_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Fiber_descriptor, new java.lang.String[] { "ID", "SrcPort", "DstPort", "LocalPeerPort", "RemotePeerPort", "CSlots", "LSlots", "SSlots", "Length", "Used", "FiberUuid" }); + internal_static_context_OpticalLinkDetails_descriptor = getDescriptor().getMessageTypes().get(84); + internal_static_context_OpticalLinkDetails_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLinkDetails_descriptor, new java.lang.String[] { "Length", "Source", "Target", "Fibers" }); + internal_static_context_OpticalLink_descriptor = getDescriptor().getMessageTypes().get(85); + internal_static_context_OpticalLink_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLink_descriptor, new java.lang.String[] { "Name", "Details", "OpticalLinkUuid" }); acl.Acl.getDescriptor(); kpi_sample_types.KpiSampleTypes.getDescriptor(); } diff --git a/src/policy/target/generated-sources/grpc/context/ContextService.java b/src/policy/target/generated-sources/grpc/context/ContextService.java index f1c089fb5..32544e6be 100644 --- a/src/policy/target/generated-sources/grpc/context/ContextService.java +++ b/src/policy/target/generated-sources/grpc/context/ContextService.java @@ -89,6 +89,23 @@ public interface ContextService extends MutinyService { io.smallrye.mutiny.Uni removeConnection(context.ContextOuterClass.ConnectionId request); + /** + *
+     *  ------------------------------ Experimental -----------------------------
+     * 
+ */ + io.smallrye.mutiny.Uni getOpticalConfig(context.ContextOuterClass.Empty request); + + io.smallrye.mutiny.Uni setOpticalConfig(context.ContextOuterClass.OpticalConfig request); + + io.smallrye.mutiny.Uni selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request); + + io.smallrye.mutiny.Uni setOpticalLink(context.ContextOuterClass.OpticalLink request); + + io.smallrye.mutiny.Uni getOpticalLink(context.ContextOuterClass.OpticalLinkId request); + + io.smallrye.mutiny.Uni getFiber(context.ContextOuterClass.FiberId request); + io.smallrye.mutiny.Multi getContextEvents(context.ContextOuterClass.Empty request); io.smallrye.mutiny.Multi getTopologyEvents(context.ContextOuterClass.Empty request); diff --git a/src/policy/target/generated-sources/grpc/context/ContextServiceBean.java b/src/policy/target/generated-sources/grpc/context/ContextServiceBean.java index db1b9c170..d3c1b6285 100644 --- a/src/policy/target/generated-sources/grpc/context/ContextServiceBean.java +++ b/src/policy/target/generated-sources/grpc/context/ContextServiceBean.java @@ -391,6 +391,60 @@ public class ContextServiceBean extends MutinyContextServiceGrpc.ContextServiceI } } + @Override + public io.smallrye.mutiny.Uni getOpticalConfig(context.ContextOuterClass.Empty request) { + try { + return delegate.getOpticalConfig(request); + } catch (UnsupportedOperationException e) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + } + + @Override + public io.smallrye.mutiny.Uni setOpticalConfig(context.ContextOuterClass.OpticalConfig request) { + try { + return delegate.setOpticalConfig(request); + } catch (UnsupportedOperationException e) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + } + + @Override + public io.smallrye.mutiny.Uni selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request) { + try { + return delegate.selectOpticalConfig(request); + } catch (UnsupportedOperationException e) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + } + + @Override + public io.smallrye.mutiny.Uni setOpticalLink(context.ContextOuterClass.OpticalLink request) { + try { + return delegate.setOpticalLink(request); + } catch (UnsupportedOperationException e) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + } + + @Override + public io.smallrye.mutiny.Uni getOpticalLink(context.ContextOuterClass.OpticalLinkId request) { + try { + return delegate.getOpticalLink(request); + } catch (UnsupportedOperationException e) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + } + + @Override + public io.smallrye.mutiny.Uni getFiber(context.ContextOuterClass.FiberId request) { + try { + return delegate.getFiber(request); + } catch (UnsupportedOperationException e) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + } + @Override public io.smallrye.mutiny.Multi getContextEvents(context.ContextOuterClass.Empty request) { try { diff --git a/src/policy/target/generated-sources/grpc/context/ContextServiceClient.java b/src/policy/target/generated-sources/grpc/context/ContextServiceClient.java index 88ab831f5..b1773578d 100644 --- a/src/policy/target/generated-sources/grpc/context/ContextServiceClient.java +++ b/src/policy/target/generated-sources/grpc/context/ContextServiceClient.java @@ -235,6 +235,36 @@ public class ContextServiceClient implements ContextService, MutinyClient getOpticalConfig(context.ContextOuterClass.Empty request) { + return stub.getOpticalConfig(request); + } + + @Override + public io.smallrye.mutiny.Uni setOpticalConfig(context.ContextOuterClass.OpticalConfig request) { + return stub.setOpticalConfig(request); + } + + @Override + public io.smallrye.mutiny.Uni selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request) { + return stub.selectOpticalConfig(request); + } + + @Override + public io.smallrye.mutiny.Uni setOpticalLink(context.ContextOuterClass.OpticalLink request) { + return stub.setOpticalLink(request); + } + + @Override + public io.smallrye.mutiny.Uni getOpticalLink(context.ContextOuterClass.OpticalLinkId request) { + return stub.getOpticalLink(request); + } + + @Override + public io.smallrye.mutiny.Uni getFiber(context.ContextOuterClass.FiberId request) { + return stub.getFiber(request); + } + @Override public io.smallrye.mutiny.Multi getContextEvents(context.ContextOuterClass.Empty request) { return stub.getContextEvents(request); diff --git a/src/policy/target/generated-sources/grpc/context/ContextServiceGrpc.java b/src/policy/target/generated-sources/grpc/context/ContextServiceGrpc.java index defb37810..233312dd7 100644 --- a/src/policy/target/generated-sources/grpc/context/ContextServiceGrpc.java +++ b/src/policy/target/generated-sources/grpc/context/ContextServiceGrpc.java @@ -749,6 +749,96 @@ public final class ContextServiceGrpc { return getGetConnectionEventsMethod; } + private static volatile io.grpc.MethodDescriptor getGetOpticalConfigMethod; + + @io.grpc.stub.annotations.RpcMethod(fullMethodName = SERVICE_NAME + '/' + "GetOpticalConfig", requestType = context.ContextOuterClass.Empty.class, responseType = context.ContextOuterClass.OpticalConfigList.class, methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getGetOpticalConfigMethod() { + io.grpc.MethodDescriptor getGetOpticalConfigMethod; + if ((getGetOpticalConfigMethod = ContextServiceGrpc.getGetOpticalConfigMethod) == null) { + synchronized (ContextServiceGrpc.class) { + if ((getGetOpticalConfigMethod = ContextServiceGrpc.getGetOpticalConfigMethod) == null) { + ContextServiceGrpc.getGetOpticalConfigMethod = getGetOpticalConfigMethod = io.grpc.MethodDescriptor.newBuilder().setType(io.grpc.MethodDescriptor.MethodType.UNARY).setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetOpticalConfig")).setSampledToLocalTracing(true).setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.Empty.getDefaultInstance())).setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.OpticalConfigList.getDefaultInstance())).setSchemaDescriptor(new ContextServiceMethodDescriptorSupplier("GetOpticalConfig")).build(); + } + } + } + return getGetOpticalConfigMethod; + } + + private static volatile io.grpc.MethodDescriptor getSetOpticalConfigMethod; + + @io.grpc.stub.annotations.RpcMethod(fullMethodName = SERVICE_NAME + '/' + "SetOpticalConfig", requestType = context.ContextOuterClass.OpticalConfig.class, responseType = context.ContextOuterClass.OpticalConfigId.class, methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getSetOpticalConfigMethod() { + io.grpc.MethodDescriptor getSetOpticalConfigMethod; + if ((getSetOpticalConfigMethod = ContextServiceGrpc.getSetOpticalConfigMethod) == null) { + synchronized (ContextServiceGrpc.class) { + if ((getSetOpticalConfigMethod = ContextServiceGrpc.getSetOpticalConfigMethod) == null) { + ContextServiceGrpc.getSetOpticalConfigMethod = getSetOpticalConfigMethod = io.grpc.MethodDescriptor.newBuilder().setType(io.grpc.MethodDescriptor.MethodType.UNARY).setFullMethodName(generateFullMethodName(SERVICE_NAME, "SetOpticalConfig")).setSampledToLocalTracing(true).setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.OpticalConfig.getDefaultInstance())).setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.OpticalConfigId.getDefaultInstance())).setSchemaDescriptor(new ContextServiceMethodDescriptorSupplier("SetOpticalConfig")).build(); + } + } + } + return getSetOpticalConfigMethod; + } + + private static volatile io.grpc.MethodDescriptor getSelectOpticalConfigMethod; + + @io.grpc.stub.annotations.RpcMethod(fullMethodName = SERVICE_NAME + '/' + "SelectOpticalConfig", requestType = context.ContextOuterClass.OpticalConfigId.class, responseType = context.ContextOuterClass.OpticalConfig.class, methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getSelectOpticalConfigMethod() { + io.grpc.MethodDescriptor getSelectOpticalConfigMethod; + if ((getSelectOpticalConfigMethod = ContextServiceGrpc.getSelectOpticalConfigMethod) == null) { + synchronized (ContextServiceGrpc.class) { + if ((getSelectOpticalConfigMethod = ContextServiceGrpc.getSelectOpticalConfigMethod) == null) { + ContextServiceGrpc.getSelectOpticalConfigMethod = getSelectOpticalConfigMethod = io.grpc.MethodDescriptor.newBuilder().setType(io.grpc.MethodDescriptor.MethodType.UNARY).setFullMethodName(generateFullMethodName(SERVICE_NAME, "SelectOpticalConfig")).setSampledToLocalTracing(true).setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.OpticalConfigId.getDefaultInstance())).setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.OpticalConfig.getDefaultInstance())).setSchemaDescriptor(new ContextServiceMethodDescriptorSupplier("SelectOpticalConfig")).build(); + } + } + } + return getSelectOpticalConfigMethod; + } + + private static volatile io.grpc.MethodDescriptor getSetOpticalLinkMethod; + + @io.grpc.stub.annotations.RpcMethod(fullMethodName = SERVICE_NAME + '/' + "SetOpticalLink", requestType = context.ContextOuterClass.OpticalLink.class, responseType = context.ContextOuterClass.Empty.class, methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getSetOpticalLinkMethod() { + io.grpc.MethodDescriptor getSetOpticalLinkMethod; + if ((getSetOpticalLinkMethod = ContextServiceGrpc.getSetOpticalLinkMethod) == null) { + synchronized (ContextServiceGrpc.class) { + if ((getSetOpticalLinkMethod = ContextServiceGrpc.getSetOpticalLinkMethod) == null) { + ContextServiceGrpc.getSetOpticalLinkMethod = getSetOpticalLinkMethod = io.grpc.MethodDescriptor.newBuilder().setType(io.grpc.MethodDescriptor.MethodType.UNARY).setFullMethodName(generateFullMethodName(SERVICE_NAME, "SetOpticalLink")).setSampledToLocalTracing(true).setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.OpticalLink.getDefaultInstance())).setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.Empty.getDefaultInstance())).setSchemaDescriptor(new ContextServiceMethodDescriptorSupplier("SetOpticalLink")).build(); + } + } + } + return getSetOpticalLinkMethod; + } + + private static volatile io.grpc.MethodDescriptor getGetOpticalLinkMethod; + + @io.grpc.stub.annotations.RpcMethod(fullMethodName = SERVICE_NAME + '/' + "GetOpticalLink", requestType = context.ContextOuterClass.OpticalLinkId.class, responseType = context.ContextOuterClass.OpticalLink.class, methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getGetOpticalLinkMethod() { + io.grpc.MethodDescriptor getGetOpticalLinkMethod; + if ((getGetOpticalLinkMethod = ContextServiceGrpc.getGetOpticalLinkMethod) == null) { + synchronized (ContextServiceGrpc.class) { + if ((getGetOpticalLinkMethod = ContextServiceGrpc.getGetOpticalLinkMethod) == null) { + ContextServiceGrpc.getGetOpticalLinkMethod = getGetOpticalLinkMethod = io.grpc.MethodDescriptor.newBuilder().setType(io.grpc.MethodDescriptor.MethodType.UNARY).setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetOpticalLink")).setSampledToLocalTracing(true).setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.OpticalLinkId.getDefaultInstance())).setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.OpticalLink.getDefaultInstance())).setSchemaDescriptor(new ContextServiceMethodDescriptorSupplier("GetOpticalLink")).build(); + } + } + } + return getGetOpticalLinkMethod; + } + + private static volatile io.grpc.MethodDescriptor getGetFiberMethod; + + @io.grpc.stub.annotations.RpcMethod(fullMethodName = SERVICE_NAME + '/' + "GetFiber", requestType = context.ContextOuterClass.FiberId.class, responseType = context.ContextOuterClass.Fiber.class, methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getGetFiberMethod() { + io.grpc.MethodDescriptor getGetFiberMethod; + if ((getGetFiberMethod = ContextServiceGrpc.getGetFiberMethod) == null) { + synchronized (ContextServiceGrpc.class) { + if ((getGetFiberMethod = ContextServiceGrpc.getGetFiberMethod) == null) { + ContextServiceGrpc.getGetFiberMethod = getGetFiberMethod = io.grpc.MethodDescriptor.newBuilder().setType(io.grpc.MethodDescriptor.MethodType.UNARY).setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetFiber")).setSampledToLocalTracing(true).setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.FiberId.getDefaultInstance())).setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(context.ContextOuterClass.Fiber.getDefaultInstance())).setSchemaDescriptor(new ContextServiceMethodDescriptorSupplier("GetFiber")).build(); + } + } + } + return getGetFiberMethod; + } + /** * Creates a new async stub that supports all call types for the service */ @@ -1088,6 +1178,45 @@ public final class ContextServiceGrpc { default void getConnectionEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetConnectionEventsMethod(), responseObserver); } + + /** + *
+         * ------------------------------ Experimental -----------------------------
+         * 
+ */ + default void getOpticalConfig(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetOpticalConfigMethod(), responseObserver); + } + + /** + */ + default void setOpticalConfig(context.ContextOuterClass.OpticalConfig request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetOpticalConfigMethod(), responseObserver); + } + + /** + */ + default void selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSelectOpticalConfigMethod(), responseObserver); + } + + /** + */ + default void setOpticalLink(context.ContextOuterClass.OpticalLink request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetOpticalLinkMethod(), responseObserver); + } + + /** + */ + default void getOpticalLink(context.ContextOuterClass.OpticalLinkId request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetOpticalLinkMethod(), responseObserver); + } + + /** + */ + default void getFiber(context.ContextOuterClass.FiberId request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetFiberMethod(), responseObserver); + } } /** @@ -1408,6 +1537,45 @@ public final class ContextServiceGrpc { public void getConnectionEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ClientCalls.asyncServerStreamingCall(getChannel().newCall(getGetConnectionEventsMethod(), getCallOptions()), request, responseObserver); } + + /** + *
+         * ------------------------------ Experimental -----------------------------
+         * 
+ */ + public void getOpticalConfig(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall(getChannel().newCall(getGetOpticalConfigMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void setOpticalConfig(context.ContextOuterClass.OpticalConfig request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall(getChannel().newCall(getSetOpticalConfigMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall(getChannel().newCall(getSelectOpticalConfigMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void setOpticalLink(context.ContextOuterClass.OpticalLink request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall(getChannel().newCall(getSetOpticalLinkMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void getOpticalLink(context.ContextOuterClass.OpticalLinkId request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall(getChannel().newCall(getGetOpticalLinkMethod(), getCallOptions()), request, responseObserver); + } + + /** + */ + public void getFiber(context.ContextOuterClass.FiberId request, io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall(getChannel().newCall(getGetFiberMethod(), getCallOptions()), request, responseObserver); + } } /** @@ -1717,6 +1885,45 @@ public final class ContextServiceGrpc { public java.util.Iterator getConnectionEvents(context.ContextOuterClass.Empty request) { return io.grpc.stub.ClientCalls.blockingServerStreamingCall(getChannel(), getGetConnectionEventsMethod(), getCallOptions(), request); } + + /** + *
+         * ------------------------------ Experimental -----------------------------
+         * 
+ */ + public context.ContextOuterClass.OpticalConfigList getOpticalConfig(context.ContextOuterClass.Empty request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall(getChannel(), getGetOpticalConfigMethod(), getCallOptions(), request); + } + + /** + */ + public context.ContextOuterClass.OpticalConfigId setOpticalConfig(context.ContextOuterClass.OpticalConfig request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall(getChannel(), getSetOpticalConfigMethod(), getCallOptions(), request); + } + + /** + */ + public context.ContextOuterClass.OpticalConfig selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall(getChannel(), getSelectOpticalConfigMethod(), getCallOptions(), request); + } + + /** + */ + public context.ContextOuterClass.Empty setOpticalLink(context.ContextOuterClass.OpticalLink request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall(getChannel(), getSetOpticalLinkMethod(), getCallOptions(), request); + } + + /** + */ + public context.ContextOuterClass.OpticalLink getOpticalLink(context.ContextOuterClass.OpticalLinkId request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall(getChannel(), getGetOpticalLinkMethod(), getCallOptions(), request); + } + + /** + */ + public context.ContextOuterClass.Fiber getFiber(context.ContextOuterClass.FiberId request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall(getChannel(), getGetFiberMethod(), getCallOptions(), request); + } } /** @@ -1984,6 +2191,45 @@ public final class ContextServiceGrpc { public com.google.common.util.concurrent.ListenableFuture removeConnection(context.ContextOuterClass.ConnectionId request) { return io.grpc.stub.ClientCalls.futureUnaryCall(getChannel().newCall(getRemoveConnectionMethod(), getCallOptions()), request); } + + /** + *
+         * ------------------------------ Experimental -----------------------------
+         * 
+ */ + public com.google.common.util.concurrent.ListenableFuture getOpticalConfig(context.ContextOuterClass.Empty request) { + return io.grpc.stub.ClientCalls.futureUnaryCall(getChannel().newCall(getGetOpticalConfigMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture setOpticalConfig(context.ContextOuterClass.OpticalConfig request) { + return io.grpc.stub.ClientCalls.futureUnaryCall(getChannel().newCall(getSetOpticalConfigMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request) { + return io.grpc.stub.ClientCalls.futureUnaryCall(getChannel().newCall(getSelectOpticalConfigMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture setOpticalLink(context.ContextOuterClass.OpticalLink request) { + return io.grpc.stub.ClientCalls.futureUnaryCall(getChannel().newCall(getSetOpticalLinkMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture getOpticalLink(context.ContextOuterClass.OpticalLinkId request) { + return io.grpc.stub.ClientCalls.futureUnaryCall(getChannel().newCall(getGetOpticalLinkMethod(), getCallOptions()), request); + } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture getFiber(context.ContextOuterClass.FiberId request) { + return io.grpc.stub.ClientCalls.futureUnaryCall(getChannel().newCall(getGetFiberMethod(), getCallOptions()), request); + } } private static final int METHODID_LIST_CONTEXT_IDS = 0; @@ -2084,6 +2330,18 @@ public final class ContextServiceGrpc { private static final int METHODID_GET_CONNECTION_EVENTS = 48; + private static final int METHODID_GET_OPTICAL_CONFIG = 49; + + private static final int METHODID_SET_OPTICAL_CONFIG = 50; + + private static final int METHODID_SELECT_OPTICAL_CONFIG = 51; + + private static final int METHODID_SET_OPTICAL_LINK = 52; + + private static final int METHODID_GET_OPTICAL_LINK = 53; + + private static final int METHODID_GET_FIBER = 54; + private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, io.grpc.stub.ServerCalls.ServerStreamingMethod, io.grpc.stub.ServerCalls.ClientStreamingMethod, io.grpc.stub.ServerCalls.BidiStreamingMethod { private final AsyncService serviceImpl; @@ -2246,6 +2504,24 @@ public final class ContextServiceGrpc { case METHODID_GET_CONNECTION_EVENTS: serviceImpl.getConnectionEvents((context.ContextOuterClass.Empty) request, (io.grpc.stub.StreamObserver) responseObserver); break; + case METHODID_GET_OPTICAL_CONFIG: + serviceImpl.getOpticalConfig((context.ContextOuterClass.Empty) request, (io.grpc.stub.StreamObserver) responseObserver); + break; + case METHODID_SET_OPTICAL_CONFIG: + serviceImpl.setOpticalConfig((context.ContextOuterClass.OpticalConfig) request, (io.grpc.stub.StreamObserver) responseObserver); + break; + case METHODID_SELECT_OPTICAL_CONFIG: + serviceImpl.selectOpticalConfig((context.ContextOuterClass.OpticalConfigId) request, (io.grpc.stub.StreamObserver) responseObserver); + break; + case METHODID_SET_OPTICAL_LINK: + serviceImpl.setOpticalLink((context.ContextOuterClass.OpticalLink) request, (io.grpc.stub.StreamObserver) responseObserver); + break; + case METHODID_GET_OPTICAL_LINK: + serviceImpl.getOpticalLink((context.ContextOuterClass.OpticalLinkId) request, (io.grpc.stub.StreamObserver) responseObserver); + break; + case METHODID_GET_FIBER: + serviceImpl.getFiber((context.ContextOuterClass.FiberId) request, (io.grpc.stub.StreamObserver) responseObserver); + break; default: throw new AssertionError(); } @@ -2262,7 +2538,7 @@ public final class ContextServiceGrpc { } public static io.grpc.ServerServiceDefinition bindService(AsyncService service) { - return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getListContextIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONTEXT_IDS))).addMethod(getListContextsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONTEXTS))).addMethod(getGetContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_CONTEXT))).addMethod(getSetContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_CONTEXT))).addMethod(getRemoveContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_CONTEXT))).addMethod(getGetContextEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_CONTEXT_EVENTS))).addMethod(getListTopologyIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_TOPOLOGY_IDS))).addMethod(getListTopologiesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_TOPOLOGIES))).addMethod(getGetTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY))).addMethod(getGetTopologyDetailsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY_DETAILS))).addMethod(getSetTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_TOPOLOGY))).addMethod(getRemoveTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_TOPOLOGY))).addMethod(getGetTopologyEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY_EVENTS))).addMethod(getListDeviceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_DEVICE_IDS))).addMethod(getListDevicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_DEVICES))).addMethod(getGetDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_DEVICE))).addMethod(getSetDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_DEVICE))).addMethod(getRemoveDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_DEVICE))).addMethod(getGetDeviceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_DEVICE_EVENTS))).addMethod(getSelectDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_DEVICE))).addMethod(getListEndPointNamesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_END_POINT_NAMES))).addMethod(getListLinkIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_LINK_IDS))).addMethod(getListLinksMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_LINKS))).addMethod(getGetLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_LINK))).addMethod(getSetLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_LINK))).addMethod(getRemoveLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_LINK))).addMethod(getGetLinkEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_LINK_EVENTS))).addMethod(getListServiceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SERVICE_IDS))).addMethod(getListServicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SERVICES))).addMethod(getGetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_SERVICE))).addMethod(getSetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_SERVICE))).addMethod(getUnsetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_UNSET_SERVICE))).addMethod(getRemoveServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_SERVICE))).addMethod(getGetServiceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_SERVICE_EVENTS))).addMethod(getSelectServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_SERVICE))).addMethod(getListSliceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SLICE_IDS))).addMethod(getListSlicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SLICES))).addMethod(getGetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_SLICE))).addMethod(getSetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_SLICE))).addMethod(getUnsetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_UNSET_SLICE))).addMethod(getRemoveSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_SLICE))).addMethod(getGetSliceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_SLICE_EVENTS))).addMethod(getSelectSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_SLICE))).addMethod(getListConnectionIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONNECTION_IDS))).addMethod(getListConnectionsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONNECTIONS))).addMethod(getGetConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_CONNECTION))).addMethod(getSetConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_CONNECTION))).addMethod(getRemoveConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_CONNECTION))).addMethod(getGetConnectionEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_CONNECTION_EVENTS))).build(); + return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getListContextIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONTEXT_IDS))).addMethod(getListContextsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONTEXTS))).addMethod(getGetContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_CONTEXT))).addMethod(getSetContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_CONTEXT))).addMethod(getRemoveContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_CONTEXT))).addMethod(getGetContextEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_CONTEXT_EVENTS))).addMethod(getListTopologyIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_TOPOLOGY_IDS))).addMethod(getListTopologiesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_TOPOLOGIES))).addMethod(getGetTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY))).addMethod(getGetTopologyDetailsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY_DETAILS))).addMethod(getSetTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_TOPOLOGY))).addMethod(getRemoveTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_TOPOLOGY))).addMethod(getGetTopologyEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY_EVENTS))).addMethod(getListDeviceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_DEVICE_IDS))).addMethod(getListDevicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_DEVICES))).addMethod(getGetDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_DEVICE))).addMethod(getSetDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_DEVICE))).addMethod(getRemoveDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_DEVICE))).addMethod(getGetDeviceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_DEVICE_EVENTS))).addMethod(getSelectDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_DEVICE))).addMethod(getListEndPointNamesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_END_POINT_NAMES))).addMethod(getListLinkIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_LINK_IDS))).addMethod(getListLinksMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_LINKS))).addMethod(getGetLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_LINK))).addMethod(getSetLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_LINK))).addMethod(getRemoveLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_LINK))).addMethod(getGetLinkEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_LINK_EVENTS))).addMethod(getListServiceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SERVICE_IDS))).addMethod(getListServicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SERVICES))).addMethod(getGetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_SERVICE))).addMethod(getSetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_SERVICE))).addMethod(getUnsetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_UNSET_SERVICE))).addMethod(getRemoveServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_SERVICE))).addMethod(getGetServiceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_SERVICE_EVENTS))).addMethod(getSelectServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_SERVICE))).addMethod(getListSliceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SLICE_IDS))).addMethod(getListSlicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SLICES))).addMethod(getGetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_SLICE))).addMethod(getSetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_SLICE))).addMethod(getUnsetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_UNSET_SLICE))).addMethod(getRemoveSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_SLICE))).addMethod(getGetSliceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_SLICE_EVENTS))).addMethod(getSelectSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_SLICE))).addMethod(getListConnectionIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONNECTION_IDS))).addMethod(getListConnectionsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONNECTIONS))).addMethod(getGetConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_CONNECTION))).addMethod(getSetConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_CONNECTION))).addMethod(getRemoveConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_CONNECTION))).addMethod(getGetConnectionEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_CONNECTION_EVENTS))).addMethod(getGetOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_OPTICAL_CONFIG))).addMethod(getSetOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_OPTICAL_CONFIG))).addMethod(getSelectOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_OPTICAL_CONFIG))).addMethod(getSetOpticalLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_OPTICAL_LINK))).addMethod(getGetOpticalLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_OPTICAL_LINK))).addMethod(getGetFiberMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_FIBER))).build(); } private static abstract class ContextServiceBaseDescriptorSupplier implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier { @@ -2309,7 +2585,7 @@ public final class ContextServiceGrpc { synchronized (ContextServiceGrpc.class) { result = serviceDescriptor; if (result == null) { - serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME).setSchemaDescriptor(new ContextServiceFileDescriptorSupplier()).addMethod(getListContextIdsMethod()).addMethod(getListContextsMethod()).addMethod(getGetContextMethod()).addMethod(getSetContextMethod()).addMethod(getRemoveContextMethod()).addMethod(getGetContextEventsMethod()).addMethod(getListTopologyIdsMethod()).addMethod(getListTopologiesMethod()).addMethod(getGetTopologyMethod()).addMethod(getGetTopologyDetailsMethod()).addMethod(getSetTopologyMethod()).addMethod(getRemoveTopologyMethod()).addMethod(getGetTopologyEventsMethod()).addMethod(getListDeviceIdsMethod()).addMethod(getListDevicesMethod()).addMethod(getGetDeviceMethod()).addMethod(getSetDeviceMethod()).addMethod(getRemoveDeviceMethod()).addMethod(getGetDeviceEventsMethod()).addMethod(getSelectDeviceMethod()).addMethod(getListEndPointNamesMethod()).addMethod(getListLinkIdsMethod()).addMethod(getListLinksMethod()).addMethod(getGetLinkMethod()).addMethod(getSetLinkMethod()).addMethod(getRemoveLinkMethod()).addMethod(getGetLinkEventsMethod()).addMethod(getListServiceIdsMethod()).addMethod(getListServicesMethod()).addMethod(getGetServiceMethod()).addMethod(getSetServiceMethod()).addMethod(getUnsetServiceMethod()).addMethod(getRemoveServiceMethod()).addMethod(getGetServiceEventsMethod()).addMethod(getSelectServiceMethod()).addMethod(getListSliceIdsMethod()).addMethod(getListSlicesMethod()).addMethod(getGetSliceMethod()).addMethod(getSetSliceMethod()).addMethod(getUnsetSliceMethod()).addMethod(getRemoveSliceMethod()).addMethod(getGetSliceEventsMethod()).addMethod(getSelectSliceMethod()).addMethod(getListConnectionIdsMethod()).addMethod(getListConnectionsMethod()).addMethod(getGetConnectionMethod()).addMethod(getSetConnectionMethod()).addMethod(getRemoveConnectionMethod()).addMethod(getGetConnectionEventsMethod()).build(); + serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME).setSchemaDescriptor(new ContextServiceFileDescriptorSupplier()).addMethod(getListContextIdsMethod()).addMethod(getListContextsMethod()).addMethod(getGetContextMethod()).addMethod(getSetContextMethod()).addMethod(getRemoveContextMethod()).addMethod(getGetContextEventsMethod()).addMethod(getListTopologyIdsMethod()).addMethod(getListTopologiesMethod()).addMethod(getGetTopologyMethod()).addMethod(getGetTopologyDetailsMethod()).addMethod(getSetTopologyMethod()).addMethod(getRemoveTopologyMethod()).addMethod(getGetTopologyEventsMethod()).addMethod(getListDeviceIdsMethod()).addMethod(getListDevicesMethod()).addMethod(getGetDeviceMethod()).addMethod(getSetDeviceMethod()).addMethod(getRemoveDeviceMethod()).addMethod(getGetDeviceEventsMethod()).addMethod(getSelectDeviceMethod()).addMethod(getListEndPointNamesMethod()).addMethod(getListLinkIdsMethod()).addMethod(getListLinksMethod()).addMethod(getGetLinkMethod()).addMethod(getSetLinkMethod()).addMethod(getRemoveLinkMethod()).addMethod(getGetLinkEventsMethod()).addMethod(getListServiceIdsMethod()).addMethod(getListServicesMethod()).addMethod(getGetServiceMethod()).addMethod(getSetServiceMethod()).addMethod(getUnsetServiceMethod()).addMethod(getRemoveServiceMethod()).addMethod(getGetServiceEventsMethod()).addMethod(getSelectServiceMethod()).addMethod(getListSliceIdsMethod()).addMethod(getListSlicesMethod()).addMethod(getGetSliceMethod()).addMethod(getSetSliceMethod()).addMethod(getUnsetSliceMethod()).addMethod(getRemoveSliceMethod()).addMethod(getGetSliceEventsMethod()).addMethod(getSelectSliceMethod()).addMethod(getListConnectionIdsMethod()).addMethod(getListConnectionsMethod()).addMethod(getGetConnectionMethod()).addMethod(getSetConnectionMethod()).addMethod(getRemoveConnectionMethod()).addMethod(getGetConnectionEventsMethod()).addMethod(getGetOpticalConfigMethod()).addMethod(getSetOpticalConfigMethod()).addMethod(getSelectOpticalConfigMethod()).addMethod(getSetOpticalLinkMethod()).addMethod(getGetOpticalLinkMethod()).addMethod(getGetFiberMethod()).build(); } } } diff --git a/src/policy/target/generated-sources/grpc/context/MutinyContextServiceGrpc.java b/src/policy/target/generated-sources/grpc/context/MutinyContextServiceGrpc.java index 247bf18ae..c6dbb1e92 100644 --- a/src/policy/target/generated-sources/grpc/context/MutinyContextServiceGrpc.java +++ b/src/policy/target/generated-sources/grpc/context/MutinyContextServiceGrpc.java @@ -203,6 +203,35 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.MutinyGrp return io.quarkus.grpc.stubs.ClientCalls.oneToOne(request, delegateStub::removeConnection); } + /** + *
+         *  ------------------------------ Experimental -----------------------------
+         * 
+ */ + public io.smallrye.mutiny.Uni getOpticalConfig(context.ContextOuterClass.Empty request) { + return io.quarkus.grpc.stubs.ClientCalls.oneToOne(request, delegateStub::getOpticalConfig); + } + + public io.smallrye.mutiny.Uni setOpticalConfig(context.ContextOuterClass.OpticalConfig request) { + return io.quarkus.grpc.stubs.ClientCalls.oneToOne(request, delegateStub::setOpticalConfig); + } + + public io.smallrye.mutiny.Uni selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request) { + return io.quarkus.grpc.stubs.ClientCalls.oneToOne(request, delegateStub::selectOpticalConfig); + } + + public io.smallrye.mutiny.Uni setOpticalLink(context.ContextOuterClass.OpticalLink request) { + return io.quarkus.grpc.stubs.ClientCalls.oneToOne(request, delegateStub::setOpticalLink); + } + + public io.smallrye.mutiny.Uni getOpticalLink(context.ContextOuterClass.OpticalLinkId request) { + return io.quarkus.grpc.stubs.ClientCalls.oneToOne(request, delegateStub::getOpticalLink); + } + + public io.smallrye.mutiny.Uni getFiber(context.ContextOuterClass.FiberId request) { + return io.quarkus.grpc.stubs.ClientCalls.oneToOne(request, delegateStub::getFiber); + } + public io.smallrye.mutiny.Multi getContextEvents(context.ContextOuterClass.Empty request) { return io.quarkus.grpc.stubs.ClientCalls.oneToMany(request, delegateStub::getContextEvents); } @@ -414,6 +443,35 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.MutinyGrp throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); } + /** + *
+         *  ------------------------------ Experimental -----------------------------
+         * 
+ */ + public io.smallrye.mutiny.Uni getOpticalConfig(context.ContextOuterClass.Empty request) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + + public io.smallrye.mutiny.Uni setOpticalConfig(context.ContextOuterClass.OpticalConfig request) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + + public io.smallrye.mutiny.Uni selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + + public io.smallrye.mutiny.Uni setOpticalLink(context.ContextOuterClass.OpticalLink request) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + + public io.smallrye.mutiny.Uni getOpticalLink(context.ContextOuterClass.OpticalLinkId request) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + + public io.smallrye.mutiny.Uni getFiber(context.ContextOuterClass.FiberId request) { + throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); + } + public io.smallrye.mutiny.Multi getContextEvents(context.ContextOuterClass.Empty request) { throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED); } @@ -444,7 +502,7 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.MutinyGrp @java.lang.Override public io.grpc.ServerServiceDefinition bindService() { - return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(context.ContextServiceGrpc.getListContextIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONTEXT_IDS, compression))).addMethod(context.ContextServiceGrpc.getListContextsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONTEXTS, compression))).addMethod(context.ContextServiceGrpc.getGetContextMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_CONTEXT, compression))).addMethod(context.ContextServiceGrpc.getSetContextMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_CONTEXT, compression))).addMethod(context.ContextServiceGrpc.getRemoveContextMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_CONTEXT, compression))).addMethod(context.ContextServiceGrpc.getGetContextEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_CONTEXT_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getListTopologyIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_TOPOLOGY_IDS, compression))).addMethod(context.ContextServiceGrpc.getListTopologiesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_TOPOLOGIES, compression))).addMethod(context.ContextServiceGrpc.getGetTopologyMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY, compression))).addMethod(context.ContextServiceGrpc.getGetTopologyDetailsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY_DETAILS, compression))).addMethod(context.ContextServiceGrpc.getSetTopologyMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_TOPOLOGY, compression))).addMethod(context.ContextServiceGrpc.getRemoveTopologyMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_TOPOLOGY, compression))).addMethod(context.ContextServiceGrpc.getGetTopologyEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getListDeviceIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_DEVICE_IDS, compression))).addMethod(context.ContextServiceGrpc.getListDevicesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_DEVICES, compression))).addMethod(context.ContextServiceGrpc.getGetDeviceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_DEVICE, compression))).addMethod(context.ContextServiceGrpc.getSetDeviceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_DEVICE, compression))).addMethod(context.ContextServiceGrpc.getRemoveDeviceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_DEVICE, compression))).addMethod(context.ContextServiceGrpc.getGetDeviceEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_DEVICE_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getSelectDeviceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_DEVICE, compression))).addMethod(context.ContextServiceGrpc.getListEndPointNamesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_END_POINT_NAMES, compression))).addMethod(context.ContextServiceGrpc.getListLinkIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_LINK_IDS, compression))).addMethod(context.ContextServiceGrpc.getListLinksMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_LINKS, compression))).addMethod(context.ContextServiceGrpc.getGetLinkMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_LINK, compression))).addMethod(context.ContextServiceGrpc.getSetLinkMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_LINK, compression))).addMethod(context.ContextServiceGrpc.getRemoveLinkMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_LINK, compression))).addMethod(context.ContextServiceGrpc.getGetLinkEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_LINK_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getListServiceIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SERVICE_IDS, compression))).addMethod(context.ContextServiceGrpc.getListServicesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SERVICES, compression))).addMethod(context.ContextServiceGrpc.getGetServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getSetServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getUnsetServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_UNSET_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getRemoveServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getGetServiceEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_SERVICE_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getSelectServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getListSliceIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SLICE_IDS, compression))).addMethod(context.ContextServiceGrpc.getListSlicesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SLICES, compression))).addMethod(context.ContextServiceGrpc.getGetSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_SLICE, compression))).addMethod(context.ContextServiceGrpc.getSetSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_SLICE, compression))).addMethod(context.ContextServiceGrpc.getUnsetSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_UNSET_SLICE, compression))).addMethod(context.ContextServiceGrpc.getRemoveSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_SLICE, compression))).addMethod(context.ContextServiceGrpc.getGetSliceEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_SLICE_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getSelectSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_SLICE, compression))).addMethod(context.ContextServiceGrpc.getListConnectionIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONNECTION_IDS, compression))).addMethod(context.ContextServiceGrpc.getListConnectionsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONNECTIONS, compression))).addMethod(context.ContextServiceGrpc.getGetConnectionMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_CONNECTION, compression))).addMethod(context.ContextServiceGrpc.getSetConnectionMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_CONNECTION, compression))).addMethod(context.ContextServiceGrpc.getRemoveConnectionMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_CONNECTION, compression))).addMethod(context.ContextServiceGrpc.getGetConnectionEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_CONNECTION_EVENTS, compression))).build(); + return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(context.ContextServiceGrpc.getListContextIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONTEXT_IDS, compression))).addMethod(context.ContextServiceGrpc.getListContextsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONTEXTS, compression))).addMethod(context.ContextServiceGrpc.getGetContextMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_CONTEXT, compression))).addMethod(context.ContextServiceGrpc.getSetContextMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_CONTEXT, compression))).addMethod(context.ContextServiceGrpc.getRemoveContextMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_CONTEXT, compression))).addMethod(context.ContextServiceGrpc.getGetContextEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_CONTEXT_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getListTopologyIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_TOPOLOGY_IDS, compression))).addMethod(context.ContextServiceGrpc.getListTopologiesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_TOPOLOGIES, compression))).addMethod(context.ContextServiceGrpc.getGetTopologyMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY, compression))).addMethod(context.ContextServiceGrpc.getGetTopologyDetailsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY_DETAILS, compression))).addMethod(context.ContextServiceGrpc.getSetTopologyMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_TOPOLOGY, compression))).addMethod(context.ContextServiceGrpc.getRemoveTopologyMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_TOPOLOGY, compression))).addMethod(context.ContextServiceGrpc.getGetTopologyEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getListDeviceIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_DEVICE_IDS, compression))).addMethod(context.ContextServiceGrpc.getListDevicesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_DEVICES, compression))).addMethod(context.ContextServiceGrpc.getGetDeviceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_DEVICE, compression))).addMethod(context.ContextServiceGrpc.getSetDeviceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_DEVICE, compression))).addMethod(context.ContextServiceGrpc.getRemoveDeviceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_DEVICE, compression))).addMethod(context.ContextServiceGrpc.getGetDeviceEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_DEVICE_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getSelectDeviceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_DEVICE, compression))).addMethod(context.ContextServiceGrpc.getListEndPointNamesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_END_POINT_NAMES, compression))).addMethod(context.ContextServiceGrpc.getListLinkIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_LINK_IDS, compression))).addMethod(context.ContextServiceGrpc.getListLinksMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_LINKS, compression))).addMethod(context.ContextServiceGrpc.getGetLinkMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_LINK, compression))).addMethod(context.ContextServiceGrpc.getSetLinkMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_LINK, compression))).addMethod(context.ContextServiceGrpc.getRemoveLinkMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_LINK, compression))).addMethod(context.ContextServiceGrpc.getGetLinkEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_LINK_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getListServiceIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SERVICE_IDS, compression))).addMethod(context.ContextServiceGrpc.getListServicesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SERVICES, compression))).addMethod(context.ContextServiceGrpc.getGetServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getSetServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getUnsetServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_UNSET_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getRemoveServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getGetServiceEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_SERVICE_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getSelectServiceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_SERVICE, compression))).addMethod(context.ContextServiceGrpc.getListSliceIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SLICE_IDS, compression))).addMethod(context.ContextServiceGrpc.getListSlicesMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SLICES, compression))).addMethod(context.ContextServiceGrpc.getGetSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_SLICE, compression))).addMethod(context.ContextServiceGrpc.getSetSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_SLICE, compression))).addMethod(context.ContextServiceGrpc.getUnsetSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_UNSET_SLICE, compression))).addMethod(context.ContextServiceGrpc.getRemoveSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_SLICE, compression))).addMethod(context.ContextServiceGrpc.getGetSliceEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_SLICE_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getSelectSliceMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_SLICE, compression))).addMethod(context.ContextServiceGrpc.getListConnectionIdsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONNECTION_IDS, compression))).addMethod(context.ContextServiceGrpc.getListConnectionsMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONNECTIONS, compression))).addMethod(context.ContextServiceGrpc.getGetConnectionMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_CONNECTION, compression))).addMethod(context.ContextServiceGrpc.getSetConnectionMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_CONNECTION, compression))).addMethod(context.ContextServiceGrpc.getRemoveConnectionMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_CONNECTION, compression))).addMethod(context.ContextServiceGrpc.getGetConnectionEventsMethod(), asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_CONNECTION_EVENTS, compression))).addMethod(context.ContextServiceGrpc.getGetOpticalConfigMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_OPTICAL_CONFIG, compression))).addMethod(context.ContextServiceGrpc.getSetOpticalConfigMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_OPTICAL_CONFIG, compression))).addMethod(context.ContextServiceGrpc.getSelectOpticalConfigMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_OPTICAL_CONFIG, compression))).addMethod(context.ContextServiceGrpc.getSetOpticalLinkMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_SET_OPTICAL_LINK, compression))).addMethod(context.ContextServiceGrpc.getGetOpticalLinkMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_OPTICAL_LINK, compression))).addMethod(context.ContextServiceGrpc.getGetFiberMethod(), asyncUnaryCall(new MethodHandlers(this, METHODID_GET_FIBER, compression))).build(); } } @@ -546,6 +604,18 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.MutinyGrp private static final int METHODID_GET_CONNECTION_EVENTS = 48; + private static final int METHODID_GET_OPTICAL_CONFIG = 49; + + private static final int METHODID_SET_OPTICAL_CONFIG = 50; + + private static final int METHODID_SELECT_OPTICAL_CONFIG = 51; + + private static final int METHODID_SET_OPTICAL_LINK = 52; + + private static final int METHODID_GET_OPTICAL_LINK = 53; + + private static final int METHODID_GET_FIBER = 54; + private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, io.grpc.stub.ServerCalls.ServerStreamingMethod, io.grpc.stub.ServerCalls.ClientStreamingMethod, io.grpc.stub.ServerCalls.BidiStreamingMethod { private final ContextServiceImplBase serviceImpl; @@ -711,6 +781,24 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.MutinyGrp case METHODID_GET_CONNECTION_EVENTS: io.quarkus.grpc.stubs.ServerCalls.oneToMany((context.ContextOuterClass.Empty) request, (io.grpc.stub.StreamObserver) responseObserver, compression, serviceImpl::getConnectionEvents); break; + case METHODID_GET_OPTICAL_CONFIG: + io.quarkus.grpc.stubs.ServerCalls.oneToOne((context.ContextOuterClass.Empty) request, (io.grpc.stub.StreamObserver) responseObserver, compression, serviceImpl::getOpticalConfig); + break; + case METHODID_SET_OPTICAL_CONFIG: + io.quarkus.grpc.stubs.ServerCalls.oneToOne((context.ContextOuterClass.OpticalConfig) request, (io.grpc.stub.StreamObserver) responseObserver, compression, serviceImpl::setOpticalConfig); + break; + case METHODID_SELECT_OPTICAL_CONFIG: + io.quarkus.grpc.stubs.ServerCalls.oneToOne((context.ContextOuterClass.OpticalConfigId) request, (io.grpc.stub.StreamObserver) responseObserver, compression, serviceImpl::selectOpticalConfig); + break; + case METHODID_SET_OPTICAL_LINK: + io.quarkus.grpc.stubs.ServerCalls.oneToOne((context.ContextOuterClass.OpticalLink) request, (io.grpc.stub.StreamObserver) responseObserver, compression, serviceImpl::setOpticalLink); + break; + case METHODID_GET_OPTICAL_LINK: + io.quarkus.grpc.stubs.ServerCalls.oneToOne((context.ContextOuterClass.OpticalLinkId) request, (io.grpc.stub.StreamObserver) responseObserver, compression, serviceImpl::getOpticalLink); + break; + case METHODID_GET_FIBER: + io.quarkus.grpc.stubs.ServerCalls.oneToOne((context.ContextOuterClass.FiberId) request, (io.grpc.stub.StreamObserver) responseObserver, compression, serviceImpl::getFiber); + break; default: throw new java.lang.AssertionError(); } diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml index a07d73c02..f19344627 100644 --- a/src/policy/target/kubernetes/kubernetes.yml +++ b/src/policy/target/kubernetes/kubernetes.yml @@ -3,8 +3,8 @@ apiVersion: v1 kind: Service metadata: annotations: - app.quarkus.io/commit-id: 957f904f8ab4154aff01a7bfb3c7dcdecd53259a - app.quarkus.io/build-timestamp: 2024-03-29 - 11:30:06 +0000 + app.quarkus.io/commit-id: 5979d9847bc4313fb93ef1e50de27685d526cd7b + app.quarkus.io/build-timestamp: 2024-04-04 - 14:47:27 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -37,8 +37,8 @@ apiVersion: apps/v1 kind: Deployment metadata: annotations: - app.quarkus.io/commit-id: 957f904f8ab4154aff01a7bfb3c7dcdecd53259a - app.quarkus.io/build-timestamp: 2024-03-29 - 11:30:06 +0000 + app.quarkus.io/commit-id: 5979d9847bc4313fb93ef1e50de27685d526cd7b + app.quarkus.io/build-timestamp: 2024-04-04 - 14:47:27 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -46,8 +46,8 @@ metadata: labels: app: policyservice app.kubernetes.io/managed-by: quarkus - app.kubernetes.io/name: policyservice app.kubernetes.io/version: 0.1.0 + app.kubernetes.io/name: policyservice name: policyservice spec: replicas: 1 @@ -57,8 +57,8 @@ spec: template: metadata: annotations: - app.quarkus.io/commit-id: 957f904f8ab4154aff01a7bfb3c7dcdecd53259a - app.quarkus.io/build-timestamp: 2024-03-29 - 11:30:06 +0000 + app.quarkus.io/commit-id: 5979d9847bc4313fb93ef1e50de27685d526cd7b + app.quarkus.io/build-timestamp: 2024-04-04 - 14:47:27 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -66,8 +66,8 @@ spec: labels: app: policyservice app.kubernetes.io/managed-by: quarkus - app.kubernetes.io/name: policyservice app.kubernetes.io/version: 0.1.0 + app.kubernetes.io/name: policyservice spec: containers: - env: @@ -75,12 +75,12 @@ spec: valueFrom: fieldRef: fieldPath: metadata.namespace - - name: CONTEXT_SERVICE_HOST - value: contextservice - - name: MONITORING_SERVICE_HOST - value: monitoringservice - name: SERVICE_SERVICE_HOST value: serviceservice + - name: MONITORING_SERVICE_HOST + value: monitoringservice + - name: CONTEXT_SERVICE_HOST + value: contextservice image: labs.etsi.org:5050/tfs/controller/policy:0.1.0 imagePullPolicy: Always livenessProbe: -- GitLab From 2a5918013d10ce4590373805835b47414a66ea4e Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 5 Apr 2024 09:54:13 +0000 Subject: [PATCH 060/602] OFC'24 test: - Reorganized descriptor files - Reorganized node agent config files - Reorganized old node agent deploy scripts - Updated node agents deploy scripts --- src/tests/ofc24/_old/README.md | 21 +++++++++ .../{ => _old}/startExtraNetConfigAgent.sh | 0 src/tests/ofc24/{ => _old}/start_topo.sh | 0 src/tests/ofc24/deploy-node-agents.sh | 46 ++++++++----------- .../{ => descriptors}/7.service-bidir.json | 0 .../{ => descriptors}/7.service-unidir.json | 0 .../descriptors_topology.json | 0 .../{ => descriptors/old}/1.context.json | 0 .../{ => descriptors/old}/2.device1.json | 0 .../{ => descriptors/old}/3.device2.json | 0 .../{ => descriptors/old}/4.device3_R1.json | 0 .../{ => descriptors/old}/5.device4_R2.json | 0 .../ofc24/{ => descriptors/old}/6.links.json | 0 src/tests/ofc24/destroy-node-agents.sh | 22 +++++++++ .../platform_r1.xml | 0 .../platform_r2.xml | 0 .../platform_t1.xml | 0 .../platform_t2.xml | 0 .../startNetconfAgent-mg-on.sh | 15 ++++++ .../startNetconfAgent-tp.sh | 17 +++++++ .../ofc24/tempOC/files/startNetconfAgent.sh | 7 --- 21 files changed, 94 insertions(+), 34 deletions(-) create mode 100644 src/tests/ofc24/_old/README.md rename src/tests/ofc24/{ => _old}/startExtraNetConfigAgent.sh (100%) rename src/tests/ofc24/{ => _old}/start_topo.sh (100%) rename src/tests/ofc24/{ => descriptors}/7.service-bidir.json (100%) rename src/tests/ofc24/{ => descriptors}/7.service-unidir.json (100%) rename src/tests/ofc24/{ => descriptors}/descriptors_topology.json (100%) rename src/tests/ofc24/{ => descriptors/old}/1.context.json (100%) rename src/tests/ofc24/{ => descriptors/old}/2.device1.json (100%) rename src/tests/ofc24/{ => descriptors/old}/3.device2.json (100%) rename src/tests/ofc24/{ => descriptors/old}/4.device3_R1.json (100%) rename src/tests/ofc24/{ => descriptors/old}/5.device4_R2.json (100%) rename src/tests/ofc24/{ => descriptors/old}/6.links.json (100%) create mode 100755 src/tests/ofc24/destroy-node-agents.sh rename src/tests/ofc24/{tempOC/files => node-agents-config}/platform_r1.xml (100%) rename src/tests/ofc24/{tempOC/files => node-agents-config}/platform_r2.xml (100%) rename src/tests/ofc24/{tempOC/files => node-agents-config}/platform_t1.xml (100%) rename src/tests/ofc24/{tempOC/files => node-agents-config}/platform_t2.xml (100%) create mode 100755 src/tests/ofc24/node-agents-config/startNetconfAgent-mg-on.sh create mode 100755 src/tests/ofc24/node-agents-config/startNetconfAgent-tp.sh delete mode 100644 src/tests/ofc24/tempOC/files/startNetconfAgent.sh diff --git a/src/tests/ofc24/_old/README.md b/src/tests/ofc24/_old/README.md new file mode 100644 index 000000000..93e95fc64 --- /dev/null +++ b/src/tests/ofc24/_old/README.md @@ -0,0 +1,21 @@ +# OFC'24 - Test scenario + +## Start Topology +Topology is composed of 2 transponders managed through OpenConfig and 2 Multi-granular ROAMDS +Strat the topology executing the following command: +```bash +sudo ./start_topo.sh +``` + +## Populate the TFS context and topology +Pushing the JSON files following the file indexes, i.e, 1, 2, 3, ... +The last JSON file with ID 7 is the service. +To check the service is onboarded successfully go into the TFS WebUI and check the `Service` tab. + +## Check configuration in devices +Check if the devices are configured properly. +To check that, run, for each device (X={1, 2, 3, 4}): +```bash +screen -r tX +``` +To release the terminal, press `Ctrl + A + D` diff --git a/src/tests/ofc24/startExtraNetConfigAgent.sh b/src/tests/ofc24/_old/startExtraNetConfigAgent.sh similarity index 100% rename from src/tests/ofc24/startExtraNetConfigAgent.sh rename to src/tests/ofc24/_old/startExtraNetConfigAgent.sh diff --git a/src/tests/ofc24/start_topo.sh b/src/tests/ofc24/_old/start_topo.sh similarity index 100% rename from src/tests/ofc24/start_topo.sh rename to src/tests/ofc24/_old/start_topo.sh diff --git a/src/tests/ofc24/deploy-node-agents.sh b/src/tests/ofc24/deploy-node-agents.sh index d0d32e079..1c1e45526 100755 --- a/src/tests/ofc24/deploy-node-agents.sh +++ b/src/tests/ofc24/deploy-node-agents.sh @@ -17,8 +17,8 @@ TEST_NAME="ofc24" echo -echo "Pre-deploy clean-up:" -echo "--------------------" +echo "Clean-up:" +echo "---------" docker rm -f na-t1 na-t2 na-r1 na-r2 docker network rm na-br @@ -34,35 +34,33 @@ echo echo "Create Management Network and Node Agents:" echo "------------------------------------------" docker network create -d bridge --subnet=172.254.253.0/24 --gateway=172.254.253.254 --ip-range=172.254.253.0/24 na-br -docker run -d --name na-t1 --network=na-br --ip 172.254.253.1 \ - --volume "$PWD/src/tests/${TEST_NAME}/tempOC/files/platform_t1.xml:/confd/examples.confd/OC23/demoECOC21.xml" \ +docker run -dit --init --name na-t1 --network=na-br --ip 172.254.253.101 \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-tp.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t1.xml:/confd/examples.confd/OC23/platform.xml" \ asgamb1/oc23bgp.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh - #--volume "$PWD/src/tests/${TEST_NAME}/tempOC/files/startNetconfAgent.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ -docker run -d --name na-t2 --network=na-br --ip 172.254.253.2 \ - --volume "$PWD/src/tests/${TEST_NAME}/tempOC/files/platform_t2.xml:/confd/examples.confd/OC23/demoECOC21.xml" \ +docker run -dit --init --name na-t2 --network=na-br --ip 172.254.253.102 \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-tp.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t2.xml:/confd/examples.confd/OC23/platform.xml" \ asgamb1/oc23bgp.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh - #--volume "$PWD/src/tests/${TEST_NAME}/tempOC/files/startNetconfAgent.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ -docker run -d --name na-r1 --network=na-br --ip 172.254.253.101 \ - --volume "$PWD/src/tests/${TEST_NAME}/tempOC/files/platform_r1.xml:/confd/examples.confd/OC23/init_openconfig-platform.xml" \ +docker run -dit --init --name na-r1 --network=na-br --ip 172.254.253.201 \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-mg-on.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_r1.xml:/confd/examples.confd/OC23/platform.xml" \ asgamb1/flexscale-node.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh - #--volume "$PWD/src/tests/${TEST_NAME}/tempOC/files/startNetconfAgent.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ -docker run -d --name na-r2 --network=na-br --ip 172.254.253.102 \ - --volume "$PWD/src/tests/${TEST_NAME}/tempOC/files/platform_r2.xml:/confd/examples.confd/OC23/init_openconfig-platform.xml" \ +docker run -dit --init --name na-r2 --network=na-br --ip 172.254.253.202 \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-mg-on.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_r2.xml:/confd/examples.confd/OC23/platform.xml" \ asgamb1/flexscale-node.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh - #--volume "$PWD/src/tests/${TEST_NAME}/tempOC/files/startNetconfAgent.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ echo echo "Waiting for initialization..." echo "-----------------------------" docker ps -a -sleep 5 -docker ps -a while ! docker logs na-t1 2>&1 | grep -q '*** ConfD OpenConfig NETCONF agent ***'; do sleep 1; done while ! docker logs na-t2 2>&1 | grep -q '*** ConfD OpenConfig NETCONF agent ***'; do sleep 1; done while ! docker logs na-r1 2>&1 | grep -q '*** ConfD OpenConfig NETCONF agent ***'; do sleep 1; done while ! docker logs na-r2 2>&1 | grep -q '*** ConfD OpenConfig NETCONF agent ***'; do sleep 1; done -sleep 2 +sleep 3 docker ps -a @@ -70,16 +68,10 @@ echo echo "Dump Node Agent status:" echo "-----------------------" docker ps -a -#docker logs na-t1 -#docker logs na-t2 -#docker logs na-r1 -#docker logs na-r2 - +docker logs na-t1 +docker logs na-t2 +docker logs na-r1 +docker logs na-r2 -#echo -#echo "Post-test clean-up:" -#echo "-------------------" -#docker rm -f na-t1 na-t2 na-r1 na-r2 -#docker network rm na-br echo "Done!" diff --git a/src/tests/ofc24/7.service-bidir.json b/src/tests/ofc24/descriptors/7.service-bidir.json similarity index 100% rename from src/tests/ofc24/7.service-bidir.json rename to src/tests/ofc24/descriptors/7.service-bidir.json diff --git a/src/tests/ofc24/7.service-unidir.json b/src/tests/ofc24/descriptors/7.service-unidir.json similarity index 100% rename from src/tests/ofc24/7.service-unidir.json rename to src/tests/ofc24/descriptors/7.service-unidir.json diff --git a/src/tests/ofc24/descriptors_topology.json b/src/tests/ofc24/descriptors/descriptors_topology.json similarity index 100% rename from src/tests/ofc24/descriptors_topology.json rename to src/tests/ofc24/descriptors/descriptors_topology.json diff --git a/src/tests/ofc24/1.context.json b/src/tests/ofc24/descriptors/old/1.context.json similarity index 100% rename from src/tests/ofc24/1.context.json rename to src/tests/ofc24/descriptors/old/1.context.json diff --git a/src/tests/ofc24/2.device1.json b/src/tests/ofc24/descriptors/old/2.device1.json similarity index 100% rename from src/tests/ofc24/2.device1.json rename to src/tests/ofc24/descriptors/old/2.device1.json diff --git a/src/tests/ofc24/3.device2.json b/src/tests/ofc24/descriptors/old/3.device2.json similarity index 100% rename from src/tests/ofc24/3.device2.json rename to src/tests/ofc24/descriptors/old/3.device2.json diff --git a/src/tests/ofc24/4.device3_R1.json b/src/tests/ofc24/descriptors/old/4.device3_R1.json similarity index 100% rename from src/tests/ofc24/4.device3_R1.json rename to src/tests/ofc24/descriptors/old/4.device3_R1.json diff --git a/src/tests/ofc24/5.device4_R2.json b/src/tests/ofc24/descriptors/old/5.device4_R2.json similarity index 100% rename from src/tests/ofc24/5.device4_R2.json rename to src/tests/ofc24/descriptors/old/5.device4_R2.json diff --git a/src/tests/ofc24/6.links.json b/src/tests/ofc24/descriptors/old/6.links.json similarity index 100% rename from src/tests/ofc24/6.links.json rename to src/tests/ofc24/descriptors/old/6.links.json diff --git a/src/tests/ofc24/destroy-node-agents.sh b/src/tests/ofc24/destroy-node-agents.sh new file mode 100755 index 000000000..19e7fc9a9 --- /dev/null +++ b/src/tests/ofc24/destroy-node-agents.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# 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. + +echo +echo "Clean-up:" +echo "---------" +docker rm -f na-t1 na-t2 na-r1 na-r2 +docker network rm na-br + +echo "Done!" diff --git a/src/tests/ofc24/tempOC/files/platform_r1.xml b/src/tests/ofc24/node-agents-config/platform_r1.xml similarity index 100% rename from src/tests/ofc24/tempOC/files/platform_r1.xml rename to src/tests/ofc24/node-agents-config/platform_r1.xml diff --git a/src/tests/ofc24/tempOC/files/platform_r2.xml b/src/tests/ofc24/node-agents-config/platform_r2.xml similarity index 100% rename from src/tests/ofc24/tempOC/files/platform_r2.xml rename to src/tests/ofc24/node-agents-config/platform_r2.xml diff --git a/src/tests/ofc24/tempOC/files/platform_t1.xml b/src/tests/ofc24/node-agents-config/platform_t1.xml similarity index 100% rename from src/tests/ofc24/tempOC/files/platform_t1.xml rename to src/tests/ofc24/node-agents-config/platform_t1.xml diff --git a/src/tests/ofc24/tempOC/files/platform_t2.xml b/src/tests/ofc24/node-agents-config/platform_t2.xml similarity index 100% rename from src/tests/ofc24/tempOC/files/platform_t2.xml rename to src/tests/ofc24/node-agents-config/platform_t2.xml diff --git a/src/tests/ofc24/node-agents-config/startNetconfAgent-mg-on.sh b/src/tests/ofc24/node-agents-config/startNetconfAgent-mg-on.sh new file mode 100755 index 000000000..fe5ad5618 --- /dev/null +++ b/src/tests/ofc24/node-agents-config/startNetconfAgent-mg-on.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +echo 'Cleaning...' +make clean + +echo 'Rebuilding...' +make all + +echo 'Initializing database...' +cp platform.xml confd-cdb/ + +echo 'Starting ConfD...' +make start2 + +echo 'ConfD Ready!!' diff --git a/src/tests/ofc24/node-agents-config/startNetconfAgent-tp.sh b/src/tests/ofc24/node-agents-config/startNetconfAgent-tp.sh new file mode 100755 index 000000000..afc28cee7 --- /dev/null +++ b/src/tests/ofc24/node-agents-config/startNetconfAgent-tp.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +echo 'Cleaning...' +make clean + +echo 'Rebuilding...' +make all + +echo 'Initializing database...' +cp platform.xml confd-cdb/ +cp interfaces.xml confd-cdb/ +cp bgp.xml confd-cdb/ + +echo 'Starting ConfD...' +make start2 + +echo 'ConfD Ready!!' diff --git a/src/tests/ofc24/tempOC/files/startNetconfAgent.sh b/src/tests/ofc24/tempOC/files/startNetconfAgent.sh deleted file mode 100644 index 10b721883..000000000 --- a/src/tests/ofc24/tempOC/files/startNetconfAgent.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -make clean -make all -#make init -cp init_openconfig-platform.xml confd-cdb/ -#cp init_flex-scale-mg-on.xml confd-cdb/ -make start2 -- GitLab From 3f31baf859619c85d452523ff5184e6110398924 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 5 Apr 2024 10:12:21 +0000 Subject: [PATCH 061/602] GitLab CI/CD pipeline - OFC'24: - Updated pipeline manifest - Updated TFS deploy specs --- src/tests/ofc24/.gitlab-ci.yml | 28 +++++++++++++++++++++++----- src/tests/ofc24/deploy_specs.sh | 2 +- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/tests/ofc24/.gitlab-ci.yml b/src/tests/ofc24/.gitlab-ci.yml index 0b5593b16..6d5257964 100644 --- a/src/tests/ofc24/.gitlab-ci.yml +++ b/src/tests/ofc24/.gitlab-ci.yml @@ -13,9 +13,9 @@ # limitations under the License. # Build, tag, and push the Docker image to the GitLab Docker registry -build ofc22: +build ofc24: variables: - TEST_NAME: 'ofc22' + TEST_NAME: 'ofc24' stage: build before_script: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY @@ -36,13 +36,13 @@ build ofc22: - .gitlab-ci.yml # Deploy TeraFlowSDN and Execute end-2-end test -end2end_test ofc22: +end2end_test ofc24: variables: - TEST_NAME: 'ofc22' + TEST_NAME: 'ofc24' stage: end2end_test # Disable to force running it after all other tasks #needs: - # - build ofc22 + # - build ofc24 before_script: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY script: @@ -53,6 +53,9 @@ end2end_test ofc22: - microk8s status --wait-ready - kubectl get pods --all-namespaces + # Deploy Optical Device Node Agents + - ./src/tests/${TEST_NAME}/deploy-node-agents.sh + # Configure TeraFlowSDN deployment # Uncomment if DEBUG log level is needed for the components #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml @@ -87,6 +90,7 @@ end2end_test ofc22: --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" $CI_REGISTRY_IMAGE/${TEST_NAME}:latest after_script: + # Dump TeraFlowSDN component logs - source src/tests/${TEST_NAME}/deploy_specs.sh - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/deviceservice -c server @@ -94,8 +98,22 @@ end2end_test ofc22: - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/serviceservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/sliceservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/nbiservice -c server + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/opticalcontrollerservice -c server - if docker ps -a | grep ${TEST_NAME}; then docker rm -f ${TEST_NAME}; fi + + # Dump Optical Device Node Agents container status and logs + - docker ps -a + - docker logs na-t1 + - docker logs na-t2 + - docker logs na-r1 + - docker logs na-r2 + + # Destroy Optical Device Node Agents + - ./src/tests/${TEST_NAME}/destroy-node-agents.sh + + # Clean old docker images - docker images --filter="dangling=true" --quiet | xargs -r docker rmi + #coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' diff --git a/src/tests/ofc24/deploy_specs.sh b/src/tests/ofc24/deploy_specs.sh index ca5494de2..e7458dc9d 100755 --- a/src/tests/ofc24/deploy_specs.sh +++ b/src/tests/ofc24/deploy_specs.sh @@ -63,7 +63,7 @@ export TFS_K8S_NAMESPACE="tfs" export TFS_EXTRA_MANIFESTS="manifests/nginx_ingress_http.yaml" # Uncomment to monitor performance of components -export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml" +#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml" # Uncomment when deploying Optical CyberSecurity #export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml" -- GitLab From 94219359fe6d02a76291edf7a3f411fc521cec9e Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 5 Apr 2024 10:30:38 +0000 Subject: [PATCH 062/602] GitLab CI/CD pipeline - OFC'24: - Activate test in pipeline --- src/tests/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/.gitlab-ci.yml b/src/tests/.gitlab-ci.yml index 41b8bb36c..b7345bbd1 100644 --- a/src/tests/.gitlab-ci.yml +++ b/src/tests/.gitlab-ci.yml @@ -19,4 +19,4 @@ include: - local: '/src/tests/ecoc22/.gitlab-ci.yml' #- local: '/src/tests/nfvsdn22/.gitlab-ci.yml' #- local: '/src/tests/ofc23/.gitlab-ci.yml' - #- local: '/src/tests/ofc24/.gitlab-ci.yml' + - local: '/src/tests/ofc24/.gitlab-ci.yml' -- GitLab From 68bb8fdf52e87ee0e344fa436023b673cce057a4 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 5 Apr 2024 10:38:28 +0000 Subject: [PATCH 063/602] GitLab CI/CD pipeline - OFC'24: - Updated descriptor file names - Updated descriptor paths in Dockerfile --- src/tests/ofc24/Dockerfile | 4 +++- .../descriptors/{7.service-bidir.json => service-bidir.json} | 0 .../{7.service-unidir.json => service-unidir.json} | 0 .../descriptors/{descriptors_topology.json => topology.json} | 0 4 files changed, 3 insertions(+), 1 deletion(-) rename src/tests/ofc24/descriptors/{7.service-bidir.json => service-bidir.json} (100%) rename src/tests/ofc24/descriptors/{7.service-unidir.json => service-unidir.json} (100%) rename src/tests/ofc24/descriptors/{descriptors_topology.json => topology.json} (100%) diff --git a/src/tests/ofc24/Dockerfile b/src/tests/ofc24/Dockerfile index 8efa0c72c..df42fe338 100644 --- a/src/tests/ofc24/Dockerfile +++ b/src/tests/ofc24/Dockerfile @@ -82,7 +82,9 @@ COPY src/slice/__init__.py slice/__init__.py COPY src/slice/client/. slice/client/ COPY src/tests/*.py ./tests/ COPY src/tests/ofc24/__init__.py ./tests/ofc24/__init__.py -COPY src/tests/ofc24/descriptors_topology.json ./tests/ofc24/descriptors_topology.json +COPY src/tests/ofc24/descriptors/topology.json ./tests/ofc24/descriptors/topology.json +COPY src/tests/ofc24/descriptors/service-unidir.json ./tests/ofc24/descriptors/service-unidir.json +COPY src/tests/ofc24/descriptors/service-bidir.json ./tests/ofc24/descriptors/service-bidir.json COPY src/tests/ofc24/tests/. ./tests/ofc24/tests/ COPY src/tests/tools/. ./tests/tools/ diff --git a/src/tests/ofc24/descriptors/7.service-bidir.json b/src/tests/ofc24/descriptors/service-bidir.json similarity index 100% rename from src/tests/ofc24/descriptors/7.service-bidir.json rename to src/tests/ofc24/descriptors/service-bidir.json diff --git a/src/tests/ofc24/descriptors/7.service-unidir.json b/src/tests/ofc24/descriptors/service-unidir.json similarity index 100% rename from src/tests/ofc24/descriptors/7.service-unidir.json rename to src/tests/ofc24/descriptors/service-unidir.json diff --git a/src/tests/ofc24/descriptors/descriptors_topology.json b/src/tests/ofc24/descriptors/topology.json similarity index 100% rename from src/tests/ofc24/descriptors/descriptors_topology.json rename to src/tests/ofc24/descriptors/topology.json -- GitLab From 3e6e31fd85fafd18b9bab54284ab9037e1d83eea Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 5 Apr 2024 10:46:11 +0000 Subject: [PATCH 064/602] GitLab CI/CD pipeline - OFC'24: - Fixed missing file required in Dockerfile --- src/tests/ofc24/__init__.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/tests/ofc24/__init__.py diff --git a/src/tests/ofc24/__init__.py b/src/tests/ofc24/__init__.py new file mode 100644 index 000000000..1549d9811 --- /dev/null +++ b/src/tests/ofc24/__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. + -- GitLab From ab161a185b061531429cc1e6e5f35a4c30b84269 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 5 Apr 2024 11:31:42 +0000 Subject: [PATCH 065/602] GitLab CI/CD pipeline - OFC'24: - Fixed deployment of dataplane node agents - Added testsfor bidir and unidir services to Dockerfile - Updated descriptors in functional tests - Separated functional tests for bidir and unidir services - Removed unneeded KPI-related test methods --- src/tests/ofc24/.gitlab-ci.yml | 42 ++++++++++- src/tests/ofc24/Dockerfile | 10 ++- .../ofc24/tests/test_functional_bootstrap.py | 2 +- .../ofc24/tests/test_functional_cleanup.py | 2 +- ...> test_functional_create_service_bidir.py} | 42 +---------- .../test_functional_create_service_unidir.py | 68 +++++++++++++++++ ...> test_functional_delete_service_bidir.py} | 4 +- .../test_functional_delete_service_unidir.py | 74 +++++++++++++++++++ 8 files changed, 197 insertions(+), 47 deletions(-) rename src/tests/ofc24/tests/{test_functional_create_service.py => test_functional_create_service_bidir.py} (61%) create mode 100644 src/tests/ofc24/tests/test_functional_create_service_unidir.py rename src/tests/ofc24/tests/{test_functional_delete_service.py => test_functional_delete_service_bidir.py} (95%) create mode 100644 src/tests/ofc24/tests/test_functional_delete_service_unidir.py diff --git a/src/tests/ofc24/.gitlab-ci.yml b/src/tests/ofc24/.gitlab-ci.yml index 6d5257964..6dc32a181 100644 --- a/src/tests/ofc24/.gitlab-ci.yml +++ b/src/tests/ofc24/.gitlab-ci.yml @@ -45,16 +45,55 @@ end2end_test ofc24: # - build ofc24 before_script: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + - docker rm -f na-t1 na-t2 na-r1 na-r2 + - docker network rm na-br + script: # Download Docker image to run the test - docker pull "${CI_REGISTRY_IMAGE}/${TEST_NAME}:latest" + - docker pull asgamb1/oc23bgp.img:latest + - docker pull asgamb1/flexscale-node.img:latest # Check MicroK8s is ready - microk8s status --wait-ready - kubectl get pods --all-namespaces # Deploy Optical Device Node Agents - - ./src/tests/${TEST_NAME}/deploy-node-agents.sh + - > + docker network create -d bridge --subnet=172.254.253.0/24 --gateway=172.254.253.254 \ + --ip-range=172.254.253.0/24 na-br + - > + docker run -dit --init --name na-t1 --network=na-br --ip 172.254.253.101 \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-tp.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t1.xml:/confd/examples.confd/OC23/platform.xml" \ + asgamb1/oc23bgp.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh + - > + docker run -dit --init --name na-t2 --network=na-br --ip 172.254.253.102 \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-tp.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t2.xml:/confd/examples.confd/OC23/platform.xml" \ + asgamb1/oc23bgp.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh + - > + docker run -dit --init --name na-r1 --network=na-br --ip 172.254.253.201 \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-mg-on.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_r1.xml:/confd/examples.confd/OC23/platform.xml" \ + asgamb1/flexscale-node.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh + - > + docker run -dit --init --name na-r2 --network=na-br --ip 172.254.253.202 \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-mg-on.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_r2.xml:/confd/examples.confd/OC23/platform.xml" \ + asgamb1/flexscale-node.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh + + + # Wait for initialization of Optical Device Node Agents + - sleep 3 + - docker ps -a + - while ! docker logs na-t1 2>&1 | grep -q '*** ConfD OpenConfig NETCONF agent ***'; do sleep 1; done + - while ! docker logs na-t2 2>&1 | grep -q '*** ConfD OpenConfig NETCONF agent ***'; do sleep 1; done + - while ! docker logs na-r1 2>&1 | grep -q '*** ConfD OpenConfig NETCONF agent ***'; do sleep 1; done + - while ! docker logs na-r2 2>&1 | grep -q '*** ConfD OpenConfig NETCONF agent ***'; do sleep 1; done + - sleep 3 + - docker ps -a + # Configure TeraFlowSDN deployment # Uncomment if DEBUG log level is needed for the components @@ -89,6 +128,7 @@ end2end_test ofc24: --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh" --volume "$PWD/src/tests/${TEST_NAME}:/opt/results" $CI_REGISTRY_IMAGE/${TEST_NAME}:latest + after_script: # Dump TeraFlowSDN component logs - source src/tests/${TEST_NAME}/deploy_specs.sh diff --git a/src/tests/ofc24/Dockerfile b/src/tests/ofc24/Dockerfile index df42fe338..db1d1d9ef 100644 --- a/src/tests/ofc24/Dockerfile +++ b/src/tests/ofc24/Dockerfile @@ -92,10 +92,12 @@ RUN tee ./run_tests.sh < None: - """ - This test validates that KPI values have been inserted into the monitoring database. - We short k KPI descriptors to test. - """ - response = monitoring_client.GetKpiDescriptorList(Empty()) - kpi_descriptors = random.choices(response.kpi_descriptor_list, k=2) - - for kpi_descriptor in kpi_descriptors: - MSG = 'KPI(kpi_uuid={:s}, device_uuid={:s}, endpoint_uuid={:s}, service_uuid={:s}, kpi_sample_type={:s})...' - LOGGER.info(MSG.format( - str(kpi_descriptor.kpi_id.kpi_id.uuid), str(kpi_descriptor.device_id.device_uuid.uuid), - str(kpi_descriptor.endpoint_id.endpoint_uuid.uuid), str(kpi_descriptor.service_id.service_uuid.uuid), - str(KpiSampleType.Name(kpi_descriptor.kpi_sample_type)))) - response = monitoring_client.GetInstantKpi(kpi_descriptor.kpi_id) - kpi_uuid = response.kpi_id.kpi_id.uuid - assert kpi_uuid == kpi_descriptor.kpi_id.kpi_id.uuid - kpi_value_type = response.kpi_value.WhichOneof('value') - if kpi_value_type is None: - MSG = ' KPI({:s}): No instant value found' - LOGGER.warning(MSG.format(str(kpi_uuid))) - else: - kpi_timestamp = response.timestamp.timestamp - assert kpi_timestamp > 0 - assert kpi_value_type == 'floatVal' - kpi_value = getattr(response.kpi_value, kpi_value_type) - MSG = ' KPI({:s}): timestamp={:s} value_type={:s} value={:s}' - LOGGER.info(MSG.format(str(kpi_uuid), str(kpi_timestamp), str(kpi_value_type), str(kpi_value))) diff --git a/src/tests/ofc24/tests/test_functional_create_service_unidir.py b/src/tests/ofc24/tests/test_functional_create_service_unidir.py new file mode 100644 index 000000000..35d9664f7 --- /dev/null +++ b/src/tests/ofc24/tests/test_functional_create_service_unidir.py @@ -0,0 +1,68 @@ +# 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 logging, os +from common.Constants import DEFAULT_CONTEXT_NAME +from common.proto.context_pb2 import ContextId, ServiceTypeEnum +from common.tools.descriptor.Loader import DescriptorLoader +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Context import json_context_id +from context.client.ContextClient import ContextClient +from tests.Fixtures import context_client, monitoring_client # pylint: disable=unused-import +from tests.tools.mock_osm.MockOSM import MockOSM +from .Fixtures import osm_wim # pylint: disable=unused-import +from .Objects import WIM_SERVICE_CONNECTION_POINTS, WIM_SERVICE_TYPE + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +DESCRIPTOR_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'descriptors', 'service-bidir.json') +ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) + +def test_service_creation_unidir(context_client : ContextClient, osm_wim : MockOSM): # pylint: disable=redefined-outer-name + # Load descriptors and validate the base scenario + descriptor_loader = DescriptorLoader(descriptors_file=DESCRIPTOR_FILE, context_client=context_client) + descriptor_loader.validate() + + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 0 + assert len(response.slice_ids) == 0 + + # Create Connectivity Service + service_uuid = osm_wim.create_connectivity_service(WIM_SERVICE_TYPE, WIM_SERVICE_CONNECTION_POINTS) + osm_wim.get_connectivity_service_status(service_uuid) + + # Ensure slices and services are created + response = context_client.ListSlices(ADMIN_CONTEXT_ID) + LOGGER.info('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) + assert len(response.slices) == 1 # OSM slice + + response = context_client.ListServices(ADMIN_CONTEXT_ID) + LOGGER.info('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) + assert len(response.services) == 2 # 1xL3NM + 1xTAPI + + for service in response.services: + service_id = service.service_id + response = context_client.ListConnections(service_id) + LOGGER.info(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( + grpc_message_to_json_string(service_id), len(response.connections), grpc_message_to_json_string(response))) + + if service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM: + assert len(response.connections) == 1 # 1 connection per service + elif service.service_type == ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE: + assert len(response.connections) == 1 # 1 connection per service + else: + str_service = grpc_message_to_json_string(service) + raise Exception('Unexpected ServiceType: {:s}'.format(str_service)) diff --git a/src/tests/ofc24/tests/test_functional_delete_service.py b/src/tests/ofc24/tests/test_functional_delete_service_bidir.py similarity index 95% rename from src/tests/ofc24/tests/test_functional_delete_service.py rename to src/tests/ofc24/tests/test_functional_delete_service_bidir.py index daff29064..64a6161f6 100644 --- a/src/tests/ofc24/tests/test_functional_delete_service.py +++ b/src/tests/ofc24/tests/test_functional_delete_service_bidir.py @@ -26,10 +26,10 @@ from .Fixtures import osm_wim # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) -DESCRIPTOR_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'descriptors_emulated.json') +DESCRIPTOR_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'descriptors', 'service-bidir.json') ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) -def test_service_removal(context_client : ContextClient, osm_wim : MockOSM): # pylint: disable=redefined-outer-name +def test_service_removal_bidir(context_client : ContextClient, osm_wim : MockOSM): # pylint: disable=redefined-outer-name # Ensure slices and services are created response = context_client.ListSlices(ADMIN_CONTEXT_ID) LOGGER.info('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) diff --git a/src/tests/ofc24/tests/test_functional_delete_service_unidir.py b/src/tests/ofc24/tests/test_functional_delete_service_unidir.py new file mode 100644 index 000000000..ebdb60255 --- /dev/null +++ b/src/tests/ofc24/tests/test_functional_delete_service_unidir.py @@ -0,0 +1,74 @@ +# 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 logging, os +from common.Constants import DEFAULT_CONTEXT_NAME +from common.proto.context_pb2 import ContextId, ServiceTypeEnum +from common.tools.descriptor.Loader import DescriptorLoader +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Context import json_context_id +from context.client.ContextClient import ContextClient +from tests.Fixtures import context_client # pylint: disable=unused-import +from tests.tools.mock_osm.MockOSM import MockOSM +from .Fixtures import osm_wim # pylint: disable=unused-import + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +DESCRIPTOR_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'descriptors', 'service-unidir.json') +ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) + +def test_service_removal_unidir(context_client : ContextClient, osm_wim : MockOSM): # pylint: disable=redefined-outer-name + # Ensure slices and services are created + response = context_client.ListSlices(ADMIN_CONTEXT_ID) + LOGGER.info('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) + assert len(response.slices) == 1 # OSM slice + + response = context_client.ListServices(ADMIN_CONTEXT_ID) + LOGGER.info('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) + assert len(response.services) == 2 # 1xL3NM + 1xTAPI + + service_uuids = set() + for service in response.services: + service_id = service.service_id + response = context_client.ListConnections(service_id) + LOGGER.info(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( + grpc_message_to_json_string(service_id), len(response.connections), grpc_message_to_json_string(response))) + + if service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM: + assert len(response.connections) == 1 # 1 connection per service + service_uuid = service_id.service_uuid.uuid + service_uuids.add(service_uuid) + osm_wim.conn_info[service_uuid] = {} + elif service.service_type == ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE: + assert len(response.connections) == 1 # 1 connection per service + else: + str_service = grpc_message_to_json_string(service) + raise Exception('Unexpected ServiceType: {:s}'.format(str_service)) + + # Identify service to delete + assert len(service_uuids) == 1 # assume a single L3NM service has been created + service_uuid = set(service_uuids).pop() + + # Delete Connectivity Service + osm_wim.delete_connectivity_service(service_uuid) + + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + assert len(response.service_ids) == 0 + assert len(response.slice_ids) == 0 + + # Load descriptors and validate the base scenario + descriptor_loader = DescriptorLoader(descriptors_file=DESCRIPTOR_FILE, context_client=context_client) + descriptor_loader.validate() -- GitLab From 4bc7d644ffe03da28ee9882bda5faa786fe3b882 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 5 Apr 2024 11:49:37 +0000 Subject: [PATCH 066/602] GitLab CI/CD pipeline - OFC'24: - Preliminar code for create/delete bidir and unidir services - Removed unneeded files in Dockerfile --- src/tests/ofc24/Dockerfile | 5 -- .../test_functional_create_service_bidir.py | 54 ++++++------ .../test_functional_create_service_unidir.py | 54 ++++++------ .../test_functional_delete_service_bidir.py | 82 +++++++++++-------- .../test_functional_delete_service_unidir.py | 82 +++++++++++-------- 5 files changed, 156 insertions(+), 121 deletions(-) diff --git a/src/tests/ofc24/Dockerfile b/src/tests/ofc24/Dockerfile index db1d1d9ef..f9db8c367 100644 --- a/src/tests/ofc24/Dockerfile +++ b/src/tests/ofc24/Dockerfile @@ -70,10 +70,6 @@ COPY src/context/__init__.py context/__init__.py COPY src/context/client/. context/client/ COPY src/device/__init__.py device/__init__.py COPY src/device/client/. device/client/ -#COPY src/monitoring/__init__.py monitoring/__init__.py -#COPY src/monitoring/client/. monitoring/client/ -#COPY src/monitoring/__init__.py monitoring/__init__.py -#COPY src/monitoring/client/. monitoring/client/ COPY src/e2e_orchestrator/__init__.py e2e_orchestrator/__init__.py COPY src/e2e_orchestrator/client/. e2e_orchestrator/client/ COPY src/service/__init__.py service/__init__.py @@ -86,7 +82,6 @@ COPY src/tests/ofc24/descriptors/topology.json ./tests/ofc24/descriptors/topolog COPY src/tests/ofc24/descriptors/service-unidir.json ./tests/ofc24/descriptors/service-unidir.json COPY src/tests/ofc24/descriptors/service-bidir.json ./tests/ofc24/descriptors/service-bidir.json COPY src/tests/ofc24/tests/. ./tests/ofc24/tests/ -COPY src/tests/tools/. ./tests/tools/ RUN tee ./run_tests.sh < Connections[{:d}] = {:s}'.format( + LOGGER.warning(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( grpc_message_to_json_string(service_id), len(response.connections), grpc_message_to_json_string(response))) - if service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM: - assert len(response.connections) == 1 # 1 connection per service - elif service.service_type == ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE: - assert len(response.connections) == 1 # 1 connection per service - else: - str_service = grpc_message_to_json_string(service) - raise Exception('Unexpected ServiceType: {:s}'.format(str_service)) + #if service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM: + # assert len(response.connections) == 1 # 1 connection per service + #elif service.service_type == ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE: + # assert len(response.connections) == 1 # 1 connection per service + #else: + # str_service = grpc_message_to_json_string(service) + # raise Exception('Unexpected ServiceType: {:s}'.format(str_service)) diff --git a/src/tests/ofc24/tests/test_functional_create_service_unidir.py b/src/tests/ofc24/tests/test_functional_create_service_unidir.py index 35d9664f7..1cc0f43ce 100644 --- a/src/tests/ofc24/tests/test_functional_create_service_unidir.py +++ b/src/tests/ofc24/tests/test_functional_create_service_unidir.py @@ -15,14 +15,13 @@ import logging, os from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, ServiceTypeEnum -from common.tools.descriptor.Loader import DescriptorLoader +from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from tests.Fixtures import context_client, monitoring_client # pylint: disable=unused-import -from tests.tools.mock_osm.MockOSM import MockOSM -from .Fixtures import osm_wim # pylint: disable=unused-import -from .Objects import WIM_SERVICE_CONNECTION_POINTS, WIM_SERVICE_TYPE +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient +from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -30,39 +29,44 @@ LOGGER.setLevel(logging.DEBUG) DESCRIPTOR_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'descriptors', 'service-bidir.json') ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) -def test_service_creation_unidir(context_client : ContextClient, osm_wim : MockOSM): # pylint: disable=redefined-outer-name +def test_service_creation_unidir( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient, # pylint: disable=redefined-outer-name + service_client : ServiceClient, # pylint: disable=redefined-outer-name +): # Load descriptors and validate the base scenario - descriptor_loader = DescriptorLoader(descriptors_file=DESCRIPTOR_FILE, context_client=context_client) + descriptor_loader = DescriptorLoader( + descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client, + service_client=service_client + ) + results = descriptor_loader.process() + check_descriptor_load_results(results, descriptor_loader) descriptor_loader.validate() # Verify the scenario has no services/slices response = context_client.GetContext(ADMIN_CONTEXT_ID) - assert len(response.service_ids) == 0 - assert len(response.slice_ids) == 0 - - # Create Connectivity Service - service_uuid = osm_wim.create_connectivity_service(WIM_SERVICE_TYPE, WIM_SERVICE_CONNECTION_POINTS) - osm_wim.get_connectivity_service_status(service_uuid) + #assert len(response.service_ids) == 0 + #assert len(response.slice_ids) == 0 # Ensure slices and services are created response = context_client.ListSlices(ADMIN_CONTEXT_ID) - LOGGER.info('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) - assert len(response.slices) == 1 # OSM slice + LOGGER.warning('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) + #assert len(response.slices) == 1 # OSM slice response = context_client.ListServices(ADMIN_CONTEXT_ID) - LOGGER.info('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) - assert len(response.services) == 2 # 1xL3NM + 1xTAPI + LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) + #assert len(response.services) == 2 # 1xL3NM + 1xTAPI for service in response.services: service_id = service.service_id response = context_client.ListConnections(service_id) - LOGGER.info(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( + LOGGER.warning(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( grpc_message_to_json_string(service_id), len(response.connections), grpc_message_to_json_string(response))) - if service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM: - assert len(response.connections) == 1 # 1 connection per service - elif service.service_type == ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE: - assert len(response.connections) == 1 # 1 connection per service - else: - str_service = grpc_message_to_json_string(service) - raise Exception('Unexpected ServiceType: {:s}'.format(str_service)) + #if service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM: + # assert len(response.connections) == 1 # 1 connection per service + #elif service.service_type == ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE: + # assert len(response.connections) == 1 # 1 connection per service + #else: + # str_service = grpc_message_to_json_string(service) + # raise Exception('Unexpected ServiceType: {:s}'.format(str_service)) diff --git a/src/tests/ofc24/tests/test_functional_delete_service_bidir.py b/src/tests/ofc24/tests/test_functional_delete_service_bidir.py index 64a6161f6..ee0572df2 100644 --- a/src/tests/ofc24/tests/test_functional_delete_service_bidir.py +++ b/src/tests/ofc24/tests/test_functional_delete_service_bidir.py @@ -14,14 +14,14 @@ import logging, os from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceTypeEnum +from common.proto.context_pb2 import ContextId, ServiceId, ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from tests.Fixtures import context_client # pylint: disable=unused-import -from tests.tools.mock_osm.MockOSM import MockOSM -from .Fixtures import osm_wim # pylint: disable=unused-import +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient +from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -29,46 +29,62 @@ LOGGER.setLevel(logging.DEBUG) DESCRIPTOR_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'descriptors', 'service-bidir.json') ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) -def test_service_removal_bidir(context_client : ContextClient, osm_wim : MockOSM): # pylint: disable=redefined-outer-name +def test_service_removal_bidir( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient, # pylint: disable=redefined-outer-name + service_client : ServiceClient, # pylint: disable=redefined-outer-name +): + # Load descriptors and validate the base scenario + descriptor_loader = DescriptorLoader( + descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client, + service_client=service_client + ) + descriptor_loader.validate() + + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + #assert len(response.service_ids) == 0 + #assert len(response.slice_ids) == 0 + # Ensure slices and services are created response = context_client.ListSlices(ADMIN_CONTEXT_ID) - LOGGER.info('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) - assert len(response.slices) == 1 # OSM slice + LOGGER.warning('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) + #assert len(response.slices) == 1 # OSM slice response = context_client.ListServices(ADMIN_CONTEXT_ID) - LOGGER.info('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) - assert len(response.services) == 2 # 1xL3NM + 1xTAPI + LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) + #assert len(response.services) == 2 # 1xL3NM + 1xTAPI - service_uuids = set() + #service_uuids = set() for service in response.services: service_id = service.service_id response = context_client.ListConnections(service_id) - LOGGER.info(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( + LOGGER.warning(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( grpc_message_to_json_string(service_id), len(response.connections), grpc_message_to_json_string(response))) - if service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM: - assert len(response.connections) == 1 # 1 connection per service - service_uuid = service_id.service_uuid.uuid - service_uuids.add(service_uuid) - osm_wim.conn_info[service_uuid] = {} - elif service.service_type == ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE: - assert len(response.connections) == 1 # 1 connection per service - else: - str_service = grpc_message_to_json_string(service) - raise Exception('Unexpected ServiceType: {:s}'.format(str_service)) + #if service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM: + # assert len(response.connections) == 1 # 1 connection per service + # service_uuid = service_id.service_uuid.uuid + # service_uuids.add(service_uuid) + # osm_wim.conn_info[service_uuid] = {} + #elif service.service_type == ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE: + # assert len(response.connections) == 1 # 1 connection per service + #else: + # str_service = grpc_message_to_json_string(service) + # raise Exception('Unexpected ServiceType: {:s}'.format(str_service)) - # Identify service to delete - assert len(service_uuids) == 1 # assume a single L3NM service has been created - service_uuid = set(service_uuids).pop() + ## Identify service to delete + #assert len(service_uuids) == 1 # assume a single L3NM service has been created + #service_uuid = set(service_uuids).pop() - # Delete Connectivity Service - osm_wim.delete_connectivity_service(service_uuid) + ## Delete Service + #service_client.DeleteService(ServiceId(json_service_id(service_uuid, context_uuid))) - # Verify the scenario has no services/slices - response = context_client.GetContext(ADMIN_CONTEXT_ID) - assert len(response.service_ids) == 0 - assert len(response.slice_ids) == 0 + ## Verify the scenario has no services/slices + #response = context_client.GetContext(ADMIN_CONTEXT_ID) + #assert len(response.service_ids) == 0 + #assert len(response.slice_ids) == 0 - # Load descriptors and validate the base scenario - descriptor_loader = DescriptorLoader(descriptors_file=DESCRIPTOR_FILE, context_client=context_client) - descriptor_loader.validate() + ## Load descriptors and validate the base scenario + #descriptor_loader = DescriptorLoader(descriptors_file=DESCRIPTOR_FILE, context_client=context_client) + #descriptor_loader.validate() diff --git a/src/tests/ofc24/tests/test_functional_delete_service_unidir.py b/src/tests/ofc24/tests/test_functional_delete_service_unidir.py index ebdb60255..0861b103c 100644 --- a/src/tests/ofc24/tests/test_functional_delete_service_unidir.py +++ b/src/tests/ofc24/tests/test_functional_delete_service_unidir.py @@ -14,14 +14,14 @@ import logging, os from common.Constants import DEFAULT_CONTEXT_NAME -from common.proto.context_pb2 import ContextId, ServiceTypeEnum +from common.proto.context_pb2 import ContextId, ServiceId, ServiceTypeEnum from common.tools.descriptor.Loader import DescriptorLoader from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from context.client.ContextClient import ContextClient -from tests.Fixtures import context_client # pylint: disable=unused-import -from tests.tools.mock_osm.MockOSM import MockOSM -from .Fixtures import osm_wim # pylint: disable=unused-import +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient +from tests.Fixtures import context_client, device_client, service_client # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -29,46 +29,62 @@ LOGGER.setLevel(logging.DEBUG) DESCRIPTOR_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'descriptors', 'service-unidir.json') ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) -def test_service_removal_unidir(context_client : ContextClient, osm_wim : MockOSM): # pylint: disable=redefined-outer-name +def test_service_removal_unidir( + context_client : ContextClient, # pylint: disable=redefined-outer-name + device_client : DeviceClient, # pylint: disable=redefined-outer-name + service_client : ServiceClient, # pylint: disable=redefined-outer-name +): + # Load descriptors and validate the base scenario + descriptor_loader = DescriptorLoader( + descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client, + service_client=service_client + ) + descriptor_loader.validate() + + # Verify the scenario has no services/slices + response = context_client.GetContext(ADMIN_CONTEXT_ID) + #assert len(response.service_ids) == 0 + #assert len(response.slice_ids) == 0 + # Ensure slices and services are created response = context_client.ListSlices(ADMIN_CONTEXT_ID) - LOGGER.info('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) - assert len(response.slices) == 1 # OSM slice + LOGGER.warning('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response))) + #assert len(response.slices) == 1 # OSM slice response = context_client.ListServices(ADMIN_CONTEXT_ID) - LOGGER.info('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) - assert len(response.services) == 2 # 1xL3NM + 1xTAPI + LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response))) + #assert len(response.services) == 2 # 1xL3NM + 1xTAPI - service_uuids = set() + #service_uuids = set() for service in response.services: service_id = service.service_id response = context_client.ListConnections(service_id) - LOGGER.info(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( + LOGGER.warning(' ServiceId[{:s}] => Connections[{:d}] = {:s}'.format( grpc_message_to_json_string(service_id), len(response.connections), grpc_message_to_json_string(response))) - if service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM: - assert len(response.connections) == 1 # 1 connection per service - service_uuid = service_id.service_uuid.uuid - service_uuids.add(service_uuid) - osm_wim.conn_info[service_uuid] = {} - elif service.service_type == ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE: - assert len(response.connections) == 1 # 1 connection per service - else: - str_service = grpc_message_to_json_string(service) - raise Exception('Unexpected ServiceType: {:s}'.format(str_service)) + #if service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM: + # assert len(response.connections) == 1 # 1 connection per service + # service_uuid = service_id.service_uuid.uuid + # service_uuids.add(service_uuid) + # osm_wim.conn_info[service_uuid] = {} + #elif service.service_type == ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE: + # assert len(response.connections) == 1 # 1 connection per service + #else: + # str_service = grpc_message_to_json_string(service) + # raise Exception('Unexpected ServiceType: {:s}'.format(str_service)) - # Identify service to delete - assert len(service_uuids) == 1 # assume a single L3NM service has been created - service_uuid = set(service_uuids).pop() + ## Identify service to delete + #assert len(service_uuids) == 1 # assume a single L3NM service has been created + #service_uuid = set(service_uuids).pop() - # Delete Connectivity Service - osm_wim.delete_connectivity_service(service_uuid) + ## Delete Service + #service_client.DeleteService(ServiceId(json_service_id(service_uuid, context_uuid))) - # Verify the scenario has no services/slices - response = context_client.GetContext(ADMIN_CONTEXT_ID) - assert len(response.service_ids) == 0 - assert len(response.slice_ids) == 0 + ## Verify the scenario has no services/slices + #response = context_client.GetContext(ADMIN_CONTEXT_ID) + #assert len(response.service_ids) == 0 + #assert len(response.slice_ids) == 0 - # Load descriptors and validate the base scenario - descriptor_loader = DescriptorLoader(descriptors_file=DESCRIPTOR_FILE, context_client=context_client) - descriptor_loader.validate() + ## Load descriptors and validate the base scenario + #descriptor_loader = DescriptorLoader(descriptors_file=DESCRIPTOR_FILE, context_client=context_client) + #descriptor_loader.validate() -- GitLab From c999bcf7a08f869d537072d9a9ff7f3729981cc4 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 5 Apr 2024 11:54:39 +0000 Subject: [PATCH 067/602] GitLab CI/CD pipeline - OFC'24: - Updated destroy of pipeline manifest --- src/tests/ofc24/.gitlab-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/tests/ofc24/.gitlab-ci.yml b/src/tests/ofc24/.gitlab-ci.yml index 6dc32a181..8ce528244 100644 --- a/src/tests/ofc24/.gitlab-ci.yml +++ b/src/tests/ofc24/.gitlab-ci.yml @@ -46,7 +46,7 @@ end2end_test ofc24: before_script: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - docker rm -f na-t1 na-t2 na-r1 na-r2 - - docker network rm na-br + - docker network rm -f na-br script: # Download Docker image to run the test @@ -149,7 +149,8 @@ end2end_test ofc24: - docker logs na-r2 # Destroy Optical Device Node Agents - - ./src/tests/${TEST_NAME}/destroy-node-agents.sh + - docker rm -f na-t1 na-t2 na-r1 na-r2 + - docker network rm -f na-br # Clean old docker images - docker images --filter="dangling=true" --quiet | xargs -r docker rmi -- GitLab From ceebb3b77688f54a1b53cfa2de45f6375aaac84d Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 5 Apr 2024 12:42:00 +0000 Subject: [PATCH 068/602] GitLab CI/CD pipeline - OFC'24: - Fixed wrong multi-line commands in pipeline descriptor --- src/tests/ofc24/.gitlab-ci.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/tests/ofc24/.gitlab-ci.yml b/src/tests/ofc24/.gitlab-ci.yml index 8ce528244..f169bf7ee 100644 --- a/src/tests/ofc24/.gitlab-ci.yml +++ b/src/tests/ofc24/.gitlab-ci.yml @@ -60,27 +60,27 @@ end2end_test ofc24: # Deploy Optical Device Node Agents - > - docker network create -d bridge --subnet=172.254.253.0/24 --gateway=172.254.253.254 \ + docker network create -d bridge --subnet=172.254.253.0/24 --gateway=172.254.253.254 --ip-range=172.254.253.0/24 na-br - > - docker run -dit --init --name na-t1 --network=na-br --ip 172.254.253.101 \ - --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-tp.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ - --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t1.xml:/confd/examples.confd/OC23/platform.xml" \ + docker run -dit --init --name na-t1 --network=na-br --ip 172.254.253.101 + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-tp.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t1.xml:/confd/examples.confd/OC23/platform.xml" asgamb1/oc23bgp.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh - > - docker run -dit --init --name na-t2 --network=na-br --ip 172.254.253.102 \ - --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-tp.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ - --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t2.xml:/confd/examples.confd/OC23/platform.xml" \ + docker run -dit --init --name na-t2 --network=na-br --ip 172.254.253.102 + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-tp.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_t2.xml:/confd/examples.confd/OC23/platform.xml" asgamb1/oc23bgp.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh - > - docker run -dit --init --name na-r1 --network=na-br --ip 172.254.253.201 \ - --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-mg-on.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ - --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_r1.xml:/confd/examples.confd/OC23/platform.xml" \ + docker run -dit --init --name na-r1 --network=na-br --ip 172.254.253.201 + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-mg-on.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_r1.xml:/confd/examples.confd/OC23/platform.xml" asgamb1/flexscale-node.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh - > - docker run -dit --init --name na-r2 --network=na-br --ip 172.254.253.202 \ - --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-mg-on.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" \ - --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_r2.xml:/confd/examples.confd/OC23/platform.xml" \ + docker run -dit --init --name na-r2 --network=na-br --ip 172.254.253.202 + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/startNetconfAgent-mg-on.sh:/confd/examples.confd/OC23/startNetconfAgent.sh" + --volume "$PWD/src/tests/${TEST_NAME}/node-agents-config/platform_r2.xml:/confd/examples.confd/OC23/platform.xml" asgamb1/flexscale-node.img:latest /confd/examples.confd/OC23/startNetconfAgent.sh -- GitLab From 2d54c725320ceac1cf7be7d11418699654ecc2be Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 5 Apr 2024 13:14:49 +0000 Subject: [PATCH 069/602] GitLab CI/CD pipeline - OFC'22: - Corrected kubectl logs for ZTP component --- src/tests/ofc22/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/ofc22/.gitlab-ci.yml b/src/tests/ofc22/.gitlab-ci.yml index 013a389bc..810e59169 100644 --- a/src/tests/ofc22/.gitlab-ci.yml +++ b/src/tests/ofc22/.gitlab-ci.yml @@ -96,7 +96,7 @@ end2end_test ofc22: - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/sliceservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/nbiservice -c server - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/monitoringservice -c server - - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/ztpservice -c server + - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/ztpservice -c ztpservice - if docker ps -a | grep ${TEST_NAME}; then docker rm -f ${TEST_NAME}; fi - docker images --filter="dangling=true" --quiet | xargs -r docker rmi #coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' -- GitLab From 736b888aaec0de7cbe9cb8393e3b333713b163f0 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 5 Apr 2024 14:07:26 +0000 Subject: [PATCH 070/602] GitLab CI/CD pipeline - OFC'22, ECOC'22, OFC'24: - Corrected Dockerfile required files --- src/tests/ecoc22/Dockerfile | 2 -- src/tests/ofc22/Dockerfile | 2 -- src/tests/ofc24/Dockerfile | 2 ++ 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/tests/ecoc22/Dockerfile b/src/tests/ecoc22/Dockerfile index 3ac134a38..28fc91d5e 100644 --- a/src/tests/ecoc22/Dockerfile +++ b/src/tests/ecoc22/Dockerfile @@ -72,8 +72,6 @@ COPY src/device/__init__.py device/__init__.py COPY src/device/client/. device/client/ COPY src/monitoring/__init__.py monitoring/__init__.py COPY src/monitoring/client/. monitoring/client/ -COPY src/monitoring/__init__.py monitoring/__init__.py -COPY src/monitoring/client/. monitoring/client/ COPY src/e2e_orchestrator/__init__.py e2e_orchestrator/__init__.py COPY src/e2e_orchestrator/client/. e2e_orchestrator/client/ COPY src/service/__init__.py service/__init__.py diff --git a/src/tests/ofc22/Dockerfile b/src/tests/ofc22/Dockerfile index 4817bd93a..4cba83466 100644 --- a/src/tests/ofc22/Dockerfile +++ b/src/tests/ofc22/Dockerfile @@ -72,8 +72,6 @@ COPY src/device/__init__.py device/__init__.py COPY src/device/client/. device/client/ COPY src/monitoring/__init__.py monitoring/__init__.py COPY src/monitoring/client/. monitoring/client/ -COPY src/monitoring/__init__.py monitoring/__init__.py -COPY src/monitoring/client/. monitoring/client/ COPY src/e2e_orchestrator/__init__.py e2e_orchestrator/__init__.py COPY src/e2e_orchestrator/client/. e2e_orchestrator/client/ COPY src/service/__init__.py service/__init__.py diff --git a/src/tests/ofc24/Dockerfile b/src/tests/ofc24/Dockerfile index f9db8c367..bef7d25fe 100644 --- a/src/tests/ofc24/Dockerfile +++ b/src/tests/ofc24/Dockerfile @@ -70,6 +70,8 @@ COPY src/context/__init__.py context/__init__.py COPY src/context/client/. context/client/ COPY src/device/__init__.py device/__init__.py COPY src/device/client/. device/client/ +COPY src/monitoring/__init__.py monitoring/__init__.py +COPY src/monitoring/client/. monitoring/client/ COPY src/e2e_orchestrator/__init__.py e2e_orchestrator/__init__.py COPY src/e2e_orchestrator/client/. e2e_orchestrator/client/ COPY src/service/__init__.py service/__init__.py -- GitLab From 0cf73ab700e789cb9b5f3fb0cc364acffb4a1226 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 5 Apr 2024 17:24:35 +0000 Subject: [PATCH 071/602] NBI component: - Updated README.md file - Fixed libyang version in Dockerfile - Fixed libyang version in install_requirements.sh - Added folder libyang to global gitignore - Added generation of .gitignore file for libyang/build --- .gitignore | 3 +++ install_requirements.sh | 3 +++ src/nbi/Dockerfile | 3 +++ src/nbi/README.md | 3 +++ 4 files changed, 12 insertions(+) diff --git a/.gitignore b/.gitignore index a9144d669..20b98c30c 100644 --- a/.gitignore +++ b/.gitignore @@ -171,5 +171,8 @@ local_k8s_deployment.sh # asdf configuration .tool-versions +# libyang build files +libyang/ + # Other logs **/logs/*.log.* diff --git a/install_requirements.sh b/install_requirements.sh index c59ea7f13..65f60c121 100755 --- a/install_requirements.sh +++ b/install_requirements.sh @@ -32,8 +32,11 @@ sudo apt-get --yes --quiet --quiet update sudo apt-get --yes --quiet --quiet install build-essential cmake libpcre2-dev python3-dev python3-cffi mkdir libyang git clone https://github.com/CESNET/libyang.git libyang +git fetch +git checkout v2.1.148 mkdir libyang/build cd libyang/build +echo "*" > .gitignore cmake -D CMAKE_BUILD_TYPE:String="Release" .. make sudo make install diff --git a/src/nbi/Dockerfile b/src/nbi/Dockerfile index eda4d2956..cb81256da 100644 --- a/src/nbi/Dockerfile +++ b/src/nbi/Dockerfile @@ -61,6 +61,9 @@ RUN apt-get --yes --quiet --quiet update && \ rm -rf /var/lib/apt/lists/* RUN mkdir -p /var/libyang RUN git clone https://github.com/CESNET/libyang.git /var/libyang +WORKDIR /var/libyang +RUN git fetch +RUN git checkout v2.1.148 RUN mkdir -p /var/libyang/build WORKDIR /var/libyang/build RUN cmake -D CMAKE_BUILD_TYPE:String="Release" .. diff --git a/src/nbi/README.md b/src/nbi/README.md index c5ed72704..32902a0b3 100644 --- a/src/nbi/README.md +++ b/src/nbi/README.md @@ -18,6 +18,9 @@ sudo apt-get install python3-dev gcc python3-cffi ```bash mkdir ~/tfs-ctrl/libyang git clone https://github.com/CESNET/libyang.git ~/tfs-ctrl/libyang +cd ~/tfs-ctrl/libyang +git fetch +git checkout v2.1.148 mkdir ~/tfs-ctrl/libyang/build cd ~/tfs-ctrl/libyang/build cmake -D CMAKE_BUILD_TYPE:String="Release" .. -- GitLab From 50e456a0b6e1f69de9f6a3b4e3e4f1445acf3490 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 5 Apr 2024 17:47:11 +0000 Subject: [PATCH 072/602] GitLab CI/CD pipeline - OFC'24: - Added missing script headers --- .../node-agents-config/startNetconfAgent-mg-on.sh | 13 +++++++++++++ .../node-agents-config/startNetconfAgent-tp.sh | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/tests/ofc24/node-agents-config/startNetconfAgent-mg-on.sh b/src/tests/ofc24/node-agents-config/startNetconfAgent-mg-on.sh index fe5ad5618..e54496b40 100755 --- a/src/tests/ofc24/node-agents-config/startNetconfAgent-mg-on.sh +++ b/src/tests/ofc24/node-agents-config/startNetconfAgent-mg-on.sh @@ -1,4 +1,17 @@ #!/bin/bash +# 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. echo 'Cleaning...' make clean diff --git a/src/tests/ofc24/node-agents-config/startNetconfAgent-tp.sh b/src/tests/ofc24/node-agents-config/startNetconfAgent-tp.sh index afc28cee7..4e2ec0686 100755 --- a/src/tests/ofc24/node-agents-config/startNetconfAgent-tp.sh +++ b/src/tests/ofc24/node-agents-config/startNetconfAgent-tp.sh @@ -1,4 +1,17 @@ #!/bin/bash +# 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. echo 'Cleaning...' make clean -- GitLab From 500bdb62becfcb4f7dad31a7a2883db167ac54f9 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 5 Apr 2024 18:15:23 +0000 Subject: [PATCH 073/602] GitLab CI/CD pipeline - OFC'24: - Corrected IP addresses and ports of node agents in topology descriptor --- src/tests/ofc24/descriptors/topology.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/tests/ofc24/descriptors/topology.json b/src/tests/ofc24/descriptors/topology.json index 6ae521c76..85bbad55e 100644 --- a/src/tests/ofc24/descriptors/topology.json +++ b/src/tests/ofc24/descriptors/topology.json @@ -16,8 +16,8 @@ }} ], "device_config": {"config_rules": [ - {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}}, - {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "2023"}}, + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.254.253.101"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "2022"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { "username": "admin", "password": "admin", "force_running": false, "hostkey_verify": false, "look_for_keys": false, "allow_agent": false, "commit_per_rule": false, @@ -36,8 +36,8 @@ }} ], "device_config": {"config_rules": [ - {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}}, - {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "2024"}}, + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.254.253.102"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "2022"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { "username": "admin", "password": "admin", "force_running": false, "hostkey_verify": false, "look_for_keys": false, "allow_agent": false, "commit_per_rule": false, @@ -68,8 +68,8 @@ }} ], "device_config": {"config_rules": [ - {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}}, - {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "2025"}}, + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.254.253.201"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "2022"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { "username": "admin", "password": "admin", "force_running": false, "hostkey_verify": false, "look_for_keys": false, "allow_agent": false, "commit_per_rule": false, @@ -105,8 +105,8 @@ }} ], "device_config": {"config_rules": [ - {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}}, - {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "2026"}}, + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.254.253.202"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "2022"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { "username": "admin", "password": "admin", "force_running": false, "hostkey_verify": false, "look_for_keys": false, "allow_agent": false, "commit_per_rule": false, -- GitLab From 5a4fc3a6785f8fe3d0cda951bc8a5fcdf9f39e2a Mon Sep 17 00:00:00 2001 From: kpoulakakis Date: Mon, 8 Apr 2024 11:19:09 +0300 Subject: [PATCH 074/602] refactor: add headers for the new files. --- .../tfs/policy/policy/AddPolicyDeviceImpl.java | 16 ++++++++++++++++ .../tfs/policy/policy/AddPolicyServiceImpl.java | 16 ++++++++++++++++ .../tfs/policy/policy/CommonAlarmService.java | 16 ++++++++++++++++ .../policy/policy/CommonPolicyServiceImpl.java | 16 ++++++++++++++++ .../etsi/tfs/policy/policy/DeletePolicyImpl.java | 3 --- src/policy/target/kubernetes/kubernetes.yml | 16 ++++++++-------- 6 files changed, 72 insertions(+), 11 deletions(-) delete mode 100644 src/policy/src/main/java/org/etsi/tfs/policy/policy/DeletePolicyImpl.java diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyDeviceImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyDeviceImpl.java index 1d6302a28..4795273c6 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyDeviceImpl.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyDeviceImpl.java @@ -1,3 +1,19 @@ +/* +* 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. +*/ + package org.etsi.tfs.policy.policy; import static org.etsi.tfs.policy.common.ApplicationProperties.INVALID_MESSAGE; diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java index 0ee7ba3ee..5932a6412 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java @@ -1,3 +1,19 @@ +/* +* 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. +*/ + package org.etsi.tfs.policy.policy; import static org.etsi.tfs.policy.common.ApplicationProperties.INVALID_MESSAGE; diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonAlarmService.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonAlarmService.java index a5bb7df21..3cfe6491e 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonAlarmService.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonAlarmService.java @@ -1,3 +1,19 @@ +/* +* 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. +*/ + package org.etsi.tfs.policy.policy; import static org.etsi.tfs.policy.common.ApplicationProperties.PROVISIONED_POLICYRULE_STATE; diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java index 263619f81..5ebceba17 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java @@ -1,3 +1,19 @@ +/* +* 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. +*/ + package org.etsi.tfs.policy.policy; import static org.etsi.tfs.policy.common.ApplicationProperties.ACTIVE_POLICYRULE_STATE; diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/policy/DeletePolicyImpl.java b/src/policy/src/main/java/org/etsi/tfs/policy/policy/DeletePolicyImpl.java deleted file mode 100644 index d78d00b83..000000000 --- a/src/policy/src/main/java/org/etsi/tfs/policy/policy/DeletePolicyImpl.java +++ /dev/null @@ -1,3 +0,0 @@ -package org.etsi.tfs.policy.policy; - -public class DeletePolicyImpl {} diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml index f19344627..4f581f0c9 100644 --- a/src/policy/target/kubernetes/kubernetes.yml +++ b/src/policy/target/kubernetes/kubernetes.yml @@ -3,8 +3,8 @@ apiVersion: v1 kind: Service metadata: annotations: - app.quarkus.io/commit-id: 5979d9847bc4313fb93ef1e50de27685d526cd7b - app.quarkus.io/build-timestamp: 2024-04-04 - 14:47:27 +0000 + app.quarkus.io/commit-id: 182b55a46135040b71a5980de9f72d94a85db2e8 + app.quarkus.io/build-timestamp: 2024-04-08 - 08:15:43 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -37,8 +37,8 @@ apiVersion: apps/v1 kind: Deployment metadata: annotations: - app.quarkus.io/commit-id: 5979d9847bc4313fb93ef1e50de27685d526cd7b - app.quarkus.io/build-timestamp: 2024-04-04 - 14:47:27 +0000 + app.quarkus.io/commit-id: 182b55a46135040b71a5980de9f72d94a85db2e8 + app.quarkus.io/build-timestamp: 2024-04-08 - 08:15:43 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -46,8 +46,8 @@ metadata: labels: app: policyservice app.kubernetes.io/managed-by: quarkus - app.kubernetes.io/version: 0.1.0 app.kubernetes.io/name: policyservice + app.kubernetes.io/version: 0.1.0 name: policyservice spec: replicas: 1 @@ -57,8 +57,8 @@ spec: template: metadata: annotations: - app.quarkus.io/commit-id: 5979d9847bc4313fb93ef1e50de27685d526cd7b - app.quarkus.io/build-timestamp: 2024-04-04 - 14:47:27 +0000 + app.quarkus.io/commit-id: 182b55a46135040b71a5980de9f72d94a85db2e8 + app.quarkus.io/build-timestamp: 2024-04-08 - 08:15:43 +0000 prometheus.io/scrape: "true" prometheus.io/path: /q/metrics prometheus.io/port: "8080" @@ -66,8 +66,8 @@ spec: labels: app: policyservice app.kubernetes.io/managed-by: quarkus - app.kubernetes.io/version: 0.1.0 app.kubernetes.io/name: policyservice + app.kubernetes.io/version: 0.1.0 spec: containers: - env: -- GitLab From e8f6fdba780302ed14035f43a6634053b5d1bf02 Mon Sep 17 00:00:00 2001 From: Ricard Vilalta Date: Mon, 8 Apr 2024 08:37:07 +0000 Subject: [PATCH 075/602] Upload New File --- kpi_manager.proto | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 kpi_manager.proto diff --git a/kpi_manager.proto b/kpi_manager.proto new file mode 100644 index 000000000..1ef447fb3 --- /dev/null +++ b/kpi_manager.proto @@ -0,0 +1,46 @@ +syntax = "proto3"; +package monitoring; + +import "context.proto"; +import "kpi_sample_types.proto"; + +service KpiManagerService { + rpc GetKpiDescriptor (KpiId ) returns (KpiDescriptor ) {} + rpc SetKpiDescriptor (KpiDescriptor ) returns (KpiId ) {} + rpc DeleteKpiDescriptor(KpiId ) returns (context.Empty ) {} + rpc SelectKpiDescriptor(KpiDescriptorFilter) returns (KpiDescriptorList) {} +} + +message KpiId { + context.Uuid kpi_id = 1; +} + +message KpiDescriptor { + KpiId kpi_id = 1; + string kpi_description = 2; + kpi_sample_types.KpiSampleType kpi_sample_type = 3; + context.DeviceId device_id = 4; + context.EndPointId endpoint_id = 5; + context.ServiceId service_id = 6; + context.SliceId slice_id = 7; + context.ConnectionId connection_id = 8; + context.LinkId link_id = 9; +} + +message KpiDescriptorFilter { + // KPI Descriptors 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 KPI Descriptors + repeated KpiId kpi_id = 1; + repeated kpi_sample_types.KpiSampleType kpi_sample_type = 2; + repeated context.DeviceId device_id = 3; + repeated context.EndPointId endpoint_id = 4; + repeated context.ServiceId service_id = 5; + repeated context.SliceId slice_id = 6; + repeated context.ConnectionId connection_id = 7; + repeated context.LinkId link_id = 8; +} + +message KpiDescriptorList { + repeated KpiDescriptor kpi_descriptor_list = 1; +} -- GitLab From bbd1511c1051f60dd042303baf7f0d096ed6cc3d Mon Sep 17 00:00:00 2001 From: Ricard Vilalta Date: Mon, 8 Apr 2024 08:37:26 +0000 Subject: [PATCH 076/602] Delete kpi_manager.proto --- kpi_manager.proto | 46 ---------------------------------------------- 1 file changed, 46 deletions(-) delete mode 100644 kpi_manager.proto diff --git a/kpi_manager.proto b/kpi_manager.proto deleted file mode 100644 index 1ef447fb3..000000000 --- a/kpi_manager.proto +++ /dev/null @@ -1,46 +0,0 @@ -syntax = "proto3"; -package monitoring; - -import "context.proto"; -import "kpi_sample_types.proto"; - -service KpiManagerService { - rpc GetKpiDescriptor (KpiId ) returns (KpiDescriptor ) {} - rpc SetKpiDescriptor (KpiDescriptor ) returns (KpiId ) {} - rpc DeleteKpiDescriptor(KpiId ) returns (context.Empty ) {} - rpc SelectKpiDescriptor(KpiDescriptorFilter) returns (KpiDescriptorList) {} -} - -message KpiId { - context.Uuid kpi_id = 1; -} - -message KpiDescriptor { - KpiId kpi_id = 1; - string kpi_description = 2; - kpi_sample_types.KpiSampleType kpi_sample_type = 3; - context.DeviceId device_id = 4; - context.EndPointId endpoint_id = 5; - context.ServiceId service_id = 6; - context.SliceId slice_id = 7; - context.ConnectionId connection_id = 8; - context.LinkId link_id = 9; -} - -message KpiDescriptorFilter { - // KPI Descriptors 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 KPI Descriptors - repeated KpiId kpi_id = 1; - repeated kpi_sample_types.KpiSampleType kpi_sample_type = 2; - repeated context.DeviceId device_id = 3; - repeated context.EndPointId endpoint_id = 4; - repeated context.ServiceId service_id = 5; - repeated context.SliceId slice_id = 6; - repeated context.ConnectionId connection_id = 7; - repeated context.LinkId link_id = 8; -} - -message KpiDescriptorList { - repeated KpiDescriptor kpi_descriptor_list = 1; -} -- GitLab From b000c36edfcefa92d58d128832054559b3de1e89 Mon Sep 17 00:00:00 2001 From: Ricard Vilalta Date: Mon, 8 Apr 2024 08:41:29 +0000 Subject: [PATCH 077/602] Upload New File --- proto/telemetry_frontend.proto | 42 ++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 proto/telemetry_frontend.proto diff --git a/proto/telemetry_frontend.proto b/proto/telemetry_frontend.proto new file mode 100644 index 000000000..93213628e --- /dev/null +++ b/proto/telemetry_frontend.proto @@ -0,0 +1,42 @@ +syntax = "proto3"; +package device; + +import "context.proto"; +import "kpi_manager.proto"; +import "kpi_sample_types.proto"; + +service TelemetryFrontendService { + rpc StartCollector (Collector ) returns (CollectorId ) {} + rpc StopCollector (CollectorId ) returns (context.Empty) {} + rpc SelectCollectors(CollectorFilter) returns (CollectorList) {} +} + +message CollectorId { + context.Uuid collector_id = 1; +} + +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 +} + +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; +} + +message CollectorList { + repeated Collector collector_list = 1; +} -- GitLab From 60dd4d21c5ebdc626b202bf39d4fbd8538896ef1 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 8 Apr 2024 15:40:33 +0000 Subject: [PATCH 078/602] Service component: - Enhanced collection of Optical Controller settings --- src/service/service/tools/OpticalTools.py | 75 +++++++++++++++-------- 1 file changed, 51 insertions(+), 24 deletions(-) diff --git a/src/service/service/tools/OpticalTools.py b/src/service/service/tools/OpticalTools.py index 206524371..20cd6b42a 100644 --- a/src/service/service/tools/OpticalTools.py +++ b/src/service/service/tools/OpticalTools.py @@ -13,35 +13,58 @@ # limitations under the License. # -import json -import requests -import uuid -from common.Constants import * +import functools, json, logging, requests, uuid from typing import List +from common.Constants import ServiceNameEnum from common.proto.context_pb2 import( Device, DeviceId, Service, Connection, EndPointId, TopologyId, ContextId, Uuid, ConfigRule, ConfigActionEnum, ConfigRule_Custom ) from common.proto.pathcomp_pb2 import PathCompReply from common.Settings import ( - ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_environment_variables, get_env_var_name + ENVVAR_SUFIX_SERVICE_BASEURL_HTTP, ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, + find_environment_variables, get_env_var_name +) +from service.service.tools.replies import ( + reply_uni_txt, optical_band_uni_txt, reply_bid_txt, optical_band_bid_txt ) -from service.service.tools.replies import reply_uni_txt, optical_band_uni_txt, reply_bid_txt, optical_band_bid_txt log = logging.getLogger(__name__) -testing = False +TESTING = False + +get_optical_controller_setting = functools.partial(get_env_var_name, ServiceNameEnum.OPTICALCONTROLLER) +VAR_NAME_OPTICAL_CTRL_BASEURL_HTTP = get_optical_controller_setting(ENVVAR_SUFIX_SERVICE_BASEURL_HTTP) +VAR_NAME_OPTICAL_CTRL_SCHEMA = get_optical_controller_setting('SCHEMA') +VAR_NAME_OPTICAL_CTRL_HOST = get_optical_controller_setting(ENVVAR_SUFIX_SERVICE_HOST) +VAR_NAME_OPTICAL_CTRL_PORT = get_optical_controller_setting(ENVVAR_SUFIX_SERVICE_PORT_GRPC) + +OPTICAL_CTRL_BASE_URL = '{:s}://{:s}:{:s}/OpticalTFS' + +def get_optical_controller_base_url() -> str: + settings = find_environment_variables([ + VAR_NAME_OPTICAL_CTRL_BASEURL_HTTP, + VAR_NAME_OPTICAL_CTRL_SCHEMA, + VAR_NAME_OPTICAL_CTRL_HOST, + VAR_NAME_OPTICAL_CTRL_PORT, + ]) + base_url = settings.get(VAR_NAME_OPTICAL_CTRL_BASEURL_HTTP) + if base_url is not None: + log.debug('Optical Controller: base_url={:s}'.format(str(base_url))) + return base_url + + host = settings.get(VAR_NAME_OPTICAL_CTRL_HOST) + port = int(settings.get(VAR_NAME_OPTICAL_CTRL_PORT, 80)) + + MSG = 'Optical Controller not found: settings={:s}' + if host is None: raise Exception(MSG.format(str(settings))) + if port is None: raise Exception(MSG.format(str(settings))) -VAR_NAME_OPTICAL_CONTROLLER_HOST = get_env_var_name(ServiceNameEnum.OPTICALCONTROLLER, ENVVAR_SUFIX_SERVICE_HOST) -VAR_NAME_OPTICAL_CONTROLLER_PORT = get_env_var_name(ServiceNameEnum.OPTICALCONTROLLER, ENVVAR_SUFIX_SERVICE_PORT_GRPC) + schema = settings.get(VAR_NAME_OPTICAL_CTRL_SCHEMA, 'http') + base_url = OPTICAL_CTRL_BASE_URL.format(schema, host, port) + log.debug('Optical Controller: base_url={:s}'.format(str(base_url))) + return base_url -opticalcontrollers_url = find_environment_variables([ - VAR_NAME_OPTICAL_CONTROLLER_HOST, - VAR_NAME_OPTICAL_CONTROLLER_PORT, -]) -OPTICAL_IP = opticalcontrollers_url.get(VAR_NAME_OPTICAL_CONTROLLER_HOST) -OPTICAL_PORT = opticalcontrollers_url.get(VAR_NAME_OPTICAL_CONTROLLER_PORT) -log.info(str(OPTICAL_IP), str(OPTICAL_PORT)) def get_uuids_from_names(devices: List[Device], device_name: str, port_name: str): device_uuid = "" @@ -79,17 +102,18 @@ def get_device_name_from_uuid(devices: List[Device], device_uuid: str): def add_lightpath(src, dst, bitrate, bidir, ob_band) -> str: - if not testing: + if not TESTING: urlx = "" headers = {"Content-Type": "application/json"} + base_url = get_optical_controller_base_url() if ob_band is None: if bidir is None: bidir = 1 - urlx = "http://{}:{}/OpticalTFS/AddFlexLightpath/{}/{}/{}/{}".format(OPTICAL_IP, OPTICAL_PORT, src, dst, bitrate, bidir) + urlx = "{:s}/AddFlexLightpath/{:s}/{:s}/{:s}/{:s}".format(base_url, src, dst, bitrate, bidir) else: if bidir is None: bidir = 1 - urlx = "http://{}:{}/OpticalTFS/AddFlexLightpath/{}/{}/{}/{}/{}".format(OPTICAL_IP, OPTICAL_PORT, src, dst, bitrate, bidir, ob_band) + urlx = "{:s}/AddFlexLightpath/{:s}/{:s}/{:s}/{:s}/{:s}".format(base_url, src, dst, bitrate, bidir, ob_band) r = requests.put(urlx, headers=headers) reply = r.text return reply @@ -101,8 +125,9 @@ def add_lightpath(src, dst, bitrate, bidir, ob_band) -> str: def get_optical_band(idx) -> str: - if not testing: - urlx = "http://{}:{}/OpticalTFS/GetOpticalBand/{}".format(OPTICAL_IP, OPTICAL_PORT, idx) + if not TESTING: + base_url = get_optical_controller_base_url() + urlx = "{:s}/GetOpticalBand/{:s}".format(base_url, idx) headers = {"Content-Type": "application/json"} r = requests.get(urlx, headers=headers) reply = r.text @@ -116,8 +141,9 @@ def get_optical_band(idx) -> str: def delete_lightpath(flow_id, src, dst, bitrate) -> str: reply = "200" - if not testing: - urlx = "http://{}:{}/OpticalTFS/DelLightpath/{}/{}/{}/{}".format(OPTICAL_IP, OPTICAL_PORT, flow_id, src, dst, bitrate) + if not TESTING: + base_url = get_optical_controller_base_url() + urlx = "{:s}/DelLightpath/{:s}/{:s}/{:s}/{:s}".format(base_url, flow_id, src, dst, bitrate) headers = {"Content-Type": "application/json"} r = requests.delete(urlx, headers=headers) @@ -126,7 +152,8 @@ def delete_lightpath(flow_id, src, dst, bitrate) -> str: def get_lightpaths() -> str: - urlx = "http://{}:{}/OpticalTFS/GetLightpaths".format(OPTICAL_IP, OPTICAL_PORT) + base_url = get_optical_controller_base_url() + urlx = "{:s}/GetLightpaths".format(base_url) headers = {"Content-Type": "application/json"} r = requests.get(urlx, headers=headers) -- GitLab From ab3876874c0f2a88abecdb6fbf9f656c10ed65c2 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 5 Apr 2024 17:24:35 +0000 Subject: [PATCH 079/602] NBI component: - Updated README.md file - Fixed libyang version in Dockerfile - Fixed libyang version in install_requirements.sh - Added folder libyang to global gitignore - Added generation of .gitignore file for libyang/build --- .gitignore | 3 +++ install_requirements.sh | 3 +++ src/nbi/Dockerfile | 3 +++ src/nbi/README.md | 3 +++ 4 files changed, 12 insertions(+) diff --git a/.gitignore b/.gitignore index a9144d669..20b98c30c 100644 --- a/.gitignore +++ b/.gitignore @@ -171,5 +171,8 @@ local_k8s_deployment.sh # asdf configuration .tool-versions +# libyang build files +libyang/ + # Other logs **/logs/*.log.* diff --git a/install_requirements.sh b/install_requirements.sh index c59ea7f13..65f60c121 100755 --- a/install_requirements.sh +++ b/install_requirements.sh @@ -32,8 +32,11 @@ sudo apt-get --yes --quiet --quiet update sudo apt-get --yes --quiet --quiet install build-essential cmake libpcre2-dev python3-dev python3-cffi mkdir libyang git clone https://github.com/CESNET/libyang.git libyang +git fetch +git checkout v2.1.148 mkdir libyang/build cd libyang/build +echo "*" > .gitignore cmake -D CMAKE_BUILD_TYPE:String="Release" .. make sudo make install diff --git a/src/nbi/Dockerfile b/src/nbi/Dockerfile index eda4d2956..cb81256da 100644 --- a/src/nbi/Dockerfile +++ b/src/nbi/Dockerfile @@ -61,6 +61,9 @@ RUN apt-get --yes --quiet --quiet update && \ rm -rf /var/lib/apt/lists/* RUN mkdir -p /var/libyang RUN git clone https://github.com/CESNET/libyang.git /var/libyang +WORKDIR /var/libyang +RUN git fetch +RUN git checkout v2.1.148 RUN mkdir -p /var/libyang/build WORKDIR /var/libyang/build RUN cmake -D CMAKE_BUILD_TYPE:String="Release" .. diff --git a/src/nbi/README.md b/src/nbi/README.md index c5ed72704..32902a0b3 100644 --- a/src/nbi/README.md +++ b/src/nbi/README.md @@ -18,6 +18,9 @@ sudo apt-get install python3-dev gcc python3-cffi ```bash mkdir ~/tfs-ctrl/libyang git clone https://github.com/CESNET/libyang.git ~/tfs-ctrl/libyang +cd ~/tfs-ctrl/libyang +git fetch +git checkout v2.1.148 mkdir ~/tfs-ctrl/libyang/build cd ~/tfs-ctrl/libyang/build cmake -D CMAKE_BUILD_TYPE:String="Release" .. -- GitLab From 5377075da4798b96b470a2f218bb0a7e55e2ee33 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 8 Apr 2024 16:36:02 +0000 Subject: [PATCH 080/602] GitLab CI/CD pipeline - OFC'24: - Correct order of TFS components being deployed when optical controller is activated --- src/tests/ofc24/deploy_specs.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/tests/ofc24/deploy_specs.sh b/src/tests/ofc24/deploy_specs.sh index e7458dc9d..4ade75923 100755 --- a/src/tests/ofc24/deploy_specs.sh +++ b/src/tests/ofc24/deploy_specs.sh @@ -30,7 +30,14 @@ export TFS_COMPONENTS="context device pathcomp service slice nbi webui" #export TFS_COMPONENTS="${TFS_COMPONENTS} bgpls_speaker" # Uncomment to activate Optical Controller -export TFS_COMPONENTS="${TFS_COMPONENTS} opticalcontroller" +# To manage optical connections, "service" requires "opticalcontroller" to be deployed +# before "service", thus we "hack" the TFS_COMPONENTS environment variable prepending the +# "opticalcontroller" only if "service" is already in TFS_COMPONENTS, and re-export it. +if [[ "$TFS_COMPONENTS" == *"service"* ]]; then + BEFORE="${TFS_COMPONENTS% service*}" + AFTER="${TFS_COMPONENTS#* service}" + export TFS_COMPONENTS="${BEFORE} opticalcontroller service ${AFTER}" +fi # Uncomment to activate ZTP #export TFS_COMPONENTS="${TFS_COMPONENTS} ztp" -- GitLab From afff124ff02a3f296d398c4d31920b5ade33abcb Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 8 Apr 2024 17:03:40 +0000 Subject: [PATCH 081/602] Renamed TeraFlowSDN Debug-API to TFS-API --- manifests/nginx_ingress_http.yaml | 2 +- ...pi.sh => run_tests_locally-nbi-tfs-api.sh} | 2 +- .../drivers/flexscale/FlexScaleDriver.py | 8 +-- .../drivers/ietf_l2vpn/IetfL2VpnDriver.py | 8 +-- .../{TfsDebugApiClient.py => TfsApiClient.py} | 6 +-- src/nbi/.gitlab-ci.yml | 2 +- src/nbi/service/__main__.py | 4 +- .../{debug_api => tfs_api}/Resources.py | 0 .../{debug_api => tfs_api}/Tools.py | 0 .../{debug_api => tfs_api}/__init__.py | 4 +- src/nbi/tests/PrepareTestScenario.py | 4 +- ...ebug_api_dummy.json => tfs_api_dummy.json} | 0 .../{test_debug_api.py => test_tfs_api.py} | 50 +++++++++---------- src/webui/service/templates/main/debug.html | 8 +-- 14 files changed, 49 insertions(+), 49 deletions(-) rename scripts/{run_tests_locally-nbi-debug-api.sh => run_tests_locally-nbi-tfs-api.sh} (96%) rename src/device/service/drivers/ietf_l2vpn/{TfsDebugApiClient.py => TfsApiClient.py} (97%) rename src/nbi/service/rest_server/nbi_plugins/{debug_api => tfs_api}/Resources.py (100%) rename src/nbi/service/rest_server/nbi_plugins/{debug_api => tfs_api}/Tools.py (100%) rename src/nbi/service/rest_server/nbi_plugins/{debug_api => tfs_api}/__init__.py (97%) rename src/nbi/tests/data/{debug_api_dummy.json => tfs_api_dummy.json} (100%) rename src/nbi/tests/{test_debug_api.py => test_tfs_api.py} (83%) diff --git a/manifests/nginx_ingress_http.yaml b/manifests/nginx_ingress_http.yaml index 91440fb7a..2b63e5c1c 100644 --- a/manifests/nginx_ingress_http.yaml +++ b/manifests/nginx_ingress_http.yaml @@ -43,7 +43,7 @@ spec: name: nbiservice port: number: 8080 - - path: /()(debug-api/.*) + - path: /()(tfs-api/.*) pathType: Prefix backend: service: diff --git a/scripts/run_tests_locally-nbi-debug-api.sh b/scripts/run_tests_locally-nbi-tfs-api.sh similarity index 96% rename from scripts/run_tests_locally-nbi-debug-api.sh rename to scripts/run_tests_locally-nbi-tfs-api.sh index 218bad8c5..ee195963b 100755 --- a/scripts/run_tests_locally-nbi-debug-api.sh +++ b/scripts/run_tests_locally-nbi-tfs-api.sh @@ -22,4 +22,4 @@ RCFILE=$PROJECTDIR/coverage/.coveragerc # Run unitary tests and analyze coverage of code at same time # 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 \ - nbi/tests/test_debug_api.py + nbi/tests/test_tfs_api.py diff --git a/src/device/service/drivers/flexscale/FlexScaleDriver.py b/src/device/service/drivers/flexscale/FlexScaleDriver.py index f91ee1ceb..25a94cad2 100644 --- a/src/device/service/drivers/flexscale/FlexScaleDriver.py +++ b/src/device/service/drivers/flexscale/FlexScaleDriver.py @@ -21,7 +21,7 @@ from device.service.driver_api._Driver import _Driver from . import ALL_RESOURCE_KEYS from .Tools import find_key, add_lightpath, del_lightpath, get_lightpaths from device.service.driver_api._Driver import _Driver, RESOURCE_ENDPOINTS -from device.service.drivers.ietf_l2vpn.TfsDebugApiClient import TfsDebugApiClient +from device.service.drivers.ietf_l2vpn.TfsApiClient import TfsApiClient from device.service.driver_api.ImportTopologyEnum import ImportTopologyEnum, get_import_topology LOGGER = logging.getLogger(__name__) @@ -40,7 +40,7 @@ class FlexScaleDriver(_Driver): password = self.settings.get('password') self.__auth = HTTPBasicAuth(username, password) if username is not None and password is not None else None scheme = self.settings.get('scheme', 'http') - self.dac = TfsDebugApiClient(self.address, int(self.port), scheme=scheme, username=username, password=password) + self.tac = TfsApiClient(self.address, int(self.port), scheme=scheme, username=username, password=password) self.__flexscale_root = '{:s}://{:s}:{:d}'.format(scheme, self.address, int(self.port)) self.__timeout = int(self.settings.get('timeout', 120)) @@ -90,8 +90,8 @@ class FlexScaleDriver(_Driver): chk_string(str_resource_name, resource_key, allow_empty=False) if resource_key == RESOURCE_ENDPOINTS: - # return endpoints through debug-api and list-devices method - results.extend(self.dac.get_devices_endpoints(self.__import_topology)) + # return endpoints through TFS NBI API and list-devices method + results.extend(self.tac.get_devices_endpoints(self.__import_topology)) # results.extend(get_lightpaths( # self.__flexscale_root, resource_key, timeout=self.__timeout, auth=self.__auth)) diff --git a/src/device/service/drivers/ietf_l2vpn/IetfL2VpnDriver.py b/src/device/service/drivers/ietf_l2vpn/IetfL2VpnDriver.py index c79dde99a..07036fcf3 100644 --- a/src/device/service/drivers/ietf_l2vpn/IetfL2VpnDriver.py +++ b/src/device/service/drivers/ietf_l2vpn/IetfL2VpnDriver.py @@ -20,7 +20,7 @@ from common.tools.object_factory.EndPoint import json_endpoint_id from common.type_checkers.Checkers import chk_string, chk_type from device.service.driver_api._Driver import _Driver, RESOURCE_ENDPOINTS, RESOURCE_SERVICES from device.service.driver_api.ImportTopologyEnum import ImportTopologyEnum, get_import_topology -from device.service.drivers.ietf_l2vpn.TfsDebugApiClient import TfsDebugApiClient +from device.service.drivers.ietf_l2vpn.TfsApiClient import TfsApiClient from .Tools import connection_point, wim_mapping from .WimconnectorIETFL2VPN import WimconnectorIETFL2VPN @@ -56,7 +56,7 @@ class IetfL2VpnDriver(_Driver): wim_account = {'user': username, 'password': password} # Mapping updated dynamically with each request config = {'mapping_not_needed': False, 'service_endpoint_mapping': []} - self.dac = TfsDebugApiClient(self.address, int(self.port), scheme=scheme, username=username, password=password) + self.tac = TfsApiClient(self.address, int(self.port), scheme=scheme, username=username, password=password) self.wim = WimconnectorIETFL2VPN(wim, wim_account, config=config) self.conn_info = {} # internal database emulating OSM storage provided to WIM Connectors @@ -101,8 +101,8 @@ class IetfL2VpnDriver(_Driver): try: chk_string(str_resource_name, resource_key, allow_empty=False) if resource_key == RESOURCE_ENDPOINTS: - # return endpoints through debug-api and list-devices method - results.extend(self.dac.get_devices_endpoints(self.__import_topology)) + # return endpoints through TFS NBI API and list-devices method + results.extend(self.tac.get_devices_endpoints(self.__import_topology)) elif resource_key == RESOURCE_SERVICES: # return all services through reply = self.wim.get_all_active_connectivity_services() diff --git a/src/device/service/drivers/ietf_l2vpn/TfsDebugApiClient.py b/src/device/service/drivers/ietf_l2vpn/TfsApiClient.py similarity index 97% rename from src/device/service/drivers/ietf_l2vpn/TfsDebugApiClient.py rename to src/device/service/drivers/ietf_l2vpn/TfsApiClient.py index 06c55c5dc..70e7ec295 100644 --- a/src/device/service/drivers/ietf_l2vpn/TfsDebugApiClient.py +++ b/src/device/service/drivers/ietf_l2vpn/TfsApiClient.py @@ -17,8 +17,8 @@ from requests.auth import HTTPBasicAuth from typing import Dict, List, Optional from device.service.driver_api.ImportTopologyEnum import ImportTopologyEnum -GET_DEVICES_URL = '{:s}://{:s}:{:d}/restconf/debug-api/devices' -GET_LINKS_URL = '{:s}://{:s}:{:d}/restconf/debug-api/links' +GET_DEVICES_URL = '{:s}://{:s}:{:d}/tfs-api/devices' +GET_LINKS_URL = '{:s}://{:s}:{:d}/tfs-api/links' TIMEOUT = 30 HTTP_OK_CODES = { @@ -51,7 +51,7 @@ MSG_ERROR = 'Could not retrieve devices in remote TeraFlowSDN instance({:s}). st LOGGER = logging.getLogger(__name__) -class TfsDebugApiClient: +class TfsApiClient: def __init__( self, address : str, port : int, scheme : str = 'http', username : Optional[str] = None, password : Optional[str] = None diff --git a/src/nbi/.gitlab-ci.yml b/src/nbi/.gitlab-ci.yml index 2f7110202..219e90132 100644 --- a/src/nbi/.gitlab-ci.yml +++ b/src/nbi/.gitlab-ci.yml @@ -66,7 +66,7 @@ unit_test nbi: - sleep 5 - docker ps -a - docker logs $IMAGE_NAME - - docker exec -i $IMAGE_NAME bash -c "coverage run --append -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_debug_api.py --junitxml=/opt/results/${IMAGE_NAME}_report_debug_api.xml" + - docker exec -i $IMAGE_NAME bash -c "coverage run --append -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_tfs_api.py --junitxml=/opt/results/${IMAGE_NAME}_report_tfs_api.xml" - docker exec -i $IMAGE_NAME bash -c "coverage run --append -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_ietf_l2vpn.py --junitxml=/opt/results/${IMAGE_NAME}_report_ietf_l2vpn.xml" - docker exec -i $IMAGE_NAME bash -c "coverage run --append -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_ietf_network.py --junitxml=/opt/results/${IMAGE_NAME}_report_ietf_network.xml" - docker exec -i $IMAGE_NAME bash -c "coverage run --append -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_ietf_l3vpn.py --junitxml=/opt/results/${IMAGE_NAME}_report_ietf_l3vpn.xml" diff --git a/src/nbi/service/__main__.py b/src/nbi/service/__main__.py index 8834e45a2..1ccacd6d3 100644 --- a/src/nbi/service/__main__.py +++ b/src/nbi/service/__main__.py @@ -20,12 +20,12 @@ from common.Settings import ( wait_for_environment_variables) from .NbiService import NbiService from .rest_server.RestServer import RestServer -from .rest_server.nbi_plugins.debug_api import register_debug_api from .rest_server.nbi_plugins.etsi_bwm import register_etsi_bwm_api from .rest_server.nbi_plugins.ietf_l2vpn import register_ietf_l2vpn from .rest_server.nbi_plugins.ietf_l3vpn import register_ietf_l3vpn from .rest_server.nbi_plugins.ietf_network import register_ietf_network from .rest_server.nbi_plugins.ietf_network_slice import register_ietf_nss +from .rest_server.nbi_plugins.tfs_api import register_tfs_api terminate = threading.Event() LOGGER = None @@ -62,12 +62,12 @@ def main(): grpc_service.start() rest_server = RestServer() - register_debug_api(rest_server) register_etsi_bwm_api(rest_server) register_ietf_l2vpn(rest_server) # Registering L2VPN entrypoint register_ietf_l3vpn(rest_server) # Registering L3VPN entrypoint register_ietf_network(rest_server) register_ietf_nss(rest_server) # Registering NSS entrypoint + register_tfs_api(rest_server) rest_server.start() # Wait for Ctrl+C or termination signal diff --git a/src/nbi/service/rest_server/nbi_plugins/debug_api/Resources.py b/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py similarity index 100% rename from src/nbi/service/rest_server/nbi_plugins/debug_api/Resources.py rename to src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py diff --git a/src/nbi/service/rest_server/nbi_plugins/debug_api/Tools.py b/src/nbi/service/rest_server/nbi_plugins/tfs_api/Tools.py similarity index 100% rename from src/nbi/service/rest_server/nbi_plugins/debug_api/Tools.py rename to src/nbi/service/rest_server/nbi_plugins/tfs_api/Tools.py diff --git a/src/nbi/service/rest_server/nbi_plugins/debug_api/__init__.py b/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py similarity index 97% rename from src/nbi/service/rest_server/nbi_plugins/debug_api/__init__.py rename to src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py index 1ccf93144..cc622e1f9 100644 --- a/src/nbi/service/rest_server/nbi_plugins/debug_api/__init__.py +++ b/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py @@ -25,7 +25,7 @@ from .Resources import ( Topologies, Topology, TopologyIds ) -URL_PREFIX = '/debug-api' +URL_PREFIX = '/tfs-api' # Use 'path' type since some identifiers might contain char '/' and Flask is unable to recognize them in 'string' type. RESOURCES = [ @@ -64,6 +64,6 @@ RESOURCES = [ ('api.policyrule', PolicyRule, '/policyrule/'), ] -def register_debug_api(rest_server : RestServer): +def register_tfs_api(rest_server : RestServer): for endpoint_name, resource_class, resource_url in RESOURCES: rest_server.add_resource(resource_class, URL_PREFIX + resource_url, endpoint=endpoint_name) diff --git a/src/nbi/tests/PrepareTestScenario.py b/src/nbi/tests/PrepareTestScenario.py index 461245e09..ab477fb0b 100644 --- a/src/nbi/tests/PrepareTestScenario.py +++ b/src/nbi/tests/PrepareTestScenario.py @@ -21,11 +21,11 @@ from common.Settings import ( ) from context.client.ContextClient import ContextClient from nbi.service.rest_server.RestServer import RestServer -from nbi.service.rest_server.nbi_plugins.debug_api import register_debug_api from nbi.service.rest_server.nbi_plugins.etsi_bwm import register_etsi_bwm_api from nbi.service.rest_server.nbi_plugins.ietf_l2vpn import register_ietf_l2vpn from nbi.service.rest_server.nbi_plugins.ietf_l3vpn import register_ietf_l3vpn from nbi.service.rest_server.nbi_plugins.ietf_network import register_ietf_network +from nbi.service.rest_server.nbi_plugins.tfs_api import register_tfs_api from nbi.tests.MockService_Dependencies import MockService_Dependencies from service.client.ServiceClient import ServiceClient from slice.client.SliceClient import SliceClient @@ -49,11 +49,11 @@ def mock_service(): @pytest.fixture(scope='session') def nbi_service_rest(mock_service : MockService_Dependencies): # pylint: disable=redefined-outer-name, unused-argument _rest_server = RestServer() - register_debug_api(_rest_server) register_etsi_bwm_api(_rest_server) register_ietf_l2vpn(_rest_server) register_ietf_l3vpn(_rest_server) register_ietf_network(_rest_server) + register_tfs_api(_rest_server) _rest_server.start() time.sleep(1) # bring time for the server to start yield _rest_server diff --git a/src/nbi/tests/data/debug_api_dummy.json b/src/nbi/tests/data/tfs_api_dummy.json similarity index 100% rename from src/nbi/tests/data/debug_api_dummy.json rename to src/nbi/tests/data/tfs_api_dummy.json diff --git a/src/nbi/tests/test_debug_api.py b/src/nbi/tests/test_tfs_api.py similarity index 83% rename from src/nbi/tests/test_debug_api.py rename to src/nbi/tests/test_tfs_api.py index f19531eae..91aa64b4e 100644 --- a/src/nbi/tests/test_debug_api.py +++ b/src/nbi/tests/test_tfs_api.py @@ -39,7 +39,7 @@ from .PrepareTestScenario import ( # pylint: disable=unused-import LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) -DESCRIPTOR_FILE = 'nbi/tests/data/debug_api_dummy.json' +DESCRIPTOR_FILE = 'nbi/tests/data/tfs_api_dummy.json' JSON_ADMIN_CONTEXT_ID = json_context_id(DEFAULT_CONTEXT_NAME) ADMIN_CONTEXT_ID = ContextId(**JSON_ADMIN_CONTEXT_ID) @@ -64,16 +64,16 @@ def test_prepare_environment(context_client : ContextClient) -> None: # pylint: # ----- Context -------------------------------------------------------------------------------------------------------- def test_rest_get_context_ids(nbi_service_rest: RestServer): # pylint: disable=redefined-outer-name, unused-argument - reply = do_rest_get_request('/debug-api/context_ids') + reply = do_rest_get_request('/tfs-api/context_ids') validate_context_ids(reply) def test_rest_get_contexts(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument - reply = do_rest_get_request('/debug-api/contexts') + reply = do_rest_get_request('/tfs-api/contexts') validate_contexts(reply) def test_rest_get_context(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) - reply = do_rest_get_request('/debug-api/context/{:s}'.format(context_uuid)) + reply = do_rest_get_request('/tfs-api/context/{:s}'.format(context_uuid)) validate_context(reply) @@ -81,50 +81,50 @@ def test_rest_get_context(nbi_service_rest : RestServer): # pylint: disable=rede def test_rest_get_topology_ids(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) - reply = do_rest_get_request('/debug-api/context/{:s}/topology_ids'.format(context_uuid)) + reply = do_rest_get_request('/tfs-api/context/{:s}/topology_ids'.format(context_uuid)) validate_topology_ids(reply) def test_rest_get_topologies(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) - reply = do_rest_get_request('/debug-api/context/{:s}/topologies'.format(context_uuid)) + reply = do_rest_get_request('/tfs-api/context/{:s}/topologies'.format(context_uuid)) validate_topologies(reply) def test_rest_get_topology(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) topology_uuid = urllib.parse.quote(DEFAULT_TOPOLOGY_NAME) - reply = do_rest_get_request('/debug-api/context/{:s}/topology/{:s}'.format(context_uuid, topology_uuid)) + reply = do_rest_get_request('/tfs-api/context/{:s}/topology/{:s}'.format(context_uuid, topology_uuid)) validate_topology(reply, num_devices=3, num_links=6) # ----- Device --------------------------------------------------------------------------------------------------------- def test_rest_get_device_ids(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument - reply = do_rest_get_request('/debug-api/device_ids') + reply = do_rest_get_request('/tfs-api/device_ids') validate_device_ids(reply) def test_rest_get_devices(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument - reply = do_rest_get_request('/debug-api/devices') + reply = do_rest_get_request('/tfs-api/devices') validate_devices(reply) def test_rest_get_device(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument device_uuid = urllib.parse.quote('R1', safe='') - reply = do_rest_get_request('/debug-api/device/{:s}'.format(device_uuid)) + reply = do_rest_get_request('/tfs-api/device/{:s}'.format(device_uuid)) validate_device(reply) # ----- Link ----------------------------------------------------------------------------------------------------------- def test_rest_get_link_ids(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument - reply = do_rest_get_request('/debug-api/link_ids') + reply = do_rest_get_request('/tfs-api/link_ids') validate_link_ids(reply) def test_rest_get_links(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument - reply = do_rest_get_request('/debug-api/links') + reply = do_rest_get_request('/tfs-api/links') validate_links(reply) def test_rest_get_link(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument link_uuid = urllib.parse.quote('R1/502==R2/501', safe='') - reply = do_rest_get_request('/debug-api/link/{:s}'.format(link_uuid)) + reply = do_rest_get_request('/tfs-api/link/{:s}'.format(link_uuid)) validate_link(reply) @@ -132,18 +132,18 @@ def test_rest_get_link(nbi_service_rest : RestServer): # pylint: disable=redefin def test_rest_get_service_ids(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) - reply = do_rest_get_request('/debug-api/context/{:s}/service_ids'.format(context_uuid)) + reply = do_rest_get_request('/tfs-api/context/{:s}/service_ids'.format(context_uuid)) validate_service_ids(reply) def test_rest_get_services(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) - reply = do_rest_get_request('/debug-api/context/{:s}/services'.format(context_uuid)) + reply = do_rest_get_request('/tfs-api/context/{:s}/services'.format(context_uuid)) validate_services(reply) def test_rest_get_service(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) service_uuid = urllib.parse.quote('SVC:R1/200==R2/200', safe='') - reply = do_rest_get_request('/debug-api/context/{:s}/service/{:s}'.format(context_uuid, service_uuid)) + reply = do_rest_get_request('/tfs-api/context/{:s}/service/{:s}'.format(context_uuid, service_uuid)) validate_service(reply) @@ -151,18 +151,18 @@ def test_rest_get_service(nbi_service_rest : RestServer): # pylint: disable=rede def test_rest_get_slice_ids(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) - reply = do_rest_get_request('/debug-api/context/{:s}/slice_ids'.format(context_uuid)) + reply = do_rest_get_request('/tfs-api/context/{:s}/slice_ids'.format(context_uuid)) validate_slice_ids(reply) def test_rest_get_slices(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) - reply = do_rest_get_request('/debug-api/context/{:s}/slices'.format(context_uuid)) + reply = do_rest_get_request('/tfs-api/context/{:s}/slices'.format(context_uuid)) validate_slices(reply) def test_rest_get_slice(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) slice_uuid = urllib.parse.quote('SLC:R1-R2-R3', safe='') - reply = do_rest_get_request('/debug-api/context/{:s}/slice/{:s}'.format(context_uuid, slice_uuid)) + reply = do_rest_get_request('/tfs-api/context/{:s}/slice/{:s}'.format(context_uuid, slice_uuid)) validate_slice(reply) @@ -171,33 +171,33 @@ def test_rest_get_slice(nbi_service_rest : RestServer): # pylint: disable=redefi def test_rest_get_connection_ids(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) service_uuid = urllib.parse.quote('SVC:R1/200==R2/200', safe='') - reply = do_rest_get_request('/debug-api/context/{:s}/service/{:s}/connection_ids'.format(context_uuid, service_uuid)) + reply = do_rest_get_request('/tfs-api/context/{:s}/service/{:s}/connection_ids'.format(context_uuid, service_uuid)) validate_connection_ids(reply) def test_rest_get_connections(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) service_uuid = urllib.parse.quote('SVC:R1/200==R2/200', safe='') - reply = do_rest_get_request('/debug-api/context/{:s}/service/{:s}/connections'.format(context_uuid, service_uuid)) + reply = do_rest_get_request('/tfs-api/context/{:s}/service/{:s}/connections'.format(context_uuid, service_uuid)) validate_connections(reply) def test_rest_get_connection(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument connection_uuid = urllib.parse.quote('CON:R1/200==R2/200:1', safe='') - reply = do_rest_get_request('/debug-api/connection/{:s}'.format(connection_uuid)) + reply = do_rest_get_request('/tfs-api/connection/{:s}'.format(connection_uuid)) validate_connection(reply) # ----- Policy --------------------------------------------------------------------------------------------------------- #def test_rest_get_policyrule_ids(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument -# reply = do_rest_get_request('/debug-api/policyrule_ids') +# reply = do_rest_get_request('/tfs-api/policyrule_ids') # validate_policyrule_ids(reply) #def test_rest_get_policyrules(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument -# reply = do_rest_get_request('/debug-api/policyrules') +# reply = do_rest_get_request('/tfs-api/policyrules') # validate_policyrules(reply) #def test_rest_get_policyrule(nbi_service_rest : RestServer): # pylint: disable=redefined-outer-name, unused-argument # policyrule_uuid_quoted = urllib.parse.quote(policyrule_uuid, safe='') -# reply = do_rest_get_request('/debug-api/policyrule/{:s}'.format(policyrule_uuid_quoted)) +# reply = do_rest_get_request('/tfs-api/policyrule/{:s}'.format(policyrule_uuid_quoted)) # validate_policyrule(reply) diff --git a/src/webui/service/templates/main/debug.html b/src/webui/service/templates/main/debug.html index a6964d588..f6ec5a501 100644 --- a/src/webui/service/templates/main/debug.html +++ b/src/webui/service/templates/main/debug.html @@ -20,10 +20,10 @@

Debug API

{% endblock %} -- GitLab From aa7cb3a03cd723f9b109c709bdcb08e53d064a0b Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 8 Apr 2024 17:20:32 +0000 Subject: [PATCH 082/602] Renamed FLEXSCALE SBI Driver to Optical TFS SBI Driver --- proto/context.proto | 2 +- src/common/type_checkers/Assertions.py | 2 +- .../database/models/enums/DeviceDriver.py | 2 +- src/device/service/drivers/__init__.py | 6 +++--- .../drivers/ietf_l2vpn/TfsDebugApiClient.py | 4 +++- .../OpticalTfsDriver.py} | 20 +++++++++---------- .../{flexscale => optical_tfs}/Tools.py | 0 .../{flexscale => optical_tfs}/__init__.py | 0 .../java/org/etsi/tfs/policy/Serializer.java | 8 ++++---- .../context/model/DeviceDriverEnum.java | 2 +- .../org/etsi/tfs/policy/SerializerTest.java | 2 +- .../service_handler_api/FilterFields.py | 2 +- .../service/service_handlers/__init__.py | 2 +- .../MockTfsOpticalSdnCtrl.py} | 0 .../data.py | 0 .../run.sh | 2 +- src/webui/service/device/forms.py | 2 +- src/webui/service/device/routes.py | 4 ++-- src/webui/service/templates/device/add.html | 2 +- .../java/org/etsi/tfs/ztp/Serializer.java | 8 ++++---- .../ztp/context/model/DeviceDriverEnum.java | 2 +- .../java/org/etsi/tfs/ztp/SerializerTest.java | 2 +- 22 files changed, 38 insertions(+), 36 deletions(-) rename src/device/service/drivers/{flexscale/FlexScaleDriver.py => optical_tfs/OpticalTfsDriver.py} (90%) rename src/device/service/drivers/{flexscale => optical_tfs}/Tools.py (100%) rename src/device/service/drivers/{flexscale => optical_tfs}/__init__.py (100%) rename src/tests/tools/{mock_flexscale_opt_ctrl/MockFlexscaleOptCtrl.py => mock_tfs_optical_sdn_ctrl/MockTfsOpticalSdnCtrl.py} (100%) rename src/tests/tools/{mock_flexscale_opt_ctrl => mock_tfs_optical_sdn_ctrl}/data.py (100%) rename src/tests/tools/{mock_flexscale_opt_ctrl => mock_tfs_optical_sdn_ctrl}/run.sh (95%) diff --git a/proto/context.proto b/proto/context.proto index 8a6b019dc..a4cc4c6a7 100644 --- a/proto/context.proto +++ b/proto/context.proto @@ -211,7 +211,7 @@ enum DeviceDriverEnum { DEVICEDRIVER_XR = 6; DEVICEDRIVER_IETF_L2VPN = 7; DEVICEDRIVER_GNMI_OPENCONFIG = 8; - DEVICEDRIVER_FLEXSCALE = 9; + DEVICEDRIVER_OPTICAL_TFS = 9; DEVICEDRIVER_IETF_ACTN = 10; DEVICEDRIVER_OC = 11; } diff --git a/src/common/type_checkers/Assertions.py b/src/common/type_checkers/Assertions.py index 87d8e54ee..ac1462ac4 100644 --- a/src/common/type_checkers/Assertions.py +++ b/src/common/type_checkers/Assertions.py @@ -46,7 +46,7 @@ def validate_device_driver_enum(message): 'DEVICEDRIVER_XR', 'DEVICEDRIVER_IETF_L2VPN', 'DEVICEDRIVER_GNMI_OPENCONFIG', - 'DEVICEDRIVER_FLEXSCALE', + 'DEVICEDRIVER_OPTICAL_TFS', 'DEVICEDRIVER_IETF_ACTN', ] diff --git a/src/context/service/database/models/enums/DeviceDriver.py b/src/context/service/database/models/enums/DeviceDriver.py index 2ccdda272..194d66fed 100644 --- a/src/context/service/database/models/enums/DeviceDriver.py +++ b/src/context/service/database/models/enums/DeviceDriver.py @@ -31,7 +31,7 @@ class ORM_DeviceDriverEnum(enum.Enum): XR = DeviceDriverEnum.DEVICEDRIVER_XR IETF_L2VPN = DeviceDriverEnum.DEVICEDRIVER_IETF_L2VPN GNMI_OPENCONFIG = DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG - FLEXSCALE = DeviceDriverEnum.DEVICEDRIVER_FLEXSCALE + OPTICAL_TFS = DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS IETF_ACTN = DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN OC = DeviceDriverEnum.DEVICEDRIVER_OC diff --git a/src/device/service/drivers/__init__.py b/src/device/service/drivers/__init__.py index beb3db38e..97cf166e6 100644 --- a/src/device/service/drivers/__init__.py +++ b/src/device/service/drivers/__init__.py @@ -156,12 +156,12 @@ if LOAD_ALL_DEVICE_DRIVERS: ])) if LOAD_ALL_DEVICE_DRIVERS: - from .flexscale.FlexScaleDriver import FlexScaleDriver # pylint: disable=wrong-import-position + from .optical_tfs.OpticalTfsDriver import OpticalTfsDriver # pylint: disable=wrong-import-position DRIVERS.append( - (FlexScaleDriver, [ + (OpticalTfsDriver, [ { FilterFieldEnum.DEVICE_TYPE: DeviceTypeEnum.OPEN_LINE_SYSTEM, - FilterFieldEnum.DRIVER: DeviceDriverEnum.DEVICEDRIVER_FLEXSCALE, + FilterFieldEnum.DRIVER: DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS, } ])) diff --git a/src/device/service/drivers/ietf_l2vpn/TfsDebugApiClient.py b/src/device/service/drivers/ietf_l2vpn/TfsDebugApiClient.py index 06c55c5dc..a160e14bb 100644 --- a/src/device/service/drivers/ietf_l2vpn/TfsDebugApiClient.py +++ b/src/device/service/drivers/ietf_l2vpn/TfsDebugApiClient.py @@ -44,7 +44,9 @@ MAPPING_DRIVER = { 'DEVICEDRIVER_XR' : 6, 'DEVICEDRIVER_IETF_L2VPN' : 7, 'DEVICEDRIVER_GNMI_OPENCONFIG' : 8, - 'DEVICEDRIVER_FLEXSCALE' : 9, + 'DEVICEDRIVER_OPTICAL_TFS' : 9, + 'DEVICEDRIVER_IETF_ACTN' : 10, + 'DEVICEDRIVER_OC' : 11, } MSG_ERROR = 'Could not retrieve devices in remote TeraFlowSDN instance({:s}). status_code={:s} reply={:s}' diff --git a/src/device/service/drivers/flexscale/FlexScaleDriver.py b/src/device/service/drivers/optical_tfs/OpticalTfsDriver.py similarity index 90% rename from src/device/service/drivers/flexscale/FlexScaleDriver.py rename to src/device/service/drivers/optical_tfs/OpticalTfsDriver.py index f91ee1ceb..0bac68fc9 100644 --- a/src/device/service/drivers/flexscale/FlexScaleDriver.py +++ b/src/device/service/drivers/optical_tfs/OpticalTfsDriver.py @@ -26,11 +26,11 @@ from device.service.driver_api.ImportTopologyEnum import ImportTopologyEnum, get LOGGER = logging.getLogger(__name__) -DRIVER_NAME = 'flexscale' +DRIVER_NAME = 'optical_tfs' METRICS_POOL = MetricsPool('Device', 'Driver', labels={'driver': DRIVER_NAME}) -class FlexScaleDriver(_Driver): +class OpticalTfsDriver(_Driver): def __init__(self, address: str, port: int, **settings) -> None: super().__init__(DRIVER_NAME, address, port, **settings) self.__lock = threading.Lock() @@ -41,7 +41,7 @@ class FlexScaleDriver(_Driver): self.__auth = HTTPBasicAuth(username, password) if username is not None and password is not None else None scheme = self.settings.get('scheme', 'http') self.dac = TfsDebugApiClient(self.address, int(self.port), scheme=scheme, username=username, password=password) - self.__flexscale_root = '{:s}://{:s}:{:d}'.format(scheme, self.address, int(self.port)) + self.__base_url = '{:s}://{:s}:{:d}'.format(scheme, self.address, int(self.port)) self.__timeout = int(self.settings.get('timeout', 120)) # Options are: @@ -54,7 +54,7 @@ class FlexScaleDriver(_Driver): def Connect(self) -> bool: - url = self.__flexscale_root + '/OpticalTFS/GetLightpaths' + url = self.__base_url + '/OpticalTFS/GetLightpaths' with self.__lock: if self.__started.is_set(): return True try: @@ -94,7 +94,7 @@ class FlexScaleDriver(_Driver): results.extend(self.dac.get_devices_endpoints(self.__import_topology)) # results.extend(get_lightpaths( - # self.__flexscale_root, resource_key, timeout=self.__timeout, auth=self.__auth)) + # self.__base_url, resource_key, timeout=self.__timeout, auth=self.__auth)) return results @metered_subclass_method(METRICS_POOL) @@ -110,7 +110,7 @@ class FlexScaleDriver(_Driver): dst_node = find_key(resource, 'dst_node') bitrate = find_key(resource, 'bitrate') - response = add_lightpath(self.__flexscale_root, src_node, dst_node, bitrate, + response = add_lightpath(self.__base_url, src_node, dst_node, bitrate, auth=self.__auth, timeout=self.__timeout) results.extend(response) @@ -129,23 +129,23 @@ class FlexScaleDriver(_Driver): dst_node = find_key(resource, 'dst_node') bitrate = find_key(resource, 'bitrate') - response = del_lightpath(self.__flexscale_root, flow_id, src_node, dst_node, bitrate) + response = del_lightpath(self.__base_url, flow_id, src_node, dst_node, bitrate) results.extend(response) return results @metered_subclass_method(METRICS_POOL) def SubscribeState(self, subscriptions : List[Tuple[str, float, float]]) -> List[Union[bool, Exception]]: - # FlexScale does not support monitoring by now + # Optical TFS does not support monitoring by now return [False for _ in subscriptions] @metered_subclass_method(METRICS_POOL) def UnsubscribeState(self, subscriptions : List[Tuple[str, float, float]]) -> List[Union[bool, Exception]]: - # FlexScale does not support monitoring by now + # Optical TFS does not support monitoring by now return [False for _ in subscriptions] def GetState( self, blocking=False, terminate : Optional[threading.Event] = None ) -> Iterator[Tuple[float, str, Any]]: - # FlexScale does not support monitoring by now + # Optical TFS does not support monitoring by now return [] diff --git a/src/device/service/drivers/flexscale/Tools.py b/src/device/service/drivers/optical_tfs/Tools.py similarity index 100% rename from src/device/service/drivers/flexscale/Tools.py rename to src/device/service/drivers/optical_tfs/Tools.py diff --git a/src/device/service/drivers/flexscale/__init__.py b/src/device/service/drivers/optical_tfs/__init__.py similarity index 100% rename from src/device/service/drivers/flexscale/__init__.py rename to src/device/service/drivers/optical_tfs/__init__.py diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/Serializer.java b/src/policy/src/main/java/org/etsi/tfs/policy/Serializer.java index 570a7fb9e..e9024d86f 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/Serializer.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/Serializer.java @@ -2300,8 +2300,8 @@ public class Serializer { return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_L2VPN; case GNMI_OPENCONFIG: return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG; - case FLEXSCALE: - return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_FLEXSCALE; + case OPTICAL_TFS: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS; case IETF_ACTN: return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN; case UNDEFINED: @@ -2329,8 +2329,8 @@ public class Serializer { return DeviceDriverEnum.IETF_L2VPN; case DEVICEDRIVER_GNMI_OPENCONFIG: return DeviceDriverEnum.GNMI_OPENCONFIG; - case DEVICEDRIVER_FLEXSCALE: - return DeviceDriverEnum.FLEXSCALE; + case DEVICEDRIVER_OPTICAL_TFS: + return DeviceDriverEnum.OPTICAL_TFS; case DEVICEDRIVER_IETF_ACTN: return DeviceDriverEnum.IETF_ACTN; case DEVICEDRIVER_UNDEFINED: diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceDriverEnum.java b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceDriverEnum.java index 72a1d7136..ce1d6a3f6 100644 --- a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceDriverEnum.java +++ b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceDriverEnum.java @@ -26,6 +26,6 @@ public enum DeviceDriverEnum { XR, IETF_L2VPN, GNMI_OPENCONFIG, - FLEXSCALE, + OPTICAL_TFS, IETF_ACTN } diff --git a/src/policy/src/test/java/org/etsi/tfs/policy/SerializerTest.java b/src/policy/src/test/java/org/etsi/tfs/policy/SerializerTest.java index 396706f36..37c7ddbdf 100644 --- a/src/policy/src/test/java/org/etsi/tfs/policy/SerializerTest.java +++ b/src/policy/src/test/java/org/etsi/tfs/policy/SerializerTest.java @@ -3618,7 +3618,7 @@ class SerializerTest { DeviceDriverEnum.GNMI_OPENCONFIG, ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG), Arguments.of( - DeviceDriverEnum.FLEXSCALE, ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_FLEXSCALE), + DeviceDriverEnum.OPTICAL_TFS, ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS), Arguments.of( DeviceDriverEnum.IETF_ACTN, ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN), Arguments.of( diff --git a/src/service/service/service_handler_api/FilterFields.py b/src/service/service/service_handler_api/FilterFields.py index 633f41b63..be7a4506e 100644 --- a/src/service/service/service_handler_api/FilterFields.py +++ b/src/service/service/service_handler_api/FilterFields.py @@ -39,7 +39,7 @@ DEVICE_DRIVER_VALUES = { DeviceDriverEnum.DEVICEDRIVER_XR, DeviceDriverEnum.DEVICEDRIVER_IETF_L2VPN, DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG, - DeviceDriverEnum.DEVICEDRIVER_FLEXSCALE, + DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS, DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN, DeviceDriverEnum.DEVICEDRIVER_OC } diff --git a/src/service/service/service_handlers/__init__.py b/src/service/service/service_handlers/__init__.py index f0628110f..0f35e063c 100644 --- a/src/service/service/service_handlers/__init__.py +++ b/src/service/service/service_handlers/__init__.py @@ -98,7 +98,7 @@ SERVICE_HANDLERS = [ (E2EOrchestratorServiceHandler, [ { FilterFieldEnum.SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_E2E, - FilterFieldEnum.DEVICE_DRIVER : [DeviceDriverEnum.DEVICEDRIVER_FLEXSCALE], + FilterFieldEnum.DEVICE_DRIVER : [DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS], } ]), (OCServiceHandler, [ diff --git a/src/tests/tools/mock_flexscale_opt_ctrl/MockFlexscaleOptCtrl.py b/src/tests/tools/mock_tfs_optical_sdn_ctrl/MockTfsOpticalSdnCtrl.py similarity index 100% rename from src/tests/tools/mock_flexscale_opt_ctrl/MockFlexscaleOptCtrl.py rename to src/tests/tools/mock_tfs_optical_sdn_ctrl/MockTfsOpticalSdnCtrl.py diff --git a/src/tests/tools/mock_flexscale_opt_ctrl/data.py b/src/tests/tools/mock_tfs_optical_sdn_ctrl/data.py similarity index 100% rename from src/tests/tools/mock_flexscale_opt_ctrl/data.py rename to src/tests/tools/mock_tfs_optical_sdn_ctrl/data.py diff --git a/src/tests/tools/mock_flexscale_opt_ctrl/run.sh b/src/tests/tools/mock_tfs_optical_sdn_ctrl/run.sh similarity index 95% rename from src/tests/tools/mock_flexscale_opt_ctrl/run.sh rename to src/tests/tools/mock_tfs_optical_sdn_ctrl/run.sh index 183df7a03..4dc59b046 100755 --- a/src/tests/tools/mock_flexscale_opt_ctrl/run.sh +++ b/src/tests/tools/mock_tfs_optical_sdn_ctrl/run.sh @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -python MockFlexscaleOptCtrl.py +python MockTfsOpticalSdnCtrl.py diff --git a/src/webui/service/device/forms.py b/src/webui/service/device/forms.py index 4c04bbfe1..45cece44f 100644 --- a/src/webui/service/device/forms.py +++ b/src/webui/service/device/forms.py @@ -31,7 +31,7 @@ class AddDeviceForm(FlaskForm): device_drivers_xr = BooleanField('XR') device_drivers_ietf_l2vpn = BooleanField('IETF L2VPN') device_drivers_gnmi_openconfig = BooleanField('GNMI OPENCONFIG') - device_drivers_flexscale = BooleanField('FLEXSCALE') + device_drivers_optical_tfs = BooleanField('OPTICAL TFS') device_drivers_ietf_actn = BooleanField('IETF ACTN') device_config_address = StringField('connect/address',default='127.0.0.1',validators=[DataRequired(), Length(min=5)]) diff --git a/src/webui/service/device/routes.py b/src/webui/service/device/routes.py index 8b8bc236a..e6f3cd7b8 100644 --- a/src/webui/service/device/routes.py +++ b/src/webui/service/device/routes.py @@ -125,8 +125,8 @@ def add(): device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_IETF_L2VPN) if form.device_drivers_gnmi_openconfig.data: device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG) - if form.device_drivers_flexscale.data: - device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_FLEXSCALE) + if form.device_drivers_optical_tfs.data: + device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS) if form.device_drivers_ietf_actn.data: device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN) device_obj.device_drivers.extend(device_drivers) # pylint: disable=no-member diff --git a/src/webui/service/templates/device/add.html b/src/webui/service/templates/device/add.html index c4d7f1685..3785b3e30 100644 --- a/src/webui/service/templates/device/add.html +++ b/src/webui/service/templates/device/add.html @@ -93,7 +93,7 @@ {{ form.device_drivers_ietf_l2vpn }} {{ form.device_drivers_ietf_l2vpn.label(class="col-sm-3 col-form-label") }} {{ form.device_drivers_gnmi_openconfig }} {{ form.device_drivers_gnmi_openconfig.label(class="col-sm-3 col-form-label") }}
- {{ form.device_drivers_flexscale }} {{ form.device_drivers_flexscale.label(class="col-sm-3 col-form-label") }} + {{ form.device_drivers_optical_tfs }} {{ form.device_drivers_optical_tfs.label(class="col-sm-3 col-form-label") }} {{ form.device_drivers_ietf_actn }} {{ form.device_drivers_ietf_actn.label(class="col-sm-3 col-form-label") }} {% endif %} diff --git a/src/ztp/src/main/java/org/etsi/tfs/ztp/Serializer.java b/src/ztp/src/main/java/org/etsi/tfs/ztp/Serializer.java index 6106c95ff..725a8f12f 100644 --- a/src/ztp/src/main/java/org/etsi/tfs/ztp/Serializer.java +++ b/src/ztp/src/main/java/org/etsi/tfs/ztp/Serializer.java @@ -865,8 +865,8 @@ public class Serializer { return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_L2VPN; case GNMI_OPENCONFIG: return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG; - case FLEXSCALE: - return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_FLEXSCALE; + case OPTICAL_TFS: + return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS; case IETF_ACTN: return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN; case UNDEFINED: @@ -894,8 +894,8 @@ public class Serializer { return DeviceDriverEnum.IETF_L2VPN; case DEVICEDRIVER_GNMI_OPENCONFIG: return DeviceDriverEnum.GNMI_OPENCONFIG; - case DEVICEDRIVER_FLEXSCALE: - return DeviceDriverEnum.FLEXSCALE; + case DEVICEDRIVER_OPTICAL_TFS: + return DeviceDriverEnum.OPTICAL_TFS; case DEVICEDRIVER_IETF_ACTN: return DeviceDriverEnum.IETF_ACTN; case DEVICEDRIVER_UNDEFINED: diff --git a/src/ztp/src/main/java/org/etsi/tfs/ztp/context/model/DeviceDriverEnum.java b/src/ztp/src/main/java/org/etsi/tfs/ztp/context/model/DeviceDriverEnum.java index 8e89be8a6..ec4119303 100644 --- a/src/ztp/src/main/java/org/etsi/tfs/ztp/context/model/DeviceDriverEnum.java +++ b/src/ztp/src/main/java/org/etsi/tfs/ztp/context/model/DeviceDriverEnum.java @@ -26,6 +26,6 @@ public enum DeviceDriverEnum { XR, IETF_L2VPN, GNMI_OPENCONFIG, - FLEXSCALE, + OPTICAL_TFS, IETF_ACTN } diff --git a/src/ztp/src/test/java/org/etsi/tfs/ztp/SerializerTest.java b/src/ztp/src/test/java/org/etsi/tfs/ztp/SerializerTest.java index f1cb798b2..52b50db1b 100644 --- a/src/ztp/src/test/java/org/etsi/tfs/ztp/SerializerTest.java +++ b/src/ztp/src/test/java/org/etsi/tfs/ztp/SerializerTest.java @@ -1227,7 +1227,7 @@ class SerializerTest { DeviceDriverEnum.GNMI_OPENCONFIG, ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG), Arguments.of( - DeviceDriverEnum.FLEXSCALE, ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_FLEXSCALE), + DeviceDriverEnum.OPTICAL_TFS, ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS), Arguments.of( DeviceDriverEnum.IETF_ACTN, ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN), Arguments.of( -- GitLab From c61310adfaea187e28a41c11f6811885050ec1b3 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 8 Apr 2024 17:34:23 +0000 Subject: [PATCH 083/602] Service component: - Corrected format of optical controller URL's port number --- src/service/service/tools/OpticalTools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/service/service/tools/OpticalTools.py b/src/service/service/tools/OpticalTools.py index 20cd6b42a..ad2f8cbec 100644 --- a/src/service/service/tools/OpticalTools.py +++ b/src/service/service/tools/OpticalTools.py @@ -39,7 +39,7 @@ VAR_NAME_OPTICAL_CTRL_SCHEMA = get_optical_controller_setting('SCHEMA') VAR_NAME_OPTICAL_CTRL_HOST = get_optical_controller_setting(ENVVAR_SUFIX_SERVICE_HOST) VAR_NAME_OPTICAL_CTRL_PORT = get_optical_controller_setting(ENVVAR_SUFIX_SERVICE_PORT_GRPC) -OPTICAL_CTRL_BASE_URL = '{:s}://{:s}:{:s}/OpticalTFS' +OPTICAL_CTRL_BASE_URL = '{:s}://{:s}:{:d}/OpticalTFS' def get_optical_controller_base_url() -> str: settings = find_environment_variables([ -- GitLab From 1f0e6b57acb8d37f9957aa2c4f6fcea611551987 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 8 Apr 2024 17:39:22 +0000 Subject: [PATCH 084/602] ZTP and Policy components: - Rebuilt gRPC proto files --- .../org/etsi/tfs/policy/SerializerTest.java | 3 +- .../generated-sources/grpc/acl/Acl.java | 1101 +- .../grpc/context/ContextOuterClass.java | 20975 +++++++++------- .../grpc/context/ContextServiceGrpc.java | 134 +- .../ContextPolicyServiceGrpc.java | 37 +- .../generated-sources/grpc/device/Device.java | 305 +- .../grpc/device/DeviceServiceGrpc.java | 34 +- .../grpc/monitoring/Monitoring.java | 5813 +++-- .../monitoring/MonitoringServiceGrpc.java | 60 +- .../generated-sources/grpc/policy/Policy.java | 2246 +- .../grpc/policy/PolicyAction.java | 403 +- .../grpc/policy/PolicyCondition.java | 285 +- .../grpc/policy/PolicyServiceGrpc.java | 40 +- .../grpc/service/ServiceServiceGrpc.java | 32 +- .../java/org/etsi/tfs/ztp/SerializerTest.java | 3 +- .../generated-sources/grpc/acl/Acl.java | 1101 +- .../grpc/context/ContextOuterClass.java | 20975 +++++++++------- .../grpc/context/ContextServiceGrpc.java | 134 +- .../generated-sources/grpc/device/Device.java | 305 +- .../grpc/device/DeviceServiceGrpc.java | 34 +- .../grpc/monitoring/Monitoring.java | 5813 +++-- .../monitoring/MonitoringServiceGrpc.java | 60 +- .../generated-sources/grpc/ztp/Ztp.java | 1315 +- .../grpc/ztp/ZtpServiceGrpc.java | 36 +- src/ztp/target/kubernetes/kubernetes.yml | 26 +- 25 files changed, 34922 insertions(+), 26348 deletions(-) diff --git a/src/policy/src/test/java/org/etsi/tfs/policy/SerializerTest.java b/src/policy/src/test/java/org/etsi/tfs/policy/SerializerTest.java index 37c7ddbdf..0d89e6b40 100644 --- a/src/policy/src/test/java/org/etsi/tfs/policy/SerializerTest.java +++ b/src/policy/src/test/java/org/etsi/tfs/policy/SerializerTest.java @@ -3618,7 +3618,8 @@ class SerializerTest { DeviceDriverEnum.GNMI_OPENCONFIG, ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG), Arguments.of( - DeviceDriverEnum.OPTICAL_TFS, ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS), + DeviceDriverEnum.OPTICAL_TFS, + ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS), Arguments.of( DeviceDriverEnum.IETF_ACTN, ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN), Arguments.of( diff --git a/src/policy/target/generated-sources/grpc/acl/Acl.java b/src/policy/target/generated-sources/grpc/acl/Acl.java index cba5f55d7..f1895fa72 100644 --- a/src/policy/target/generated-sources/grpc/acl/Acl.java +++ b/src/policy/target/generated-sources/grpc/acl/Acl.java @@ -485,6 +485,86 @@ public final class Acl { return new AclMatch(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private AclMatch(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 8: + { + dscp_ = input.readUInt32(); + break; + } + case 16: + { + protocol_ = input.readUInt32(); + break; + } + case 26: + { + java.lang.String s = input.readStringRequireUtf8(); + srcAddress_ = s; + break; + } + case 34: + { + java.lang.String s = input.readStringRequireUtf8(); + dstAddress_ = s; + break; + } + case 40: + { + srcPort_ = input.readUInt32(); + break; + } + case 48: + { + dstPort_ = input.readUInt32(); + break; + } + case 56: + { + startMplsLabel_ = input.readUInt32(); + break; + } + case 64: + { + endMplsLabel_ = input.readUInt32(); + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return acl.Acl.internal_static_acl_AclMatch_descriptor; } @@ -496,7 +576,7 @@ public final class Acl { public static final int DSCP_FIELD_NUMBER = 1; - private int dscp_ = 0; + private int dscp_; /** * uint32 dscp = 1; @@ -509,7 +589,7 @@ public final class Acl { public static final int PROTOCOL_FIELD_NUMBER = 2; - private int protocol_ = 0; + private int protocol_; /** * uint32 protocol = 2; @@ -522,8 +602,7 @@ public final class Acl { public static final int SRC_ADDRESS_FIELD_NUMBER = 3; - @SuppressWarnings("serial") - private volatile java.lang.Object srcAddress_ = ""; + private volatile java.lang.Object srcAddress_; /** * string src_address = 3; @@ -560,8 +639,7 @@ public final class Acl { public static final int DST_ADDRESS_FIELD_NUMBER = 4; - @SuppressWarnings("serial") - private volatile java.lang.Object dstAddress_ = ""; + private volatile java.lang.Object dstAddress_; /** * string dst_address = 4; @@ -598,7 +676,7 @@ public final class Acl { public static final int SRC_PORT_FIELD_NUMBER = 5; - private int srcPort_ = 0; + private int srcPort_; /** * uint32 src_port = 5; @@ -611,7 +689,7 @@ public final class Acl { public static final int DST_PORT_FIELD_NUMBER = 6; - private int dstPort_ = 0; + private int dstPort_; /** * uint32 dst_port = 6; @@ -624,7 +702,7 @@ public final class Acl { public static final int START_MPLS_LABEL_FIELD_NUMBER = 7; - private int startMplsLabel_ = 0; + private int startMplsLabel_; /** * uint32 start_mpls_label = 7; @@ -637,7 +715,7 @@ public final class Acl { public static final int END_MPLS_LABEL_FIELD_NUMBER = 8; - private int endMplsLabel_ = 0; + private int endMplsLabel_; /** * uint32 end_mpls_label = 8; @@ -669,10 +747,10 @@ public final class Acl { if (protocol_ != 0) { output.writeUInt32(2, protocol_); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcAddress_)) { + if (!getSrcAddressBytes().isEmpty()) { com.google.protobuf.GeneratedMessageV3.writeString(output, 3, srcAddress_); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstAddress_)) { + if (!getDstAddressBytes().isEmpty()) { com.google.protobuf.GeneratedMessageV3.writeString(output, 4, dstAddress_); } if (srcPort_ != 0) { @@ -687,7 +765,7 @@ public final class Acl { if (endMplsLabel_ != 0) { output.writeUInt32(8, endMplsLabel_); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -702,10 +780,10 @@ public final class Acl { if (protocol_ != 0) { size += com.google.protobuf.CodedOutputStream.computeUInt32Size(2, protocol_); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcAddress_)) { + if (!getSrcAddressBytes().isEmpty()) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, srcAddress_); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstAddress_)) { + if (!getDstAddressBytes().isEmpty()) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, dstAddress_); } if (srcPort_ != 0) { @@ -720,7 +798,7 @@ public final class Acl { if (endMplsLabel_ != 0) { size += com.google.protobuf.CodedOutputStream.computeUInt32Size(8, endMplsLabel_); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -750,7 +828,7 @@ public final class Acl { return false; if (getEndMplsLabel() != other.getEndMplsLabel()) return false; - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -778,7 +856,7 @@ public final class Acl { hash = (53 * hash) + getStartMplsLabel(); hash = (37 * hash) + END_MPLS_LABEL_FIELD_NUMBER; hash = (53 * hash) + getEndMplsLabel(); - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -872,16 +950,22 @@ public final class Acl { // Construct using acl.Acl.AclMatch.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; dscp_ = 0; protocol_ = 0; srcAddress_ = ""; @@ -915,39 +999,46 @@ public final class Acl { @java.lang.Override public acl.Acl.AclMatch buildPartial() { acl.Acl.AclMatch result = new acl.Acl.AclMatch(this); - if (bitField0_ != 0) { - buildPartial0(result); - } + result.dscp_ = dscp_; + result.protocol_ = protocol_; + result.srcAddress_ = srcAddress_; + result.dstAddress_ = dstAddress_; + result.srcPort_ = srcPort_; + result.dstPort_ = dstPort_; + result.startMplsLabel_ = startMplsLabel_; + result.endMplsLabel_ = endMplsLabel_; onBuilt(); return result; } - private void buildPartial0(acl.Acl.AclMatch result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.dscp_ = dscp_; - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.protocol_ = protocol_; - } - if (((from_bitField0_ & 0x00000004) != 0)) { - result.srcAddress_ = srcAddress_; - } - if (((from_bitField0_ & 0x00000008) != 0)) { - result.dstAddress_ = dstAddress_; - } - if (((from_bitField0_ & 0x00000010) != 0)) { - result.srcPort_ = srcPort_; - } - if (((from_bitField0_ & 0x00000020) != 0)) { - result.dstPort_ = dstPort_; - } - if (((from_bitField0_ & 0x00000040) != 0)) { - result.startMplsLabel_ = startMplsLabel_; - } - if (((from_bitField0_ & 0x00000080) != 0)) { - result.endMplsLabel_ = endMplsLabel_; - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -971,12 +1062,10 @@ public final class Acl { } if (!other.getSrcAddress().isEmpty()) { srcAddress_ = other.srcAddress_; - bitField0_ |= 0x00000004; onChanged(); } if (!other.getDstAddress().isEmpty()) { dstAddress_ = other.dstAddress_; - bitField0_ |= 0x00000008; onChanged(); } if (other.getSrcPort() != 0) { @@ -991,7 +1080,7 @@ public final class Acl { if (other.getEndMplsLabel() != 0) { setEndMplsLabel(other.getEndMplsLabel()); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -1003,96 +1092,20 @@ public final class Acl { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + acl.Acl.AclMatch parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 8: - { - dscp_ = input.readUInt32(); - bitField0_ |= 0x00000001; - break; - } - // case 8 - case 16: - { - protocol_ = input.readUInt32(); - bitField0_ |= 0x00000002; - break; - } - // case 16 - case 26: - { - srcAddress_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000004; - break; - } - // case 26 - case 34: - { - dstAddress_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000008; - break; - } - // case 34 - case 40: - { - srcPort_ = input.readUInt32(); - bitField0_ |= 0x00000010; - break; - } - // case 40 - case 48: - { - dstPort_ = input.readUInt32(); - bitField0_ |= 0x00000020; - break; - } - // case 48 - case 56: - { - startMplsLabel_ = input.readUInt32(); - bitField0_ |= 0x00000040; - break; - } - // case 56 - case 64: - { - endMplsLabel_ = input.readUInt32(); - bitField0_ |= 0x00000080; - break; - } - // case 64 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (acl.Acl.AclMatch) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } - private int bitField0_; - private int dscp_; /** @@ -1111,7 +1124,6 @@ public final class Acl { */ public Builder setDscp(int value) { dscp_ = value; - bitField0_ |= 0x00000001; onChanged(); return this; } @@ -1121,7 +1133,6 @@ public final class Acl { * @return This builder for chaining. */ public Builder clearDscp() { - bitField0_ = (bitField0_ & ~0x00000001); dscp_ = 0; onChanged(); return this; @@ -1145,7 +1156,6 @@ public final class Acl { */ public Builder setProtocol(int value) { protocol_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -1155,7 +1165,6 @@ public final class Acl { * @return This builder for chaining. */ public Builder clearProtocol() { - bitField0_ = (bitField0_ & ~0x00000002); protocol_ = 0; onChanged(); return this; @@ -1204,7 +1213,6 @@ public final class Acl { throw new NullPointerException(); } srcAddress_ = value; - bitField0_ |= 0x00000004; onChanged(); return this; } @@ -1215,7 +1223,6 @@ public final class Acl { */ public Builder clearSrcAddress() { srcAddress_ = getDefaultInstance().getSrcAddress(); - bitField0_ = (bitField0_ & ~0x00000004); onChanged(); return this; } @@ -1231,7 +1238,6 @@ public final class Acl { } checkByteStringIsUtf8(value); srcAddress_ = value; - bitField0_ |= 0x00000004; onChanged(); return this; } @@ -1279,7 +1285,6 @@ public final class Acl { throw new NullPointerException(); } dstAddress_ = value; - bitField0_ |= 0x00000008; onChanged(); return this; } @@ -1290,7 +1295,6 @@ public final class Acl { */ public Builder clearDstAddress() { dstAddress_ = getDefaultInstance().getDstAddress(); - bitField0_ = (bitField0_ & ~0x00000008); onChanged(); return this; } @@ -1306,7 +1310,6 @@ public final class Acl { } checkByteStringIsUtf8(value); dstAddress_ = value; - bitField0_ |= 0x00000008; onChanged(); return this; } @@ -1329,7 +1332,6 @@ public final class Acl { */ public Builder setSrcPort(int value) { srcPort_ = value; - bitField0_ |= 0x00000010; onChanged(); return this; } @@ -1339,7 +1341,6 @@ public final class Acl { * @return This builder for chaining. */ public Builder clearSrcPort() { - bitField0_ = (bitField0_ & ~0x00000010); srcPort_ = 0; onChanged(); return this; @@ -1363,7 +1364,6 @@ public final class Acl { */ public Builder setDstPort(int value) { dstPort_ = value; - bitField0_ |= 0x00000020; onChanged(); return this; } @@ -1373,7 +1373,6 @@ public final class Acl { * @return This builder for chaining. */ public Builder clearDstPort() { - bitField0_ = (bitField0_ & ~0x00000020); dstPort_ = 0; onChanged(); return this; @@ -1397,7 +1396,6 @@ public final class Acl { */ public Builder setStartMplsLabel(int value) { startMplsLabel_ = value; - bitField0_ |= 0x00000040; onChanged(); return this; } @@ -1407,7 +1405,6 @@ public final class Acl { * @return This builder for chaining. */ public Builder clearStartMplsLabel() { - bitField0_ = (bitField0_ & ~0x00000040); startMplsLabel_ = 0; onChanged(); return this; @@ -1431,7 +1428,6 @@ public final class Acl { */ public Builder setEndMplsLabel(int value) { endMplsLabel_ = value; - bitField0_ |= 0x00000080; onChanged(); return this; } @@ -1441,7 +1437,6 @@ public final class Acl { * @return This builder for chaining. */ public Builder clearEndMplsLabel() { - bitField0_ = (bitField0_ & ~0x00000080); endMplsLabel_ = 0; onChanged(); return this; @@ -1474,17 +1469,7 @@ public final class Acl { @java.lang.Override public AclMatch parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new AclMatch(input, extensionRegistry); } }; @@ -1555,6 +1540,56 @@ public final class Acl { return new AclAction(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private AclAction(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 8: + { + int rawValue = input.readEnum(); + forwardAction_ = rawValue; + break; + } + case 16: + { + int rawValue = input.readEnum(); + logAction_ = rawValue; + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return acl.Acl.internal_static_acl_AclAction_descriptor; } @@ -1566,7 +1601,7 @@ public final class Acl { public static final int FORWARD_ACTION_FIELD_NUMBER = 1; - private int forwardAction_ = 0; + private int forwardAction_; /** * .acl.AclForwardActionEnum forward_action = 1; @@ -1583,13 +1618,14 @@ public final class Acl { */ @java.lang.Override public acl.Acl.AclForwardActionEnum getForwardAction() { - acl.Acl.AclForwardActionEnum result = acl.Acl.AclForwardActionEnum.forNumber(forwardAction_); + @SuppressWarnings("deprecation") + acl.Acl.AclForwardActionEnum result = acl.Acl.AclForwardActionEnum.valueOf(forwardAction_); return result == null ? acl.Acl.AclForwardActionEnum.UNRECOGNIZED : result; } public static final int LOG_ACTION_FIELD_NUMBER = 2; - private int logAction_ = 0; + private int logAction_; /** * .acl.AclLogActionEnum log_action = 2; @@ -1606,7 +1642,8 @@ public final class Acl { */ @java.lang.Override public acl.Acl.AclLogActionEnum getLogAction() { - acl.Acl.AclLogActionEnum result = acl.Acl.AclLogActionEnum.forNumber(logAction_); + @SuppressWarnings("deprecation") + acl.Acl.AclLogActionEnum result = acl.Acl.AclLogActionEnum.valueOf(logAction_); return result == null ? acl.Acl.AclLogActionEnum.UNRECOGNIZED : result; } @@ -1631,7 +1668,7 @@ public final class Acl { if (logAction_ != acl.Acl.AclLogActionEnum.ACLLOGACTION_UNDEFINED.getNumber()) { output.writeEnum(2, logAction_); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -1646,7 +1683,7 @@ public final class Acl { if (logAction_ != acl.Acl.AclLogActionEnum.ACLLOGACTION_UNDEFINED.getNumber()) { size += com.google.protobuf.CodedOutputStream.computeEnumSize(2, logAction_); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -1664,7 +1701,7 @@ public final class Acl { return false; if (logAction_ != other.logAction_) return false; - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -1680,7 +1717,7 @@ public final class Acl { hash = (53 * hash) + forwardAction_; hash = (37 * hash) + LOG_ACTION_FIELD_NUMBER; hash = (53 * hash) + logAction_; - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -1774,16 +1811,22 @@ public final class Acl { // Construct using acl.Acl.AclAction.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; forwardAction_ = 0; logAction_ = 0; return this; @@ -1811,21 +1854,40 @@ public final class Acl { @java.lang.Override public acl.Acl.AclAction buildPartial() { acl.Acl.AclAction result = new acl.Acl.AclAction(this); - if (bitField0_ != 0) { - buildPartial0(result); - } + result.forwardAction_ = forwardAction_; + result.logAction_ = logAction_; onBuilt(); return result; } - private void buildPartial0(acl.Acl.AclAction result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.forwardAction_ = forwardAction_; - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.logAction_ = logAction_; - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -1847,7 +1909,7 @@ public final class Acl { if (other.logAction_ != 0) { setLogActionValue(other.getLogActionValue()); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -1859,54 +1921,20 @@ public final class Acl { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + acl.Acl.AclAction parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 8: - { - forwardAction_ = input.readEnum(); - bitField0_ |= 0x00000001; - break; - } - // case 8 - case 16: - { - logAction_ = input.readEnum(); - bitField0_ |= 0x00000002; - break; - } - // case 16 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (acl.Acl.AclAction) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } - private int bitField0_; - private int forwardAction_ = 0; /** @@ -1925,7 +1953,6 @@ public final class Acl { */ public Builder setForwardActionValue(int value) { forwardAction_ = value; - bitField0_ |= 0x00000001; onChanged(); return this; } @@ -1936,7 +1963,8 @@ public final class Acl { */ @java.lang.Override public acl.Acl.AclForwardActionEnum getForwardAction() { - acl.Acl.AclForwardActionEnum result = acl.Acl.AclForwardActionEnum.forNumber(forwardAction_); + @SuppressWarnings("deprecation") + acl.Acl.AclForwardActionEnum result = acl.Acl.AclForwardActionEnum.valueOf(forwardAction_); return result == null ? acl.Acl.AclForwardActionEnum.UNRECOGNIZED : result; } @@ -1949,7 +1977,6 @@ public final class Acl { if (value == null) { throw new NullPointerException(); } - bitField0_ |= 0x00000001; forwardAction_ = value.getNumber(); onChanged(); return this; @@ -1960,7 +1987,6 @@ public final class Acl { * @return This builder for chaining. */ public Builder clearForwardAction() { - bitField0_ = (bitField0_ & ~0x00000001); forwardAction_ = 0; onChanged(); return this; @@ -1984,7 +2010,6 @@ public final class Acl { */ public Builder setLogActionValue(int value) { logAction_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -1995,7 +2020,8 @@ public final class Acl { */ @java.lang.Override public acl.Acl.AclLogActionEnum getLogAction() { - acl.Acl.AclLogActionEnum result = acl.Acl.AclLogActionEnum.forNumber(logAction_); + @SuppressWarnings("deprecation") + acl.Acl.AclLogActionEnum result = acl.Acl.AclLogActionEnum.valueOf(logAction_); return result == null ? acl.Acl.AclLogActionEnum.UNRECOGNIZED : result; } @@ -2008,7 +2034,6 @@ public final class Acl { if (value == null) { throw new NullPointerException(); } - bitField0_ |= 0x00000002; logAction_ = value.getNumber(); onChanged(); return this; @@ -2019,7 +2044,6 @@ public final class Acl { * @return This builder for chaining. */ public Builder clearLogAction() { - bitField0_ = (bitField0_ & ~0x00000002); logAction_ = 0; onChanged(); return this; @@ -2052,17 +2076,7 @@ public final class Acl { @java.lang.Override public AclAction parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new AclAction(input, extensionRegistry); } }; @@ -2160,6 +2174,81 @@ public final class Acl { return new AclEntry(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private AclEntry(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 8: + { + sequenceId_ = input.readUInt32(); + break; + } + case 18: + { + java.lang.String s = input.readStringRequireUtf8(); + description_ = s; + break; + } + case 26: + { + acl.Acl.AclMatch.Builder subBuilder = null; + if (match_ != null) { + subBuilder = match_.toBuilder(); + } + match_ = input.readMessage(acl.Acl.AclMatch.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(match_); + match_ = subBuilder.buildPartial(); + } + break; + } + case 34: + { + acl.Acl.AclAction.Builder subBuilder = null; + if (action_ != null) { + subBuilder = action_.toBuilder(); + } + action_ = input.readMessage(acl.Acl.AclAction.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(action_); + action_ = subBuilder.buildPartial(); + } + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return acl.Acl.internal_static_acl_AclEntry_descriptor; } @@ -2171,7 +2260,7 @@ public final class Acl { public static final int SEQUENCE_ID_FIELD_NUMBER = 1; - private int sequenceId_ = 0; + private int sequenceId_; /** * uint32 sequence_id = 1; @@ -2184,8 +2273,7 @@ public final class Acl { public static final int DESCRIPTION_FIELD_NUMBER = 2; - @SuppressWarnings("serial") - private volatile java.lang.Object description_ = ""; + private volatile java.lang.Object description_; /** * string description = 2; @@ -2247,7 +2335,7 @@ public final class Acl { */ @java.lang.Override public acl.Acl.AclMatchOrBuilder getMatchOrBuilder() { - return match_ == null ? acl.Acl.AclMatch.getDefaultInstance() : match_; + return getMatch(); } public static final int ACTION_FIELD_NUMBER = 4; @@ -2277,7 +2365,7 @@ public final class Acl { */ @java.lang.Override public acl.Acl.AclActionOrBuilder getActionOrBuilder() { - return action_ == null ? acl.Acl.AclAction.getDefaultInstance() : action_; + return getAction(); } private byte memoizedIsInitialized = -1; @@ -2298,7 +2386,7 @@ public final class Acl { if (sequenceId_ != 0) { output.writeUInt32(1, sequenceId_); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(description_)) { + if (!getDescriptionBytes().isEmpty()) { com.google.protobuf.GeneratedMessageV3.writeString(output, 2, description_); } if (match_ != null) { @@ -2307,7 +2395,7 @@ public final class Acl { if (action_ != null) { output.writeMessage(4, getAction()); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -2319,7 +2407,7 @@ public final class Acl { if (sequenceId_ != 0) { size += com.google.protobuf.CodedOutputStream.computeUInt32Size(1, sequenceId_); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(description_)) { + if (!getDescriptionBytes().isEmpty()) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, description_); } if (match_ != null) { @@ -2328,7 +2416,7 @@ public final class Acl { if (action_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, getAction()); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -2358,7 +2446,7 @@ public final class Acl { if (!getAction().equals(other.getAction())) return false; } - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -2382,7 +2470,7 @@ public final class Acl { hash = (37 * hash) + ACTION_FIELD_NUMBER; hash = (53 * hash) + getAction().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -2476,26 +2564,34 @@ public final class Acl { // Construct using acl.Acl.AclEntry.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; sequenceId_ = 0; description_ = ""; - match_ = null; - if (matchBuilder_ != null) { - matchBuilder_.dispose(); + if (matchBuilder_ == null) { + match_ = null; + } else { + match_ = null; matchBuilder_ = null; } - action_ = null; - if (actionBuilder_ != null) { - actionBuilder_.dispose(); + if (actionBuilder_ == null) { + action_ = null; + } else { + action_ = null; actionBuilder_ = null; } return this; @@ -2523,27 +2619,50 @@ public final class Acl { @java.lang.Override public acl.Acl.AclEntry buildPartial() { acl.Acl.AclEntry result = new acl.Acl.AclEntry(this); - if (bitField0_ != 0) { - buildPartial0(result); + result.sequenceId_ = sequenceId_; + result.description_ = description_; + if (matchBuilder_ == null) { + result.match_ = match_; + } else { + result.match_ = matchBuilder_.build(); + } + if (actionBuilder_ == null) { + result.action_ = action_; + } else { + result.action_ = actionBuilder_.build(); } onBuilt(); return result; } - private void buildPartial0(acl.Acl.AclEntry result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.sequenceId_ = sequenceId_; - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.description_ = description_; - } - if (((from_bitField0_ & 0x00000004) != 0)) { - result.match_ = matchBuilder_ == null ? match_ : matchBuilder_.build(); - } - if (((from_bitField0_ & 0x00000008) != 0)) { - result.action_ = actionBuilder_ == null ? action_ : actionBuilder_.build(); - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -2564,7 +2683,6 @@ public final class Acl { } if (!other.getDescription().isEmpty()) { description_ = other.description_; - bitField0_ |= 0x00000002; onChanged(); } if (other.hasMatch()) { @@ -2573,7 +2691,7 @@ public final class Acl { if (other.hasAction()) { mergeAction(other.getAction()); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -2585,68 +2703,20 @@ public final class Acl { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + acl.Acl.AclEntry parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 8: - { - sequenceId_ = input.readUInt32(); - bitField0_ |= 0x00000001; - break; - } - // case 8 - case 18: - { - description_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000002; - break; - } - // case 18 - case 26: - { - input.readMessage(getMatchFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000004; - break; - } - // case 26 - case 34: - { - input.readMessage(getActionFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000008; - break; - } - // case 34 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (acl.Acl.AclEntry) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } - private int bitField0_; - private int sequenceId_; /** @@ -2665,7 +2735,6 @@ public final class Acl { */ public Builder setSequenceId(int value) { sequenceId_ = value; - bitField0_ |= 0x00000001; onChanged(); return this; } @@ -2675,7 +2744,6 @@ public final class Acl { * @return This builder for chaining. */ public Builder clearSequenceId() { - bitField0_ = (bitField0_ & ~0x00000001); sequenceId_ = 0; onChanged(); return this; @@ -2724,7 +2792,6 @@ public final class Acl { throw new NullPointerException(); } description_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -2735,7 +2802,6 @@ public final class Acl { */ public Builder clearDescription() { description_ = getDefaultInstance().getDescription(); - bitField0_ = (bitField0_ & ~0x00000002); onChanged(); return this; } @@ -2751,7 +2817,6 @@ public final class Acl { } checkByteStringIsUtf8(value); description_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -2765,7 +2830,7 @@ public final class Acl { * @return Whether the match field is set. */ public boolean hasMatch() { - return ((bitField0_ & 0x00000004) != 0); + return matchBuilder_ != null || match_ != null; } /** @@ -2789,11 +2854,10 @@ public final class Acl { throw new NullPointerException(); } match_ = value; + onChanged(); } else { matchBuilder_.setMessage(value); } - bitField0_ |= 0x00000004; - onChanged(); return this; } @@ -2803,11 +2867,10 @@ public final class Acl { public Builder setMatch(acl.Acl.AclMatch.Builder builderForValue) { if (matchBuilder_ == null) { match_ = builderForValue.build(); + onChanged(); } else { matchBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000004; - onChanged(); return this; } @@ -2816,16 +2879,15 @@ public final class Acl { */ public Builder mergeMatch(acl.Acl.AclMatch value) { if (matchBuilder_ == null) { - if (((bitField0_ & 0x00000004) != 0) && match_ != null && match_ != acl.Acl.AclMatch.getDefaultInstance()) { - getMatchBuilder().mergeFrom(value); + if (match_ != null) { + match_ = acl.Acl.AclMatch.newBuilder(match_).mergeFrom(value).buildPartial(); } else { match_ = value; } + onChanged(); } else { matchBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000004; - onChanged(); return this; } @@ -2833,13 +2895,13 @@ public final class Acl { * .acl.AclMatch match = 3; */ public Builder clearMatch() { - bitField0_ = (bitField0_ & ~0x00000004); - match_ = null; - if (matchBuilder_ != null) { - matchBuilder_.dispose(); + if (matchBuilder_ == null) { + match_ = null; + onChanged(); + } else { + match_ = null; matchBuilder_ = null; } - onChanged(); return this; } @@ -2847,7 +2909,6 @@ public final class Acl { * .acl.AclMatch match = 3; */ public acl.Acl.AclMatch.Builder getMatchBuilder() { - bitField0_ |= 0x00000004; onChanged(); return getMatchFieldBuilder().getBuilder(); } @@ -2883,7 +2944,7 @@ public final class Acl { * @return Whether the action field is set. */ public boolean hasAction() { - return ((bitField0_ & 0x00000008) != 0); + return actionBuilder_ != null || action_ != null; } /** @@ -2907,11 +2968,10 @@ public final class Acl { throw new NullPointerException(); } action_ = value; + onChanged(); } else { actionBuilder_.setMessage(value); } - bitField0_ |= 0x00000008; - onChanged(); return this; } @@ -2921,11 +2981,10 @@ public final class Acl { public Builder setAction(acl.Acl.AclAction.Builder builderForValue) { if (actionBuilder_ == null) { action_ = builderForValue.build(); + onChanged(); } else { actionBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000008; - onChanged(); return this; } @@ -2934,16 +2993,15 @@ public final class Acl { */ public Builder mergeAction(acl.Acl.AclAction value) { if (actionBuilder_ == null) { - if (((bitField0_ & 0x00000008) != 0) && action_ != null && action_ != acl.Acl.AclAction.getDefaultInstance()) { - getActionBuilder().mergeFrom(value); + if (action_ != null) { + action_ = acl.Acl.AclAction.newBuilder(action_).mergeFrom(value).buildPartial(); } else { action_ = value; } + onChanged(); } else { actionBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000008; - onChanged(); return this; } @@ -2951,13 +3009,13 @@ public final class Acl { * .acl.AclAction action = 4; */ public Builder clearAction() { - bitField0_ = (bitField0_ & ~0x00000008); - action_ = null; - if (actionBuilder_ != null) { - actionBuilder_.dispose(); + if (actionBuilder_ == null) { + action_ = null; + onChanged(); + } else { + action_ = null; actionBuilder_ = null; } - onChanged(); return this; } @@ -2965,7 +3023,6 @@ public final class Acl { * .acl.AclAction action = 4; */ public acl.Acl.AclAction.Builder getActionBuilder() { - bitField0_ |= 0x00000008; onChanged(); return getActionFieldBuilder().getBuilder(); } @@ -3019,17 +3076,7 @@ public final class Acl { @java.lang.Override public AclEntry parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new AclEntry(input, extensionRegistry); } }; @@ -3152,6 +3199,81 @@ public final class Acl { return new AclRuleSet(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private AclRuleSet(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + java.lang.String s = input.readStringRequireUtf8(); + name_ = s; + break; + } + case 16: + { + int rawValue = input.readEnum(); + type_ = rawValue; + break; + } + case 26: + { + java.lang.String s = input.readStringRequireUtf8(); + description_ = s; + break; + } + case 34: + { + java.lang.String s = input.readStringRequireUtf8(); + userId_ = s; + break; + } + case 42: + { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + entries_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + entries_.add(input.readMessage(acl.Acl.AclEntry.parser(), extensionRegistry)); + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + entries_ = java.util.Collections.unmodifiableList(entries_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return acl.Acl.internal_static_acl_AclRuleSet_descriptor; } @@ -3163,8 +3285,7 @@ public final class Acl { public static final int NAME_FIELD_NUMBER = 1; - @SuppressWarnings("serial") - private volatile java.lang.Object name_ = ""; + private volatile java.lang.Object name_; /** * string name = 1; @@ -3201,7 +3322,7 @@ public final class Acl { public static final int TYPE_FIELD_NUMBER = 2; - private int type_ = 0; + private int type_; /** * .acl.AclRuleTypeEnum type = 2; @@ -3218,14 +3339,14 @@ public final class Acl { */ @java.lang.Override public acl.Acl.AclRuleTypeEnum getType() { - acl.Acl.AclRuleTypeEnum result = acl.Acl.AclRuleTypeEnum.forNumber(type_); + @SuppressWarnings("deprecation") + acl.Acl.AclRuleTypeEnum result = acl.Acl.AclRuleTypeEnum.valueOf(type_); return result == null ? acl.Acl.AclRuleTypeEnum.UNRECOGNIZED : result; } public static final int DESCRIPTION_FIELD_NUMBER = 3; - @SuppressWarnings("serial") - private volatile java.lang.Object description_ = ""; + private volatile java.lang.Object description_; /** * string description = 3; @@ -3262,8 +3383,7 @@ public final class Acl { public static final int USER_ID_FIELD_NUMBER = 4; - @SuppressWarnings("serial") - private volatile java.lang.Object userId_ = ""; + private volatile java.lang.Object userId_; /** * string user_id = 4; @@ -3300,7 +3420,6 @@ public final class Acl { public static final int ENTRIES_FIELD_NUMBER = 5; - @SuppressWarnings("serial") private java.util.List entries_; /** @@ -3358,22 +3477,22 @@ public final class Acl { @java.lang.Override public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + if (!getNameBytes().isEmpty()) { com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_); } if (type_ != acl.Acl.AclRuleTypeEnum.ACLRULETYPE_UNDEFINED.getNumber()) { output.writeEnum(2, type_); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(description_)) { + if (!getDescriptionBytes().isEmpty()) { com.google.protobuf.GeneratedMessageV3.writeString(output, 3, description_); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(userId_)) { + if (!getUserIdBytes().isEmpty()) { com.google.protobuf.GeneratedMessageV3.writeString(output, 4, userId_); } for (int i = 0; i < entries_.size(); i++) { output.writeMessage(5, entries_.get(i)); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -3382,22 +3501,22 @@ public final class Acl { if (size != -1) return size; size = 0; - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + if (!getNameBytes().isEmpty()) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_); } if (type_ != acl.Acl.AclRuleTypeEnum.ACLRULETYPE_UNDEFINED.getNumber()) { size += com.google.protobuf.CodedOutputStream.computeEnumSize(2, type_); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(description_)) { + if (!getDescriptionBytes().isEmpty()) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, description_); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(userId_)) { + if (!getUserIdBytes().isEmpty()) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, userId_); } for (int i = 0; i < entries_.size(); i++) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, entries_.get(i)); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -3421,7 +3540,7 @@ public final class Acl { return false; if (!getEntriesList().equals(other.getEntriesList())) return false; - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -3445,7 +3564,7 @@ public final class Acl { hash = (37 * hash) + ENTRIES_FIELD_NUMBER; hash = (53 * hash) + getEntriesList().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -3539,27 +3658,33 @@ public final class Acl { // Construct using acl.Acl.AclRuleSet.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + getEntriesFieldBuilder(); + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; name_ = ""; type_ = 0; description_ = ""; userId_ = ""; if (entriesBuilder_ == null) { entries_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); } else { - entries_ = null; entriesBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000010); return this; } @@ -3585,40 +3710,52 @@ public final class Acl { @java.lang.Override public acl.Acl.AclRuleSet buildPartial() { acl.Acl.AclRuleSet result = new acl.Acl.AclRuleSet(this); - buildPartialRepeatedFields(result); - if (bitField0_ != 0) { - buildPartial0(result); - } - onBuilt(); - return result; - } - - private void buildPartialRepeatedFields(acl.Acl.AclRuleSet result) { + int from_bitField0_ = bitField0_; + result.name_ = name_; + result.type_ = type_; + result.description_ = description_; + result.userId_ = userId_; if (entriesBuilder_ == null) { - if (((bitField0_ & 0x00000010) != 0)) { + if (((bitField0_ & 0x00000001) != 0)) { entries_ = java.util.Collections.unmodifiableList(entries_); - bitField0_ = (bitField0_ & ~0x00000010); + bitField0_ = (bitField0_ & ~0x00000001); } result.entries_ = entries_; } else { result.entries_ = entriesBuilder_.build(); } + onBuilt(); + return result; } - private void buildPartial0(acl.Acl.AclRuleSet result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.name_ = name_; - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.type_ = type_; - } - if (((from_bitField0_ & 0x00000004) != 0)) { - result.description_ = description_; - } - if (((from_bitField0_ & 0x00000008) != 0)) { - result.userId_ = userId_; - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -3636,7 +3773,6 @@ public final class Acl { return this; if (!other.getName().isEmpty()) { name_ = other.name_; - bitField0_ |= 0x00000001; onChanged(); } if (other.type_ != 0) { @@ -3644,19 +3780,17 @@ public final class Acl { } if (!other.getDescription().isEmpty()) { description_ = other.description_; - bitField0_ |= 0x00000004; onChanged(); } if (!other.getUserId().isEmpty()) { userId_ = other.userId_; - bitField0_ |= 0x00000008; onChanged(); } if (entriesBuilder_ == null) { if (!other.entries_.isEmpty()) { if (entries_.isEmpty()) { entries_ = other.entries_; - bitField0_ = (bitField0_ & ~0x00000010); + bitField0_ = (bitField0_ & ~0x00000001); } else { ensureEntriesIsMutable(); entries_.addAll(other.entries_); @@ -3669,14 +3803,14 @@ public final class Acl { entriesBuilder_.dispose(); entriesBuilder_ = null; entries_ = other.entries_; - bitField0_ = (bitField0_ & ~0x00000010); + bitField0_ = (bitField0_ & ~0x00000001); entriesBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getEntriesFieldBuilder() : null; } else { entriesBuilder_.addAllMessages(other.entries_); } } } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -3688,75 +3822,17 @@ public final class Acl { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + acl.Acl.AclRuleSet parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - name_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000001; - break; - } - // case 10 - case 16: - { - type_ = input.readEnum(); - bitField0_ |= 0x00000002; - break; - } - // case 16 - case 26: - { - description_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000004; - break; - } - // case 26 - case 34: - { - userId_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000008; - break; - } - // case 34 - case 42: - { - acl.Acl.AclEntry m = input.readMessage(acl.Acl.AclEntry.parser(), extensionRegistry); - if (entriesBuilder_ == null) { - ensureEntriesIsMutable(); - entries_.add(m); - } else { - entriesBuilder_.addMessage(m); - } - break; - } - // case 42 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (acl.Acl.AclRuleSet) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } @@ -3805,7 +3881,6 @@ public final class Acl { throw new NullPointerException(); } name_ = value; - bitField0_ |= 0x00000001; onChanged(); return this; } @@ -3816,7 +3891,6 @@ public final class Acl { */ public Builder clearName() { name_ = getDefaultInstance().getName(); - bitField0_ = (bitField0_ & ~0x00000001); onChanged(); return this; } @@ -3832,7 +3906,6 @@ public final class Acl { } checkByteStringIsUtf8(value); name_ = value; - bitField0_ |= 0x00000001; onChanged(); return this; } @@ -3855,7 +3928,6 @@ public final class Acl { */ public Builder setTypeValue(int value) { type_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -3866,7 +3938,8 @@ public final class Acl { */ @java.lang.Override public acl.Acl.AclRuleTypeEnum getType() { - acl.Acl.AclRuleTypeEnum result = acl.Acl.AclRuleTypeEnum.forNumber(type_); + @SuppressWarnings("deprecation") + acl.Acl.AclRuleTypeEnum result = acl.Acl.AclRuleTypeEnum.valueOf(type_); return result == null ? acl.Acl.AclRuleTypeEnum.UNRECOGNIZED : result; } @@ -3879,7 +3952,6 @@ public final class Acl { if (value == null) { throw new NullPointerException(); } - bitField0_ |= 0x00000002; type_ = value.getNumber(); onChanged(); return this; @@ -3890,7 +3962,6 @@ public final class Acl { * @return This builder for chaining. */ public Builder clearType() { - bitField0_ = (bitField0_ & ~0x00000002); type_ = 0; onChanged(); return this; @@ -3939,7 +4010,6 @@ public final class Acl { throw new NullPointerException(); } description_ = value; - bitField0_ |= 0x00000004; onChanged(); return this; } @@ -3950,7 +4020,6 @@ public final class Acl { */ public Builder clearDescription() { description_ = getDefaultInstance().getDescription(); - bitField0_ = (bitField0_ & ~0x00000004); onChanged(); return this; } @@ -3966,7 +4035,6 @@ public final class Acl { } checkByteStringIsUtf8(value); description_ = value; - bitField0_ |= 0x00000004; onChanged(); return this; } @@ -4014,7 +4082,6 @@ public final class Acl { throw new NullPointerException(); } userId_ = value; - bitField0_ |= 0x00000008; onChanged(); return this; } @@ -4025,7 +4092,6 @@ public final class Acl { */ public Builder clearUserId() { userId_ = getDefaultInstance().getUserId(); - bitField0_ = (bitField0_ & ~0x00000008); onChanged(); return this; } @@ -4041,7 +4107,6 @@ public final class Acl { } checkByteStringIsUtf8(value); userId_ = value; - bitField0_ |= 0x00000008; onChanged(); return this; } @@ -4049,9 +4114,9 @@ public final class Acl { private java.util.List entries_ = java.util.Collections.emptyList(); private void ensureEntriesIsMutable() { - if (!((bitField0_ & 0x00000010) != 0)) { + if (!((bitField0_ & 0x00000001) != 0)) { entries_ = new java.util.ArrayList(entries_); - bitField0_ |= 0x00000010; + bitField0_ |= 0x00000001; } } @@ -4203,7 +4268,7 @@ public final class Acl { public Builder clearEntries() { if (entriesBuilder_ == null) { entries_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000010); + bitField0_ = (bitField0_ & ~0x00000001); onChanged(); } else { entriesBuilder_.clear(); @@ -4277,7 +4342,7 @@ public final class Acl { private com.google.protobuf.RepeatedFieldBuilderV3 getEntriesFieldBuilder() { if (entriesBuilder_ == null) { - entriesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(entries_, ((bitField0_ & 0x00000010) != 0), getParentForChildren(), isClean()); + entriesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(entries_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean()); entries_ = null; } return entriesBuilder_; @@ -4310,17 +4375,7 @@ public final class Acl { @java.lang.Override public AclRuleSet parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new AclRuleSet(input, extensionRegistry); } }; diff --git a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java index 9bcff8a50..459377049 100644 --- a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java +++ b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java @@ -184,9 +184,9 @@ public final class ContextOuterClass { */ DEVICEDRIVER_GNMI_OPENCONFIG(8), /** - * DEVICEDRIVER_FLEXSCALE = 9; + * DEVICEDRIVER_OPTICAL_TFS = 9; */ - DEVICEDRIVER_FLEXSCALE(9), + DEVICEDRIVER_OPTICAL_TFS(9), /** * DEVICEDRIVER_IETF_ACTN = 10; */ @@ -247,9 +247,9 @@ public final class ContextOuterClass { public static final int DEVICEDRIVER_GNMI_OPENCONFIG_VALUE = 8; /** - * DEVICEDRIVER_FLEXSCALE = 9; + * DEVICEDRIVER_OPTICAL_TFS = 9; */ - public static final int DEVICEDRIVER_FLEXSCALE_VALUE = 9; + public static final int DEVICEDRIVER_OPTICAL_TFS_VALUE = 9; /** * DEVICEDRIVER_IETF_ACTN = 10; @@ -303,7 +303,7 @@ public final class ContextOuterClass { case 8: return DEVICEDRIVER_GNMI_OPENCONFIG; case 9: - return DEVICEDRIVER_FLEXSCALE; + return DEVICEDRIVER_OPTICAL_TFS; case 10: return DEVICEDRIVER_IETF_ACTN; case 11: @@ -1363,6 +1363,44 @@ public final class ContextOuterClass { return new Empty(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private Empty(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Empty_descriptor; } @@ -1387,7 +1425,7 @@ public final class ContextOuterClass { @java.lang.Override public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -1396,7 +1434,7 @@ public final class ContextOuterClass { if (size != -1) return size; size = 0; - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -1410,7 +1448,7 @@ public final class ContextOuterClass { return super.equals(obj); } context.ContextOuterClass.Empty other = (context.ContextOuterClass.Empty) obj; - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -1422,7 +1460,7 @@ public final class ContextOuterClass { } int hash = 41; hash = (19 * hash) + getDescriptor().hashCode(); - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -1520,10 +1558,17 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.Empty.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + } } @java.lang.Override @@ -1558,6 +1603,36 @@ public final class ContextOuterClass { return result; } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override public Builder mergeFrom(com.google.protobuf.Message other) { if (other instanceof context.ContextOuterClass.Empty) { @@ -1571,7 +1646,7 @@ public final class ContextOuterClass { public Builder mergeFrom(context.ContextOuterClass.Empty other) { if (other == context.ContextOuterClass.Empty.getDefaultInstance()) return this; - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -1583,35 +1658,17 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.Empty parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.Empty) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } @@ -1642,17 +1699,7 @@ public final class ContextOuterClass { @java.lang.Override public Empty parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new Empty(input, extensionRegistry); } }; @@ -1710,6 +1757,50 @@ public final class ContextOuterClass { return new Uuid(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private Uuid(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + java.lang.String s = input.readStringRequireUtf8(); + uuid_ = s; + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Uuid_descriptor; } @@ -1721,8 +1812,7 @@ public final class ContextOuterClass { public static final int UUID_FIELD_NUMBER = 1; - @SuppressWarnings("serial") - private volatile java.lang.Object uuid_ = ""; + private volatile java.lang.Object uuid_; /** * string uuid = 1; @@ -1772,10 +1862,10 @@ public final class ContextOuterClass { @java.lang.Override public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uuid_)) { + if (!getUuidBytes().isEmpty()) { com.google.protobuf.GeneratedMessageV3.writeString(output, 1, uuid_); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -1784,10 +1874,10 @@ public final class ContextOuterClass { if (size != -1) return size; size = 0; - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uuid_)) { + if (!getUuidBytes().isEmpty()) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, uuid_); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -1803,7 +1893,7 @@ public final class ContextOuterClass { context.ContextOuterClass.Uuid other = (context.ContextOuterClass.Uuid) obj; if (!getUuid().equals(other.getUuid())) return false; - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -1817,7 +1907,7 @@ public final class ContextOuterClass { hash = (19 * hash) + getDescriptor().hashCode(); hash = (37 * hash) + UUID_FIELD_NUMBER; hash = (53 * hash) + getUuid().hashCode(); - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -1911,16 +2001,22 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.Uuid.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; uuid_ = ""; return this; } @@ -1947,18 +2043,39 @@ public final class ContextOuterClass { @java.lang.Override public context.ContextOuterClass.Uuid buildPartial() { context.ContextOuterClass.Uuid result = new context.ContextOuterClass.Uuid(this); - if (bitField0_ != 0) { - buildPartial0(result); - } + result.uuid_ = uuid_; onBuilt(); return result; } - private void buildPartial0(context.ContextOuterClass.Uuid result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.uuid_ = uuid_; - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -1976,10 +2093,9 @@ public final class ContextOuterClass { return this; if (!other.getUuid().isEmpty()) { uuid_ = other.uuid_; - bitField0_ |= 0x00000001; onChanged(); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -1991,47 +2107,20 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.Uuid parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - uuid_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000001; - break; - } - // case 10 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.Uuid) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } - private int bitField0_; - private java.lang.Object uuid_ = ""; /** @@ -2075,7 +2164,6 @@ public final class ContextOuterClass { throw new NullPointerException(); } uuid_ = value; - bitField0_ |= 0x00000001; onChanged(); return this; } @@ -2086,7 +2174,6 @@ public final class ContextOuterClass { */ public Builder clearUuid() { uuid_ = getDefaultInstance().getUuid(); - bitField0_ = (bitField0_ & ~0x00000001); onChanged(); return this; } @@ -2102,7 +2189,6 @@ public final class ContextOuterClass { } checkByteStringIsUtf8(value); uuid_ = value; - bitField0_ |= 0x00000001; onChanged(); return this; } @@ -2134,17 +2220,7 @@ public final class ContextOuterClass { @java.lang.Override public Uuid parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new Uuid(input, extensionRegistry); } }; @@ -2195,6 +2271,49 @@ public final class ContextOuterClass { return new Timestamp(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private Timestamp(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 9: + { + timestamp_ = input.readDouble(); + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Timestamp_descriptor; } @@ -2206,7 +2325,7 @@ public final class ContextOuterClass { public static final int TIMESTAMP_FIELD_NUMBER = 1; - private double timestamp_ = 0D; + private double timestamp_; /** * double timestamp = 1; @@ -2232,10 +2351,10 @@ public final class ContextOuterClass { @java.lang.Override public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { - if (java.lang.Double.doubleToRawLongBits(timestamp_) != 0) { + if (timestamp_ != 0D) { output.writeDouble(1, timestamp_); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -2244,10 +2363,10 @@ public final class ContextOuterClass { if (size != -1) return size; size = 0; - if (java.lang.Double.doubleToRawLongBits(timestamp_) != 0) { + if (timestamp_ != 0D) { size += com.google.protobuf.CodedOutputStream.computeDoubleSize(1, timestamp_); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -2263,7 +2382,7 @@ public final class ContextOuterClass { context.ContextOuterClass.Timestamp other = (context.ContextOuterClass.Timestamp) obj; if (java.lang.Double.doubleToLongBits(getTimestamp()) != java.lang.Double.doubleToLongBits(other.getTimestamp())) return false; - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -2277,7 +2396,7 @@ public final class ContextOuterClass { hash = (19 * hash) + getDescriptor().hashCode(); hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER; hash = (53 * hash) + com.google.protobuf.Internal.hashLong(java.lang.Double.doubleToLongBits(getTimestamp())); - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -2371,16 +2490,22 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.Timestamp.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; timestamp_ = 0D; return this; } @@ -2407,18 +2532,39 @@ public final class ContextOuterClass { @java.lang.Override public context.ContextOuterClass.Timestamp buildPartial() { context.ContextOuterClass.Timestamp result = new context.ContextOuterClass.Timestamp(this); - if (bitField0_ != 0) { - buildPartial0(result); - } + result.timestamp_ = timestamp_; onBuilt(); return result; } - private void buildPartial0(context.ContextOuterClass.Timestamp result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.timestamp_ = timestamp_; - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -2437,7 +2583,7 @@ public final class ContextOuterClass { if (other.getTimestamp() != 0D) { setTimestamp(other.getTimestamp()); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -2449,47 +2595,20 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.Timestamp parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 9: - { - timestamp_ = input.readDouble(); - bitField0_ |= 0x00000001; - break; - } - // case 9 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.Timestamp) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } - private int bitField0_; - private double timestamp_; /** @@ -2508,7 +2627,6 @@ public final class ContextOuterClass { */ public Builder setTimestamp(double value) { timestamp_ = value; - bitField0_ |= 0x00000001; onChanged(); return this; } @@ -2518,7 +2636,6 @@ public final class ContextOuterClass { * @return This builder for chaining. */ public Builder clearTimestamp() { - bitField0_ = (bitField0_ & ~0x00000001); timestamp_ = 0D; onChanged(); return this; @@ -2551,17 +2668,7 @@ public final class ContextOuterClass { @java.lang.Override public Timestamp parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new Timestamp(input, extensionRegistry); } }; @@ -2636,6 +2743,63 @@ public final class ContextOuterClass { return new Event(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private Event(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + context.ContextOuterClass.Timestamp.Builder subBuilder = null; + if (timestamp_ != null) { + subBuilder = timestamp_.toBuilder(); + } + timestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(timestamp_); + timestamp_ = subBuilder.buildPartial(); + } + break; + } + case 16: + { + int rawValue = input.readEnum(); + eventType_ = rawValue; + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Event_descriptor; } @@ -2672,12 +2836,12 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() { - return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_; + return getTimestamp(); } public static final int EVENT_TYPE_FIELD_NUMBER = 2; - private int eventType_ = 0; + private int eventType_; /** * .context.EventTypeEnum event_type = 2; @@ -2694,7 +2858,8 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.EventTypeEnum getEventType() { - context.ContextOuterClass.EventTypeEnum result = context.ContextOuterClass.EventTypeEnum.forNumber(eventType_); + @SuppressWarnings("deprecation") + context.ContextOuterClass.EventTypeEnum result = context.ContextOuterClass.EventTypeEnum.valueOf(eventType_); return result == null ? context.ContextOuterClass.EventTypeEnum.UNRECOGNIZED : result; } @@ -2719,7 +2884,7 @@ public final class ContextOuterClass { if (eventType_ != context.ContextOuterClass.EventTypeEnum.EVENTTYPE_UNDEFINED.getNumber()) { output.writeEnum(2, eventType_); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -2734,7 +2899,7 @@ public final class ContextOuterClass { if (eventType_ != context.ContextOuterClass.EventTypeEnum.EVENTTYPE_UNDEFINED.getNumber()) { size += com.google.protobuf.CodedOutputStream.computeEnumSize(2, eventType_); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -2756,7 +2921,7 @@ public final class ContextOuterClass { } if (eventType_ != other.eventType_) return false; - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -2774,7 +2939,7 @@ public final class ContextOuterClass { } hash = (37 * hash) + EVENT_TYPE_FIELD_NUMBER; hash = (53 * hash) + eventType_; - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -2868,19 +3033,26 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.Event.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; - timestamp_ = null; - if (timestampBuilder_ != null) { - timestampBuilder_.dispose(); + if (timestampBuilder_ == null) { + timestamp_ = null; + } else { + timestamp_ = null; timestampBuilder_ = null; } eventType_ = 0; @@ -2909,21 +3081,44 @@ public final class ContextOuterClass { @java.lang.Override public context.ContextOuterClass.Event buildPartial() { context.ContextOuterClass.Event result = new context.ContextOuterClass.Event(this); - if (bitField0_ != 0) { - buildPartial0(result); + if (timestampBuilder_ == null) { + result.timestamp_ = timestamp_; + } else { + result.timestamp_ = timestampBuilder_.build(); } + result.eventType_ = eventType_; onBuilt(); return result; } - private void buildPartial0(context.ContextOuterClass.Event result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.timestamp_ = timestampBuilder_ == null ? timestamp_ : timestampBuilder_.build(); - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.eventType_ = eventType_; - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -2945,7 +3140,7 @@ public final class ContextOuterClass { if (other.eventType_ != 0) { setEventTypeValue(other.getEventTypeValue()); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -2957,54 +3152,20 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.Event parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - input.readMessage(getTimestampFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000001; - break; - } - // case 10 - case 16: - { - eventType_ = input.readEnum(); - bitField0_ |= 0x00000002; - break; - } - // case 16 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.Event) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } - private int bitField0_; - private context.ContextOuterClass.Timestamp timestamp_; private com.google.protobuf.SingleFieldBuilderV3 timestampBuilder_; @@ -3014,7 +3175,7 @@ public final class ContextOuterClass { * @return Whether the timestamp field is set. */ public boolean hasTimestamp() { - return ((bitField0_ & 0x00000001) != 0); + return timestampBuilder_ != null || timestamp_ != null; } /** @@ -3038,11 +3199,10 @@ public final class ContextOuterClass { throw new NullPointerException(); } timestamp_ = value; + onChanged(); } else { timestampBuilder_.setMessage(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -3052,11 +3212,10 @@ public final class ContextOuterClass { public Builder setTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) { if (timestampBuilder_ == null) { timestamp_ = builderForValue.build(); + onChanged(); } else { timestampBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -3065,16 +3224,15 @@ public final class ContextOuterClass { */ public Builder mergeTimestamp(context.ContextOuterClass.Timestamp value) { if (timestampBuilder_ == null) { - if (((bitField0_ & 0x00000001) != 0) && timestamp_ != null && timestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) { - getTimestampBuilder().mergeFrom(value); + if (timestamp_ != null) { + timestamp_ = context.ContextOuterClass.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial(); } else { timestamp_ = value; } + onChanged(); } else { timestampBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -3082,13 +3240,13 @@ public final class ContextOuterClass { * .context.Timestamp timestamp = 1; */ public Builder clearTimestamp() { - bitField0_ = (bitField0_ & ~0x00000001); - timestamp_ = null; - if (timestampBuilder_ != null) { - timestampBuilder_.dispose(); + if (timestampBuilder_ == null) { + timestamp_ = null; + onChanged(); + } else { + timestamp_ = null; timestampBuilder_ = null; } - onChanged(); return this; } @@ -3096,7 +3254,6 @@ public final class ContextOuterClass { * .context.Timestamp timestamp = 1; */ public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() { - bitField0_ |= 0x00000001; onChanged(); return getTimestampFieldBuilder().getBuilder(); } @@ -3141,7 +3298,6 @@ public final class ContextOuterClass { */ public Builder setEventTypeValue(int value) { eventType_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -3152,7 +3308,8 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.EventTypeEnum getEventType() { - context.ContextOuterClass.EventTypeEnum result = context.ContextOuterClass.EventTypeEnum.forNumber(eventType_); + @SuppressWarnings("deprecation") + context.ContextOuterClass.EventTypeEnum result = context.ContextOuterClass.EventTypeEnum.valueOf(eventType_); return result == null ? context.ContextOuterClass.EventTypeEnum.UNRECOGNIZED : result; } @@ -3165,7 +3322,6 @@ public final class ContextOuterClass { if (value == null) { throw new NullPointerException(); } - bitField0_ |= 0x00000002; eventType_ = value.getNumber(); onChanged(); return this; @@ -3176,7 +3332,6 @@ public final class ContextOuterClass { * @return This builder for chaining. */ public Builder clearEventType() { - bitField0_ = (bitField0_ & ~0x00000002); eventType_ = 0; onChanged(); return this; @@ -3209,17 +3364,7 @@ public final class ContextOuterClass { @java.lang.Override public Event parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new Event(input, extensionRegistry); } }; @@ -3285,6 +3430,57 @@ public final class ContextOuterClass { return new ContextId(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private ContextId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + context.ContextOuterClass.Uuid.Builder subBuilder = null; + if (contextUuid_ != null) { + subBuilder = contextUuid_.toBuilder(); + } + contextUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(contextUuid_); + contextUuid_ = subBuilder.buildPartial(); + } + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ContextId_descriptor; } @@ -3321,7 +3517,7 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.UuidOrBuilder getContextUuidOrBuilder() { - return contextUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : contextUuid_; + return getContextUuid(); } private byte memoizedIsInitialized = -1; @@ -3342,7 +3538,7 @@ public final class ContextOuterClass { if (contextUuid_ != null) { output.writeMessage(1, getContextUuid()); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -3354,7 +3550,7 @@ public final class ContextOuterClass { if (contextUuid_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getContextUuid()); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -3374,7 +3570,7 @@ public final class ContextOuterClass { if (!getContextUuid().equals(other.getContextUuid())) return false; } - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -3390,7 +3586,7 @@ public final class ContextOuterClass { hash = (37 * hash) + CONTEXT_UUID_FIELD_NUMBER; hash = (53 * hash) + getContextUuid().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -3488,19 +3684,26 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.ContextId.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; - contextUuid_ = null; - if (contextUuidBuilder_ != null) { - contextUuidBuilder_.dispose(); + if (contextUuidBuilder_ == null) { + contextUuid_ = null; + } else { + contextUuid_ = null; contextUuidBuilder_ = null; } return this; @@ -3528,18 +3731,43 @@ public final class ContextOuterClass { @java.lang.Override public context.ContextOuterClass.ContextId buildPartial() { context.ContextOuterClass.ContextId result = new context.ContextOuterClass.ContextId(this); - if (bitField0_ != 0) { - buildPartial0(result); + if (contextUuidBuilder_ == null) { + result.contextUuid_ = contextUuid_; + } else { + result.contextUuid_ = contextUuidBuilder_.build(); } onBuilt(); return result; } - private void buildPartial0(context.ContextOuterClass.ContextId result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.contextUuid_ = contextUuidBuilder_ == null ? contextUuid_ : contextUuidBuilder_.build(); - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -3558,7 +3786,7 @@ public final class ContextOuterClass { if (other.hasContextUuid()) { mergeContextUuid(other.getContextUuid()); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -3570,47 +3798,20 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.ContextId parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - input.readMessage(getContextUuidFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000001; - break; - } - // case 10 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.ContextId) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } - private int bitField0_; - private context.ContextOuterClass.Uuid contextUuid_; private com.google.protobuf.SingleFieldBuilderV3 contextUuidBuilder_; @@ -3620,7 +3821,7 @@ public final class ContextOuterClass { * @return Whether the contextUuid field is set. */ public boolean hasContextUuid() { - return ((bitField0_ & 0x00000001) != 0); + return contextUuidBuilder_ != null || contextUuid_ != null; } /** @@ -3644,11 +3845,10 @@ public final class ContextOuterClass { throw new NullPointerException(); } contextUuid_ = value; + onChanged(); } else { contextUuidBuilder_.setMessage(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -3658,11 +3858,10 @@ public final class ContextOuterClass { public Builder setContextUuid(context.ContextOuterClass.Uuid.Builder builderForValue) { if (contextUuidBuilder_ == null) { contextUuid_ = builderForValue.build(); + onChanged(); } else { contextUuidBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -3671,16 +3870,15 @@ public final class ContextOuterClass { */ public Builder mergeContextUuid(context.ContextOuterClass.Uuid value) { if (contextUuidBuilder_ == null) { - if (((bitField0_ & 0x00000001) != 0) && contextUuid_ != null && contextUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) { - getContextUuidBuilder().mergeFrom(value); + if (contextUuid_ != null) { + contextUuid_ = context.ContextOuterClass.Uuid.newBuilder(contextUuid_).mergeFrom(value).buildPartial(); } else { contextUuid_ = value; } + onChanged(); } else { contextUuidBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -3688,13 +3886,13 @@ public final class ContextOuterClass { * .context.Uuid context_uuid = 1; */ public Builder clearContextUuid() { - bitField0_ = (bitField0_ & ~0x00000001); - contextUuid_ = null; - if (contextUuidBuilder_ != null) { - contextUuidBuilder_.dispose(); + if (contextUuidBuilder_ == null) { + contextUuid_ = null; + onChanged(); + } else { + contextUuid_ = null; contextUuidBuilder_ = null; } - onChanged(); return this; } @@ -3702,7 +3900,6 @@ public final class ContextOuterClass { * .context.Uuid context_uuid = 1; */ public context.ContextOuterClass.Uuid.Builder getContextUuidBuilder() { - bitField0_ |= 0x00000001; onChanged(); return getContextUuidFieldBuilder().getBuilder(); } @@ -3756,17 +3953,7 @@ public final class ContextOuterClass { @java.lang.Override public ContextId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new ContextId(input, extensionRegistry); } }; @@ -3936,6 +4123,113 @@ public final class ContextOuterClass { return new Context(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private Context(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + context.ContextOuterClass.ContextId.Builder subBuilder = null; + if (contextId_ != null) { + subBuilder = contextId_.toBuilder(); + } + contextId_ = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(contextId_); + contextId_ = subBuilder.buildPartial(); + } + break; + } + case 18: + { + java.lang.String s = input.readStringRequireUtf8(); + name_ = s; + break; + } + case 26: + { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + topologyIds_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + topologyIds_.add(input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry)); + break; + } + case 34: + { + if (!((mutable_bitField0_ & 0x00000002) != 0)) { + serviceIds_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + serviceIds_.add(input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry)); + break; + } + case 42: + { + if (!((mutable_bitField0_ & 0x00000004) != 0)) { + sliceIds_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + sliceIds_.add(input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry)); + break; + } + case 50: + { + context.ContextOuterClass.TeraFlowController.Builder subBuilder = null; + if (controller_ != null) { + subBuilder = controller_.toBuilder(); + } + controller_ = input.readMessage(context.ContextOuterClass.TeraFlowController.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(controller_); + controller_ = subBuilder.buildPartial(); + } + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + topologyIds_ = java.util.Collections.unmodifiableList(topologyIds_); + } + if (((mutable_bitField0_ & 0x00000002) != 0)) { + serviceIds_ = java.util.Collections.unmodifiableList(serviceIds_); + } + if (((mutable_bitField0_ & 0x00000004) != 0)) { + sliceIds_ = java.util.Collections.unmodifiableList(sliceIds_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Context_descriptor; } @@ -3972,13 +4266,12 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() { - return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_; + return getContextId(); } public static final int NAME_FIELD_NUMBER = 2; - @SuppressWarnings("serial") - private volatile java.lang.Object name_ = ""; + private volatile java.lang.Object name_; /** * string name = 2; @@ -4015,7 +4308,6 @@ public final class ContextOuterClass { public static final int TOPOLOGY_IDS_FIELD_NUMBER = 3; - @SuppressWarnings("serial") private java.util.List topologyIds_; /** @@ -4060,7 +4352,6 @@ public final class ContextOuterClass { public static final int SERVICE_IDS_FIELD_NUMBER = 4; - @SuppressWarnings("serial") private java.util.List serviceIds_; /** @@ -4105,7 +4396,6 @@ public final class ContextOuterClass { public static final int SLICE_IDS_FIELD_NUMBER = 5; - @SuppressWarnings("serial") private java.util.List sliceIds_; /** @@ -4175,7 +4465,7 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.TeraFlowControllerOrBuilder getControllerOrBuilder() { - return controller_ == null ? context.ContextOuterClass.TeraFlowController.getDefaultInstance() : controller_; + return getController(); } private byte memoizedIsInitialized = -1; @@ -4196,7 +4486,7 @@ public final class ContextOuterClass { if (contextId_ != null) { output.writeMessage(1, getContextId()); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + if (!getNameBytes().isEmpty()) { com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_); } for (int i = 0; i < topologyIds_.size(); i++) { @@ -4211,7 +4501,7 @@ public final class ContextOuterClass { if (controller_ != null) { output.writeMessage(6, getController()); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -4223,7 +4513,7 @@ public final class ContextOuterClass { if (contextId_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getContextId()); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + if (!getNameBytes().isEmpty()) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_); } for (int i = 0; i < topologyIds_.size(); i++) { @@ -4238,7 +4528,7 @@ public final class ContextOuterClass { if (controller_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(6, getController()); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -4272,7 +4562,7 @@ public final class ContextOuterClass { if (!getController().equals(other.getController())) return false; } - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -4306,7 +4596,7 @@ public final class ContextOuterClass { hash = (37 * hash) + CONTROLLER_FIELD_NUMBER; hash = (53 * hash) + getController().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -4400,46 +4690,54 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.Context.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + getTopologyIdsFieldBuilder(); + getServiceIdsFieldBuilder(); + getSliceIdsFieldBuilder(); + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; - contextId_ = null; - if (contextIdBuilder_ != null) { - contextIdBuilder_.dispose(); + if (contextIdBuilder_ == null) { + contextId_ = null; + } else { + contextId_ = null; contextIdBuilder_ = null; } name_ = ""; if (topologyIdsBuilder_ == null) { topologyIds_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); } else { - topologyIds_ = null; topologyIdsBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000004); if (serviceIdsBuilder_ == null) { serviceIds_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); } else { - serviceIds_ = null; serviceIdsBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000008); if (sliceIdsBuilder_ == null) { sliceIds_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); } else { - sliceIds_ = null; sliceIdsBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000010); - controller_ = null; - if (controllerBuilder_ != null) { - controllerBuilder_.dispose(); + if (controllerBuilder_ == null) { + controller_ = null; + } else { + controller_ = null; controllerBuilder_ = null; } return this; @@ -4467,55 +4765,77 @@ public final class ContextOuterClass { @java.lang.Override public context.ContextOuterClass.Context buildPartial() { context.ContextOuterClass.Context result = new context.ContextOuterClass.Context(this); - buildPartialRepeatedFields(result); - if (bitField0_ != 0) { - buildPartial0(result); + int from_bitField0_ = bitField0_; + if (contextIdBuilder_ == null) { + result.contextId_ = contextId_; + } else { + result.contextId_ = contextIdBuilder_.build(); } - onBuilt(); - return result; - } - - private void buildPartialRepeatedFields(context.ContextOuterClass.Context result) { + result.name_ = name_; if (topologyIdsBuilder_ == null) { - if (((bitField0_ & 0x00000004) != 0)) { + if (((bitField0_ & 0x00000001) != 0)) { topologyIds_ = java.util.Collections.unmodifiableList(topologyIds_); - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); } result.topologyIds_ = topologyIds_; } else { result.topologyIds_ = topologyIdsBuilder_.build(); } if (serviceIdsBuilder_ == null) { - if (((bitField0_ & 0x00000008) != 0)) { + if (((bitField0_ & 0x00000002) != 0)) { serviceIds_ = java.util.Collections.unmodifiableList(serviceIds_); - bitField0_ = (bitField0_ & ~0x00000008); + bitField0_ = (bitField0_ & ~0x00000002); } result.serviceIds_ = serviceIds_; } else { result.serviceIds_ = serviceIdsBuilder_.build(); } if (sliceIdsBuilder_ == null) { - if (((bitField0_ & 0x00000010) != 0)) { + if (((bitField0_ & 0x00000004) != 0)) { sliceIds_ = java.util.Collections.unmodifiableList(sliceIds_); - bitField0_ = (bitField0_ & ~0x00000010); + bitField0_ = (bitField0_ & ~0x00000004); } result.sliceIds_ = sliceIds_; } else { result.sliceIds_ = sliceIdsBuilder_.build(); } + if (controllerBuilder_ == null) { + result.controller_ = controller_; + } else { + result.controller_ = controllerBuilder_.build(); + } + onBuilt(); + return result; } - private void buildPartial0(context.ContextOuterClass.Context result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.contextId_ = contextIdBuilder_ == null ? contextId_ : contextIdBuilder_.build(); - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.name_ = name_; - } - if (((from_bitField0_ & 0x00000020) != 0)) { - result.controller_ = controllerBuilder_ == null ? controller_ : controllerBuilder_.build(); - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -4536,14 +4856,13 @@ public final class ContextOuterClass { } if (!other.getName().isEmpty()) { name_ = other.name_; - bitField0_ |= 0x00000002; onChanged(); } if (topologyIdsBuilder_ == null) { if (!other.topologyIds_.isEmpty()) { if (topologyIds_.isEmpty()) { topologyIds_ = other.topologyIds_; - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); } else { ensureTopologyIdsIsMutable(); topologyIds_.addAll(other.topologyIds_); @@ -4556,7 +4875,7 @@ public final class ContextOuterClass { topologyIdsBuilder_.dispose(); topologyIdsBuilder_ = null; topologyIds_ = other.topologyIds_; - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); topologyIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getTopologyIdsFieldBuilder() : null; } else { topologyIdsBuilder_.addAllMessages(other.topologyIds_); @@ -4567,7 +4886,7 @@ public final class ContextOuterClass { if (!other.serviceIds_.isEmpty()) { if (serviceIds_.isEmpty()) { serviceIds_ = other.serviceIds_; - bitField0_ = (bitField0_ & ~0x00000008); + bitField0_ = (bitField0_ & ~0x00000002); } else { ensureServiceIdsIsMutable(); serviceIds_.addAll(other.serviceIds_); @@ -4580,7 +4899,7 @@ public final class ContextOuterClass { serviceIdsBuilder_.dispose(); serviceIdsBuilder_ = null; serviceIds_ = other.serviceIds_; - bitField0_ = (bitField0_ & ~0x00000008); + bitField0_ = (bitField0_ & ~0x00000002); serviceIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getServiceIdsFieldBuilder() : null; } else { serviceIdsBuilder_.addAllMessages(other.serviceIds_); @@ -4591,7 +4910,7 @@ public final class ContextOuterClass { if (!other.sliceIds_.isEmpty()) { if (sliceIds_.isEmpty()) { sliceIds_ = other.sliceIds_; - bitField0_ = (bitField0_ & ~0x00000010); + bitField0_ = (bitField0_ & ~0x00000004); } else { ensureSliceIdsIsMutable(); sliceIds_.addAll(other.sliceIds_); @@ -4604,7 +4923,7 @@ public final class ContextOuterClass { sliceIdsBuilder_.dispose(); sliceIdsBuilder_ = null; sliceIds_ = other.sliceIds_; - bitField0_ = (bitField0_ & ~0x00000010); + bitField0_ = (bitField0_ & ~0x00000004); sliceIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getSliceIdsFieldBuilder() : null; } else { sliceIdsBuilder_.addAllMessages(other.sliceIds_); @@ -4614,7 +4933,7 @@ public final class ContextOuterClass { if (other.hasController()) { mergeController(other.getController()); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -4626,92 +4945,17 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.Context parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - input.readMessage(getContextIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000001; - break; - } - // case 10 - case 18: - { - name_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000002; - break; - } - // case 18 - case 26: - { - context.ContextOuterClass.TopologyId m = input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry); - if (topologyIdsBuilder_ == null) { - ensureTopologyIdsIsMutable(); - topologyIds_.add(m); - } else { - topologyIdsBuilder_.addMessage(m); - } - break; - } - // case 26 - case 34: - { - context.ContextOuterClass.ServiceId m = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry); - if (serviceIdsBuilder_ == null) { - ensureServiceIdsIsMutable(); - serviceIds_.add(m); - } else { - serviceIdsBuilder_.addMessage(m); - } - break; - } - // case 34 - case 42: - { - context.ContextOuterClass.SliceId m = input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry); - if (sliceIdsBuilder_ == null) { - ensureSliceIdsIsMutable(); - sliceIds_.add(m); - } else { - sliceIdsBuilder_.addMessage(m); - } - break; - } - // case 42 - case 50: - { - input.readMessage(getControllerFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000020; - break; - } - // case 50 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.Context) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } @@ -4726,7 +4970,7 @@ public final class ContextOuterClass { * @return Whether the contextId field is set. */ public boolean hasContextId() { - return ((bitField0_ & 0x00000001) != 0); + return contextIdBuilder_ != null || contextId_ != null; } /** @@ -4750,11 +4994,10 @@ public final class ContextOuterClass { throw new NullPointerException(); } contextId_ = value; + onChanged(); } else { contextIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -4764,11 +5007,10 @@ public final class ContextOuterClass { public Builder setContextId(context.ContextOuterClass.ContextId.Builder builderForValue) { if (contextIdBuilder_ == null) { contextId_ = builderForValue.build(); + onChanged(); } else { contextIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -4777,16 +5019,15 @@ public final class ContextOuterClass { */ public Builder mergeContextId(context.ContextOuterClass.ContextId value) { if (contextIdBuilder_ == null) { - if (((bitField0_ & 0x00000001) != 0) && contextId_ != null && contextId_ != context.ContextOuterClass.ContextId.getDefaultInstance()) { - getContextIdBuilder().mergeFrom(value); + if (contextId_ != null) { + contextId_ = context.ContextOuterClass.ContextId.newBuilder(contextId_).mergeFrom(value).buildPartial(); } else { contextId_ = value; } + onChanged(); } else { contextIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -4794,13 +5035,13 @@ public final class ContextOuterClass { * .context.ContextId context_id = 1; */ public Builder clearContextId() { - bitField0_ = (bitField0_ & ~0x00000001); - contextId_ = null; - if (contextIdBuilder_ != null) { - contextIdBuilder_.dispose(); + if (contextIdBuilder_ == null) { + contextId_ = null; + onChanged(); + } else { + contextId_ = null; contextIdBuilder_ = null; } - onChanged(); return this; } @@ -4808,7 +5049,6 @@ public final class ContextOuterClass { * .context.ContextId context_id = 1; */ public context.ContextOuterClass.ContextId.Builder getContextIdBuilder() { - bitField0_ |= 0x00000001; onChanged(); return getContextIdFieldBuilder().getBuilder(); } @@ -4878,7 +5118,6 @@ public final class ContextOuterClass { throw new NullPointerException(); } name_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -4889,7 +5128,6 @@ public final class ContextOuterClass { */ public Builder clearName() { name_ = getDefaultInstance().getName(); - bitField0_ = (bitField0_ & ~0x00000002); onChanged(); return this; } @@ -4905,7 +5143,6 @@ public final class ContextOuterClass { } checkByteStringIsUtf8(value); name_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -4913,9 +5150,9 @@ public final class ContextOuterClass { private java.util.List topologyIds_ = java.util.Collections.emptyList(); private void ensureTopologyIdsIsMutable() { - if (!((bitField0_ & 0x00000004) != 0)) { + if (!((bitField0_ & 0x00000001) != 0)) { topologyIds_ = new java.util.ArrayList(topologyIds_); - bitField0_ |= 0x00000004; + bitField0_ |= 0x00000001; } } @@ -5067,7 +5304,7 @@ public final class ContextOuterClass { public Builder clearTopologyIds() { if (topologyIdsBuilder_ == null) { topologyIds_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); onChanged(); } else { topologyIdsBuilder_.clear(); @@ -5141,7 +5378,7 @@ public final class ContextOuterClass { private com.google.protobuf.RepeatedFieldBuilderV3 getTopologyIdsFieldBuilder() { if (topologyIdsBuilder_ == null) { - topologyIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(topologyIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean()); + topologyIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(topologyIds_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean()); topologyIds_ = null; } return topologyIdsBuilder_; @@ -5150,9 +5387,9 @@ public final class ContextOuterClass { private java.util.List serviceIds_ = java.util.Collections.emptyList(); private void ensureServiceIdsIsMutable() { - if (!((bitField0_ & 0x00000008) != 0)) { + if (!((bitField0_ & 0x00000002) != 0)) { serviceIds_ = new java.util.ArrayList(serviceIds_); - bitField0_ |= 0x00000008; + bitField0_ |= 0x00000002; } } @@ -5304,7 +5541,7 @@ public final class ContextOuterClass { public Builder clearServiceIds() { if (serviceIdsBuilder_ == null) { serviceIds_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000008); + bitField0_ = (bitField0_ & ~0x00000002); onChanged(); } else { serviceIdsBuilder_.clear(); @@ -5378,7 +5615,7 @@ public final class ContextOuterClass { private com.google.protobuf.RepeatedFieldBuilderV3 getServiceIdsFieldBuilder() { if (serviceIdsBuilder_ == null) { - serviceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(serviceIds_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean()); + serviceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(serviceIds_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean()); serviceIds_ = null; } return serviceIdsBuilder_; @@ -5387,9 +5624,9 @@ public final class ContextOuterClass { private java.util.List sliceIds_ = java.util.Collections.emptyList(); private void ensureSliceIdsIsMutable() { - if (!((bitField0_ & 0x00000010) != 0)) { + if (!((bitField0_ & 0x00000004) != 0)) { sliceIds_ = new java.util.ArrayList(sliceIds_); - bitField0_ |= 0x00000010; + bitField0_ |= 0x00000004; } } @@ -5541,7 +5778,7 @@ public final class ContextOuterClass { public Builder clearSliceIds() { if (sliceIdsBuilder_ == null) { sliceIds_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000010); + bitField0_ = (bitField0_ & ~0x00000004); onChanged(); } else { sliceIdsBuilder_.clear(); @@ -5615,7 +5852,7 @@ public final class ContextOuterClass { private com.google.protobuf.RepeatedFieldBuilderV3 getSliceIdsFieldBuilder() { if (sliceIdsBuilder_ == null) { - sliceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceIds_, ((bitField0_ & 0x00000010) != 0), getParentForChildren(), isClean()); + sliceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean()); sliceIds_ = null; } return sliceIdsBuilder_; @@ -5630,7 +5867,7 @@ public final class ContextOuterClass { * @return Whether the controller field is set. */ public boolean hasController() { - return ((bitField0_ & 0x00000020) != 0); + return controllerBuilder_ != null || controller_ != null; } /** @@ -5654,11 +5891,10 @@ public final class ContextOuterClass { throw new NullPointerException(); } controller_ = value; + onChanged(); } else { controllerBuilder_.setMessage(value); } - bitField0_ |= 0x00000020; - onChanged(); return this; } @@ -5668,11 +5904,10 @@ public final class ContextOuterClass { public Builder setController(context.ContextOuterClass.TeraFlowController.Builder builderForValue) { if (controllerBuilder_ == null) { controller_ = builderForValue.build(); + onChanged(); } else { controllerBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000020; - onChanged(); return this; } @@ -5681,16 +5916,15 @@ public final class ContextOuterClass { */ public Builder mergeController(context.ContextOuterClass.TeraFlowController value) { if (controllerBuilder_ == null) { - if (((bitField0_ & 0x00000020) != 0) && controller_ != null && controller_ != context.ContextOuterClass.TeraFlowController.getDefaultInstance()) { - getControllerBuilder().mergeFrom(value); + if (controller_ != null) { + controller_ = context.ContextOuterClass.TeraFlowController.newBuilder(controller_).mergeFrom(value).buildPartial(); } else { controller_ = value; } + onChanged(); } else { controllerBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000020; - onChanged(); return this; } @@ -5698,13 +5932,13 @@ public final class ContextOuterClass { * .context.TeraFlowController controller = 6; */ public Builder clearController() { - bitField0_ = (bitField0_ & ~0x00000020); - controller_ = null; - if (controllerBuilder_ != null) { - controllerBuilder_.dispose(); + if (controllerBuilder_ == null) { + controller_ = null; + onChanged(); + } else { + controller_ = null; controllerBuilder_ = null; } - onChanged(); return this; } @@ -5712,7 +5946,6 @@ public final class ContextOuterClass { * .context.TeraFlowController controller = 6; */ public context.ContextOuterClass.TeraFlowController.Builder getControllerBuilder() { - bitField0_ |= 0x00000020; onChanged(); return getControllerFieldBuilder().getBuilder(); } @@ -5766,17 +5999,7 @@ public final class ContextOuterClass { @java.lang.Override public Context parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new Context(input, extensionRegistry); } }; @@ -5847,6 +6070,57 @@ public final class ContextOuterClass { return new ContextIdList(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private ContextIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + contextIds_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + contextIds_.add(input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry)); + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + contextIds_ = java.util.Collections.unmodifiableList(contextIds_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ContextIdList_descriptor; } @@ -5858,7 +6132,6 @@ public final class ContextOuterClass { public static final int CONTEXT_IDS_FIELD_NUMBER = 1; - @SuppressWarnings("serial") private java.util.List contextIds_; /** @@ -5919,7 +6192,7 @@ public final class ContextOuterClass { for (int i = 0; i < contextIds_.size(); i++) { output.writeMessage(1, contextIds_.get(i)); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -5931,7 +6204,7 @@ public final class ContextOuterClass { for (int i = 0; i < contextIds_.size(); i++) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, contextIds_.get(i)); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -5947,7 +6220,7 @@ public final class ContextOuterClass { context.ContextOuterClass.ContextIdList other = (context.ContextOuterClass.ContextIdList) obj; if (!getContextIdsList().equals(other.getContextIdsList())) return false; - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -5963,7 +6236,7 @@ public final class ContextOuterClass { hash = (37 * hash) + CONTEXT_IDS_FIELD_NUMBER; hash = (53 * hash) + getContextIdsList().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -6057,23 +6330,29 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.ContextIdList.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + getContextIdsFieldBuilder(); + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; if (contextIdsBuilder_ == null) { contextIds_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); } else { - contextIds_ = null; contextIdsBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000001); return this; } @@ -6099,15 +6378,7 @@ public final class ContextOuterClass { @java.lang.Override public context.ContextOuterClass.ContextIdList buildPartial() { context.ContextOuterClass.ContextIdList result = new context.ContextOuterClass.ContextIdList(this); - buildPartialRepeatedFields(result); - if (bitField0_ != 0) { - buildPartial0(result); - } - onBuilt(); - return result; - } - - private void buildPartialRepeatedFields(context.ContextOuterClass.ContextIdList result) { + int from_bitField0_ = bitField0_; if (contextIdsBuilder_ == null) { if (((bitField0_ & 0x00000001) != 0)) { contextIds_ = java.util.Collections.unmodifiableList(contextIds_); @@ -6117,10 +6388,38 @@ public final class ContextOuterClass { } else { result.contextIds_ = contextIdsBuilder_.build(); } + onBuilt(); + return result; } - private void buildPartial0(context.ContextOuterClass.ContextIdList result) { - int from_bitField0_ = bitField0_; + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -6160,7 +6459,7 @@ public final class ContextOuterClass { } } } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -6172,47 +6471,17 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.ContextIdList parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - context.ContextOuterClass.ContextId m = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry); - if (contextIdsBuilder_ == null) { - ensureContextIdsIsMutable(); - contextIds_.add(m); - } else { - contextIdsBuilder_.addMessage(m); - } - break; - } - // case 10 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.ContextIdList) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } @@ -6482,17 +6751,7 @@ public final class ContextOuterClass { @java.lang.Override public ContextIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new ContextIdList(input, extensionRegistry); } }; @@ -6563,6 +6822,57 @@ public final class ContextOuterClass { return new ContextList(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private ContextList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + contexts_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + contexts_.add(input.readMessage(context.ContextOuterClass.Context.parser(), extensionRegistry)); + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + contexts_ = java.util.Collections.unmodifiableList(contexts_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ContextList_descriptor; } @@ -6574,7 +6884,6 @@ public final class ContextOuterClass { public static final int CONTEXTS_FIELD_NUMBER = 1; - @SuppressWarnings("serial") private java.util.List contexts_; /** @@ -6635,7 +6944,7 @@ public final class ContextOuterClass { for (int i = 0; i < contexts_.size(); i++) { output.writeMessage(1, contexts_.get(i)); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -6647,7 +6956,7 @@ public final class ContextOuterClass { for (int i = 0; i < contexts_.size(); i++) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, contexts_.get(i)); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -6663,7 +6972,7 @@ public final class ContextOuterClass { context.ContextOuterClass.ContextList other = (context.ContextOuterClass.ContextList) obj; if (!getContextsList().equals(other.getContextsList())) return false; - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -6679,7 +6988,7 @@ public final class ContextOuterClass { hash = (37 * hash) + CONTEXTS_FIELD_NUMBER; hash = (53 * hash) + getContextsList().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -6773,23 +7082,29 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.ContextList.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + getContextsFieldBuilder(); + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; if (contextsBuilder_ == null) { contexts_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); } else { - contexts_ = null; contextsBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000001); return this; } @@ -6815,15 +7130,7 @@ public final class ContextOuterClass { @java.lang.Override public context.ContextOuterClass.ContextList buildPartial() { context.ContextOuterClass.ContextList result = new context.ContextOuterClass.ContextList(this); - buildPartialRepeatedFields(result); - if (bitField0_ != 0) { - buildPartial0(result); - } - onBuilt(); - return result; - } - - private void buildPartialRepeatedFields(context.ContextOuterClass.ContextList result) { + int from_bitField0_ = bitField0_; if (contextsBuilder_ == null) { if (((bitField0_ & 0x00000001) != 0)) { contexts_ = java.util.Collections.unmodifiableList(contexts_); @@ -6833,10 +7140,38 @@ public final class ContextOuterClass { } else { result.contexts_ = contextsBuilder_.build(); } + onBuilt(); + return result; } - private void buildPartial0(context.ContextOuterClass.ContextList result) { - int from_bitField0_ = bitField0_; + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -6876,7 +7211,7 @@ public final class ContextOuterClass { } } } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -6888,47 +7223,17 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.ContextList parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - context.ContextOuterClass.Context m = input.readMessage(context.ContextOuterClass.Context.parser(), extensionRegistry); - if (contextsBuilder_ == null) { - ensureContextsIsMutable(); - contexts_.add(m); - } else { - contextsBuilder_.addMessage(m); - } - break; - } - // case 10 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.ContextList) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } @@ -7198,17 +7503,7 @@ public final class ContextOuterClass { @java.lang.Override public ContextList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new ContextList(input, extensionRegistry); } }; @@ -7287,6 +7582,70 @@ public final class ContextOuterClass { return new ContextEvent(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private ContextEvent(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + context.ContextOuterClass.Event.Builder subBuilder = null; + if (event_ != null) { + subBuilder = event_.toBuilder(); + } + event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(event_); + event_ = subBuilder.buildPartial(); + } + break; + } + case 18: + { + context.ContextOuterClass.ContextId.Builder subBuilder = null; + if (contextId_ != null) { + subBuilder = contextId_.toBuilder(); + } + contextId_ = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(contextId_); + contextId_ = subBuilder.buildPartial(); + } + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ContextEvent_descriptor; } @@ -7323,7 +7682,7 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() { - return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_; + return getEvent(); } public static final int CONTEXT_ID_FIELD_NUMBER = 2; @@ -7353,7 +7712,7 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() { - return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_; + return getContextId(); } private byte memoizedIsInitialized = -1; @@ -7377,7 +7736,7 @@ public final class ContextOuterClass { if (contextId_ != null) { output.writeMessage(2, getContextId()); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -7392,7 +7751,7 @@ public final class ContextOuterClass { if (contextId_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getContextId()); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -7418,7 +7777,7 @@ public final class ContextOuterClass { if (!getContextId().equals(other.getContextId())) return false; } - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -7438,7 +7797,7 @@ public final class ContextOuterClass { hash = (37 * hash) + CONTEXT_ID_FIELD_NUMBER; hash = (53 * hash) + getContextId().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -7532,24 +7891,32 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.ContextEvent.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; - event_ = null; - if (eventBuilder_ != null) { - eventBuilder_.dispose(); + if (eventBuilder_ == null) { + event_ = null; + } else { + event_ = null; eventBuilder_ = null; } - contextId_ = null; - if (contextIdBuilder_ != null) { - contextIdBuilder_.dispose(); + if (contextIdBuilder_ == null) { + contextId_ = null; + } else { + contextId_ = null; contextIdBuilder_ = null; } return this; @@ -7577,21 +7944,48 @@ public final class ContextOuterClass { @java.lang.Override public context.ContextOuterClass.ContextEvent buildPartial() { context.ContextOuterClass.ContextEvent result = new context.ContextOuterClass.ContextEvent(this); - if (bitField0_ != 0) { - buildPartial0(result); + if (eventBuilder_ == null) { + result.event_ = event_; + } else { + result.event_ = eventBuilder_.build(); + } + if (contextIdBuilder_ == null) { + result.contextId_ = contextId_; + } else { + result.contextId_ = contextIdBuilder_.build(); } onBuilt(); return result; } - private void buildPartial0(context.ContextOuterClass.ContextEvent result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.event_ = eventBuilder_ == null ? event_ : eventBuilder_.build(); - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.contextId_ = contextIdBuilder_ == null ? contextId_ : contextIdBuilder_.build(); - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -7613,7 +8007,7 @@ public final class ContextOuterClass { if (other.hasContextId()) { mergeContextId(other.getContextId()); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -7625,54 +8019,20 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.ContextEvent parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - input.readMessage(getEventFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000001; - break; - } - // case 10 - case 18: - { - input.readMessage(getContextIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000002; - break; - } - // case 18 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.ContextEvent) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } - private int bitField0_; - private context.ContextOuterClass.Event event_; private com.google.protobuf.SingleFieldBuilderV3 eventBuilder_; @@ -7682,7 +8042,7 @@ public final class ContextOuterClass { * @return Whether the event field is set. */ public boolean hasEvent() { - return ((bitField0_ & 0x00000001) != 0); + return eventBuilder_ != null || event_ != null; } /** @@ -7706,11 +8066,10 @@ public final class ContextOuterClass { throw new NullPointerException(); } event_ = value; + onChanged(); } else { eventBuilder_.setMessage(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -7720,11 +8079,10 @@ public final class ContextOuterClass { public Builder setEvent(context.ContextOuterClass.Event.Builder builderForValue) { if (eventBuilder_ == null) { event_ = builderForValue.build(); + onChanged(); } else { eventBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -7733,16 +8091,15 @@ public final class ContextOuterClass { */ public Builder mergeEvent(context.ContextOuterClass.Event value) { if (eventBuilder_ == null) { - if (((bitField0_ & 0x00000001) != 0) && event_ != null && event_ != context.ContextOuterClass.Event.getDefaultInstance()) { - getEventBuilder().mergeFrom(value); + if (event_ != null) { + event_ = context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial(); } else { event_ = value; } + onChanged(); } else { eventBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -7750,13 +8107,13 @@ public final class ContextOuterClass { * .context.Event event = 1; */ public Builder clearEvent() { - bitField0_ = (bitField0_ & ~0x00000001); - event_ = null; - if (eventBuilder_ != null) { - eventBuilder_.dispose(); + if (eventBuilder_ == null) { + event_ = null; + onChanged(); + } else { + event_ = null; eventBuilder_ = null; } - onChanged(); return this; } @@ -7764,7 +8121,6 @@ public final class ContextOuterClass { * .context.Event event = 1; */ public context.ContextOuterClass.Event.Builder getEventBuilder() { - bitField0_ |= 0x00000001; onChanged(); return getEventFieldBuilder().getBuilder(); } @@ -7800,7 +8156,7 @@ public final class ContextOuterClass { * @return Whether the contextId field is set. */ public boolean hasContextId() { - return ((bitField0_ & 0x00000002) != 0); + return contextIdBuilder_ != null || contextId_ != null; } /** @@ -7824,11 +8180,10 @@ public final class ContextOuterClass { throw new NullPointerException(); } contextId_ = value; + onChanged(); } else { contextIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000002; - onChanged(); return this; } @@ -7838,11 +8193,10 @@ public final class ContextOuterClass { public Builder setContextId(context.ContextOuterClass.ContextId.Builder builderForValue) { if (contextIdBuilder_ == null) { contextId_ = builderForValue.build(); + onChanged(); } else { contextIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000002; - onChanged(); return this; } @@ -7851,16 +8205,15 @@ public final class ContextOuterClass { */ public Builder mergeContextId(context.ContextOuterClass.ContextId value) { if (contextIdBuilder_ == null) { - if (((bitField0_ & 0x00000002) != 0) && contextId_ != null && contextId_ != context.ContextOuterClass.ContextId.getDefaultInstance()) { - getContextIdBuilder().mergeFrom(value); + if (contextId_ != null) { + contextId_ = context.ContextOuterClass.ContextId.newBuilder(contextId_).mergeFrom(value).buildPartial(); } else { contextId_ = value; } + onChanged(); } else { contextIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000002; - onChanged(); return this; } @@ -7868,13 +8221,13 @@ public final class ContextOuterClass { * .context.ContextId context_id = 2; */ public Builder clearContextId() { - bitField0_ = (bitField0_ & ~0x00000002); - contextId_ = null; - if (contextIdBuilder_ != null) { - contextIdBuilder_.dispose(); + if (contextIdBuilder_ == null) { + contextId_ = null; + onChanged(); + } else { + contextId_ = null; contextIdBuilder_ = null; } - onChanged(); return this; } @@ -7882,7 +8235,6 @@ public final class ContextOuterClass { * .context.ContextId context_id = 2; */ public context.ContextOuterClass.ContextId.Builder getContextIdBuilder() { - bitField0_ |= 0x00000002; onChanged(); return getContextIdFieldBuilder().getBuilder(); } @@ -7936,17 +8288,7 @@ public final class ContextOuterClass { @java.lang.Override public ContextEvent parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new ContextEvent(input, extensionRegistry); } }; @@ -8029,6 +8371,70 @@ public final class ContextOuterClass { return new TopologyId(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private TopologyId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + context.ContextOuterClass.ContextId.Builder subBuilder = null; + if (contextId_ != null) { + subBuilder = contextId_.toBuilder(); + } + contextId_ = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(contextId_); + contextId_ = subBuilder.buildPartial(); + } + break; + } + case 18: + { + context.ContextOuterClass.Uuid.Builder subBuilder = null; + if (topologyUuid_ != null) { + subBuilder = topologyUuid_.toBuilder(); + } + topologyUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(topologyUuid_); + topologyUuid_ = subBuilder.buildPartial(); + } + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_TopologyId_descriptor; } @@ -8065,7 +8471,7 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() { - return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_; + return getContextId(); } public static final int TOPOLOGY_UUID_FIELD_NUMBER = 2; @@ -8095,7 +8501,7 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.UuidOrBuilder getTopologyUuidOrBuilder() { - return topologyUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : topologyUuid_; + return getTopologyUuid(); } private byte memoizedIsInitialized = -1; @@ -8119,7 +8525,7 @@ public final class ContextOuterClass { if (topologyUuid_ != null) { output.writeMessage(2, getTopologyUuid()); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -8134,7 +8540,7 @@ public final class ContextOuterClass { if (topologyUuid_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getTopologyUuid()); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -8160,7 +8566,7 @@ public final class ContextOuterClass { if (!getTopologyUuid().equals(other.getTopologyUuid())) return false; } - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -8180,7 +8586,7 @@ public final class ContextOuterClass { hash = (37 * hash) + TOPOLOGY_UUID_FIELD_NUMBER; hash = (53 * hash) + getTopologyUuid().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -8278,24 +8684,32 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.TopologyId.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; - contextId_ = null; - if (contextIdBuilder_ != null) { - contextIdBuilder_.dispose(); + if (contextIdBuilder_ == null) { + contextId_ = null; + } else { + contextId_ = null; contextIdBuilder_ = null; } - topologyUuid_ = null; - if (topologyUuidBuilder_ != null) { - topologyUuidBuilder_.dispose(); + if (topologyUuidBuilder_ == null) { + topologyUuid_ = null; + } else { + topologyUuid_ = null; topologyUuidBuilder_ = null; } return this; @@ -8323,21 +8737,48 @@ public final class ContextOuterClass { @java.lang.Override public context.ContextOuterClass.TopologyId buildPartial() { context.ContextOuterClass.TopologyId result = new context.ContextOuterClass.TopologyId(this); - if (bitField0_ != 0) { - buildPartial0(result); + if (contextIdBuilder_ == null) { + result.contextId_ = contextId_; + } else { + result.contextId_ = contextIdBuilder_.build(); + } + if (topologyUuidBuilder_ == null) { + result.topologyUuid_ = topologyUuid_; + } else { + result.topologyUuid_ = topologyUuidBuilder_.build(); } onBuilt(); return result; } - private void buildPartial0(context.ContextOuterClass.TopologyId result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.contextId_ = contextIdBuilder_ == null ? contextId_ : contextIdBuilder_.build(); - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.topologyUuid_ = topologyUuidBuilder_ == null ? topologyUuid_ : topologyUuidBuilder_.build(); - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -8359,7 +8800,7 @@ public final class ContextOuterClass { if (other.hasTopologyUuid()) { mergeTopologyUuid(other.getTopologyUuid()); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -8371,54 +8812,20 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.TopologyId parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - input.readMessage(getContextIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000001; - break; - } - // case 10 - case 18: - { - input.readMessage(getTopologyUuidFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000002; - break; - } - // case 18 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.TopologyId) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } - private int bitField0_; - private context.ContextOuterClass.ContextId contextId_; private com.google.protobuf.SingleFieldBuilderV3 contextIdBuilder_; @@ -8428,7 +8835,7 @@ public final class ContextOuterClass { * @return Whether the contextId field is set. */ public boolean hasContextId() { - return ((bitField0_ & 0x00000001) != 0); + return contextIdBuilder_ != null || contextId_ != null; } /** @@ -8452,11 +8859,10 @@ public final class ContextOuterClass { throw new NullPointerException(); } contextId_ = value; + onChanged(); } else { contextIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -8466,11 +8872,10 @@ public final class ContextOuterClass { public Builder setContextId(context.ContextOuterClass.ContextId.Builder builderForValue) { if (contextIdBuilder_ == null) { contextId_ = builderForValue.build(); + onChanged(); } else { contextIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -8479,16 +8884,15 @@ public final class ContextOuterClass { */ public Builder mergeContextId(context.ContextOuterClass.ContextId value) { if (contextIdBuilder_ == null) { - if (((bitField0_ & 0x00000001) != 0) && contextId_ != null && contextId_ != context.ContextOuterClass.ContextId.getDefaultInstance()) { - getContextIdBuilder().mergeFrom(value); + if (contextId_ != null) { + contextId_ = context.ContextOuterClass.ContextId.newBuilder(contextId_).mergeFrom(value).buildPartial(); } else { contextId_ = value; } + onChanged(); } else { contextIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -8496,13 +8900,13 @@ public final class ContextOuterClass { * .context.ContextId context_id = 1; */ public Builder clearContextId() { - bitField0_ = (bitField0_ & ~0x00000001); - contextId_ = null; - if (contextIdBuilder_ != null) { - contextIdBuilder_.dispose(); + if (contextIdBuilder_ == null) { + contextId_ = null; + onChanged(); + } else { + contextId_ = null; contextIdBuilder_ = null; } - onChanged(); return this; } @@ -8510,7 +8914,6 @@ public final class ContextOuterClass { * .context.ContextId context_id = 1; */ public context.ContextOuterClass.ContextId.Builder getContextIdBuilder() { - bitField0_ |= 0x00000001; onChanged(); return getContextIdFieldBuilder().getBuilder(); } @@ -8546,7 +8949,7 @@ public final class ContextOuterClass { * @return Whether the topologyUuid field is set. */ public boolean hasTopologyUuid() { - return ((bitField0_ & 0x00000002) != 0); + return topologyUuidBuilder_ != null || topologyUuid_ != null; } /** @@ -8570,11 +8973,10 @@ public final class ContextOuterClass { throw new NullPointerException(); } topologyUuid_ = value; + onChanged(); } else { topologyUuidBuilder_.setMessage(value); } - bitField0_ |= 0x00000002; - onChanged(); return this; } @@ -8584,11 +8986,10 @@ public final class ContextOuterClass { public Builder setTopologyUuid(context.ContextOuterClass.Uuid.Builder builderForValue) { if (topologyUuidBuilder_ == null) { topologyUuid_ = builderForValue.build(); + onChanged(); } else { topologyUuidBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000002; - onChanged(); return this; } @@ -8597,16 +8998,15 @@ public final class ContextOuterClass { */ public Builder mergeTopologyUuid(context.ContextOuterClass.Uuid value) { if (topologyUuidBuilder_ == null) { - if (((bitField0_ & 0x00000002) != 0) && topologyUuid_ != null && topologyUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) { - getTopologyUuidBuilder().mergeFrom(value); + if (topologyUuid_ != null) { + topologyUuid_ = context.ContextOuterClass.Uuid.newBuilder(topologyUuid_).mergeFrom(value).buildPartial(); } else { topologyUuid_ = value; } + onChanged(); } else { topologyUuidBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000002; - onChanged(); return this; } @@ -8614,13 +9014,13 @@ public final class ContextOuterClass { * .context.Uuid topology_uuid = 2; */ public Builder clearTopologyUuid() { - bitField0_ = (bitField0_ & ~0x00000002); - topologyUuid_ = null; - if (topologyUuidBuilder_ != null) { - topologyUuidBuilder_.dispose(); + if (topologyUuidBuilder_ == null) { + topologyUuid_ = null; + onChanged(); + } else { + topologyUuid_ = null; topologyUuidBuilder_ = null; } - onChanged(); return this; } @@ -8628,7 +9028,6 @@ public final class ContextOuterClass { * .context.Uuid topology_uuid = 2; */ public context.ContextOuterClass.Uuid.Builder getTopologyUuidBuilder() { - bitField0_ |= 0x00000002; onChanged(); return getTopologyUuidFieldBuilder().getBuilder(); } @@ -8682,17 +9081,7 @@ public final class ContextOuterClass { @java.lang.Override public TopologyId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new TopologyId(input, extensionRegistry); } }; @@ -8819,6 +9208,88 @@ public final class ContextOuterClass { return new Topology(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private Topology(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + context.ContextOuterClass.TopologyId.Builder subBuilder = null; + if (topologyId_ != null) { + subBuilder = topologyId_.toBuilder(); + } + topologyId_ = input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(topologyId_); + topologyId_ = subBuilder.buildPartial(); + } + break; + } + case 18: + { + java.lang.String s = input.readStringRequireUtf8(); + name_ = s; + break; + } + case 26: + { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + deviceIds_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + deviceIds_.add(input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry)); + break; + } + case 34: + { + if (!((mutable_bitField0_ & 0x00000002) != 0)) { + linkIds_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + linkIds_.add(input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry)); + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + deviceIds_ = java.util.Collections.unmodifiableList(deviceIds_); + } + if (((mutable_bitField0_ & 0x00000002) != 0)) { + linkIds_ = java.util.Collections.unmodifiableList(linkIds_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Topology_descriptor; } @@ -8855,13 +9326,12 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.TopologyIdOrBuilder getTopologyIdOrBuilder() { - return topologyId_ == null ? context.ContextOuterClass.TopologyId.getDefaultInstance() : topologyId_; + return getTopologyId(); } public static final int NAME_FIELD_NUMBER = 2; - @SuppressWarnings("serial") - private volatile java.lang.Object name_ = ""; + private volatile java.lang.Object name_; /** * string name = 2; @@ -8898,7 +9368,6 @@ public final class ContextOuterClass { public static final int DEVICE_IDS_FIELD_NUMBER = 3; - @SuppressWarnings("serial") private java.util.List deviceIds_; /** @@ -8943,7 +9412,6 @@ public final class ContextOuterClass { public static final int LINK_IDS_FIELD_NUMBER = 4; - @SuppressWarnings("serial") private java.util.List linkIds_; /** @@ -9004,7 +9472,7 @@ public final class ContextOuterClass { if (topologyId_ != null) { output.writeMessage(1, getTopologyId()); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + if (!getNameBytes().isEmpty()) { com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_); } for (int i = 0; i < deviceIds_.size(); i++) { @@ -9013,7 +9481,7 @@ public final class ContextOuterClass { for (int i = 0; i < linkIds_.size(); i++) { output.writeMessage(4, linkIds_.get(i)); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -9025,7 +9493,7 @@ public final class ContextOuterClass { if (topologyId_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getTopologyId()); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + if (!getNameBytes().isEmpty()) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_); } for (int i = 0; i < deviceIds_.size(); i++) { @@ -9034,7 +9502,7 @@ public final class ContextOuterClass { for (int i = 0; i < linkIds_.size(); i++) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, linkIds_.get(i)); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -9060,7 +9528,7 @@ public final class ContextOuterClass { return false; if (!getLinkIdsList().equals(other.getLinkIdsList())) return false; - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -9086,7 +9554,7 @@ public final class ContextOuterClass { hash = (37 * hash) + LINK_IDS_FIELD_NUMBER; hash = (53 * hash) + getLinkIdsList().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -9180,36 +9648,43 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.Topology.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + getDeviceIdsFieldBuilder(); + getLinkIdsFieldBuilder(); + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; - topologyId_ = null; - if (topologyIdBuilder_ != null) { - topologyIdBuilder_.dispose(); + if (topologyIdBuilder_ == null) { + topologyId_ = null; + } else { + topologyId_ = null; topologyIdBuilder_ = null; } name_ = ""; if (deviceIdsBuilder_ == null) { deviceIds_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); } else { - deviceIds_ = null; deviceIdsBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000004); if (linkIdsBuilder_ == null) { linkIds_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); } else { - linkIds_ = null; linkIdsBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000008); return this; } @@ -9235,43 +9710,63 @@ public final class ContextOuterClass { @java.lang.Override public context.ContextOuterClass.Topology buildPartial() { context.ContextOuterClass.Topology result = new context.ContextOuterClass.Topology(this); - buildPartialRepeatedFields(result); - if (bitField0_ != 0) { - buildPartial0(result); + int from_bitField0_ = bitField0_; + if (topologyIdBuilder_ == null) { + result.topologyId_ = topologyId_; + } else { + result.topologyId_ = topologyIdBuilder_.build(); } - onBuilt(); - return result; - } - - private void buildPartialRepeatedFields(context.ContextOuterClass.Topology result) { + result.name_ = name_; if (deviceIdsBuilder_ == null) { - if (((bitField0_ & 0x00000004) != 0)) { + if (((bitField0_ & 0x00000001) != 0)) { deviceIds_ = java.util.Collections.unmodifiableList(deviceIds_); - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); } result.deviceIds_ = deviceIds_; } else { result.deviceIds_ = deviceIdsBuilder_.build(); } if (linkIdsBuilder_ == null) { - if (((bitField0_ & 0x00000008) != 0)) { + if (((bitField0_ & 0x00000002) != 0)) { linkIds_ = java.util.Collections.unmodifiableList(linkIds_); - bitField0_ = (bitField0_ & ~0x00000008); + bitField0_ = (bitField0_ & ~0x00000002); } result.linkIds_ = linkIds_; } else { result.linkIds_ = linkIdsBuilder_.build(); } + onBuilt(); + return result; } - private void buildPartial0(context.ContextOuterClass.Topology result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.topologyId_ = topologyIdBuilder_ == null ? topologyId_ : topologyIdBuilder_.build(); - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.name_ = name_; - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -9292,14 +9787,13 @@ public final class ContextOuterClass { } if (!other.getName().isEmpty()) { name_ = other.name_; - bitField0_ |= 0x00000002; onChanged(); } if (deviceIdsBuilder_ == null) { if (!other.deviceIds_.isEmpty()) { if (deviceIds_.isEmpty()) { deviceIds_ = other.deviceIds_; - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); } else { ensureDeviceIdsIsMutable(); deviceIds_.addAll(other.deviceIds_); @@ -9312,7 +9806,7 @@ public final class ContextOuterClass { deviceIdsBuilder_.dispose(); deviceIdsBuilder_ = null; deviceIds_ = other.deviceIds_; - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); deviceIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getDeviceIdsFieldBuilder() : null; } else { deviceIdsBuilder_.addAllMessages(other.deviceIds_); @@ -9323,7 +9817,7 @@ public final class ContextOuterClass { if (!other.linkIds_.isEmpty()) { if (linkIds_.isEmpty()) { linkIds_ = other.linkIds_; - bitField0_ = (bitField0_ & ~0x00000008); + bitField0_ = (bitField0_ & ~0x00000002); } else { ensureLinkIdsIsMutable(); linkIds_.addAll(other.linkIds_); @@ -9336,14 +9830,14 @@ public final class ContextOuterClass { linkIdsBuilder_.dispose(); linkIdsBuilder_ = null; linkIds_ = other.linkIds_; - bitField0_ = (bitField0_ & ~0x00000008); + bitField0_ = (bitField0_ & ~0x00000002); linkIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getLinkIdsFieldBuilder() : null; } else { linkIdsBuilder_.addAllMessages(other.linkIds_); } } } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -9355,73 +9849,17 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.Topology parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - input.readMessage(getTopologyIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000001; - break; - } - // case 10 - case 18: - { - name_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000002; - break; - } - // case 18 - case 26: - { - context.ContextOuterClass.DeviceId m = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry); - if (deviceIdsBuilder_ == null) { - ensureDeviceIdsIsMutable(); - deviceIds_.add(m); - } else { - deviceIdsBuilder_.addMessage(m); - } - break; - } - // case 26 - case 34: - { - context.ContextOuterClass.LinkId m = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry); - if (linkIdsBuilder_ == null) { - ensureLinkIdsIsMutable(); - linkIds_.add(m); - } else { - linkIdsBuilder_.addMessage(m); - } - break; - } - // case 34 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.Topology) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } @@ -9436,7 +9874,7 @@ public final class ContextOuterClass { * @return Whether the topologyId field is set. */ public boolean hasTopologyId() { - return ((bitField0_ & 0x00000001) != 0); + return topologyIdBuilder_ != null || topologyId_ != null; } /** @@ -9460,11 +9898,10 @@ public final class ContextOuterClass { throw new NullPointerException(); } topologyId_ = value; + onChanged(); } else { topologyIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -9474,11 +9911,10 @@ public final class ContextOuterClass { public Builder setTopologyId(context.ContextOuterClass.TopologyId.Builder builderForValue) { if (topologyIdBuilder_ == null) { topologyId_ = builderForValue.build(); + onChanged(); } else { topologyIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -9487,16 +9923,15 @@ public final class ContextOuterClass { */ public Builder mergeTopologyId(context.ContextOuterClass.TopologyId value) { if (topologyIdBuilder_ == null) { - if (((bitField0_ & 0x00000001) != 0) && topologyId_ != null && topologyId_ != context.ContextOuterClass.TopologyId.getDefaultInstance()) { - getTopologyIdBuilder().mergeFrom(value); + if (topologyId_ != null) { + topologyId_ = context.ContextOuterClass.TopologyId.newBuilder(topologyId_).mergeFrom(value).buildPartial(); } else { topologyId_ = value; } + onChanged(); } else { topologyIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -9504,13 +9939,13 @@ public final class ContextOuterClass { * .context.TopologyId topology_id = 1; */ public Builder clearTopologyId() { - bitField0_ = (bitField0_ & ~0x00000001); - topologyId_ = null; - if (topologyIdBuilder_ != null) { - topologyIdBuilder_.dispose(); + if (topologyIdBuilder_ == null) { + topologyId_ = null; + onChanged(); + } else { + topologyId_ = null; topologyIdBuilder_ = null; } - onChanged(); return this; } @@ -9518,7 +9953,6 @@ public final class ContextOuterClass { * .context.TopologyId topology_id = 1; */ public context.ContextOuterClass.TopologyId.Builder getTopologyIdBuilder() { - bitField0_ |= 0x00000001; onChanged(); return getTopologyIdFieldBuilder().getBuilder(); } @@ -9588,7 +10022,6 @@ public final class ContextOuterClass { throw new NullPointerException(); } name_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -9599,7 +10032,6 @@ public final class ContextOuterClass { */ public Builder clearName() { name_ = getDefaultInstance().getName(); - bitField0_ = (bitField0_ & ~0x00000002); onChanged(); return this; } @@ -9615,7 +10047,6 @@ public final class ContextOuterClass { } checkByteStringIsUtf8(value); name_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -9623,9 +10054,9 @@ public final class ContextOuterClass { private java.util.List deviceIds_ = java.util.Collections.emptyList(); private void ensureDeviceIdsIsMutable() { - if (!((bitField0_ & 0x00000004) != 0)) { + if (!((bitField0_ & 0x00000001) != 0)) { deviceIds_ = new java.util.ArrayList(deviceIds_); - bitField0_ |= 0x00000004; + bitField0_ |= 0x00000001; } } @@ -9777,7 +10208,7 @@ public final class ContextOuterClass { public Builder clearDeviceIds() { if (deviceIdsBuilder_ == null) { deviceIds_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); onChanged(); } else { deviceIdsBuilder_.clear(); @@ -9851,7 +10282,7 @@ public final class ContextOuterClass { private com.google.protobuf.RepeatedFieldBuilderV3 getDeviceIdsFieldBuilder() { if (deviceIdsBuilder_ == null) { - deviceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(deviceIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean()); + deviceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(deviceIds_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean()); deviceIds_ = null; } return deviceIdsBuilder_; @@ -9860,9 +10291,9 @@ public final class ContextOuterClass { private java.util.List linkIds_ = java.util.Collections.emptyList(); private void ensureLinkIdsIsMutable() { - if (!((bitField0_ & 0x00000008) != 0)) { + if (!((bitField0_ & 0x00000002) != 0)) { linkIds_ = new java.util.ArrayList(linkIds_); - bitField0_ |= 0x00000008; + bitField0_ |= 0x00000002; } } @@ -10014,7 +10445,7 @@ public final class ContextOuterClass { public Builder clearLinkIds() { if (linkIdsBuilder_ == null) { linkIds_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000008); + bitField0_ = (bitField0_ & ~0x00000002); onChanged(); } else { linkIdsBuilder_.clear(); @@ -10088,7 +10519,7 @@ public final class ContextOuterClass { private com.google.protobuf.RepeatedFieldBuilderV3 getLinkIdsFieldBuilder() { if (linkIdsBuilder_ == null) { - linkIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(linkIds_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean()); + linkIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(linkIds_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean()); linkIds_ = null; } return linkIdsBuilder_; @@ -10121,17 +10552,7 @@ public final class ContextOuterClass { @java.lang.Override public Topology parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new Topology(input, extensionRegistry); } }; @@ -10258,6 +10679,88 @@ public final class ContextOuterClass { return new TopologyDetails(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private TopologyDetails(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + context.ContextOuterClass.TopologyId.Builder subBuilder = null; + if (topologyId_ != null) { + subBuilder = topologyId_.toBuilder(); + } + topologyId_ = input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(topologyId_); + topologyId_ = subBuilder.buildPartial(); + } + break; + } + case 18: + { + java.lang.String s = input.readStringRequireUtf8(); + name_ = s; + break; + } + case 26: + { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + devices_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + devices_.add(input.readMessage(context.ContextOuterClass.Device.parser(), extensionRegistry)); + break; + } + case 34: + { + if (!((mutable_bitField0_ & 0x00000002) != 0)) { + links_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + links_.add(input.readMessage(context.ContextOuterClass.Link.parser(), extensionRegistry)); + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + devices_ = java.util.Collections.unmodifiableList(devices_); + } + if (((mutable_bitField0_ & 0x00000002) != 0)) { + links_ = java.util.Collections.unmodifiableList(links_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_TopologyDetails_descriptor; } @@ -10294,13 +10797,12 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.TopologyIdOrBuilder getTopologyIdOrBuilder() { - return topologyId_ == null ? context.ContextOuterClass.TopologyId.getDefaultInstance() : topologyId_; + return getTopologyId(); } public static final int NAME_FIELD_NUMBER = 2; - @SuppressWarnings("serial") - private volatile java.lang.Object name_ = ""; + private volatile java.lang.Object name_; /** * string name = 2; @@ -10337,7 +10839,6 @@ public final class ContextOuterClass { public static final int DEVICES_FIELD_NUMBER = 3; - @SuppressWarnings("serial") private java.util.List devices_; /** @@ -10382,7 +10883,6 @@ public final class ContextOuterClass { public static final int LINKS_FIELD_NUMBER = 4; - @SuppressWarnings("serial") private java.util.List links_; /** @@ -10443,7 +10943,7 @@ public final class ContextOuterClass { if (topologyId_ != null) { output.writeMessage(1, getTopologyId()); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + if (!getNameBytes().isEmpty()) { com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_); } for (int i = 0; i < devices_.size(); i++) { @@ -10452,7 +10952,7 @@ public final class ContextOuterClass { for (int i = 0; i < links_.size(); i++) { output.writeMessage(4, links_.get(i)); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -10464,7 +10964,7 @@ public final class ContextOuterClass { if (topologyId_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getTopologyId()); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + if (!getNameBytes().isEmpty()) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_); } for (int i = 0; i < devices_.size(); i++) { @@ -10473,7 +10973,7 @@ public final class ContextOuterClass { for (int i = 0; i < links_.size(); i++) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, links_.get(i)); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -10499,7 +10999,7 @@ public final class ContextOuterClass { return false; if (!getLinksList().equals(other.getLinksList())) return false; - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -10525,7 +11025,7 @@ public final class ContextOuterClass { hash = (37 * hash) + LINKS_FIELD_NUMBER; hash = (53 * hash) + getLinksList().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -10619,36 +11119,43 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.TopologyDetails.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + getDevicesFieldBuilder(); + getLinksFieldBuilder(); + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; - topologyId_ = null; - if (topologyIdBuilder_ != null) { - topologyIdBuilder_.dispose(); + if (topologyIdBuilder_ == null) { + topologyId_ = null; + } else { + topologyId_ = null; topologyIdBuilder_ = null; } name_ = ""; if (devicesBuilder_ == null) { devices_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); } else { - devices_ = null; devicesBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000004); if (linksBuilder_ == null) { links_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); } else { - links_ = null; linksBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000008); return this; } @@ -10674,43 +11181,63 @@ public final class ContextOuterClass { @java.lang.Override public context.ContextOuterClass.TopologyDetails buildPartial() { context.ContextOuterClass.TopologyDetails result = new context.ContextOuterClass.TopologyDetails(this); - buildPartialRepeatedFields(result); - if (bitField0_ != 0) { - buildPartial0(result); + int from_bitField0_ = bitField0_; + if (topologyIdBuilder_ == null) { + result.topologyId_ = topologyId_; + } else { + result.topologyId_ = topologyIdBuilder_.build(); } - onBuilt(); - return result; - } - - private void buildPartialRepeatedFields(context.ContextOuterClass.TopologyDetails result) { + result.name_ = name_; if (devicesBuilder_ == null) { - if (((bitField0_ & 0x00000004) != 0)) { + if (((bitField0_ & 0x00000001) != 0)) { devices_ = java.util.Collections.unmodifiableList(devices_); - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); } result.devices_ = devices_; } else { result.devices_ = devicesBuilder_.build(); } if (linksBuilder_ == null) { - if (((bitField0_ & 0x00000008) != 0)) { + if (((bitField0_ & 0x00000002) != 0)) { links_ = java.util.Collections.unmodifiableList(links_); - bitField0_ = (bitField0_ & ~0x00000008); + bitField0_ = (bitField0_ & ~0x00000002); } result.links_ = links_; } else { result.links_ = linksBuilder_.build(); } + onBuilt(); + return result; } - private void buildPartial0(context.ContextOuterClass.TopologyDetails result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.topologyId_ = topologyIdBuilder_ == null ? topologyId_ : topologyIdBuilder_.build(); - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.name_ = name_; - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -10731,14 +11258,13 @@ public final class ContextOuterClass { } if (!other.getName().isEmpty()) { name_ = other.name_; - bitField0_ |= 0x00000002; onChanged(); } if (devicesBuilder_ == null) { if (!other.devices_.isEmpty()) { if (devices_.isEmpty()) { devices_ = other.devices_; - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); } else { ensureDevicesIsMutable(); devices_.addAll(other.devices_); @@ -10751,7 +11277,7 @@ public final class ContextOuterClass { devicesBuilder_.dispose(); devicesBuilder_ = null; devices_ = other.devices_; - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); devicesBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getDevicesFieldBuilder() : null; } else { devicesBuilder_.addAllMessages(other.devices_); @@ -10762,7 +11288,7 @@ public final class ContextOuterClass { if (!other.links_.isEmpty()) { if (links_.isEmpty()) { links_ = other.links_; - bitField0_ = (bitField0_ & ~0x00000008); + bitField0_ = (bitField0_ & ~0x00000002); } else { ensureLinksIsMutable(); links_.addAll(other.links_); @@ -10775,14 +11301,14 @@ public final class ContextOuterClass { linksBuilder_.dispose(); linksBuilder_ = null; links_ = other.links_; - bitField0_ = (bitField0_ & ~0x00000008); + bitField0_ = (bitField0_ & ~0x00000002); linksBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getLinksFieldBuilder() : null; } else { linksBuilder_.addAllMessages(other.links_); } } } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -10794,73 +11320,17 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.TopologyDetails parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - input.readMessage(getTopologyIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000001; - break; - } - // case 10 - case 18: - { - name_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000002; - break; - } - // case 18 - case 26: - { - context.ContextOuterClass.Device m = input.readMessage(context.ContextOuterClass.Device.parser(), extensionRegistry); - if (devicesBuilder_ == null) { - ensureDevicesIsMutable(); - devices_.add(m); - } else { - devicesBuilder_.addMessage(m); - } - break; - } - // case 26 - case 34: - { - context.ContextOuterClass.Link m = input.readMessage(context.ContextOuterClass.Link.parser(), extensionRegistry); - if (linksBuilder_ == null) { - ensureLinksIsMutable(); - links_.add(m); - } else { - linksBuilder_.addMessage(m); - } - break; - } - // case 34 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.TopologyDetails) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } @@ -10875,7 +11345,7 @@ public final class ContextOuterClass { * @return Whether the topologyId field is set. */ public boolean hasTopologyId() { - return ((bitField0_ & 0x00000001) != 0); + return topologyIdBuilder_ != null || topologyId_ != null; } /** @@ -10899,11 +11369,10 @@ public final class ContextOuterClass { throw new NullPointerException(); } topologyId_ = value; + onChanged(); } else { topologyIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -10913,11 +11382,10 @@ public final class ContextOuterClass { public Builder setTopologyId(context.ContextOuterClass.TopologyId.Builder builderForValue) { if (topologyIdBuilder_ == null) { topologyId_ = builderForValue.build(); + onChanged(); } else { topologyIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -10926,16 +11394,15 @@ public final class ContextOuterClass { */ public Builder mergeTopologyId(context.ContextOuterClass.TopologyId value) { if (topologyIdBuilder_ == null) { - if (((bitField0_ & 0x00000001) != 0) && topologyId_ != null && topologyId_ != context.ContextOuterClass.TopologyId.getDefaultInstance()) { - getTopologyIdBuilder().mergeFrom(value); + if (topologyId_ != null) { + topologyId_ = context.ContextOuterClass.TopologyId.newBuilder(topologyId_).mergeFrom(value).buildPartial(); } else { topologyId_ = value; } + onChanged(); } else { topologyIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -10943,13 +11410,13 @@ public final class ContextOuterClass { * .context.TopologyId topology_id = 1; */ public Builder clearTopologyId() { - bitField0_ = (bitField0_ & ~0x00000001); - topologyId_ = null; - if (topologyIdBuilder_ != null) { - topologyIdBuilder_.dispose(); + if (topologyIdBuilder_ == null) { + topologyId_ = null; + onChanged(); + } else { + topologyId_ = null; topologyIdBuilder_ = null; } - onChanged(); return this; } @@ -10957,7 +11424,6 @@ public final class ContextOuterClass { * .context.TopologyId topology_id = 1; */ public context.ContextOuterClass.TopologyId.Builder getTopologyIdBuilder() { - bitField0_ |= 0x00000001; onChanged(); return getTopologyIdFieldBuilder().getBuilder(); } @@ -11027,7 +11493,6 @@ public final class ContextOuterClass { throw new NullPointerException(); } name_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -11038,7 +11503,6 @@ public final class ContextOuterClass { */ public Builder clearName() { name_ = getDefaultInstance().getName(); - bitField0_ = (bitField0_ & ~0x00000002); onChanged(); return this; } @@ -11054,7 +11518,6 @@ public final class ContextOuterClass { } checkByteStringIsUtf8(value); name_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -11062,9 +11525,9 @@ public final class ContextOuterClass { private java.util.List devices_ = java.util.Collections.emptyList(); private void ensureDevicesIsMutable() { - if (!((bitField0_ & 0x00000004) != 0)) { + if (!((bitField0_ & 0x00000001) != 0)) { devices_ = new java.util.ArrayList(devices_); - bitField0_ |= 0x00000004; + bitField0_ |= 0x00000001; } } @@ -11216,7 +11679,7 @@ public final class ContextOuterClass { public Builder clearDevices() { if (devicesBuilder_ == null) { devices_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); onChanged(); } else { devicesBuilder_.clear(); @@ -11290,7 +11753,7 @@ public final class ContextOuterClass { private com.google.protobuf.RepeatedFieldBuilderV3 getDevicesFieldBuilder() { if (devicesBuilder_ == null) { - devicesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(devices_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean()); + devicesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(devices_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean()); devices_ = null; } return devicesBuilder_; @@ -11299,9 +11762,9 @@ public final class ContextOuterClass { private java.util.List links_ = java.util.Collections.emptyList(); private void ensureLinksIsMutable() { - if (!((bitField0_ & 0x00000008) != 0)) { + if (!((bitField0_ & 0x00000002) != 0)) { links_ = new java.util.ArrayList(links_); - bitField0_ |= 0x00000008; + bitField0_ |= 0x00000002; } } @@ -11453,7 +11916,7 @@ public final class ContextOuterClass { public Builder clearLinks() { if (linksBuilder_ == null) { links_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000008); + bitField0_ = (bitField0_ & ~0x00000002); onChanged(); } else { linksBuilder_.clear(); @@ -11527,7 +11990,7 @@ public final class ContextOuterClass { private com.google.protobuf.RepeatedFieldBuilderV3 getLinksFieldBuilder() { if (linksBuilder_ == null) { - linksBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(links_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean()); + linksBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(links_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean()); links_ = null; } return linksBuilder_; @@ -11560,17 +12023,7 @@ public final class ContextOuterClass { @java.lang.Override public TopologyDetails parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new TopologyDetails(input, extensionRegistry); } }; @@ -11641,6 +12094,57 @@ public final class ContextOuterClass { return new TopologyIdList(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private TopologyIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + topologyIds_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + topologyIds_.add(input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry)); + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + topologyIds_ = java.util.Collections.unmodifiableList(topologyIds_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_TopologyIdList_descriptor; } @@ -11652,7 +12156,6 @@ public final class ContextOuterClass { public static final int TOPOLOGY_IDS_FIELD_NUMBER = 1; - @SuppressWarnings("serial") private java.util.List topologyIds_; /** @@ -11713,7 +12216,7 @@ public final class ContextOuterClass { for (int i = 0; i < topologyIds_.size(); i++) { output.writeMessage(1, topologyIds_.get(i)); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -11725,7 +12228,7 @@ public final class ContextOuterClass { for (int i = 0; i < topologyIds_.size(); i++) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, topologyIds_.get(i)); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -11741,7 +12244,7 @@ public final class ContextOuterClass { context.ContextOuterClass.TopologyIdList other = (context.ContextOuterClass.TopologyIdList) obj; if (!getTopologyIdsList().equals(other.getTopologyIdsList())) return false; - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -11757,7 +12260,7 @@ public final class ContextOuterClass { hash = (37 * hash) + TOPOLOGY_IDS_FIELD_NUMBER; hash = (53 * hash) + getTopologyIdsList().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -11851,23 +12354,29 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.TopologyIdList.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + getTopologyIdsFieldBuilder(); + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; if (topologyIdsBuilder_ == null) { topologyIds_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); } else { - topologyIds_ = null; topologyIdsBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000001); return this; } @@ -11893,15 +12402,7 @@ public final class ContextOuterClass { @java.lang.Override public context.ContextOuterClass.TopologyIdList buildPartial() { context.ContextOuterClass.TopologyIdList result = new context.ContextOuterClass.TopologyIdList(this); - buildPartialRepeatedFields(result); - if (bitField0_ != 0) { - buildPartial0(result); - } - onBuilt(); - return result; - } - - private void buildPartialRepeatedFields(context.ContextOuterClass.TopologyIdList result) { + int from_bitField0_ = bitField0_; if (topologyIdsBuilder_ == null) { if (((bitField0_ & 0x00000001) != 0)) { topologyIds_ = java.util.Collections.unmodifiableList(topologyIds_); @@ -11911,10 +12412,38 @@ public final class ContextOuterClass { } else { result.topologyIds_ = topologyIdsBuilder_.build(); } + onBuilt(); + return result; } - private void buildPartial0(context.ContextOuterClass.TopologyIdList result) { - int from_bitField0_ = bitField0_; + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -11954,7 +12483,7 @@ public final class ContextOuterClass { } } } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -11966,47 +12495,17 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.TopologyIdList parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - context.ContextOuterClass.TopologyId m = input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry); - if (topologyIdsBuilder_ == null) { - ensureTopologyIdsIsMutable(); - topologyIds_.add(m); - } else { - topologyIdsBuilder_.addMessage(m); - } - break; - } - // case 10 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.TopologyIdList) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } @@ -12276,17 +12775,7 @@ public final class ContextOuterClass { @java.lang.Override public TopologyIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new TopologyIdList(input, extensionRegistry); } }; @@ -12357,6 +12846,57 @@ public final class ContextOuterClass { return new TopologyList(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private TopologyList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + topologies_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + topologies_.add(input.readMessage(context.ContextOuterClass.Topology.parser(), extensionRegistry)); + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + topologies_ = java.util.Collections.unmodifiableList(topologies_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_TopologyList_descriptor; } @@ -12368,7 +12908,6 @@ public final class ContextOuterClass { public static final int TOPOLOGIES_FIELD_NUMBER = 1; - @SuppressWarnings("serial") private java.util.List topologies_; /** @@ -12429,7 +12968,7 @@ public final class ContextOuterClass { for (int i = 0; i < topologies_.size(); i++) { output.writeMessage(1, topologies_.get(i)); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -12441,7 +12980,7 @@ public final class ContextOuterClass { for (int i = 0; i < topologies_.size(); i++) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, topologies_.get(i)); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -12457,7 +12996,7 @@ public final class ContextOuterClass { context.ContextOuterClass.TopologyList other = (context.ContextOuterClass.TopologyList) obj; if (!getTopologiesList().equals(other.getTopologiesList())) return false; - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -12473,7 +13012,7 @@ public final class ContextOuterClass { hash = (37 * hash) + TOPOLOGIES_FIELD_NUMBER; hash = (53 * hash) + getTopologiesList().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -12567,23 +13106,29 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.TopologyList.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + getTopologiesFieldBuilder(); + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; if (topologiesBuilder_ == null) { topologies_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); } else { - topologies_ = null; topologiesBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000001); return this; } @@ -12609,15 +13154,7 @@ public final class ContextOuterClass { @java.lang.Override public context.ContextOuterClass.TopologyList buildPartial() { context.ContextOuterClass.TopologyList result = new context.ContextOuterClass.TopologyList(this); - buildPartialRepeatedFields(result); - if (bitField0_ != 0) { - buildPartial0(result); - } - onBuilt(); - return result; - } - - private void buildPartialRepeatedFields(context.ContextOuterClass.TopologyList result) { + int from_bitField0_ = bitField0_; if (topologiesBuilder_ == null) { if (((bitField0_ & 0x00000001) != 0)) { topologies_ = java.util.Collections.unmodifiableList(topologies_); @@ -12627,10 +13164,38 @@ public final class ContextOuterClass { } else { result.topologies_ = topologiesBuilder_.build(); } + onBuilt(); + return result; } - private void buildPartial0(context.ContextOuterClass.TopologyList result) { - int from_bitField0_ = bitField0_; + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -12670,7 +13235,7 @@ public final class ContextOuterClass { } } } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -12682,47 +13247,17 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.TopologyList parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - context.ContextOuterClass.Topology m = input.readMessage(context.ContextOuterClass.Topology.parser(), extensionRegistry); - if (topologiesBuilder_ == null) { - ensureTopologiesIsMutable(); - topologies_.add(m); - } else { - topologiesBuilder_.addMessage(m); - } - break; - } - // case 10 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.TopologyList) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } @@ -12992,17 +13527,7 @@ public final class ContextOuterClass { @java.lang.Override public TopologyList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new TopologyList(input, extensionRegistry); } }; @@ -13081,6 +13606,70 @@ public final class ContextOuterClass { return new TopologyEvent(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private TopologyEvent(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + context.ContextOuterClass.Event.Builder subBuilder = null; + if (event_ != null) { + subBuilder = event_.toBuilder(); + } + event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(event_); + event_ = subBuilder.buildPartial(); + } + break; + } + case 18: + { + context.ContextOuterClass.TopologyId.Builder subBuilder = null; + if (topologyId_ != null) { + subBuilder = topologyId_.toBuilder(); + } + topologyId_ = input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(topologyId_); + topologyId_ = subBuilder.buildPartial(); + } + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_TopologyEvent_descriptor; } @@ -13117,7 +13706,7 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() { - return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_; + return getEvent(); } public static final int TOPOLOGY_ID_FIELD_NUMBER = 2; @@ -13147,7 +13736,7 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.TopologyIdOrBuilder getTopologyIdOrBuilder() { - return topologyId_ == null ? context.ContextOuterClass.TopologyId.getDefaultInstance() : topologyId_; + return getTopologyId(); } private byte memoizedIsInitialized = -1; @@ -13171,7 +13760,7 @@ public final class ContextOuterClass { if (topologyId_ != null) { output.writeMessage(2, getTopologyId()); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -13186,7 +13775,7 @@ public final class ContextOuterClass { if (topologyId_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getTopologyId()); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -13212,7 +13801,7 @@ public final class ContextOuterClass { if (!getTopologyId().equals(other.getTopologyId())) return false; } - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -13232,7 +13821,7 @@ public final class ContextOuterClass { hash = (37 * hash) + TOPOLOGY_ID_FIELD_NUMBER; hash = (53 * hash) + getTopologyId().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -13326,24 +13915,32 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.TopologyEvent.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; - event_ = null; - if (eventBuilder_ != null) { - eventBuilder_.dispose(); + if (eventBuilder_ == null) { + event_ = null; + } else { + event_ = null; eventBuilder_ = null; } - topologyId_ = null; - if (topologyIdBuilder_ != null) { - topologyIdBuilder_.dispose(); + if (topologyIdBuilder_ == null) { + topologyId_ = null; + } else { + topologyId_ = null; topologyIdBuilder_ = null; } return this; @@ -13371,21 +13968,48 @@ public final class ContextOuterClass { @java.lang.Override public context.ContextOuterClass.TopologyEvent buildPartial() { context.ContextOuterClass.TopologyEvent result = new context.ContextOuterClass.TopologyEvent(this); - if (bitField0_ != 0) { - buildPartial0(result); + if (eventBuilder_ == null) { + result.event_ = event_; + } else { + result.event_ = eventBuilder_.build(); + } + if (topologyIdBuilder_ == null) { + result.topologyId_ = topologyId_; + } else { + result.topologyId_ = topologyIdBuilder_.build(); } onBuilt(); return result; } - private void buildPartial0(context.ContextOuterClass.TopologyEvent result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.event_ = eventBuilder_ == null ? event_ : eventBuilder_.build(); - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.topologyId_ = topologyIdBuilder_ == null ? topologyId_ : topologyIdBuilder_.build(); - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -13407,7 +14031,7 @@ public final class ContextOuterClass { if (other.hasTopologyId()) { mergeTopologyId(other.getTopologyId()); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -13419,54 +14043,20 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.TopologyEvent parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - input.readMessage(getEventFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000001; - break; - } - // case 10 - case 18: - { - input.readMessage(getTopologyIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000002; - break; - } - // case 18 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.TopologyEvent) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } - private int bitField0_; - private context.ContextOuterClass.Event event_; private com.google.protobuf.SingleFieldBuilderV3 eventBuilder_; @@ -13476,7 +14066,7 @@ public final class ContextOuterClass { * @return Whether the event field is set. */ public boolean hasEvent() { - return ((bitField0_ & 0x00000001) != 0); + return eventBuilder_ != null || event_ != null; } /** @@ -13500,11 +14090,10 @@ public final class ContextOuterClass { throw new NullPointerException(); } event_ = value; + onChanged(); } else { eventBuilder_.setMessage(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -13514,11 +14103,10 @@ public final class ContextOuterClass { public Builder setEvent(context.ContextOuterClass.Event.Builder builderForValue) { if (eventBuilder_ == null) { event_ = builderForValue.build(); + onChanged(); } else { eventBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -13527,16 +14115,15 @@ public final class ContextOuterClass { */ public Builder mergeEvent(context.ContextOuterClass.Event value) { if (eventBuilder_ == null) { - if (((bitField0_ & 0x00000001) != 0) && event_ != null && event_ != context.ContextOuterClass.Event.getDefaultInstance()) { - getEventBuilder().mergeFrom(value); + if (event_ != null) { + event_ = context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial(); } else { event_ = value; } + onChanged(); } else { eventBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -13544,13 +14131,13 @@ public final class ContextOuterClass { * .context.Event event = 1; */ public Builder clearEvent() { - bitField0_ = (bitField0_ & ~0x00000001); - event_ = null; - if (eventBuilder_ != null) { - eventBuilder_.dispose(); + if (eventBuilder_ == null) { + event_ = null; + onChanged(); + } else { + event_ = null; eventBuilder_ = null; } - onChanged(); return this; } @@ -13558,7 +14145,6 @@ public final class ContextOuterClass { * .context.Event event = 1; */ public context.ContextOuterClass.Event.Builder getEventBuilder() { - bitField0_ |= 0x00000001; onChanged(); return getEventFieldBuilder().getBuilder(); } @@ -13594,7 +14180,7 @@ public final class ContextOuterClass { * @return Whether the topologyId field is set. */ public boolean hasTopologyId() { - return ((bitField0_ & 0x00000002) != 0); + return topologyIdBuilder_ != null || topologyId_ != null; } /** @@ -13618,11 +14204,10 @@ public final class ContextOuterClass { throw new NullPointerException(); } topologyId_ = value; + onChanged(); } else { topologyIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000002; - onChanged(); return this; } @@ -13632,11 +14217,10 @@ public final class ContextOuterClass { public Builder setTopologyId(context.ContextOuterClass.TopologyId.Builder builderForValue) { if (topologyIdBuilder_ == null) { topologyId_ = builderForValue.build(); + onChanged(); } else { topologyIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000002; - onChanged(); return this; } @@ -13645,16 +14229,15 @@ public final class ContextOuterClass { */ public Builder mergeTopologyId(context.ContextOuterClass.TopologyId value) { if (topologyIdBuilder_ == null) { - if (((bitField0_ & 0x00000002) != 0) && topologyId_ != null && topologyId_ != context.ContextOuterClass.TopologyId.getDefaultInstance()) { - getTopologyIdBuilder().mergeFrom(value); + if (topologyId_ != null) { + topologyId_ = context.ContextOuterClass.TopologyId.newBuilder(topologyId_).mergeFrom(value).buildPartial(); } else { topologyId_ = value; } + onChanged(); } else { topologyIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000002; - onChanged(); return this; } @@ -13662,13 +14245,13 @@ public final class ContextOuterClass { * .context.TopologyId topology_id = 2; */ public Builder clearTopologyId() { - bitField0_ = (bitField0_ & ~0x00000002); - topologyId_ = null; - if (topologyIdBuilder_ != null) { - topologyIdBuilder_.dispose(); + if (topologyIdBuilder_ == null) { + topologyId_ = null; + onChanged(); + } else { + topologyId_ = null; topologyIdBuilder_ = null; } - onChanged(); return this; } @@ -13676,7 +14259,6 @@ public final class ContextOuterClass { * .context.TopologyId topology_id = 2; */ public context.ContextOuterClass.TopologyId.Builder getTopologyIdBuilder() { - bitField0_ |= 0x00000002; onChanged(); return getTopologyIdFieldBuilder().getBuilder(); } @@ -13730,17 +14312,7 @@ public final class ContextOuterClass { @java.lang.Override public TopologyEvent parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new TopologyEvent(input, extensionRegistry); } }; @@ -13806,6 +14378,57 @@ public final class ContextOuterClass { return new DeviceId(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private DeviceId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + context.ContextOuterClass.Uuid.Builder subBuilder = null; + if (deviceUuid_ != null) { + subBuilder = deviceUuid_.toBuilder(); + } + deviceUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(deviceUuid_); + deviceUuid_ = subBuilder.buildPartial(); + } + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_DeviceId_descriptor; } @@ -13842,7 +14465,7 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.UuidOrBuilder getDeviceUuidOrBuilder() { - return deviceUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : deviceUuid_; + return getDeviceUuid(); } private byte memoizedIsInitialized = -1; @@ -13863,7 +14486,7 @@ public final class ContextOuterClass { if (deviceUuid_ != null) { output.writeMessage(1, getDeviceUuid()); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -13875,7 +14498,7 @@ public final class ContextOuterClass { if (deviceUuid_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getDeviceUuid()); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -13895,7 +14518,7 @@ public final class ContextOuterClass { if (!getDeviceUuid().equals(other.getDeviceUuid())) return false; } - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -13911,7 +14534,7 @@ public final class ContextOuterClass { hash = (37 * hash) + DEVICE_UUID_FIELD_NUMBER; hash = (53 * hash) + getDeviceUuid().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -14009,19 +14632,26 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.DeviceId.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; - deviceUuid_ = null; - if (deviceUuidBuilder_ != null) { - deviceUuidBuilder_.dispose(); + if (deviceUuidBuilder_ == null) { + deviceUuid_ = null; + } else { + deviceUuid_ = null; deviceUuidBuilder_ = null; } return this; @@ -14049,18 +14679,43 @@ public final class ContextOuterClass { @java.lang.Override public context.ContextOuterClass.DeviceId buildPartial() { context.ContextOuterClass.DeviceId result = new context.ContextOuterClass.DeviceId(this); - if (bitField0_ != 0) { - buildPartial0(result); + if (deviceUuidBuilder_ == null) { + result.deviceUuid_ = deviceUuid_; + } else { + result.deviceUuid_ = deviceUuidBuilder_.build(); } onBuilt(); return result; } - private void buildPartial0(context.ContextOuterClass.DeviceId result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.deviceUuid_ = deviceUuidBuilder_ == null ? deviceUuid_ : deviceUuidBuilder_.build(); - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -14079,7 +14734,7 @@ public final class ContextOuterClass { if (other.hasDeviceUuid()) { mergeDeviceUuid(other.getDeviceUuid()); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -14091,47 +14746,20 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.DeviceId parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - input.readMessage(getDeviceUuidFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000001; - break; - } - // case 10 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.DeviceId) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } - private int bitField0_; - private context.ContextOuterClass.Uuid deviceUuid_; private com.google.protobuf.SingleFieldBuilderV3 deviceUuidBuilder_; @@ -14141,7 +14769,7 @@ public final class ContextOuterClass { * @return Whether the deviceUuid field is set. */ public boolean hasDeviceUuid() { - return ((bitField0_ & 0x00000001) != 0); + return deviceUuidBuilder_ != null || deviceUuid_ != null; } /** @@ -14165,11 +14793,10 @@ public final class ContextOuterClass { throw new NullPointerException(); } deviceUuid_ = value; + onChanged(); } else { deviceUuidBuilder_.setMessage(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -14179,11 +14806,10 @@ public final class ContextOuterClass { public Builder setDeviceUuid(context.ContextOuterClass.Uuid.Builder builderForValue) { if (deviceUuidBuilder_ == null) { deviceUuid_ = builderForValue.build(); + onChanged(); } else { deviceUuidBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -14192,16 +14818,15 @@ public final class ContextOuterClass { */ public Builder mergeDeviceUuid(context.ContextOuterClass.Uuid value) { if (deviceUuidBuilder_ == null) { - if (((bitField0_ & 0x00000001) != 0) && deviceUuid_ != null && deviceUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) { - getDeviceUuidBuilder().mergeFrom(value); + if (deviceUuid_ != null) { + deviceUuid_ = context.ContextOuterClass.Uuid.newBuilder(deviceUuid_).mergeFrom(value).buildPartial(); } else { deviceUuid_ = value; } + onChanged(); } else { deviceUuidBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -14209,13 +14834,13 @@ public final class ContextOuterClass { * .context.Uuid device_uuid = 1; */ public Builder clearDeviceUuid() { - bitField0_ = (bitField0_ & ~0x00000001); - deviceUuid_ = null; - if (deviceUuidBuilder_ != null) { - deviceUuidBuilder_.dispose(); + if (deviceUuidBuilder_ == null) { + deviceUuid_ = null; + onChanged(); + } else { + deviceUuid_ = null; deviceUuidBuilder_ = null; } - onChanged(); return this; } @@ -14223,7 +14848,6 @@ public final class ContextOuterClass { * .context.Uuid device_uuid = 1; */ public context.ContextOuterClass.Uuid.Builder getDeviceUuidBuilder() { - bitField0_ |= 0x00000001; onChanged(); return getDeviceUuidFieldBuilder().getBuilder(); } @@ -14277,17 +14901,7 @@ public final class ContextOuterClass { @java.lang.Override public DeviceId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new DeviceId(input, extensionRegistry); } }; @@ -14539,6 +15153,154 @@ public final class ContextOuterClass { return new Device(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private Device(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + context.ContextOuterClass.DeviceId.Builder subBuilder = null; + if (deviceId_ != null) { + subBuilder = deviceId_.toBuilder(); + } + deviceId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(deviceId_); + deviceId_ = subBuilder.buildPartial(); + } + break; + } + case 18: + { + java.lang.String s = input.readStringRequireUtf8(); + name_ = s; + break; + } + case 26: + { + java.lang.String s = input.readStringRequireUtf8(); + deviceType_ = s; + break; + } + case 34: + { + context.ContextOuterClass.DeviceConfig.Builder subBuilder = null; + if (deviceConfig_ != null) { + subBuilder = deviceConfig_.toBuilder(); + } + deviceConfig_ = input.readMessage(context.ContextOuterClass.DeviceConfig.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(deviceConfig_); + deviceConfig_ = subBuilder.buildPartial(); + } + break; + } + case 40: + { + int rawValue = input.readEnum(); + deviceOperationalStatus_ = rawValue; + break; + } + case 48: + { + int rawValue = input.readEnum(); + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + deviceDrivers_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + deviceDrivers_.add(rawValue); + break; + } + case 50: + { + int length = input.readRawVarint32(); + int oldLimit = input.pushLimit(length); + while (input.getBytesUntilLimit() > 0) { + int rawValue = input.readEnum(); + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + deviceDrivers_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + deviceDrivers_.add(rawValue); + } + input.popLimit(oldLimit); + break; + } + case 58: + { + if (!((mutable_bitField0_ & 0x00000002) != 0)) { + deviceEndpoints_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000002; + } + deviceEndpoints_.add(input.readMessage(context.ContextOuterClass.EndPoint.parser(), extensionRegistry)); + break; + } + case 66: + { + if (!((mutable_bitField0_ & 0x00000004) != 0)) { + components_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000004; + } + components_.add(input.readMessage(context.ContextOuterClass.Component.parser(), extensionRegistry)); + break; + } + case 74: + { + context.ContextOuterClass.DeviceId.Builder subBuilder = null; + if (controllerId_ != null) { + subBuilder = controllerId_.toBuilder(); + } + controllerId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(controllerId_); + controllerId_ = subBuilder.buildPartial(); + } + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + deviceDrivers_ = java.util.Collections.unmodifiableList(deviceDrivers_); + } + if (((mutable_bitField0_ & 0x00000002) != 0)) { + deviceEndpoints_ = java.util.Collections.unmodifiableList(deviceEndpoints_); + } + if (((mutable_bitField0_ & 0x00000004) != 0)) { + components_ = java.util.Collections.unmodifiableList(components_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Device_descriptor; } @@ -14575,13 +15337,12 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() { - return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_; + return getDeviceId(); } public static final int NAME_FIELD_NUMBER = 2; - @SuppressWarnings("serial") - private volatile java.lang.Object name_ = ""; + private volatile java.lang.Object name_; /** * string name = 2; @@ -14618,8 +15379,7 @@ public final class ContextOuterClass { public static final int DEVICE_TYPE_FIELD_NUMBER = 3; - @SuppressWarnings("serial") - private volatile java.lang.Object deviceType_ = ""; + private volatile java.lang.Object deviceType_; /** * string device_type = 3; @@ -14681,12 +15441,12 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.DeviceConfigOrBuilder getDeviceConfigOrBuilder() { - return deviceConfig_ == null ? context.ContextOuterClass.DeviceConfig.getDefaultInstance() : deviceConfig_; + return getDeviceConfig(); } public static final int DEVICE_OPERATIONAL_STATUS_FIELD_NUMBER = 5; - private int deviceOperationalStatus_ = 0; + private int deviceOperationalStatus_; /** * .context.DeviceOperationalStatusEnum device_operational_status = 5; @@ -14703,19 +15463,20 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.DeviceOperationalStatusEnum getDeviceOperationalStatus() { - context.ContextOuterClass.DeviceOperationalStatusEnum result = context.ContextOuterClass.DeviceOperationalStatusEnum.forNumber(deviceOperationalStatus_); + @SuppressWarnings("deprecation") + context.ContextOuterClass.DeviceOperationalStatusEnum result = context.ContextOuterClass.DeviceOperationalStatusEnum.valueOf(deviceOperationalStatus_); return result == null ? context.ContextOuterClass.DeviceOperationalStatusEnum.UNRECOGNIZED : result; } public static final int DEVICE_DRIVERS_FIELD_NUMBER = 6; - @SuppressWarnings("serial") private java.util.List deviceDrivers_; private static final com.google.protobuf.Internal.ListAdapter.Converter deviceDrivers_converter_ = new com.google.protobuf.Internal.ListAdapter.Converter() { public context.ContextOuterClass.DeviceDriverEnum convert(java.lang.Integer from) { - context.ContextOuterClass.DeviceDriverEnum result = context.ContextOuterClass.DeviceDriverEnum.forNumber(from); + @SuppressWarnings("deprecation") + context.ContextOuterClass.DeviceDriverEnum result = context.ContextOuterClass.DeviceDriverEnum.valueOf(from); return result == null ? context.ContextOuterClass.DeviceDriverEnum.UNRECOGNIZED : result; } }; @@ -14771,7 +15532,6 @@ public final class ContextOuterClass { public static final int DEVICE_ENDPOINTS_FIELD_NUMBER = 7; - @SuppressWarnings("serial") private java.util.List deviceEndpoints_; /** @@ -14816,7 +15576,6 @@ public final class ContextOuterClass { public static final int COMPONENTS_FIELD_NUMBER = 8; - @SuppressWarnings("serial") private java.util.List components_; /** @@ -14918,7 +15677,7 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.DeviceIdOrBuilder getControllerIdOrBuilder() { - return controllerId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : controllerId_; + return getControllerId(); } private byte memoizedIsInitialized = -1; @@ -14940,10 +15699,10 @@ public final class ContextOuterClass { if (deviceId_ != null) { output.writeMessage(1, getDeviceId()); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + if (!getNameBytes().isEmpty()) { com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(deviceType_)) { + if (!getDeviceTypeBytes().isEmpty()) { com.google.protobuf.GeneratedMessageV3.writeString(output, 3, deviceType_); } if (deviceConfig_ != null) { @@ -14968,7 +15727,7 @@ public final class ContextOuterClass { if (controllerId_ != null) { output.writeMessage(9, getControllerId()); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -14980,10 +15739,10 @@ public final class ContextOuterClass { if (deviceId_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getDeviceId()); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + if (!getNameBytes().isEmpty()) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(deviceType_)) { + if (!getDeviceTypeBytes().isEmpty()) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, deviceType_); } if (deviceConfig_ != null) { @@ -15013,7 +15772,7 @@ public final class ContextOuterClass { if (controllerId_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(9, getControllerId()); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -15057,7 +15816,7 @@ public final class ContextOuterClass { if (!getControllerId().equals(other.getControllerId())) return false; } - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -15099,7 +15858,7 @@ public final class ContextOuterClass { hash = (37 * hash) + CONTROLLER_ID_FIELD_NUMBER; hash = (53 * hash) + getControllerId().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -15193,48 +15952,57 @@ public final class ContextOuterClass { // Construct using context.ContextOuterClass.Device.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + getDeviceEndpointsFieldBuilder(); + getComponentsFieldBuilder(); + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; - deviceId_ = null; - if (deviceIdBuilder_ != null) { - deviceIdBuilder_.dispose(); + if (deviceIdBuilder_ == null) { + deviceId_ = null; + } else { + deviceId_ = null; deviceIdBuilder_ = null; } name_ = ""; deviceType_ = ""; - deviceConfig_ = null; - if (deviceConfigBuilder_ != null) { - deviceConfigBuilder_.dispose(); + if (deviceConfigBuilder_ == null) { + deviceConfig_ = null; + } else { + deviceConfig_ = null; deviceConfigBuilder_ = null; } deviceOperationalStatus_ = 0; deviceDrivers_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000020); + bitField0_ = (bitField0_ & ~0x00000001); if (deviceEndpointsBuilder_ == null) { deviceEndpoints_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000002); } else { - deviceEndpoints_ = null; deviceEndpointsBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000040); if (componentsBuilder_ == null) { components_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000004); } else { - components_ = null; componentsBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000080); - controllerId_ = null; - if (controllerIdBuilder_ != null) { - controllerIdBuilder_.dispose(); + if (controllerIdBuilder_ == null) { + controllerId_ = null; + } else { + controllerId_ = null; controllerIdBuilder_ = null; } return this; @@ -15262,60 +16030,80 @@ public final class ContextOuterClass { @java.lang.Override public context.ContextOuterClass.Device buildPartial() { context.ContextOuterClass.Device result = new context.ContextOuterClass.Device(this); - buildPartialRepeatedFields(result); - if (bitField0_ != 0) { - buildPartial0(result); + int from_bitField0_ = bitField0_; + if (deviceIdBuilder_ == null) { + result.deviceId_ = deviceId_; + } else { + result.deviceId_ = deviceIdBuilder_.build(); } - onBuilt(); - return result; - } - - private void buildPartialRepeatedFields(context.ContextOuterClass.Device result) { - if (((bitField0_ & 0x00000020) != 0)) { + result.name_ = name_; + result.deviceType_ = deviceType_; + if (deviceConfigBuilder_ == null) { + result.deviceConfig_ = deviceConfig_; + } else { + result.deviceConfig_ = deviceConfigBuilder_.build(); + } + result.deviceOperationalStatus_ = deviceOperationalStatus_; + if (((bitField0_ & 0x00000001) != 0)) { deviceDrivers_ = java.util.Collections.unmodifiableList(deviceDrivers_); - bitField0_ = (bitField0_ & ~0x00000020); + bitField0_ = (bitField0_ & ~0x00000001); } result.deviceDrivers_ = deviceDrivers_; if (deviceEndpointsBuilder_ == null) { - if (((bitField0_ & 0x00000040) != 0)) { + if (((bitField0_ & 0x00000002) != 0)) { deviceEndpoints_ = java.util.Collections.unmodifiableList(deviceEndpoints_); - bitField0_ = (bitField0_ & ~0x00000040); + bitField0_ = (bitField0_ & ~0x00000002); } result.deviceEndpoints_ = deviceEndpoints_; } else { result.deviceEndpoints_ = deviceEndpointsBuilder_.build(); } if (componentsBuilder_ == null) { - if (((bitField0_ & 0x00000080) != 0)) { + if (((bitField0_ & 0x00000004) != 0)) { components_ = java.util.Collections.unmodifiableList(components_); - bitField0_ = (bitField0_ & ~0x00000080); + bitField0_ = (bitField0_ & ~0x00000004); } result.components_ = components_; } else { result.components_ = componentsBuilder_.build(); } + if (controllerIdBuilder_ == null) { + result.controllerId_ = controllerId_; + } else { + result.controllerId_ = controllerIdBuilder_.build(); + } + onBuilt(); + return result; } - private void buildPartial0(context.ContextOuterClass.Device result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.deviceId_ = deviceIdBuilder_ == null ? deviceId_ : deviceIdBuilder_.build(); - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.name_ = name_; - } - if (((from_bitField0_ & 0x00000004) != 0)) { - result.deviceType_ = deviceType_; - } - if (((from_bitField0_ & 0x00000008) != 0)) { - result.deviceConfig_ = deviceConfigBuilder_ == null ? deviceConfig_ : deviceConfigBuilder_.build(); - } - if (((from_bitField0_ & 0x00000010) != 0)) { - result.deviceOperationalStatus_ = deviceOperationalStatus_; - } - if (((from_bitField0_ & 0x00000100) != 0)) { - result.controllerId_ = controllerIdBuilder_ == null ? controllerId_ : controllerIdBuilder_.build(); - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -15336,12 +16124,10 @@ public final class ContextOuterClass { } if (!other.getName().isEmpty()) { name_ = other.name_; - bitField0_ |= 0x00000002; onChanged(); } if (!other.getDeviceType().isEmpty()) { deviceType_ = other.deviceType_; - bitField0_ |= 0x00000004; onChanged(); } if (other.hasDeviceConfig()) { @@ -15353,7 +16139,7 @@ public final class ContextOuterClass { if (!other.deviceDrivers_.isEmpty()) { if (deviceDrivers_.isEmpty()) { deviceDrivers_ = other.deviceDrivers_; - bitField0_ = (bitField0_ & ~0x00000020); + bitField0_ = (bitField0_ & ~0x00000001); } else { ensureDeviceDriversIsMutable(); deviceDrivers_.addAll(other.deviceDrivers_); @@ -15364,7 +16150,7 @@ public final class ContextOuterClass { if (!other.deviceEndpoints_.isEmpty()) { if (deviceEndpoints_.isEmpty()) { deviceEndpoints_ = other.deviceEndpoints_; - bitField0_ = (bitField0_ & ~0x00000040); + bitField0_ = (bitField0_ & ~0x00000002); } else { ensureDeviceEndpointsIsMutable(); deviceEndpoints_.addAll(other.deviceEndpoints_); @@ -15377,7 +16163,7 @@ public final class ContextOuterClass { deviceEndpointsBuilder_.dispose(); deviceEndpointsBuilder_ = null; deviceEndpoints_ = other.deviceEndpoints_; - bitField0_ = (bitField0_ & ~0x00000040); + bitField0_ = (bitField0_ & ~0x00000002); deviceEndpointsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getDeviceEndpointsFieldBuilder() : null; } else { deviceEndpointsBuilder_.addAllMessages(other.deviceEndpoints_); @@ -15388,7 +16174,7 @@ public final class ContextOuterClass { if (!other.components_.isEmpty()) { if (components_.isEmpty()) { components_ = other.components_; - bitField0_ = (bitField0_ & ~0x00000080); + bitField0_ = (bitField0_ & ~0x00000004); } else { ensureComponentsIsMutable(); components_.addAll(other.components_); @@ -15401,7 +16187,7 @@ public final class ContextOuterClass { componentsBuilder_.dispose(); componentsBuilder_ = null; components_ = other.components_; - bitField0_ = (bitField0_ & ~0x00000080); + bitField0_ = (bitField0_ & ~0x00000004); componentsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getComponentsFieldBuilder() : null; } else { componentsBuilder_.addAllMessages(other.components_); @@ -15411,7 +16197,7 @@ public final class ContextOuterClass { if (other.hasControllerId()) { mergeControllerId(other.getControllerId()); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -15423,122 +16209,17 @@ public final class ContextOuterClass { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + context.ContextOuterClass.Device parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - input.readMessage(getDeviceIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000001; - break; - } - // case 10 - case 18: - { - name_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000002; - break; - } - // case 18 - case 26: - { - deviceType_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000004; - break; - } - // case 26 - case 34: - { - input.readMessage(getDeviceConfigFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000008; - break; - } - // case 34 - case 40: - { - deviceOperationalStatus_ = input.readEnum(); - bitField0_ |= 0x00000010; - break; - } - // case 40 - case 48: - { - int tmpRaw = input.readEnum(); - ensureDeviceDriversIsMutable(); - deviceDrivers_.add(tmpRaw); - break; - } - // case 48 - case 50: - { - int length = input.readRawVarint32(); - int oldLimit = input.pushLimit(length); - while (input.getBytesUntilLimit() > 0) { - int tmpRaw = input.readEnum(); - ensureDeviceDriversIsMutable(); - deviceDrivers_.add(tmpRaw); - } - input.popLimit(oldLimit); - break; - } - // case 50 - case 58: - { - context.ContextOuterClass.EndPoint m = input.readMessage(context.ContextOuterClass.EndPoint.parser(), extensionRegistry); - if (deviceEndpointsBuilder_ == null) { - ensureDeviceEndpointsIsMutable(); - deviceEndpoints_.add(m); - } else { - deviceEndpointsBuilder_.addMessage(m); - } - break; - } - // case 58 - case 66: - { - context.ContextOuterClass.Component m = input.readMessage(context.ContextOuterClass.Component.parser(), extensionRegistry); - if (componentsBuilder_ == null) { - ensureComponentsIsMutable(); - components_.add(m); - } else { - componentsBuilder_.addMessage(m); - } - break; - } - // case 66 - case 74: - { - input.readMessage(getControllerIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000100; - break; - } - // case 74 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (context.ContextOuterClass.Device) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } @@ -15553,7 +16234,7 @@ public final class ContextOuterClass { * @return Whether the deviceId field is set. */ public boolean hasDeviceId() { - return ((bitField0_ & 0x00000001) != 0); + return deviceIdBuilder_ != null || deviceId_ != null; } /** @@ -15577,11 +16258,10 @@ public final class ContextOuterClass { throw new NullPointerException(); } deviceId_ = value; + onChanged(); } else { deviceIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -15591,11 +16271,10 @@ public final class ContextOuterClass { public Builder setDeviceId(context.ContextOuterClass.DeviceId.Builder builderForValue) { if (deviceIdBuilder_ == null) { deviceId_ = builderForValue.build(); + onChanged(); } else { deviceIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -15604,16 +16283,15 @@ public final class ContextOuterClass { */ public Builder mergeDeviceId(context.ContextOuterClass.DeviceId value) { if (deviceIdBuilder_ == null) { - if (((bitField0_ & 0x00000001) != 0) && deviceId_ != null && deviceId_ != context.ContextOuterClass.DeviceId.getDefaultInstance()) { - getDeviceIdBuilder().mergeFrom(value); + if (deviceId_ != null) { + deviceId_ = context.ContextOuterClass.DeviceId.newBuilder(deviceId_).mergeFrom(value).buildPartial(); } else { deviceId_ = value; } + onChanged(); } else { deviceIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -15621,13 +16299,13 @@ public final class ContextOuterClass { * .context.DeviceId device_id = 1; */ public Builder clearDeviceId() { - bitField0_ = (bitField0_ & ~0x00000001); - deviceId_ = null; - if (deviceIdBuilder_ != null) { - deviceIdBuilder_.dispose(); + if (deviceIdBuilder_ == null) { + deviceId_ = null; + onChanged(); + } else { + deviceId_ = null; deviceIdBuilder_ = null; } - onChanged(); return this; } @@ -15635,7 +16313,6 @@ public final class ContextOuterClass { * .context.DeviceId device_id = 1; */ public context.ContextOuterClass.DeviceId.Builder getDeviceIdBuilder() { - bitField0_ |= 0x00000001; onChanged(); return getDeviceIdFieldBuilder().getBuilder(); } @@ -15705,7 +16382,6 @@ public final class ContextOuterClass { throw new NullPointerException(); } name_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -15716,7 +16392,6 @@ public final class ContextOuterClass { */ public Builder clearName() { name_ = getDefaultInstance().getName(); - bitField0_ = (bitField0_ & ~0x00000002); onChanged(); return this; } @@ -15732,7 +16407,6 @@ public final class ContextOuterClass { } checkByteStringIsUtf8(value); name_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -15780,7 +16454,6 @@ public final class ContextOuterClass { throw new NullPointerException(); } deviceType_ = value; - bitField0_ |= 0x00000004; onChanged(); return this; } @@ -15791,7 +16464,6 @@ public final class ContextOuterClass { */ public Builder clearDeviceType() { deviceType_ = getDefaultInstance().getDeviceType(); - bitField0_ = (bitField0_ & ~0x00000004); onChanged(); return this; } @@ -15807,7 +16479,6 @@ public final class ContextOuterClass { } checkByteStringIsUtf8(value); deviceType_ = value; - bitField0_ |= 0x00000004; onChanged(); return this; } @@ -15821,7 +16492,7 @@ public final class ContextOuterClass { * @return Whether the deviceConfig field is set. */ public boolean hasDeviceConfig() { - return ((bitField0_ & 0x00000008) != 0); + return deviceConfigBuilder_ != null || deviceConfig_ != null; } /** @@ -15845,11 +16516,10 @@ public final class ContextOuterClass { throw new NullPointerException(); } deviceConfig_ = value; + onChanged(); } else { deviceConfigBuilder_.setMessage(value); } - bitField0_ |= 0x00000008; - onChanged(); return this; } @@ -15859,11 +16529,10 @@ public final class ContextOuterClass { public Builder setDeviceConfig(context.ContextOuterClass.DeviceConfig.Builder builderForValue) { if (deviceConfigBuilder_ == null) { deviceConfig_ = builderForValue.build(); + onChanged(); } else { deviceConfigBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000008; - onChanged(); return this; } @@ -15872,16 +16541,15 @@ public final class ContextOuterClass { */ public Builder mergeDeviceConfig(context.ContextOuterClass.DeviceConfig value) { if (deviceConfigBuilder_ == null) { - if (((bitField0_ & 0x00000008) != 0) && deviceConfig_ != null && deviceConfig_ != context.ContextOuterClass.DeviceConfig.getDefaultInstance()) { - getDeviceConfigBuilder().mergeFrom(value); + if (deviceConfig_ != null) { + deviceConfig_ = context.ContextOuterClass.DeviceConfig.newBuilder(deviceConfig_).mergeFrom(value).buildPartial(); } else { deviceConfig_ = value; } + onChanged(); } else { deviceConfigBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000008; - onChanged(); return this; } @@ -15889,13 +16557,13 @@ public final class ContextOuterClass { * .context.DeviceConfig device_config = 4; */ public Builder clearDeviceConfig() { - bitField0_ = (bitField0_ & ~0x00000008); - deviceConfig_ = null; - if (deviceConfigBuilder_ != null) { - deviceConfigBuilder_.dispose(); + if (deviceConfigBuilder_ == null) { + deviceConfig_ = null; + onChanged(); + } else { + deviceConfig_ = null; deviceConfigBuilder_ = null; } - onChanged(); return this; } @@ -15903,7 +16571,6 @@ public final class ContextOuterClass { * .context.DeviceConfig device_config = 4; */ public context.ContextOuterClass.DeviceConfig.Builder getDeviceConfigBuilder() { - bitField0_ |= 0x00000008; onChanged(); return getDeviceConfigFieldBuilder().getBuilder(); } @@ -15948,7 +16615,6 @@ public final class ContextOuterClass { */ public Builder setDeviceOperationalStatusValue(int value) { deviceOperationalStatus_ = value; - bitField0_ |= 0x00000010; onChanged(); return this; } @@ -15959,7 +16625,8 @@ public final class ContextOuterClass { */ @java.lang.Override public context.ContextOuterClass.DeviceOperationalStatusEnum getDeviceOperationalStatus() { - context.ContextOuterClass.DeviceOperationalStatusEnum result = context.ContextOuterClass.DeviceOperationalStatusEnum.forNumber(deviceOperationalStatus_); + @SuppressWarnings("deprecation") + context.ContextOuterClass.DeviceOperationalStatusEnum result = context.ContextOuterClass.DeviceOperationalStatusEnum.valueOf(deviceOperationalStatus_); return result == null ? context.ContextOuterClass.DeviceOperationalStatusEnum.UNRECOGNIZED : result; } @@ -15972,7 +16639,6 @@ public final class ContextOuterClass { if (value == null) { throw new NullPointerException(); } - bitField0_ |= 0x00000010; deviceOperationalStatus_ = value.getNumber(); onChanged(); return this; @@ -15983,7 +16649,6 @@ public final class ContextOuterClass { * @return This builder for chaining. */ public Builder clearDeviceOperationalStatus() { - bitField0_ = (bitField0_ & ~0x00000010); deviceOperationalStatus_ = 0; onChanged(); return this; @@ -15992,9 +16657,9 @@ public final class ContextOuterClass { private java.util.List deviceDrivers_ = java.util.Collections.emptyList(); private void ensureDeviceDriversIsMutable() { - if (!((bitField0_ & 0x00000020) != 0)) { + if (!((bitField0_ & 0x00000001) != 0)) { deviceDrivers_ = new java.util.ArrayList(deviceDrivers_); - bitField0_ |= 0x00000020; + bitField0_ |= 0x00000001; } } @@ -16074,7 +16739,7 @@ public final class ContextOuterClass { */ public Builder clearDeviceDrivers() { deviceDrivers_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000020); + bitField0_ = (bitField0_ & ~0x00000001); onChanged(); return this; } @@ -16098,8 +16763,8 @@ public final class ContextOuterClass { /** * repeated .context.DeviceDriverEnum device_drivers = 6; - * @param index The index to set the value at. - * @param value The enum numeric value on the wire for deviceDrivers to set. + * @param index The index of the value to return. + * @return The enum numeric value on the wire of deviceDrivers at the given index. * @return This builder for chaining. */ public Builder setDeviceDriversValue(int index, int value) { @@ -16138,9 +16803,9 @@ public final class ContextOuterClass { private java.util.List deviceEndpoints_ = java.util.Collections.emptyList(); private void ensureDeviceEndpointsIsMutable() { - if (!((bitField0_ & 0x00000040) != 0)) { + if (!((bitField0_ & 0x00000002) != 0)) { deviceEndpoints_ = new java.util.ArrayList(deviceEndpoints_); - bitField0_ |= 0x00000040; + bitField0_ |= 0x00000002; } } @@ -16292,7 +16957,7 @@ public final class ContextOuterClass { public Builder clearDeviceEndpoints() { if (deviceEndpointsBuilder_ == null) { deviceEndpoints_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000040); + bitField0_ = (bitField0_ & ~0x00000002); onChanged(); } else { deviceEndpointsBuilder_.clear(); @@ -16366,7 +17031,7 @@ public final class ContextOuterClass { private com.google.protobuf.RepeatedFieldBuilderV3 getDeviceEndpointsFieldBuilder() { if (deviceEndpointsBuilder_ == null) { - deviceEndpointsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(deviceEndpoints_, ((bitField0_ & 0x00000040) != 0), getParentForChildren(), isClean()); + deviceEndpointsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(deviceEndpoints_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean()); deviceEndpoints_ = null; } return deviceEndpointsBuilder_; @@ -16375,9 +17040,9 @@ public final class ContextOuterClass { private java.util.List components_ = java.util.Collections.emptyList(); private void ensureComponentsIsMutable() { - if (!((bitField0_ & 0x00000080) != 0)) { + if (!((bitField0_ & 0x00000004) != 0)) { components_ = new java.util.ArrayList(components_); - bitField0_ |= 0x00000080; + bitField0_ |= 0x00000004; } } @@ -16573,7 +17238,7 @@ public final class ContextOuterClass { public Builder clearComponents() { if (componentsBuilder_ == null) { components_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000080); + bitField0_ = (bitField0_ & ~0x00000004); onChanged(); } else { componentsBuilder_.clear(); @@ -16675,7 +17340,7 @@ public final class ContextOuterClass { private com.google.protobuf.RepeatedFieldBuilderV3 getComponentsFieldBuilder() { if (componentsBuilder_ == null) { - componentsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(components_, ((bitField0_ & 0x00000080) != 0), getParentForChildren(), isClean()); + componentsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(components_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean()); components_ = null; } return componentsBuilder_; @@ -16694,7 +17359,7 @@ public final class ContextOuterClass { * @return Whether the controllerId field is set. */ public boolean hasControllerId() { - return ((bitField0_ & 0x00000100) != 0); + return controllerIdBuilder_ != null || controllerId_ != null; } /** @@ -16726,11 +17391,10 @@ public final class ContextOuterClass { throw new NullPointerException(); } controllerId_ = value; + onChanged(); } else { controllerIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000100; - onChanged(); return this; } @@ -16744,11 +17408,10 @@ public final class ContextOuterClass { public Builder setControllerId(context.ContextOuterClass.DeviceId.Builder builderForValue) { if (controllerIdBuilder_ == null) { controllerId_ = builderForValue.build(); + onChanged(); } else { controllerIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000100; - onChanged(); return this; } @@ -16761,16 +17424,15 @@ public final class ContextOuterClass { */ public Builder mergeControllerId(context.ContextOuterClass.DeviceId value) { if (controllerIdBuilder_ == null) { - if (((bitField0_ & 0x00000100) != 0) && controllerId_ != null && controllerId_ != context.ContextOuterClass.DeviceId.getDefaultInstance()) { - getControllerIdBuilder().mergeFrom(value); + if (controllerId_ != null) { + controllerId_ = context.ContextOuterClass.DeviceId.newBuilder(controllerId_).mergeFrom(value).buildPartial(); } else { controllerId_ = value; } + onChanged(); } else { controllerIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000100; - onChanged(); return this; } @@ -16782,13 +17444,13 @@ public final class ContextOuterClass { * .context.DeviceId controller_id = 9; */ public Builder clearControllerId() { - bitField0_ = (bitField0_ & ~0x00000100); - controllerId_ = null; - if (controllerIdBuilder_ != null) { - controllerIdBuilder_.dispose(); + if (controllerIdBuilder_ == null) { + controllerId_ = null; + onChanged(); + } else { + controllerId_ = null; controllerIdBuilder_ = null; } - onChanged(); return this; } @@ -16800,7 +17462,6 @@ public final class ContextOuterClass { * .context.DeviceId controller_id = 9; */ public context.ContextOuterClass.DeviceId.Builder getControllerIdBuilder() { - bitField0_ |= 0x00000100; onChanged(); return getControllerIdFieldBuilder().getBuilder(); } @@ -16862,17 +17523,7 @@ public final class ContextOuterClass { @java.lang.Override public Device parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new Device(input, extensionRegistry); } }; @@ -16975,9 +17626,7 @@ public final class ContextOuterClass { * * map<string, string> attributes = 4; */ - /* nullable */ - java.lang.String getAttributesOrDefault(java.lang.String key, /* nullable */ - java.lang.String defaultValue); + java.lang.String getAttributesOrDefault(java.lang.String key, java.lang.String defaultValue); /** *
@@ -17030,6 +17679,86 @@ public final class ContextOuterClass {
             return new Component();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Component(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (componentUuid_ != null) {
+                                    subBuilder = componentUuid_.toBuilder();
+                                }
+                                componentUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(componentUuid_);
+                                    componentUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                type_ = s;
+                                break;
+                            }
+                        case 34:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    attributes_ = com.google.protobuf.MapField.newMapField(AttributesDefaultEntryHolder.defaultEntry);
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                com.google.protobuf.MapEntry attributes__ = input.readMessage(AttributesDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
+                                attributes_.getMutableMap().put(attributes__.getKey(), attributes__.getValue());
+                                break;
+                            }
+                        case 42:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                parent_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Component_descriptor;
         }
@@ -17077,13 +17806,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getComponentUuidOrBuilder() {
-            return componentUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : componentUuid_;
+            return getComponentUuid();
         }
 
         public static final int NAME_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 2;
@@ -17120,8 +17848,7 @@ public final class ContextOuterClass {
 
         public static final int TYPE_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object type_ = "";
+        private volatile java.lang.Object type_;
 
         /**
          * string type = 3;
@@ -17163,7 +17890,6 @@ public final class ContextOuterClass {
             static final com.google.protobuf.MapEntry defaultEntry = com.google.protobuf.MapEntry.newDefaultInstance(context.ContextOuterClass.internal_static_context_Component_AttributesEntry_descriptor, com.google.protobuf.WireFormat.FieldType.STRING, "", com.google.protobuf.WireFormat.FieldType.STRING, "");
         }
 
-        @SuppressWarnings("serial")
         private com.google.protobuf.MapField attributes_;
 
         private com.google.protobuf.MapField internalGetAttributes() {
@@ -17187,7 +17913,7 @@ public final class ContextOuterClass {
         @java.lang.Override
         public boolean containsAttributes(java.lang.String key) {
             if (key == null) {
-                throw new NullPointerException("map key");
+                throw new java.lang.NullPointerException();
             }
             return internalGetAttributes().getMap().containsKey(key);
         }
@@ -17221,11 +17947,9 @@ public final class ContextOuterClass {
          * map<string, string> attributes = 4;
          */
         @java.lang.Override
-        public /* nullable */
-        java.lang.String getAttributesOrDefault(java.lang.String key, /* nullable */
-        java.lang.String defaultValue) {
+        public java.lang.String getAttributesOrDefault(java.lang.String key, java.lang.String defaultValue) {
             if (key == null) {
-                throw new NullPointerException("map key");
+                throw new java.lang.NullPointerException();
             }
             java.util.Map map = internalGetAttributes().getMap();
             return map.containsKey(key) ? map.get(key) : defaultValue;
@@ -17241,7 +17965,7 @@ public final class ContextOuterClass {
         @java.lang.Override
         public java.lang.String getAttributesOrThrow(java.lang.String key) {
             if (key == null) {
-                throw new NullPointerException("map key");
+                throw new java.lang.NullPointerException();
             }
             java.util.Map map = internalGetAttributes().getMap();
             if (!map.containsKey(key)) {
@@ -17252,8 +17976,7 @@ public final class ContextOuterClass {
 
         public static final int PARENT_FIELD_NUMBER = 5;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object parent_ = "";
+        private volatile java.lang.Object parent_;
 
         /**
          * string parent = 5;
@@ -17306,17 +18029,17 @@ public final class ContextOuterClass {
             if (componentUuid_ != null) {
                 output.writeMessage(1, getComponentUuid());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(type_)) {
+            if (!getTypeBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 3, type_);
             }
             com.google.protobuf.GeneratedMessageV3.serializeStringMapTo(output, internalGetAttributes(), AttributesDefaultEntryHolder.defaultEntry, 4);
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(parent_)) {
+            if (!getParentBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 5, parent_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -17328,20 +18051,20 @@ public final class ContextOuterClass {
             if (componentUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getComponentUuid());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(type_)) {
+            if (!getTypeBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, type_);
             }
             for (java.util.Map.Entry entry : internalGetAttributes().getMap().entrySet()) {
                 com.google.protobuf.MapEntry attributes__ = AttributesDefaultEntryHolder.defaultEntry.newBuilderForType().setKey(entry.getKey()).setValue(entry.getValue()).build();
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, attributes__);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(parent_)) {
+            if (!getParentBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, parent_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -17369,7 +18092,7 @@ public final class ContextOuterClass {
                 return false;
             if (!getParent().equals(other.getParent()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -17395,7 +18118,7 @@ public final class ContextOuterClass {
             }
             hash = (37 * hash) + PARENT_FIELD_NUMBER;
             hash = (53 * hash) + getParent().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -17513,19 +18236,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Component.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                componentUuid_ = null;
-                if (componentUuidBuilder_ != null) {
-                    componentUuidBuilder_.dispose();
+                if (componentUuidBuilder_ == null) {
+                    componentUuid_ = null;
+                } else {
+                    componentUuid_ = null;
                     componentUuidBuilder_ = null;
                 }
                 name_ = "";
@@ -17557,31 +18287,49 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Component buildPartial() {
                 context.ContextOuterClass.Component result = new context.ContextOuterClass.Component(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (componentUuidBuilder_ == null) {
+                    result.componentUuid_ = componentUuid_;
+                } else {
+                    result.componentUuid_ = componentUuidBuilder_.build();
                 }
+                result.name_ = name_;
+                result.type_ = type_;
+                result.attributes_ = internalGetAttributes();
+                result.attributes_.makeImmutable();
+                result.parent_ = parent_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Component result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.componentUuid_ = componentUuidBuilder_ == null ? componentUuid_ : componentUuidBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.type_ = type_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.attributes_ = internalGetAttributes();
-                    result.attributes_.makeImmutable();
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.parent_ = parent_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -17602,22 +18350,18 @@ public final class ContextOuterClass {
                 }
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (!other.getType().isEmpty()) {
                     type_ = other.type_;
-                    bitField0_ |= 0x00000004;
                     onChanged();
                 }
                 internalGetMutableAttributes().mergeFrom(other.internalGetAttributes());
-                bitField0_ |= 0x00000008;
                 if (!other.getParent().isEmpty()) {
                     parent_ = other.parent_;
-                    bitField0_ |= 0x00000010;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -17629,71 +18373,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Component parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getComponentUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    type_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    com.google.protobuf.MapEntry attributes__ = input.readMessage(AttributesDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
-                                    internalGetMutableAttributes().getMutableMap().put(attributes__.getKey(), attributes__.getValue());
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    parent_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 42
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Component) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -17708,7 +18398,7 @@ public final class ContextOuterClass {
              * @return Whether the componentUuid field is set.
              */
             public boolean hasComponentUuid() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return componentUuidBuilder_ != null || componentUuid_ != null;
             }
 
             /**
@@ -17732,11 +18422,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     componentUuid_ = value;
+                    onChanged();
                 } else {
                     componentUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -17746,11 +18435,10 @@ public final class ContextOuterClass {
             public Builder setComponentUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (componentUuidBuilder_ == null) {
                     componentUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     componentUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -17759,16 +18447,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeComponentUuid(context.ContextOuterClass.Uuid value) {
                 if (componentUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && componentUuid_ != null && componentUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getComponentUuidBuilder().mergeFrom(value);
+                    if (componentUuid_ != null) {
+                        componentUuid_ = context.ContextOuterClass.Uuid.newBuilder(componentUuid_).mergeFrom(value).buildPartial();
                     } else {
                         componentUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     componentUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -17776,13 +18463,13 @@ public final class ContextOuterClass {
              * .context.Uuid component_uuid = 1;
              */
             public Builder clearComponentUuid() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                componentUuid_ = null;
-                if (componentUuidBuilder_ != null) {
-                    componentUuidBuilder_.dispose();
+                if (componentUuidBuilder_ == null) {
+                    componentUuid_ = null;
+                    onChanged();
+                } else {
+                    componentUuid_ = null;
                     componentUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -17790,7 +18477,6 @@ public final class ContextOuterClass {
              * .context.Uuid component_uuid = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getComponentUuidBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getComponentUuidFieldBuilder().getBuilder();
             }
@@ -17860,7 +18546,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -17871,7 +18556,6 @@ public final class ContextOuterClass {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -17887,7 +18571,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -17935,7 +18618,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 type_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -17946,7 +18628,6 @@ public final class ContextOuterClass {
              */
             public Builder clearType() {
                 type_ = getDefaultInstance().getType();
-                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -17962,7 +18643,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 type_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -17977,14 +18657,14 @@ public final class ContextOuterClass {
             }
 
             private com.google.protobuf.MapField internalGetMutableAttributes() {
+                onChanged();
+                ;
                 if (attributes_ == null) {
                     attributes_ = com.google.protobuf.MapField.newMapField(AttributesDefaultEntryHolder.defaultEntry);
                 }
                 if (!attributes_.isMutable()) {
                     attributes_ = attributes_.copy();
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return attributes_;
             }
 
@@ -18002,7 +18682,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public boolean containsAttributes(java.lang.String key) {
                 if (key == null) {
-                    throw new NullPointerException("map key");
+                    throw new java.lang.NullPointerException();
                 }
                 return internalGetAttributes().getMap().containsKey(key);
             }
@@ -18036,11 +18716,9 @@ public final class ContextOuterClass {
              * map<string, string> attributes = 4;
              */
             @java.lang.Override
-            public /* nullable */
-            java.lang.String getAttributesOrDefault(java.lang.String key, /* nullable */
-            java.lang.String defaultValue) {
+            public java.lang.String getAttributesOrDefault(java.lang.String key, java.lang.String defaultValue) {
                 if (key == null) {
-                    throw new NullPointerException("map key");
+                    throw new java.lang.NullPointerException();
                 }
                 java.util.Map map = internalGetAttributes().getMap();
                 return map.containsKey(key) ? map.get(key) : defaultValue;
@@ -18056,7 +18734,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public java.lang.String getAttributesOrThrow(java.lang.String key) {
                 if (key == null) {
-                    throw new NullPointerException("map key");
+                    throw new java.lang.NullPointerException();
                 }
                 java.util.Map map = internalGetAttributes().getMap();
                 if (!map.containsKey(key)) {
@@ -18066,7 +18744,6 @@ public final class ContextOuterClass {
             }
 
             public Builder clearAttributes() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 internalGetMutableAttributes().getMutableMap().clear();
                 return this;
             }
@@ -18080,7 +18757,7 @@ public final class ContextOuterClass {
              */
             public Builder removeAttributes(java.lang.String key) {
                 if (key == null) {
-                    throw new NullPointerException("map key");
+                    throw new java.lang.NullPointerException();
                 }
                 internalGetMutableAttributes().getMutableMap().remove(key);
                 return this;
@@ -18091,7 +18768,6 @@ public final class ContextOuterClass {
              */
             @java.lang.Deprecated
             public java.util.Map getMutableAttributes() {
-                bitField0_ |= 0x00000008;
                 return internalGetMutableAttributes().getMutableMap();
             }
 
@@ -18104,13 +18780,12 @@ public final class ContextOuterClass {
              */
             public Builder putAttributes(java.lang.String key, java.lang.String value) {
                 if (key == null) {
-                    throw new NullPointerException("map key");
+                    throw new java.lang.NullPointerException();
                 }
                 if (value == null) {
-                    throw new NullPointerException("map value");
+                    throw new java.lang.NullPointerException();
                 }
                 internalGetMutableAttributes().getMutableMap().put(key, value);
-                bitField0_ |= 0x00000008;
                 return this;
             }
 
@@ -18123,7 +18798,6 @@ public final class ContextOuterClass {
              */
             public Builder putAllAttributes(java.util.Map values) {
                 internalGetMutableAttributes().getMutableMap().putAll(values);
-                bitField0_ |= 0x00000008;
                 return this;
             }
 
@@ -18170,7 +18844,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 parent_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -18181,7 +18854,6 @@ public final class ContextOuterClass {
              */
             public Builder clearParent() {
                 parent_ = getDefaultInstance().getParent();
-                bitField0_ = (bitField0_ & ~0x00000010);
                 onChanged();
                 return this;
             }
@@ -18197,7 +18869,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 parent_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -18229,17 +18900,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Component parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Component(input, extensionRegistry);
             }
         };
 
@@ -18310,6 +18971,57 @@ public final class ContextOuterClass {
             return new DeviceConfig();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceConfig(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    configRules_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                configRules_.add(input.readMessage(context.ContextOuterClass.ConfigRule.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    configRules_ = java.util.Collections.unmodifiableList(configRules_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_DeviceConfig_descriptor;
         }
@@ -18321,7 +19033,6 @@ public final class ContextOuterClass {
 
         public static final int CONFIG_RULES_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List configRules_;
 
         /**
@@ -18382,7 +19093,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < configRules_.size(); i++) {
                 output.writeMessage(1, configRules_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -18394,7 +19105,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < configRules_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, configRules_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -18410,7 +19121,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.DeviceConfig other = (context.ContextOuterClass.DeviceConfig) obj;
             if (!getConfigRulesList().equals(other.getConfigRulesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -18426,7 +19137,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONFIG_RULES_FIELD_NUMBER;
                 hash = (53 * hash) + getConfigRulesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -18520,23 +19231,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.DeviceConfig.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getConfigRulesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (configRulesBuilder_ == null) {
                     configRules_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    configRules_ = null;
                     configRulesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -18562,15 +19279,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.DeviceConfig buildPartial() {
                 context.ContextOuterClass.DeviceConfig result = new context.ContextOuterClass.DeviceConfig(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.DeviceConfig result) {
+                int from_bitField0_ = bitField0_;
                 if (configRulesBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         configRules_ = java.util.Collections.unmodifiableList(configRules_);
@@ -18580,10 +19289,38 @@ public final class ContextOuterClass {
                 } else {
                     result.configRules_ = configRulesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.DeviceConfig result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -18623,7 +19360,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -18635,47 +19372,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.DeviceConfig parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.ConfigRule m = input.readMessage(context.ContextOuterClass.ConfigRule.parser(), extensionRegistry);
-                                    if (configRulesBuilder_ == null) {
-                                        ensureConfigRulesIsMutable();
-                                        configRules_.add(m);
-                                    } else {
-                                        configRulesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.DeviceConfig) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -18945,17 +19652,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public DeviceConfig parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceConfig(input, extensionRegistry);
             }
         };
 
@@ -19026,6 +19723,57 @@ public final class ContextOuterClass {
             return new DeviceIdList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    deviceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                deviceIds_.add(input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    deviceIds_ = java.util.Collections.unmodifiableList(deviceIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_DeviceIdList_descriptor;
         }
@@ -19037,7 +19785,6 @@ public final class ContextOuterClass {
 
         public static final int DEVICE_IDS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List deviceIds_;
 
         /**
@@ -19098,7 +19845,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < deviceIds_.size(); i++) {
                 output.writeMessage(1, deviceIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -19110,7 +19857,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < deviceIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, deviceIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -19126,7 +19873,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.DeviceIdList other = (context.ContextOuterClass.DeviceIdList) obj;
             if (!getDeviceIdsList().equals(other.getDeviceIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -19142,7 +19889,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + DEVICE_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getDeviceIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -19236,23 +19983,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.DeviceIdList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getDeviceIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (deviceIdsBuilder_ == null) {
                     deviceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    deviceIds_ = null;
                     deviceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -19278,15 +20031,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.DeviceIdList buildPartial() {
                 context.ContextOuterClass.DeviceIdList result = new context.ContextOuterClass.DeviceIdList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.DeviceIdList result) {
+                int from_bitField0_ = bitField0_;
                 if (deviceIdsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         deviceIds_ = java.util.Collections.unmodifiableList(deviceIds_);
@@ -19296,10 +20041,38 @@ public final class ContextOuterClass {
                 } else {
                     result.deviceIds_ = deviceIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.DeviceIdList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -19339,7 +20112,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -19351,47 +20124,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.DeviceIdList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.DeviceId m = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
-                                    if (deviceIdsBuilder_ == null) {
-                                        ensureDeviceIdsIsMutable();
-                                        deviceIds_.add(m);
-                                    } else {
-                                        deviceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.DeviceIdList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -19661,17 +20404,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public DeviceIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceIdList(input, extensionRegistry);
             }
         };
 
@@ -19742,6 +20475,57 @@ public final class ContextOuterClass {
             return new DeviceList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    devices_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                devices_.add(input.readMessage(context.ContextOuterClass.Device.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    devices_ = java.util.Collections.unmodifiableList(devices_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_DeviceList_descriptor;
         }
@@ -19753,7 +20537,6 @@ public final class ContextOuterClass {
 
         public static final int DEVICES_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List devices_;
 
         /**
@@ -19814,7 +20597,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < devices_.size(); i++) {
                 output.writeMessage(1, devices_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -19826,7 +20609,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < devices_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, devices_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -19842,7 +20625,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.DeviceList other = (context.ContextOuterClass.DeviceList) obj;
             if (!getDevicesList().equals(other.getDevicesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -19858,7 +20641,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + DEVICES_FIELD_NUMBER;
                 hash = (53 * hash) + getDevicesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -19952,23 +20735,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.DeviceList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getDevicesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (devicesBuilder_ == null) {
                     devices_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    devices_ = null;
                     devicesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -19994,15 +20783,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.DeviceList buildPartial() {
                 context.ContextOuterClass.DeviceList result = new context.ContextOuterClass.DeviceList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.DeviceList result) {
+                int from_bitField0_ = bitField0_;
                 if (devicesBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         devices_ = java.util.Collections.unmodifiableList(devices_);
@@ -20012,10 +20793,38 @@ public final class ContextOuterClass {
                 } else {
                     result.devices_ = devicesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.DeviceList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -20055,7 +20864,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -20067,47 +20876,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.DeviceList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.Device m = input.readMessage(context.ContextOuterClass.Device.parser(), extensionRegistry);
-                                    if (devicesBuilder_ == null) {
-                                        ensureDevicesIsMutable();
-                                        devices_.add(m);
-                                    } else {
-                                        devicesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.DeviceList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -20377,17 +21156,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public DeviceList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceList(input, extensionRegistry);
             }
         };
 
@@ -20467,6 +21236,72 @@ public final class ContextOuterClass {
             return new DeviceFilter();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceFilter(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.DeviceIdList.Builder subBuilder = null;
+                                if (deviceIds_ != null) {
+                                    subBuilder = deviceIds_.toBuilder();
+                                }
+                                deviceIds_ = input.readMessage(context.ContextOuterClass.DeviceIdList.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(deviceIds_);
+                                    deviceIds_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 16:
+                            {
+                                includeEndpoints_ = input.readBool();
+                                break;
+                            }
+                        case 24:
+                            {
+                                includeConfigRules_ = input.readBool();
+                                break;
+                            }
+                        case 32:
+                            {
+                                includeComponents_ = input.readBool();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_DeviceFilter_descriptor;
         }
@@ -20503,12 +21338,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.DeviceIdListOrBuilder getDeviceIdsOrBuilder() {
-            return deviceIds_ == null ? context.ContextOuterClass.DeviceIdList.getDefaultInstance() : deviceIds_;
+            return getDeviceIds();
         }
 
         public static final int INCLUDE_ENDPOINTS_FIELD_NUMBER = 2;
 
-        private boolean includeEndpoints_ = false;
+        private boolean includeEndpoints_;
 
         /**
          * bool include_endpoints = 2;
@@ -20521,7 +21356,7 @@ public final class ContextOuterClass {
 
         public static final int INCLUDE_CONFIG_RULES_FIELD_NUMBER = 3;
 
-        private boolean includeConfigRules_ = false;
+        private boolean includeConfigRules_;
 
         /**
          * bool include_config_rules = 3;
@@ -20534,7 +21369,7 @@ public final class ContextOuterClass {
 
         public static final int INCLUDE_COMPONENTS_FIELD_NUMBER = 4;
 
-        private boolean includeComponents_ = false;
+        private boolean includeComponents_;
 
         /**
          * bool include_components = 4;
@@ -20572,7 +21407,7 @@ public final class ContextOuterClass {
             if (includeComponents_ != false) {
                 output.writeBool(4, includeComponents_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -20593,7 +21428,7 @@ public final class ContextOuterClass {
             if (includeComponents_ != false) {
                 size += com.google.protobuf.CodedOutputStream.computeBoolSize(4, includeComponents_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -20619,7 +21454,7 @@ public final class ContextOuterClass {
                 return false;
             if (getIncludeComponents() != other.getIncludeComponents())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -20641,7 +21476,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeConfigRules());
             hash = (37 * hash) + INCLUDE_COMPONENTS_FIELD_NUMBER;
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeComponents());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -20735,19 +21570,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.DeviceFilter.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                deviceIds_ = null;
-                if (deviceIdsBuilder_ != null) {
-                    deviceIdsBuilder_.dispose();
+                if (deviceIdsBuilder_ == null) {
+                    deviceIds_ = null;
+                } else {
+                    deviceIds_ = null;
                     deviceIdsBuilder_ = null;
                 }
                 includeEndpoints_ = false;
@@ -20778,27 +21620,46 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.DeviceFilter buildPartial() {
                 context.ContextOuterClass.DeviceFilter result = new context.ContextOuterClass.DeviceFilter(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (deviceIdsBuilder_ == null) {
+                    result.deviceIds_ = deviceIds_;
+                } else {
+                    result.deviceIds_ = deviceIdsBuilder_.build();
                 }
+                result.includeEndpoints_ = includeEndpoints_;
+                result.includeConfigRules_ = includeConfigRules_;
+                result.includeComponents_ = includeComponents_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.DeviceFilter result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.deviceIds_ = deviceIdsBuilder_ == null ? deviceIds_ : deviceIdsBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.includeEndpoints_ = includeEndpoints_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.includeConfigRules_ = includeConfigRules_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.includeComponents_ = includeComponents_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -20826,7 +21687,7 @@ public final class ContextOuterClass {
                 if (other.getIncludeComponents() != false) {
                     setIncludeComponents(other.getIncludeComponents());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -20838,68 +21699,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.DeviceFilter parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getDeviceIdsFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 16:
-                                {
-                                    includeEndpoints_ = input.readBool();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            case 24:
-                                {
-                                    includeConfigRules_ = input.readBool();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 32:
-                                {
-                                    includeComponents_ = input.readBool();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 32
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.DeviceFilter) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.DeviceIdList deviceIds_;
 
             private com.google.protobuf.SingleFieldBuilderV3 deviceIdsBuilder_;
@@ -20909,7 +21722,7 @@ public final class ContextOuterClass {
              * @return Whether the deviceIds field is set.
              */
             public boolean hasDeviceIds() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return deviceIdsBuilder_ != null || deviceIds_ != null;
             }
 
             /**
@@ -20933,11 +21746,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     deviceIds_ = value;
+                    onChanged();
                 } else {
                     deviceIdsBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -20947,11 +21759,10 @@ public final class ContextOuterClass {
             public Builder setDeviceIds(context.ContextOuterClass.DeviceIdList.Builder builderForValue) {
                 if (deviceIdsBuilder_ == null) {
                     deviceIds_ = builderForValue.build();
+                    onChanged();
                 } else {
                     deviceIdsBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -20960,16 +21771,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeDeviceIds(context.ContextOuterClass.DeviceIdList value) {
                 if (deviceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && deviceIds_ != null && deviceIds_ != context.ContextOuterClass.DeviceIdList.getDefaultInstance()) {
-                        getDeviceIdsBuilder().mergeFrom(value);
+                    if (deviceIds_ != null) {
+                        deviceIds_ = context.ContextOuterClass.DeviceIdList.newBuilder(deviceIds_).mergeFrom(value).buildPartial();
                     } else {
                         deviceIds_ = value;
                     }
+                    onChanged();
                 } else {
                     deviceIdsBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -20977,13 +21787,13 @@ public final class ContextOuterClass {
              * .context.DeviceIdList device_ids = 1;
              */
             public Builder clearDeviceIds() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                deviceIds_ = null;
-                if (deviceIdsBuilder_ != null) {
-                    deviceIdsBuilder_.dispose();
+                if (deviceIdsBuilder_ == null) {
+                    deviceIds_ = null;
+                    onChanged();
+                } else {
+                    deviceIds_ = null;
                     deviceIdsBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -20991,7 +21801,6 @@ public final class ContextOuterClass {
              * .context.DeviceIdList device_ids = 1;
              */
             public context.ContextOuterClass.DeviceIdList.Builder getDeviceIdsBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getDeviceIdsFieldBuilder().getBuilder();
             }
@@ -21036,7 +21845,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeEndpoints(boolean value) {
                 includeEndpoints_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -21046,7 +21854,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeEndpoints() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 includeEndpoints_ = false;
                 onChanged();
                 return this;
@@ -21070,7 +21877,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeConfigRules(boolean value) {
                 includeConfigRules_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -21080,7 +21886,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeConfigRules() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 includeConfigRules_ = false;
                 onChanged();
                 return this;
@@ -21104,7 +21909,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeComponents(boolean value) {
                 includeComponents_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -21114,7 +21918,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeComponents() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 includeComponents_ = false;
                 onChanged();
                 return this;
@@ -21147,17 +21950,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public DeviceFilter parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceFilter(input, extensionRegistry);
             }
         };
 
@@ -21253,6 +22046,83 @@ public final class ContextOuterClass {
             return new DeviceEvent();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceEvent(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Event.Builder subBuilder = null;
+                                if (event_ != null) {
+                                    subBuilder = event_.toBuilder();
+                                }
+                                event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(event_);
+                                    event_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.DeviceId.Builder subBuilder = null;
+                                if (deviceId_ != null) {
+                                    subBuilder = deviceId_.toBuilder();
+                                }
+                                deviceId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(deviceId_);
+                                    deviceId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 26:
+                            {
+                                context.ContextOuterClass.DeviceConfig.Builder subBuilder = null;
+                                if (deviceConfig_ != null) {
+                                    subBuilder = deviceConfig_.toBuilder();
+                                }
+                                deviceConfig_ = input.readMessage(context.ContextOuterClass.DeviceConfig.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(deviceConfig_);
+                                    deviceConfig_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_DeviceEvent_descriptor;
         }
@@ -21289,7 +22159,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-            return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+            return getEvent();
         }
 
         public static final int DEVICE_ID_FIELD_NUMBER = 2;
@@ -21319,7 +22189,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() {
-            return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
+            return getDeviceId();
         }
 
         public static final int DEVICE_CONFIG_FIELD_NUMBER = 3;
@@ -21349,7 +22219,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.DeviceConfigOrBuilder getDeviceConfigOrBuilder() {
-            return deviceConfig_ == null ? context.ContextOuterClass.DeviceConfig.getDefaultInstance() : deviceConfig_;
+            return getDeviceConfig();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -21376,7 +22246,7 @@ public final class ContextOuterClass {
             if (deviceConfig_ != null) {
                 output.writeMessage(3, getDeviceConfig());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -21394,7 +22264,7 @@ public final class ContextOuterClass {
             if (deviceConfig_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getDeviceConfig());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -21426,7 +22296,7 @@ public final class ContextOuterClass {
                 if (!getDeviceConfig().equals(other.getDeviceConfig()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -21450,7 +22320,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + DEVICE_CONFIG_FIELD_NUMBER;
                 hash = (53 * hash) + getDeviceConfig().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -21544,29 +22414,38 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.DeviceEvent.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                deviceId_ = null;
-                if (deviceIdBuilder_ != null) {
-                    deviceIdBuilder_.dispose();
+                if (deviceIdBuilder_ == null) {
+                    deviceId_ = null;
+                } else {
+                    deviceId_ = null;
                     deviceIdBuilder_ = null;
                 }
-                deviceConfig_ = null;
-                if (deviceConfigBuilder_ != null) {
-                    deviceConfigBuilder_.dispose();
+                if (deviceConfigBuilder_ == null) {
+                    deviceConfig_ = null;
+                } else {
+                    deviceConfig_ = null;
                     deviceConfigBuilder_ = null;
                 }
                 return this;
@@ -21594,24 +22473,53 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.DeviceEvent buildPartial() {
                 context.ContextOuterClass.DeviceEvent result = new context.ContextOuterClass.DeviceEvent(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (eventBuilder_ == null) {
+                    result.event_ = event_;
+                } else {
+                    result.event_ = eventBuilder_.build();
+                }
+                if (deviceIdBuilder_ == null) {
+                    result.deviceId_ = deviceId_;
+                } else {
+                    result.deviceId_ = deviceIdBuilder_.build();
+                }
+                if (deviceConfigBuilder_ == null) {
+                    result.deviceConfig_ = deviceConfig_;
+                } else {
+                    result.deviceConfig_ = deviceConfigBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.DeviceEvent result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.event_ = eventBuilder_ == null ? event_ : eventBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.deviceId_ = deviceIdBuilder_ == null ? deviceId_ : deviceIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.deviceConfig_ = deviceConfigBuilder_ == null ? deviceConfig_ : deviceConfigBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -21636,7 +22544,7 @@ public final class ContextOuterClass {
                 if (other.hasDeviceConfig()) {
                     mergeDeviceConfig(other.getDeviceConfig());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -21648,61 +22556,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.DeviceEvent parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEventFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getDeviceIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getDeviceConfigFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.DeviceEvent) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Event event_;
 
             private com.google.protobuf.SingleFieldBuilderV3 eventBuilder_;
@@ -21712,7 +22579,7 @@ public final class ContextOuterClass {
              * @return Whether the event field is set.
              */
             public boolean hasEvent() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return eventBuilder_ != null || event_ != null;
             }
 
             /**
@@ -21736,11 +22603,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     event_ = value;
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -21750,11 +22616,10 @@ public final class ContextOuterClass {
             public Builder setEvent(context.ContextOuterClass.Event.Builder builderForValue) {
                 if (eventBuilder_ == null) {
                     event_ = builderForValue.build();
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -21763,16 +22628,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEvent(context.ContextOuterClass.Event value) {
                 if (eventBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && event_ != null && event_ != context.ContextOuterClass.Event.getDefaultInstance()) {
-                        getEventBuilder().mergeFrom(value);
+                    if (event_ != null) {
+                        event_ = context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
                     } else {
                         event_ = value;
                     }
+                    onChanged();
                 } else {
                     eventBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -21780,13 +22644,13 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public Builder clearEvent() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                    onChanged();
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -21794,7 +22658,6 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public context.ContextOuterClass.Event.Builder getEventBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEventFieldBuilder().getBuilder();
             }
@@ -21830,7 +22693,7 @@ public final class ContextOuterClass {
              * @return Whether the deviceId field is set.
              */
             public boolean hasDeviceId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return deviceIdBuilder_ != null || deviceId_ != null;
             }
 
             /**
@@ -21854,11 +22717,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     deviceId_ = value;
+                    onChanged();
                 } else {
                     deviceIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -21868,11 +22730,10 @@ public final class ContextOuterClass {
             public Builder setDeviceId(context.ContextOuterClass.DeviceId.Builder builderForValue) {
                 if (deviceIdBuilder_ == null) {
                     deviceId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     deviceIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -21881,16 +22742,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeDeviceId(context.ContextOuterClass.DeviceId value) {
                 if (deviceIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && deviceId_ != null && deviceId_ != context.ContextOuterClass.DeviceId.getDefaultInstance()) {
-                        getDeviceIdBuilder().mergeFrom(value);
+                    if (deviceId_ != null) {
+                        deviceId_ = context.ContextOuterClass.DeviceId.newBuilder(deviceId_).mergeFrom(value).buildPartial();
                     } else {
                         deviceId_ = value;
                     }
+                    onChanged();
                 } else {
                     deviceIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -21898,13 +22758,13 @@ public final class ContextOuterClass {
              * .context.DeviceId device_id = 2;
              */
             public Builder clearDeviceId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                deviceId_ = null;
-                if (deviceIdBuilder_ != null) {
-                    deviceIdBuilder_.dispose();
+                if (deviceIdBuilder_ == null) {
+                    deviceId_ = null;
+                    onChanged();
+                } else {
+                    deviceId_ = null;
                     deviceIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -21912,7 +22772,6 @@ public final class ContextOuterClass {
              * .context.DeviceId device_id = 2;
              */
             public context.ContextOuterClass.DeviceId.Builder getDeviceIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getDeviceIdFieldBuilder().getBuilder();
             }
@@ -21948,7 +22807,7 @@ public final class ContextOuterClass {
              * @return Whether the deviceConfig field is set.
              */
             public boolean hasDeviceConfig() {
-                return ((bitField0_ & 0x00000004) != 0);
+                return deviceConfigBuilder_ != null || deviceConfig_ != null;
             }
 
             /**
@@ -21972,11 +22831,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     deviceConfig_ = value;
+                    onChanged();
                 } else {
                     deviceConfigBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -21986,11 +22844,10 @@ public final class ContextOuterClass {
             public Builder setDeviceConfig(context.ContextOuterClass.DeviceConfig.Builder builderForValue) {
                 if (deviceConfigBuilder_ == null) {
                     deviceConfig_ = builderForValue.build();
+                    onChanged();
                 } else {
                     deviceConfigBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -21999,16 +22856,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeDeviceConfig(context.ContextOuterClass.DeviceConfig value) {
                 if (deviceConfigBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0) && deviceConfig_ != null && deviceConfig_ != context.ContextOuterClass.DeviceConfig.getDefaultInstance()) {
-                        getDeviceConfigBuilder().mergeFrom(value);
+                    if (deviceConfig_ != null) {
+                        deviceConfig_ = context.ContextOuterClass.DeviceConfig.newBuilder(deviceConfig_).mergeFrom(value).buildPartial();
                     } else {
                         deviceConfig_ = value;
                     }
+                    onChanged();
                 } else {
                     deviceConfigBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -22016,13 +22872,13 @@ public final class ContextOuterClass {
              * .context.DeviceConfig device_config = 3;
              */
             public Builder clearDeviceConfig() {
-                bitField0_ = (bitField0_ & ~0x00000004);
-                deviceConfig_ = null;
-                if (deviceConfigBuilder_ != null) {
-                    deviceConfigBuilder_.dispose();
+                if (deviceConfigBuilder_ == null) {
+                    deviceConfig_ = null;
+                    onChanged();
+                } else {
+                    deviceConfig_ = null;
                     deviceConfigBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -22030,7 +22886,6 @@ public final class ContextOuterClass {
              * .context.DeviceConfig device_config = 3;
              */
             public context.ContextOuterClass.DeviceConfig.Builder getDeviceConfigBuilder() {
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return getDeviceConfigFieldBuilder().getBuilder();
             }
@@ -22084,17 +22939,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public DeviceEvent parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceEvent(input, extensionRegistry);
             }
         };
 
@@ -22160,6 +23005,57 @@ public final class ContextOuterClass {
             return new LinkId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private LinkId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (linkUuid_ != null) {
+                                    subBuilder = linkUuid_.toBuilder();
+                                }
+                                linkUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(linkUuid_);
+                                    linkUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_LinkId_descriptor;
         }
@@ -22196,7 +23092,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getLinkUuidOrBuilder() {
-            return linkUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : linkUuid_;
+            return getLinkUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -22217,7 +23113,7 @@ public final class ContextOuterClass {
             if (linkUuid_ != null) {
                 output.writeMessage(1, getLinkUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -22229,7 +23125,7 @@ public final class ContextOuterClass {
             if (linkUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getLinkUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -22249,7 +23145,7 @@ public final class ContextOuterClass {
                 if (!getLinkUuid().equals(other.getLinkUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -22265,7 +23161,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + LINK_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getLinkUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -22363,19 +23259,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.LinkId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                linkUuid_ = null;
-                if (linkUuidBuilder_ != null) {
-                    linkUuidBuilder_.dispose();
+                if (linkUuidBuilder_ == null) {
+                    linkUuid_ = null;
+                } else {
+                    linkUuid_ = null;
                     linkUuidBuilder_ = null;
                 }
                 return this;
@@ -22403,18 +23306,43 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.LinkId buildPartial() {
                 context.ContextOuterClass.LinkId result = new context.ContextOuterClass.LinkId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (linkUuidBuilder_ == null) {
+                    result.linkUuid_ = linkUuid_;
+                } else {
+                    result.linkUuid_ = linkUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.LinkId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.linkUuid_ = linkUuidBuilder_ == null ? linkUuid_ : linkUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -22433,7 +23361,7 @@ public final class ContextOuterClass {
                 if (other.hasLinkUuid()) {
                     mergeLinkUuid(other.getLinkUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -22445,47 +23373,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.LinkId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getLinkUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.LinkId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid linkUuid_;
 
             private com.google.protobuf.SingleFieldBuilderV3 linkUuidBuilder_;
@@ -22495,7 +23396,7 @@ public final class ContextOuterClass {
              * @return Whether the linkUuid field is set.
              */
             public boolean hasLinkUuid() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return linkUuidBuilder_ != null || linkUuid_ != null;
             }
 
             /**
@@ -22519,11 +23420,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     linkUuid_ = value;
+                    onChanged();
                 } else {
                     linkUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -22533,11 +23433,10 @@ public final class ContextOuterClass {
             public Builder setLinkUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (linkUuidBuilder_ == null) {
                     linkUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     linkUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -22546,16 +23445,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeLinkUuid(context.ContextOuterClass.Uuid value) {
                 if (linkUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && linkUuid_ != null && linkUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getLinkUuidBuilder().mergeFrom(value);
+                    if (linkUuid_ != null) {
+                        linkUuid_ = context.ContextOuterClass.Uuid.newBuilder(linkUuid_).mergeFrom(value).buildPartial();
                     } else {
                         linkUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     linkUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -22563,13 +23461,13 @@ public final class ContextOuterClass {
              * .context.Uuid link_uuid = 1;
              */
             public Builder clearLinkUuid() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                linkUuid_ = null;
-                if (linkUuidBuilder_ != null) {
-                    linkUuidBuilder_.dispose();
+                if (linkUuidBuilder_ == null) {
+                    linkUuid_ = null;
+                    onChanged();
+                } else {
+                    linkUuid_ = null;
                     linkUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -22577,7 +23475,6 @@ public final class ContextOuterClass {
              * .context.Uuid link_uuid = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getLinkUuidBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getLinkUuidFieldBuilder().getBuilder();
             }
@@ -22631,17 +23528,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public LinkId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new LinkId(input, extensionRegistry);
             }
         };
 
@@ -22698,6 +23585,54 @@ public final class ContextOuterClass {
             return new LinkAttributes();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private LinkAttributes(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 13:
+                            {
+                                totalCapacityGbps_ = input.readFloat();
+                                break;
+                            }
+                        case 21:
+                            {
+                                usedCapacityGbps_ = input.readFloat();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_LinkAttributes_descriptor;
         }
@@ -22709,7 +23644,7 @@ public final class ContextOuterClass {
 
         public static final int TOTAL_CAPACITY_GBPS_FIELD_NUMBER = 1;
 
-        private float totalCapacityGbps_ = 0F;
+        private float totalCapacityGbps_;
 
         /**
          * float total_capacity_gbps = 1;
@@ -22722,7 +23657,7 @@ public final class ContextOuterClass {
 
         public static final int USED_CAPACITY_GBPS_FIELD_NUMBER = 2;
 
-        private float usedCapacityGbps_ = 0F;
+        private float usedCapacityGbps_;
 
         /**
          * float used_capacity_gbps = 2;
@@ -22748,13 +23683,13 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (java.lang.Float.floatToRawIntBits(totalCapacityGbps_) != 0) {
+            if (totalCapacityGbps_ != 0F) {
                 output.writeFloat(1, totalCapacityGbps_);
             }
-            if (java.lang.Float.floatToRawIntBits(usedCapacityGbps_) != 0) {
+            if (usedCapacityGbps_ != 0F) {
                 output.writeFloat(2, usedCapacityGbps_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -22763,13 +23698,13 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (java.lang.Float.floatToRawIntBits(totalCapacityGbps_) != 0) {
+            if (totalCapacityGbps_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, totalCapacityGbps_);
             }
-            if (java.lang.Float.floatToRawIntBits(usedCapacityGbps_) != 0) {
+            if (usedCapacityGbps_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(2, usedCapacityGbps_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -22787,7 +23722,7 @@ public final class ContextOuterClass {
                 return false;
             if (java.lang.Float.floatToIntBits(getUsedCapacityGbps()) != java.lang.Float.floatToIntBits(other.getUsedCapacityGbps()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -22803,7 +23738,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getTotalCapacityGbps());
             hash = (37 * hash) + USED_CAPACITY_GBPS_FIELD_NUMBER;
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getUsedCapacityGbps());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -22897,16 +23832,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.LinkAttributes.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 totalCapacityGbps_ = 0F;
                 usedCapacityGbps_ = 0F;
                 return this;
@@ -22934,21 +23875,40 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.LinkAttributes buildPartial() {
                 context.ContextOuterClass.LinkAttributes result = new context.ContextOuterClass.LinkAttributes(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.totalCapacityGbps_ = totalCapacityGbps_;
+                result.usedCapacityGbps_ = usedCapacityGbps_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.LinkAttributes result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.totalCapacityGbps_ = totalCapacityGbps_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.usedCapacityGbps_ = usedCapacityGbps_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -22970,7 +23930,7 @@ public final class ContextOuterClass {
                 if (other.getUsedCapacityGbps() != 0F) {
                     setUsedCapacityGbps(other.getUsedCapacityGbps());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -22982,54 +23942,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.LinkAttributes parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 13:
-                                {
-                                    totalCapacityGbps_ = input.readFloat();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 13
-                            case 21:
-                                {
-                                    usedCapacityGbps_ = input.readFloat();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 21
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.LinkAttributes) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private float totalCapacityGbps_;
 
             /**
@@ -23048,7 +23974,6 @@ public final class ContextOuterClass {
              */
             public Builder setTotalCapacityGbps(float value) {
                 totalCapacityGbps_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -23058,7 +23983,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearTotalCapacityGbps() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 totalCapacityGbps_ = 0F;
                 onChanged();
                 return this;
@@ -23082,7 +24006,6 @@ public final class ContextOuterClass {
              */
             public Builder setUsedCapacityGbps(float value) {
                 usedCapacityGbps_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -23092,7 +24015,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearUsedCapacityGbps() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 usedCapacityGbps_ = 0F;
                 onChanged();
                 return this;
@@ -23125,17 +24047,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public LinkAttributes parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new LinkAttributes(input, extensionRegistry);
             }
         };
 
@@ -23253,6 +24165,89 @@ public final class ContextOuterClass {
             return new Link();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Link(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.LinkId.Builder subBuilder = null;
+                                if (linkId_ != null) {
+                                    subBuilder = linkId_.toBuilder();
+                                }
+                                linkId_ = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(linkId_);
+                                    linkId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    linkEndpointIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                linkEndpointIds_.add(input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 34:
+                            {
+                                context.ContextOuterClass.LinkAttributes.Builder subBuilder = null;
+                                if (attributes_ != null) {
+                                    subBuilder = attributes_.toBuilder();
+                                }
+                                attributes_ = input.readMessage(context.ContextOuterClass.LinkAttributes.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(attributes_);
+                                    attributes_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    linkEndpointIds_ = java.util.Collections.unmodifiableList(linkEndpointIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Link_descriptor;
         }
@@ -23289,13 +24284,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder() {
-            return linkId_ == null ? context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_;
+            return getLinkId();
         }
 
         public static final int NAME_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 2;
@@ -23332,7 +24326,6 @@ public final class ContextOuterClass {
 
         public static final int LINK_ENDPOINT_IDS_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
         private java.util.List linkEndpointIds_;
 
         /**
@@ -23402,7 +24395,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.LinkAttributesOrBuilder getAttributesOrBuilder() {
-            return attributes_ == null ? context.ContextOuterClass.LinkAttributes.getDefaultInstance() : attributes_;
+            return getAttributes();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -23423,7 +24416,7 @@ public final class ContextOuterClass {
             if (linkId_ != null) {
                 output.writeMessage(1, getLinkId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
             }
             for (int i = 0; i < linkEndpointIds_.size(); i++) {
@@ -23432,7 +24425,7 @@ public final class ContextOuterClass {
             if (attributes_ != null) {
                 output.writeMessage(4, getAttributes());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -23444,7 +24437,7 @@ public final class ContextOuterClass {
             if (linkId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getLinkId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
             }
             for (int i = 0; i < linkEndpointIds_.size(); i++) {
@@ -23453,7 +24446,7 @@ public final class ContextOuterClass {
             if (attributes_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, getAttributes());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -23483,7 +24476,7 @@ public final class ContextOuterClass {
                 if (!getAttributes().equals(other.getAttributes()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -23509,7 +24502,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + ATTRIBUTES_FIELD_NUMBER;
                 hash = (53 * hash) + getAttributes().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -23603,32 +24596,40 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Link.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getLinkEndpointIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                linkId_ = null;
-                if (linkIdBuilder_ != null) {
-                    linkIdBuilder_.dispose();
+                if (linkIdBuilder_ == null) {
+                    linkId_ = null;
+                } else {
+                    linkId_ = null;
                     linkIdBuilder_ = null;
                 }
                 name_ = "";
                 if (linkEndpointIdsBuilder_ == null) {
                     linkEndpointIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    linkEndpointIds_ = null;
                     linkEndpointIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000004);
-                attributes_ = null;
-                if (attributesBuilder_ != null) {
-                    attributesBuilder_.dispose();
+                if (attributesBuilder_ == null) {
+                    attributes_ = null;
+                } else {
+                    attributes_ = null;
                     attributesBuilder_ = null;
                 }
                 return this;
@@ -23656,37 +24657,59 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Link buildPartial() {
                 context.ContextOuterClass.Link result = new context.ContextOuterClass.Link(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (linkIdBuilder_ == null) {
+                    result.linkId_ = linkId_;
+                } else {
+                    result.linkId_ = linkIdBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Link result) {
+                result.name_ = name_;
                 if (linkEndpointIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         linkEndpointIds_ = java.util.Collections.unmodifiableList(linkEndpointIds_);
-                        bitField0_ = (bitField0_ & ~0x00000004);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.linkEndpointIds_ = linkEndpointIds_;
                 } else {
                     result.linkEndpointIds_ = linkEndpointIdsBuilder_.build();
                 }
+                if (attributesBuilder_ == null) {
+                    result.attributes_ = attributes_;
+                } else {
+                    result.attributes_ = attributesBuilder_.build();
+                }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Link result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.linkId_ = linkIdBuilder_ == null ? linkId_ : linkIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.attributes_ = attributesBuilder_ == null ? attributes_ : attributesBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -23707,14 +24730,13 @@ public final class ContextOuterClass {
                 }
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (linkEndpointIdsBuilder_ == null) {
                     if (!other.linkEndpointIds_.isEmpty()) {
                         if (linkEndpointIds_.isEmpty()) {
                             linkEndpointIds_ = other.linkEndpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureLinkEndpointIdsIsMutable();
                             linkEndpointIds_.addAll(other.linkEndpointIds_);
@@ -23727,7 +24749,7 @@ public final class ContextOuterClass {
                             linkEndpointIdsBuilder_.dispose();
                             linkEndpointIdsBuilder_ = null;
                             linkEndpointIds_ = other.linkEndpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             linkEndpointIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getLinkEndpointIdsFieldBuilder() : null;
                         } else {
                             linkEndpointIdsBuilder_.addAllMessages(other.linkEndpointIds_);
@@ -23737,7 +24759,7 @@ public final class ContextOuterClass {
                 if (other.hasAttributes()) {
                     mergeAttributes(other.getAttributes());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -23749,68 +24771,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Link parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getLinkIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    context.ContextOuterClass.EndPointId m = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-                                    if (linkEndpointIdsBuilder_ == null) {
-                                        ensureLinkEndpointIdsIsMutable();
-                                        linkEndpointIds_.add(m);
-                                    } else {
-                                        linkEndpointIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    input.readMessage(getAttributesFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 34
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Link) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -23825,7 +24796,7 @@ public final class ContextOuterClass {
              * @return Whether the linkId field is set.
              */
             public boolean hasLinkId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return linkIdBuilder_ != null || linkId_ != null;
             }
 
             /**
@@ -23849,11 +24820,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     linkId_ = value;
+                    onChanged();
                 } else {
                     linkIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -23863,11 +24833,10 @@ public final class ContextOuterClass {
             public Builder setLinkId(context.ContextOuterClass.LinkId.Builder builderForValue) {
                 if (linkIdBuilder_ == null) {
                     linkId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     linkIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -23876,16 +24845,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeLinkId(context.ContextOuterClass.LinkId value) {
                 if (linkIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && linkId_ != null && linkId_ != context.ContextOuterClass.LinkId.getDefaultInstance()) {
-                        getLinkIdBuilder().mergeFrom(value);
+                    if (linkId_ != null) {
+                        linkId_ = context.ContextOuterClass.LinkId.newBuilder(linkId_).mergeFrom(value).buildPartial();
                     } else {
                         linkId_ = value;
                     }
+                    onChanged();
                 } else {
                     linkIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -23893,13 +24861,13 @@ public final class ContextOuterClass {
              * .context.LinkId link_id = 1;
              */
             public Builder clearLinkId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                linkId_ = null;
-                if (linkIdBuilder_ != null) {
-                    linkIdBuilder_.dispose();
+                if (linkIdBuilder_ == null) {
+                    linkId_ = null;
+                    onChanged();
+                } else {
+                    linkId_ = null;
                     linkIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -23907,7 +24875,6 @@ public final class ContextOuterClass {
              * .context.LinkId link_id = 1;
              */
             public context.ContextOuterClass.LinkId.Builder getLinkIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getLinkIdFieldBuilder().getBuilder();
             }
@@ -23977,7 +24944,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -23988,7 +24954,6 @@ public final class ContextOuterClass {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -24004,7 +24969,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -24012,9 +24976,9 @@ public final class ContextOuterClass {
             private java.util.List linkEndpointIds_ = java.util.Collections.emptyList();
 
             private void ensureLinkEndpointIdsIsMutable() {
-                if (!((bitField0_ & 0x00000004) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     linkEndpointIds_ = new java.util.ArrayList(linkEndpointIds_);
-                    bitField0_ |= 0x00000004;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -24166,7 +25130,7 @@ public final class ContextOuterClass {
             public Builder clearLinkEndpointIds() {
                 if (linkEndpointIdsBuilder_ == null) {
                     linkEndpointIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000004);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     linkEndpointIdsBuilder_.clear();
@@ -24240,7 +25204,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getLinkEndpointIdsFieldBuilder() {
                 if (linkEndpointIdsBuilder_ == null) {
-                    linkEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(linkEndpointIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
+                    linkEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(linkEndpointIds_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     linkEndpointIds_ = null;
                 }
                 return linkEndpointIdsBuilder_;
@@ -24255,7 +25219,7 @@ public final class ContextOuterClass {
              * @return Whether the attributes field is set.
              */
             public boolean hasAttributes() {
-                return ((bitField0_ & 0x00000008) != 0);
+                return attributesBuilder_ != null || attributes_ != null;
             }
 
             /**
@@ -24279,11 +25243,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     attributes_ = value;
+                    onChanged();
                 } else {
                     attributesBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -24293,11 +25256,10 @@ public final class ContextOuterClass {
             public Builder setAttributes(context.ContextOuterClass.LinkAttributes.Builder builderForValue) {
                 if (attributesBuilder_ == null) {
                     attributes_ = builderForValue.build();
+                    onChanged();
                 } else {
                     attributesBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -24306,16 +25268,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeAttributes(context.ContextOuterClass.LinkAttributes value) {
                 if (attributesBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0) && attributes_ != null && attributes_ != context.ContextOuterClass.LinkAttributes.getDefaultInstance()) {
-                        getAttributesBuilder().mergeFrom(value);
+                    if (attributes_ != null) {
+                        attributes_ = context.ContextOuterClass.LinkAttributes.newBuilder(attributes_).mergeFrom(value).buildPartial();
                     } else {
                         attributes_ = value;
                     }
+                    onChanged();
                 } else {
                     attributesBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -24323,13 +25284,13 @@ public final class ContextOuterClass {
              * .context.LinkAttributes attributes = 4;
              */
             public Builder clearAttributes() {
-                bitField0_ = (bitField0_ & ~0x00000008);
-                attributes_ = null;
-                if (attributesBuilder_ != null) {
-                    attributesBuilder_.dispose();
+                if (attributesBuilder_ == null) {
+                    attributes_ = null;
+                    onChanged();
+                } else {
+                    attributes_ = null;
                     attributesBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -24337,7 +25298,6 @@ public final class ContextOuterClass {
              * .context.LinkAttributes attributes = 4;
              */
             public context.ContextOuterClass.LinkAttributes.Builder getAttributesBuilder() {
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return getAttributesFieldBuilder().getBuilder();
             }
@@ -24391,17 +25351,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Link parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Link(input, extensionRegistry);
             }
         };
 
@@ -24472,6 +25422,57 @@ public final class ContextOuterClass {
             return new LinkIdList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private LinkIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    linkIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                linkIds_.add(input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    linkIds_ = java.util.Collections.unmodifiableList(linkIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_LinkIdList_descriptor;
         }
@@ -24483,7 +25484,6 @@ public final class ContextOuterClass {
 
         public static final int LINK_IDS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List linkIds_;
 
         /**
@@ -24544,7 +25544,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < linkIds_.size(); i++) {
                 output.writeMessage(1, linkIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -24556,7 +25556,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < linkIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, linkIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -24572,7 +25572,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.LinkIdList other = (context.ContextOuterClass.LinkIdList) obj;
             if (!getLinkIdsList().equals(other.getLinkIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -24588,7 +25588,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + LINK_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getLinkIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -24682,23 +25682,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.LinkIdList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getLinkIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (linkIdsBuilder_ == null) {
                     linkIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    linkIds_ = null;
                     linkIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -24724,15 +25730,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.LinkIdList buildPartial() {
                 context.ContextOuterClass.LinkIdList result = new context.ContextOuterClass.LinkIdList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.LinkIdList result) {
+                int from_bitField0_ = bitField0_;
                 if (linkIdsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         linkIds_ = java.util.Collections.unmodifiableList(linkIds_);
@@ -24742,10 +25740,38 @@ public final class ContextOuterClass {
                 } else {
                     result.linkIds_ = linkIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.LinkIdList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -24785,7 +25811,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -24797,47 +25823,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.LinkIdList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.LinkId m = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry);
-                                    if (linkIdsBuilder_ == null) {
-                                        ensureLinkIdsIsMutable();
-                                        linkIds_.add(m);
-                                    } else {
-                                        linkIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.LinkIdList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -25107,17 +26103,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public LinkIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new LinkIdList(input, extensionRegistry);
             }
         };
 
@@ -25188,6 +26174,57 @@ public final class ContextOuterClass {
             return new LinkList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private LinkList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    links_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                links_.add(input.readMessage(context.ContextOuterClass.Link.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    links_ = java.util.Collections.unmodifiableList(links_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_LinkList_descriptor;
         }
@@ -25199,7 +26236,6 @@ public final class ContextOuterClass {
 
         public static final int LINKS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List links_;
 
         /**
@@ -25260,7 +26296,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < links_.size(); i++) {
                 output.writeMessage(1, links_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -25272,7 +26308,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < links_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, links_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -25288,7 +26324,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.LinkList other = (context.ContextOuterClass.LinkList) obj;
             if (!getLinksList().equals(other.getLinksList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -25304,7 +26340,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + LINKS_FIELD_NUMBER;
                 hash = (53 * hash) + getLinksList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -25398,23 +26434,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.LinkList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getLinksFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (linksBuilder_ == null) {
                     links_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    links_ = null;
                     linksBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -25440,15 +26482,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.LinkList buildPartial() {
                 context.ContextOuterClass.LinkList result = new context.ContextOuterClass.LinkList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.LinkList result) {
+                int from_bitField0_ = bitField0_;
                 if (linksBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         links_ = java.util.Collections.unmodifiableList(links_);
@@ -25458,10 +26492,38 @@ public final class ContextOuterClass {
                 } else {
                     result.links_ = linksBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.LinkList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -25501,7 +26563,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -25513,47 +26575,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.LinkList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.Link m = input.readMessage(context.ContextOuterClass.Link.parser(), extensionRegistry);
-                                    if (linksBuilder_ == null) {
-                                        ensureLinksIsMutable();
-                                        links_.add(m);
-                                    } else {
-                                        linksBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.LinkList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -25823,17 +26855,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public LinkList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new LinkList(input, extensionRegistry);
             }
         };
 
@@ -25912,6 +26934,70 @@ public final class ContextOuterClass {
             return new LinkEvent();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private LinkEvent(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Event.Builder subBuilder = null;
+                                if (event_ != null) {
+                                    subBuilder = event_.toBuilder();
+                                }
+                                event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(event_);
+                                    event_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.LinkId.Builder subBuilder = null;
+                                if (linkId_ != null) {
+                                    subBuilder = linkId_.toBuilder();
+                                }
+                                linkId_ = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(linkId_);
+                                    linkId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_LinkEvent_descriptor;
         }
@@ -25948,7 +27034,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-            return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+            return getEvent();
         }
 
         public static final int LINK_ID_FIELD_NUMBER = 2;
@@ -25978,7 +27064,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder() {
-            return linkId_ == null ? context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_;
+            return getLinkId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -26002,7 +27088,7 @@ public final class ContextOuterClass {
             if (linkId_ != null) {
                 output.writeMessage(2, getLinkId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -26017,7 +27103,7 @@ public final class ContextOuterClass {
             if (linkId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getLinkId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -26043,7 +27129,7 @@ public final class ContextOuterClass {
                 if (!getLinkId().equals(other.getLinkId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -26063,7 +27149,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + LINK_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getLinkId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -26157,24 +27243,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.LinkEvent.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                linkId_ = null;
-                if (linkIdBuilder_ != null) {
-                    linkIdBuilder_.dispose();
+                if (linkIdBuilder_ == null) {
+                    linkId_ = null;
+                } else {
+                    linkId_ = null;
                     linkIdBuilder_ = null;
                 }
                 return this;
@@ -26202,21 +27296,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.LinkEvent buildPartial() {
                 context.ContextOuterClass.LinkEvent result = new context.ContextOuterClass.LinkEvent(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (eventBuilder_ == null) {
+                    result.event_ = event_;
+                } else {
+                    result.event_ = eventBuilder_.build();
+                }
+                if (linkIdBuilder_ == null) {
+                    result.linkId_ = linkId_;
+                } else {
+                    result.linkId_ = linkIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.LinkEvent result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.event_ = eventBuilder_ == null ? event_ : eventBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.linkId_ = linkIdBuilder_ == null ? linkId_ : linkIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -26238,7 +27359,7 @@ public final class ContextOuterClass {
                 if (other.hasLinkId()) {
                     mergeLinkId(other.getLinkId());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -26250,54 +27371,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.LinkEvent parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEventFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getLinkIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.LinkEvent) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Event event_;
 
             private com.google.protobuf.SingleFieldBuilderV3 eventBuilder_;
@@ -26307,7 +27394,7 @@ public final class ContextOuterClass {
              * @return Whether the event field is set.
              */
             public boolean hasEvent() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return eventBuilder_ != null || event_ != null;
             }
 
             /**
@@ -26331,11 +27418,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     event_ = value;
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -26345,11 +27431,10 @@ public final class ContextOuterClass {
             public Builder setEvent(context.ContextOuterClass.Event.Builder builderForValue) {
                 if (eventBuilder_ == null) {
                     event_ = builderForValue.build();
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -26358,16 +27443,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEvent(context.ContextOuterClass.Event value) {
                 if (eventBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && event_ != null && event_ != context.ContextOuterClass.Event.getDefaultInstance()) {
-                        getEventBuilder().mergeFrom(value);
+                    if (event_ != null) {
+                        event_ = context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
                     } else {
                         event_ = value;
                     }
+                    onChanged();
                 } else {
                     eventBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -26375,13 +27459,13 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public Builder clearEvent() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                    onChanged();
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -26389,7 +27473,6 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public context.ContextOuterClass.Event.Builder getEventBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEventFieldBuilder().getBuilder();
             }
@@ -26425,7 +27508,7 @@ public final class ContextOuterClass {
              * @return Whether the linkId field is set.
              */
             public boolean hasLinkId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return linkIdBuilder_ != null || linkId_ != null;
             }
 
             /**
@@ -26449,11 +27532,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     linkId_ = value;
+                    onChanged();
                 } else {
                     linkIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -26463,11 +27545,10 @@ public final class ContextOuterClass {
             public Builder setLinkId(context.ContextOuterClass.LinkId.Builder builderForValue) {
                 if (linkIdBuilder_ == null) {
                     linkId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     linkIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -26476,16 +27557,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeLinkId(context.ContextOuterClass.LinkId value) {
                 if (linkIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && linkId_ != null && linkId_ != context.ContextOuterClass.LinkId.getDefaultInstance()) {
-                        getLinkIdBuilder().mergeFrom(value);
+                    if (linkId_ != null) {
+                        linkId_ = context.ContextOuterClass.LinkId.newBuilder(linkId_).mergeFrom(value).buildPartial();
                     } else {
                         linkId_ = value;
                     }
+                    onChanged();
                 } else {
                     linkIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -26493,13 +27573,13 @@ public final class ContextOuterClass {
              * .context.LinkId link_id = 2;
              */
             public Builder clearLinkId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                linkId_ = null;
-                if (linkIdBuilder_ != null) {
-                    linkIdBuilder_.dispose();
+                if (linkIdBuilder_ == null) {
+                    linkId_ = null;
+                    onChanged();
+                } else {
+                    linkId_ = null;
                     linkIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -26507,7 +27587,6 @@ public final class ContextOuterClass {
              * .context.LinkId link_id = 2;
              */
             public context.ContextOuterClass.LinkId.Builder getLinkIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getLinkIdFieldBuilder().getBuilder();
             }
@@ -26561,17 +27640,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public LinkEvent parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new LinkEvent(input, extensionRegistry);
             }
         };
 
@@ -26654,6 +27723,70 @@ public final class ContextOuterClass {
             return new ServiceId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ServiceId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ContextId.Builder subBuilder = null;
+                                if (contextId_ != null) {
+                                    subBuilder = contextId_.toBuilder();
+                                }
+                                contextId_ = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(contextId_);
+                                    contextId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (serviceUuid_ != null) {
+                                    subBuilder = serviceUuid_.toBuilder();
+                                }
+                                serviceUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(serviceUuid_);
+                                    serviceUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ServiceId_descriptor;
         }
@@ -26690,7 +27823,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() {
-            return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
+            return getContextId();
         }
 
         public static final int SERVICE_UUID_FIELD_NUMBER = 2;
@@ -26720,7 +27853,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getServiceUuidOrBuilder() {
-            return serviceUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : serviceUuid_;
+            return getServiceUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -26744,7 +27877,7 @@ public final class ContextOuterClass {
             if (serviceUuid_ != null) {
                 output.writeMessage(2, getServiceUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -26759,7 +27892,7 @@ public final class ContextOuterClass {
             if (serviceUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getServiceUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -26785,7 +27918,7 @@ public final class ContextOuterClass {
                 if (!getServiceUuid().equals(other.getServiceUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -26805,7 +27938,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SERVICE_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getServiceUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -26903,24 +28036,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ServiceId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
-                serviceUuid_ = null;
-                if (serviceUuidBuilder_ != null) {
-                    serviceUuidBuilder_.dispose();
+                if (serviceUuidBuilder_ == null) {
+                    serviceUuid_ = null;
+                } else {
+                    serviceUuid_ = null;
                     serviceUuidBuilder_ = null;
                 }
                 return this;
@@ -26948,21 +28089,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ServiceId buildPartial() {
                 context.ContextOuterClass.ServiceId result = new context.ContextOuterClass.ServiceId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (contextIdBuilder_ == null) {
+                    result.contextId_ = contextId_;
+                } else {
+                    result.contextId_ = contextIdBuilder_.build();
+                }
+                if (serviceUuidBuilder_ == null) {
+                    result.serviceUuid_ = serviceUuid_;
+                } else {
+                    result.serviceUuid_ = serviceUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ServiceId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.contextId_ = contextIdBuilder_ == null ? contextId_ : contextIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.serviceUuid_ = serviceUuidBuilder_ == null ? serviceUuid_ : serviceUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -26984,7 +28152,7 @@ public final class ContextOuterClass {
                 if (other.hasServiceUuid()) {
                     mergeServiceUuid(other.getServiceUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -26996,54 +28164,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ServiceId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getContextIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getServiceUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ServiceId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.ContextId contextId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 contextIdBuilder_;
@@ -27053,7 +28187,7 @@ public final class ContextOuterClass {
              * @return Whether the contextId field is set.
              */
             public boolean hasContextId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return contextIdBuilder_ != null || contextId_ != null;
             }
 
             /**
@@ -27077,11 +28211,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     contextId_ = value;
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -27091,11 +28224,10 @@ public final class ContextOuterClass {
             public Builder setContextId(context.ContextOuterClass.ContextId.Builder builderForValue) {
                 if (contextIdBuilder_ == null) {
                     contextId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -27104,16 +28236,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeContextId(context.ContextOuterClass.ContextId value) {
                 if (contextIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && contextId_ != null && contextId_ != context.ContextOuterClass.ContextId.getDefaultInstance()) {
-                        getContextIdBuilder().mergeFrom(value);
+                    if (contextId_ != null) {
+                        contextId_ = context.ContextOuterClass.ContextId.newBuilder(contextId_).mergeFrom(value).buildPartial();
                     } else {
                         contextId_ = value;
                     }
+                    onChanged();
                 } else {
                     contextIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -27121,13 +28252,13 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public Builder clearContextId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                    onChanged();
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -27135,7 +28266,6 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public context.ContextOuterClass.ContextId.Builder getContextIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getContextIdFieldBuilder().getBuilder();
             }
@@ -27171,7 +28301,7 @@ public final class ContextOuterClass {
              * @return Whether the serviceUuid field is set.
              */
             public boolean hasServiceUuid() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return serviceUuidBuilder_ != null || serviceUuid_ != null;
             }
 
             /**
@@ -27195,11 +28325,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     serviceUuid_ = value;
+                    onChanged();
                 } else {
                     serviceUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -27209,11 +28338,10 @@ public final class ContextOuterClass {
             public Builder setServiceUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (serviceUuidBuilder_ == null) {
                     serviceUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     serviceUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -27222,16 +28350,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeServiceUuid(context.ContextOuterClass.Uuid value) {
                 if (serviceUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && serviceUuid_ != null && serviceUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getServiceUuidBuilder().mergeFrom(value);
+                    if (serviceUuid_ != null) {
+                        serviceUuid_ = context.ContextOuterClass.Uuid.newBuilder(serviceUuid_).mergeFrom(value).buildPartial();
                     } else {
                         serviceUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     serviceUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -27239,13 +28366,13 @@ public final class ContextOuterClass {
              * .context.Uuid service_uuid = 2;
              */
             public Builder clearServiceUuid() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                serviceUuid_ = null;
-                if (serviceUuidBuilder_ != null) {
-                    serviceUuidBuilder_.dispose();
+                if (serviceUuidBuilder_ == null) {
+                    serviceUuid_ = null;
+                    onChanged();
+                } else {
+                    serviceUuid_ = null;
                     serviceUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -27253,7 +28380,6 @@ public final class ContextOuterClass {
              * .context.Uuid service_uuid = 2;
              */
             public context.ContextOuterClass.Uuid.Builder getServiceUuidBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getServiceUuidFieldBuilder().getBuilder();
             }
@@ -27307,17 +28433,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ServiceId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ServiceId(input, extensionRegistry);
             }
         };
 
@@ -27508,6 +28624,133 @@ public final class ContextOuterClass {
             return new Service();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Service(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ServiceId.Builder subBuilder = null;
+                                if (serviceId_ != null) {
+                                    subBuilder = serviceId_.toBuilder();
+                                }
+                                serviceId_ = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(serviceId_);
+                                    serviceId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 24:
+                            {
+                                int rawValue = input.readEnum();
+                                serviceType_ = rawValue;
+                                break;
+                            }
+                        case 34:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    serviceEndpointIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                serviceEndpointIds_.add(input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 42:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                                    serviceConstraints_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                serviceConstraints_.add(input.readMessage(context.ContextOuterClass.Constraint.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 50:
+                            {
+                                context.ContextOuterClass.ServiceStatus.Builder subBuilder = null;
+                                if (serviceStatus_ != null) {
+                                    subBuilder = serviceStatus_.toBuilder();
+                                }
+                                serviceStatus_ = input.readMessage(context.ContextOuterClass.ServiceStatus.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(serviceStatus_);
+                                    serviceStatus_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 58:
+                            {
+                                context.ContextOuterClass.ServiceConfig.Builder subBuilder = null;
+                                if (serviceConfig_ != null) {
+                                    subBuilder = serviceConfig_.toBuilder();
+                                }
+                                serviceConfig_ = input.readMessage(context.ContextOuterClass.ServiceConfig.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(serviceConfig_);
+                                    serviceConfig_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 66:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (timestamp_ != null) {
+                                    subBuilder = timestamp_.toBuilder();
+                                }
+                                timestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(timestamp_);
+                                    timestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    serviceEndpointIds_ = java.util.Collections.unmodifiableList(serviceEndpointIds_);
+                }
+                if (((mutable_bitField0_ & 0x00000002) != 0)) {
+                    serviceConstraints_ = java.util.Collections.unmodifiableList(serviceConstraints_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Service_descriptor;
         }
@@ -27544,13 +28787,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
-            return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+            return getServiceId();
         }
 
         public static final int NAME_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 2;
@@ -27587,7 +28829,7 @@ public final class ContextOuterClass {
 
         public static final int SERVICE_TYPE_FIELD_NUMBER = 3;
 
-        private int serviceType_ = 0;
+        private int serviceType_;
 
         /**
          * .context.ServiceTypeEnum service_type = 3;
@@ -27604,13 +28846,13 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceTypeEnum getServiceType() {
-            context.ContextOuterClass.ServiceTypeEnum result = context.ContextOuterClass.ServiceTypeEnum.forNumber(serviceType_);
+            @SuppressWarnings("deprecation")
+            context.ContextOuterClass.ServiceTypeEnum result = context.ContextOuterClass.ServiceTypeEnum.valueOf(serviceType_);
             return result == null ? context.ContextOuterClass.ServiceTypeEnum.UNRECOGNIZED : result;
         }
 
         public static final int SERVICE_ENDPOINT_IDS_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
         private java.util.List serviceEndpointIds_;
 
         /**
@@ -27655,7 +28897,6 @@ public final class ContextOuterClass {
 
         public static final int SERVICE_CONSTRAINTS_FIELD_NUMBER = 5;
 
-        @SuppressWarnings("serial")
         private java.util.List serviceConstraints_;
 
         /**
@@ -27725,7 +28966,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceStatusOrBuilder getServiceStatusOrBuilder() {
-            return serviceStatus_ == null ? context.ContextOuterClass.ServiceStatus.getDefaultInstance() : serviceStatus_;
+            return getServiceStatus();
         }
 
         public static final int SERVICE_CONFIG_FIELD_NUMBER = 7;
@@ -27755,7 +28996,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceConfigOrBuilder getServiceConfigOrBuilder() {
-            return serviceConfig_ == null ? context.ContextOuterClass.ServiceConfig.getDefaultInstance() : serviceConfig_;
+            return getServiceConfig();
         }
 
         public static final int TIMESTAMP_FIELD_NUMBER = 8;
@@ -27785,7 +29026,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-            return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+            return getTimestamp();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -27806,7 +29047,7 @@ public final class ContextOuterClass {
             if (serviceId_ != null) {
                 output.writeMessage(1, getServiceId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
             }
             if (serviceType_ != context.ContextOuterClass.ServiceTypeEnum.SERVICETYPE_UNKNOWN.getNumber()) {
@@ -27827,7 +29068,7 @@ public final class ContextOuterClass {
             if (timestamp_ != null) {
                 output.writeMessage(8, getTimestamp());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -27839,7 +29080,7 @@ public final class ContextOuterClass {
             if (serviceId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getServiceId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
             }
             if (serviceType_ != context.ContextOuterClass.ServiceTypeEnum.SERVICETYPE_UNKNOWN.getNumber()) {
@@ -27860,7 +29101,7 @@ public final class ContextOuterClass {
             if (timestamp_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(8, getTimestamp());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -27906,7 +29147,7 @@ public final class ContextOuterClass {
                 if (!getTimestamp().equals(other.getTimestamp()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -27946,7 +29187,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
                 hash = (53 * hash) + getTimestamp().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -28040,50 +29281,60 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Service.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getServiceEndpointIdsFieldBuilder();
+                    getServiceConstraintsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                serviceId_ = null;
-                if (serviceIdBuilder_ != null) {
-                    serviceIdBuilder_.dispose();
+                if (serviceIdBuilder_ == null) {
+                    serviceId_ = null;
+                } else {
+                    serviceId_ = null;
                     serviceIdBuilder_ = null;
                 }
                 name_ = "";
                 serviceType_ = 0;
                 if (serviceEndpointIdsBuilder_ == null) {
                     serviceEndpointIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    serviceEndpointIds_ = null;
                     serviceEndpointIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000008);
                 if (serviceConstraintsBuilder_ == null) {
                     serviceConstraints_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
                 } else {
-                    serviceConstraints_ = null;
                     serviceConstraintsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000010);
-                serviceStatus_ = null;
-                if (serviceStatusBuilder_ != null) {
-                    serviceStatusBuilder_.dispose();
+                if (serviceStatusBuilder_ == null) {
+                    serviceStatus_ = null;
+                } else {
+                    serviceStatus_ = null;
                     serviceStatusBuilder_ = null;
                 }
-                serviceConfig_ = null;
-                if (serviceConfigBuilder_ != null) {
-                    serviceConfigBuilder_.dispose();
+                if (serviceConfigBuilder_ == null) {
+                    serviceConfig_ = null;
+                } else {
+                    serviceConfig_ = null;
                     serviceConfigBuilder_ = null;
                 }
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
                 return this;
@@ -28111,55 +29362,79 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Service buildPartial() {
                 context.ContextOuterClass.Service result = new context.ContextOuterClass.Service(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (serviceIdBuilder_ == null) {
+                    result.serviceId_ = serviceId_;
+                } else {
+                    result.serviceId_ = serviceIdBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Service result) {
+                result.name_ = name_;
+                result.serviceType_ = serviceType_;
                 if (serviceEndpointIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         serviceEndpointIds_ = java.util.Collections.unmodifiableList(serviceEndpointIds_);
-                        bitField0_ = (bitField0_ & ~0x00000008);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.serviceEndpointIds_ = serviceEndpointIds_;
                 } else {
                     result.serviceEndpointIds_ = serviceEndpointIdsBuilder_.build();
                 }
                 if (serviceConstraintsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000010) != 0)) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
                         serviceConstraints_ = java.util.Collections.unmodifiableList(serviceConstraints_);
-                        bitField0_ = (bitField0_ & ~0x00000010);
+                        bitField0_ = (bitField0_ & ~0x00000002);
                     }
                     result.serviceConstraints_ = serviceConstraints_;
                 } else {
                     result.serviceConstraints_ = serviceConstraintsBuilder_.build();
                 }
-            }
-
-            private void buildPartial0(context.ContextOuterClass.Service result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.serviceId_ = serviceIdBuilder_ == null ? serviceId_ : serviceIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.serviceType_ = serviceType_;
-                }
-                if (((from_bitField0_ & 0x00000020) != 0)) {
-                    result.serviceStatus_ = serviceStatusBuilder_ == null ? serviceStatus_ : serviceStatusBuilder_.build();
+                if (serviceStatusBuilder_ == null) {
+                    result.serviceStatus_ = serviceStatus_;
+                } else {
+                    result.serviceStatus_ = serviceStatusBuilder_.build();
                 }
-                if (((from_bitField0_ & 0x00000040) != 0)) {
-                    result.serviceConfig_ = serviceConfigBuilder_ == null ? serviceConfig_ : serviceConfigBuilder_.build();
+                if (serviceConfigBuilder_ == null) {
+                    result.serviceConfig_ = serviceConfig_;
+                } else {
+                    result.serviceConfig_ = serviceConfigBuilder_.build();
                 }
-                if (((from_bitField0_ & 0x00000080) != 0)) {
-                    result.timestamp_ = timestampBuilder_ == null ? timestamp_ : timestampBuilder_.build();
+                if (timestampBuilder_ == null) {
+                    result.timestamp_ = timestamp_;
+                } else {
+                    result.timestamp_ = timestampBuilder_.build();
                 }
+                onBuilt();
+                return result;
+            }
+
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -28180,7 +29455,6 @@ public final class ContextOuterClass {
                 }
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (other.serviceType_ != 0) {
@@ -28190,7 +29464,7 @@ public final class ContextOuterClass {
                     if (!other.serviceEndpointIds_.isEmpty()) {
                         if (serviceEndpointIds_.isEmpty()) {
                             serviceEndpointIds_ = other.serviceEndpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureServiceEndpointIdsIsMutable();
                             serviceEndpointIds_.addAll(other.serviceEndpointIds_);
@@ -28203,7 +29477,7 @@ public final class ContextOuterClass {
                             serviceEndpointIdsBuilder_.dispose();
                             serviceEndpointIdsBuilder_ = null;
                             serviceEndpointIds_ = other.serviceEndpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             serviceEndpointIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getServiceEndpointIdsFieldBuilder() : null;
                         } else {
                             serviceEndpointIdsBuilder_.addAllMessages(other.serviceEndpointIds_);
@@ -28214,7 +29488,7 @@ public final class ContextOuterClass {
                     if (!other.serviceConstraints_.isEmpty()) {
                         if (serviceConstraints_.isEmpty()) {
                             serviceConstraints_ = other.serviceConstraints_;
-                            bitField0_ = (bitField0_ & ~0x00000010);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                         } else {
                             ensureServiceConstraintsIsMutable();
                             serviceConstraints_.addAll(other.serviceConstraints_);
@@ -28227,7 +29501,7 @@ public final class ContextOuterClass {
                             serviceConstraintsBuilder_.dispose();
                             serviceConstraintsBuilder_ = null;
                             serviceConstraints_ = other.serviceConstraints_;
-                            bitField0_ = (bitField0_ & ~0x00000010);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                             serviceConstraintsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getServiceConstraintsFieldBuilder() : null;
                         } else {
                             serviceConstraintsBuilder_.addAllMessages(other.serviceConstraints_);
@@ -28243,7 +29517,7 @@ public final class ContextOuterClass {
                 if (other.hasTimestamp()) {
                     mergeTimestamp(other.getTimestamp());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -28255,101 +29529,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Service parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getServiceIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 24:
-                                {
-                                    serviceType_ = input.readEnum();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 34:
-                                {
-                                    context.ContextOuterClass.EndPointId m = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-                                    if (serviceEndpointIdsBuilder_ == null) {
-                                        ensureServiceEndpointIdsIsMutable();
-                                        serviceEndpointIds_.add(m);
-                                    } else {
-                                        serviceEndpointIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    context.ContextOuterClass.Constraint m = input.readMessage(context.ContextOuterClass.Constraint.parser(), extensionRegistry);
-                                    if (serviceConstraintsBuilder_ == null) {
-                                        ensureServiceConstraintsIsMutable();
-                                        serviceConstraints_.add(m);
-                                    } else {
-                                        serviceConstraintsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 42
-                            case 50:
-                                {
-                                    input.readMessage(getServiceStatusFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000020;
-                                    break;
-                                }
-                            // case 50
-                            case 58:
-                                {
-                                    input.readMessage(getServiceConfigFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000040;
-                                    break;
-                                }
-                            // case 58
-                            case 66:
-                                {
-                                    input.readMessage(getTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000080;
-                                    break;
-                                }
-                            // case 66
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Service) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -28364,7 +29554,7 @@ public final class ContextOuterClass {
              * @return Whether the serviceId field is set.
              */
             public boolean hasServiceId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return serviceIdBuilder_ != null || serviceId_ != null;
             }
 
             /**
@@ -28388,11 +29578,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     serviceId_ = value;
+                    onChanged();
                 } else {
                     serviceIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -28402,11 +29591,10 @@ public final class ContextOuterClass {
             public Builder setServiceId(context.ContextOuterClass.ServiceId.Builder builderForValue) {
                 if (serviceIdBuilder_ == null) {
                     serviceId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     serviceIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -28415,16 +29603,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) {
                 if (serviceIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && serviceId_ != null && serviceId_ != context.ContextOuterClass.ServiceId.getDefaultInstance()) {
-                        getServiceIdBuilder().mergeFrom(value);
+                    if (serviceId_ != null) {
+                        serviceId_ = context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial();
                     } else {
                         serviceId_ = value;
                     }
+                    onChanged();
                 } else {
                     serviceIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -28432,13 +29619,13 @@ public final class ContextOuterClass {
              * .context.ServiceId service_id = 1;
              */
             public Builder clearServiceId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                serviceId_ = null;
-                if (serviceIdBuilder_ != null) {
-                    serviceIdBuilder_.dispose();
+                if (serviceIdBuilder_ == null) {
+                    serviceId_ = null;
+                    onChanged();
+                } else {
+                    serviceId_ = null;
                     serviceIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -28446,7 +29633,6 @@ public final class ContextOuterClass {
              * .context.ServiceId service_id = 1;
              */
             public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getServiceIdFieldBuilder().getBuilder();
             }
@@ -28516,7 +29702,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -28527,7 +29712,6 @@ public final class ContextOuterClass {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -28543,7 +29727,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -28566,7 +29749,6 @@ public final class ContextOuterClass {
              */
             public Builder setServiceTypeValue(int value) {
                 serviceType_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -28577,7 +29759,8 @@ public final class ContextOuterClass {
              */
             @java.lang.Override
             public context.ContextOuterClass.ServiceTypeEnum getServiceType() {
-                context.ContextOuterClass.ServiceTypeEnum result = context.ContextOuterClass.ServiceTypeEnum.forNumber(serviceType_);
+                @SuppressWarnings("deprecation")
+                context.ContextOuterClass.ServiceTypeEnum result = context.ContextOuterClass.ServiceTypeEnum.valueOf(serviceType_);
                 return result == null ? context.ContextOuterClass.ServiceTypeEnum.UNRECOGNIZED : result;
             }
 
@@ -28590,7 +29773,6 @@ public final class ContextOuterClass {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000004;
                 serviceType_ = value.getNumber();
                 onChanged();
                 return this;
@@ -28601,7 +29783,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearServiceType() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 serviceType_ = 0;
                 onChanged();
                 return this;
@@ -28610,9 +29791,9 @@ public final class ContextOuterClass {
             private java.util.List serviceEndpointIds_ = java.util.Collections.emptyList();
 
             private void ensureServiceEndpointIdsIsMutable() {
-                if (!((bitField0_ & 0x00000008) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     serviceEndpointIds_ = new java.util.ArrayList(serviceEndpointIds_);
-                    bitField0_ |= 0x00000008;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -28764,7 +29945,7 @@ public final class ContextOuterClass {
             public Builder clearServiceEndpointIds() {
                 if (serviceEndpointIdsBuilder_ == null) {
                     serviceEndpointIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000008);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     serviceEndpointIdsBuilder_.clear();
@@ -28838,7 +30019,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getServiceEndpointIdsFieldBuilder() {
                 if (serviceEndpointIdsBuilder_ == null) {
-                    serviceEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(serviceEndpointIds_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean());
+                    serviceEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(serviceEndpointIds_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     serviceEndpointIds_ = null;
                 }
                 return serviceEndpointIdsBuilder_;
@@ -28847,9 +30028,9 @@ public final class ContextOuterClass {
             private java.util.List serviceConstraints_ = java.util.Collections.emptyList();
 
             private void ensureServiceConstraintsIsMutable() {
-                if (!((bitField0_ & 0x00000010) != 0)) {
+                if (!((bitField0_ & 0x00000002) != 0)) {
                     serviceConstraints_ = new java.util.ArrayList(serviceConstraints_);
-                    bitField0_ |= 0x00000010;
+                    bitField0_ |= 0x00000002;
                 }
             }
 
@@ -29001,7 +30182,7 @@ public final class ContextOuterClass {
             public Builder clearServiceConstraints() {
                 if (serviceConstraintsBuilder_ == null) {
                     serviceConstraints_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000010);
+                    bitField0_ = (bitField0_ & ~0x00000002);
                     onChanged();
                 } else {
                     serviceConstraintsBuilder_.clear();
@@ -29075,7 +30256,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getServiceConstraintsFieldBuilder() {
                 if (serviceConstraintsBuilder_ == null) {
-                    serviceConstraintsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(serviceConstraints_, ((bitField0_ & 0x00000010) != 0), getParentForChildren(), isClean());
+                    serviceConstraintsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(serviceConstraints_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
                     serviceConstraints_ = null;
                 }
                 return serviceConstraintsBuilder_;
@@ -29090,7 +30271,7 @@ public final class ContextOuterClass {
              * @return Whether the serviceStatus field is set.
              */
             public boolean hasServiceStatus() {
-                return ((bitField0_ & 0x00000020) != 0);
+                return serviceStatusBuilder_ != null || serviceStatus_ != null;
             }
 
             /**
@@ -29114,11 +30295,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     serviceStatus_ = value;
+                    onChanged();
                 } else {
                     serviceStatusBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -29128,11 +30308,10 @@ public final class ContextOuterClass {
             public Builder setServiceStatus(context.ContextOuterClass.ServiceStatus.Builder builderForValue) {
                 if (serviceStatusBuilder_ == null) {
                     serviceStatus_ = builderForValue.build();
+                    onChanged();
                 } else {
                     serviceStatusBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -29141,16 +30320,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeServiceStatus(context.ContextOuterClass.ServiceStatus value) {
                 if (serviceStatusBuilder_ == null) {
-                    if (((bitField0_ & 0x00000020) != 0) && serviceStatus_ != null && serviceStatus_ != context.ContextOuterClass.ServiceStatus.getDefaultInstance()) {
-                        getServiceStatusBuilder().mergeFrom(value);
+                    if (serviceStatus_ != null) {
+                        serviceStatus_ = context.ContextOuterClass.ServiceStatus.newBuilder(serviceStatus_).mergeFrom(value).buildPartial();
                     } else {
                         serviceStatus_ = value;
                     }
+                    onChanged();
                 } else {
                     serviceStatusBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -29158,13 +30336,13 @@ public final class ContextOuterClass {
              * .context.ServiceStatus service_status = 6;
              */
             public Builder clearServiceStatus() {
-                bitField0_ = (bitField0_ & ~0x00000020);
-                serviceStatus_ = null;
-                if (serviceStatusBuilder_ != null) {
-                    serviceStatusBuilder_.dispose();
+                if (serviceStatusBuilder_ == null) {
+                    serviceStatus_ = null;
+                    onChanged();
+                } else {
+                    serviceStatus_ = null;
                     serviceStatusBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -29172,7 +30350,6 @@ public final class ContextOuterClass {
              * .context.ServiceStatus service_status = 6;
              */
             public context.ContextOuterClass.ServiceStatus.Builder getServiceStatusBuilder() {
-                bitField0_ |= 0x00000020;
                 onChanged();
                 return getServiceStatusFieldBuilder().getBuilder();
             }
@@ -29208,7 +30385,7 @@ public final class ContextOuterClass {
              * @return Whether the serviceConfig field is set.
              */
             public boolean hasServiceConfig() {
-                return ((bitField0_ & 0x00000040) != 0);
+                return serviceConfigBuilder_ != null || serviceConfig_ != null;
             }
 
             /**
@@ -29232,11 +30409,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     serviceConfig_ = value;
+                    onChanged();
                 } else {
                     serviceConfigBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000040;
-                onChanged();
                 return this;
             }
 
@@ -29246,11 +30422,10 @@ public final class ContextOuterClass {
             public Builder setServiceConfig(context.ContextOuterClass.ServiceConfig.Builder builderForValue) {
                 if (serviceConfigBuilder_ == null) {
                     serviceConfig_ = builderForValue.build();
+                    onChanged();
                 } else {
                     serviceConfigBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000040;
-                onChanged();
                 return this;
             }
 
@@ -29259,16 +30434,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeServiceConfig(context.ContextOuterClass.ServiceConfig value) {
                 if (serviceConfigBuilder_ == null) {
-                    if (((bitField0_ & 0x00000040) != 0) && serviceConfig_ != null && serviceConfig_ != context.ContextOuterClass.ServiceConfig.getDefaultInstance()) {
-                        getServiceConfigBuilder().mergeFrom(value);
+                    if (serviceConfig_ != null) {
+                        serviceConfig_ = context.ContextOuterClass.ServiceConfig.newBuilder(serviceConfig_).mergeFrom(value).buildPartial();
                     } else {
                         serviceConfig_ = value;
                     }
+                    onChanged();
                 } else {
                     serviceConfigBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000040;
-                onChanged();
                 return this;
             }
 
@@ -29276,13 +30450,13 @@ public final class ContextOuterClass {
              * .context.ServiceConfig service_config = 7;
              */
             public Builder clearServiceConfig() {
-                bitField0_ = (bitField0_ & ~0x00000040);
-                serviceConfig_ = null;
-                if (serviceConfigBuilder_ != null) {
-                    serviceConfigBuilder_.dispose();
+                if (serviceConfigBuilder_ == null) {
+                    serviceConfig_ = null;
+                    onChanged();
+                } else {
+                    serviceConfig_ = null;
                     serviceConfigBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -29290,7 +30464,6 @@ public final class ContextOuterClass {
              * .context.ServiceConfig service_config = 7;
              */
             public context.ContextOuterClass.ServiceConfig.Builder getServiceConfigBuilder() {
-                bitField0_ |= 0x00000040;
                 onChanged();
                 return getServiceConfigFieldBuilder().getBuilder();
             }
@@ -29326,7 +30499,7 @@ public final class ContextOuterClass {
              * @return Whether the timestamp field is set.
              */
             public boolean hasTimestamp() {
-                return ((bitField0_ & 0x00000080) != 0);
+                return timestampBuilder_ != null || timestamp_ != null;
             }
 
             /**
@@ -29350,11 +30523,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     timestamp_ = value;
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000080;
-                onChanged();
                 return this;
             }
 
@@ -29364,11 +30536,10 @@ public final class ContextOuterClass {
             public Builder setTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (timestampBuilder_ == null) {
                     timestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000080;
-                onChanged();
                 return this;
             }
 
@@ -29377,16 +30548,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (timestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000080) != 0) && timestamp_ != null && timestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getTimestampBuilder().mergeFrom(value);
+                    if (timestamp_ != null) {
+                        timestamp_ = context.ContextOuterClass.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial();
                     } else {
                         timestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     timestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000080;
-                onChanged();
                 return this;
             }
 
@@ -29394,13 +30564,13 @@ public final class ContextOuterClass {
              * .context.Timestamp timestamp = 8;
              */
             public Builder clearTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000080);
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                    onChanged();
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -29408,7 +30578,6 @@ public final class ContextOuterClass {
              * .context.Timestamp timestamp = 8;
              */
             public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
-                bitField0_ |= 0x00000080;
                 onChanged();
                 return getTimestampFieldBuilder().getBuilder();
             }
@@ -29462,17 +30631,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Service parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Service(input, extensionRegistry);
             }
         };
 
@@ -29530,6 +30689,50 @@ public final class ContextOuterClass {
             return new ServiceStatus();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ServiceStatus(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                int rawValue = input.readEnum();
+                                serviceStatus_ = rawValue;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ServiceStatus_descriptor;
         }
@@ -29541,7 +30744,7 @@ public final class ContextOuterClass {
 
         public static final int SERVICE_STATUS_FIELD_NUMBER = 1;
 
-        private int serviceStatus_ = 0;
+        private int serviceStatus_;
 
         /**
          * .context.ServiceStatusEnum service_status = 1;
@@ -29558,7 +30761,8 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceStatusEnum getServiceStatus() {
-            context.ContextOuterClass.ServiceStatusEnum result = context.ContextOuterClass.ServiceStatusEnum.forNumber(serviceStatus_);
+            @SuppressWarnings("deprecation")
+            context.ContextOuterClass.ServiceStatusEnum result = context.ContextOuterClass.ServiceStatusEnum.valueOf(serviceStatus_);
             return result == null ? context.ContextOuterClass.ServiceStatusEnum.UNRECOGNIZED : result;
         }
 
@@ -29580,7 +30784,7 @@ public final class ContextOuterClass {
             if (serviceStatus_ != context.ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_UNDEFINED.getNumber()) {
                 output.writeEnum(1, serviceStatus_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -29592,7 +30796,7 @@ public final class ContextOuterClass {
             if (serviceStatus_ != context.ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_UNDEFINED.getNumber()) {
                 size += com.google.protobuf.CodedOutputStream.computeEnumSize(1, serviceStatus_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -29608,7 +30812,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.ServiceStatus other = (context.ContextOuterClass.ServiceStatus) obj;
             if (serviceStatus_ != other.serviceStatus_)
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -29622,7 +30826,7 @@ public final class ContextOuterClass {
             hash = (19 * hash) + getDescriptor().hashCode();
             hash = (37 * hash) + SERVICE_STATUS_FIELD_NUMBER;
             hash = (53 * hash) + serviceStatus_;
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -29716,16 +30920,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ServiceStatus.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 serviceStatus_ = 0;
                 return this;
             }
@@ -29752,18 +30962,39 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ServiceStatus buildPartial() {
                 context.ContextOuterClass.ServiceStatus result = new context.ContextOuterClass.ServiceStatus(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.serviceStatus_ = serviceStatus_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ServiceStatus result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.serviceStatus_ = serviceStatus_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -29782,7 +31013,7 @@ public final class ContextOuterClass {
                 if (other.serviceStatus_ != 0) {
                     setServiceStatusValue(other.getServiceStatusValue());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -29794,47 +31025,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ServiceStatus parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    serviceStatus_ = input.readEnum();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ServiceStatus) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private int serviceStatus_ = 0;
 
             /**
@@ -29853,7 +31057,6 @@ public final class ContextOuterClass {
              */
             public Builder setServiceStatusValue(int value) {
                 serviceStatus_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -29864,7 +31067,8 @@ public final class ContextOuterClass {
              */
             @java.lang.Override
             public context.ContextOuterClass.ServiceStatusEnum getServiceStatus() {
-                context.ContextOuterClass.ServiceStatusEnum result = context.ContextOuterClass.ServiceStatusEnum.forNumber(serviceStatus_);
+                @SuppressWarnings("deprecation")
+                context.ContextOuterClass.ServiceStatusEnum result = context.ContextOuterClass.ServiceStatusEnum.valueOf(serviceStatus_);
                 return result == null ? context.ContextOuterClass.ServiceStatusEnum.UNRECOGNIZED : result;
             }
 
@@ -29877,7 +31081,6 @@ public final class ContextOuterClass {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000001;
                 serviceStatus_ = value.getNumber();
                 onChanged();
                 return this;
@@ -29888,7 +31091,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearServiceStatus() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 serviceStatus_ = 0;
                 onChanged();
                 return this;
@@ -29921,17 +31123,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ServiceStatus parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ServiceStatus(input, extensionRegistry);
             }
         };
 
@@ -30002,6 +31194,57 @@ public final class ContextOuterClass {
             return new ServiceConfig();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ServiceConfig(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    configRules_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                configRules_.add(input.readMessage(context.ContextOuterClass.ConfigRule.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    configRules_ = java.util.Collections.unmodifiableList(configRules_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ServiceConfig_descriptor;
         }
@@ -30013,7 +31256,6 @@ public final class ContextOuterClass {
 
         public static final int CONFIG_RULES_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List configRules_;
 
         /**
@@ -30074,7 +31316,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < configRules_.size(); i++) {
                 output.writeMessage(1, configRules_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -30086,7 +31328,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < configRules_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, configRules_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -30102,7 +31344,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.ServiceConfig other = (context.ContextOuterClass.ServiceConfig) obj;
             if (!getConfigRulesList().equals(other.getConfigRulesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -30118,7 +31360,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONFIG_RULES_FIELD_NUMBER;
                 hash = (53 * hash) + getConfigRulesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -30212,23 +31454,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ServiceConfig.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getConfigRulesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (configRulesBuilder_ == null) {
                     configRules_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    configRules_ = null;
                     configRulesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -30254,15 +31502,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ServiceConfig buildPartial() {
                 context.ContextOuterClass.ServiceConfig result = new context.ContextOuterClass.ServiceConfig(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.ServiceConfig result) {
+                int from_bitField0_ = bitField0_;
                 if (configRulesBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         configRules_ = java.util.Collections.unmodifiableList(configRules_);
@@ -30272,10 +31512,38 @@ public final class ContextOuterClass {
                 } else {
                     result.configRules_ = configRulesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ServiceConfig result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -30315,7 +31583,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -30327,47 +31595,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ServiceConfig parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.ConfigRule m = input.readMessage(context.ContextOuterClass.ConfigRule.parser(), extensionRegistry);
-                                    if (configRulesBuilder_ == null) {
-                                        ensureConfigRulesIsMutable();
-                                        configRules_.add(m);
-                                    } else {
-                                        configRulesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ServiceConfig) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -30637,17 +31875,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ServiceConfig parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ServiceConfig(input, extensionRegistry);
             }
         };
 
@@ -30718,6 +31946,57 @@ public final class ContextOuterClass {
             return new ServiceIdList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ServiceIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    serviceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                serviceIds_.add(input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    serviceIds_ = java.util.Collections.unmodifiableList(serviceIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ServiceIdList_descriptor;
         }
@@ -30729,7 +32008,6 @@ public final class ContextOuterClass {
 
         public static final int SERVICE_IDS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List serviceIds_;
 
         /**
@@ -30790,7 +32068,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < serviceIds_.size(); i++) {
                 output.writeMessage(1, serviceIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -30802,7 +32080,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < serviceIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, serviceIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -30818,7 +32096,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.ServiceIdList other = (context.ContextOuterClass.ServiceIdList) obj;
             if (!getServiceIdsList().equals(other.getServiceIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -30834,7 +32112,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SERVICE_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getServiceIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -30928,23 +32206,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ServiceIdList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getServiceIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (serviceIdsBuilder_ == null) {
                     serviceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    serviceIds_ = null;
                     serviceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -30970,15 +32254,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ServiceIdList buildPartial() {
                 context.ContextOuterClass.ServiceIdList result = new context.ContextOuterClass.ServiceIdList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.ServiceIdList result) {
+                int from_bitField0_ = bitField0_;
                 if (serviceIdsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         serviceIds_ = java.util.Collections.unmodifiableList(serviceIds_);
@@ -30988,10 +32264,38 @@ public final class ContextOuterClass {
                 } else {
                     result.serviceIds_ = serviceIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ServiceIdList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -31031,7 +32335,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -31043,47 +32347,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ServiceIdList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.ServiceId m = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
-                                    if (serviceIdsBuilder_ == null) {
-                                        ensureServiceIdsIsMutable();
-                                        serviceIds_.add(m);
-                                    } else {
-                                        serviceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ServiceIdList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -31353,17 +32627,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ServiceIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ServiceIdList(input, extensionRegistry);
             }
         };
 
@@ -31434,6 +32698,57 @@ public final class ContextOuterClass {
             return new ServiceList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ServiceList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    services_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                services_.add(input.readMessage(context.ContextOuterClass.Service.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    services_ = java.util.Collections.unmodifiableList(services_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ServiceList_descriptor;
         }
@@ -31445,7 +32760,6 @@ public final class ContextOuterClass {
 
         public static final int SERVICES_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List services_;
 
         /**
@@ -31506,7 +32820,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < services_.size(); i++) {
                 output.writeMessage(1, services_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -31518,7 +32832,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < services_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, services_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -31534,7 +32848,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.ServiceList other = (context.ContextOuterClass.ServiceList) obj;
             if (!getServicesList().equals(other.getServicesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -31550,7 +32864,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SERVICES_FIELD_NUMBER;
                 hash = (53 * hash) + getServicesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -31644,23 +32958,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ServiceList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getServicesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (servicesBuilder_ == null) {
                     services_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    services_ = null;
                     servicesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -31686,15 +33006,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ServiceList buildPartial() {
                 context.ContextOuterClass.ServiceList result = new context.ContextOuterClass.ServiceList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.ServiceList result) {
+                int from_bitField0_ = bitField0_;
                 if (servicesBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         services_ = java.util.Collections.unmodifiableList(services_);
@@ -31704,10 +33016,38 @@ public final class ContextOuterClass {
                 } else {
                     result.services_ = servicesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ServiceList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -31747,7 +33087,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -31759,47 +33099,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ServiceList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.Service m = input.readMessage(context.ContextOuterClass.Service.parser(), extensionRegistry);
-                                    if (servicesBuilder_ == null) {
-                                        ensureServicesIsMutable();
-                                        services_.add(m);
-                                    } else {
-                                        servicesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ServiceList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -32069,17 +33379,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ServiceList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ServiceList(input, extensionRegistry);
             }
         };
 
@@ -32159,6 +33459,72 @@ public final class ContextOuterClass {
             return new ServiceFilter();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ServiceFilter(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ServiceIdList.Builder subBuilder = null;
+                                if (serviceIds_ != null) {
+                                    subBuilder = serviceIds_.toBuilder();
+                                }
+                                serviceIds_ = input.readMessage(context.ContextOuterClass.ServiceIdList.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(serviceIds_);
+                                    serviceIds_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 16:
+                            {
+                                includeEndpointIds_ = input.readBool();
+                                break;
+                            }
+                        case 24:
+                            {
+                                includeConstraints_ = input.readBool();
+                                break;
+                            }
+                        case 32:
+                            {
+                                includeConfigRules_ = input.readBool();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ServiceFilter_descriptor;
         }
@@ -32195,12 +33561,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceIdListOrBuilder getServiceIdsOrBuilder() {
-            return serviceIds_ == null ? context.ContextOuterClass.ServiceIdList.getDefaultInstance() : serviceIds_;
+            return getServiceIds();
         }
 
         public static final int INCLUDE_ENDPOINT_IDS_FIELD_NUMBER = 2;
 
-        private boolean includeEndpointIds_ = false;
+        private boolean includeEndpointIds_;
 
         /**
          * bool include_endpoint_ids = 2;
@@ -32213,7 +33579,7 @@ public final class ContextOuterClass {
 
         public static final int INCLUDE_CONSTRAINTS_FIELD_NUMBER = 3;
 
-        private boolean includeConstraints_ = false;
+        private boolean includeConstraints_;
 
         /**
          * bool include_constraints = 3;
@@ -32226,7 +33592,7 @@ public final class ContextOuterClass {
 
         public static final int INCLUDE_CONFIG_RULES_FIELD_NUMBER = 4;
 
-        private boolean includeConfigRules_ = false;
+        private boolean includeConfigRules_;
 
         /**
          * bool include_config_rules = 4;
@@ -32264,7 +33630,7 @@ public final class ContextOuterClass {
             if (includeConfigRules_ != false) {
                 output.writeBool(4, includeConfigRules_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -32285,7 +33651,7 @@ public final class ContextOuterClass {
             if (includeConfigRules_ != false) {
                 size += com.google.protobuf.CodedOutputStream.computeBoolSize(4, includeConfigRules_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -32311,7 +33677,7 @@ public final class ContextOuterClass {
                 return false;
             if (getIncludeConfigRules() != other.getIncludeConfigRules())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -32333,7 +33699,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeConstraints());
             hash = (37 * hash) + INCLUDE_CONFIG_RULES_FIELD_NUMBER;
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeConfigRules());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -32427,19 +33793,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ServiceFilter.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                serviceIds_ = null;
-                if (serviceIdsBuilder_ != null) {
-                    serviceIdsBuilder_.dispose();
+                if (serviceIdsBuilder_ == null) {
+                    serviceIds_ = null;
+                } else {
+                    serviceIds_ = null;
                     serviceIdsBuilder_ = null;
                 }
                 includeEndpointIds_ = false;
@@ -32470,27 +33843,46 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ServiceFilter buildPartial() {
                 context.ContextOuterClass.ServiceFilter result = new context.ContextOuterClass.ServiceFilter(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (serviceIdsBuilder_ == null) {
+                    result.serviceIds_ = serviceIds_;
+                } else {
+                    result.serviceIds_ = serviceIdsBuilder_.build();
                 }
+                result.includeEndpointIds_ = includeEndpointIds_;
+                result.includeConstraints_ = includeConstraints_;
+                result.includeConfigRules_ = includeConfigRules_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ServiceFilter result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.serviceIds_ = serviceIdsBuilder_ == null ? serviceIds_ : serviceIdsBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.includeEndpointIds_ = includeEndpointIds_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.includeConstraints_ = includeConstraints_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.includeConfigRules_ = includeConfigRules_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -32518,7 +33910,7 @@ public final class ContextOuterClass {
                 if (other.getIncludeConfigRules() != false) {
                     setIncludeConfigRules(other.getIncludeConfigRules());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -32530,68 +33922,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ServiceFilter parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getServiceIdsFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 16:
-                                {
-                                    includeEndpointIds_ = input.readBool();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            case 24:
-                                {
-                                    includeConstraints_ = input.readBool();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 32:
-                                {
-                                    includeConfigRules_ = input.readBool();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 32
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ServiceFilter) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.ServiceIdList serviceIds_;
 
             private com.google.protobuf.SingleFieldBuilderV3 serviceIdsBuilder_;
@@ -32601,7 +33945,7 @@ public final class ContextOuterClass {
              * @return Whether the serviceIds field is set.
              */
             public boolean hasServiceIds() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return serviceIdsBuilder_ != null || serviceIds_ != null;
             }
 
             /**
@@ -32625,11 +33969,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     serviceIds_ = value;
+                    onChanged();
                 } else {
                     serviceIdsBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -32639,11 +33982,10 @@ public final class ContextOuterClass {
             public Builder setServiceIds(context.ContextOuterClass.ServiceIdList.Builder builderForValue) {
                 if (serviceIdsBuilder_ == null) {
                     serviceIds_ = builderForValue.build();
+                    onChanged();
                 } else {
                     serviceIdsBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -32652,16 +33994,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeServiceIds(context.ContextOuterClass.ServiceIdList value) {
                 if (serviceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && serviceIds_ != null && serviceIds_ != context.ContextOuterClass.ServiceIdList.getDefaultInstance()) {
-                        getServiceIdsBuilder().mergeFrom(value);
+                    if (serviceIds_ != null) {
+                        serviceIds_ = context.ContextOuterClass.ServiceIdList.newBuilder(serviceIds_).mergeFrom(value).buildPartial();
                     } else {
                         serviceIds_ = value;
                     }
+                    onChanged();
                 } else {
                     serviceIdsBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -32669,13 +34010,13 @@ public final class ContextOuterClass {
              * .context.ServiceIdList service_ids = 1;
              */
             public Builder clearServiceIds() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                serviceIds_ = null;
-                if (serviceIdsBuilder_ != null) {
-                    serviceIdsBuilder_.dispose();
+                if (serviceIdsBuilder_ == null) {
+                    serviceIds_ = null;
+                    onChanged();
+                } else {
+                    serviceIds_ = null;
                     serviceIdsBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -32683,7 +34024,6 @@ public final class ContextOuterClass {
              * .context.ServiceIdList service_ids = 1;
              */
             public context.ContextOuterClass.ServiceIdList.Builder getServiceIdsBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getServiceIdsFieldBuilder().getBuilder();
             }
@@ -32728,7 +34068,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeEndpointIds(boolean value) {
                 includeEndpointIds_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -32738,7 +34077,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeEndpointIds() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 includeEndpointIds_ = false;
                 onChanged();
                 return this;
@@ -32762,7 +34100,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeConstraints(boolean value) {
                 includeConstraints_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -32772,7 +34109,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeConstraints() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 includeConstraints_ = false;
                 onChanged();
                 return this;
@@ -32796,7 +34132,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeConfigRules(boolean value) {
                 includeConfigRules_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -32806,7 +34141,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeConfigRules() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 includeConfigRules_ = false;
                 onChanged();
                 return this;
@@ -32839,17 +34173,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ServiceFilter parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ServiceFilter(input, extensionRegistry);
             }
         };
 
@@ -32928,6 +34252,70 @@ public final class ContextOuterClass {
             return new ServiceEvent();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ServiceEvent(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Event.Builder subBuilder = null;
+                                if (event_ != null) {
+                                    subBuilder = event_.toBuilder();
+                                }
+                                event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(event_);
+                                    event_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.ServiceId.Builder subBuilder = null;
+                                if (serviceId_ != null) {
+                                    subBuilder = serviceId_.toBuilder();
+                                }
+                                serviceId_ = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(serviceId_);
+                                    serviceId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ServiceEvent_descriptor;
         }
@@ -32964,7 +34352,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-            return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+            return getEvent();
         }
 
         public static final int SERVICE_ID_FIELD_NUMBER = 2;
@@ -32994,7 +34382,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
-            return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+            return getServiceId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -33018,7 +34406,7 @@ public final class ContextOuterClass {
             if (serviceId_ != null) {
                 output.writeMessage(2, getServiceId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -33033,7 +34421,7 @@ public final class ContextOuterClass {
             if (serviceId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getServiceId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -33059,7 +34447,7 @@ public final class ContextOuterClass {
                 if (!getServiceId().equals(other.getServiceId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -33079,7 +34467,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SERVICE_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getServiceId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -33173,24 +34561,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ServiceEvent.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                serviceId_ = null;
-                if (serviceIdBuilder_ != null) {
-                    serviceIdBuilder_.dispose();
+                if (serviceIdBuilder_ == null) {
+                    serviceId_ = null;
+                } else {
+                    serviceId_ = null;
                     serviceIdBuilder_ = null;
                 }
                 return this;
@@ -33218,21 +34614,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ServiceEvent buildPartial() {
                 context.ContextOuterClass.ServiceEvent result = new context.ContextOuterClass.ServiceEvent(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (eventBuilder_ == null) {
+                    result.event_ = event_;
+                } else {
+                    result.event_ = eventBuilder_.build();
+                }
+                if (serviceIdBuilder_ == null) {
+                    result.serviceId_ = serviceId_;
+                } else {
+                    result.serviceId_ = serviceIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ServiceEvent result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.event_ = eventBuilder_ == null ? event_ : eventBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.serviceId_ = serviceIdBuilder_ == null ? serviceId_ : serviceIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -33254,7 +34677,7 @@ public final class ContextOuterClass {
                 if (other.hasServiceId()) {
                     mergeServiceId(other.getServiceId());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -33266,54 +34689,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ServiceEvent parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEventFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getServiceIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ServiceEvent) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Event event_;
 
             private com.google.protobuf.SingleFieldBuilderV3 eventBuilder_;
@@ -33323,7 +34712,7 @@ public final class ContextOuterClass {
              * @return Whether the event field is set.
              */
             public boolean hasEvent() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return eventBuilder_ != null || event_ != null;
             }
 
             /**
@@ -33347,11 +34736,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     event_ = value;
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -33361,11 +34749,10 @@ public final class ContextOuterClass {
             public Builder setEvent(context.ContextOuterClass.Event.Builder builderForValue) {
                 if (eventBuilder_ == null) {
                     event_ = builderForValue.build();
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -33374,16 +34761,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEvent(context.ContextOuterClass.Event value) {
                 if (eventBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && event_ != null && event_ != context.ContextOuterClass.Event.getDefaultInstance()) {
-                        getEventBuilder().mergeFrom(value);
+                    if (event_ != null) {
+                        event_ = context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
                     } else {
                         event_ = value;
                     }
+                    onChanged();
                 } else {
                     eventBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -33391,13 +34777,13 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public Builder clearEvent() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                    onChanged();
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -33405,7 +34791,6 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public context.ContextOuterClass.Event.Builder getEventBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEventFieldBuilder().getBuilder();
             }
@@ -33441,7 +34826,7 @@ public final class ContextOuterClass {
              * @return Whether the serviceId field is set.
              */
             public boolean hasServiceId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return serviceIdBuilder_ != null || serviceId_ != null;
             }
 
             /**
@@ -33465,11 +34850,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     serviceId_ = value;
+                    onChanged();
                 } else {
                     serviceIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -33479,11 +34863,10 @@ public final class ContextOuterClass {
             public Builder setServiceId(context.ContextOuterClass.ServiceId.Builder builderForValue) {
                 if (serviceIdBuilder_ == null) {
                     serviceId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     serviceIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -33492,16 +34875,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) {
                 if (serviceIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && serviceId_ != null && serviceId_ != context.ContextOuterClass.ServiceId.getDefaultInstance()) {
-                        getServiceIdBuilder().mergeFrom(value);
+                    if (serviceId_ != null) {
+                        serviceId_ = context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial();
                     } else {
                         serviceId_ = value;
                     }
+                    onChanged();
                 } else {
                     serviceIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -33509,13 +34891,13 @@ public final class ContextOuterClass {
              * .context.ServiceId service_id = 2;
              */
             public Builder clearServiceId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                serviceId_ = null;
-                if (serviceIdBuilder_ != null) {
-                    serviceIdBuilder_.dispose();
+                if (serviceIdBuilder_ == null) {
+                    serviceId_ = null;
+                    onChanged();
+                } else {
+                    serviceId_ = null;
                     serviceIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -33523,7 +34905,6 @@ public final class ContextOuterClass {
              * .context.ServiceId service_id = 2;
              */
             public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getServiceIdFieldBuilder().getBuilder();
             }
@@ -33577,17 +34958,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ServiceEvent parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ServiceEvent(input, extensionRegistry);
             }
         };
 
@@ -33670,6 +35041,70 @@ public final class ContextOuterClass {
             return new SliceId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SliceId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ContextId.Builder subBuilder = null;
+                                if (contextId_ != null) {
+                                    subBuilder = contextId_.toBuilder();
+                                }
+                                contextId_ = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(contextId_);
+                                    contextId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (sliceUuid_ != null) {
+                                    subBuilder = sliceUuid_.toBuilder();
+                                }
+                                sliceUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(sliceUuid_);
+                                    sliceUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_SliceId_descriptor;
         }
@@ -33706,7 +35141,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() {
-            return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
+            return getContextId();
         }
 
         public static final int SLICE_UUID_FIELD_NUMBER = 2;
@@ -33736,7 +35171,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getSliceUuidOrBuilder() {
-            return sliceUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : sliceUuid_;
+            return getSliceUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -33760,7 +35195,7 @@ public final class ContextOuterClass {
             if (sliceUuid_ != null) {
                 output.writeMessage(2, getSliceUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -33775,7 +35210,7 @@ public final class ContextOuterClass {
             if (sliceUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getSliceUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -33801,7 +35236,7 @@ public final class ContextOuterClass {
                 if (!getSliceUuid().equals(other.getSliceUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -33821,7 +35256,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SLICE_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getSliceUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -33919,24 +35354,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.SliceId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
-                sliceUuid_ = null;
-                if (sliceUuidBuilder_ != null) {
-                    sliceUuidBuilder_.dispose();
+                if (sliceUuidBuilder_ == null) {
+                    sliceUuid_ = null;
+                } else {
+                    sliceUuid_ = null;
                     sliceUuidBuilder_ = null;
                 }
                 return this;
@@ -33964,21 +35407,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.SliceId buildPartial() {
                 context.ContextOuterClass.SliceId result = new context.ContextOuterClass.SliceId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (contextIdBuilder_ == null) {
+                    result.contextId_ = contextId_;
+                } else {
+                    result.contextId_ = contextIdBuilder_.build();
+                }
+                if (sliceUuidBuilder_ == null) {
+                    result.sliceUuid_ = sliceUuid_;
+                } else {
+                    result.sliceUuid_ = sliceUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.SliceId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.contextId_ = contextIdBuilder_ == null ? contextId_ : contextIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.sliceUuid_ = sliceUuidBuilder_ == null ? sliceUuid_ : sliceUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -34000,7 +35470,7 @@ public final class ContextOuterClass {
                 if (other.hasSliceUuid()) {
                     mergeSliceUuid(other.getSliceUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -34012,54 +35482,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.SliceId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getContextIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getSliceUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.SliceId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.ContextId contextId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 contextIdBuilder_;
@@ -34069,7 +35505,7 @@ public final class ContextOuterClass {
              * @return Whether the contextId field is set.
              */
             public boolean hasContextId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return contextIdBuilder_ != null || contextId_ != null;
             }
 
             /**
@@ -34093,11 +35529,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     contextId_ = value;
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -34107,11 +35542,10 @@ public final class ContextOuterClass {
             public Builder setContextId(context.ContextOuterClass.ContextId.Builder builderForValue) {
                 if (contextIdBuilder_ == null) {
                     contextId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -34120,16 +35554,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeContextId(context.ContextOuterClass.ContextId value) {
                 if (contextIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && contextId_ != null && contextId_ != context.ContextOuterClass.ContextId.getDefaultInstance()) {
-                        getContextIdBuilder().mergeFrom(value);
+                    if (contextId_ != null) {
+                        contextId_ = context.ContextOuterClass.ContextId.newBuilder(contextId_).mergeFrom(value).buildPartial();
                     } else {
                         contextId_ = value;
                     }
+                    onChanged();
                 } else {
                     contextIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -34137,13 +35570,13 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public Builder clearContextId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                    onChanged();
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -34151,7 +35584,6 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public context.ContextOuterClass.ContextId.Builder getContextIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getContextIdFieldBuilder().getBuilder();
             }
@@ -34187,7 +35619,7 @@ public final class ContextOuterClass {
              * @return Whether the sliceUuid field is set.
              */
             public boolean hasSliceUuid() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return sliceUuidBuilder_ != null || sliceUuid_ != null;
             }
 
             /**
@@ -34211,11 +35643,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     sliceUuid_ = value;
+                    onChanged();
                 } else {
                     sliceUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -34225,11 +35656,10 @@ public final class ContextOuterClass {
             public Builder setSliceUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (sliceUuidBuilder_ == null) {
                     sliceUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     sliceUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -34238,16 +35668,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeSliceUuid(context.ContextOuterClass.Uuid value) {
                 if (sliceUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && sliceUuid_ != null && sliceUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getSliceUuidBuilder().mergeFrom(value);
+                    if (sliceUuid_ != null) {
+                        sliceUuid_ = context.ContextOuterClass.Uuid.newBuilder(sliceUuid_).mergeFrom(value).buildPartial();
                     } else {
                         sliceUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     sliceUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -34255,13 +35684,13 @@ public final class ContextOuterClass {
              * .context.Uuid slice_uuid = 2;
              */
             public Builder clearSliceUuid() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                sliceUuid_ = null;
-                if (sliceUuidBuilder_ != null) {
-                    sliceUuidBuilder_.dispose();
+                if (sliceUuidBuilder_ == null) {
+                    sliceUuid_ = null;
+                    onChanged();
+                } else {
+                    sliceUuid_ = null;
                     sliceUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -34269,7 +35698,6 @@ public final class ContextOuterClass {
              * .context.Uuid slice_uuid = 2;
              */
             public context.ContextOuterClass.Uuid.Builder getSliceUuidBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getSliceUuidFieldBuilder().getBuilder();
             }
@@ -34323,17 +35751,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public SliceId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SliceId(input, extensionRegistry);
             }
         };
 
@@ -34580,6 +35998,164 @@ public final class ContextOuterClass {
             return new Slice();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Slice(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.SliceId.Builder subBuilder = null;
+                                if (sliceId_ != null) {
+                                    subBuilder = sliceId_.toBuilder();
+                                }
+                                sliceId_ = input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(sliceId_);
+                                    sliceId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    sliceEndpointIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                sliceEndpointIds_.add(input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 34:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                                    sliceConstraints_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                sliceConstraints_.add(input.readMessage(context.ContextOuterClass.Constraint.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 42:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000004) != 0)) {
+                                    sliceServiceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000004;
+                                }
+                                sliceServiceIds_.add(input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 50:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000008) != 0)) {
+                                    sliceSubsliceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000008;
+                                }
+                                sliceSubsliceIds_.add(input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 58:
+                            {
+                                context.ContextOuterClass.SliceStatus.Builder subBuilder = null;
+                                if (sliceStatus_ != null) {
+                                    subBuilder = sliceStatus_.toBuilder();
+                                }
+                                sliceStatus_ = input.readMessage(context.ContextOuterClass.SliceStatus.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(sliceStatus_);
+                                    sliceStatus_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 66:
+                            {
+                                context.ContextOuterClass.SliceConfig.Builder subBuilder = null;
+                                if (sliceConfig_ != null) {
+                                    subBuilder = sliceConfig_.toBuilder();
+                                }
+                                sliceConfig_ = input.readMessage(context.ContextOuterClass.SliceConfig.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(sliceConfig_);
+                                    sliceConfig_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 74:
+                            {
+                                context.ContextOuterClass.SliceOwner.Builder subBuilder = null;
+                                if (sliceOwner_ != null) {
+                                    subBuilder = sliceOwner_.toBuilder();
+                                }
+                                sliceOwner_ = input.readMessage(context.ContextOuterClass.SliceOwner.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(sliceOwner_);
+                                    sliceOwner_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 82:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (timestamp_ != null) {
+                                    subBuilder = timestamp_.toBuilder();
+                                }
+                                timestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(timestamp_);
+                                    timestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    sliceEndpointIds_ = java.util.Collections.unmodifiableList(sliceEndpointIds_);
+                }
+                if (((mutable_bitField0_ & 0x00000002) != 0)) {
+                    sliceConstraints_ = java.util.Collections.unmodifiableList(sliceConstraints_);
+                }
+                if (((mutable_bitField0_ & 0x00000004) != 0)) {
+                    sliceServiceIds_ = java.util.Collections.unmodifiableList(sliceServiceIds_);
+                }
+                if (((mutable_bitField0_ & 0x00000008) != 0)) {
+                    sliceSubsliceIds_ = java.util.Collections.unmodifiableList(sliceSubsliceIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Slice_descriptor;
         }
@@ -34616,13 +36192,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.SliceIdOrBuilder getSliceIdOrBuilder() {
-            return sliceId_ == null ? context.ContextOuterClass.SliceId.getDefaultInstance() : sliceId_;
+            return getSliceId();
         }
 
         public static final int NAME_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 2;
@@ -34659,7 +36234,6 @@ public final class ContextOuterClass {
 
         public static final int SLICE_ENDPOINT_IDS_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
         private java.util.List sliceEndpointIds_;
 
         /**
@@ -34704,7 +36278,6 @@ public final class ContextOuterClass {
 
         public static final int SLICE_CONSTRAINTS_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
         private java.util.List sliceConstraints_;
 
         /**
@@ -34749,7 +36322,6 @@ public final class ContextOuterClass {
 
         public static final int SLICE_SERVICE_IDS_FIELD_NUMBER = 5;
 
-        @SuppressWarnings("serial")
         private java.util.List sliceServiceIds_;
 
         /**
@@ -34794,7 +36366,6 @@ public final class ContextOuterClass {
 
         public static final int SLICE_SUBSLICE_IDS_FIELD_NUMBER = 6;
 
-        @SuppressWarnings("serial")
         private java.util.List sliceSubsliceIds_;
 
         /**
@@ -34864,7 +36435,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.SliceStatusOrBuilder getSliceStatusOrBuilder() {
-            return sliceStatus_ == null ? context.ContextOuterClass.SliceStatus.getDefaultInstance() : sliceStatus_;
+            return getSliceStatus();
         }
 
         public static final int SLICE_CONFIG_FIELD_NUMBER = 8;
@@ -34894,7 +36465,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.SliceConfigOrBuilder getSliceConfigOrBuilder() {
-            return sliceConfig_ == null ? context.ContextOuterClass.SliceConfig.getDefaultInstance() : sliceConfig_;
+            return getSliceConfig();
         }
 
         public static final int SLICE_OWNER_FIELD_NUMBER = 9;
@@ -34924,7 +36495,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.SliceOwnerOrBuilder getSliceOwnerOrBuilder() {
-            return sliceOwner_ == null ? context.ContextOuterClass.SliceOwner.getDefaultInstance() : sliceOwner_;
+            return getSliceOwner();
         }
 
         public static final int TIMESTAMP_FIELD_NUMBER = 10;
@@ -34954,7 +36525,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-            return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+            return getTimestamp();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -34975,7 +36546,7 @@ public final class ContextOuterClass {
             if (sliceId_ != null) {
                 output.writeMessage(1, getSliceId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
             }
             for (int i = 0; i < sliceEndpointIds_.size(); i++) {
@@ -35002,7 +36573,7 @@ public final class ContextOuterClass {
             if (timestamp_ != null) {
                 output.writeMessage(10, getTimestamp());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -35014,7 +36585,7 @@ public final class ContextOuterClass {
             if (sliceId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getSliceId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
             }
             for (int i = 0; i < sliceEndpointIds_.size(); i++) {
@@ -35041,7 +36612,7 @@ public final class ContextOuterClass {
             if (timestamp_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(10, getTimestamp());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -35095,7 +36666,7 @@ public final class ContextOuterClass {
                 if (!getTimestamp().equals(other.getTimestamp()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -35145,7 +36716,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
                 hash = (53 * hash) + getTimestamp().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -35239,68 +36810,79 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Slice.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getSliceEndpointIdsFieldBuilder();
+                    getSliceConstraintsFieldBuilder();
+                    getSliceServiceIdsFieldBuilder();
+                    getSliceSubsliceIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                sliceId_ = null;
-                if (sliceIdBuilder_ != null) {
-                    sliceIdBuilder_.dispose();
+                if (sliceIdBuilder_ == null) {
+                    sliceId_ = null;
+                } else {
+                    sliceId_ = null;
                     sliceIdBuilder_ = null;
                 }
                 name_ = "";
                 if (sliceEndpointIdsBuilder_ == null) {
                     sliceEndpointIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    sliceEndpointIds_ = null;
                     sliceEndpointIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000004);
                 if (sliceConstraintsBuilder_ == null) {
                     sliceConstraints_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
                 } else {
-                    sliceConstraints_ = null;
                     sliceConstraintsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000008);
                 if (sliceServiceIdsBuilder_ == null) {
                     sliceServiceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000004);
                 } else {
-                    sliceServiceIds_ = null;
                     sliceServiceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000010);
                 if (sliceSubsliceIdsBuilder_ == null) {
                     sliceSubsliceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000008);
                 } else {
-                    sliceSubsliceIds_ = null;
                     sliceSubsliceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000020);
-                sliceStatus_ = null;
-                if (sliceStatusBuilder_ != null) {
-                    sliceStatusBuilder_.dispose();
+                if (sliceStatusBuilder_ == null) {
+                    sliceStatus_ = null;
+                } else {
+                    sliceStatus_ = null;
                     sliceStatusBuilder_ = null;
                 }
-                sliceConfig_ = null;
-                if (sliceConfigBuilder_ != null) {
-                    sliceConfigBuilder_.dispose();
+                if (sliceConfigBuilder_ == null) {
+                    sliceConfig_ = null;
+                } else {
+                    sliceConfig_ = null;
                     sliceConfigBuilder_ = null;
                 }
-                sliceOwner_ = null;
-                if (sliceOwnerBuilder_ != null) {
-                    sliceOwnerBuilder_.dispose();
+                if (sliceOwnerBuilder_ == null) {
+                    sliceOwner_ = null;
+                } else {
+                    sliceOwner_ = null;
                     sliceOwnerBuilder_ = null;
                 }
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
                 return this;
@@ -35328,73 +36910,101 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Slice buildPartial() {
                 context.ContextOuterClass.Slice result = new context.ContextOuterClass.Slice(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (sliceIdBuilder_ == null) {
+                    result.sliceId_ = sliceId_;
+                } else {
+                    result.sliceId_ = sliceIdBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Slice result) {
+                result.name_ = name_;
                 if (sliceEndpointIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         sliceEndpointIds_ = java.util.Collections.unmodifiableList(sliceEndpointIds_);
-                        bitField0_ = (bitField0_ & ~0x00000004);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.sliceEndpointIds_ = sliceEndpointIds_;
                 } else {
                     result.sliceEndpointIds_ = sliceEndpointIdsBuilder_.build();
                 }
                 if (sliceConstraintsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0)) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
                         sliceConstraints_ = java.util.Collections.unmodifiableList(sliceConstraints_);
-                        bitField0_ = (bitField0_ & ~0x00000008);
+                        bitField0_ = (bitField0_ & ~0x00000002);
                     }
                     result.sliceConstraints_ = sliceConstraints_;
                 } else {
                     result.sliceConstraints_ = sliceConstraintsBuilder_.build();
                 }
                 if (sliceServiceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000010) != 0)) {
+                    if (((bitField0_ & 0x00000004) != 0)) {
                         sliceServiceIds_ = java.util.Collections.unmodifiableList(sliceServiceIds_);
-                        bitField0_ = (bitField0_ & ~0x00000010);
+                        bitField0_ = (bitField0_ & ~0x00000004);
                     }
                     result.sliceServiceIds_ = sliceServiceIds_;
                 } else {
                     result.sliceServiceIds_ = sliceServiceIdsBuilder_.build();
                 }
                 if (sliceSubsliceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000020) != 0)) {
+                    if (((bitField0_ & 0x00000008) != 0)) {
                         sliceSubsliceIds_ = java.util.Collections.unmodifiableList(sliceSubsliceIds_);
-                        bitField0_ = (bitField0_ & ~0x00000020);
+                        bitField0_ = (bitField0_ & ~0x00000008);
                     }
                     result.sliceSubsliceIds_ = sliceSubsliceIds_;
                 } else {
                     result.sliceSubsliceIds_ = sliceSubsliceIdsBuilder_.build();
                 }
-            }
-
-            private void buildPartial0(context.ContextOuterClass.Slice result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.sliceId_ = sliceIdBuilder_ == null ? sliceId_ : sliceIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000040) != 0)) {
-                    result.sliceStatus_ = sliceStatusBuilder_ == null ? sliceStatus_ : sliceStatusBuilder_.build();
+                if (sliceStatusBuilder_ == null) {
+                    result.sliceStatus_ = sliceStatus_;
+                } else {
+                    result.sliceStatus_ = sliceStatusBuilder_.build();
                 }
-                if (((from_bitField0_ & 0x00000080) != 0)) {
-                    result.sliceConfig_ = sliceConfigBuilder_ == null ? sliceConfig_ : sliceConfigBuilder_.build();
+                if (sliceConfigBuilder_ == null) {
+                    result.sliceConfig_ = sliceConfig_;
+                } else {
+                    result.sliceConfig_ = sliceConfigBuilder_.build();
                 }
-                if (((from_bitField0_ & 0x00000100) != 0)) {
-                    result.sliceOwner_ = sliceOwnerBuilder_ == null ? sliceOwner_ : sliceOwnerBuilder_.build();
+                if (sliceOwnerBuilder_ == null) {
+                    result.sliceOwner_ = sliceOwner_;
+                } else {
+                    result.sliceOwner_ = sliceOwnerBuilder_.build();
                 }
-                if (((from_bitField0_ & 0x00000200) != 0)) {
-                    result.timestamp_ = timestampBuilder_ == null ? timestamp_ : timestampBuilder_.build();
+                if (timestampBuilder_ == null) {
+                    result.timestamp_ = timestamp_;
+                } else {
+                    result.timestamp_ = timestampBuilder_.build();
                 }
+                onBuilt();
+                return result;
+            }
+
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -35415,14 +37025,13 @@ public final class ContextOuterClass {
                 }
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (sliceEndpointIdsBuilder_ == null) {
                     if (!other.sliceEndpointIds_.isEmpty()) {
                         if (sliceEndpointIds_.isEmpty()) {
                             sliceEndpointIds_ = other.sliceEndpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureSliceEndpointIdsIsMutable();
                             sliceEndpointIds_.addAll(other.sliceEndpointIds_);
@@ -35435,7 +37044,7 @@ public final class ContextOuterClass {
                             sliceEndpointIdsBuilder_.dispose();
                             sliceEndpointIdsBuilder_ = null;
                             sliceEndpointIds_ = other.sliceEndpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             sliceEndpointIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getSliceEndpointIdsFieldBuilder() : null;
                         } else {
                             sliceEndpointIdsBuilder_.addAllMessages(other.sliceEndpointIds_);
@@ -35446,7 +37055,7 @@ public final class ContextOuterClass {
                     if (!other.sliceConstraints_.isEmpty()) {
                         if (sliceConstraints_.isEmpty()) {
                             sliceConstraints_ = other.sliceConstraints_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                         } else {
                             ensureSliceConstraintsIsMutable();
                             sliceConstraints_.addAll(other.sliceConstraints_);
@@ -35459,7 +37068,7 @@ public final class ContextOuterClass {
                             sliceConstraintsBuilder_.dispose();
                             sliceConstraintsBuilder_ = null;
                             sliceConstraints_ = other.sliceConstraints_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                             sliceConstraintsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getSliceConstraintsFieldBuilder() : null;
                         } else {
                             sliceConstraintsBuilder_.addAllMessages(other.sliceConstraints_);
@@ -35470,7 +37079,7 @@ public final class ContextOuterClass {
                     if (!other.sliceServiceIds_.isEmpty()) {
                         if (sliceServiceIds_.isEmpty()) {
                             sliceServiceIds_ = other.sliceServiceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000010);
+                            bitField0_ = (bitField0_ & ~0x00000004);
                         } else {
                             ensureSliceServiceIdsIsMutable();
                             sliceServiceIds_.addAll(other.sliceServiceIds_);
@@ -35483,7 +37092,7 @@ public final class ContextOuterClass {
                             sliceServiceIdsBuilder_.dispose();
                             sliceServiceIdsBuilder_ = null;
                             sliceServiceIds_ = other.sliceServiceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000010);
+                            bitField0_ = (bitField0_ & ~0x00000004);
                             sliceServiceIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getSliceServiceIdsFieldBuilder() : null;
                         } else {
                             sliceServiceIdsBuilder_.addAllMessages(other.sliceServiceIds_);
@@ -35494,7 +37103,7 @@ public final class ContextOuterClass {
                     if (!other.sliceSubsliceIds_.isEmpty()) {
                         if (sliceSubsliceIds_.isEmpty()) {
                             sliceSubsliceIds_ = other.sliceSubsliceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000020);
+                            bitField0_ = (bitField0_ & ~0x00000008);
                         } else {
                             ensureSliceSubsliceIdsIsMutable();
                             sliceSubsliceIds_.addAll(other.sliceSubsliceIds_);
@@ -35507,7 +37116,7 @@ public final class ContextOuterClass {
                             sliceSubsliceIdsBuilder_.dispose();
                             sliceSubsliceIdsBuilder_ = null;
                             sliceSubsliceIds_ = other.sliceSubsliceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000020);
+                            bitField0_ = (bitField0_ & ~0x00000008);
                             sliceSubsliceIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getSliceSubsliceIdsFieldBuilder() : null;
                         } else {
                             sliceSubsliceIdsBuilder_.addAllMessages(other.sliceSubsliceIds_);
@@ -35526,7 +37135,7 @@ public final class ContextOuterClass {
                 if (other.hasTimestamp()) {
                     mergeTimestamp(other.getTimestamp());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -35538,125 +37147,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Slice parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getSliceIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    context.ContextOuterClass.EndPointId m = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-                                    if (sliceEndpointIdsBuilder_ == null) {
-                                        ensureSliceEndpointIdsIsMutable();
-                                        sliceEndpointIds_.add(m);
-                                    } else {
-                                        sliceEndpointIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    context.ContextOuterClass.Constraint m = input.readMessage(context.ContextOuterClass.Constraint.parser(), extensionRegistry);
-                                    if (sliceConstraintsBuilder_ == null) {
-                                        ensureSliceConstraintsIsMutable();
-                                        sliceConstraints_.add(m);
-                                    } else {
-                                        sliceConstraintsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    context.ContextOuterClass.ServiceId m = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
-                                    if (sliceServiceIdsBuilder_ == null) {
-                                        ensureSliceServiceIdsIsMutable();
-                                        sliceServiceIds_.add(m);
-                                    } else {
-                                        sliceServiceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 42
-                            case 50:
-                                {
-                                    context.ContextOuterClass.SliceId m = input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry);
-                                    if (sliceSubsliceIdsBuilder_ == null) {
-                                        ensureSliceSubsliceIdsIsMutable();
-                                        sliceSubsliceIds_.add(m);
-                                    } else {
-                                        sliceSubsliceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 50
-                            case 58:
-                                {
-                                    input.readMessage(getSliceStatusFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000040;
-                                    break;
-                                }
-                            // case 58
-                            case 66:
-                                {
-                                    input.readMessage(getSliceConfigFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000080;
-                                    break;
-                                }
-                            // case 66
-                            case 74:
-                                {
-                                    input.readMessage(getSliceOwnerFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000100;
-                                    break;
-                                }
-                            // case 74
-                            case 82:
-                                {
-                                    input.readMessage(getTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000200;
-                                    break;
-                                }
-                            // case 82
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Slice) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -35671,7 +37172,7 @@ public final class ContextOuterClass {
              * @return Whether the sliceId field is set.
              */
             public boolean hasSliceId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return sliceIdBuilder_ != null || sliceId_ != null;
             }
 
             /**
@@ -35695,11 +37196,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     sliceId_ = value;
+                    onChanged();
                 } else {
                     sliceIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -35709,11 +37209,10 @@ public final class ContextOuterClass {
             public Builder setSliceId(context.ContextOuterClass.SliceId.Builder builderForValue) {
                 if (sliceIdBuilder_ == null) {
                     sliceId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     sliceIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -35722,16 +37221,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeSliceId(context.ContextOuterClass.SliceId value) {
                 if (sliceIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && sliceId_ != null && sliceId_ != context.ContextOuterClass.SliceId.getDefaultInstance()) {
-                        getSliceIdBuilder().mergeFrom(value);
+                    if (sliceId_ != null) {
+                        sliceId_ = context.ContextOuterClass.SliceId.newBuilder(sliceId_).mergeFrom(value).buildPartial();
                     } else {
                         sliceId_ = value;
                     }
+                    onChanged();
                 } else {
                     sliceIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -35739,13 +37237,13 @@ public final class ContextOuterClass {
              * .context.SliceId slice_id = 1;
              */
             public Builder clearSliceId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                sliceId_ = null;
-                if (sliceIdBuilder_ != null) {
-                    sliceIdBuilder_.dispose();
+                if (sliceIdBuilder_ == null) {
+                    sliceId_ = null;
+                    onChanged();
+                } else {
+                    sliceId_ = null;
                     sliceIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -35753,7 +37251,6 @@ public final class ContextOuterClass {
              * .context.SliceId slice_id = 1;
              */
             public context.ContextOuterClass.SliceId.Builder getSliceIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getSliceIdFieldBuilder().getBuilder();
             }
@@ -35823,7 +37320,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -35834,7 +37330,6 @@ public final class ContextOuterClass {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -35850,7 +37345,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -35858,9 +37352,9 @@ public final class ContextOuterClass {
             private java.util.List sliceEndpointIds_ = java.util.Collections.emptyList();
 
             private void ensureSliceEndpointIdsIsMutable() {
-                if (!((bitField0_ & 0x00000004) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     sliceEndpointIds_ = new java.util.ArrayList(sliceEndpointIds_);
-                    bitField0_ |= 0x00000004;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -36012,7 +37506,7 @@ public final class ContextOuterClass {
             public Builder clearSliceEndpointIds() {
                 if (sliceEndpointIdsBuilder_ == null) {
                     sliceEndpointIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000004);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     sliceEndpointIdsBuilder_.clear();
@@ -36086,7 +37580,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getSliceEndpointIdsFieldBuilder() {
                 if (sliceEndpointIdsBuilder_ == null) {
-                    sliceEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceEndpointIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
+                    sliceEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceEndpointIds_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     sliceEndpointIds_ = null;
                 }
                 return sliceEndpointIdsBuilder_;
@@ -36095,9 +37589,9 @@ public final class ContextOuterClass {
             private java.util.List sliceConstraints_ = java.util.Collections.emptyList();
 
             private void ensureSliceConstraintsIsMutable() {
-                if (!((bitField0_ & 0x00000008) != 0)) {
+                if (!((bitField0_ & 0x00000002) != 0)) {
                     sliceConstraints_ = new java.util.ArrayList(sliceConstraints_);
-                    bitField0_ |= 0x00000008;
+                    bitField0_ |= 0x00000002;
                 }
             }
 
@@ -36249,7 +37743,7 @@ public final class ContextOuterClass {
             public Builder clearSliceConstraints() {
                 if (sliceConstraintsBuilder_ == null) {
                     sliceConstraints_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000008);
+                    bitField0_ = (bitField0_ & ~0x00000002);
                     onChanged();
                 } else {
                     sliceConstraintsBuilder_.clear();
@@ -36323,7 +37817,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getSliceConstraintsFieldBuilder() {
                 if (sliceConstraintsBuilder_ == null) {
-                    sliceConstraintsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceConstraints_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean());
+                    sliceConstraintsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceConstraints_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
                     sliceConstraints_ = null;
                 }
                 return sliceConstraintsBuilder_;
@@ -36332,9 +37826,9 @@ public final class ContextOuterClass {
             private java.util.List sliceServiceIds_ = java.util.Collections.emptyList();
 
             private void ensureSliceServiceIdsIsMutable() {
-                if (!((bitField0_ & 0x00000010) != 0)) {
+                if (!((bitField0_ & 0x00000004) != 0)) {
                     sliceServiceIds_ = new java.util.ArrayList(sliceServiceIds_);
-                    bitField0_ |= 0x00000010;
+                    bitField0_ |= 0x00000004;
                 }
             }
 
@@ -36486,7 +37980,7 @@ public final class ContextOuterClass {
             public Builder clearSliceServiceIds() {
                 if (sliceServiceIdsBuilder_ == null) {
                     sliceServiceIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000010);
+                    bitField0_ = (bitField0_ & ~0x00000004);
                     onChanged();
                 } else {
                     sliceServiceIdsBuilder_.clear();
@@ -36560,7 +38054,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getSliceServiceIdsFieldBuilder() {
                 if (sliceServiceIdsBuilder_ == null) {
-                    sliceServiceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceServiceIds_, ((bitField0_ & 0x00000010) != 0), getParentForChildren(), isClean());
+                    sliceServiceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceServiceIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
                     sliceServiceIds_ = null;
                 }
                 return sliceServiceIdsBuilder_;
@@ -36569,9 +38063,9 @@ public final class ContextOuterClass {
             private java.util.List sliceSubsliceIds_ = java.util.Collections.emptyList();
 
             private void ensureSliceSubsliceIdsIsMutable() {
-                if (!((bitField0_ & 0x00000020) != 0)) {
+                if (!((bitField0_ & 0x00000008) != 0)) {
                     sliceSubsliceIds_ = new java.util.ArrayList(sliceSubsliceIds_);
-                    bitField0_ |= 0x00000020;
+                    bitField0_ |= 0x00000008;
                 }
             }
 
@@ -36723,7 +38217,7 @@ public final class ContextOuterClass {
             public Builder clearSliceSubsliceIds() {
                 if (sliceSubsliceIdsBuilder_ == null) {
                     sliceSubsliceIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000020);
+                    bitField0_ = (bitField0_ & ~0x00000008);
                     onChanged();
                 } else {
                     sliceSubsliceIdsBuilder_.clear();
@@ -36797,7 +38291,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getSliceSubsliceIdsFieldBuilder() {
                 if (sliceSubsliceIdsBuilder_ == null) {
-                    sliceSubsliceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceSubsliceIds_, ((bitField0_ & 0x00000020) != 0), getParentForChildren(), isClean());
+                    sliceSubsliceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceSubsliceIds_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean());
                     sliceSubsliceIds_ = null;
                 }
                 return sliceSubsliceIdsBuilder_;
@@ -36812,7 +38306,7 @@ public final class ContextOuterClass {
              * @return Whether the sliceStatus field is set.
              */
             public boolean hasSliceStatus() {
-                return ((bitField0_ & 0x00000040) != 0);
+                return sliceStatusBuilder_ != null || sliceStatus_ != null;
             }
 
             /**
@@ -36836,11 +38330,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     sliceStatus_ = value;
+                    onChanged();
                 } else {
                     sliceStatusBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000040;
-                onChanged();
                 return this;
             }
 
@@ -36850,11 +38343,10 @@ public final class ContextOuterClass {
             public Builder setSliceStatus(context.ContextOuterClass.SliceStatus.Builder builderForValue) {
                 if (sliceStatusBuilder_ == null) {
                     sliceStatus_ = builderForValue.build();
+                    onChanged();
                 } else {
                     sliceStatusBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000040;
-                onChanged();
                 return this;
             }
 
@@ -36863,16 +38355,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeSliceStatus(context.ContextOuterClass.SliceStatus value) {
                 if (sliceStatusBuilder_ == null) {
-                    if (((bitField0_ & 0x00000040) != 0) && sliceStatus_ != null && sliceStatus_ != context.ContextOuterClass.SliceStatus.getDefaultInstance()) {
-                        getSliceStatusBuilder().mergeFrom(value);
+                    if (sliceStatus_ != null) {
+                        sliceStatus_ = context.ContextOuterClass.SliceStatus.newBuilder(sliceStatus_).mergeFrom(value).buildPartial();
                     } else {
                         sliceStatus_ = value;
                     }
+                    onChanged();
                 } else {
                     sliceStatusBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000040;
-                onChanged();
                 return this;
             }
 
@@ -36880,13 +38371,13 @@ public final class ContextOuterClass {
              * .context.SliceStatus slice_status = 7;
              */
             public Builder clearSliceStatus() {
-                bitField0_ = (bitField0_ & ~0x00000040);
-                sliceStatus_ = null;
-                if (sliceStatusBuilder_ != null) {
-                    sliceStatusBuilder_.dispose();
+                if (sliceStatusBuilder_ == null) {
+                    sliceStatus_ = null;
+                    onChanged();
+                } else {
+                    sliceStatus_ = null;
                     sliceStatusBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -36894,7 +38385,6 @@ public final class ContextOuterClass {
              * .context.SliceStatus slice_status = 7;
              */
             public context.ContextOuterClass.SliceStatus.Builder getSliceStatusBuilder() {
-                bitField0_ |= 0x00000040;
                 onChanged();
                 return getSliceStatusFieldBuilder().getBuilder();
             }
@@ -36930,7 +38420,7 @@ public final class ContextOuterClass {
              * @return Whether the sliceConfig field is set.
              */
             public boolean hasSliceConfig() {
-                return ((bitField0_ & 0x00000080) != 0);
+                return sliceConfigBuilder_ != null || sliceConfig_ != null;
             }
 
             /**
@@ -36954,11 +38444,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     sliceConfig_ = value;
+                    onChanged();
                 } else {
                     sliceConfigBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000080;
-                onChanged();
                 return this;
             }
 
@@ -36968,11 +38457,10 @@ public final class ContextOuterClass {
             public Builder setSliceConfig(context.ContextOuterClass.SliceConfig.Builder builderForValue) {
                 if (sliceConfigBuilder_ == null) {
                     sliceConfig_ = builderForValue.build();
+                    onChanged();
                 } else {
                     sliceConfigBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000080;
-                onChanged();
                 return this;
             }
 
@@ -36981,16 +38469,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeSliceConfig(context.ContextOuterClass.SliceConfig value) {
                 if (sliceConfigBuilder_ == null) {
-                    if (((bitField0_ & 0x00000080) != 0) && sliceConfig_ != null && sliceConfig_ != context.ContextOuterClass.SliceConfig.getDefaultInstance()) {
-                        getSliceConfigBuilder().mergeFrom(value);
+                    if (sliceConfig_ != null) {
+                        sliceConfig_ = context.ContextOuterClass.SliceConfig.newBuilder(sliceConfig_).mergeFrom(value).buildPartial();
                     } else {
                         sliceConfig_ = value;
                     }
+                    onChanged();
                 } else {
                     sliceConfigBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000080;
-                onChanged();
                 return this;
             }
 
@@ -36998,13 +38485,13 @@ public final class ContextOuterClass {
              * .context.SliceConfig slice_config = 8;
              */
             public Builder clearSliceConfig() {
-                bitField0_ = (bitField0_ & ~0x00000080);
-                sliceConfig_ = null;
-                if (sliceConfigBuilder_ != null) {
-                    sliceConfigBuilder_.dispose();
+                if (sliceConfigBuilder_ == null) {
+                    sliceConfig_ = null;
+                    onChanged();
+                } else {
+                    sliceConfig_ = null;
                     sliceConfigBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -37012,7 +38499,6 @@ public final class ContextOuterClass {
              * .context.SliceConfig slice_config = 8;
              */
             public context.ContextOuterClass.SliceConfig.Builder getSliceConfigBuilder() {
-                bitField0_ |= 0x00000080;
                 onChanged();
                 return getSliceConfigFieldBuilder().getBuilder();
             }
@@ -37048,7 +38534,7 @@ public final class ContextOuterClass {
              * @return Whether the sliceOwner field is set.
              */
             public boolean hasSliceOwner() {
-                return ((bitField0_ & 0x00000100) != 0);
+                return sliceOwnerBuilder_ != null || sliceOwner_ != null;
             }
 
             /**
@@ -37072,11 +38558,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     sliceOwner_ = value;
+                    onChanged();
                 } else {
                     sliceOwnerBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000100;
-                onChanged();
                 return this;
             }
 
@@ -37086,11 +38571,10 @@ public final class ContextOuterClass {
             public Builder setSliceOwner(context.ContextOuterClass.SliceOwner.Builder builderForValue) {
                 if (sliceOwnerBuilder_ == null) {
                     sliceOwner_ = builderForValue.build();
+                    onChanged();
                 } else {
                     sliceOwnerBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000100;
-                onChanged();
                 return this;
             }
 
@@ -37099,16 +38583,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeSliceOwner(context.ContextOuterClass.SliceOwner value) {
                 if (sliceOwnerBuilder_ == null) {
-                    if (((bitField0_ & 0x00000100) != 0) && sliceOwner_ != null && sliceOwner_ != context.ContextOuterClass.SliceOwner.getDefaultInstance()) {
-                        getSliceOwnerBuilder().mergeFrom(value);
+                    if (sliceOwner_ != null) {
+                        sliceOwner_ = context.ContextOuterClass.SliceOwner.newBuilder(sliceOwner_).mergeFrom(value).buildPartial();
                     } else {
                         sliceOwner_ = value;
                     }
+                    onChanged();
                 } else {
                     sliceOwnerBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000100;
-                onChanged();
                 return this;
             }
 
@@ -37116,13 +38599,13 @@ public final class ContextOuterClass {
              * .context.SliceOwner slice_owner = 9;
              */
             public Builder clearSliceOwner() {
-                bitField0_ = (bitField0_ & ~0x00000100);
-                sliceOwner_ = null;
-                if (sliceOwnerBuilder_ != null) {
-                    sliceOwnerBuilder_.dispose();
+                if (sliceOwnerBuilder_ == null) {
+                    sliceOwner_ = null;
+                    onChanged();
+                } else {
+                    sliceOwner_ = null;
                     sliceOwnerBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -37130,7 +38613,6 @@ public final class ContextOuterClass {
              * .context.SliceOwner slice_owner = 9;
              */
             public context.ContextOuterClass.SliceOwner.Builder getSliceOwnerBuilder() {
-                bitField0_ |= 0x00000100;
                 onChanged();
                 return getSliceOwnerFieldBuilder().getBuilder();
             }
@@ -37166,7 +38648,7 @@ public final class ContextOuterClass {
              * @return Whether the timestamp field is set.
              */
             public boolean hasTimestamp() {
-                return ((bitField0_ & 0x00000200) != 0);
+                return timestampBuilder_ != null || timestamp_ != null;
             }
 
             /**
@@ -37190,11 +38672,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     timestamp_ = value;
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000200;
-                onChanged();
                 return this;
             }
 
@@ -37204,11 +38685,10 @@ public final class ContextOuterClass {
             public Builder setTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (timestampBuilder_ == null) {
                     timestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000200;
-                onChanged();
                 return this;
             }
 
@@ -37217,16 +38697,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (timestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000200) != 0) && timestamp_ != null && timestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getTimestampBuilder().mergeFrom(value);
+                    if (timestamp_ != null) {
+                        timestamp_ = context.ContextOuterClass.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial();
                     } else {
                         timestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     timestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000200;
-                onChanged();
                 return this;
             }
 
@@ -37234,13 +38713,13 @@ public final class ContextOuterClass {
              * .context.Timestamp timestamp = 10;
              */
             public Builder clearTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000200);
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                    onChanged();
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -37248,7 +38727,6 @@ public final class ContextOuterClass {
              * .context.Timestamp timestamp = 10;
              */
             public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
-                bitField0_ |= 0x00000200;
                 onChanged();
                 return getTimestampFieldBuilder().getBuilder();
             }
@@ -37302,17 +38780,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Slice parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Slice(input, extensionRegistry);
             }
         };
 
@@ -37387,6 +38855,63 @@ public final class ContextOuterClass {
             return new SliceOwner();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SliceOwner(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (ownerUuid_ != null) {
+                                    subBuilder = ownerUuid_.toBuilder();
+                                }
+                                ownerUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(ownerUuid_);
+                                    ownerUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                ownerString_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_SliceOwner_descriptor;
         }
@@ -37423,13 +38948,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getOwnerUuidOrBuilder() {
-            return ownerUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : ownerUuid_;
+            return getOwnerUuid();
         }
 
         public static final int OWNER_STRING_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object ownerString_ = "";
+        private volatile java.lang.Object ownerString_;
 
         /**
          * string owner_string = 2;
@@ -37482,10 +39006,10 @@ public final class ContextOuterClass {
             if (ownerUuid_ != null) {
                 output.writeMessage(1, getOwnerUuid());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(ownerString_)) {
+            if (!getOwnerStringBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, ownerString_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -37497,10 +39021,10 @@ public final class ContextOuterClass {
             if (ownerUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getOwnerUuid());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(ownerString_)) {
+            if (!getOwnerStringBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, ownerString_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -37522,7 +39046,7 @@ public final class ContextOuterClass {
             }
             if (!getOwnerString().equals(other.getOwnerString()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -37540,7 +39064,7 @@ public final class ContextOuterClass {
             }
             hash = (37 * hash) + OWNER_STRING_FIELD_NUMBER;
             hash = (53 * hash) + getOwnerString().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -37634,19 +39158,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.SliceOwner.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                ownerUuid_ = null;
-                if (ownerUuidBuilder_ != null) {
-                    ownerUuidBuilder_.dispose();
+                if (ownerUuidBuilder_ == null) {
+                    ownerUuid_ = null;
+                } else {
+                    ownerUuid_ = null;
                     ownerUuidBuilder_ = null;
                 }
                 ownerString_ = "";
@@ -37675,21 +39206,44 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.SliceOwner buildPartial() {
                 context.ContextOuterClass.SliceOwner result = new context.ContextOuterClass.SliceOwner(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (ownerUuidBuilder_ == null) {
+                    result.ownerUuid_ = ownerUuid_;
+                } else {
+                    result.ownerUuid_ = ownerUuidBuilder_.build();
                 }
+                result.ownerString_ = ownerString_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.SliceOwner result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.ownerUuid_ = ownerUuidBuilder_ == null ? ownerUuid_ : ownerUuidBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.ownerString_ = ownerString_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -37710,10 +39264,9 @@ public final class ContextOuterClass {
                 }
                 if (!other.getOwnerString().isEmpty()) {
                     ownerString_ = other.ownerString_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -37725,54 +39278,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.SliceOwner parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getOwnerUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    ownerString_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.SliceOwner) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid ownerUuid_;
 
             private com.google.protobuf.SingleFieldBuilderV3 ownerUuidBuilder_;
@@ -37782,7 +39301,7 @@ public final class ContextOuterClass {
              * @return Whether the ownerUuid field is set.
              */
             public boolean hasOwnerUuid() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return ownerUuidBuilder_ != null || ownerUuid_ != null;
             }
 
             /**
@@ -37806,11 +39325,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     ownerUuid_ = value;
+                    onChanged();
                 } else {
                     ownerUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -37820,11 +39338,10 @@ public final class ContextOuterClass {
             public Builder setOwnerUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (ownerUuidBuilder_ == null) {
                     ownerUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     ownerUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -37833,16 +39350,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeOwnerUuid(context.ContextOuterClass.Uuid value) {
                 if (ownerUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && ownerUuid_ != null && ownerUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getOwnerUuidBuilder().mergeFrom(value);
+                    if (ownerUuid_ != null) {
+                        ownerUuid_ = context.ContextOuterClass.Uuid.newBuilder(ownerUuid_).mergeFrom(value).buildPartial();
                     } else {
                         ownerUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     ownerUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -37850,13 +39366,13 @@ public final class ContextOuterClass {
              * .context.Uuid owner_uuid = 1;
              */
             public Builder clearOwnerUuid() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                ownerUuid_ = null;
-                if (ownerUuidBuilder_ != null) {
-                    ownerUuidBuilder_.dispose();
+                if (ownerUuidBuilder_ == null) {
+                    ownerUuid_ = null;
+                    onChanged();
+                } else {
+                    ownerUuid_ = null;
                     ownerUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -37864,7 +39380,6 @@ public final class ContextOuterClass {
              * .context.Uuid owner_uuid = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getOwnerUuidBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getOwnerUuidFieldBuilder().getBuilder();
             }
@@ -37934,7 +39449,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 ownerString_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -37945,7 +39459,6 @@ public final class ContextOuterClass {
              */
             public Builder clearOwnerString() {
                 ownerString_ = getDefaultInstance().getOwnerString();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -37961,7 +39474,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 ownerString_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -37993,17 +39505,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public SliceOwner parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SliceOwner(input, extensionRegistry);
             }
         };
 
@@ -38061,6 +39563,50 @@ public final class ContextOuterClass {
             return new SliceStatus();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SliceStatus(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                int rawValue = input.readEnum();
+                                sliceStatus_ = rawValue;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_SliceStatus_descriptor;
         }
@@ -38072,7 +39618,7 @@ public final class ContextOuterClass {
 
         public static final int SLICE_STATUS_FIELD_NUMBER = 1;
 
-        private int sliceStatus_ = 0;
+        private int sliceStatus_;
 
         /**
          * .context.SliceStatusEnum slice_status = 1;
@@ -38089,7 +39635,8 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.SliceStatusEnum getSliceStatus() {
-            context.ContextOuterClass.SliceStatusEnum result = context.ContextOuterClass.SliceStatusEnum.forNumber(sliceStatus_);
+            @SuppressWarnings("deprecation")
+            context.ContextOuterClass.SliceStatusEnum result = context.ContextOuterClass.SliceStatusEnum.valueOf(sliceStatus_);
             return result == null ? context.ContextOuterClass.SliceStatusEnum.UNRECOGNIZED : result;
         }
 
@@ -38111,7 +39658,7 @@ public final class ContextOuterClass {
             if (sliceStatus_ != context.ContextOuterClass.SliceStatusEnum.SLICESTATUS_UNDEFINED.getNumber()) {
                 output.writeEnum(1, sliceStatus_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -38123,7 +39670,7 @@ public final class ContextOuterClass {
             if (sliceStatus_ != context.ContextOuterClass.SliceStatusEnum.SLICESTATUS_UNDEFINED.getNumber()) {
                 size += com.google.protobuf.CodedOutputStream.computeEnumSize(1, sliceStatus_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -38139,7 +39686,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.SliceStatus other = (context.ContextOuterClass.SliceStatus) obj;
             if (sliceStatus_ != other.sliceStatus_)
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -38153,7 +39700,7 @@ public final class ContextOuterClass {
             hash = (19 * hash) + getDescriptor().hashCode();
             hash = (37 * hash) + SLICE_STATUS_FIELD_NUMBER;
             hash = (53 * hash) + sliceStatus_;
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -38247,16 +39794,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.SliceStatus.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 sliceStatus_ = 0;
                 return this;
             }
@@ -38283,18 +39836,39 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.SliceStatus buildPartial() {
                 context.ContextOuterClass.SliceStatus result = new context.ContextOuterClass.SliceStatus(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.sliceStatus_ = sliceStatus_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.SliceStatus result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.sliceStatus_ = sliceStatus_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -38313,7 +39887,7 @@ public final class ContextOuterClass {
                 if (other.sliceStatus_ != 0) {
                     setSliceStatusValue(other.getSliceStatusValue());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -38325,47 +39899,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.SliceStatus parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    sliceStatus_ = input.readEnum();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.SliceStatus) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private int sliceStatus_ = 0;
 
             /**
@@ -38384,7 +39931,6 @@ public final class ContextOuterClass {
              */
             public Builder setSliceStatusValue(int value) {
                 sliceStatus_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -38395,7 +39941,8 @@ public final class ContextOuterClass {
              */
             @java.lang.Override
             public context.ContextOuterClass.SliceStatusEnum getSliceStatus() {
-                context.ContextOuterClass.SliceStatusEnum result = context.ContextOuterClass.SliceStatusEnum.forNumber(sliceStatus_);
+                @SuppressWarnings("deprecation")
+                context.ContextOuterClass.SliceStatusEnum result = context.ContextOuterClass.SliceStatusEnum.valueOf(sliceStatus_);
                 return result == null ? context.ContextOuterClass.SliceStatusEnum.UNRECOGNIZED : result;
             }
 
@@ -38408,7 +39955,6 @@ public final class ContextOuterClass {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000001;
                 sliceStatus_ = value.getNumber();
                 onChanged();
                 return this;
@@ -38419,7 +39965,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearSliceStatus() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 sliceStatus_ = 0;
                 onChanged();
                 return this;
@@ -38452,17 +39997,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public SliceStatus parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SliceStatus(input, extensionRegistry);
             }
         };
 
@@ -38533,6 +40068,57 @@ public final class ContextOuterClass {
             return new SliceConfig();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SliceConfig(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    configRules_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                configRules_.add(input.readMessage(context.ContextOuterClass.ConfigRule.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    configRules_ = java.util.Collections.unmodifiableList(configRules_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_SliceConfig_descriptor;
         }
@@ -38544,7 +40130,6 @@ public final class ContextOuterClass {
 
         public static final int CONFIG_RULES_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List configRules_;
 
         /**
@@ -38605,7 +40190,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < configRules_.size(); i++) {
                 output.writeMessage(1, configRules_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -38617,7 +40202,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < configRules_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, configRules_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -38633,7 +40218,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.SliceConfig other = (context.ContextOuterClass.SliceConfig) obj;
             if (!getConfigRulesList().equals(other.getConfigRulesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -38649,7 +40234,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONFIG_RULES_FIELD_NUMBER;
                 hash = (53 * hash) + getConfigRulesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -38743,23 +40328,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.SliceConfig.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getConfigRulesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (configRulesBuilder_ == null) {
                     configRules_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    configRules_ = null;
                     configRulesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -38785,15 +40376,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.SliceConfig buildPartial() {
                 context.ContextOuterClass.SliceConfig result = new context.ContextOuterClass.SliceConfig(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.SliceConfig result) {
+                int from_bitField0_ = bitField0_;
                 if (configRulesBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         configRules_ = java.util.Collections.unmodifiableList(configRules_);
@@ -38803,10 +40386,38 @@ public final class ContextOuterClass {
                 } else {
                     result.configRules_ = configRulesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.SliceConfig result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -38846,7 +40457,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -38858,47 +40469,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.SliceConfig parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.ConfigRule m = input.readMessage(context.ContextOuterClass.ConfigRule.parser(), extensionRegistry);
-                                    if (configRulesBuilder_ == null) {
-                                        ensureConfigRulesIsMutable();
-                                        configRules_.add(m);
-                                    } else {
-                                        configRulesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.SliceConfig) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -39168,17 +40749,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public SliceConfig parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SliceConfig(input, extensionRegistry);
             }
         };
 
@@ -39249,6 +40820,57 @@ public final class ContextOuterClass {
             return new SliceIdList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SliceIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    sliceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                sliceIds_.add(input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    sliceIds_ = java.util.Collections.unmodifiableList(sliceIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_SliceIdList_descriptor;
         }
@@ -39260,7 +40882,6 @@ public final class ContextOuterClass {
 
         public static final int SLICE_IDS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List sliceIds_;
 
         /**
@@ -39321,7 +40942,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < sliceIds_.size(); i++) {
                 output.writeMessage(1, sliceIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -39333,7 +40954,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < sliceIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, sliceIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -39349,7 +40970,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.SliceIdList other = (context.ContextOuterClass.SliceIdList) obj;
             if (!getSliceIdsList().equals(other.getSliceIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -39365,7 +40986,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SLICE_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getSliceIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -39459,23 +41080,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.SliceIdList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getSliceIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (sliceIdsBuilder_ == null) {
                     sliceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    sliceIds_ = null;
                     sliceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -39501,15 +41128,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.SliceIdList buildPartial() {
                 context.ContextOuterClass.SliceIdList result = new context.ContextOuterClass.SliceIdList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.SliceIdList result) {
+                int from_bitField0_ = bitField0_;
                 if (sliceIdsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         sliceIds_ = java.util.Collections.unmodifiableList(sliceIds_);
@@ -39519,10 +41138,38 @@ public final class ContextOuterClass {
                 } else {
                     result.sliceIds_ = sliceIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.SliceIdList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -39562,7 +41209,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -39574,47 +41221,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.SliceIdList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.SliceId m = input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry);
-                                    if (sliceIdsBuilder_ == null) {
-                                        ensureSliceIdsIsMutable();
-                                        sliceIds_.add(m);
-                                    } else {
-                                        sliceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.SliceIdList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -39884,17 +41501,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public SliceIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SliceIdList(input, extensionRegistry);
             }
         };
 
@@ -39965,6 +41572,57 @@ public final class ContextOuterClass {
             return new SliceList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SliceList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    slices_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                slices_.add(input.readMessage(context.ContextOuterClass.Slice.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    slices_ = java.util.Collections.unmodifiableList(slices_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_SliceList_descriptor;
         }
@@ -39976,7 +41634,6 @@ public final class ContextOuterClass {
 
         public static final int SLICES_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List slices_;
 
         /**
@@ -40037,7 +41694,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < slices_.size(); i++) {
                 output.writeMessage(1, slices_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -40049,7 +41706,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < slices_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, slices_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -40065,7 +41722,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.SliceList other = (context.ContextOuterClass.SliceList) obj;
             if (!getSlicesList().equals(other.getSlicesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -40081,7 +41738,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SLICES_FIELD_NUMBER;
                 hash = (53 * hash) + getSlicesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -40175,23 +41832,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.SliceList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getSlicesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (slicesBuilder_ == null) {
                     slices_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    slices_ = null;
                     slicesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -40217,15 +41880,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.SliceList buildPartial() {
                 context.ContextOuterClass.SliceList result = new context.ContextOuterClass.SliceList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.SliceList result) {
+                int from_bitField0_ = bitField0_;
                 if (slicesBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         slices_ = java.util.Collections.unmodifiableList(slices_);
@@ -40235,10 +41890,38 @@ public final class ContextOuterClass {
                 } else {
                     result.slices_ = slicesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.SliceList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -40278,7 +41961,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -40290,47 +41973,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.SliceList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.Slice m = input.readMessage(context.ContextOuterClass.Slice.parser(), extensionRegistry);
-                                    if (slicesBuilder_ == null) {
-                                        ensureSlicesIsMutable();
-                                        slices_.add(m);
-                                    } else {
-                                        slicesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.SliceList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -40600,17 +42253,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public SliceList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SliceList(input, extensionRegistry);
             }
         };
 
@@ -40702,6 +42345,82 @@ public final class ContextOuterClass {
             return new SliceFilter();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SliceFilter(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.SliceIdList.Builder subBuilder = null;
+                                if (sliceIds_ != null) {
+                                    subBuilder = sliceIds_.toBuilder();
+                                }
+                                sliceIds_ = input.readMessage(context.ContextOuterClass.SliceIdList.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(sliceIds_);
+                                    sliceIds_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 16:
+                            {
+                                includeEndpointIds_ = input.readBool();
+                                break;
+                            }
+                        case 24:
+                            {
+                                includeConstraints_ = input.readBool();
+                                break;
+                            }
+                        case 32:
+                            {
+                                includeServiceIds_ = input.readBool();
+                                break;
+                            }
+                        case 40:
+                            {
+                                includeSubsliceIds_ = input.readBool();
+                                break;
+                            }
+                        case 48:
+                            {
+                                includeConfigRules_ = input.readBool();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_SliceFilter_descriptor;
         }
@@ -40738,12 +42457,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.SliceIdListOrBuilder getSliceIdsOrBuilder() {
-            return sliceIds_ == null ? context.ContextOuterClass.SliceIdList.getDefaultInstance() : sliceIds_;
+            return getSliceIds();
         }
 
         public static final int INCLUDE_ENDPOINT_IDS_FIELD_NUMBER = 2;
 
-        private boolean includeEndpointIds_ = false;
+        private boolean includeEndpointIds_;
 
         /**
          * bool include_endpoint_ids = 2;
@@ -40756,7 +42475,7 @@ public final class ContextOuterClass {
 
         public static final int INCLUDE_CONSTRAINTS_FIELD_NUMBER = 3;
 
-        private boolean includeConstraints_ = false;
+        private boolean includeConstraints_;
 
         /**
          * bool include_constraints = 3;
@@ -40769,7 +42488,7 @@ public final class ContextOuterClass {
 
         public static final int INCLUDE_SERVICE_IDS_FIELD_NUMBER = 4;
 
-        private boolean includeServiceIds_ = false;
+        private boolean includeServiceIds_;
 
         /**
          * bool include_service_ids = 4;
@@ -40782,7 +42501,7 @@ public final class ContextOuterClass {
 
         public static final int INCLUDE_SUBSLICE_IDS_FIELD_NUMBER = 5;
 
-        private boolean includeSubsliceIds_ = false;
+        private boolean includeSubsliceIds_;
 
         /**
          * bool include_subslice_ids = 5;
@@ -40795,7 +42514,7 @@ public final class ContextOuterClass {
 
         public static final int INCLUDE_CONFIG_RULES_FIELD_NUMBER = 6;
 
-        private boolean includeConfigRules_ = false;
+        private boolean includeConfigRules_;
 
         /**
          * bool include_config_rules = 6;
@@ -40839,7 +42558,7 @@ public final class ContextOuterClass {
             if (includeConfigRules_ != false) {
                 output.writeBool(6, includeConfigRules_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -40866,7 +42585,7 @@ public final class ContextOuterClass {
             if (includeConfigRules_ != false) {
                 size += com.google.protobuf.CodedOutputStream.computeBoolSize(6, includeConfigRules_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -40896,7 +42615,7 @@ public final class ContextOuterClass {
                 return false;
             if (getIncludeConfigRules() != other.getIncludeConfigRules())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -40922,7 +42641,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeSubsliceIds());
             hash = (37 * hash) + INCLUDE_CONFIG_RULES_FIELD_NUMBER;
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeConfigRules());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -41016,19 +42735,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.SliceFilter.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                sliceIds_ = null;
-                if (sliceIdsBuilder_ != null) {
-                    sliceIdsBuilder_.dispose();
+                if (sliceIdsBuilder_ == null) {
+                    sliceIds_ = null;
+                } else {
+                    sliceIds_ = null;
                     sliceIdsBuilder_ = null;
                 }
                 includeEndpointIds_ = false;
@@ -41061,33 +42787,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.SliceFilter buildPartial() {
                 context.ContextOuterClass.SliceFilter result = new context.ContextOuterClass.SliceFilter(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (sliceIdsBuilder_ == null) {
+                    result.sliceIds_ = sliceIds_;
+                } else {
+                    result.sliceIds_ = sliceIdsBuilder_.build();
                 }
+                result.includeEndpointIds_ = includeEndpointIds_;
+                result.includeConstraints_ = includeConstraints_;
+                result.includeServiceIds_ = includeServiceIds_;
+                result.includeSubsliceIds_ = includeSubsliceIds_;
+                result.includeConfigRules_ = includeConfigRules_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.SliceFilter result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.sliceIds_ = sliceIdsBuilder_ == null ? sliceIds_ : sliceIdsBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.includeEndpointIds_ = includeEndpointIds_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.includeConstraints_ = includeConstraints_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.includeServiceIds_ = includeServiceIds_;
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.includeSubsliceIds_ = includeSubsliceIds_;
-                }
-                if (((from_bitField0_ & 0x00000020) != 0)) {
-                    result.includeConfigRules_ = includeConfigRules_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -41121,7 +42862,7 @@ public final class ContextOuterClass {
                 if (other.getIncludeConfigRules() != false) {
                     setIncludeConfigRules(other.getIncludeConfigRules());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -41133,82 +42874,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.SliceFilter parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getSliceIdsFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 16:
-                                {
-                                    includeEndpointIds_ = input.readBool();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            case 24:
-                                {
-                                    includeConstraints_ = input.readBool();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 32:
-                                {
-                                    includeServiceIds_ = input.readBool();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 32
-                            case 40:
-                                {
-                                    includeSubsliceIds_ = input.readBool();
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 40
-                            case 48:
-                                {
-                                    includeConfigRules_ = input.readBool();
-                                    bitField0_ |= 0x00000020;
-                                    break;
-                                }
-                            // case 48
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.SliceFilter) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.SliceIdList sliceIds_;
 
             private com.google.protobuf.SingleFieldBuilderV3 sliceIdsBuilder_;
@@ -41218,7 +42897,7 @@ public final class ContextOuterClass {
              * @return Whether the sliceIds field is set.
              */
             public boolean hasSliceIds() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return sliceIdsBuilder_ != null || sliceIds_ != null;
             }
 
             /**
@@ -41242,11 +42921,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     sliceIds_ = value;
+                    onChanged();
                 } else {
                     sliceIdsBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -41256,11 +42934,10 @@ public final class ContextOuterClass {
             public Builder setSliceIds(context.ContextOuterClass.SliceIdList.Builder builderForValue) {
                 if (sliceIdsBuilder_ == null) {
                     sliceIds_ = builderForValue.build();
+                    onChanged();
                 } else {
                     sliceIdsBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -41269,16 +42946,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeSliceIds(context.ContextOuterClass.SliceIdList value) {
                 if (sliceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && sliceIds_ != null && sliceIds_ != context.ContextOuterClass.SliceIdList.getDefaultInstance()) {
-                        getSliceIdsBuilder().mergeFrom(value);
+                    if (sliceIds_ != null) {
+                        sliceIds_ = context.ContextOuterClass.SliceIdList.newBuilder(sliceIds_).mergeFrom(value).buildPartial();
                     } else {
                         sliceIds_ = value;
                     }
+                    onChanged();
                 } else {
                     sliceIdsBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -41286,13 +42962,13 @@ public final class ContextOuterClass {
              * .context.SliceIdList slice_ids = 1;
              */
             public Builder clearSliceIds() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                sliceIds_ = null;
-                if (sliceIdsBuilder_ != null) {
-                    sliceIdsBuilder_.dispose();
+                if (sliceIdsBuilder_ == null) {
+                    sliceIds_ = null;
+                    onChanged();
+                } else {
+                    sliceIds_ = null;
                     sliceIdsBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -41300,7 +42976,6 @@ public final class ContextOuterClass {
              * .context.SliceIdList slice_ids = 1;
              */
             public context.ContextOuterClass.SliceIdList.Builder getSliceIdsBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getSliceIdsFieldBuilder().getBuilder();
             }
@@ -41345,7 +43020,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeEndpointIds(boolean value) {
                 includeEndpointIds_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -41355,7 +43029,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeEndpointIds() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 includeEndpointIds_ = false;
                 onChanged();
                 return this;
@@ -41379,7 +43052,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeConstraints(boolean value) {
                 includeConstraints_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -41389,7 +43061,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeConstraints() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 includeConstraints_ = false;
                 onChanged();
                 return this;
@@ -41413,7 +43084,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeServiceIds(boolean value) {
                 includeServiceIds_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -41423,7 +43093,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeServiceIds() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 includeServiceIds_ = false;
                 onChanged();
                 return this;
@@ -41447,7 +43116,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeSubsliceIds(boolean value) {
                 includeSubsliceIds_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -41457,7 +43125,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeSubsliceIds() {
-                bitField0_ = (bitField0_ & ~0x00000010);
                 includeSubsliceIds_ = false;
                 onChanged();
                 return this;
@@ -41481,7 +43148,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeConfigRules(boolean value) {
                 includeConfigRules_ = value;
-                bitField0_ |= 0x00000020;
                 onChanged();
                 return this;
             }
@@ -41491,7 +43157,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeConfigRules() {
-                bitField0_ = (bitField0_ & ~0x00000020);
                 includeConfigRules_ = false;
                 onChanged();
                 return this;
@@ -41524,17 +43189,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public SliceFilter parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SliceFilter(input, extensionRegistry);
             }
         };
 
@@ -41613,6 +43268,70 @@ public final class ContextOuterClass {
             return new SliceEvent();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SliceEvent(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Event.Builder subBuilder = null;
+                                if (event_ != null) {
+                                    subBuilder = event_.toBuilder();
+                                }
+                                event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(event_);
+                                    event_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.SliceId.Builder subBuilder = null;
+                                if (sliceId_ != null) {
+                                    subBuilder = sliceId_.toBuilder();
+                                }
+                                sliceId_ = input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(sliceId_);
+                                    sliceId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_SliceEvent_descriptor;
         }
@@ -41649,7 +43368,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-            return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+            return getEvent();
         }
 
         public static final int SLICE_ID_FIELD_NUMBER = 2;
@@ -41679,7 +43398,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.SliceIdOrBuilder getSliceIdOrBuilder() {
-            return sliceId_ == null ? context.ContextOuterClass.SliceId.getDefaultInstance() : sliceId_;
+            return getSliceId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -41703,7 +43422,7 @@ public final class ContextOuterClass {
             if (sliceId_ != null) {
                 output.writeMessage(2, getSliceId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -41718,7 +43437,7 @@ public final class ContextOuterClass {
             if (sliceId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getSliceId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -41744,7 +43463,7 @@ public final class ContextOuterClass {
                 if (!getSliceId().equals(other.getSliceId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -41764,7 +43483,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SLICE_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getSliceId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -41858,24 +43577,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.SliceEvent.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                sliceId_ = null;
-                if (sliceIdBuilder_ != null) {
-                    sliceIdBuilder_.dispose();
+                if (sliceIdBuilder_ == null) {
+                    sliceId_ = null;
+                } else {
+                    sliceId_ = null;
                     sliceIdBuilder_ = null;
                 }
                 return this;
@@ -41903,21 +43630,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.SliceEvent buildPartial() {
                 context.ContextOuterClass.SliceEvent result = new context.ContextOuterClass.SliceEvent(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (eventBuilder_ == null) {
+                    result.event_ = event_;
+                } else {
+                    result.event_ = eventBuilder_.build();
+                }
+                if (sliceIdBuilder_ == null) {
+                    result.sliceId_ = sliceId_;
+                } else {
+                    result.sliceId_ = sliceIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.SliceEvent result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.event_ = eventBuilder_ == null ? event_ : eventBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.sliceId_ = sliceIdBuilder_ == null ? sliceId_ : sliceIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -41939,7 +43693,7 @@ public final class ContextOuterClass {
                 if (other.hasSliceId()) {
                     mergeSliceId(other.getSliceId());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -41951,54 +43705,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.SliceEvent parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEventFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getSliceIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.SliceEvent) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Event event_;
 
             private com.google.protobuf.SingleFieldBuilderV3 eventBuilder_;
@@ -42008,7 +43728,7 @@ public final class ContextOuterClass {
              * @return Whether the event field is set.
              */
             public boolean hasEvent() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return eventBuilder_ != null || event_ != null;
             }
 
             /**
@@ -42032,11 +43752,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     event_ = value;
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -42046,11 +43765,10 @@ public final class ContextOuterClass {
             public Builder setEvent(context.ContextOuterClass.Event.Builder builderForValue) {
                 if (eventBuilder_ == null) {
                     event_ = builderForValue.build();
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -42059,16 +43777,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEvent(context.ContextOuterClass.Event value) {
                 if (eventBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && event_ != null && event_ != context.ContextOuterClass.Event.getDefaultInstance()) {
-                        getEventBuilder().mergeFrom(value);
+                    if (event_ != null) {
+                        event_ = context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
                     } else {
                         event_ = value;
                     }
+                    onChanged();
                 } else {
                     eventBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -42076,13 +43793,13 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public Builder clearEvent() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                    onChanged();
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -42090,7 +43807,6 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public context.ContextOuterClass.Event.Builder getEventBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEventFieldBuilder().getBuilder();
             }
@@ -42126,7 +43842,7 @@ public final class ContextOuterClass {
              * @return Whether the sliceId field is set.
              */
             public boolean hasSliceId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return sliceIdBuilder_ != null || sliceId_ != null;
             }
 
             /**
@@ -42150,11 +43866,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     sliceId_ = value;
+                    onChanged();
                 } else {
                     sliceIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -42164,11 +43879,10 @@ public final class ContextOuterClass {
             public Builder setSliceId(context.ContextOuterClass.SliceId.Builder builderForValue) {
                 if (sliceIdBuilder_ == null) {
                     sliceId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     sliceIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -42177,16 +43891,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeSliceId(context.ContextOuterClass.SliceId value) {
                 if (sliceIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && sliceId_ != null && sliceId_ != context.ContextOuterClass.SliceId.getDefaultInstance()) {
-                        getSliceIdBuilder().mergeFrom(value);
+                    if (sliceId_ != null) {
+                        sliceId_ = context.ContextOuterClass.SliceId.newBuilder(sliceId_).mergeFrom(value).buildPartial();
                     } else {
                         sliceId_ = value;
                     }
+                    onChanged();
                 } else {
                     sliceIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -42194,13 +43907,13 @@ public final class ContextOuterClass {
              * .context.SliceId slice_id = 2;
              */
             public Builder clearSliceId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                sliceId_ = null;
-                if (sliceIdBuilder_ != null) {
-                    sliceIdBuilder_.dispose();
+                if (sliceIdBuilder_ == null) {
+                    sliceId_ = null;
+                    onChanged();
+                } else {
+                    sliceId_ = null;
                     sliceIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -42208,7 +43921,6 @@ public final class ContextOuterClass {
              * .context.SliceId slice_id = 2;
              */
             public context.ContextOuterClass.SliceId.Builder getSliceIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getSliceIdFieldBuilder().getBuilder();
             }
@@ -42262,17 +43974,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public SliceEvent parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SliceEvent(input, extensionRegistry);
             }
         };
 
@@ -42338,6 +44040,57 @@ public final class ContextOuterClass {
             return new ConnectionId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (connectionUuid_ != null) {
+                                    subBuilder = connectionUuid_.toBuilder();
+                                }
+                                connectionUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(connectionUuid_);
+                                    connectionUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionId_descriptor;
         }
@@ -42374,7 +44127,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getConnectionUuidOrBuilder() {
-            return connectionUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : connectionUuid_;
+            return getConnectionUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -42395,7 +44148,7 @@ public final class ContextOuterClass {
             if (connectionUuid_ != null) {
                 output.writeMessage(1, getConnectionUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -42407,7 +44160,7 @@ public final class ContextOuterClass {
             if (connectionUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getConnectionUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -42427,7 +44180,7 @@ public final class ContextOuterClass {
                 if (!getConnectionUuid().equals(other.getConnectionUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -42443,7 +44196,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONNECTION_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getConnectionUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -42541,19 +44294,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                connectionUuid_ = null;
-                if (connectionUuidBuilder_ != null) {
-                    connectionUuidBuilder_.dispose();
+                if (connectionUuidBuilder_ == null) {
+                    connectionUuid_ = null;
+                } else {
+                    connectionUuid_ = null;
                     connectionUuidBuilder_ = null;
                 }
                 return this;
@@ -42581,18 +44341,43 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionId buildPartial() {
                 context.ContextOuterClass.ConnectionId result = new context.ContextOuterClass.ConnectionId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (connectionUuidBuilder_ == null) {
+                    result.connectionUuid_ = connectionUuid_;
+                } else {
+                    result.connectionUuid_ = connectionUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.connectionUuid_ = connectionUuidBuilder_ == null ? connectionUuid_ : connectionUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -42611,7 +44396,7 @@ public final class ContextOuterClass {
                 if (other.hasConnectionUuid()) {
                     mergeConnectionUuid(other.getConnectionUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -42623,47 +44408,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getConnectionUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid connectionUuid_;
 
             private com.google.protobuf.SingleFieldBuilderV3 connectionUuidBuilder_;
@@ -42673,7 +44431,7 @@ public final class ContextOuterClass {
              * @return Whether the connectionUuid field is set.
              */
             public boolean hasConnectionUuid() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return connectionUuidBuilder_ != null || connectionUuid_ != null;
             }
 
             /**
@@ -42697,11 +44455,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     connectionUuid_ = value;
+                    onChanged();
                 } else {
                     connectionUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -42711,11 +44468,10 @@ public final class ContextOuterClass {
             public Builder setConnectionUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (connectionUuidBuilder_ == null) {
                     connectionUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     connectionUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -42724,16 +44480,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeConnectionUuid(context.ContextOuterClass.Uuid value) {
                 if (connectionUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && connectionUuid_ != null && connectionUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getConnectionUuidBuilder().mergeFrom(value);
+                    if (connectionUuid_ != null) {
+                        connectionUuid_ = context.ContextOuterClass.Uuid.newBuilder(connectionUuid_).mergeFrom(value).buildPartial();
                     } else {
                         connectionUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     connectionUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -42741,13 +44496,13 @@ public final class ContextOuterClass {
              * .context.Uuid connection_uuid = 1;
              */
             public Builder clearConnectionUuid() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                connectionUuid_ = null;
-                if (connectionUuidBuilder_ != null) {
-                    connectionUuidBuilder_.dispose();
+                if (connectionUuidBuilder_ == null) {
+                    connectionUuid_ = null;
+                    onChanged();
+                } else {
+                    connectionUuid_ = null;
                     connectionUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -42755,7 +44510,6 @@ public final class ContextOuterClass {
              * .context.Uuid connection_uuid = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getConnectionUuidBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getConnectionUuidFieldBuilder().getBuilder();
             }
@@ -42809,17 +44563,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionId(input, extensionRegistry);
             }
         };
 
@@ -42877,6 +44621,50 @@ public final class ContextOuterClass {
             return new ConnectionSettings_L0();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionSettings_L0(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                lspSymbolicName_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionSettings_L0_descriptor;
         }
@@ -42888,8 +44676,7 @@ public final class ContextOuterClass {
 
         public static final int LSP_SYMBOLIC_NAME_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object lspSymbolicName_ = "";
+        private volatile java.lang.Object lspSymbolicName_;
 
         /**
          * string lsp_symbolic_name = 1;
@@ -42939,10 +44726,10 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(lspSymbolicName_)) {
+            if (!getLspSymbolicNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, lspSymbolicName_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -42951,10 +44738,10 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(lspSymbolicName_)) {
+            if (!getLspSymbolicNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, lspSymbolicName_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -42970,7 +44757,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.ConnectionSettings_L0 other = (context.ContextOuterClass.ConnectionSettings_L0) obj;
             if (!getLspSymbolicName().equals(other.getLspSymbolicName()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -42984,7 +44771,7 @@ public final class ContextOuterClass {
             hash = (19 * hash) + getDescriptor().hashCode();
             hash = (37 * hash) + LSP_SYMBOLIC_NAME_FIELD_NUMBER;
             hash = (53 * hash) + getLspSymbolicName().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -43078,16 +44865,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionSettings_L0.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 lspSymbolicName_ = "";
                 return this;
             }
@@ -43114,18 +44907,39 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionSettings_L0 buildPartial() {
                 context.ContextOuterClass.ConnectionSettings_L0 result = new context.ContextOuterClass.ConnectionSettings_L0(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.lspSymbolicName_ = lspSymbolicName_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionSettings_L0 result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.lspSymbolicName_ = lspSymbolicName_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -43143,10 +44957,9 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getLspSymbolicName().isEmpty()) {
                     lspSymbolicName_ = other.lspSymbolicName_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -43158,47 +44971,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionSettings_L0 parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    lspSymbolicName_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionSettings_L0) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private java.lang.Object lspSymbolicName_ = "";
 
             /**
@@ -43242,7 +45028,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 lspSymbolicName_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -43253,7 +45038,6 @@ public final class ContextOuterClass {
              */
             public Builder clearLspSymbolicName() {
                 lspSymbolicName_ = getDefaultInstance().getLspSymbolicName();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -43269,7 +45053,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 lspSymbolicName_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -43301,17 +45084,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionSettings_L0 parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionSettings_L0(input, extensionRegistry);
             }
         };
 
@@ -43406,6 +45179,76 @@ public final class ContextOuterClass {
             return new ConnectionSettings_L2();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionSettings_L2(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                srcMacAddress_ = s;
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                dstMacAddress_ = s;
+                                break;
+                            }
+                        case 24:
+                            {
+                                etherType_ = input.readUInt32();
+                                break;
+                            }
+                        case 32:
+                            {
+                                vlanId_ = input.readUInt32();
+                                break;
+                            }
+                        case 40:
+                            {
+                                mplsLabel_ = input.readUInt32();
+                                break;
+                            }
+                        case 48:
+                            {
+                                mplsTrafficClass_ = input.readUInt32();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionSettings_L2_descriptor;
         }
@@ -43417,8 +45260,7 @@ public final class ContextOuterClass {
 
         public static final int SRC_MAC_ADDRESS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object srcMacAddress_ = "";
+        private volatile java.lang.Object srcMacAddress_;
 
         /**
          * string src_mac_address = 1;
@@ -43455,8 +45297,7 @@ public final class ContextOuterClass {
 
         public static final int DST_MAC_ADDRESS_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object dstMacAddress_ = "";
+        private volatile java.lang.Object dstMacAddress_;
 
         /**
          * string dst_mac_address = 2;
@@ -43493,7 +45334,7 @@ public final class ContextOuterClass {
 
         public static final int ETHER_TYPE_FIELD_NUMBER = 3;
 
-        private int etherType_ = 0;
+        private int etherType_;
 
         /**
          * uint32 ether_type = 3;
@@ -43506,7 +45347,7 @@ public final class ContextOuterClass {
 
         public static final int VLAN_ID_FIELD_NUMBER = 4;
 
-        private int vlanId_ = 0;
+        private int vlanId_;
 
         /**
          * uint32 vlan_id = 4;
@@ -43519,7 +45360,7 @@ public final class ContextOuterClass {
 
         public static final int MPLS_LABEL_FIELD_NUMBER = 5;
 
-        private int mplsLabel_ = 0;
+        private int mplsLabel_;
 
         /**
          * uint32 mpls_label = 5;
@@ -43532,7 +45373,7 @@ public final class ContextOuterClass {
 
         public static final int MPLS_TRAFFIC_CLASS_FIELD_NUMBER = 6;
 
-        private int mplsTrafficClass_ = 0;
+        private int mplsTrafficClass_;
 
         /**
          * uint32 mpls_traffic_class = 6;
@@ -43558,10 +45399,10 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcMacAddress_)) {
+            if (!getSrcMacAddressBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, srcMacAddress_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstMacAddress_)) {
+            if (!getDstMacAddressBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, dstMacAddress_);
             }
             if (etherType_ != 0) {
@@ -43576,7 +45417,7 @@ public final class ContextOuterClass {
             if (mplsTrafficClass_ != 0) {
                 output.writeUInt32(6, mplsTrafficClass_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -43585,10 +45426,10 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcMacAddress_)) {
+            if (!getSrcMacAddressBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, srcMacAddress_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstMacAddress_)) {
+            if (!getDstMacAddressBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, dstMacAddress_);
             }
             if (etherType_ != 0) {
@@ -43603,7 +45444,7 @@ public final class ContextOuterClass {
             if (mplsTrafficClass_ != 0) {
                 size += com.google.protobuf.CodedOutputStream.computeUInt32Size(6, mplsTrafficClass_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -43629,7 +45470,7 @@ public final class ContextOuterClass {
                 return false;
             if (getMplsTrafficClass() != other.getMplsTrafficClass())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -43653,7 +45494,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + getMplsLabel();
             hash = (37 * hash) + MPLS_TRAFFIC_CLASS_FIELD_NUMBER;
             hash = (53 * hash) + getMplsTrafficClass();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -43747,16 +45588,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionSettings_L2.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 srcMacAddress_ = "";
                 dstMacAddress_ = "";
                 etherType_ = 0;
@@ -43788,33 +45635,44 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionSettings_L2 buildPartial() {
                 context.ContextOuterClass.ConnectionSettings_L2 result = new context.ContextOuterClass.ConnectionSettings_L2(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.srcMacAddress_ = srcMacAddress_;
+                result.dstMacAddress_ = dstMacAddress_;
+                result.etherType_ = etherType_;
+                result.vlanId_ = vlanId_;
+                result.mplsLabel_ = mplsLabel_;
+                result.mplsTrafficClass_ = mplsTrafficClass_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionSettings_L2 result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.srcMacAddress_ = srcMacAddress_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.dstMacAddress_ = dstMacAddress_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.etherType_ = etherType_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.vlanId_ = vlanId_;
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.mplsLabel_ = mplsLabel_;
-                }
-                if (((from_bitField0_ & 0x00000020) != 0)) {
-                    result.mplsTrafficClass_ = mplsTrafficClass_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -43832,12 +45690,10 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getSrcMacAddress().isEmpty()) {
                     srcMacAddress_ = other.srcMacAddress_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
                 if (!other.getDstMacAddress().isEmpty()) {
                     dstMacAddress_ = other.dstMacAddress_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (other.getEtherType() != 0) {
@@ -43852,7 +45708,7 @@ public final class ContextOuterClass {
                 if (other.getMplsTrafficClass() != 0) {
                     setMplsTrafficClass(other.getMplsTrafficClass());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -43864,82 +45720,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionSettings_L2 parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    srcMacAddress_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    dstMacAddress_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 24:
-                                {
-                                    etherType_ = input.readUInt32();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 32:
-                                {
-                                    vlanId_ = input.readUInt32();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 32
-                            case 40:
-                                {
-                                    mplsLabel_ = input.readUInt32();
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 40
-                            case 48:
-                                {
-                                    mplsTrafficClass_ = input.readUInt32();
-                                    bitField0_ |= 0x00000020;
-                                    break;
-                                }
-                            // case 48
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionSettings_L2) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private java.lang.Object srcMacAddress_ = "";
 
             /**
@@ -43983,7 +45777,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 srcMacAddress_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -43994,7 +45787,6 @@ public final class ContextOuterClass {
              */
             public Builder clearSrcMacAddress() {
                 srcMacAddress_ = getDefaultInstance().getSrcMacAddress();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -44010,7 +45802,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 srcMacAddress_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -44058,7 +45849,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 dstMacAddress_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -44069,7 +45859,6 @@ public final class ContextOuterClass {
              */
             public Builder clearDstMacAddress() {
                 dstMacAddress_ = getDefaultInstance().getDstMacAddress();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -44085,7 +45874,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 dstMacAddress_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -44108,7 +45896,6 @@ public final class ContextOuterClass {
              */
             public Builder setEtherType(int value) {
                 etherType_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -44118,7 +45905,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearEtherType() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 etherType_ = 0;
                 onChanged();
                 return this;
@@ -44142,7 +45928,6 @@ public final class ContextOuterClass {
              */
             public Builder setVlanId(int value) {
                 vlanId_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -44152,7 +45937,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearVlanId() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 vlanId_ = 0;
                 onChanged();
                 return this;
@@ -44176,7 +45960,6 @@ public final class ContextOuterClass {
              */
             public Builder setMplsLabel(int value) {
                 mplsLabel_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -44186,7 +45969,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearMplsLabel() {
-                bitField0_ = (bitField0_ & ~0x00000010);
                 mplsLabel_ = 0;
                 onChanged();
                 return this;
@@ -44210,7 +45992,6 @@ public final class ContextOuterClass {
              */
             public Builder setMplsTrafficClass(int value) {
                 mplsTrafficClass_ = value;
-                bitField0_ |= 0x00000020;
                 onChanged();
                 return this;
             }
@@ -44220,7 +46001,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearMplsTrafficClass() {
-                bitField0_ = (bitField0_ & ~0x00000020);
                 mplsTrafficClass_ = 0;
                 onChanged();
                 return this;
@@ -44253,17 +46033,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionSettings_L2 parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionSettings_L2(input, extensionRegistry);
             }
         };
 
@@ -44352,6 +46122,71 @@ public final class ContextOuterClass {
             return new ConnectionSettings_L3();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionSettings_L3(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                srcIpAddress_ = s;
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                dstIpAddress_ = s;
+                                break;
+                            }
+                        case 24:
+                            {
+                                dscp_ = input.readUInt32();
+                                break;
+                            }
+                        case 32:
+                            {
+                                protocol_ = input.readUInt32();
+                                break;
+                            }
+                        case 40:
+                            {
+                                ttl_ = input.readUInt32();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionSettings_L3_descriptor;
         }
@@ -44363,8 +46198,7 @@ public final class ContextOuterClass {
 
         public static final int SRC_IP_ADDRESS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object srcIpAddress_ = "";
+        private volatile java.lang.Object srcIpAddress_;
 
         /**
          * string src_ip_address = 1;
@@ -44401,8 +46235,7 @@ public final class ContextOuterClass {
 
         public static final int DST_IP_ADDRESS_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object dstIpAddress_ = "";
+        private volatile java.lang.Object dstIpAddress_;
 
         /**
          * string dst_ip_address = 2;
@@ -44439,7 +46272,7 @@ public final class ContextOuterClass {
 
         public static final int DSCP_FIELD_NUMBER = 3;
 
-        private int dscp_ = 0;
+        private int dscp_;
 
         /**
          * uint32 dscp = 3;
@@ -44452,7 +46285,7 @@ public final class ContextOuterClass {
 
         public static final int PROTOCOL_FIELD_NUMBER = 4;
 
-        private int protocol_ = 0;
+        private int protocol_;
 
         /**
          * uint32 protocol = 4;
@@ -44465,7 +46298,7 @@ public final class ContextOuterClass {
 
         public static final int TTL_FIELD_NUMBER = 5;
 
-        private int ttl_ = 0;
+        private int ttl_;
 
         /**
          * uint32 ttl = 5;
@@ -44491,10 +46324,10 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcIpAddress_)) {
+            if (!getSrcIpAddressBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, srcIpAddress_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstIpAddress_)) {
+            if (!getDstIpAddressBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, dstIpAddress_);
             }
             if (dscp_ != 0) {
@@ -44506,7 +46339,7 @@ public final class ContextOuterClass {
             if (ttl_ != 0) {
                 output.writeUInt32(5, ttl_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -44515,10 +46348,10 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcIpAddress_)) {
+            if (!getSrcIpAddressBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, srcIpAddress_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstIpAddress_)) {
+            if (!getDstIpAddressBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, dstIpAddress_);
             }
             if (dscp_ != 0) {
@@ -44530,7 +46363,7 @@ public final class ContextOuterClass {
             if (ttl_ != 0) {
                 size += com.google.protobuf.CodedOutputStream.computeUInt32Size(5, ttl_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -44554,7 +46387,7 @@ public final class ContextOuterClass {
                 return false;
             if (getTtl() != other.getTtl())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -44576,7 +46409,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + getProtocol();
             hash = (37 * hash) + TTL_FIELD_NUMBER;
             hash = (53 * hash) + getTtl();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -44670,16 +46503,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionSettings_L3.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 srcIpAddress_ = "";
                 dstIpAddress_ = "";
                 dscp_ = 0;
@@ -44710,30 +46549,43 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionSettings_L3 buildPartial() {
                 context.ContextOuterClass.ConnectionSettings_L3 result = new context.ContextOuterClass.ConnectionSettings_L3(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.srcIpAddress_ = srcIpAddress_;
+                result.dstIpAddress_ = dstIpAddress_;
+                result.dscp_ = dscp_;
+                result.protocol_ = protocol_;
+                result.ttl_ = ttl_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionSettings_L3 result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.srcIpAddress_ = srcIpAddress_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.dstIpAddress_ = dstIpAddress_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.dscp_ = dscp_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.protocol_ = protocol_;
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.ttl_ = ttl_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -44751,12 +46603,10 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getSrcIpAddress().isEmpty()) {
                     srcIpAddress_ = other.srcIpAddress_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
                 if (!other.getDstIpAddress().isEmpty()) {
                     dstIpAddress_ = other.dstIpAddress_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (other.getDscp() != 0) {
@@ -44768,7 +46618,7 @@ public final class ContextOuterClass {
                 if (other.getTtl() != 0) {
                     setTtl(other.getTtl());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -44780,75 +46630,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionSettings_L3 parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    srcIpAddress_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    dstIpAddress_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 24:
-                                {
-                                    dscp_ = input.readUInt32();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 32:
-                                {
-                                    protocol_ = input.readUInt32();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 32
-                            case 40:
-                                {
-                                    ttl_ = input.readUInt32();
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 40
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionSettings_L3) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private java.lang.Object srcIpAddress_ = "";
 
             /**
@@ -44892,7 +46687,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 srcIpAddress_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -44903,7 +46697,6 @@ public final class ContextOuterClass {
              */
             public Builder clearSrcIpAddress() {
                 srcIpAddress_ = getDefaultInstance().getSrcIpAddress();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -44919,7 +46712,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 srcIpAddress_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -44967,7 +46759,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 dstIpAddress_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -44978,7 +46769,6 @@ public final class ContextOuterClass {
              */
             public Builder clearDstIpAddress() {
                 dstIpAddress_ = getDefaultInstance().getDstIpAddress();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -44994,7 +46784,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 dstIpAddress_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -45017,7 +46806,6 @@ public final class ContextOuterClass {
              */
             public Builder setDscp(int value) {
                 dscp_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -45027,7 +46815,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearDscp() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 dscp_ = 0;
                 onChanged();
                 return this;
@@ -45051,7 +46838,6 @@ public final class ContextOuterClass {
              */
             public Builder setProtocol(int value) {
                 protocol_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -45061,7 +46847,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearProtocol() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 protocol_ = 0;
                 onChanged();
                 return this;
@@ -45085,7 +46870,6 @@ public final class ContextOuterClass {
              */
             public Builder setTtl(int value) {
                 ttl_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -45095,7 +46879,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearTtl() {
-                bitField0_ = (bitField0_ & ~0x00000010);
                 ttl_ = 0;
                 onChanged();
                 return this;
@@ -45128,17 +46911,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionSettings_L3 parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionSettings_L3(input, extensionRegistry);
             }
         };
 
@@ -45207,6 +46980,64 @@ public final class ContextOuterClass {
             return new ConnectionSettings_L4();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionSettings_L4(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                srcPort_ = input.readUInt32();
+                                break;
+                            }
+                        case 16:
+                            {
+                                dstPort_ = input.readUInt32();
+                                break;
+                            }
+                        case 24:
+                            {
+                                tcpFlags_ = input.readUInt32();
+                                break;
+                            }
+                        case 32:
+                            {
+                                ttl_ = input.readUInt32();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionSettings_L4_descriptor;
         }
@@ -45218,7 +47049,7 @@ public final class ContextOuterClass {
 
         public static final int SRC_PORT_FIELD_NUMBER = 1;
 
-        private int srcPort_ = 0;
+        private int srcPort_;
 
         /**
          * uint32 src_port = 1;
@@ -45231,7 +47062,7 @@ public final class ContextOuterClass {
 
         public static final int DST_PORT_FIELD_NUMBER = 2;
 
-        private int dstPort_ = 0;
+        private int dstPort_;
 
         /**
          * uint32 dst_port = 2;
@@ -45244,7 +47075,7 @@ public final class ContextOuterClass {
 
         public static final int TCP_FLAGS_FIELD_NUMBER = 3;
 
-        private int tcpFlags_ = 0;
+        private int tcpFlags_;
 
         /**
          * uint32 tcp_flags = 3;
@@ -45257,7 +47088,7 @@ public final class ContextOuterClass {
 
         public static final int TTL_FIELD_NUMBER = 4;
 
-        private int ttl_ = 0;
+        private int ttl_;
 
         /**
          * uint32 ttl = 4;
@@ -45295,7 +47126,7 @@ public final class ContextOuterClass {
             if (ttl_ != 0) {
                 output.writeUInt32(4, ttl_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -45316,7 +47147,7 @@ public final class ContextOuterClass {
             if (ttl_ != 0) {
                 size += com.google.protobuf.CodedOutputStream.computeUInt32Size(4, ttl_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -45338,7 +47169,7 @@ public final class ContextOuterClass {
                 return false;
             if (getTtl() != other.getTtl())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -45358,7 +47189,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + getTcpFlags();
             hash = (37 * hash) + TTL_FIELD_NUMBER;
             hash = (53 * hash) + getTtl();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -45452,16 +47283,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionSettings_L4.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 srcPort_ = 0;
                 dstPort_ = 0;
                 tcpFlags_ = 0;
@@ -45491,27 +47328,42 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionSettings_L4 buildPartial() {
                 context.ContextOuterClass.ConnectionSettings_L4 result = new context.ContextOuterClass.ConnectionSettings_L4(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.srcPort_ = srcPort_;
+                result.dstPort_ = dstPort_;
+                result.tcpFlags_ = tcpFlags_;
+                result.ttl_ = ttl_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionSettings_L4 result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.srcPort_ = srcPort_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.dstPort_ = dstPort_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.tcpFlags_ = tcpFlags_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.ttl_ = ttl_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -45539,7 +47391,7 @@ public final class ContextOuterClass {
                 if (other.getTtl() != 0) {
                     setTtl(other.getTtl());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -45551,68 +47403,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionSettings_L4 parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    srcPort_ = input.readUInt32();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            case 16:
-                                {
-                                    dstPort_ = input.readUInt32();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            case 24:
-                                {
-                                    tcpFlags_ = input.readUInt32();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 32:
-                                {
-                                    ttl_ = input.readUInt32();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 32
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionSettings_L4) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private int srcPort_;
 
             /**
@@ -45631,7 +47435,6 @@ public final class ContextOuterClass {
              */
             public Builder setSrcPort(int value) {
                 srcPort_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -45641,7 +47444,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearSrcPort() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 srcPort_ = 0;
                 onChanged();
                 return this;
@@ -45665,7 +47467,6 @@ public final class ContextOuterClass {
              */
             public Builder setDstPort(int value) {
                 dstPort_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -45675,7 +47476,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearDstPort() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 dstPort_ = 0;
                 onChanged();
                 return this;
@@ -45699,7 +47499,6 @@ public final class ContextOuterClass {
              */
             public Builder setTcpFlags(int value) {
                 tcpFlags_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -45709,7 +47508,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearTcpFlags() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 tcpFlags_ = 0;
                 onChanged();
                 return this;
@@ -45733,7 +47531,6 @@ public final class ContextOuterClass {
              */
             public Builder setTtl(int value) {
                 ttl_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -45743,7 +47540,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearTtl() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 ttl_ = 0;
                 onChanged();
                 return this;
@@ -45776,17 +47572,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionSettings_L4 parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionSettings_L4(input, extensionRegistry);
             }
         };
 
@@ -45899,6 +47685,96 @@ public final class ContextOuterClass {
             return new ConnectionSettings();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionSettings(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ConnectionSettings_L0.Builder subBuilder = null;
+                                if (l0_ != null) {
+                                    subBuilder = l0_.toBuilder();
+                                }
+                                l0_ = input.readMessage(context.ContextOuterClass.ConnectionSettings_L0.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(l0_);
+                                    l0_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.ConnectionSettings_L2.Builder subBuilder = null;
+                                if (l2_ != null) {
+                                    subBuilder = l2_.toBuilder();
+                                }
+                                l2_ = input.readMessage(context.ContextOuterClass.ConnectionSettings_L2.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(l2_);
+                                    l2_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 26:
+                            {
+                                context.ContextOuterClass.ConnectionSettings_L3.Builder subBuilder = null;
+                                if (l3_ != null) {
+                                    subBuilder = l3_.toBuilder();
+                                }
+                                l3_ = input.readMessage(context.ContextOuterClass.ConnectionSettings_L3.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(l3_);
+                                    l3_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 34:
+                            {
+                                context.ContextOuterClass.ConnectionSettings_L4.Builder subBuilder = null;
+                                if (l4_ != null) {
+                                    subBuilder = l4_.toBuilder();
+                                }
+                                l4_ = input.readMessage(context.ContextOuterClass.ConnectionSettings_L4.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(l4_);
+                                    l4_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionSettings_descriptor;
         }
@@ -45935,7 +47811,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConnectionSettings_L0OrBuilder getL0OrBuilder() {
-            return l0_ == null ? context.ContextOuterClass.ConnectionSettings_L0.getDefaultInstance() : l0_;
+            return getL0();
         }
 
         public static final int L2_FIELD_NUMBER = 2;
@@ -45965,7 +47841,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConnectionSettings_L2OrBuilder getL2OrBuilder() {
-            return l2_ == null ? context.ContextOuterClass.ConnectionSettings_L2.getDefaultInstance() : l2_;
+            return getL2();
         }
 
         public static final int L3_FIELD_NUMBER = 3;
@@ -45995,7 +47871,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConnectionSettings_L3OrBuilder getL3OrBuilder() {
-            return l3_ == null ? context.ContextOuterClass.ConnectionSettings_L3.getDefaultInstance() : l3_;
+            return getL3();
         }
 
         public static final int L4_FIELD_NUMBER = 4;
@@ -46025,7 +47901,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConnectionSettings_L4OrBuilder getL4OrBuilder() {
-            return l4_ == null ? context.ContextOuterClass.ConnectionSettings_L4.getDefaultInstance() : l4_;
+            return getL4();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -46055,7 +47931,7 @@ public final class ContextOuterClass {
             if (l4_ != null) {
                 output.writeMessage(4, getL4());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -46076,7 +47952,7 @@ public final class ContextOuterClass {
             if (l4_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, getL4());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -46114,7 +47990,7 @@ public final class ContextOuterClass {
                 if (!getL4().equals(other.getL4()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -46142,7 +48018,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + L4_FIELD_NUMBER;
                 hash = (53 * hash) + getL4().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -46236,34 +48112,44 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionSettings.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                l0_ = null;
-                if (l0Builder_ != null) {
-                    l0Builder_.dispose();
+                if (l0Builder_ == null) {
+                    l0_ = null;
+                } else {
+                    l0_ = null;
                     l0Builder_ = null;
                 }
-                l2_ = null;
-                if (l2Builder_ != null) {
-                    l2Builder_.dispose();
+                if (l2Builder_ == null) {
+                    l2_ = null;
+                } else {
+                    l2_ = null;
                     l2Builder_ = null;
                 }
-                l3_ = null;
-                if (l3Builder_ != null) {
-                    l3Builder_.dispose();
+                if (l3Builder_ == null) {
+                    l3_ = null;
+                } else {
+                    l3_ = null;
                     l3Builder_ = null;
                 }
-                l4_ = null;
-                if (l4Builder_ != null) {
-                    l4Builder_.dispose();
+                if (l4Builder_ == null) {
+                    l4_ = null;
+                } else {
+                    l4_ = null;
                     l4Builder_ = null;
                 }
                 return this;
@@ -46291,27 +48177,58 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionSettings buildPartial() {
                 context.ContextOuterClass.ConnectionSettings result = new context.ContextOuterClass.ConnectionSettings(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (l0Builder_ == null) {
+                    result.l0_ = l0_;
+                } else {
+                    result.l0_ = l0Builder_.build();
+                }
+                if (l2Builder_ == null) {
+                    result.l2_ = l2_;
+                } else {
+                    result.l2_ = l2Builder_.build();
+                }
+                if (l3Builder_ == null) {
+                    result.l3_ = l3_;
+                } else {
+                    result.l3_ = l3Builder_.build();
+                }
+                if (l4Builder_ == null) {
+                    result.l4_ = l4_;
+                } else {
+                    result.l4_ = l4Builder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionSettings result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.l0_ = l0Builder_ == null ? l0_ : l0Builder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.l2_ = l2Builder_ == null ? l2_ : l2Builder_.build();
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.l3_ = l3Builder_ == null ? l3_ : l3Builder_.build();
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.l4_ = l4Builder_ == null ? l4_ : l4Builder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -46339,7 +48256,7 @@ public final class ContextOuterClass {
                 if (other.hasL4()) {
                     mergeL4(other.getL4());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -46351,68 +48268,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionSettings parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getL0FieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getL2FieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getL3FieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    input.readMessage(getL4FieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 34
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionSettings) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.ConnectionSettings_L0 l0_;
 
             private com.google.protobuf.SingleFieldBuilderV3 l0Builder_;
@@ -46422,7 +48291,7 @@ public final class ContextOuterClass {
              * @return Whether the l0 field is set.
              */
             public boolean hasL0() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return l0Builder_ != null || l0_ != null;
             }
 
             /**
@@ -46446,11 +48315,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     l0_ = value;
+                    onChanged();
                 } else {
                     l0Builder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -46460,11 +48328,10 @@ public final class ContextOuterClass {
             public Builder setL0(context.ContextOuterClass.ConnectionSettings_L0.Builder builderForValue) {
                 if (l0Builder_ == null) {
                     l0_ = builderForValue.build();
+                    onChanged();
                 } else {
                     l0Builder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -46473,16 +48340,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeL0(context.ContextOuterClass.ConnectionSettings_L0 value) {
                 if (l0Builder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && l0_ != null && l0_ != context.ContextOuterClass.ConnectionSettings_L0.getDefaultInstance()) {
-                        getL0Builder().mergeFrom(value);
+                    if (l0_ != null) {
+                        l0_ = context.ContextOuterClass.ConnectionSettings_L0.newBuilder(l0_).mergeFrom(value).buildPartial();
                     } else {
                         l0_ = value;
                     }
+                    onChanged();
                 } else {
                     l0Builder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -46490,13 +48356,13 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings_L0 l0 = 1;
              */
             public Builder clearL0() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                l0_ = null;
-                if (l0Builder_ != null) {
-                    l0Builder_.dispose();
+                if (l0Builder_ == null) {
+                    l0_ = null;
+                    onChanged();
+                } else {
+                    l0_ = null;
                     l0Builder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -46504,7 +48370,6 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings_L0 l0 = 1;
              */
             public context.ContextOuterClass.ConnectionSettings_L0.Builder getL0Builder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getL0FieldBuilder().getBuilder();
             }
@@ -46540,7 +48405,7 @@ public final class ContextOuterClass {
              * @return Whether the l2 field is set.
              */
             public boolean hasL2() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return l2Builder_ != null || l2_ != null;
             }
 
             /**
@@ -46564,11 +48429,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     l2_ = value;
+                    onChanged();
                 } else {
                     l2Builder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -46578,11 +48442,10 @@ public final class ContextOuterClass {
             public Builder setL2(context.ContextOuterClass.ConnectionSettings_L2.Builder builderForValue) {
                 if (l2Builder_ == null) {
                     l2_ = builderForValue.build();
+                    onChanged();
                 } else {
                     l2Builder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -46591,16 +48454,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeL2(context.ContextOuterClass.ConnectionSettings_L2 value) {
                 if (l2Builder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && l2_ != null && l2_ != context.ContextOuterClass.ConnectionSettings_L2.getDefaultInstance()) {
-                        getL2Builder().mergeFrom(value);
+                    if (l2_ != null) {
+                        l2_ = context.ContextOuterClass.ConnectionSettings_L2.newBuilder(l2_).mergeFrom(value).buildPartial();
                     } else {
                         l2_ = value;
                     }
+                    onChanged();
                 } else {
                     l2Builder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -46608,13 +48470,13 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings_L2 l2 = 2;
              */
             public Builder clearL2() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                l2_ = null;
-                if (l2Builder_ != null) {
-                    l2Builder_.dispose();
+                if (l2Builder_ == null) {
+                    l2_ = null;
+                    onChanged();
+                } else {
+                    l2_ = null;
                     l2Builder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -46622,7 +48484,6 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings_L2 l2 = 2;
              */
             public context.ContextOuterClass.ConnectionSettings_L2.Builder getL2Builder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getL2FieldBuilder().getBuilder();
             }
@@ -46658,7 +48519,7 @@ public final class ContextOuterClass {
              * @return Whether the l3 field is set.
              */
             public boolean hasL3() {
-                return ((bitField0_ & 0x00000004) != 0);
+                return l3Builder_ != null || l3_ != null;
             }
 
             /**
@@ -46682,11 +48543,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     l3_ = value;
+                    onChanged();
                 } else {
                     l3Builder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -46696,11 +48556,10 @@ public final class ContextOuterClass {
             public Builder setL3(context.ContextOuterClass.ConnectionSettings_L3.Builder builderForValue) {
                 if (l3Builder_ == null) {
                     l3_ = builderForValue.build();
+                    onChanged();
                 } else {
                     l3Builder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -46709,16 +48568,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeL3(context.ContextOuterClass.ConnectionSettings_L3 value) {
                 if (l3Builder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0) && l3_ != null && l3_ != context.ContextOuterClass.ConnectionSettings_L3.getDefaultInstance()) {
-                        getL3Builder().mergeFrom(value);
+                    if (l3_ != null) {
+                        l3_ = context.ContextOuterClass.ConnectionSettings_L3.newBuilder(l3_).mergeFrom(value).buildPartial();
                     } else {
                         l3_ = value;
                     }
+                    onChanged();
                 } else {
                     l3Builder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -46726,13 +48584,13 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings_L3 l3 = 3;
              */
             public Builder clearL3() {
-                bitField0_ = (bitField0_ & ~0x00000004);
-                l3_ = null;
-                if (l3Builder_ != null) {
-                    l3Builder_.dispose();
+                if (l3Builder_ == null) {
+                    l3_ = null;
+                    onChanged();
+                } else {
+                    l3_ = null;
                     l3Builder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -46740,7 +48598,6 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings_L3 l3 = 3;
              */
             public context.ContextOuterClass.ConnectionSettings_L3.Builder getL3Builder() {
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return getL3FieldBuilder().getBuilder();
             }
@@ -46776,7 +48633,7 @@ public final class ContextOuterClass {
              * @return Whether the l4 field is set.
              */
             public boolean hasL4() {
-                return ((bitField0_ & 0x00000008) != 0);
+                return l4Builder_ != null || l4_ != null;
             }
 
             /**
@@ -46800,11 +48657,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     l4_ = value;
+                    onChanged();
                 } else {
                     l4Builder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -46814,11 +48670,10 @@ public final class ContextOuterClass {
             public Builder setL4(context.ContextOuterClass.ConnectionSettings_L4.Builder builderForValue) {
                 if (l4Builder_ == null) {
                     l4_ = builderForValue.build();
+                    onChanged();
                 } else {
                     l4Builder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -46827,16 +48682,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeL4(context.ContextOuterClass.ConnectionSettings_L4 value) {
                 if (l4Builder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0) && l4_ != null && l4_ != context.ContextOuterClass.ConnectionSettings_L4.getDefaultInstance()) {
-                        getL4Builder().mergeFrom(value);
+                    if (l4_ != null) {
+                        l4_ = context.ContextOuterClass.ConnectionSettings_L4.newBuilder(l4_).mergeFrom(value).buildPartial();
                     } else {
                         l4_ = value;
                     }
+                    onChanged();
                 } else {
                     l4Builder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -46844,13 +48698,13 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings_L4 l4 = 4;
              */
             public Builder clearL4() {
-                bitField0_ = (bitField0_ & ~0x00000008);
-                l4_ = null;
-                if (l4Builder_ != null) {
-                    l4Builder_.dispose();
+                if (l4Builder_ == null) {
+                    l4_ = null;
+                    onChanged();
+                } else {
+                    l4_ = null;
                     l4Builder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -46858,7 +48712,6 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings_L4 l4 = 4;
              */
             public context.ContextOuterClass.ConnectionSettings_L4.Builder getL4Builder() {
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return getL4FieldBuilder().getBuilder();
             }
@@ -46912,17 +48765,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionSettings parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionSettings(input, extensionRegistry);
             }
         };
 
@@ -47070,6 +48913,108 @@ public final class ContextOuterClass {
             return new Connection();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Connection(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ConnectionId.Builder subBuilder = null;
+                                if (connectionId_ != null) {
+                                    subBuilder = connectionId_.toBuilder();
+                                }
+                                connectionId_ = input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(connectionId_);
+                                    connectionId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.ServiceId.Builder subBuilder = null;
+                                if (serviceId_ != null) {
+                                    subBuilder = serviceId_.toBuilder();
+                                }
+                                serviceId_ = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(serviceId_);
+                                    serviceId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 26:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    pathHopsEndpointIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                pathHopsEndpointIds_.add(input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 34:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                                    subServiceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                subServiceIds_.add(input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 42:
+                            {
+                                context.ContextOuterClass.ConnectionSettings.Builder subBuilder = null;
+                                if (settings_ != null) {
+                                    subBuilder = settings_.toBuilder();
+                                }
+                                settings_ = input.readMessage(context.ContextOuterClass.ConnectionSettings.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(settings_);
+                                    settings_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    pathHopsEndpointIds_ = java.util.Collections.unmodifiableList(pathHopsEndpointIds_);
+                }
+                if (((mutable_bitField0_ & 0x00000002) != 0)) {
+                    subServiceIds_ = java.util.Collections.unmodifiableList(subServiceIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Connection_descriptor;
         }
@@ -47106,7 +49051,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder() {
-            return connectionId_ == null ? context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
+            return getConnectionId();
         }
 
         public static final int SERVICE_ID_FIELD_NUMBER = 2;
@@ -47136,12 +49081,11 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
-            return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+            return getServiceId();
         }
 
         public static final int PATH_HOPS_ENDPOINT_IDS_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
         private java.util.List pathHopsEndpointIds_;
 
         /**
@@ -47186,7 +49130,6 @@ public final class ContextOuterClass {
 
         public static final int SUB_SERVICE_IDS_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
         private java.util.List subServiceIds_;
 
         /**
@@ -47256,7 +49199,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConnectionSettingsOrBuilder getSettingsOrBuilder() {
-            return settings_ == null ? context.ContextOuterClass.ConnectionSettings.getDefaultInstance() : settings_;
+            return getSettings();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -47289,7 +49232,7 @@ public final class ContextOuterClass {
             if (settings_ != null) {
                 output.writeMessage(5, getSettings());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -47313,7 +49256,7 @@ public final class ContextOuterClass {
             if (settings_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, getSettings());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -47349,7 +49292,7 @@ public final class ContextOuterClass {
                 if (!getSettings().equals(other.getSettings()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -47381,7 +49324,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SETTINGS_FIELD_NUMBER;
                 hash = (53 * hash) + getSettings().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -47475,43 +49418,52 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Connection.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getPathHopsEndpointIdsFieldBuilder();
+                    getSubServiceIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                connectionId_ = null;
-                if (connectionIdBuilder_ != null) {
-                    connectionIdBuilder_.dispose();
+                if (connectionIdBuilder_ == null) {
+                    connectionId_ = null;
+                } else {
+                    connectionId_ = null;
                     connectionIdBuilder_ = null;
                 }
-                serviceId_ = null;
-                if (serviceIdBuilder_ != null) {
-                    serviceIdBuilder_.dispose();
+                if (serviceIdBuilder_ == null) {
+                    serviceId_ = null;
+                } else {
+                    serviceId_ = null;
                     serviceIdBuilder_ = null;
                 }
                 if (pathHopsEndpointIdsBuilder_ == null) {
                     pathHopsEndpointIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    pathHopsEndpointIds_ = null;
                     pathHopsEndpointIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000004);
                 if (subServiceIdsBuilder_ == null) {
                     subServiceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
                 } else {
-                    subServiceIds_ = null;
                     subServiceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000008);
-                settings_ = null;
-                if (settingsBuilder_ != null) {
-                    settingsBuilder_.dispose();
+                if (settingsBuilder_ == null) {
+                    settings_ = null;
+                } else {
+                    settings_ = null;
                     settingsBuilder_ = null;
                 }
                 return this;
@@ -47539,46 +49491,72 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Connection buildPartial() {
                 context.ContextOuterClass.Connection result = new context.ContextOuterClass.Connection(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (connectionIdBuilder_ == null) {
+                    result.connectionId_ = connectionId_;
+                } else {
+                    result.connectionId_ = connectionIdBuilder_.build();
+                }
+                if (serviceIdBuilder_ == null) {
+                    result.serviceId_ = serviceId_;
+                } else {
+                    result.serviceId_ = serviceIdBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Connection result) {
                 if (pathHopsEndpointIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         pathHopsEndpointIds_ = java.util.Collections.unmodifiableList(pathHopsEndpointIds_);
-                        bitField0_ = (bitField0_ & ~0x00000004);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.pathHopsEndpointIds_ = pathHopsEndpointIds_;
                 } else {
                     result.pathHopsEndpointIds_ = pathHopsEndpointIdsBuilder_.build();
                 }
                 if (subServiceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0)) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
                         subServiceIds_ = java.util.Collections.unmodifiableList(subServiceIds_);
-                        bitField0_ = (bitField0_ & ~0x00000008);
+                        bitField0_ = (bitField0_ & ~0x00000002);
                     }
                     result.subServiceIds_ = subServiceIds_;
                 } else {
                     result.subServiceIds_ = subServiceIdsBuilder_.build();
                 }
+                if (settingsBuilder_ == null) {
+                    result.settings_ = settings_;
+                } else {
+                    result.settings_ = settingsBuilder_.build();
+                }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Connection result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.connectionId_ = connectionIdBuilder_ == null ? connectionId_ : connectionIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.serviceId_ = serviceIdBuilder_ == null ? serviceId_ : serviceIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.settings_ = settingsBuilder_ == null ? settings_ : settingsBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -47604,7 +49582,7 @@ public final class ContextOuterClass {
                     if (!other.pathHopsEndpointIds_.isEmpty()) {
                         if (pathHopsEndpointIds_.isEmpty()) {
                             pathHopsEndpointIds_ = other.pathHopsEndpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensurePathHopsEndpointIdsIsMutable();
                             pathHopsEndpointIds_.addAll(other.pathHopsEndpointIds_);
@@ -47617,7 +49595,7 @@ public final class ContextOuterClass {
                             pathHopsEndpointIdsBuilder_.dispose();
                             pathHopsEndpointIdsBuilder_ = null;
                             pathHopsEndpointIds_ = other.pathHopsEndpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             pathHopsEndpointIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getPathHopsEndpointIdsFieldBuilder() : null;
                         } else {
                             pathHopsEndpointIdsBuilder_.addAllMessages(other.pathHopsEndpointIds_);
@@ -47628,7 +49606,7 @@ public final class ContextOuterClass {
                     if (!other.subServiceIds_.isEmpty()) {
                         if (subServiceIds_.isEmpty()) {
                             subServiceIds_ = other.subServiceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                         } else {
                             ensureSubServiceIdsIsMutable();
                             subServiceIds_.addAll(other.subServiceIds_);
@@ -47641,7 +49619,7 @@ public final class ContextOuterClass {
                             subServiceIdsBuilder_.dispose();
                             subServiceIdsBuilder_ = null;
                             subServiceIds_ = other.subServiceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                             subServiceIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getSubServiceIdsFieldBuilder() : null;
                         } else {
                             subServiceIdsBuilder_.addAllMessages(other.subServiceIds_);
@@ -47651,7 +49629,7 @@ public final class ContextOuterClass {
                 if (other.hasSettings()) {
                     mergeSettings(other.getSettings());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -47663,80 +49641,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Connection parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getConnectionIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getServiceIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    context.ContextOuterClass.EndPointId m = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-                                    if (pathHopsEndpointIdsBuilder_ == null) {
-                                        ensurePathHopsEndpointIdsIsMutable();
-                                        pathHopsEndpointIds_.add(m);
-                                    } else {
-                                        pathHopsEndpointIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    context.ContextOuterClass.ServiceId m = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
-                                    if (subServiceIdsBuilder_ == null) {
-                                        ensureSubServiceIdsIsMutable();
-                                        subServiceIds_.add(m);
-                                    } else {
-                                        subServiceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    input.readMessage(getSettingsFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 42
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Connection) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -47751,7 +49666,7 @@ public final class ContextOuterClass {
              * @return Whether the connectionId field is set.
              */
             public boolean hasConnectionId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return connectionIdBuilder_ != null || connectionId_ != null;
             }
 
             /**
@@ -47775,11 +49690,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     connectionId_ = value;
+                    onChanged();
                 } else {
                     connectionIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -47789,11 +49703,10 @@ public final class ContextOuterClass {
             public Builder setConnectionId(context.ContextOuterClass.ConnectionId.Builder builderForValue) {
                 if (connectionIdBuilder_ == null) {
                     connectionId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     connectionIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -47802,16 +49715,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeConnectionId(context.ContextOuterClass.ConnectionId value) {
                 if (connectionIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && connectionId_ != null && connectionId_ != context.ContextOuterClass.ConnectionId.getDefaultInstance()) {
-                        getConnectionIdBuilder().mergeFrom(value);
+                    if (connectionId_ != null) {
+                        connectionId_ = context.ContextOuterClass.ConnectionId.newBuilder(connectionId_).mergeFrom(value).buildPartial();
                     } else {
                         connectionId_ = value;
                     }
+                    onChanged();
                 } else {
                     connectionIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -47819,13 +49731,13 @@ public final class ContextOuterClass {
              * .context.ConnectionId connection_id = 1;
              */
             public Builder clearConnectionId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                connectionId_ = null;
-                if (connectionIdBuilder_ != null) {
-                    connectionIdBuilder_.dispose();
+                if (connectionIdBuilder_ == null) {
+                    connectionId_ = null;
+                    onChanged();
+                } else {
+                    connectionId_ = null;
                     connectionIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -47833,7 +49745,6 @@ public final class ContextOuterClass {
              * .context.ConnectionId connection_id = 1;
              */
             public context.ContextOuterClass.ConnectionId.Builder getConnectionIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getConnectionIdFieldBuilder().getBuilder();
             }
@@ -47869,7 +49780,7 @@ public final class ContextOuterClass {
              * @return Whether the serviceId field is set.
              */
             public boolean hasServiceId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return serviceIdBuilder_ != null || serviceId_ != null;
             }
 
             /**
@@ -47893,11 +49804,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     serviceId_ = value;
+                    onChanged();
                 } else {
                     serviceIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -47907,11 +49817,10 @@ public final class ContextOuterClass {
             public Builder setServiceId(context.ContextOuterClass.ServiceId.Builder builderForValue) {
                 if (serviceIdBuilder_ == null) {
                     serviceId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     serviceIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -47920,16 +49829,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) {
                 if (serviceIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && serviceId_ != null && serviceId_ != context.ContextOuterClass.ServiceId.getDefaultInstance()) {
-                        getServiceIdBuilder().mergeFrom(value);
+                    if (serviceId_ != null) {
+                        serviceId_ = context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial();
                     } else {
                         serviceId_ = value;
                     }
+                    onChanged();
                 } else {
                     serviceIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -47937,13 +49845,13 @@ public final class ContextOuterClass {
              * .context.ServiceId service_id = 2;
              */
             public Builder clearServiceId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                serviceId_ = null;
-                if (serviceIdBuilder_ != null) {
-                    serviceIdBuilder_.dispose();
+                if (serviceIdBuilder_ == null) {
+                    serviceId_ = null;
+                    onChanged();
+                } else {
+                    serviceId_ = null;
                     serviceIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -47951,7 +49859,6 @@ public final class ContextOuterClass {
              * .context.ServiceId service_id = 2;
              */
             public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getServiceIdFieldBuilder().getBuilder();
             }
@@ -47981,9 +49888,9 @@ public final class ContextOuterClass {
             private java.util.List pathHopsEndpointIds_ = java.util.Collections.emptyList();
 
             private void ensurePathHopsEndpointIdsIsMutable() {
-                if (!((bitField0_ & 0x00000004) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     pathHopsEndpointIds_ = new java.util.ArrayList(pathHopsEndpointIds_);
-                    bitField0_ |= 0x00000004;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -48135,7 +50042,7 @@ public final class ContextOuterClass {
             public Builder clearPathHopsEndpointIds() {
                 if (pathHopsEndpointIdsBuilder_ == null) {
                     pathHopsEndpointIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000004);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     pathHopsEndpointIdsBuilder_.clear();
@@ -48209,7 +50116,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getPathHopsEndpointIdsFieldBuilder() {
                 if (pathHopsEndpointIdsBuilder_ == null) {
-                    pathHopsEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(pathHopsEndpointIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
+                    pathHopsEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(pathHopsEndpointIds_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     pathHopsEndpointIds_ = null;
                 }
                 return pathHopsEndpointIdsBuilder_;
@@ -48218,9 +50125,9 @@ public final class ContextOuterClass {
             private java.util.List subServiceIds_ = java.util.Collections.emptyList();
 
             private void ensureSubServiceIdsIsMutable() {
-                if (!((bitField0_ & 0x00000008) != 0)) {
+                if (!((bitField0_ & 0x00000002) != 0)) {
                     subServiceIds_ = new java.util.ArrayList(subServiceIds_);
-                    bitField0_ |= 0x00000008;
+                    bitField0_ |= 0x00000002;
                 }
             }
 
@@ -48372,7 +50279,7 @@ public final class ContextOuterClass {
             public Builder clearSubServiceIds() {
                 if (subServiceIdsBuilder_ == null) {
                     subServiceIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000008);
+                    bitField0_ = (bitField0_ & ~0x00000002);
                     onChanged();
                 } else {
                     subServiceIdsBuilder_.clear();
@@ -48446,7 +50353,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getSubServiceIdsFieldBuilder() {
                 if (subServiceIdsBuilder_ == null) {
-                    subServiceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(subServiceIds_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean());
+                    subServiceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(subServiceIds_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
                     subServiceIds_ = null;
                 }
                 return subServiceIdsBuilder_;
@@ -48461,7 +50368,7 @@ public final class ContextOuterClass {
              * @return Whether the settings field is set.
              */
             public boolean hasSettings() {
-                return ((bitField0_ & 0x00000010) != 0);
+                return settingsBuilder_ != null || settings_ != null;
             }
 
             /**
@@ -48485,11 +50392,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     settings_ = value;
+                    onChanged();
                 } else {
                     settingsBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -48499,11 +50405,10 @@ public final class ContextOuterClass {
             public Builder setSettings(context.ContextOuterClass.ConnectionSettings.Builder builderForValue) {
                 if (settingsBuilder_ == null) {
                     settings_ = builderForValue.build();
+                    onChanged();
                 } else {
                     settingsBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -48512,16 +50417,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeSettings(context.ContextOuterClass.ConnectionSettings value) {
                 if (settingsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000010) != 0) && settings_ != null && settings_ != context.ContextOuterClass.ConnectionSettings.getDefaultInstance()) {
-                        getSettingsBuilder().mergeFrom(value);
+                    if (settings_ != null) {
+                        settings_ = context.ContextOuterClass.ConnectionSettings.newBuilder(settings_).mergeFrom(value).buildPartial();
                     } else {
                         settings_ = value;
                     }
+                    onChanged();
                 } else {
                     settingsBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -48529,13 +50433,13 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings settings = 5;
              */
             public Builder clearSettings() {
-                bitField0_ = (bitField0_ & ~0x00000010);
-                settings_ = null;
-                if (settingsBuilder_ != null) {
-                    settingsBuilder_.dispose();
+                if (settingsBuilder_ == null) {
+                    settings_ = null;
+                    onChanged();
+                } else {
+                    settings_ = null;
                     settingsBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -48543,7 +50447,6 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings settings = 5;
              */
             public context.ContextOuterClass.ConnectionSettings.Builder getSettingsBuilder() {
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return getSettingsFieldBuilder().getBuilder();
             }
@@ -48597,17 +50500,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Connection parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Connection(input, extensionRegistry);
             }
         };
 
@@ -48678,6 +50571,57 @@ public final class ContextOuterClass {
             return new ConnectionIdList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    connectionIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                connectionIds_.add(input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    connectionIds_ = java.util.Collections.unmodifiableList(connectionIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionIdList_descriptor;
         }
@@ -48689,7 +50633,6 @@ public final class ContextOuterClass {
 
         public static final int CONNECTION_IDS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List connectionIds_;
 
         /**
@@ -48750,7 +50693,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < connectionIds_.size(); i++) {
                 output.writeMessage(1, connectionIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -48762,7 +50705,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < connectionIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, connectionIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -48778,7 +50721,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.ConnectionIdList other = (context.ContextOuterClass.ConnectionIdList) obj;
             if (!getConnectionIdsList().equals(other.getConnectionIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -48794,7 +50737,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONNECTION_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getConnectionIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -48888,23 +50831,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionIdList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getConnectionIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (connectionIdsBuilder_ == null) {
                     connectionIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    connectionIds_ = null;
                     connectionIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -48930,15 +50879,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionIdList buildPartial() {
                 context.ContextOuterClass.ConnectionIdList result = new context.ContextOuterClass.ConnectionIdList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.ConnectionIdList result) {
+                int from_bitField0_ = bitField0_;
                 if (connectionIdsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         connectionIds_ = java.util.Collections.unmodifiableList(connectionIds_);
@@ -48948,10 +50889,38 @@ public final class ContextOuterClass {
                 } else {
                     result.connectionIds_ = connectionIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionIdList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -48991,7 +50960,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -49003,47 +50972,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionIdList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.ConnectionId m = input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry);
-                                    if (connectionIdsBuilder_ == null) {
-                                        ensureConnectionIdsIsMutable();
-                                        connectionIds_.add(m);
-                                    } else {
-                                        connectionIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionIdList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -49313,17 +51252,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionIdList(input, extensionRegistry);
             }
         };
 
@@ -49394,6 +51323,57 @@ public final class ContextOuterClass {
             return new ConnectionList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    connections_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                connections_.add(input.readMessage(context.ContextOuterClass.Connection.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    connections_ = java.util.Collections.unmodifiableList(connections_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionList_descriptor;
         }
@@ -49405,7 +51385,6 @@ public final class ContextOuterClass {
 
         public static final int CONNECTIONS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List connections_;
 
         /**
@@ -49466,7 +51445,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < connections_.size(); i++) {
                 output.writeMessage(1, connections_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -49478,7 +51457,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < connections_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, connections_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -49494,7 +51473,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.ConnectionList other = (context.ContextOuterClass.ConnectionList) obj;
             if (!getConnectionsList().equals(other.getConnectionsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -49510,7 +51489,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONNECTIONS_FIELD_NUMBER;
                 hash = (53 * hash) + getConnectionsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -49604,23 +51583,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getConnectionsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (connectionsBuilder_ == null) {
                     connections_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    connections_ = null;
                     connectionsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -49646,15 +51631,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionList buildPartial() {
                 context.ContextOuterClass.ConnectionList result = new context.ContextOuterClass.ConnectionList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.ConnectionList result) {
+                int from_bitField0_ = bitField0_;
                 if (connectionsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         connections_ = java.util.Collections.unmodifiableList(connections_);
@@ -49664,10 +51641,38 @@ public final class ContextOuterClass {
                 } else {
                     result.connections_ = connectionsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -49707,7 +51712,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -49719,47 +51724,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.Connection m = input.readMessage(context.ContextOuterClass.Connection.parser(), extensionRegistry);
-                                    if (connectionsBuilder_ == null) {
-                                        ensureConnectionsIsMutable();
-                                        connections_.add(m);
-                                    } else {
-                                        connectionsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -50029,17 +52004,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionList(input, extensionRegistry);
             }
         };
 
@@ -50118,6 +52083,70 @@ public final class ContextOuterClass {
             return new ConnectionEvent();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionEvent(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Event.Builder subBuilder = null;
+                                if (event_ != null) {
+                                    subBuilder = event_.toBuilder();
+                                }
+                                event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(event_);
+                                    event_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.ConnectionId.Builder subBuilder = null;
+                                if (connectionId_ != null) {
+                                    subBuilder = connectionId_.toBuilder();
+                                }
+                                connectionId_ = input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(connectionId_);
+                                    connectionId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionEvent_descriptor;
         }
@@ -50154,7 +52183,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-            return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+            return getEvent();
         }
 
         public static final int CONNECTION_ID_FIELD_NUMBER = 2;
@@ -50184,7 +52213,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder() {
-            return connectionId_ == null ? context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
+            return getConnectionId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -50208,7 +52237,7 @@ public final class ContextOuterClass {
             if (connectionId_ != null) {
                 output.writeMessage(2, getConnectionId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -50223,7 +52252,7 @@ public final class ContextOuterClass {
             if (connectionId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getConnectionId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -50249,7 +52278,7 @@ public final class ContextOuterClass {
                 if (!getConnectionId().equals(other.getConnectionId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -50269,7 +52298,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONNECTION_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getConnectionId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -50363,24 +52392,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionEvent.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                connectionId_ = null;
-                if (connectionIdBuilder_ != null) {
-                    connectionIdBuilder_.dispose();
+                if (connectionIdBuilder_ == null) {
+                    connectionId_ = null;
+                } else {
+                    connectionId_ = null;
                     connectionIdBuilder_ = null;
                 }
                 return this;
@@ -50408,21 +52445,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionEvent buildPartial() {
                 context.ContextOuterClass.ConnectionEvent result = new context.ContextOuterClass.ConnectionEvent(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (eventBuilder_ == null) {
+                    result.event_ = event_;
+                } else {
+                    result.event_ = eventBuilder_.build();
+                }
+                if (connectionIdBuilder_ == null) {
+                    result.connectionId_ = connectionId_;
+                } else {
+                    result.connectionId_ = connectionIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionEvent result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.event_ = eventBuilder_ == null ? event_ : eventBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.connectionId_ = connectionIdBuilder_ == null ? connectionId_ : connectionIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -50444,7 +52508,7 @@ public final class ContextOuterClass {
                 if (other.hasConnectionId()) {
                     mergeConnectionId(other.getConnectionId());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -50456,54 +52520,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionEvent parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEventFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getConnectionIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionEvent) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Event event_;
 
             private com.google.protobuf.SingleFieldBuilderV3 eventBuilder_;
@@ -50513,7 +52543,7 @@ public final class ContextOuterClass {
              * @return Whether the event field is set.
              */
             public boolean hasEvent() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return eventBuilder_ != null || event_ != null;
             }
 
             /**
@@ -50537,11 +52567,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     event_ = value;
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -50551,11 +52580,10 @@ public final class ContextOuterClass {
             public Builder setEvent(context.ContextOuterClass.Event.Builder builderForValue) {
                 if (eventBuilder_ == null) {
                     event_ = builderForValue.build();
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -50564,16 +52592,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEvent(context.ContextOuterClass.Event value) {
                 if (eventBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && event_ != null && event_ != context.ContextOuterClass.Event.getDefaultInstance()) {
-                        getEventBuilder().mergeFrom(value);
+                    if (event_ != null) {
+                        event_ = context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
                     } else {
                         event_ = value;
                     }
+                    onChanged();
                 } else {
                     eventBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -50581,13 +52608,13 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public Builder clearEvent() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                    onChanged();
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -50595,7 +52622,6 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public context.ContextOuterClass.Event.Builder getEventBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEventFieldBuilder().getBuilder();
             }
@@ -50631,7 +52657,7 @@ public final class ContextOuterClass {
              * @return Whether the connectionId field is set.
              */
             public boolean hasConnectionId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return connectionIdBuilder_ != null || connectionId_ != null;
             }
 
             /**
@@ -50655,11 +52681,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     connectionId_ = value;
+                    onChanged();
                 } else {
                     connectionIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -50669,11 +52694,10 @@ public final class ContextOuterClass {
             public Builder setConnectionId(context.ContextOuterClass.ConnectionId.Builder builderForValue) {
                 if (connectionIdBuilder_ == null) {
                     connectionId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     connectionIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -50682,16 +52706,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeConnectionId(context.ContextOuterClass.ConnectionId value) {
                 if (connectionIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && connectionId_ != null && connectionId_ != context.ContextOuterClass.ConnectionId.getDefaultInstance()) {
-                        getConnectionIdBuilder().mergeFrom(value);
+                    if (connectionId_ != null) {
+                        connectionId_ = context.ContextOuterClass.ConnectionId.newBuilder(connectionId_).mergeFrom(value).buildPartial();
                     } else {
                         connectionId_ = value;
                     }
+                    onChanged();
                 } else {
                     connectionIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -50699,13 +52722,13 @@ public final class ContextOuterClass {
              * .context.ConnectionId connection_id = 2;
              */
             public Builder clearConnectionId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                connectionId_ = null;
-                if (connectionIdBuilder_ != null) {
-                    connectionIdBuilder_.dispose();
+                if (connectionIdBuilder_ == null) {
+                    connectionId_ = null;
+                    onChanged();
+                } else {
+                    connectionId_ = null;
                     connectionIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -50713,7 +52736,6 @@ public final class ContextOuterClass {
              * .context.ConnectionId connection_id = 2;
              */
             public context.ContextOuterClass.ConnectionId.Builder getConnectionIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getConnectionIdFieldBuilder().getBuilder();
             }
@@ -50767,17 +52789,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionEvent parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionEvent(input, extensionRegistry);
             }
         };
 
@@ -50877,6 +52889,83 @@ public final class ContextOuterClass {
             return new EndPointId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private EndPointId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.TopologyId.Builder subBuilder = null;
+                                if (topologyId_ != null) {
+                                    subBuilder = topologyId_.toBuilder();
+                                }
+                                topologyId_ = input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(topologyId_);
+                                    topologyId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.DeviceId.Builder subBuilder = null;
+                                if (deviceId_ != null) {
+                                    subBuilder = deviceId_.toBuilder();
+                                }
+                                deviceId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(deviceId_);
+                                    deviceId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 26:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (endpointUuid_ != null) {
+                                    subBuilder = endpointUuid_.toBuilder();
+                                }
+                                endpointUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endpointUuid_);
+                                    endpointUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_EndPointId_descriptor;
         }
@@ -50913,7 +53002,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.TopologyIdOrBuilder getTopologyIdOrBuilder() {
-            return topologyId_ == null ? context.ContextOuterClass.TopologyId.getDefaultInstance() : topologyId_;
+            return getTopologyId();
         }
 
         public static final int DEVICE_ID_FIELD_NUMBER = 2;
@@ -50943,7 +53032,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() {
-            return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
+            return getDeviceId();
         }
 
         public static final int ENDPOINT_UUID_FIELD_NUMBER = 3;
@@ -50973,7 +53062,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getEndpointUuidOrBuilder() {
-            return endpointUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : endpointUuid_;
+            return getEndpointUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -51000,7 +53089,7 @@ public final class ContextOuterClass {
             if (endpointUuid_ != null) {
                 output.writeMessage(3, getEndpointUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -51018,7 +53107,7 @@ public final class ContextOuterClass {
             if (endpointUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getEndpointUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -51050,7 +53139,7 @@ public final class ContextOuterClass {
                 if (!getEndpointUuid().equals(other.getEndpointUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -51074,7 +53163,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + ENDPOINT_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getEndpointUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -51172,29 +53261,38 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.EndPointId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                topologyId_ = null;
-                if (topologyIdBuilder_ != null) {
-                    topologyIdBuilder_.dispose();
+                if (topologyIdBuilder_ == null) {
+                    topologyId_ = null;
+                } else {
+                    topologyId_ = null;
                     topologyIdBuilder_ = null;
                 }
-                deviceId_ = null;
-                if (deviceIdBuilder_ != null) {
-                    deviceIdBuilder_.dispose();
+                if (deviceIdBuilder_ == null) {
+                    deviceId_ = null;
+                } else {
+                    deviceId_ = null;
                     deviceIdBuilder_ = null;
                 }
-                endpointUuid_ = null;
-                if (endpointUuidBuilder_ != null) {
-                    endpointUuidBuilder_.dispose();
+                if (endpointUuidBuilder_ == null) {
+                    endpointUuid_ = null;
+                } else {
+                    endpointUuid_ = null;
                     endpointUuidBuilder_ = null;
                 }
                 return this;
@@ -51222,24 +53320,53 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.EndPointId buildPartial() {
                 context.ContextOuterClass.EndPointId result = new context.ContextOuterClass.EndPointId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (topologyIdBuilder_ == null) {
+                    result.topologyId_ = topologyId_;
+                } else {
+                    result.topologyId_ = topologyIdBuilder_.build();
+                }
+                if (deviceIdBuilder_ == null) {
+                    result.deviceId_ = deviceId_;
+                } else {
+                    result.deviceId_ = deviceIdBuilder_.build();
+                }
+                if (endpointUuidBuilder_ == null) {
+                    result.endpointUuid_ = endpointUuid_;
+                } else {
+                    result.endpointUuid_ = endpointUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.EndPointId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.topologyId_ = topologyIdBuilder_ == null ? topologyId_ : topologyIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.deviceId_ = deviceIdBuilder_ == null ? deviceId_ : deviceIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.endpointUuid_ = endpointUuidBuilder_ == null ? endpointUuid_ : endpointUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -51264,7 +53391,7 @@ public final class ContextOuterClass {
                 if (other.hasEndpointUuid()) {
                     mergeEndpointUuid(other.getEndpointUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -51276,61 +53403,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.EndPointId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getTopologyIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getDeviceIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getEndpointUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.EndPointId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.TopologyId topologyId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 topologyIdBuilder_;
@@ -51340,7 +53426,7 @@ public final class ContextOuterClass {
              * @return Whether the topologyId field is set.
              */
             public boolean hasTopologyId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return topologyIdBuilder_ != null || topologyId_ != null;
             }
 
             /**
@@ -51364,11 +53450,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     topologyId_ = value;
+                    onChanged();
                 } else {
                     topologyIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -51378,11 +53463,10 @@ public final class ContextOuterClass {
             public Builder setTopologyId(context.ContextOuterClass.TopologyId.Builder builderForValue) {
                 if (topologyIdBuilder_ == null) {
                     topologyId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     topologyIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -51391,16 +53475,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeTopologyId(context.ContextOuterClass.TopologyId value) {
                 if (topologyIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && topologyId_ != null && topologyId_ != context.ContextOuterClass.TopologyId.getDefaultInstance()) {
-                        getTopologyIdBuilder().mergeFrom(value);
+                    if (topologyId_ != null) {
+                        topologyId_ = context.ContextOuterClass.TopologyId.newBuilder(topologyId_).mergeFrom(value).buildPartial();
                     } else {
                         topologyId_ = value;
                     }
+                    onChanged();
                 } else {
                     topologyIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -51408,13 +53491,13 @@ public final class ContextOuterClass {
              * .context.TopologyId topology_id = 1;
              */
             public Builder clearTopologyId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                topologyId_ = null;
-                if (topologyIdBuilder_ != null) {
-                    topologyIdBuilder_.dispose();
+                if (topologyIdBuilder_ == null) {
+                    topologyId_ = null;
+                    onChanged();
+                } else {
+                    topologyId_ = null;
                     topologyIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -51422,7 +53505,6 @@ public final class ContextOuterClass {
              * .context.TopologyId topology_id = 1;
              */
             public context.ContextOuterClass.TopologyId.Builder getTopologyIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getTopologyIdFieldBuilder().getBuilder();
             }
@@ -51458,7 +53540,7 @@ public final class ContextOuterClass {
              * @return Whether the deviceId field is set.
              */
             public boolean hasDeviceId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return deviceIdBuilder_ != null || deviceId_ != null;
             }
 
             /**
@@ -51482,11 +53564,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     deviceId_ = value;
+                    onChanged();
                 } else {
                     deviceIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -51496,11 +53577,10 @@ public final class ContextOuterClass {
             public Builder setDeviceId(context.ContextOuterClass.DeviceId.Builder builderForValue) {
                 if (deviceIdBuilder_ == null) {
                     deviceId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     deviceIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -51509,16 +53589,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeDeviceId(context.ContextOuterClass.DeviceId value) {
                 if (deviceIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && deviceId_ != null && deviceId_ != context.ContextOuterClass.DeviceId.getDefaultInstance()) {
-                        getDeviceIdBuilder().mergeFrom(value);
+                    if (deviceId_ != null) {
+                        deviceId_ = context.ContextOuterClass.DeviceId.newBuilder(deviceId_).mergeFrom(value).buildPartial();
                     } else {
                         deviceId_ = value;
                     }
+                    onChanged();
                 } else {
                     deviceIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -51526,13 +53605,13 @@ public final class ContextOuterClass {
              * .context.DeviceId device_id = 2;
              */
             public Builder clearDeviceId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                deviceId_ = null;
-                if (deviceIdBuilder_ != null) {
-                    deviceIdBuilder_.dispose();
+                if (deviceIdBuilder_ == null) {
+                    deviceId_ = null;
+                    onChanged();
+                } else {
+                    deviceId_ = null;
                     deviceIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -51540,7 +53619,6 @@ public final class ContextOuterClass {
              * .context.DeviceId device_id = 2;
              */
             public context.ContextOuterClass.DeviceId.Builder getDeviceIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getDeviceIdFieldBuilder().getBuilder();
             }
@@ -51576,7 +53654,7 @@ public final class ContextOuterClass {
              * @return Whether the endpointUuid field is set.
              */
             public boolean hasEndpointUuid() {
-                return ((bitField0_ & 0x00000004) != 0);
+                return endpointUuidBuilder_ != null || endpointUuid_ != null;
             }
 
             /**
@@ -51600,11 +53678,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     endpointUuid_ = value;
+                    onChanged();
                 } else {
                     endpointUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -51614,11 +53691,10 @@ public final class ContextOuterClass {
             public Builder setEndpointUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (endpointUuidBuilder_ == null) {
                     endpointUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endpointUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -51627,16 +53703,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEndpointUuid(context.ContextOuterClass.Uuid value) {
                 if (endpointUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0) && endpointUuid_ != null && endpointUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getEndpointUuidBuilder().mergeFrom(value);
+                    if (endpointUuid_ != null) {
+                        endpointUuid_ = context.ContextOuterClass.Uuid.newBuilder(endpointUuid_).mergeFrom(value).buildPartial();
                     } else {
                         endpointUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     endpointUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -51644,13 +53719,13 @@ public final class ContextOuterClass {
              * .context.Uuid endpoint_uuid = 3;
              */
             public Builder clearEndpointUuid() {
-                bitField0_ = (bitField0_ & ~0x00000004);
-                endpointUuid_ = null;
-                if (endpointUuidBuilder_ != null) {
-                    endpointUuidBuilder_.dispose();
+                if (endpointUuidBuilder_ == null) {
+                    endpointUuid_ = null;
+                    onChanged();
+                } else {
+                    endpointUuid_ = null;
                     endpointUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -51658,7 +53733,6 @@ public final class ContextOuterClass {
              * .context.Uuid endpoint_uuid = 3;
              */
             public context.ContextOuterClass.Uuid.Builder getEndpointUuidBuilder() {
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return getEndpointUuidFieldBuilder().getBuilder();
             }
@@ -51712,17 +53786,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public EndPointId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new EndPointId(input, extensionRegistry);
             }
         };
 
@@ -51860,6 +53924,111 @@ public final class ContextOuterClass {
             return new EndPoint();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private EndPoint(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.EndPointId.Builder subBuilder = null;
+                                if (endpointId_ != null) {
+                                    subBuilder = endpointId_.toBuilder();
+                                }
+                                endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endpointId_);
+                                    endpointId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                endpointType_ = s;
+                                break;
+                            }
+                        case 32:
+                            {
+                                int rawValue = input.readEnum();
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    kpiSampleTypes_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                kpiSampleTypes_.add(rawValue);
+                                break;
+                            }
+                        case 34:
+                            {
+                                int length = input.readRawVarint32();
+                                int oldLimit = input.pushLimit(length);
+                                while (input.getBytesUntilLimit() > 0) {
+                                    int rawValue = input.readEnum();
+                                    if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                        kpiSampleTypes_ = new java.util.ArrayList();
+                                        mutable_bitField0_ |= 0x00000001;
+                                    }
+                                    kpiSampleTypes_.add(rawValue);
+                                }
+                                input.popLimit(oldLimit);
+                                break;
+                            }
+                        case 42:
+                            {
+                                context.ContextOuterClass.Location.Builder subBuilder = null;
+                                if (endpointLocation_ != null) {
+                                    subBuilder = endpointLocation_.toBuilder();
+                                }
+                                endpointLocation_ = input.readMessage(context.ContextOuterClass.Location.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endpointLocation_);
+                                    endpointLocation_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    kpiSampleTypes_ = java.util.Collections.unmodifiableList(kpiSampleTypes_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_EndPoint_descriptor;
         }
@@ -51896,13 +54065,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+            return getEndpointId();
         }
 
         public static final int NAME_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 2;
@@ -51939,8 +54107,7 @@ public final class ContextOuterClass {
 
         public static final int ENDPOINT_TYPE_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object endpointType_ = "";
+        private volatile java.lang.Object endpointType_;
 
         /**
          * string endpoint_type = 3;
@@ -51977,13 +54144,13 @@ public final class ContextOuterClass {
 
         public static final int KPI_SAMPLE_TYPES_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
         private java.util.List kpiSampleTypes_;
 
         private static final com.google.protobuf.Internal.ListAdapter.Converter kpiSampleTypes_converter_ = new com.google.protobuf.Internal.ListAdapter.Converter() {
 
             public kpi_sample_types.KpiSampleTypes.KpiSampleType convert(java.lang.Integer from) {
-                kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.forNumber(from);
+                @SuppressWarnings("deprecation")
+                kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.valueOf(from);
                 return result == null ? kpi_sample_types.KpiSampleTypes.KpiSampleType.UNRECOGNIZED : result;
             }
         };
@@ -52064,7 +54231,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.LocationOrBuilder getEndpointLocationOrBuilder() {
-            return endpointLocation_ == null ? context.ContextOuterClass.Location.getDefaultInstance() : endpointLocation_;
+            return getEndpointLocation();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -52086,10 +54253,10 @@ public final class ContextOuterClass {
             if (endpointId_ != null) {
                 output.writeMessage(1, getEndpointId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(endpointType_)) {
+            if (!getEndpointTypeBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 3, endpointType_);
             }
             if (getKpiSampleTypesList().size() > 0) {
@@ -52102,7 +54269,7 @@ public final class ContextOuterClass {
             if (endpointLocation_ != null) {
                 output.writeMessage(5, getEndpointLocation());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -52114,10 +54281,10 @@ public final class ContextOuterClass {
             if (endpointId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getEndpointId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(endpointType_)) {
+            if (!getEndpointTypeBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, endpointType_);
             }
             {
@@ -52135,7 +54302,7 @@ public final class ContextOuterClass {
             if (endpointLocation_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, getEndpointLocation());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -52167,7 +54334,7 @@ public final class ContextOuterClass {
                 if (!getEndpointLocation().equals(other.getEndpointLocation()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -52195,7 +54362,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + ENDPOINT_LOCATION_FIELD_NUMBER;
                 hash = (53 * hash) + getEndpointLocation().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -52289,28 +54456,36 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.EndPoint.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
                 name_ = "";
                 endpointType_ = "";
                 kpiSampleTypes_ = java.util.Collections.emptyList();
-                bitField0_ = (bitField0_ & ~0x00000008);
-                endpointLocation_ = null;
-                if (endpointLocationBuilder_ != null) {
-                    endpointLocationBuilder_.dispose();
+                bitField0_ = (bitField0_ & ~0x00000001);
+                if (endpointLocationBuilder_ == null) {
+                    endpointLocation_ = null;
+                } else {
+                    endpointLocation_ = null;
                     endpointLocationBuilder_ = null;
                 }
                 return this;
@@ -52338,36 +54513,56 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.EndPoint buildPartial() {
                 context.ContextOuterClass.EndPoint result = new context.ContextOuterClass.EndPoint(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (endpointIdBuilder_ == null) {
+                    result.endpointId_ = endpointId_;
+                } else {
+                    result.endpointId_ = endpointIdBuilder_.build();
+                }
+                result.name_ = name_;
+                result.endpointType_ = endpointType_;
+                if (((bitField0_ & 0x00000001) != 0)) {
+                    kpiSampleTypes_ = java.util.Collections.unmodifiableList(kpiSampleTypes_);
+                    bitField0_ = (bitField0_ & ~0x00000001);
+                }
+                result.kpiSampleTypes_ = kpiSampleTypes_;
+                if (endpointLocationBuilder_ == null) {
+                    result.endpointLocation_ = endpointLocation_;
+                } else {
+                    result.endpointLocation_ = endpointLocationBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartialRepeatedFields(context.ContextOuterClass.EndPoint result) {
-                if (((bitField0_ & 0x00000008) != 0)) {
-                    kpiSampleTypes_ = java.util.Collections.unmodifiableList(kpiSampleTypes_);
-                    bitField0_ = (bitField0_ & ~0x00000008);
-                }
-                result.kpiSampleTypes_ = kpiSampleTypes_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
             }
 
-            private void buildPartial0(context.ContextOuterClass.EndPoint result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.endpointId_ = endpointIdBuilder_ == null ? endpointId_ : endpointIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.endpointType_ = endpointType_;
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.endpointLocation_ = endpointLocationBuilder_ == null ? endpointLocation_ : endpointLocationBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -52388,18 +54583,16 @@ public final class ContextOuterClass {
                 }
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (!other.getEndpointType().isEmpty()) {
                     endpointType_ = other.endpointType_;
-                    bitField0_ |= 0x00000004;
                     onChanged();
                 }
                 if (!other.kpiSampleTypes_.isEmpty()) {
                     if (kpiSampleTypes_.isEmpty()) {
                         kpiSampleTypes_ = other.kpiSampleTypes_;
-                        bitField0_ = (bitField0_ & ~0x00000008);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     } else {
                         ensureKpiSampleTypesIsMutable();
                         kpiSampleTypes_.addAll(other.kpiSampleTypes_);
@@ -52409,7 +54602,7 @@ public final class ContextOuterClass {
                 if (other.hasEndpointLocation()) {
                     mergeEndpointLocation(other.getEndpointLocation());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -52421,84 +54614,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.EndPoint parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEndpointIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    endpointType_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            case 32:
-                                {
-                                    int tmpRaw = input.readEnum();
-                                    ensureKpiSampleTypesIsMutable();
-                                    kpiSampleTypes_.add(tmpRaw);
-                                    break;
-                                }
-                            // case 32
-                            case 34:
-                                {
-                                    int length = input.readRawVarint32();
-                                    int oldLimit = input.pushLimit(length);
-                                    while (input.getBytesUntilLimit() > 0) {
-                                        int tmpRaw = input.readEnum();
-                                        ensureKpiSampleTypesIsMutable();
-                                        kpiSampleTypes_.add(tmpRaw);
-                                    }
-                                    input.popLimit(oldLimit);
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    input.readMessage(getEndpointLocationFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 42
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.EndPoint) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -52513,7 +54639,7 @@ public final class ContextOuterClass {
              * @return Whether the endpointId field is set.
              */
             public boolean hasEndpointId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return endpointIdBuilder_ != null || endpointId_ != null;
             }
 
             /**
@@ -52537,11 +54663,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     endpointId_ = value;
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -52551,11 +54676,10 @@ public final class ContextOuterClass {
             public Builder setEndpointId(context.ContextOuterClass.EndPointId.Builder builderForValue) {
                 if (endpointIdBuilder_ == null) {
                     endpointId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -52564,16 +54688,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
                 if (endpointIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && endpointId_ != null && endpointId_ != context.ContextOuterClass.EndPointId.getDefaultInstance()) {
-                        getEndpointIdBuilder().mergeFrom(value);
+                    if (endpointId_ != null) {
+                        endpointId_ = context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
                     } else {
                         endpointId_ = value;
                     }
+                    onChanged();
                 } else {
                     endpointIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -52581,13 +54704,13 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public Builder clearEndpointId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                    onChanged();
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -52595,7 +54718,6 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEndpointIdFieldBuilder().getBuilder();
             }
@@ -52665,7 +54787,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -52676,7 +54797,6 @@ public final class ContextOuterClass {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -52692,7 +54812,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -52740,7 +54859,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 endpointType_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -52751,7 +54869,6 @@ public final class ContextOuterClass {
              */
             public Builder clearEndpointType() {
                 endpointType_ = getDefaultInstance().getEndpointType();
-                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -52767,7 +54884,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 endpointType_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -52775,9 +54891,9 @@ public final class ContextOuterClass {
             private java.util.List kpiSampleTypes_ = java.util.Collections.emptyList();
 
             private void ensureKpiSampleTypesIsMutable() {
-                if (!((bitField0_ & 0x00000008) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     kpiSampleTypes_ = new java.util.ArrayList(kpiSampleTypes_);
-                    bitField0_ |= 0x00000008;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -52857,7 +54973,7 @@ public final class ContextOuterClass {
              */
             public Builder clearKpiSampleTypes() {
                 kpiSampleTypes_ = java.util.Collections.emptyList();
-                bitField0_ = (bitField0_ & ~0x00000008);
+                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -52881,8 +54997,8 @@ public final class ContextOuterClass {
 
             /**
              * repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;
-             * @param index The index to set the value at.
-             * @param value The enum numeric value on the wire for kpiSampleTypes to set.
+             * @param index The index of the value to return.
+             * @return The enum numeric value on the wire of kpiSampleTypes at the given index.
              * @return This builder for chaining.
              */
             public Builder setKpiSampleTypesValue(int index, int value) {
@@ -52927,7 +55043,7 @@ public final class ContextOuterClass {
              * @return Whether the endpointLocation field is set.
              */
             public boolean hasEndpointLocation() {
-                return ((bitField0_ & 0x00000010) != 0);
+                return endpointLocationBuilder_ != null || endpointLocation_ != null;
             }
 
             /**
@@ -52951,11 +55067,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     endpointLocation_ = value;
+                    onChanged();
                 } else {
                     endpointLocationBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -52965,11 +55080,10 @@ public final class ContextOuterClass {
             public Builder setEndpointLocation(context.ContextOuterClass.Location.Builder builderForValue) {
                 if (endpointLocationBuilder_ == null) {
                     endpointLocation_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endpointLocationBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -52978,16 +55092,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEndpointLocation(context.ContextOuterClass.Location value) {
                 if (endpointLocationBuilder_ == null) {
-                    if (((bitField0_ & 0x00000010) != 0) && endpointLocation_ != null && endpointLocation_ != context.ContextOuterClass.Location.getDefaultInstance()) {
-                        getEndpointLocationBuilder().mergeFrom(value);
+                    if (endpointLocation_ != null) {
+                        endpointLocation_ = context.ContextOuterClass.Location.newBuilder(endpointLocation_).mergeFrom(value).buildPartial();
                     } else {
                         endpointLocation_ = value;
                     }
+                    onChanged();
                 } else {
                     endpointLocationBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -52995,13 +55108,13 @@ public final class ContextOuterClass {
              * .context.Location endpoint_location = 5;
              */
             public Builder clearEndpointLocation() {
-                bitField0_ = (bitField0_ & ~0x00000010);
-                endpointLocation_ = null;
-                if (endpointLocationBuilder_ != null) {
-                    endpointLocationBuilder_.dispose();
+                if (endpointLocationBuilder_ == null) {
+                    endpointLocation_ = null;
+                    onChanged();
+                } else {
+                    endpointLocation_ = null;
                     endpointLocationBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -53009,7 +55122,6 @@ public final class ContextOuterClass {
              * .context.Location endpoint_location = 5;
              */
             public context.ContextOuterClass.Location.Builder getEndpointLocationBuilder() {
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return getEndpointLocationFieldBuilder().getBuilder();
             }
@@ -53063,17 +55175,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public EndPoint parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new EndPoint(input, extensionRegistry);
             }
         };
 
@@ -53174,6 +55276,75 @@ public final class ContextOuterClass {
             return new EndPointName();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private EndPointName(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.EndPointId.Builder subBuilder = null;
+                                if (endpointId_ != null) {
+                                    subBuilder = endpointId_.toBuilder();
+                                }
+                                endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endpointId_);
+                                    endpointId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                deviceName_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                endpointName_ = s;
+                                break;
+                            }
+                        case 34:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                endpointType_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_EndPointName_descriptor;
         }
@@ -53210,13 +55381,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+            return getEndpointId();
         }
 
         public static final int DEVICE_NAME_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object deviceName_ = "";
+        private volatile java.lang.Object deviceName_;
 
         /**
          * string device_name = 2;
@@ -53253,8 +55423,7 @@ public final class ContextOuterClass {
 
         public static final int ENDPOINT_NAME_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object endpointName_ = "";
+        private volatile java.lang.Object endpointName_;
 
         /**
          * string endpoint_name = 3;
@@ -53291,8 +55460,7 @@ public final class ContextOuterClass {
 
         public static final int ENDPOINT_TYPE_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object endpointType_ = "";
+        private volatile java.lang.Object endpointType_;
 
         /**
          * string endpoint_type = 4;
@@ -53345,16 +55513,16 @@ public final class ContextOuterClass {
             if (endpointId_ != null) {
                 output.writeMessage(1, getEndpointId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(deviceName_)) {
+            if (!getDeviceNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, deviceName_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(endpointName_)) {
+            if (!getEndpointNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 3, endpointName_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(endpointType_)) {
+            if (!getEndpointTypeBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 4, endpointType_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -53366,16 +55534,16 @@ public final class ContextOuterClass {
             if (endpointId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getEndpointId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(deviceName_)) {
+            if (!getDeviceNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, deviceName_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(endpointName_)) {
+            if (!getEndpointNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, endpointName_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(endpointType_)) {
+            if (!getEndpointTypeBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, endpointType_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -53401,7 +55569,7 @@ public final class ContextOuterClass {
                 return false;
             if (!getEndpointType().equals(other.getEndpointType()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -53423,7 +55591,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + getEndpointName().hashCode();
             hash = (37 * hash) + ENDPOINT_TYPE_FIELD_NUMBER;
             hash = (53 * hash) + getEndpointType().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -53517,19 +55685,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.EndPointName.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
                 deviceName_ = "";
@@ -53560,27 +55735,46 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.EndPointName buildPartial() {
                 context.ContextOuterClass.EndPointName result = new context.ContextOuterClass.EndPointName(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (endpointIdBuilder_ == null) {
+                    result.endpointId_ = endpointId_;
+                } else {
+                    result.endpointId_ = endpointIdBuilder_.build();
                 }
+                result.deviceName_ = deviceName_;
+                result.endpointName_ = endpointName_;
+                result.endpointType_ = endpointType_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.EndPointName result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.endpointId_ = endpointIdBuilder_ == null ? endpointId_ : endpointIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.deviceName_ = deviceName_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.endpointName_ = endpointName_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.endpointType_ = endpointType_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -53601,20 +55795,17 @@ public final class ContextOuterClass {
                 }
                 if (!other.getDeviceName().isEmpty()) {
                     deviceName_ = other.deviceName_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (!other.getEndpointName().isEmpty()) {
                     endpointName_ = other.endpointName_;
-                    bitField0_ |= 0x00000004;
                     onChanged();
                 }
                 if (!other.getEndpointType().isEmpty()) {
                     endpointType_ = other.endpointType_;
-                    bitField0_ |= 0x00000008;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -53626,68 +55817,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.EndPointName parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEndpointIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    deviceName_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    endpointName_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    endpointType_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 34
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.EndPointName) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.EndPointId endpointId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 endpointIdBuilder_;
@@ -53697,7 +55840,7 @@ public final class ContextOuterClass {
              * @return Whether the endpointId field is set.
              */
             public boolean hasEndpointId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return endpointIdBuilder_ != null || endpointId_ != null;
             }
 
             /**
@@ -53721,11 +55864,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     endpointId_ = value;
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -53735,11 +55877,10 @@ public final class ContextOuterClass {
             public Builder setEndpointId(context.ContextOuterClass.EndPointId.Builder builderForValue) {
                 if (endpointIdBuilder_ == null) {
                     endpointId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -53748,16 +55889,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
                 if (endpointIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && endpointId_ != null && endpointId_ != context.ContextOuterClass.EndPointId.getDefaultInstance()) {
-                        getEndpointIdBuilder().mergeFrom(value);
+                    if (endpointId_ != null) {
+                        endpointId_ = context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
                     } else {
                         endpointId_ = value;
                     }
+                    onChanged();
                 } else {
                     endpointIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -53765,13 +55905,13 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public Builder clearEndpointId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                    onChanged();
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -53779,7 +55919,6 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEndpointIdFieldBuilder().getBuilder();
             }
@@ -53849,7 +55988,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 deviceName_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -53860,7 +55998,6 @@ public final class ContextOuterClass {
              */
             public Builder clearDeviceName() {
                 deviceName_ = getDefaultInstance().getDeviceName();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -53876,7 +56013,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 deviceName_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -53924,7 +56060,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 endpointName_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -53935,7 +56070,6 @@ public final class ContextOuterClass {
              */
             public Builder clearEndpointName() {
                 endpointName_ = getDefaultInstance().getEndpointName();
-                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -53951,7 +56085,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 endpointName_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -53999,7 +56132,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 endpointType_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -54010,7 +56142,6 @@ public final class ContextOuterClass {
              */
             public Builder clearEndpointType() {
                 endpointType_ = getDefaultInstance().getEndpointType();
-                bitField0_ = (bitField0_ & ~0x00000008);
                 onChanged();
                 return this;
             }
@@ -54026,7 +56157,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 endpointType_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -54058,17 +56188,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public EndPointName parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new EndPointName(input, extensionRegistry);
             }
         };
 
@@ -54139,6 +56259,57 @@ public final class ContextOuterClass {
             return new EndPointIdList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private EndPointIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    endpointIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                endpointIds_.add(input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    endpointIds_ = java.util.Collections.unmodifiableList(endpointIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_EndPointIdList_descriptor;
         }
@@ -54150,7 +56321,6 @@ public final class ContextOuterClass {
 
         public static final int ENDPOINT_IDS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List endpointIds_;
 
         /**
@@ -54211,7 +56381,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < endpointIds_.size(); i++) {
                 output.writeMessage(1, endpointIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -54223,7 +56393,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < endpointIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, endpointIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -54239,7 +56409,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.EndPointIdList other = (context.ContextOuterClass.EndPointIdList) obj;
             if (!getEndpointIdsList().equals(other.getEndpointIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -54255,7 +56425,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + ENDPOINT_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getEndpointIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -54349,23 +56519,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.EndPointIdList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getEndpointIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (endpointIdsBuilder_ == null) {
                     endpointIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    endpointIds_ = null;
                     endpointIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -54391,15 +56567,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.EndPointIdList buildPartial() {
                 context.ContextOuterClass.EndPointIdList result = new context.ContextOuterClass.EndPointIdList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.EndPointIdList result) {
+                int from_bitField0_ = bitField0_;
                 if (endpointIdsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         endpointIds_ = java.util.Collections.unmodifiableList(endpointIds_);
@@ -54409,10 +56577,38 @@ public final class ContextOuterClass {
                 } else {
                     result.endpointIds_ = endpointIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.EndPointIdList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -54452,7 +56648,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -54464,47 +56660,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.EndPointIdList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.EndPointId m = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-                                    if (endpointIdsBuilder_ == null) {
-                                        ensureEndpointIdsIsMutable();
-                                        endpointIds_.add(m);
-                                    } else {
-                                        endpointIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.EndPointIdList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -54774,17 +56940,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public EndPointIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new EndPointIdList(input, extensionRegistry);
             }
         };
 
@@ -54855,6 +57011,57 @@ public final class ContextOuterClass {
             return new EndPointNameList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private EndPointNameList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    endpointNames_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                endpointNames_.add(input.readMessage(context.ContextOuterClass.EndPointName.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    endpointNames_ = java.util.Collections.unmodifiableList(endpointNames_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_EndPointNameList_descriptor;
         }
@@ -54866,7 +57073,6 @@ public final class ContextOuterClass {
 
         public static final int ENDPOINT_NAMES_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List endpointNames_;
 
         /**
@@ -54927,7 +57133,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < endpointNames_.size(); i++) {
                 output.writeMessage(1, endpointNames_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -54939,7 +57145,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < endpointNames_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, endpointNames_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -54955,7 +57161,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.EndPointNameList other = (context.ContextOuterClass.EndPointNameList) obj;
             if (!getEndpointNamesList().equals(other.getEndpointNamesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -54971,7 +57177,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + ENDPOINT_NAMES_FIELD_NUMBER;
                 hash = (53 * hash) + getEndpointNamesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -55065,23 +57271,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.EndPointNameList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getEndpointNamesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (endpointNamesBuilder_ == null) {
                     endpointNames_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    endpointNames_ = null;
                     endpointNamesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -55107,15 +57319,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.EndPointNameList buildPartial() {
                 context.ContextOuterClass.EndPointNameList result = new context.ContextOuterClass.EndPointNameList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.EndPointNameList result) {
+                int from_bitField0_ = bitField0_;
                 if (endpointNamesBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         endpointNames_ = java.util.Collections.unmodifiableList(endpointNames_);
@@ -55125,10 +57329,38 @@ public final class ContextOuterClass {
                 } else {
                     result.endpointNames_ = endpointNamesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.EndPointNameList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -55168,7 +57400,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -55180,47 +57412,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.EndPointNameList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.EndPointName m = input.readMessage(context.ContextOuterClass.EndPointName.parser(), extensionRegistry);
-                                    if (endpointNamesBuilder_ == null) {
-                                        ensureEndpointNamesIsMutable();
-                                        endpointNames_.add(m);
-                                    } else {
-                                        endpointNamesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.EndPointNameList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -55490,17 +57692,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public EndPointNameList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new EndPointNameList(input, extensionRegistry);
             }
         };
 
@@ -55571,6 +57763,56 @@ public final class ContextOuterClass {
             return new ConfigRule_Custom();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConfigRule_Custom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                resourceKey_ = s;
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                resourceValue_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConfigRule_Custom_descriptor;
         }
@@ -55582,8 +57824,7 @@ public final class ContextOuterClass {
 
         public static final int RESOURCE_KEY_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object resourceKey_ = "";
+        private volatile java.lang.Object resourceKey_;
 
         /**
          * string resource_key = 1;
@@ -55620,8 +57861,7 @@ public final class ContextOuterClass {
 
         public static final int RESOURCE_VALUE_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object resourceValue_ = "";
+        private volatile java.lang.Object resourceValue_;
 
         /**
          * string resource_value = 2;
@@ -55671,13 +57911,13 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(resourceKey_)) {
+            if (!getResourceKeyBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, resourceKey_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(resourceValue_)) {
+            if (!getResourceValueBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, resourceValue_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -55686,13 +57926,13 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(resourceKey_)) {
+            if (!getResourceKeyBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, resourceKey_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(resourceValue_)) {
+            if (!getResourceValueBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, resourceValue_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -55710,7 +57950,7 @@ public final class ContextOuterClass {
                 return false;
             if (!getResourceValue().equals(other.getResourceValue()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -55726,7 +57966,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + getResourceKey().hashCode();
             hash = (37 * hash) + RESOURCE_VALUE_FIELD_NUMBER;
             hash = (53 * hash) + getResourceValue().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -55820,16 +58060,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConfigRule_Custom.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 resourceKey_ = "";
                 resourceValue_ = "";
                 return this;
@@ -55857,21 +58103,40 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConfigRule_Custom buildPartial() {
                 context.ContextOuterClass.ConfigRule_Custom result = new context.ContextOuterClass.ConfigRule_Custom(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.resourceKey_ = resourceKey_;
+                result.resourceValue_ = resourceValue_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConfigRule_Custom result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.resourceKey_ = resourceKey_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.resourceValue_ = resourceValue_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -55889,15 +58154,13 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getResourceKey().isEmpty()) {
                     resourceKey_ = other.resourceKey_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
                 if (!other.getResourceValue().isEmpty()) {
                     resourceValue_ = other.resourceValue_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -55909,54 +58172,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConfigRule_Custom parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    resourceKey_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    resourceValue_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConfigRule_Custom) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private java.lang.Object resourceKey_ = "";
 
             /**
@@ -56000,7 +58229,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 resourceKey_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -56011,7 +58239,6 @@ public final class ContextOuterClass {
              */
             public Builder clearResourceKey() {
                 resourceKey_ = getDefaultInstance().getResourceKey();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -56027,7 +58254,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 resourceKey_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -56075,7 +58301,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 resourceValue_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -56086,7 +58311,6 @@ public final class ContextOuterClass {
              */
             public Builder clearResourceValue() {
                 resourceValue_ = getDefaultInstance().getResourceValue();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -56102,7 +58326,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 resourceValue_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -56134,17 +58357,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConfigRule_Custom parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConfigRule_Custom(input, extensionRegistry);
             }
         };
 
@@ -56223,6 +58436,70 @@ public final class ContextOuterClass {
             return new ConfigRule_ACL();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConfigRule_ACL(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.EndPointId.Builder subBuilder = null;
+                                if (endpointId_ != null) {
+                                    subBuilder = endpointId_.toBuilder();
+                                }
+                                endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endpointId_);
+                                    endpointId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                acl.Acl.AclRuleSet.Builder subBuilder = null;
+                                if (ruleSet_ != null) {
+                                    subBuilder = ruleSet_.toBuilder();
+                                }
+                                ruleSet_ = input.readMessage(acl.Acl.AclRuleSet.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(ruleSet_);
+                                    ruleSet_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConfigRule_ACL_descriptor;
         }
@@ -56259,7 +58536,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+            return getEndpointId();
         }
 
         public static final int RULE_SET_FIELD_NUMBER = 2;
@@ -56289,7 +58566,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public acl.Acl.AclRuleSetOrBuilder getRuleSetOrBuilder() {
-            return ruleSet_ == null ? acl.Acl.AclRuleSet.getDefaultInstance() : ruleSet_;
+            return getRuleSet();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -56313,7 +58590,7 @@ public final class ContextOuterClass {
             if (ruleSet_ != null) {
                 output.writeMessage(2, getRuleSet());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -56328,7 +58605,7 @@ public final class ContextOuterClass {
             if (ruleSet_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getRuleSet());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -56354,7 +58631,7 @@ public final class ContextOuterClass {
                 if (!getRuleSet().equals(other.getRuleSet()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -56374,7 +58651,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + RULE_SET_FIELD_NUMBER;
                 hash = (53 * hash) + getRuleSet().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -56468,24 +58745,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConfigRule_ACL.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
-                ruleSet_ = null;
-                if (ruleSetBuilder_ != null) {
-                    ruleSetBuilder_.dispose();
+                if (ruleSetBuilder_ == null) {
+                    ruleSet_ = null;
+                } else {
+                    ruleSet_ = null;
                     ruleSetBuilder_ = null;
                 }
                 return this;
@@ -56513,21 +58798,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConfigRule_ACL buildPartial() {
                 context.ContextOuterClass.ConfigRule_ACL result = new context.ContextOuterClass.ConfigRule_ACL(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (endpointIdBuilder_ == null) {
+                    result.endpointId_ = endpointId_;
+                } else {
+                    result.endpointId_ = endpointIdBuilder_.build();
+                }
+                if (ruleSetBuilder_ == null) {
+                    result.ruleSet_ = ruleSet_;
+                } else {
+                    result.ruleSet_ = ruleSetBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConfigRule_ACL result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.endpointId_ = endpointIdBuilder_ == null ? endpointId_ : endpointIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.ruleSet_ = ruleSetBuilder_ == null ? ruleSet_ : ruleSetBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -56549,7 +58861,7 @@ public final class ContextOuterClass {
                 if (other.hasRuleSet()) {
                     mergeRuleSet(other.getRuleSet());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -56561,54 +58873,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConfigRule_ACL parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEndpointIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getRuleSetFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConfigRule_ACL) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.EndPointId endpointId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 endpointIdBuilder_;
@@ -56618,7 +58896,7 @@ public final class ContextOuterClass {
              * @return Whether the endpointId field is set.
              */
             public boolean hasEndpointId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return endpointIdBuilder_ != null || endpointId_ != null;
             }
 
             /**
@@ -56642,11 +58920,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     endpointId_ = value;
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -56656,11 +58933,10 @@ public final class ContextOuterClass {
             public Builder setEndpointId(context.ContextOuterClass.EndPointId.Builder builderForValue) {
                 if (endpointIdBuilder_ == null) {
                     endpointId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -56669,16 +58945,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
                 if (endpointIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && endpointId_ != null && endpointId_ != context.ContextOuterClass.EndPointId.getDefaultInstance()) {
-                        getEndpointIdBuilder().mergeFrom(value);
+                    if (endpointId_ != null) {
+                        endpointId_ = context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
                     } else {
                         endpointId_ = value;
                     }
+                    onChanged();
                 } else {
                     endpointIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -56686,13 +58961,13 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public Builder clearEndpointId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                    onChanged();
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -56700,7 +58975,6 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEndpointIdFieldBuilder().getBuilder();
             }
@@ -56736,7 +59010,7 @@ public final class ContextOuterClass {
              * @return Whether the ruleSet field is set.
              */
             public boolean hasRuleSet() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return ruleSetBuilder_ != null || ruleSet_ != null;
             }
 
             /**
@@ -56760,11 +59034,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     ruleSet_ = value;
+                    onChanged();
                 } else {
                     ruleSetBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -56774,11 +59047,10 @@ public final class ContextOuterClass {
             public Builder setRuleSet(acl.Acl.AclRuleSet.Builder builderForValue) {
                 if (ruleSetBuilder_ == null) {
                     ruleSet_ = builderForValue.build();
+                    onChanged();
                 } else {
                     ruleSetBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -56787,16 +59059,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeRuleSet(acl.Acl.AclRuleSet value) {
                 if (ruleSetBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && ruleSet_ != null && ruleSet_ != acl.Acl.AclRuleSet.getDefaultInstance()) {
-                        getRuleSetBuilder().mergeFrom(value);
+                    if (ruleSet_ != null) {
+                        ruleSet_ = acl.Acl.AclRuleSet.newBuilder(ruleSet_).mergeFrom(value).buildPartial();
                     } else {
                         ruleSet_ = value;
                     }
+                    onChanged();
                 } else {
                     ruleSetBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -56804,13 +59075,13 @@ public final class ContextOuterClass {
              * .acl.AclRuleSet rule_set = 2;
              */
             public Builder clearRuleSet() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                ruleSet_ = null;
-                if (ruleSetBuilder_ != null) {
-                    ruleSetBuilder_.dispose();
+                if (ruleSetBuilder_ == null) {
+                    ruleSet_ = null;
+                    onChanged();
+                } else {
+                    ruleSet_ = null;
                     ruleSetBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -56818,7 +59089,6 @@ public final class ContextOuterClass {
              * .acl.AclRuleSet rule_set = 2;
              */
             public acl.Acl.AclRuleSet.Builder getRuleSetBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getRuleSetFieldBuilder().getBuilder();
             }
@@ -56872,17 +59142,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConfigRule_ACL parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConfigRule_ACL(input, extensionRegistry);
             }
         };
 
@@ -56950,7 +59210,7 @@ public final class ContextOuterClass {
          */
         context.ContextOuterClass.ConfigRule_ACLOrBuilder getAclOrBuilder();
 
-        context.ContextOuterClass.ConfigRule.ConfigRuleCase getConfigRuleCase();
+        public context.ContextOuterClass.ConfigRule.ConfigRuleCase getConfigRuleCase();
     }
 
     /**
@@ -56976,6 +59236,78 @@ public final class ContextOuterClass {
             return new ConfigRule();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConfigRule(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                int rawValue = input.readEnum();
+                                action_ = rawValue;
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.ConfigRule_Custom.Builder subBuilder = null;
+                                if (configRuleCase_ == 2) {
+                                    subBuilder = ((context.ContextOuterClass.ConfigRule_Custom) configRule_).toBuilder();
+                                }
+                                configRule_ = input.readMessage(context.ContextOuterClass.ConfigRule_Custom.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.ConfigRule_Custom) configRule_);
+                                    configRule_ = subBuilder.buildPartial();
+                                }
+                                configRuleCase_ = 2;
+                                break;
+                            }
+                        case 26:
+                            {
+                                context.ContextOuterClass.ConfigRule_ACL.Builder subBuilder = null;
+                                if (configRuleCase_ == 3) {
+                                    subBuilder = ((context.ContextOuterClass.ConfigRule_ACL) configRule_).toBuilder();
+                                }
+                                configRule_ = input.readMessage(context.ContextOuterClass.ConfigRule_ACL.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.ConfigRule_ACL) configRule_);
+                                    configRule_ = subBuilder.buildPartial();
+                                }
+                                configRuleCase_ = 3;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConfigRule_descriptor;
         }
@@ -56987,7 +59319,6 @@ public final class ContextOuterClass {
 
         private int configRuleCase_ = 0;
 
-        @SuppressWarnings("serial")
         private java.lang.Object configRule_;
 
         public enum ConfigRuleCase implements com.google.protobuf.Internal.EnumLite, com.google.protobuf.AbstractMessage.InternalOneOfEnum {
@@ -57034,7 +59365,7 @@ public final class ContextOuterClass {
 
         public static final int ACTION_FIELD_NUMBER = 1;
 
-        private int action_ = 0;
+        private int action_;
 
         /**
          * .context.ConfigActionEnum action = 1;
@@ -57051,7 +59382,8 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConfigActionEnum getAction() {
-            context.ContextOuterClass.ConfigActionEnum result = context.ContextOuterClass.ConfigActionEnum.forNumber(action_);
+            @SuppressWarnings("deprecation")
+            context.ContextOuterClass.ConfigActionEnum result = context.ContextOuterClass.ConfigActionEnum.valueOf(action_);
             return result == null ? context.ContextOuterClass.ConfigActionEnum.UNRECOGNIZED : result;
         }
 
@@ -57147,7 +59479,7 @@ public final class ContextOuterClass {
             if (configRuleCase_ == 3) {
                 output.writeMessage(3, (context.ContextOuterClass.ConfigRule_ACL) configRule_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -57165,7 +59497,7 @@ public final class ContextOuterClass {
             if (configRuleCase_ == 3) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, (context.ContextOuterClass.ConfigRule_ACL) configRule_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -57195,7 +59527,7 @@ public final class ContextOuterClass {
                 case 0:
                 default:
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -57221,7 +59553,7 @@ public final class ContextOuterClass {
                 case 0:
                 default:
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -57315,23 +59647,23 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConfigRule.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 action_ = 0;
-                if (customBuilder_ != null) {
-                    customBuilder_.clear();
-                }
-                if (aclBuilder_ != null) {
-                    aclBuilder_.clear();
-                }
                 configRuleCase_ = 0;
                 configRule_ = null;
                 return this;
@@ -57359,30 +59691,54 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConfigRule buildPartial() {
                 context.ContextOuterClass.ConfigRule result = new context.ContextOuterClass.ConfigRule(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                result.action_ = action_;
+                if (configRuleCase_ == 2) {
+                    if (customBuilder_ == null) {
+                        result.configRule_ = configRule_;
+                    } else {
+                        result.configRule_ = customBuilder_.build();
+                    }
                 }
-                buildPartialOneofs(result);
+                if (configRuleCase_ == 3) {
+                    if (aclBuilder_ == null) {
+                        result.configRule_ = configRule_;
+                    } else {
+                        result.configRule_ = aclBuilder_.build();
+                    }
+                }
+                result.configRuleCase_ = configRuleCase_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConfigRule result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.action_ = action_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
             }
 
-            private void buildPartialOneofs(context.ContextOuterClass.ConfigRule result) {
-                result.configRuleCase_ = configRuleCase_;
-                result.configRule_ = this.configRule_;
-                if (configRuleCase_ == 2 && customBuilder_ != null) {
-                    result.configRule_ = customBuilder_.build();
-                }
-                if (configRuleCase_ == 3 && aclBuilder_ != null) {
-                    result.configRule_ = aclBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -57417,7 +59773,7 @@ public final class ContextOuterClass {
                             break;
                         }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -57429,56 +59785,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConfigRule parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    action_ = input.readEnum();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            case 18:
-                                {
-                                    input.readMessage(getCustomFieldBuilder().getBuilder(), extensionRegistry);
-                                    configRuleCase_ = 2;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getAclFieldBuilder().getBuilder(), extensionRegistry);
-                                    configRuleCase_ = 3;
-                                    break;
-                                }
-                            // case 26
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConfigRule) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -57497,8 +59814,6 @@ public final class ContextOuterClass {
                 return this;
             }
 
-            private int bitField0_;
-
             private int action_ = 0;
 
             /**
@@ -57517,7 +59832,6 @@ public final class ContextOuterClass {
              */
             public Builder setActionValue(int value) {
                 action_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -57528,7 +59842,8 @@ public final class ContextOuterClass {
              */
             @java.lang.Override
             public context.ContextOuterClass.ConfigActionEnum getAction() {
-                context.ContextOuterClass.ConfigActionEnum result = context.ContextOuterClass.ConfigActionEnum.forNumber(action_);
+                @SuppressWarnings("deprecation")
+                context.ContextOuterClass.ConfigActionEnum result = context.ContextOuterClass.ConfigActionEnum.valueOf(action_);
                 return result == null ? context.ContextOuterClass.ConfigActionEnum.UNRECOGNIZED : result;
             }
 
@@ -57541,7 +59856,6 @@ public final class ContextOuterClass {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000001;
                 action_ = value.getNumber();
                 onChanged();
                 return this;
@@ -57552,7 +59866,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearAction() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 action_ = 0;
                 onChanged();
                 return this;
@@ -57633,9 +59946,8 @@ public final class ContextOuterClass {
                 } else {
                     if (configRuleCase_ == 2) {
                         customBuilder_.mergeFrom(value);
-                    } else {
-                        customBuilder_.setMessage(value);
                     }
+                    customBuilder_.setMessage(value);
                 }
                 configRuleCase_ = 2;
                 return this;
@@ -57696,6 +60008,7 @@ public final class ContextOuterClass {
                 }
                 configRuleCase_ = 2;
                 onChanged();
+                ;
                 return customBuilder_;
             }
 
@@ -57774,9 +60087,8 @@ public final class ContextOuterClass {
                 } else {
                     if (configRuleCase_ == 3) {
                         aclBuilder_.mergeFrom(value);
-                    } else {
-                        aclBuilder_.setMessage(value);
                     }
+                    aclBuilder_.setMessage(value);
                 }
                 configRuleCase_ = 3;
                 return this;
@@ -57837,6 +60149,7 @@ public final class ContextOuterClass {
                 }
                 configRuleCase_ = 3;
                 onChanged();
+                ;
                 return aclBuilder_;
             }
 
@@ -57867,17 +60180,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConfigRule parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConfigRule(input, extensionRegistry);
             }
         };
 
@@ -57948,6 +60251,56 @@ public final class ContextOuterClass {
             return new Constraint_Custom();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_Custom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                constraintType_ = s;
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                constraintValue_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_Custom_descriptor;
         }
@@ -57959,8 +60312,7 @@ public final class ContextOuterClass {
 
         public static final int CONSTRAINT_TYPE_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object constraintType_ = "";
+        private volatile java.lang.Object constraintType_;
 
         /**
          * string constraint_type = 1;
@@ -57997,8 +60349,7 @@ public final class ContextOuterClass {
 
         public static final int CONSTRAINT_VALUE_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object constraintValue_ = "";
+        private volatile java.lang.Object constraintValue_;
 
         /**
          * string constraint_value = 2;
@@ -58048,13 +60399,13 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(constraintType_)) {
+            if (!getConstraintTypeBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, constraintType_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(constraintValue_)) {
+            if (!getConstraintValueBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, constraintValue_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -58063,13 +60414,13 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(constraintType_)) {
+            if (!getConstraintTypeBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, constraintType_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(constraintValue_)) {
+            if (!getConstraintValueBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, constraintValue_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -58087,7 +60438,7 @@ public final class ContextOuterClass {
                 return false;
             if (!getConstraintValue().equals(other.getConstraintValue()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -58103,7 +60454,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + getConstraintType().hashCode();
             hash = (37 * hash) + CONSTRAINT_VALUE_FIELD_NUMBER;
             hash = (53 * hash) + getConstraintValue().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -58197,16 +60548,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_Custom.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 constraintType_ = "";
                 constraintValue_ = "";
                 return this;
@@ -58234,21 +60591,40 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_Custom buildPartial() {
                 context.ContextOuterClass.Constraint_Custom result = new context.ContextOuterClass.Constraint_Custom(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.constraintType_ = constraintType_;
+                result.constraintValue_ = constraintValue_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_Custom result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.constraintType_ = constraintType_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.constraintValue_ = constraintValue_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -58266,15 +60642,13 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getConstraintType().isEmpty()) {
                     constraintType_ = other.constraintType_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
                 if (!other.getConstraintValue().isEmpty()) {
                     constraintValue_ = other.constraintValue_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -58286,54 +60660,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_Custom parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    constraintType_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    constraintValue_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_Custom) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private java.lang.Object constraintType_ = "";
 
             /**
@@ -58377,7 +60717,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 constraintType_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -58388,7 +60727,6 @@ public final class ContextOuterClass {
              */
             public Builder clearConstraintType() {
                 constraintType_ = getDefaultInstance().getConstraintType();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -58404,7 +60742,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 constraintType_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -58452,7 +60789,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 constraintValue_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -58463,7 +60799,6 @@ public final class ContextOuterClass {
              */
             public Builder clearConstraintValue() {
                 constraintValue_ = getDefaultInstance().getConstraintValue();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -58479,7 +60814,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 constraintValue_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -58511,17 +60845,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_Custom parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_Custom(input, extensionRegistry);
             }
         };
 
@@ -58578,6 +60902,54 @@ public final class ContextOuterClass {
             return new Constraint_Schedule();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_Schedule(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 13:
+                            {
+                                startTimestamp_ = input.readFloat();
+                                break;
+                            }
+                        case 21:
+                            {
+                                durationDays_ = input.readFloat();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_Schedule_descriptor;
         }
@@ -58589,7 +60961,7 @@ public final class ContextOuterClass {
 
         public static final int START_TIMESTAMP_FIELD_NUMBER = 1;
 
-        private float startTimestamp_ = 0F;
+        private float startTimestamp_;
 
         /**
          * float start_timestamp = 1;
@@ -58602,7 +60974,7 @@ public final class ContextOuterClass {
 
         public static final int DURATION_DAYS_FIELD_NUMBER = 2;
 
-        private float durationDays_ = 0F;
+        private float durationDays_;
 
         /**
          * float duration_days = 2;
@@ -58628,13 +61000,13 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (java.lang.Float.floatToRawIntBits(startTimestamp_) != 0) {
+            if (startTimestamp_ != 0F) {
                 output.writeFloat(1, startTimestamp_);
             }
-            if (java.lang.Float.floatToRawIntBits(durationDays_) != 0) {
+            if (durationDays_ != 0F) {
                 output.writeFloat(2, durationDays_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -58643,13 +61015,13 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (java.lang.Float.floatToRawIntBits(startTimestamp_) != 0) {
+            if (startTimestamp_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, startTimestamp_);
             }
-            if (java.lang.Float.floatToRawIntBits(durationDays_) != 0) {
+            if (durationDays_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(2, durationDays_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -58667,7 +61039,7 @@ public final class ContextOuterClass {
                 return false;
             if (java.lang.Float.floatToIntBits(getDurationDays()) != java.lang.Float.floatToIntBits(other.getDurationDays()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -58683,7 +61055,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getStartTimestamp());
             hash = (37 * hash) + DURATION_DAYS_FIELD_NUMBER;
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getDurationDays());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -58777,16 +61149,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_Schedule.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 startTimestamp_ = 0F;
                 durationDays_ = 0F;
                 return this;
@@ -58814,21 +61192,40 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_Schedule buildPartial() {
                 context.ContextOuterClass.Constraint_Schedule result = new context.ContextOuterClass.Constraint_Schedule(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.startTimestamp_ = startTimestamp_;
+                result.durationDays_ = durationDays_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_Schedule result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.startTimestamp_ = startTimestamp_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.durationDays_ = durationDays_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -58850,7 +61247,7 @@ public final class ContextOuterClass {
                 if (other.getDurationDays() != 0F) {
                     setDurationDays(other.getDurationDays());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -58862,54 +61259,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_Schedule parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 13:
-                                {
-                                    startTimestamp_ = input.readFloat();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 13
-                            case 21:
-                                {
-                                    durationDays_ = input.readFloat();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 21
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_Schedule) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private float startTimestamp_;
 
             /**
@@ -58928,7 +61291,6 @@ public final class ContextOuterClass {
              */
             public Builder setStartTimestamp(float value) {
                 startTimestamp_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -58938,7 +61300,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearStartTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 startTimestamp_ = 0F;
                 onChanged();
                 return this;
@@ -58962,7 +61323,6 @@ public final class ContextOuterClass {
              */
             public Builder setDurationDays(float value) {
                 durationDays_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -58972,7 +61332,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearDurationDays() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 durationDays_ = 0F;
                 onChanged();
                 return this;
@@ -59005,17 +61364,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_Schedule parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_Schedule(input, extensionRegistry);
             }
         };
 
@@ -59072,6 +61421,54 @@ public final class ContextOuterClass {
             return new GPS_Position();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private GPS_Position(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 13:
+                            {
+                                latitude_ = input.readFloat();
+                                break;
+                            }
+                        case 21:
+                            {
+                                longitude_ = input.readFloat();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_GPS_Position_descriptor;
         }
@@ -59083,7 +61480,7 @@ public final class ContextOuterClass {
 
         public static final int LATITUDE_FIELD_NUMBER = 1;
 
-        private float latitude_ = 0F;
+        private float latitude_;
 
         /**
          * float latitude = 1;
@@ -59096,7 +61493,7 @@ public final class ContextOuterClass {
 
         public static final int LONGITUDE_FIELD_NUMBER = 2;
 
-        private float longitude_ = 0F;
+        private float longitude_;
 
         /**
          * float longitude = 2;
@@ -59122,13 +61519,13 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (java.lang.Float.floatToRawIntBits(latitude_) != 0) {
+            if (latitude_ != 0F) {
                 output.writeFloat(1, latitude_);
             }
-            if (java.lang.Float.floatToRawIntBits(longitude_) != 0) {
+            if (longitude_ != 0F) {
                 output.writeFloat(2, longitude_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -59137,13 +61534,13 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (java.lang.Float.floatToRawIntBits(latitude_) != 0) {
+            if (latitude_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, latitude_);
             }
-            if (java.lang.Float.floatToRawIntBits(longitude_) != 0) {
+            if (longitude_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(2, longitude_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -59161,7 +61558,7 @@ public final class ContextOuterClass {
                 return false;
             if (java.lang.Float.floatToIntBits(getLongitude()) != java.lang.Float.floatToIntBits(other.getLongitude()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -59177,7 +61574,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getLatitude());
             hash = (37 * hash) + LONGITUDE_FIELD_NUMBER;
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getLongitude());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -59271,16 +61668,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.GPS_Position.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 latitude_ = 0F;
                 longitude_ = 0F;
                 return this;
@@ -59308,21 +61711,40 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.GPS_Position buildPartial() {
                 context.ContextOuterClass.GPS_Position result = new context.ContextOuterClass.GPS_Position(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.latitude_ = latitude_;
+                result.longitude_ = longitude_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.GPS_Position result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.latitude_ = latitude_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.longitude_ = longitude_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -59344,7 +61766,7 @@ public final class ContextOuterClass {
                 if (other.getLongitude() != 0F) {
                     setLongitude(other.getLongitude());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -59356,54 +61778,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.GPS_Position parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 13:
-                                {
-                                    latitude_ = input.readFloat();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 13
-                            case 21:
-                                {
-                                    longitude_ = input.readFloat();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 21
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.GPS_Position) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private float latitude_;
 
             /**
@@ -59422,7 +61810,6 @@ public final class ContextOuterClass {
              */
             public Builder setLatitude(float value) {
                 latitude_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -59432,7 +61819,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearLatitude() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 latitude_ = 0F;
                 onChanged();
                 return this;
@@ -59456,7 +61842,6 @@ public final class ContextOuterClass {
              */
             public Builder setLongitude(float value) {
                 longitude_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -59466,7 +61851,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearLongitude() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 longitude_ = 0F;
                 onChanged();
                 return this;
@@ -59499,17 +61883,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public GPS_Position parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new GPS_Position(input, extensionRegistry);
             }
         };
 
@@ -59566,7 +61940,7 @@ public final class ContextOuterClass {
          */
         context.ContextOuterClass.GPS_PositionOrBuilder getGpsPositionOrBuilder();
 
-        context.ContextOuterClass.Location.LocationCase getLocationCase();
+        public context.ContextOuterClass.Location.LocationCase getLocationCase();
     }
 
     /**
@@ -59591,6 +61965,65 @@ public final class ContextOuterClass {
             return new Location();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Location(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                locationCase_ = 1;
+                                location_ = s;
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.GPS_Position.Builder subBuilder = null;
+                                if (locationCase_ == 2) {
+                                    subBuilder = ((context.ContextOuterClass.GPS_Position) location_).toBuilder();
+                                }
+                                location_ = input.readMessage(context.ContextOuterClass.GPS_Position.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.GPS_Position) location_);
+                                    location_ = subBuilder.buildPartial();
+                                }
+                                locationCase_ = 2;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Location_descriptor;
         }
@@ -59602,7 +62035,6 @@ public final class ContextOuterClass {
 
         private int locationCase_ = 0;
 
-        @SuppressWarnings("serial")
         private java.lang.Object location_;
 
         public enum LocationCase implements com.google.protobuf.Internal.EnumLite, com.google.protobuf.AbstractMessage.InternalOneOfEnum {
@@ -59753,7 +62185,7 @@ public final class ContextOuterClass {
             if (locationCase_ == 2) {
                 output.writeMessage(2, (context.ContextOuterClass.GPS_Position) location_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -59768,7 +62200,7 @@ public final class ContextOuterClass {
             if (locationCase_ == 2) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, (context.ContextOuterClass.GPS_Position) location_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -59796,7 +62228,7 @@ public final class ContextOuterClass {
                 case 0:
                 default:
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -59820,7 +62252,7 @@ public final class ContextOuterClass {
                 case 0:
                 default:
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -59914,19 +62346,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Location.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                if (gpsPositionBuilder_ != null) {
-                    gpsPositionBuilder_.clear();
-                }
                 locationCase_ = 0;
                 location_ = null;
                 return this;
@@ -59954,24 +62389,49 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Location buildPartial() {
                 context.ContextOuterClass.Location result = new context.ContextOuterClass.Location(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (locationCase_ == 1) {
+                    result.location_ = location_;
+                }
+                if (locationCase_ == 2) {
+                    if (gpsPositionBuilder_ == null) {
+                        result.location_ = location_;
+                    } else {
+                        result.location_ = gpsPositionBuilder_.build();
+                    }
                 }
-                buildPartialOneofs(result);
+                result.locationCase_ = locationCase_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Location result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
             }
 
-            private void buildPartialOneofs(context.ContextOuterClass.Location result) {
-                result.locationCase_ = locationCase_;
-                result.location_ = this.location_;
-                if (locationCase_ == 2 && gpsPositionBuilder_ != null) {
-                    result.location_ = gpsPositionBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -60005,7 +62465,7 @@ public final class ContextOuterClass {
                             break;
                         }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -60017,50 +62477,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Location parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    java.lang.String s = input.readStringRequireUtf8();
-                                    locationCase_ = 1;
-                                    location_ = s;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getGpsPositionFieldBuilder().getBuilder(), extensionRegistry);
-                                    locationCase_ = 2;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Location) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -60079,8 +62506,6 @@ public final class ContextOuterClass {
                 return this;
             }
 
-            private int bitField0_;
-
             /**
              * string region = 1;
              * @return Whether the region field is set.
@@ -60252,9 +62677,8 @@ public final class ContextOuterClass {
                 } else {
                     if (locationCase_ == 2) {
                         gpsPositionBuilder_.mergeFrom(value);
-                    } else {
-                        gpsPositionBuilder_.setMessage(value);
                     }
+                    gpsPositionBuilder_.setMessage(value);
                 }
                 locationCase_ = 2;
                 return this;
@@ -60315,6 +62739,7 @@ public final class ContextOuterClass {
                 }
                 locationCase_ = 2;
                 onChanged();
+                ;
                 return gpsPositionBuilder_;
             }
 
@@ -60345,17 +62770,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Location parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Location(input, extensionRegistry);
             }
         };
 
@@ -60434,6 +62849,70 @@ public final class ContextOuterClass {
             return new Constraint_EndPointLocation();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_EndPointLocation(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.EndPointId.Builder subBuilder = null;
+                                if (endpointId_ != null) {
+                                    subBuilder = endpointId_.toBuilder();
+                                }
+                                endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endpointId_);
+                                    endpointId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.Location.Builder subBuilder = null;
+                                if (location_ != null) {
+                                    subBuilder = location_.toBuilder();
+                                }
+                                location_ = input.readMessage(context.ContextOuterClass.Location.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(location_);
+                                    location_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_EndPointLocation_descriptor;
         }
@@ -60470,7 +62949,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+            return getEndpointId();
         }
 
         public static final int LOCATION_FIELD_NUMBER = 2;
@@ -60500,7 +62979,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.LocationOrBuilder getLocationOrBuilder() {
-            return location_ == null ? context.ContextOuterClass.Location.getDefaultInstance() : location_;
+            return getLocation();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -60524,7 +63003,7 @@ public final class ContextOuterClass {
             if (location_ != null) {
                 output.writeMessage(2, getLocation());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -60539,7 +63018,7 @@ public final class ContextOuterClass {
             if (location_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getLocation());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -60565,7 +63044,7 @@ public final class ContextOuterClass {
                 if (!getLocation().equals(other.getLocation()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -60585,7 +63064,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + LOCATION_FIELD_NUMBER;
                 hash = (53 * hash) + getLocation().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -60679,24 +63158,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_EndPointLocation.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
-                location_ = null;
-                if (locationBuilder_ != null) {
-                    locationBuilder_.dispose();
+                if (locationBuilder_ == null) {
+                    location_ = null;
+                } else {
+                    location_ = null;
                     locationBuilder_ = null;
                 }
                 return this;
@@ -60724,21 +63211,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_EndPointLocation buildPartial() {
                 context.ContextOuterClass.Constraint_EndPointLocation result = new context.ContextOuterClass.Constraint_EndPointLocation(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (endpointIdBuilder_ == null) {
+                    result.endpointId_ = endpointId_;
+                } else {
+                    result.endpointId_ = endpointIdBuilder_.build();
+                }
+                if (locationBuilder_ == null) {
+                    result.location_ = location_;
+                } else {
+                    result.location_ = locationBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_EndPointLocation result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.endpointId_ = endpointIdBuilder_ == null ? endpointId_ : endpointIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.location_ = locationBuilder_ == null ? location_ : locationBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -60760,7 +63274,7 @@ public final class ContextOuterClass {
                 if (other.hasLocation()) {
                     mergeLocation(other.getLocation());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -60772,54 +63286,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_EndPointLocation parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEndpointIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getLocationFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_EndPointLocation) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.EndPointId endpointId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 endpointIdBuilder_;
@@ -60829,7 +63309,7 @@ public final class ContextOuterClass {
              * @return Whether the endpointId field is set.
              */
             public boolean hasEndpointId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return endpointIdBuilder_ != null || endpointId_ != null;
             }
 
             /**
@@ -60853,11 +63333,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     endpointId_ = value;
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -60867,11 +63346,10 @@ public final class ContextOuterClass {
             public Builder setEndpointId(context.ContextOuterClass.EndPointId.Builder builderForValue) {
                 if (endpointIdBuilder_ == null) {
                     endpointId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -60880,16 +63358,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
                 if (endpointIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && endpointId_ != null && endpointId_ != context.ContextOuterClass.EndPointId.getDefaultInstance()) {
-                        getEndpointIdBuilder().mergeFrom(value);
+                    if (endpointId_ != null) {
+                        endpointId_ = context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
                     } else {
                         endpointId_ = value;
                     }
+                    onChanged();
                 } else {
                     endpointIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -60897,13 +63374,13 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public Builder clearEndpointId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                    onChanged();
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -60911,7 +63388,6 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEndpointIdFieldBuilder().getBuilder();
             }
@@ -60947,7 +63423,7 @@ public final class ContextOuterClass {
              * @return Whether the location field is set.
              */
             public boolean hasLocation() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return locationBuilder_ != null || location_ != null;
             }
 
             /**
@@ -60971,11 +63447,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     location_ = value;
+                    onChanged();
                 } else {
                     locationBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -60985,11 +63460,10 @@ public final class ContextOuterClass {
             public Builder setLocation(context.ContextOuterClass.Location.Builder builderForValue) {
                 if (locationBuilder_ == null) {
                     location_ = builderForValue.build();
+                    onChanged();
                 } else {
                     locationBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -60998,16 +63472,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeLocation(context.ContextOuterClass.Location value) {
                 if (locationBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && location_ != null && location_ != context.ContextOuterClass.Location.getDefaultInstance()) {
-                        getLocationBuilder().mergeFrom(value);
+                    if (location_ != null) {
+                        location_ = context.ContextOuterClass.Location.newBuilder(location_).mergeFrom(value).buildPartial();
                     } else {
                         location_ = value;
                     }
+                    onChanged();
                 } else {
                     locationBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -61015,13 +63488,13 @@ public final class ContextOuterClass {
              * .context.Location location = 2;
              */
             public Builder clearLocation() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                location_ = null;
-                if (locationBuilder_ != null) {
-                    locationBuilder_.dispose();
+                if (locationBuilder_ == null) {
+                    location_ = null;
+                    onChanged();
+                } else {
+                    location_ = null;
                     locationBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -61029,7 +63502,6 @@ public final class ContextOuterClass {
              * .context.Location location = 2;
              */
             public context.ContextOuterClass.Location.Builder getLocationBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getLocationFieldBuilder().getBuilder();
             }
@@ -61083,17 +63555,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_EndPointLocation parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_EndPointLocation(input, extensionRegistry);
             }
         };
 
@@ -61161,6 +63623,62 @@ public final class ContextOuterClass {
             return new Constraint_EndPointPriority();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_EndPointPriority(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.EndPointId.Builder subBuilder = null;
+                                if (endpointId_ != null) {
+                                    subBuilder = endpointId_.toBuilder();
+                                }
+                                endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endpointId_);
+                                    endpointId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 16:
+                            {
+                                priority_ = input.readUInt32();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_EndPointPriority_descriptor;
         }
@@ -61197,12 +63715,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+            return getEndpointId();
         }
 
         public static final int PRIORITY_FIELD_NUMBER = 2;
 
-        private int priority_ = 0;
+        private int priority_;
 
         /**
          * uint32 priority = 2;
@@ -61234,7 +63752,7 @@ public final class ContextOuterClass {
             if (priority_ != 0) {
                 output.writeUInt32(2, priority_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -61249,7 +63767,7 @@ public final class ContextOuterClass {
             if (priority_ != 0) {
                 size += com.google.protobuf.CodedOutputStream.computeUInt32Size(2, priority_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -61271,7 +63789,7 @@ public final class ContextOuterClass {
             }
             if (getPriority() != other.getPriority())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -61289,7 +63807,7 @@ public final class ContextOuterClass {
             }
             hash = (37 * hash) + PRIORITY_FIELD_NUMBER;
             hash = (53 * hash) + getPriority();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -61383,19 +63901,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_EndPointPriority.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
                 priority_ = 0;
@@ -61424,21 +63949,44 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_EndPointPriority buildPartial() {
                 context.ContextOuterClass.Constraint_EndPointPriority result = new context.ContextOuterClass.Constraint_EndPointPriority(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (endpointIdBuilder_ == null) {
+                    result.endpointId_ = endpointId_;
+                } else {
+                    result.endpointId_ = endpointIdBuilder_.build();
                 }
+                result.priority_ = priority_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_EndPointPriority result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.endpointId_ = endpointIdBuilder_ == null ? endpointId_ : endpointIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.priority_ = priority_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -61460,7 +64008,7 @@ public final class ContextOuterClass {
                 if (other.getPriority() != 0) {
                     setPriority(other.getPriority());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -61472,54 +64020,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_EndPointPriority parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEndpointIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 16:
-                                {
-                                    priority_ = input.readUInt32();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_EndPointPriority) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.EndPointId endpointId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 endpointIdBuilder_;
@@ -61529,7 +64043,7 @@ public final class ContextOuterClass {
              * @return Whether the endpointId field is set.
              */
             public boolean hasEndpointId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return endpointIdBuilder_ != null || endpointId_ != null;
             }
 
             /**
@@ -61553,11 +64067,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     endpointId_ = value;
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -61567,11 +64080,10 @@ public final class ContextOuterClass {
             public Builder setEndpointId(context.ContextOuterClass.EndPointId.Builder builderForValue) {
                 if (endpointIdBuilder_ == null) {
                     endpointId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -61580,16 +64092,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
                 if (endpointIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && endpointId_ != null && endpointId_ != context.ContextOuterClass.EndPointId.getDefaultInstance()) {
-                        getEndpointIdBuilder().mergeFrom(value);
+                    if (endpointId_ != null) {
+                        endpointId_ = context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
                     } else {
                         endpointId_ = value;
                     }
+                    onChanged();
                 } else {
                     endpointIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -61597,13 +64108,13 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public Builder clearEndpointId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                    onChanged();
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -61611,7 +64122,6 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEndpointIdFieldBuilder().getBuilder();
             }
@@ -61656,7 +64166,6 @@ public final class ContextOuterClass {
              */
             public Builder setPriority(int value) {
                 priority_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -61666,7 +64175,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearPriority() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 priority_ = 0;
                 onChanged();
                 return this;
@@ -61699,17 +64207,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_EndPointPriority parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_EndPointPriority(input, extensionRegistry);
             }
         };
 
@@ -61760,6 +64258,49 @@ public final class ContextOuterClass {
             return new Constraint_SLA_Latency();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_SLA_Latency(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 13:
+                            {
+                                e2ELatencyMs_ = input.readFloat();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_SLA_Latency_descriptor;
         }
@@ -61771,7 +64312,7 @@ public final class ContextOuterClass {
 
         public static final int E2E_LATENCY_MS_FIELD_NUMBER = 1;
 
-        private float e2ELatencyMs_ = 0F;
+        private float e2ELatencyMs_;
 
         /**
          * float e2e_latency_ms = 1;
@@ -61797,10 +64338,10 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (java.lang.Float.floatToRawIntBits(e2ELatencyMs_) != 0) {
+            if (e2ELatencyMs_ != 0F) {
                 output.writeFloat(1, e2ELatencyMs_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -61809,10 +64350,10 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (java.lang.Float.floatToRawIntBits(e2ELatencyMs_) != 0) {
+            if (e2ELatencyMs_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, e2ELatencyMs_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -61828,7 +64369,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.Constraint_SLA_Latency other = (context.ContextOuterClass.Constraint_SLA_Latency) obj;
             if (java.lang.Float.floatToIntBits(getE2ELatencyMs()) != java.lang.Float.floatToIntBits(other.getE2ELatencyMs()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -61842,7 +64383,7 @@ public final class ContextOuterClass {
             hash = (19 * hash) + getDescriptor().hashCode();
             hash = (37 * hash) + E2E_LATENCY_MS_FIELD_NUMBER;
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getE2ELatencyMs());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -61936,16 +64477,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_SLA_Latency.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 e2ELatencyMs_ = 0F;
                 return this;
             }
@@ -61972,18 +64519,39 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_SLA_Latency buildPartial() {
                 context.ContextOuterClass.Constraint_SLA_Latency result = new context.ContextOuterClass.Constraint_SLA_Latency(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.e2ELatencyMs_ = e2ELatencyMs_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_SLA_Latency result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.e2ELatencyMs_ = e2ELatencyMs_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -62002,7 +64570,7 @@ public final class ContextOuterClass {
                 if (other.getE2ELatencyMs() != 0F) {
                     setE2ELatencyMs(other.getE2ELatencyMs());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -62014,47 +64582,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_SLA_Latency parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 13:
-                                {
-                                    e2ELatencyMs_ = input.readFloat();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 13
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_SLA_Latency) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private float e2ELatencyMs_;
 
             /**
@@ -62073,7 +64614,6 @@ public final class ContextOuterClass {
              */
             public Builder setE2ELatencyMs(float value) {
                 e2ELatencyMs_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -62083,7 +64623,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearE2ELatencyMs() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 e2ELatencyMs_ = 0F;
                 onChanged();
                 return this;
@@ -62116,17 +64655,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_SLA_Latency parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_SLA_Latency(input, extensionRegistry);
             }
         };
 
@@ -62177,6 +64706,49 @@ public final class ContextOuterClass {
             return new Constraint_SLA_Capacity();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_SLA_Capacity(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 13:
+                            {
+                                capacityGbps_ = input.readFloat();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_SLA_Capacity_descriptor;
         }
@@ -62188,7 +64760,7 @@ public final class ContextOuterClass {
 
         public static final int CAPACITY_GBPS_FIELD_NUMBER = 1;
 
-        private float capacityGbps_ = 0F;
+        private float capacityGbps_;
 
         /**
          * float capacity_gbps = 1;
@@ -62214,10 +64786,10 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (java.lang.Float.floatToRawIntBits(capacityGbps_) != 0) {
+            if (capacityGbps_ != 0F) {
                 output.writeFloat(1, capacityGbps_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -62226,10 +64798,10 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (java.lang.Float.floatToRawIntBits(capacityGbps_) != 0) {
+            if (capacityGbps_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, capacityGbps_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -62245,7 +64817,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.Constraint_SLA_Capacity other = (context.ContextOuterClass.Constraint_SLA_Capacity) obj;
             if (java.lang.Float.floatToIntBits(getCapacityGbps()) != java.lang.Float.floatToIntBits(other.getCapacityGbps()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -62259,7 +64831,7 @@ public final class ContextOuterClass {
             hash = (19 * hash) + getDescriptor().hashCode();
             hash = (37 * hash) + CAPACITY_GBPS_FIELD_NUMBER;
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getCapacityGbps());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -62353,16 +64925,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_SLA_Capacity.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 capacityGbps_ = 0F;
                 return this;
             }
@@ -62389,18 +64967,39 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_SLA_Capacity buildPartial() {
                 context.ContextOuterClass.Constraint_SLA_Capacity result = new context.ContextOuterClass.Constraint_SLA_Capacity(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.capacityGbps_ = capacityGbps_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_SLA_Capacity result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.capacityGbps_ = capacityGbps_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -62419,7 +65018,7 @@ public final class ContextOuterClass {
                 if (other.getCapacityGbps() != 0F) {
                     setCapacityGbps(other.getCapacityGbps());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -62431,47 +65030,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_SLA_Capacity parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 13:
-                                {
-                                    capacityGbps_ = input.readFloat();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 13
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_SLA_Capacity) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private float capacityGbps_;
 
             /**
@@ -62490,7 +65062,6 @@ public final class ContextOuterClass {
              */
             public Builder setCapacityGbps(float value) {
                 capacityGbps_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -62500,7 +65071,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearCapacityGbps() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 capacityGbps_ = 0F;
                 onChanged();
                 return this;
@@ -62533,17 +65103,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_SLA_Capacity parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_SLA_Capacity(input, extensionRegistry);
             }
         };
 
@@ -62610,6 +65170,59 @@ public final class ContextOuterClass {
             return new Constraint_SLA_Availability();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_SLA_Availability(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                numDisjointPaths_ = input.readUInt32();
+                                break;
+                            }
+                        case 16:
+                            {
+                                allActive_ = input.readBool();
+                                break;
+                            }
+                        case 29:
+                            {
+                                availability_ = input.readFloat();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_SLA_Availability_descriptor;
         }
@@ -62621,7 +65234,7 @@ public final class ContextOuterClass {
 
         public static final int NUM_DISJOINT_PATHS_FIELD_NUMBER = 1;
 
-        private int numDisjointPaths_ = 0;
+        private int numDisjointPaths_;
 
         /**
          * uint32 num_disjoint_paths = 1;
@@ -62634,7 +65247,7 @@ public final class ContextOuterClass {
 
         public static final int ALL_ACTIVE_FIELD_NUMBER = 2;
 
-        private boolean allActive_ = false;
+        private boolean allActive_;
 
         /**
          * bool all_active = 2;
@@ -62647,7 +65260,7 @@ public final class ContextOuterClass {
 
         public static final int AVAILABILITY_FIELD_NUMBER = 3;
 
-        private float availability_ = 0F;
+        private float availability_;
 
         /**
          * 
@@ -62683,10 +65296,10 @@ public final class ContextOuterClass {
             if (allActive_ != false) {
                 output.writeBool(2, allActive_);
             }
-            if (java.lang.Float.floatToRawIntBits(availability_) != 0) {
+            if (availability_ != 0F) {
                 output.writeFloat(3, availability_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -62701,10 +65314,10 @@ public final class ContextOuterClass {
             if (allActive_ != false) {
                 size += com.google.protobuf.CodedOutputStream.computeBoolSize(2, allActive_);
             }
-            if (java.lang.Float.floatToRawIntBits(availability_) != 0) {
+            if (availability_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(3, availability_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -62724,7 +65337,7 @@ public final class ContextOuterClass {
                 return false;
             if (java.lang.Float.floatToIntBits(getAvailability()) != java.lang.Float.floatToIntBits(other.getAvailability()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -62742,7 +65355,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getAllActive());
             hash = (37 * hash) + AVAILABILITY_FIELD_NUMBER;
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getAvailability());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -62836,16 +65449,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_SLA_Availability.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 numDisjointPaths_ = 0;
                 allActive_ = false;
                 availability_ = 0F;
@@ -62874,24 +65493,41 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_SLA_Availability buildPartial() {
                 context.ContextOuterClass.Constraint_SLA_Availability result = new context.ContextOuterClass.Constraint_SLA_Availability(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.numDisjointPaths_ = numDisjointPaths_;
+                result.allActive_ = allActive_;
+                result.availability_ = availability_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_SLA_Availability result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.numDisjointPaths_ = numDisjointPaths_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.allActive_ = allActive_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.availability_ = availability_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -62916,7 +65552,7 @@ public final class ContextOuterClass {
                 if (other.getAvailability() != 0F) {
                     setAvailability(other.getAvailability());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -62928,61 +65564,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_SLA_Availability parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    numDisjointPaths_ = input.readUInt32();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            case 16:
-                                {
-                                    allActive_ = input.readBool();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            case 29:
-                                {
-                                    availability_ = input.readFloat();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 29
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_SLA_Availability) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private int numDisjointPaths_;
 
             /**
@@ -63001,7 +65596,6 @@ public final class ContextOuterClass {
              */
             public Builder setNumDisjointPaths(int value) {
                 numDisjointPaths_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -63011,7 +65605,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearNumDisjointPaths() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 numDisjointPaths_ = 0;
                 onChanged();
                 return this;
@@ -63035,7 +65628,6 @@ public final class ContextOuterClass {
              */
             public Builder setAllActive(boolean value) {
                 allActive_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -63045,7 +65637,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearAllActive() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 allActive_ = false;
                 onChanged();
                 return this;
@@ -63077,7 +65668,6 @@ public final class ContextOuterClass {
              */
             public Builder setAvailability(float value) {
                 availability_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -63091,7 +65681,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearAvailability() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 availability_ = 0F;
                 onChanged();
                 return this;
@@ -63124,17 +65713,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_SLA_Availability parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_SLA_Availability(input, extensionRegistry);
             }
         };
 
@@ -63212,6 +65791,73 @@ public final class ContextOuterClass {
             return new Constraint_SLA_Isolation_level();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_SLA_Isolation_level(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                int rawValue = input.readEnum();
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    isolationLevel_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                isolationLevel_.add(rawValue);
+                                break;
+                            }
+                        case 10:
+                            {
+                                int length = input.readRawVarint32();
+                                int oldLimit = input.pushLimit(length);
+                                while (input.getBytesUntilLimit() > 0) {
+                                    int rawValue = input.readEnum();
+                                    if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                        isolationLevel_ = new java.util.ArrayList();
+                                        mutable_bitField0_ |= 0x00000001;
+                                    }
+                                    isolationLevel_.add(rawValue);
+                                }
+                                input.popLimit(oldLimit);
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    isolationLevel_ = java.util.Collections.unmodifiableList(isolationLevel_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_SLA_Isolation_level_descriptor;
         }
@@ -63223,13 +65869,13 @@ public final class ContextOuterClass {
 
         public static final int ISOLATION_LEVEL_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List isolationLevel_;
 
         private static final com.google.protobuf.Internal.ListAdapter.Converter isolationLevel_converter_ = new com.google.protobuf.Internal.ListAdapter.Converter() {
 
             public context.ContextOuterClass.IsolationLevelEnum convert(java.lang.Integer from) {
-                context.ContextOuterClass.IsolationLevelEnum result = context.ContextOuterClass.IsolationLevelEnum.forNumber(from);
+                @SuppressWarnings("deprecation")
+                context.ContextOuterClass.IsolationLevelEnum result = context.ContextOuterClass.IsolationLevelEnum.valueOf(from);
                 return result == null ? context.ContextOuterClass.IsolationLevelEnum.UNRECOGNIZED : result;
             }
         };
@@ -63306,7 +65952,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < isolationLevel_.size(); i++) {
                 output.writeEnumNoTag(isolationLevel_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -63327,7 +65973,7 @@ public final class ContextOuterClass {
                 }
                 isolationLevelMemoizedSerializedSize = dataSize;
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -63343,7 +65989,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.Constraint_SLA_Isolation_level other = (context.ContextOuterClass.Constraint_SLA_Isolation_level) obj;
             if (!isolationLevel_.equals(other.isolationLevel_))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -63359,7 +66005,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + ISOLATION_LEVEL_FIELD_NUMBER;
                 hash = (53 * hash) + isolationLevel_.hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -63453,16 +66099,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_SLA_Isolation_level.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 isolationLevel_ = java.util.Collections.emptyList();
                 bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
@@ -63490,24 +66142,44 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_SLA_Isolation_level buildPartial() {
                 context.ContextOuterClass.Constraint_SLA_Isolation_level result = new context.ContextOuterClass.Constraint_SLA_Isolation_level(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Constraint_SLA_Isolation_level result) {
+                int from_bitField0_ = bitField0_;
                 if (((bitField0_ & 0x00000001) != 0)) {
                     isolationLevel_ = java.util.Collections.unmodifiableList(isolationLevel_);
                     bitField0_ = (bitField0_ & ~0x00000001);
                 }
                 result.isolationLevel_ = isolationLevel_;
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_SLA_Isolation_level result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -63533,7 +66205,7 @@ public final class ContextOuterClass {
                     }
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -63545,56 +66217,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_SLA_Isolation_level parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    int tmpRaw = input.readEnum();
-                                    ensureIsolationLevelIsMutable();
-                                    isolationLevel_.add(tmpRaw);
-                                    break;
-                                }
-                            // case 8
-                            case 10:
-                                {
-                                    int length = input.readRawVarint32();
-                                    int oldLimit = input.pushLimit(length);
-                                    while (input.getBytesUntilLimit() > 0) {
-                                        int tmpRaw = input.readEnum();
-                                        ensureIsolationLevelIsMutable();
-                                        isolationLevel_.add(tmpRaw);
-                                    }
-                                    input.popLimit(oldLimit);
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_SLA_Isolation_level) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -63709,8 +66342,8 @@ public final class ContextOuterClass {
 
             /**
              * repeated .context.IsolationLevelEnum isolation_level = 1;
-             * @param index The index to set the value at.
-             * @param value The enum numeric value on the wire for isolationLevel to set.
+             * @param index The index of the value to return.
+             * @return The enum numeric value on the wire of isolationLevel at the given index.
              * @return This builder for chaining.
              */
             public Builder setIsolationLevelValue(int index, int value) {
@@ -63773,17 +66406,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_SLA_Isolation_level parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_SLA_Isolation_level(input, extensionRegistry);
             }
         };
 
@@ -63912,6 +66535,86 @@ public final class ContextOuterClass {
             return new Constraint_Exclusions();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_Exclusions(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                isPermanent_ = input.readBool();
+                                break;
+                            }
+                        case 18:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    deviceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                deviceIds_.add(input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 26:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                                    endpointIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                endpointIds_.add(input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 34:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000004) != 0)) {
+                                    linkIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000004;
+                                }
+                                linkIds_.add(input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    deviceIds_ = java.util.Collections.unmodifiableList(deviceIds_);
+                }
+                if (((mutable_bitField0_ & 0x00000002) != 0)) {
+                    endpointIds_ = java.util.Collections.unmodifiableList(endpointIds_);
+                }
+                if (((mutable_bitField0_ & 0x00000004) != 0)) {
+                    linkIds_ = java.util.Collections.unmodifiableList(linkIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_Exclusions_descriptor;
         }
@@ -63923,7 +66626,7 @@ public final class ContextOuterClass {
 
         public static final int IS_PERMANENT_FIELD_NUMBER = 1;
 
-        private boolean isPermanent_ = false;
+        private boolean isPermanent_;
 
         /**
          * bool is_permanent = 1;
@@ -63936,7 +66639,6 @@ public final class ContextOuterClass {
 
         public static final int DEVICE_IDS_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
         private java.util.List deviceIds_;
 
         /**
@@ -63981,7 +66683,6 @@ public final class ContextOuterClass {
 
         public static final int ENDPOINT_IDS_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
         private java.util.List endpointIds_;
 
         /**
@@ -64026,7 +66727,6 @@ public final class ContextOuterClass {
 
         public static final int LINK_IDS_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
         private java.util.List linkIds_;
 
         /**
@@ -64096,7 +66796,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < linkIds_.size(); i++) {
                 output.writeMessage(4, linkIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -64117,7 +66817,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < linkIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, linkIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -64139,7 +66839,7 @@ public final class ContextOuterClass {
                 return false;
             if (!getLinkIdsList().equals(other.getLinkIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -64165,7 +66865,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + LINK_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getLinkIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -64259,38 +66959,44 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_Exclusions.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getDeviceIdsFieldBuilder();
+                    getEndpointIdsFieldBuilder();
+                    getLinkIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 isPermanent_ = false;
                 if (deviceIdsBuilder_ == null) {
                     deviceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    deviceIds_ = null;
                     deviceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000002);
                 if (endpointIdsBuilder_ == null) {
                     endpointIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
                 } else {
-                    endpointIds_ = null;
                     endpointIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000004);
                 if (linkIdsBuilder_ == null) {
                     linkIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000004);
                 } else {
-                    linkIds_ = null;
                     linkIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000008);
                 return this;
             }
 
@@ -64316,49 +67022,67 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_Exclusions buildPartial() {
                 context.ContextOuterClass.Constraint_Exclusions result = new context.ContextOuterClass.Constraint_Exclusions(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Constraint_Exclusions result) {
+                int from_bitField0_ = bitField0_;
+                result.isPermanent_ = isPermanent_;
                 if (deviceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         deviceIds_ = java.util.Collections.unmodifiableList(deviceIds_);
-                        bitField0_ = (bitField0_ & ~0x00000002);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.deviceIds_ = deviceIds_;
                 } else {
                     result.deviceIds_ = deviceIdsBuilder_.build();
                 }
                 if (endpointIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0)) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
                         endpointIds_ = java.util.Collections.unmodifiableList(endpointIds_);
-                        bitField0_ = (bitField0_ & ~0x00000004);
+                        bitField0_ = (bitField0_ & ~0x00000002);
                     }
                     result.endpointIds_ = endpointIds_;
                 } else {
                     result.endpointIds_ = endpointIdsBuilder_.build();
                 }
                 if (linkIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0)) {
+                    if (((bitField0_ & 0x00000004) != 0)) {
                         linkIds_ = java.util.Collections.unmodifiableList(linkIds_);
-                        bitField0_ = (bitField0_ & ~0x00000008);
+                        bitField0_ = (bitField0_ & ~0x00000004);
                     }
                     result.linkIds_ = linkIds_;
                 } else {
                     result.linkIds_ = linkIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_Exclusions result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.isPermanent_ = isPermanent_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -64381,7 +67105,7 @@ public final class ContextOuterClass {
                     if (!other.deviceIds_.isEmpty()) {
                         if (deviceIds_.isEmpty()) {
                             deviceIds_ = other.deviceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000002);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureDeviceIdsIsMutable();
                             deviceIds_.addAll(other.deviceIds_);
@@ -64394,7 +67118,7 @@ public final class ContextOuterClass {
                             deviceIdsBuilder_.dispose();
                             deviceIdsBuilder_ = null;
                             deviceIds_ = other.deviceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000002);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             deviceIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getDeviceIdsFieldBuilder() : null;
                         } else {
                             deviceIdsBuilder_.addAllMessages(other.deviceIds_);
@@ -64405,7 +67129,7 @@ public final class ContextOuterClass {
                     if (!other.endpointIds_.isEmpty()) {
                         if (endpointIds_.isEmpty()) {
                             endpointIds_ = other.endpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                         } else {
                             ensureEndpointIdsIsMutable();
                             endpointIds_.addAll(other.endpointIds_);
@@ -64418,7 +67142,7 @@ public final class ContextOuterClass {
                             endpointIdsBuilder_.dispose();
                             endpointIdsBuilder_ = null;
                             endpointIds_ = other.endpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                             endpointIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getEndpointIdsFieldBuilder() : null;
                         } else {
                             endpointIdsBuilder_.addAllMessages(other.endpointIds_);
@@ -64429,7 +67153,7 @@ public final class ContextOuterClass {
                     if (!other.linkIds_.isEmpty()) {
                         if (linkIds_.isEmpty()) {
                             linkIds_ = other.linkIds_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000004);
                         } else {
                             ensureLinkIdsIsMutable();
                             linkIds_.addAll(other.linkIds_);
@@ -64442,14 +67166,14 @@ public final class ContextOuterClass {
                             linkIdsBuilder_.dispose();
                             linkIdsBuilder_ = null;
                             linkIds_ = other.linkIds_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000004);
                             linkIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getLinkIdsFieldBuilder() : null;
                         } else {
                             linkIdsBuilder_.addAllMessages(other.linkIds_);
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -64461,78 +67185,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_Exclusions parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    isPermanent_ = input.readBool();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            case 18:
-                                {
-                                    context.ContextOuterClass.DeviceId m = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
-                                    if (deviceIdsBuilder_ == null) {
-                                        ensureDeviceIdsIsMutable();
-                                        deviceIds_.add(m);
-                                    } else {
-                                        deviceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    context.ContextOuterClass.EndPointId m = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-                                    if (endpointIdsBuilder_ == null) {
-                                        ensureEndpointIdsIsMutable();
-                                        endpointIds_.add(m);
-                                    } else {
-                                        endpointIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    context.ContextOuterClass.LinkId m = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry);
-                                    if (linkIdsBuilder_ == null) {
-                                        ensureLinkIdsIsMutable();
-                                        linkIds_.add(m);
-                                    } else {
-                                        linkIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 34
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_Exclusions) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -64556,7 +67219,6 @@ public final class ContextOuterClass {
              */
             public Builder setIsPermanent(boolean value) {
                 isPermanent_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -64566,7 +67228,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIsPermanent() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 isPermanent_ = false;
                 onChanged();
                 return this;
@@ -64575,9 +67236,9 @@ public final class ContextOuterClass {
             private java.util.List deviceIds_ = java.util.Collections.emptyList();
 
             private void ensureDeviceIdsIsMutable() {
-                if (!((bitField0_ & 0x00000002) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     deviceIds_ = new java.util.ArrayList(deviceIds_);
-                    bitField0_ |= 0x00000002;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -64729,7 +67390,7 @@ public final class ContextOuterClass {
             public Builder clearDeviceIds() {
                 if (deviceIdsBuilder_ == null) {
                     deviceIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000002);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     deviceIdsBuilder_.clear();
@@ -64803,7 +67464,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getDeviceIdsFieldBuilder() {
                 if (deviceIdsBuilder_ == null) {
-                    deviceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(deviceIds_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
+                    deviceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(deviceIds_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     deviceIds_ = null;
                 }
                 return deviceIdsBuilder_;
@@ -64812,9 +67473,9 @@ public final class ContextOuterClass {
             private java.util.List endpointIds_ = java.util.Collections.emptyList();
 
             private void ensureEndpointIdsIsMutable() {
-                if (!((bitField0_ & 0x00000004) != 0)) {
+                if (!((bitField0_ & 0x00000002) != 0)) {
                     endpointIds_ = new java.util.ArrayList(endpointIds_);
-                    bitField0_ |= 0x00000004;
+                    bitField0_ |= 0x00000002;
                 }
             }
 
@@ -64966,7 +67627,7 @@ public final class ContextOuterClass {
             public Builder clearEndpointIds() {
                 if (endpointIdsBuilder_ == null) {
                     endpointIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000004);
+                    bitField0_ = (bitField0_ & ~0x00000002);
                     onChanged();
                 } else {
                     endpointIdsBuilder_.clear();
@@ -65040,7 +67701,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getEndpointIdsFieldBuilder() {
                 if (endpointIdsBuilder_ == null) {
-                    endpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(endpointIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
+                    endpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(endpointIds_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
                     endpointIds_ = null;
                 }
                 return endpointIdsBuilder_;
@@ -65049,9 +67710,9 @@ public final class ContextOuterClass {
             private java.util.List linkIds_ = java.util.Collections.emptyList();
 
             private void ensureLinkIdsIsMutable() {
-                if (!((bitField0_ & 0x00000008) != 0)) {
+                if (!((bitField0_ & 0x00000004) != 0)) {
                     linkIds_ = new java.util.ArrayList(linkIds_);
-                    bitField0_ |= 0x00000008;
+                    bitField0_ |= 0x00000004;
                 }
             }
 
@@ -65203,7 +67864,7 @@ public final class ContextOuterClass {
             public Builder clearLinkIds() {
                 if (linkIdsBuilder_ == null) {
                     linkIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000008);
+                    bitField0_ = (bitField0_ & ~0x00000004);
                     onChanged();
                 } else {
                     linkIdsBuilder_.clear();
@@ -65277,7 +67938,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getLinkIdsFieldBuilder() {
                 if (linkIdsBuilder_ == null) {
-                    linkIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(linkIds_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean());
+                    linkIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(linkIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
                     linkIds_ = null;
                 }
                 return linkIdsBuilder_;
@@ -65310,17 +67971,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_Exclusions parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_Exclusions(input, extensionRegistry);
             }
         };
 
@@ -65507,7 +68158,7 @@ public final class ContextOuterClass {
          */
         context.ContextOuterClass.Constraint_ExclusionsOrBuilder getExclusionsOrBuilder();
 
-        context.ContextOuterClass.Constraint.ConstraintCase getConstraintCase();
+        public context.ContextOuterClass.Constraint.ConstraintCase getConstraintCase();
     }
 
     /**
@@ -65533,6 +68184,176 @@ public final class ContextOuterClass {
             return new Constraint();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                int rawValue = input.readEnum();
+                                action_ = rawValue;
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.Constraint_Custom.Builder subBuilder = null;
+                                if (constraintCase_ == 2) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_Custom) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_Custom.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_Custom) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 2;
+                                break;
+                            }
+                        case 26:
+                            {
+                                context.ContextOuterClass.Constraint_Schedule.Builder subBuilder = null;
+                                if (constraintCase_ == 3) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_Schedule) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_Schedule.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_Schedule) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 3;
+                                break;
+                            }
+                        case 34:
+                            {
+                                context.ContextOuterClass.Constraint_EndPointLocation.Builder subBuilder = null;
+                                if (constraintCase_ == 4) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_EndPointLocation) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_EndPointLocation.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_EndPointLocation) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 4;
+                                break;
+                            }
+                        case 42:
+                            {
+                                context.ContextOuterClass.Constraint_EndPointPriority.Builder subBuilder = null;
+                                if (constraintCase_ == 5) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_EndPointPriority) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_EndPointPriority.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_EndPointPriority) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 5;
+                                break;
+                            }
+                        case 50:
+                            {
+                                context.ContextOuterClass.Constraint_SLA_Capacity.Builder subBuilder = null;
+                                if (constraintCase_ == 6) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_SLA_Capacity) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_SLA_Capacity.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_SLA_Capacity) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 6;
+                                break;
+                            }
+                        case 58:
+                            {
+                                context.ContextOuterClass.Constraint_SLA_Latency.Builder subBuilder = null;
+                                if (constraintCase_ == 7) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_SLA_Latency) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_SLA_Latency.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_SLA_Latency) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 7;
+                                break;
+                            }
+                        case 66:
+                            {
+                                context.ContextOuterClass.Constraint_SLA_Availability.Builder subBuilder = null;
+                                if (constraintCase_ == 8) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_SLA_Availability) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_SLA_Availability.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_SLA_Availability) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 8;
+                                break;
+                            }
+                        case 74:
+                            {
+                                context.ContextOuterClass.Constraint_SLA_Isolation_level.Builder subBuilder = null;
+                                if (constraintCase_ == 9) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_SLA_Isolation_level.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 9;
+                                break;
+                            }
+                        case 82:
+                            {
+                                context.ContextOuterClass.Constraint_Exclusions.Builder subBuilder = null;
+                                if (constraintCase_ == 10) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_Exclusions) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_Exclusions.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_Exclusions) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 10;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_descriptor;
         }
@@ -65544,7 +68365,6 @@ public final class ContextOuterClass {
 
         private int constraintCase_ = 0;
 
-        @SuppressWarnings("serial")
         private java.lang.Object constraint_;
 
         public enum ConstraintCase implements com.google.protobuf.Internal.EnumLite, com.google.protobuf.AbstractMessage.InternalOneOfEnum {
@@ -65614,7 +68434,7 @@ public final class ContextOuterClass {
 
         public static final int ACTION_FIELD_NUMBER = 1;
 
-        private int action_ = 0;
+        private int action_;
 
         /**
          * .context.ConstraintActionEnum action = 1;
@@ -65631,7 +68451,8 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConstraintActionEnum getAction() {
-            context.ContextOuterClass.ConstraintActionEnum result = context.ContextOuterClass.ConstraintActionEnum.forNumber(action_);
+            @SuppressWarnings("deprecation")
+            context.ContextOuterClass.ConstraintActionEnum result = context.ContextOuterClass.ConstraintActionEnum.valueOf(action_);
             return result == null ? context.ContextOuterClass.ConstraintActionEnum.UNRECOGNIZED : result;
         }
 
@@ -65986,7 +68807,7 @@ public final class ContextOuterClass {
             if (constraintCase_ == 10) {
                 output.writeMessage(10, (context.ContextOuterClass.Constraint_Exclusions) constraint_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -66025,7 +68846,7 @@ public final class ContextOuterClass {
             if (constraintCase_ == 10) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(10, (context.ContextOuterClass.Constraint_Exclusions) constraint_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -66083,7 +68904,7 @@ public final class ContextOuterClass {
                 case 0:
                 default:
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -66137,7 +68958,7 @@ public final class ContextOuterClass {
                 case 0:
                 default:
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -66231,44 +69052,23 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 action_ = 0;
-                if (customBuilder_ != null) {
-                    customBuilder_.clear();
-                }
-                if (scheduleBuilder_ != null) {
-                    scheduleBuilder_.clear();
-                }
-                if (endpointLocationBuilder_ != null) {
-                    endpointLocationBuilder_.clear();
-                }
-                if (endpointPriorityBuilder_ != null) {
-                    endpointPriorityBuilder_.clear();
-                }
-                if (slaCapacityBuilder_ != null) {
-                    slaCapacityBuilder_.clear();
-                }
-                if (slaLatencyBuilder_ != null) {
-                    slaLatencyBuilder_.clear();
-                }
-                if (slaAvailabilityBuilder_ != null) {
-                    slaAvailabilityBuilder_.clear();
-                }
-                if (slaIsolationBuilder_ != null) {
-                    slaIsolationBuilder_.clear();
-                }
-                if (exclusionsBuilder_ != null) {
-                    exclusionsBuilder_.clear();
-                }
                 constraintCase_ = 0;
                 constraint_ = null;
                 return this;
@@ -66296,51 +69096,103 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint buildPartial() {
                 context.ContextOuterClass.Constraint result = new context.ContextOuterClass.Constraint(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                buildPartialOneofs(result);
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartial0(context.ContextOuterClass.Constraint result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.action_ = action_;
-                }
-            }
-
-            private void buildPartialOneofs(context.ContextOuterClass.Constraint result) {
-                result.constraintCase_ = constraintCase_;
-                result.constraint_ = this.constraint_;
-                if (constraintCase_ == 2 && customBuilder_ != null) {
-                    result.constraint_ = customBuilder_.build();
+                result.action_ = action_;
+                if (constraintCase_ == 2) {
+                    if (customBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = customBuilder_.build();
+                    }
                 }
-                if (constraintCase_ == 3 && scheduleBuilder_ != null) {
-                    result.constraint_ = scheduleBuilder_.build();
+                if (constraintCase_ == 3) {
+                    if (scheduleBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = scheduleBuilder_.build();
+                    }
                 }
-                if (constraintCase_ == 4 && endpointLocationBuilder_ != null) {
-                    result.constraint_ = endpointLocationBuilder_.build();
+                if (constraintCase_ == 4) {
+                    if (endpointLocationBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = endpointLocationBuilder_.build();
+                    }
                 }
-                if (constraintCase_ == 5 && endpointPriorityBuilder_ != null) {
-                    result.constraint_ = endpointPriorityBuilder_.build();
+                if (constraintCase_ == 5) {
+                    if (endpointPriorityBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = endpointPriorityBuilder_.build();
+                    }
                 }
-                if (constraintCase_ == 6 && slaCapacityBuilder_ != null) {
-                    result.constraint_ = slaCapacityBuilder_.build();
+                if (constraintCase_ == 6) {
+                    if (slaCapacityBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = slaCapacityBuilder_.build();
+                    }
                 }
-                if (constraintCase_ == 7 && slaLatencyBuilder_ != null) {
-                    result.constraint_ = slaLatencyBuilder_.build();
+                if (constraintCase_ == 7) {
+                    if (slaLatencyBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = slaLatencyBuilder_.build();
+                    }
                 }
-                if (constraintCase_ == 8 && slaAvailabilityBuilder_ != null) {
-                    result.constraint_ = slaAvailabilityBuilder_.build();
+                if (constraintCase_ == 8) {
+                    if (slaAvailabilityBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = slaAvailabilityBuilder_.build();
+                    }
                 }
-                if (constraintCase_ == 9 && slaIsolationBuilder_ != null) {
-                    result.constraint_ = slaIsolationBuilder_.build();
+                if (constraintCase_ == 9) {
+                    if (slaIsolationBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = slaIsolationBuilder_.build();
+                    }
                 }
-                if (constraintCase_ == 10 && exclusionsBuilder_ != null) {
-                    result.constraint_ = exclusionsBuilder_.build();
+                if (constraintCase_ == 10) {
+                    if (exclusionsBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = exclusionsBuilder_.build();
+                    }
                 }
+                result.constraintCase_ = constraintCase_;
+                onBuilt();
+                return result;
+            }
+
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -66410,7 +69262,7 @@ public final class ContextOuterClass {
                             break;
                         }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -66422,105 +69274,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    action_ = input.readEnum();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            case 18:
-                                {
-                                    input.readMessage(getCustomFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 2;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getScheduleFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 3;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    input.readMessage(getEndpointLocationFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 4;
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    input.readMessage(getEndpointPriorityFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 5;
-                                    break;
-                                }
-                            // case 42
-                            case 50:
-                                {
-                                    input.readMessage(getSlaCapacityFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 6;
-                                    break;
-                                }
-                            // case 50
-                            case 58:
-                                {
-                                    input.readMessage(getSlaLatencyFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 7;
-                                    break;
-                                }
-                            // case 58
-                            case 66:
-                                {
-                                    input.readMessage(getSlaAvailabilityFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 8;
-                                    break;
-                                }
-                            // case 66
-                            case 74:
-                                {
-                                    input.readMessage(getSlaIsolationFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 9;
-                                    break;
-                                }
-                            // case 74
-                            case 82:
-                                {
-                                    input.readMessage(getExclusionsFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 10;
-                                    break;
-                                }
-                            // case 82
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -66539,8 +69303,6 @@ public final class ContextOuterClass {
                 return this;
             }
 
-            private int bitField0_;
-
             private int action_ = 0;
 
             /**
@@ -66559,7 +69321,6 @@ public final class ContextOuterClass {
              */
             public Builder setActionValue(int value) {
                 action_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -66570,7 +69331,8 @@ public final class ContextOuterClass {
              */
             @java.lang.Override
             public context.ContextOuterClass.ConstraintActionEnum getAction() {
-                context.ContextOuterClass.ConstraintActionEnum result = context.ContextOuterClass.ConstraintActionEnum.forNumber(action_);
+                @SuppressWarnings("deprecation")
+                context.ContextOuterClass.ConstraintActionEnum result = context.ContextOuterClass.ConstraintActionEnum.valueOf(action_);
                 return result == null ? context.ContextOuterClass.ConstraintActionEnum.UNRECOGNIZED : result;
             }
 
@@ -66583,7 +69345,6 @@ public final class ContextOuterClass {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000001;
                 action_ = value.getNumber();
                 onChanged();
                 return this;
@@ -66594,7 +69355,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearAction() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 action_ = 0;
                 onChanged();
                 return this;
@@ -66675,9 +69435,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 2) {
                         customBuilder_.mergeFrom(value);
-                    } else {
-                        customBuilder_.setMessage(value);
                     }
+                    customBuilder_.setMessage(value);
                 }
                 constraintCase_ = 2;
                 return this;
@@ -66738,6 +69497,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 2;
                 onChanged();
+                ;
                 return customBuilder_;
             }
 
@@ -66816,9 +69576,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 3) {
                         scheduleBuilder_.mergeFrom(value);
-                    } else {
-                        scheduleBuilder_.setMessage(value);
                     }
+                    scheduleBuilder_.setMessage(value);
                 }
                 constraintCase_ = 3;
                 return this;
@@ -66879,6 +69638,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 3;
                 onChanged();
+                ;
                 return scheduleBuilder_;
             }
 
@@ -66957,9 +69717,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 4) {
                         endpointLocationBuilder_.mergeFrom(value);
-                    } else {
-                        endpointLocationBuilder_.setMessage(value);
                     }
+                    endpointLocationBuilder_.setMessage(value);
                 }
                 constraintCase_ = 4;
                 return this;
@@ -67020,6 +69779,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 4;
                 onChanged();
+                ;
                 return endpointLocationBuilder_;
             }
 
@@ -67098,9 +69858,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 5) {
                         endpointPriorityBuilder_.mergeFrom(value);
-                    } else {
-                        endpointPriorityBuilder_.setMessage(value);
                     }
+                    endpointPriorityBuilder_.setMessage(value);
                 }
                 constraintCase_ = 5;
                 return this;
@@ -67161,6 +69920,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 5;
                 onChanged();
+                ;
                 return endpointPriorityBuilder_;
             }
 
@@ -67239,9 +69999,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 6) {
                         slaCapacityBuilder_.mergeFrom(value);
-                    } else {
-                        slaCapacityBuilder_.setMessage(value);
                     }
+                    slaCapacityBuilder_.setMessage(value);
                 }
                 constraintCase_ = 6;
                 return this;
@@ -67302,6 +70061,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 6;
                 onChanged();
+                ;
                 return slaCapacityBuilder_;
             }
 
@@ -67380,9 +70140,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 7) {
                         slaLatencyBuilder_.mergeFrom(value);
-                    } else {
-                        slaLatencyBuilder_.setMessage(value);
                     }
+                    slaLatencyBuilder_.setMessage(value);
                 }
                 constraintCase_ = 7;
                 return this;
@@ -67443,6 +70202,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 7;
                 onChanged();
+                ;
                 return slaLatencyBuilder_;
             }
 
@@ -67521,9 +70281,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 8) {
                         slaAvailabilityBuilder_.mergeFrom(value);
-                    } else {
-                        slaAvailabilityBuilder_.setMessage(value);
                     }
+                    slaAvailabilityBuilder_.setMessage(value);
                 }
                 constraintCase_ = 8;
                 return this;
@@ -67584,6 +70343,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 8;
                 onChanged();
+                ;
                 return slaAvailabilityBuilder_;
             }
 
@@ -67662,9 +70422,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 9) {
                         slaIsolationBuilder_.mergeFrom(value);
-                    } else {
-                        slaIsolationBuilder_.setMessage(value);
                     }
+                    slaIsolationBuilder_.setMessage(value);
                 }
                 constraintCase_ = 9;
                 return this;
@@ -67725,6 +70484,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 9;
                 onChanged();
+                ;
                 return slaIsolationBuilder_;
             }
 
@@ -67803,9 +70563,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 10) {
                         exclusionsBuilder_.mergeFrom(value);
-                    } else {
-                        exclusionsBuilder_.setMessage(value);
                     }
+                    exclusionsBuilder_.setMessage(value);
                 }
                 constraintCase_ = 10;
                 return this;
@@ -67866,6 +70625,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 10;
                 onChanged();
+                ;
                 return exclusionsBuilder_;
             }
 
@@ -67896,17 +70656,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint(input, extensionRegistry);
             }
         };
 
@@ -67991,6 +70741,68 @@ public final class ContextOuterClass {
             return new TeraFlowController();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private TeraFlowController(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ContextId.Builder subBuilder = null;
+                                if (contextId_ != null) {
+                                    subBuilder = contextId_.toBuilder();
+                                }
+                                contextId_ = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(contextId_);
+                                    contextId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                ipAddress_ = s;
+                                break;
+                            }
+                        case 24:
+                            {
+                                port_ = input.readUInt32();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_TeraFlowController_descriptor;
         }
@@ -68027,13 +70839,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() {
-            return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
+            return getContextId();
         }
 
         public static final int IP_ADDRESS_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object ipAddress_ = "";
+        private volatile java.lang.Object ipAddress_;
 
         /**
          * string ip_address = 2;
@@ -68070,7 +70881,7 @@ public final class ContextOuterClass {
 
         public static final int PORT_FIELD_NUMBER = 3;
 
-        private int port_ = 0;
+        private int port_;
 
         /**
          * uint32 port = 3;
@@ -68099,13 +70910,13 @@ public final class ContextOuterClass {
             if (contextId_ != null) {
                 output.writeMessage(1, getContextId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(ipAddress_)) {
+            if (!getIpAddressBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, ipAddress_);
             }
             if (port_ != 0) {
                 output.writeUInt32(3, port_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -68117,13 +70928,13 @@ public final class ContextOuterClass {
             if (contextId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getContextId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(ipAddress_)) {
+            if (!getIpAddressBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, ipAddress_);
             }
             if (port_ != 0) {
                 size += com.google.protobuf.CodedOutputStream.computeUInt32Size(3, port_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -68147,7 +70958,7 @@ public final class ContextOuterClass {
                 return false;
             if (getPort() != other.getPort())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -68167,7 +70978,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + getIpAddress().hashCode();
             hash = (37 * hash) + PORT_FIELD_NUMBER;
             hash = (53 * hash) + getPort();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -68265,19 +71076,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.TeraFlowController.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
                 ipAddress_ = "";
@@ -68307,24 +71125,45 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.TeraFlowController buildPartial() {
                 context.ContextOuterClass.TeraFlowController result = new context.ContextOuterClass.TeraFlowController(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (contextIdBuilder_ == null) {
+                    result.contextId_ = contextId_;
+                } else {
+                    result.contextId_ = contextIdBuilder_.build();
                 }
+                result.ipAddress_ = ipAddress_;
+                result.port_ = port_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.TeraFlowController result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.contextId_ = contextIdBuilder_ == null ? contextId_ : contextIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.ipAddress_ = ipAddress_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.port_ = port_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -68345,13 +71184,12 @@ public final class ContextOuterClass {
                 }
                 if (!other.getIpAddress().isEmpty()) {
                     ipAddress_ = other.ipAddress_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (other.getPort() != 0) {
                     setPort(other.getPort());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -68363,61 +71201,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.TeraFlowController parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getContextIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    ipAddress_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 24:
-                                {
-                                    port_ = input.readUInt32();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.TeraFlowController) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.ContextId contextId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 contextIdBuilder_;
@@ -68427,7 +71224,7 @@ public final class ContextOuterClass {
              * @return Whether the contextId field is set.
              */
             public boolean hasContextId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return contextIdBuilder_ != null || contextId_ != null;
             }
 
             /**
@@ -68451,11 +71248,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     contextId_ = value;
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -68465,11 +71261,10 @@ public final class ContextOuterClass {
             public Builder setContextId(context.ContextOuterClass.ContextId.Builder builderForValue) {
                 if (contextIdBuilder_ == null) {
                     contextId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -68478,16 +71273,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeContextId(context.ContextOuterClass.ContextId value) {
                 if (contextIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && contextId_ != null && contextId_ != context.ContextOuterClass.ContextId.getDefaultInstance()) {
-                        getContextIdBuilder().mergeFrom(value);
+                    if (contextId_ != null) {
+                        contextId_ = context.ContextOuterClass.ContextId.newBuilder(contextId_).mergeFrom(value).buildPartial();
                     } else {
                         contextId_ = value;
                     }
+                    onChanged();
                 } else {
                     contextIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -68495,13 +71289,13 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public Builder clearContextId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                    onChanged();
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -68509,7 +71303,6 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public context.ContextOuterClass.ContextId.Builder getContextIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getContextIdFieldBuilder().getBuilder();
             }
@@ -68579,7 +71372,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 ipAddress_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -68590,7 +71382,6 @@ public final class ContextOuterClass {
              */
             public Builder clearIpAddress() {
                 ipAddress_ = getDefaultInstance().getIpAddress();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -68606,7 +71397,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 ipAddress_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -68629,7 +71419,6 @@ public final class ContextOuterClass {
              */
             public Builder setPort(int value) {
                 port_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -68639,7 +71428,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearPort() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 port_ = 0;
                 onChanged();
                 return this;
@@ -68672,17 +71460,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public TeraFlowController parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new TeraFlowController(input, extensionRegistry);
             }
         };
 
@@ -68750,6 +71528,62 @@ public final class ContextOuterClass {
             return new AuthenticationResult();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private AuthenticationResult(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ContextId.Builder subBuilder = null;
+                                if (contextId_ != null) {
+                                    subBuilder = contextId_.toBuilder();
+                                }
+                                contextId_ = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(contextId_);
+                                    contextId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 16:
+                            {
+                                authenticated_ = input.readBool();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_AuthenticationResult_descriptor;
         }
@@ -68786,12 +71620,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() {
-            return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
+            return getContextId();
         }
 
         public static final int AUTHENTICATED_FIELD_NUMBER = 2;
 
-        private boolean authenticated_ = false;
+        private boolean authenticated_;
 
         /**
          * bool authenticated = 2;
@@ -68823,7 +71657,7 @@ public final class ContextOuterClass {
             if (authenticated_ != false) {
                 output.writeBool(2, authenticated_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -68838,7 +71672,7 @@ public final class ContextOuterClass {
             if (authenticated_ != false) {
                 size += com.google.protobuf.CodedOutputStream.computeBoolSize(2, authenticated_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -68860,7 +71694,7 @@ public final class ContextOuterClass {
             }
             if (getAuthenticated() != other.getAuthenticated())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -68878,7 +71712,7 @@ public final class ContextOuterClass {
             }
             hash = (37 * hash) + AUTHENTICATED_FIELD_NUMBER;
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getAuthenticated());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -68972,19 +71806,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.AuthenticationResult.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
                 authenticated_ = false;
@@ -69013,21 +71854,44 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.AuthenticationResult buildPartial() {
                 context.ContextOuterClass.AuthenticationResult result = new context.ContextOuterClass.AuthenticationResult(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (contextIdBuilder_ == null) {
+                    result.contextId_ = contextId_;
+                } else {
+                    result.contextId_ = contextIdBuilder_.build();
                 }
+                result.authenticated_ = authenticated_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.AuthenticationResult result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.contextId_ = contextIdBuilder_ == null ? contextId_ : contextIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.authenticated_ = authenticated_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -69049,7 +71913,7 @@ public final class ContextOuterClass {
                 if (other.getAuthenticated() != false) {
                     setAuthenticated(other.getAuthenticated());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -69061,54 +71925,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.AuthenticationResult parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getContextIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 16:
-                                {
-                                    authenticated_ = input.readBool();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.AuthenticationResult) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.ContextId contextId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 contextIdBuilder_;
@@ -69118,7 +71948,7 @@ public final class ContextOuterClass {
              * @return Whether the contextId field is set.
              */
             public boolean hasContextId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return contextIdBuilder_ != null || contextId_ != null;
             }
 
             /**
@@ -69142,11 +71972,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     contextId_ = value;
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -69156,11 +71985,10 @@ public final class ContextOuterClass {
             public Builder setContextId(context.ContextOuterClass.ContextId.Builder builderForValue) {
                 if (contextIdBuilder_ == null) {
                     contextId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -69169,16 +71997,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeContextId(context.ContextOuterClass.ContextId value) {
                 if (contextIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && contextId_ != null && contextId_ != context.ContextOuterClass.ContextId.getDefaultInstance()) {
-                        getContextIdBuilder().mergeFrom(value);
+                    if (contextId_ != null) {
+                        contextId_ = context.ContextOuterClass.ContextId.newBuilder(contextId_).mergeFrom(value).buildPartial();
                     } else {
                         contextId_ = value;
                     }
+                    onChanged();
                 } else {
                     contextIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -69186,13 +72013,13 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public Builder clearContextId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                    onChanged();
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -69200,7 +72027,6 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public context.ContextOuterClass.ContextId.Builder getContextIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getContextIdFieldBuilder().getBuilder();
             }
@@ -69245,7 +72071,6 @@ public final class ContextOuterClass {
              */
             public Builder setAuthenticated(boolean value) {
                 authenticated_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -69255,7 +72080,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearAuthenticated() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 authenticated_ = false;
                 onChanged();
                 return this;
@@ -69288,17 +72112,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public AuthenticationResult parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new AuthenticationResult(input, extensionRegistry);
             }
         };
 
@@ -69360,6 +72174,50 @@ public final class ContextOuterClass {
             return new OpticalConfigId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private OpticalConfigId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                opticalconfigUuid_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_OpticalConfigId_descriptor;
         }
@@ -69371,8 +72229,7 @@ public final class ContextOuterClass {
 
         public static final int OPTICALCONFIG_UUID_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object opticalconfigUuid_ = "";
+        private volatile java.lang.Object opticalconfigUuid_;
 
         /**
          * string opticalconfig_uuid = 1;
@@ -69422,10 +72279,10 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(opticalconfigUuid_)) {
+            if (!getOpticalconfigUuidBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, opticalconfigUuid_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -69434,10 +72291,10 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(opticalconfigUuid_)) {
+            if (!getOpticalconfigUuidBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, opticalconfigUuid_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -69453,7 +72310,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.OpticalConfigId other = (context.ContextOuterClass.OpticalConfigId) obj;
             if (!getOpticalconfigUuid().equals(other.getOpticalconfigUuid()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -69467,7 +72324,7 @@ public final class ContextOuterClass {
             hash = (19 * hash) + getDescriptor().hashCode();
             hash = (37 * hash) + OPTICALCONFIG_UUID_FIELD_NUMBER;
             hash = (53 * hash) + getOpticalconfigUuid().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -69565,16 +72422,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.OpticalConfigId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 opticalconfigUuid_ = "";
                 return this;
             }
@@ -69601,18 +72464,39 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.OpticalConfigId buildPartial() {
                 context.ContextOuterClass.OpticalConfigId result = new context.ContextOuterClass.OpticalConfigId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.opticalconfigUuid_ = opticalconfigUuid_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.OpticalConfigId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.opticalconfigUuid_ = opticalconfigUuid_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -69630,10 +72514,9 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getOpticalconfigUuid().isEmpty()) {
                     opticalconfigUuid_ = other.opticalconfigUuid_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -69645,47 +72528,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.OpticalConfigId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    opticalconfigUuid_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.OpticalConfigId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private java.lang.Object opticalconfigUuid_ = "";
 
             /**
@@ -69729,7 +72585,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 opticalconfigUuid_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -69740,7 +72595,6 @@ public final class ContextOuterClass {
              */
             public Builder clearOpticalconfigUuid() {
                 opticalconfigUuid_ = getDefaultInstance().getOpticalconfigUuid();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -69756,7 +72610,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 opticalconfigUuid_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -69788,17 +72641,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public OpticalConfigId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new OpticalConfigId(input, extensionRegistry);
             }
         };
 
@@ -69873,6 +72716,63 @@ public final class ContextOuterClass {
             return new OpticalConfig();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private OpticalConfig(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.OpticalConfigId.Builder subBuilder = null;
+                                if (opticalconfigId_ != null) {
+                                    subBuilder = opticalconfigId_.toBuilder();
+                                }
+                                opticalconfigId_ = input.readMessage(context.ContextOuterClass.OpticalConfigId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(opticalconfigId_);
+                                    opticalconfigId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                config_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_OpticalConfig_descriptor;
         }
@@ -69909,13 +72809,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.OpticalConfigIdOrBuilder getOpticalconfigIdOrBuilder() {
-            return opticalconfigId_ == null ? context.ContextOuterClass.OpticalConfigId.getDefaultInstance() : opticalconfigId_;
+            return getOpticalconfigId();
         }
 
         public static final int CONFIG_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object config_ = "";
+        private volatile java.lang.Object config_;
 
         /**
          * string config = 2;
@@ -69968,10 +72867,10 @@ public final class ContextOuterClass {
             if (opticalconfigId_ != null) {
                 output.writeMessage(1, getOpticalconfigId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(config_)) {
+            if (!getConfigBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, config_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -69983,10 +72882,10 @@ public final class ContextOuterClass {
             if (opticalconfigId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getOpticalconfigId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(config_)) {
+            if (!getConfigBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, config_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -70008,7 +72907,7 @@ public final class ContextOuterClass {
             }
             if (!getConfig().equals(other.getConfig()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -70026,7 +72925,7 @@ public final class ContextOuterClass {
             }
             hash = (37 * hash) + CONFIG_FIELD_NUMBER;
             hash = (53 * hash) + getConfig().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -70120,19 +73019,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.OpticalConfig.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                opticalconfigId_ = null;
-                if (opticalconfigIdBuilder_ != null) {
-                    opticalconfigIdBuilder_.dispose();
+                if (opticalconfigIdBuilder_ == null) {
+                    opticalconfigId_ = null;
+                } else {
+                    opticalconfigId_ = null;
                     opticalconfigIdBuilder_ = null;
                 }
                 config_ = "";
@@ -70161,21 +73067,44 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.OpticalConfig buildPartial() {
                 context.ContextOuterClass.OpticalConfig result = new context.ContextOuterClass.OpticalConfig(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (opticalconfigIdBuilder_ == null) {
+                    result.opticalconfigId_ = opticalconfigId_;
+                } else {
+                    result.opticalconfigId_ = opticalconfigIdBuilder_.build();
                 }
+                result.config_ = config_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.OpticalConfig result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.opticalconfigId_ = opticalconfigIdBuilder_ == null ? opticalconfigId_ : opticalconfigIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.config_ = config_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -70196,10 +73125,9 @@ public final class ContextOuterClass {
                 }
                 if (!other.getConfig().isEmpty()) {
                     config_ = other.config_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -70211,54 +73139,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.OpticalConfig parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getOpticalconfigIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    config_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.OpticalConfig) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.OpticalConfigId opticalconfigId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 opticalconfigIdBuilder_;
@@ -70268,7 +73162,7 @@ public final class ContextOuterClass {
              * @return Whether the opticalconfigId field is set.
              */
             public boolean hasOpticalconfigId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return opticalconfigIdBuilder_ != null || opticalconfigId_ != null;
             }
 
             /**
@@ -70292,11 +73186,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     opticalconfigId_ = value;
+                    onChanged();
                 } else {
                     opticalconfigIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -70306,11 +73199,10 @@ public final class ContextOuterClass {
             public Builder setOpticalconfigId(context.ContextOuterClass.OpticalConfigId.Builder builderForValue) {
                 if (opticalconfigIdBuilder_ == null) {
                     opticalconfigId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     opticalconfigIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -70319,16 +73211,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeOpticalconfigId(context.ContextOuterClass.OpticalConfigId value) {
                 if (opticalconfigIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && opticalconfigId_ != null && opticalconfigId_ != context.ContextOuterClass.OpticalConfigId.getDefaultInstance()) {
-                        getOpticalconfigIdBuilder().mergeFrom(value);
+                    if (opticalconfigId_ != null) {
+                        opticalconfigId_ = context.ContextOuterClass.OpticalConfigId.newBuilder(opticalconfigId_).mergeFrom(value).buildPartial();
                     } else {
                         opticalconfigId_ = value;
                     }
+                    onChanged();
                 } else {
                     opticalconfigIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -70336,13 +73227,13 @@ public final class ContextOuterClass {
              * .context.OpticalConfigId opticalconfig_id = 1;
              */
             public Builder clearOpticalconfigId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                opticalconfigId_ = null;
-                if (opticalconfigIdBuilder_ != null) {
-                    opticalconfigIdBuilder_.dispose();
+                if (opticalconfigIdBuilder_ == null) {
+                    opticalconfigId_ = null;
+                    onChanged();
+                } else {
+                    opticalconfigId_ = null;
                     opticalconfigIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -70350,7 +73241,6 @@ public final class ContextOuterClass {
              * .context.OpticalConfigId opticalconfig_id = 1;
              */
             public context.ContextOuterClass.OpticalConfigId.Builder getOpticalconfigIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getOpticalconfigIdFieldBuilder().getBuilder();
             }
@@ -70420,7 +73310,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 config_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -70431,7 +73320,6 @@ public final class ContextOuterClass {
              */
             public Builder clearConfig() {
                 config_ = getDefaultInstance().getConfig();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -70447,7 +73335,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 config_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -70479,17 +73366,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public OpticalConfig parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new OpticalConfig(input, extensionRegistry);
             }
         };
 
@@ -70560,6 +73437,57 @@ public final class ContextOuterClass {
             return new OpticalConfigList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private OpticalConfigList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    opticalconfigs_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                opticalconfigs_.add(input.readMessage(context.ContextOuterClass.OpticalConfig.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    opticalconfigs_ = java.util.Collections.unmodifiableList(opticalconfigs_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_OpticalConfigList_descriptor;
         }
@@ -70571,7 +73499,6 @@ public final class ContextOuterClass {
 
         public static final int OPTICALCONFIGS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List opticalconfigs_;
 
         /**
@@ -70632,7 +73559,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < opticalconfigs_.size(); i++) {
                 output.writeMessage(1, opticalconfigs_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -70644,7 +73571,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < opticalconfigs_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, opticalconfigs_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -70660,7 +73587,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.OpticalConfigList other = (context.ContextOuterClass.OpticalConfigList) obj;
             if (!getOpticalconfigsList().equals(other.getOpticalconfigsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -70676,7 +73603,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + OPTICALCONFIGS_FIELD_NUMBER;
                 hash = (53 * hash) + getOpticalconfigsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -70770,23 +73697,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.OpticalConfigList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getOpticalconfigsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (opticalconfigsBuilder_ == null) {
                     opticalconfigs_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    opticalconfigs_ = null;
                     opticalconfigsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -70812,15 +73745,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.OpticalConfigList buildPartial() {
                 context.ContextOuterClass.OpticalConfigList result = new context.ContextOuterClass.OpticalConfigList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.OpticalConfigList result) {
+                int from_bitField0_ = bitField0_;
                 if (opticalconfigsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         opticalconfigs_ = java.util.Collections.unmodifiableList(opticalconfigs_);
@@ -70830,10 +73755,38 @@ public final class ContextOuterClass {
                 } else {
                     result.opticalconfigs_ = opticalconfigsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.OpticalConfigList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -70873,7 +73826,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -70885,47 +73838,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.OpticalConfigList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.OpticalConfig m = input.readMessage(context.ContextOuterClass.OpticalConfig.parser(), extensionRegistry);
-                                    if (opticalconfigsBuilder_ == null) {
-                                        ensureOpticalconfigsIsMutable();
-                                        opticalconfigs_.add(m);
-                                    } else {
-                                        opticalconfigsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.OpticalConfigList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -71195,17 +74118,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public OpticalConfigList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new OpticalConfigList(input, extensionRegistry);
             }
         };
 
@@ -71267,6 +74180,57 @@ public final class ContextOuterClass {
             return new OpticalLinkId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private OpticalLinkId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (opticalLinkUuid_ != null) {
+                                    subBuilder = opticalLinkUuid_.toBuilder();
+                                }
+                                opticalLinkUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(opticalLinkUuid_);
+                                    opticalLinkUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_OpticalLinkId_descriptor;
         }
@@ -71303,7 +74267,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getOpticalLinkUuidOrBuilder() {
-            return opticalLinkUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : opticalLinkUuid_;
+            return getOpticalLinkUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -71324,7 +74288,7 @@ public final class ContextOuterClass {
             if (opticalLinkUuid_ != null) {
                 output.writeMessage(1, getOpticalLinkUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -71336,7 +74300,7 @@ public final class ContextOuterClass {
             if (opticalLinkUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getOpticalLinkUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -71356,7 +74320,7 @@ public final class ContextOuterClass {
                 if (!getOpticalLinkUuid().equals(other.getOpticalLinkUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -71372,7 +74336,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + OPTICAL_LINK_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getOpticalLinkUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -71466,19 +74430,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.OpticalLinkId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                opticalLinkUuid_ = null;
-                if (opticalLinkUuidBuilder_ != null) {
-                    opticalLinkUuidBuilder_.dispose();
+                if (opticalLinkUuidBuilder_ == null) {
+                    opticalLinkUuid_ = null;
+                } else {
+                    opticalLinkUuid_ = null;
                     opticalLinkUuidBuilder_ = null;
                 }
                 return this;
@@ -71506,18 +74477,43 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.OpticalLinkId buildPartial() {
                 context.ContextOuterClass.OpticalLinkId result = new context.ContextOuterClass.OpticalLinkId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (opticalLinkUuidBuilder_ == null) {
+                    result.opticalLinkUuid_ = opticalLinkUuid_;
+                } else {
+                    result.opticalLinkUuid_ = opticalLinkUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.OpticalLinkId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.opticalLinkUuid_ = opticalLinkUuidBuilder_ == null ? opticalLinkUuid_ : opticalLinkUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -71536,7 +74532,7 @@ public final class ContextOuterClass {
                 if (other.hasOpticalLinkUuid()) {
                     mergeOpticalLinkUuid(other.getOpticalLinkUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -71548,47 +74544,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.OpticalLinkId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getOpticalLinkUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.OpticalLinkId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid opticalLinkUuid_;
 
             private com.google.protobuf.SingleFieldBuilderV3 opticalLinkUuidBuilder_;
@@ -71598,7 +74567,7 @@ public final class ContextOuterClass {
              * @return Whether the opticalLinkUuid field is set.
              */
             public boolean hasOpticalLinkUuid() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return opticalLinkUuidBuilder_ != null || opticalLinkUuid_ != null;
             }
 
             /**
@@ -71622,11 +74591,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     opticalLinkUuid_ = value;
+                    onChanged();
                 } else {
                     opticalLinkUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -71636,11 +74604,10 @@ public final class ContextOuterClass {
             public Builder setOpticalLinkUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (opticalLinkUuidBuilder_ == null) {
                     opticalLinkUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     opticalLinkUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -71649,16 +74616,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeOpticalLinkUuid(context.ContextOuterClass.Uuid value) {
                 if (opticalLinkUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && opticalLinkUuid_ != null && opticalLinkUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getOpticalLinkUuidBuilder().mergeFrom(value);
+                    if (opticalLinkUuid_ != null) {
+                        opticalLinkUuid_ = context.ContextOuterClass.Uuid.newBuilder(opticalLinkUuid_).mergeFrom(value).buildPartial();
                     } else {
                         opticalLinkUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     opticalLinkUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -71666,13 +74632,13 @@ public final class ContextOuterClass {
              * .context.Uuid optical_link_uuid = 1;
              */
             public Builder clearOpticalLinkUuid() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                opticalLinkUuid_ = null;
-                if (opticalLinkUuidBuilder_ != null) {
-                    opticalLinkUuidBuilder_.dispose();
+                if (opticalLinkUuidBuilder_ == null) {
+                    opticalLinkUuid_ = null;
+                    onChanged();
+                } else {
+                    opticalLinkUuid_ = null;
                     opticalLinkUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -71680,7 +74646,6 @@ public final class ContextOuterClass {
              * .context.Uuid optical_link_uuid = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getOpticalLinkUuidBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getOpticalLinkUuidFieldBuilder().getBuilder();
             }
@@ -71734,17 +74699,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public OpticalLinkId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new OpticalLinkId(input, extensionRegistry);
             }
         };
 
@@ -71806,6 +74761,57 @@ public final class ContextOuterClass {
             return new FiberId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private FiberId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (fiberUuid_ != null) {
+                                    subBuilder = fiberUuid_.toBuilder();
+                                }
+                                fiberUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(fiberUuid_);
+                                    fiberUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_FiberId_descriptor;
         }
@@ -71842,7 +74848,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getFiberUuidOrBuilder() {
-            return fiberUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : fiberUuid_;
+            return getFiberUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -71863,7 +74869,7 @@ public final class ContextOuterClass {
             if (fiberUuid_ != null) {
                 output.writeMessage(1, getFiberUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -71875,7 +74881,7 @@ public final class ContextOuterClass {
             if (fiberUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getFiberUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -71895,7 +74901,7 @@ public final class ContextOuterClass {
                 if (!getFiberUuid().equals(other.getFiberUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -71911,7 +74917,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + FIBER_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getFiberUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -72005,19 +75011,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.FiberId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                fiberUuid_ = null;
-                if (fiberUuidBuilder_ != null) {
-                    fiberUuidBuilder_.dispose();
+                if (fiberUuidBuilder_ == null) {
+                    fiberUuid_ = null;
+                } else {
+                    fiberUuid_ = null;
                     fiberUuidBuilder_ = null;
                 }
                 return this;
@@ -72045,18 +75058,43 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.FiberId buildPartial() {
                 context.ContextOuterClass.FiberId result = new context.ContextOuterClass.FiberId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (fiberUuidBuilder_ == null) {
+                    result.fiberUuid_ = fiberUuid_;
+                } else {
+                    result.fiberUuid_ = fiberUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.FiberId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.fiberUuid_ = fiberUuidBuilder_ == null ? fiberUuid_ : fiberUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -72075,7 +75113,7 @@ public final class ContextOuterClass {
                 if (other.hasFiberUuid()) {
                     mergeFiberUuid(other.getFiberUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -72087,47 +75125,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.FiberId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getFiberUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.FiberId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid fiberUuid_;
 
             private com.google.protobuf.SingleFieldBuilderV3 fiberUuidBuilder_;
@@ -72137,7 +75148,7 @@ public final class ContextOuterClass {
              * @return Whether the fiberUuid field is set.
              */
             public boolean hasFiberUuid() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return fiberUuidBuilder_ != null || fiberUuid_ != null;
             }
 
             /**
@@ -72161,11 +75172,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     fiberUuid_ = value;
+                    onChanged();
                 } else {
                     fiberUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -72175,11 +75185,10 @@ public final class ContextOuterClass {
             public Builder setFiberUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (fiberUuidBuilder_ == null) {
                     fiberUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     fiberUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -72188,16 +75197,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeFiberUuid(context.ContextOuterClass.Uuid value) {
                 if (fiberUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && fiberUuid_ != null && fiberUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getFiberUuidBuilder().mergeFrom(value);
+                    if (fiberUuid_ != null) {
+                        fiberUuid_ = context.ContextOuterClass.Uuid.newBuilder(fiberUuid_).mergeFrom(value).buildPartial();
                     } else {
                         fiberUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     fiberUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -72205,13 +75213,13 @@ public final class ContextOuterClass {
              * .context.Uuid fiber_uuid = 1;
              */
             public Builder clearFiberUuid() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                fiberUuid_ = null;
-                if (fiberUuidBuilder_ != null) {
-                    fiberUuidBuilder_.dispose();
+                if (fiberUuidBuilder_ == null) {
+                    fiberUuid_ = null;
+                    onChanged();
+                } else {
+                    fiberUuid_ = null;
                     fiberUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -72219,7 +75227,6 @@ public final class ContextOuterClass {
              * .context.Uuid fiber_uuid = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getFiberUuidBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getFiberUuidFieldBuilder().getBuilder();
             }
@@ -72273,17 +75280,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public FiberId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new FiberId(input, extensionRegistry);
             }
         };
 
@@ -72482,6 +75479,179 @@ public final class ContextOuterClass {
             return new Fiber();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Fiber(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                srcPort_ = s;
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                dstPort_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                localPeerPort_ = s;
+                                break;
+                            }
+                        case 34:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                remotePeerPort_ = s;
+                                break;
+                            }
+                        case 40:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    cSlots_ = newIntList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                cSlots_.addInt(input.readInt32());
+                                break;
+                            }
+                        case 42:
+                            {
+                                int length = input.readRawVarint32();
+                                int limit = input.pushLimit(length);
+                                if (!((mutable_bitField0_ & 0x00000001) != 0) && input.getBytesUntilLimit() > 0) {
+                                    cSlots_ = newIntList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                while (input.getBytesUntilLimit() > 0) {
+                                    cSlots_.addInt(input.readInt32());
+                                }
+                                input.popLimit(limit);
+                                break;
+                            }
+                        case 48:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                                    lSlots_ = newIntList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                lSlots_.addInt(input.readInt32());
+                                break;
+                            }
+                        case 50:
+                            {
+                                int length = input.readRawVarint32();
+                                int limit = input.pushLimit(length);
+                                if (!((mutable_bitField0_ & 0x00000002) != 0) && input.getBytesUntilLimit() > 0) {
+                                    lSlots_ = newIntList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                while (input.getBytesUntilLimit() > 0) {
+                                    lSlots_.addInt(input.readInt32());
+                                }
+                                input.popLimit(limit);
+                                break;
+                            }
+                        case 56:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000004) != 0)) {
+                                    sSlots_ = newIntList();
+                                    mutable_bitField0_ |= 0x00000004;
+                                }
+                                sSlots_.addInt(input.readInt32());
+                                break;
+                            }
+                        case 58:
+                            {
+                                int length = input.readRawVarint32();
+                                int limit = input.pushLimit(length);
+                                if (!((mutable_bitField0_ & 0x00000004) != 0) && input.getBytesUntilLimit() > 0) {
+                                    sSlots_ = newIntList();
+                                    mutable_bitField0_ |= 0x00000004;
+                                }
+                                while (input.getBytesUntilLimit() > 0) {
+                                    sSlots_.addInt(input.readInt32());
+                                }
+                                input.popLimit(limit);
+                                break;
+                            }
+                        case 69:
+                            {
+                                length_ = input.readFloat();
+                                break;
+                            }
+                        case 72:
+                            {
+                                used_ = input.readBool();
+                                break;
+                            }
+                        case 82:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                iD_ = s;
+                                break;
+                            }
+                        case 90:
+                            {
+                                context.ContextOuterClass.FiberId.Builder subBuilder = null;
+                                if (fiberUuid_ != null) {
+                                    subBuilder = fiberUuid_.toBuilder();
+                                }
+                                fiberUuid_ = input.readMessage(context.ContextOuterClass.FiberId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(fiberUuid_);
+                                    fiberUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    // C
+                    cSlots_.makeImmutable();
+                }
+                if (((mutable_bitField0_ & 0x00000002) != 0)) {
+                    // C
+                    lSlots_.makeImmutable();
+                }
+                if (((mutable_bitField0_ & 0x00000004) != 0)) {
+                    // C
+                    sSlots_.makeImmutable();
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Fiber_descriptor;
         }
@@ -72493,8 +75663,7 @@ public final class ContextOuterClass {
 
         public static final int ID_FIELD_NUMBER = 10;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object iD_ = "";
+        private volatile java.lang.Object iD_;
 
         /**
          * string ID = 10;
@@ -72531,8 +75700,7 @@ public final class ContextOuterClass {
 
         public static final int SRC_PORT_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object srcPort_ = "";
+        private volatile java.lang.Object srcPort_;
 
         /**
          * string src_port = 1;
@@ -72569,8 +75737,7 @@ public final class ContextOuterClass {
 
         public static final int DST_PORT_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object dstPort_ = "";
+        private volatile java.lang.Object dstPort_;
 
         /**
          * string dst_port = 2;
@@ -72607,8 +75774,7 @@ public final class ContextOuterClass {
 
         public static final int LOCAL_PEER_PORT_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object localPeerPort_ = "";
+        private volatile java.lang.Object localPeerPort_;
 
         /**
          * string local_peer_port = 3;
@@ -72645,8 +75811,7 @@ public final class ContextOuterClass {
 
         public static final int REMOTE_PEER_PORT_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object remotePeerPort_ = "";
+        private volatile java.lang.Object remotePeerPort_;
 
         /**
          * string remote_peer_port = 4;
@@ -72683,7 +75848,6 @@ public final class ContextOuterClass {
 
         public static final int C_SLOTS_FIELD_NUMBER = 5;
 
-        @SuppressWarnings("serial")
         private com.google.protobuf.Internal.IntList cSlots_;
 
         /**
@@ -72716,7 +75880,6 @@ public final class ContextOuterClass {
 
         public static final int L_SLOTS_FIELD_NUMBER = 6;
 
-        @SuppressWarnings("serial")
         private com.google.protobuf.Internal.IntList lSlots_;
 
         /**
@@ -72749,7 +75912,6 @@ public final class ContextOuterClass {
 
         public static final int S_SLOTS_FIELD_NUMBER = 7;
 
-        @SuppressWarnings("serial")
         private com.google.protobuf.Internal.IntList sSlots_;
 
         /**
@@ -72782,7 +75944,7 @@ public final class ContextOuterClass {
 
         public static final int LENGTH_FIELD_NUMBER = 8;
 
-        private float length_ = 0F;
+        private float length_;
 
         /**
          * float length = 8;
@@ -72795,7 +75957,7 @@ public final class ContextOuterClass {
 
         public static final int USED_FIELD_NUMBER = 9;
 
-        private boolean used_ = false;
+        private boolean used_;
 
         /**
          * bool used = 9;
@@ -72833,7 +75995,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.FiberIdOrBuilder getFiberUuidOrBuilder() {
-            return fiberUuid_ == null ? context.ContextOuterClass.FiberId.getDefaultInstance() : fiberUuid_;
+            return getFiberUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -72852,16 +76014,16 @@ public final class ContextOuterClass {
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
             getSerializedSize();
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcPort_)) {
+            if (!getSrcPortBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, srcPort_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstPort_)) {
+            if (!getDstPortBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, dstPort_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(localPeerPort_)) {
+            if (!getLocalPeerPortBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 3, localPeerPort_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(remotePeerPort_)) {
+            if (!getRemotePeerPortBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 4, remotePeerPort_);
             }
             if (getCSlotsList().size() > 0) {
@@ -72885,19 +76047,19 @@ public final class ContextOuterClass {
             for (int i = 0; i < sSlots_.size(); i++) {
                 output.writeInt32NoTag(sSlots_.getInt(i));
             }
-            if (java.lang.Float.floatToRawIntBits(length_) != 0) {
+            if (length_ != 0F) {
                 output.writeFloat(8, length_);
             }
             if (used_ != false) {
                 output.writeBool(9, used_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(iD_)) {
+            if (!getIDBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 10, iD_);
             }
             if (fiberUuid_ != null) {
                 output.writeMessage(11, getFiberUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -72906,16 +76068,16 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcPort_)) {
+            if (!getSrcPortBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, srcPort_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstPort_)) {
+            if (!getDstPortBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, dstPort_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(localPeerPort_)) {
+            if (!getLocalPeerPortBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, localPeerPort_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(remotePeerPort_)) {
+            if (!getRemotePeerPortBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, remotePeerPort_);
             }
             {
@@ -72954,19 +76116,19 @@ public final class ContextOuterClass {
                 }
                 sSlotsMemoizedSerializedSize = dataSize;
             }
-            if (java.lang.Float.floatToRawIntBits(length_) != 0) {
+            if (length_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(8, length_);
             }
             if (used_ != false) {
                 size += com.google.protobuf.CodedOutputStream.computeBoolSize(9, used_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(iD_)) {
+            if (!getIDBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(10, iD_);
             }
             if (fiberUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(11, getFiberUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -73006,7 +76168,7 @@ public final class ContextOuterClass {
                 if (!getFiberUuid().equals(other.getFiberUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -73048,7 +76210,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + FIBER_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getFiberUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -73142,29 +76304,39 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Fiber.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 iD_ = "";
                 srcPort_ = "";
                 dstPort_ = "";
                 localPeerPort_ = "";
                 remotePeerPort_ = "";
                 cSlots_ = emptyIntList();
+                bitField0_ = (bitField0_ & ~0x00000001);
                 lSlots_ = emptyIntList();
+                bitField0_ = (bitField0_ & ~0x00000002);
                 sSlots_ = emptyIntList();
+                bitField0_ = (bitField0_ & ~0x00000004);
                 length_ = 0F;
                 used_ = false;
-                fiberUuid_ = null;
-                if (fiberUuidBuilder_ != null) {
-                    fiberUuidBuilder_.dispose();
+                if (fiberUuidBuilder_ == null) {
+                    fiberUuid_ = null;
+                } else {
+                    fiberUuid_ = null;
                     fiberUuidBuilder_ = null;
                 }
                 return this;
@@ -73192,58 +76364,66 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Fiber buildPartial() {
                 context.ContextOuterClass.Fiber result = new context.ContextOuterClass.Fiber(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Fiber result) {
-                if (((bitField0_ & 0x00000020) != 0)) {
+                int from_bitField0_ = bitField0_;
+                result.iD_ = iD_;
+                result.srcPort_ = srcPort_;
+                result.dstPort_ = dstPort_;
+                result.localPeerPort_ = localPeerPort_;
+                result.remotePeerPort_ = remotePeerPort_;
+                if (((bitField0_ & 0x00000001) != 0)) {
                     cSlots_.makeImmutable();
-                    bitField0_ = (bitField0_ & ~0x00000020);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 }
                 result.cSlots_ = cSlots_;
-                if (((bitField0_ & 0x00000040) != 0)) {
+                if (((bitField0_ & 0x00000002) != 0)) {
                     lSlots_.makeImmutable();
-                    bitField0_ = (bitField0_ & ~0x00000040);
+                    bitField0_ = (bitField0_ & ~0x00000002);
                 }
                 result.lSlots_ = lSlots_;
-                if (((bitField0_ & 0x00000080) != 0)) {
+                if (((bitField0_ & 0x00000004) != 0)) {
                     sSlots_.makeImmutable();
-                    bitField0_ = (bitField0_ & ~0x00000080);
+                    bitField0_ = (bitField0_ & ~0x00000004);
                 }
                 result.sSlots_ = sSlots_;
+                result.length_ = length_;
+                result.used_ = used_;
+                if (fiberUuidBuilder_ == null) {
+                    result.fiberUuid_ = fiberUuid_;
+                } else {
+                    result.fiberUuid_ = fiberUuidBuilder_.build();
+                }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Fiber result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.iD_ = iD_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.srcPort_ = srcPort_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.dstPort_ = dstPort_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.localPeerPort_ = localPeerPort_;
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.remotePeerPort_ = remotePeerPort_;
-                }
-                if (((from_bitField0_ & 0x00000100) != 0)) {
-                    result.length_ = length_;
-                }
-                if (((from_bitField0_ & 0x00000200) != 0)) {
-                    result.used_ = used_;
-                }
-                if (((from_bitField0_ & 0x00000400) != 0)) {
-                    result.fiberUuid_ = fiberUuidBuilder_ == null ? fiberUuid_ : fiberUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -73261,33 +76441,28 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getID().isEmpty()) {
                     iD_ = other.iD_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
                 if (!other.getSrcPort().isEmpty()) {
                     srcPort_ = other.srcPort_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (!other.getDstPort().isEmpty()) {
                     dstPort_ = other.dstPort_;
-                    bitField0_ |= 0x00000004;
                     onChanged();
                 }
                 if (!other.getLocalPeerPort().isEmpty()) {
                     localPeerPort_ = other.localPeerPort_;
-                    bitField0_ |= 0x00000008;
                     onChanged();
                 }
                 if (!other.getRemotePeerPort().isEmpty()) {
                     remotePeerPort_ = other.remotePeerPort_;
-                    bitField0_ |= 0x00000010;
                     onChanged();
                 }
                 if (!other.cSlots_.isEmpty()) {
                     if (cSlots_.isEmpty()) {
                         cSlots_ = other.cSlots_;
-                        bitField0_ = (bitField0_ & ~0x00000020);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     } else {
                         ensureCSlotsIsMutable();
                         cSlots_.addAll(other.cSlots_);
@@ -73297,7 +76472,7 @@ public final class ContextOuterClass {
                 if (!other.lSlots_.isEmpty()) {
                     if (lSlots_.isEmpty()) {
                         lSlots_ = other.lSlots_;
-                        bitField0_ = (bitField0_ & ~0x00000040);
+                        bitField0_ = (bitField0_ & ~0x00000002);
                     } else {
                         ensureLSlotsIsMutable();
                         lSlots_.addAll(other.lSlots_);
@@ -73307,7 +76482,7 @@ public final class ContextOuterClass {
                 if (!other.sSlots_.isEmpty()) {
                     if (sSlots_.isEmpty()) {
                         sSlots_ = other.sSlots_;
-                        bitField0_ = (bitField0_ & ~0x00000080);
+                        bitField0_ = (bitField0_ & ~0x00000004);
                     } else {
                         ensureSSlotsIsMutable();
                         sSlots_.addAll(other.sSlots_);
@@ -73323,7 +76498,7 @@ public final class ContextOuterClass {
                 if (other.hasFiberUuid()) {
                     mergeFiberUuid(other.getFiberUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -73335,151 +76510,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Fiber parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    srcPort_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    dstPort_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    localPeerPort_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    remotePeerPort_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 34
-                            case 40:
-                                {
-                                    int v = input.readInt32();
-                                    ensureCSlotsIsMutable();
-                                    cSlots_.addInt(v);
-                                    break;
-                                }
-                            // case 40
-                            case 42:
-                                {
-                                    int length = input.readRawVarint32();
-                                    int limit = input.pushLimit(length);
-                                    ensureCSlotsIsMutable();
-                                    while (input.getBytesUntilLimit() > 0) {
-                                        cSlots_.addInt(input.readInt32());
-                                    }
-                                    input.popLimit(limit);
-                                    break;
-                                }
-                            // case 42
-                            case 48:
-                                {
-                                    int v = input.readInt32();
-                                    ensureLSlotsIsMutable();
-                                    lSlots_.addInt(v);
-                                    break;
-                                }
-                            // case 48
-                            case 50:
-                                {
-                                    int length = input.readRawVarint32();
-                                    int limit = input.pushLimit(length);
-                                    ensureLSlotsIsMutable();
-                                    while (input.getBytesUntilLimit() > 0) {
-                                        lSlots_.addInt(input.readInt32());
-                                    }
-                                    input.popLimit(limit);
-                                    break;
-                                }
-                            // case 50
-                            case 56:
-                                {
-                                    int v = input.readInt32();
-                                    ensureSSlotsIsMutable();
-                                    sSlots_.addInt(v);
-                                    break;
-                                }
-                            // case 56
-                            case 58:
-                                {
-                                    int length = input.readRawVarint32();
-                                    int limit = input.pushLimit(length);
-                                    ensureSSlotsIsMutable();
-                                    while (input.getBytesUntilLimit() > 0) {
-                                        sSlots_.addInt(input.readInt32());
-                                    }
-                                    input.popLimit(limit);
-                                    break;
-                                }
-                            // case 58
-                            case 69:
-                                {
-                                    length_ = input.readFloat();
-                                    bitField0_ |= 0x00000100;
-                                    break;
-                                }
-                            // case 69
-                            case 72:
-                                {
-                                    used_ = input.readBool();
-                                    bitField0_ |= 0x00000200;
-                                    break;
-                                }
-                            // case 72
-                            case 82:
-                                {
-                                    iD_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 82
-                            case 90:
-                                {
-                                    input.readMessage(getFiberUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000400;
-                                    break;
-                                }
-                            // case 90
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Fiber) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -73528,7 +76569,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 iD_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -73539,7 +76579,6 @@ public final class ContextOuterClass {
              */
             public Builder clearID() {
                 iD_ = getDefaultInstance().getID();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -73555,7 +76594,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 iD_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -73603,7 +76641,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 srcPort_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -73614,7 +76651,6 @@ public final class ContextOuterClass {
              */
             public Builder clearSrcPort() {
                 srcPort_ = getDefaultInstance().getSrcPort();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -73630,7 +76666,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 srcPort_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -73678,7 +76713,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 dstPort_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -73689,7 +76723,6 @@ public final class ContextOuterClass {
              */
             public Builder clearDstPort() {
                 dstPort_ = getDefaultInstance().getDstPort();
-                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -73705,7 +76738,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 dstPort_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -73753,7 +76785,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 localPeerPort_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -73764,7 +76795,6 @@ public final class ContextOuterClass {
              */
             public Builder clearLocalPeerPort() {
                 localPeerPort_ = getDefaultInstance().getLocalPeerPort();
-                bitField0_ = (bitField0_ & ~0x00000008);
                 onChanged();
                 return this;
             }
@@ -73780,7 +76810,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 localPeerPort_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -73828,7 +76857,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 remotePeerPort_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -73839,7 +76867,6 @@ public final class ContextOuterClass {
              */
             public Builder clearRemotePeerPort() {
                 remotePeerPort_ = getDefaultInstance().getRemotePeerPort();
-                bitField0_ = (bitField0_ & ~0x00000010);
                 onChanged();
                 return this;
             }
@@ -73855,7 +76882,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 remotePeerPort_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -73863,9 +76889,9 @@ public final class ContextOuterClass {
             private com.google.protobuf.Internal.IntList cSlots_ = emptyIntList();
 
             private void ensureCSlotsIsMutable() {
-                if (!((bitField0_ & 0x00000020) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     cSlots_ = mutableCopy(cSlots_);
-                    bitField0_ |= 0x00000020;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -73874,7 +76900,7 @@ public final class ContextOuterClass {
              * @return A list containing the cSlots.
              */
             public java.util.List getCSlotsList() {
-                return ((bitField0_ & 0x00000020) != 0) ? java.util.Collections.unmodifiableList(cSlots_) : cSlots_;
+                return ((bitField0_ & 0x00000001) != 0) ? java.util.Collections.unmodifiableList(cSlots_) : cSlots_;
             }
 
             /**
@@ -73937,7 +76963,7 @@ public final class ContextOuterClass {
              */
             public Builder clearCSlots() {
                 cSlots_ = emptyIntList();
-                bitField0_ = (bitField0_ & ~0x00000020);
+                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -73945,9 +76971,9 @@ public final class ContextOuterClass {
             private com.google.protobuf.Internal.IntList lSlots_ = emptyIntList();
 
             private void ensureLSlotsIsMutable() {
-                if (!((bitField0_ & 0x00000040) != 0)) {
+                if (!((bitField0_ & 0x00000002) != 0)) {
                     lSlots_ = mutableCopy(lSlots_);
-                    bitField0_ |= 0x00000040;
+                    bitField0_ |= 0x00000002;
                 }
             }
 
@@ -73956,7 +76982,7 @@ public final class ContextOuterClass {
              * @return A list containing the lSlots.
              */
             public java.util.List getLSlotsList() {
-                return ((bitField0_ & 0x00000040) != 0) ? java.util.Collections.unmodifiableList(lSlots_) : lSlots_;
+                return ((bitField0_ & 0x00000002) != 0) ? java.util.Collections.unmodifiableList(lSlots_) : lSlots_;
             }
 
             /**
@@ -74019,7 +77045,7 @@ public final class ContextOuterClass {
              */
             public Builder clearLSlots() {
                 lSlots_ = emptyIntList();
-                bitField0_ = (bitField0_ & ~0x00000040);
+                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -74027,9 +77053,9 @@ public final class ContextOuterClass {
             private com.google.protobuf.Internal.IntList sSlots_ = emptyIntList();
 
             private void ensureSSlotsIsMutable() {
-                if (!((bitField0_ & 0x00000080) != 0)) {
+                if (!((bitField0_ & 0x00000004) != 0)) {
                     sSlots_ = mutableCopy(sSlots_);
-                    bitField0_ |= 0x00000080;
+                    bitField0_ |= 0x00000004;
                 }
             }
 
@@ -74038,7 +77064,7 @@ public final class ContextOuterClass {
              * @return A list containing the sSlots.
              */
             public java.util.List getSSlotsList() {
-                return ((bitField0_ & 0x00000080) != 0) ? java.util.Collections.unmodifiableList(sSlots_) : sSlots_;
+                return ((bitField0_ & 0x00000004) != 0) ? java.util.Collections.unmodifiableList(sSlots_) : sSlots_;
             }
 
             /**
@@ -74101,7 +77127,7 @@ public final class ContextOuterClass {
              */
             public Builder clearSSlots() {
                 sSlots_ = emptyIntList();
-                bitField0_ = (bitField0_ & ~0x00000080);
+                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -74124,7 +77150,6 @@ public final class ContextOuterClass {
              */
             public Builder setLength(float value) {
                 length_ = value;
-                bitField0_ |= 0x00000100;
                 onChanged();
                 return this;
             }
@@ -74134,7 +77159,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearLength() {
-                bitField0_ = (bitField0_ & ~0x00000100);
                 length_ = 0F;
                 onChanged();
                 return this;
@@ -74158,7 +77182,6 @@ public final class ContextOuterClass {
              */
             public Builder setUsed(boolean value) {
                 used_ = value;
-                bitField0_ |= 0x00000200;
                 onChanged();
                 return this;
             }
@@ -74168,7 +77191,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearUsed() {
-                bitField0_ = (bitField0_ & ~0x00000200);
                 used_ = false;
                 onChanged();
                 return this;
@@ -74183,7 +77205,7 @@ public final class ContextOuterClass {
              * @return Whether the fiberUuid field is set.
              */
             public boolean hasFiberUuid() {
-                return ((bitField0_ & 0x00000400) != 0);
+                return fiberUuidBuilder_ != null || fiberUuid_ != null;
             }
 
             /**
@@ -74207,11 +77229,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     fiberUuid_ = value;
+                    onChanged();
                 } else {
                     fiberUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000400;
-                onChanged();
                 return this;
             }
 
@@ -74221,11 +77242,10 @@ public final class ContextOuterClass {
             public Builder setFiberUuid(context.ContextOuterClass.FiberId.Builder builderForValue) {
                 if (fiberUuidBuilder_ == null) {
                     fiberUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     fiberUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000400;
-                onChanged();
                 return this;
             }
 
@@ -74234,16 +77254,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeFiberUuid(context.ContextOuterClass.FiberId value) {
                 if (fiberUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000400) != 0) && fiberUuid_ != null && fiberUuid_ != context.ContextOuterClass.FiberId.getDefaultInstance()) {
-                        getFiberUuidBuilder().mergeFrom(value);
+                    if (fiberUuid_ != null) {
+                        fiberUuid_ = context.ContextOuterClass.FiberId.newBuilder(fiberUuid_).mergeFrom(value).buildPartial();
                     } else {
                         fiberUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     fiberUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000400;
-                onChanged();
                 return this;
             }
 
@@ -74251,13 +77270,13 @@ public final class ContextOuterClass {
              * .context.FiberId fiber_uuid = 11;
              */
             public Builder clearFiberUuid() {
-                bitField0_ = (bitField0_ & ~0x00000400);
-                fiberUuid_ = null;
-                if (fiberUuidBuilder_ != null) {
-                    fiberUuidBuilder_.dispose();
+                if (fiberUuidBuilder_ == null) {
+                    fiberUuid_ = null;
+                    onChanged();
+                } else {
+                    fiberUuid_ = null;
                     fiberUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -74265,7 +77284,6 @@ public final class ContextOuterClass {
              * .context.FiberId fiber_uuid = 11;
              */
             public context.ContextOuterClass.FiberId.Builder getFiberUuidBuilder() {
-                bitField0_ |= 0x00000400;
                 onChanged();
                 return getFiberUuidFieldBuilder().getBuilder();
             }
@@ -74319,17 +77337,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Fiber parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Fiber(input, extensionRegistry);
             }
         };
 
@@ -74432,6 +77440,74 @@ public final class ContextOuterClass {
             return new OpticalLinkDetails();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private OpticalLinkDetails(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 13:
+                            {
+                                length_ = input.readFloat();
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                source_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                target_ = s;
+                                break;
+                            }
+                        case 34:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    fibers_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                fibers_.add(input.readMessage(context.ContextOuterClass.Fiber.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    fibers_ = java.util.Collections.unmodifiableList(fibers_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_OpticalLinkDetails_descriptor;
         }
@@ -74443,7 +77519,7 @@ public final class ContextOuterClass {
 
         public static final int LENGTH_FIELD_NUMBER = 1;
 
-        private float length_ = 0F;
+        private float length_;
 
         /**
          * float length = 1;
@@ -74456,8 +77532,7 @@ public final class ContextOuterClass {
 
         public static final int SOURCE_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object source_ = "";
+        private volatile java.lang.Object source_;
 
         /**
          * string source = 2;
@@ -74494,8 +77569,7 @@ public final class ContextOuterClass {
 
         public static final int TARGET_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object target_ = "";
+        private volatile java.lang.Object target_;
 
         /**
          * string target = 3;
@@ -74532,7 +77606,6 @@ public final class ContextOuterClass {
 
         public static final int FIBERS_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
         private java.util.List fibers_;
 
         /**
@@ -74590,19 +77663,19 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (java.lang.Float.floatToRawIntBits(length_) != 0) {
+            if (length_ != 0F) {
                 output.writeFloat(1, length_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(source_)) {
+            if (!getSourceBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, source_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(target_)) {
+            if (!getTargetBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 3, target_);
             }
             for (int i = 0; i < fibers_.size(); i++) {
                 output.writeMessage(4, fibers_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -74611,19 +77684,19 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (java.lang.Float.floatToRawIntBits(length_) != 0) {
+            if (length_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, length_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(source_)) {
+            if (!getSourceBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, source_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(target_)) {
+            if (!getTargetBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, target_);
             }
             for (int i = 0; i < fibers_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, fibers_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -74645,7 +77718,7 @@ public final class ContextOuterClass {
                 return false;
             if (!getFibersList().equals(other.getFibersList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -74667,7 +77740,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + FIBERS_FIELD_NUMBER;
                 hash = (53 * hash) + getFibersList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -74761,26 +77834,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.OpticalLinkDetails.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getFibersFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 length_ = 0F;
                 source_ = "";
                 target_ = "";
                 if (fibersBuilder_ == null) {
                     fibers_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    fibers_ = null;
                     fibersBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000008);
                 return this;
             }
 
@@ -74806,37 +77885,51 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.OpticalLinkDetails buildPartial() {
                 context.ContextOuterClass.OpticalLinkDetails result = new context.ContextOuterClass.OpticalLinkDetails(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.OpticalLinkDetails result) {
+                int from_bitField0_ = bitField0_;
+                result.length_ = length_;
+                result.source_ = source_;
+                result.target_ = target_;
                 if (fibersBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         fibers_ = java.util.Collections.unmodifiableList(fibers_);
-                        bitField0_ = (bitField0_ & ~0x00000008);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.fibers_ = fibers_;
                 } else {
                     result.fibers_ = fibersBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.OpticalLinkDetails result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.length_ = length_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.source_ = source_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.target_ = target_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -74857,19 +77950,17 @@ public final class ContextOuterClass {
                 }
                 if (!other.getSource().isEmpty()) {
                     source_ = other.source_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (!other.getTarget().isEmpty()) {
                     target_ = other.target_;
-                    bitField0_ |= 0x00000004;
                     onChanged();
                 }
                 if (fibersBuilder_ == null) {
                     if (!other.fibers_.isEmpty()) {
                         if (fibers_.isEmpty()) {
                             fibers_ = other.fibers_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureFibersIsMutable();
                             fibers_.addAll(other.fibers_);
@@ -74882,14 +77973,14 @@ public final class ContextOuterClass {
                             fibersBuilder_.dispose();
                             fibersBuilder_ = null;
                             fibers_ = other.fibers_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             fibersBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getFibersFieldBuilder() : null;
                         } else {
                             fibersBuilder_.addAllMessages(other.fibers_);
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -74901,68 +77992,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.OpticalLinkDetails parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 13:
-                                {
-                                    length_ = input.readFloat();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 13
-                            case 18:
-                                {
-                                    source_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    target_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    context.ContextOuterClass.Fiber m = input.readMessage(context.ContextOuterClass.Fiber.parser(), extensionRegistry);
-                                    if (fibersBuilder_ == null) {
-                                        ensureFibersIsMutable();
-                                        fibers_.add(m);
-                                    } else {
-                                        fibersBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 34
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.OpticalLinkDetails) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -74986,7 +78026,6 @@ public final class ContextOuterClass {
              */
             public Builder setLength(float value) {
                 length_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -74996,7 +78035,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearLength() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 length_ = 0F;
                 onChanged();
                 return this;
@@ -75045,7 +78083,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 source_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -75056,7 +78093,6 @@ public final class ContextOuterClass {
              */
             public Builder clearSource() {
                 source_ = getDefaultInstance().getSource();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -75072,7 +78108,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 source_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -75120,7 +78155,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 target_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -75131,7 +78165,6 @@ public final class ContextOuterClass {
              */
             public Builder clearTarget() {
                 target_ = getDefaultInstance().getTarget();
-                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -75147,7 +78180,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 target_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -75155,9 +78187,9 @@ public final class ContextOuterClass {
             private java.util.List fibers_ = java.util.Collections.emptyList();
 
             private void ensureFibersIsMutable() {
-                if (!((bitField0_ & 0x00000008) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     fibers_ = new java.util.ArrayList(fibers_);
-                    bitField0_ |= 0x00000008;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -75309,7 +78341,7 @@ public final class ContextOuterClass {
             public Builder clearFibers() {
                 if (fibersBuilder_ == null) {
                     fibers_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000008);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     fibersBuilder_.clear();
@@ -75383,7 +78415,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getFibersFieldBuilder() {
                 if (fibersBuilder_ == null) {
-                    fibersBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(fibers_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean());
+                    fibersBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(fibers_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     fibers_ = null;
                 }
                 return fibersBuilder_;
@@ -75416,17 +78448,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public OpticalLinkDetails parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new OpticalLinkDetails(input, extensionRegistry);
             }
         };
 
@@ -75518,6 +78540,76 @@ public final class ContextOuterClass {
             return new OpticalLink();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private OpticalLink(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.OpticalLinkDetails.Builder subBuilder = null;
+                                if (details_ != null) {
+                                    subBuilder = details_.toBuilder();
+                                }
+                                details_ = input.readMessage(context.ContextOuterClass.OpticalLinkDetails.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(details_);
+                                    details_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 26:
+                            {
+                                context.ContextOuterClass.OpticalLinkId.Builder subBuilder = null;
+                                if (opticalLinkUuid_ != null) {
+                                    subBuilder = opticalLinkUuid_.toBuilder();
+                                }
+                                opticalLinkUuid_ = input.readMessage(context.ContextOuterClass.OpticalLinkId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(opticalLinkUuid_);
+                                    opticalLinkUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_OpticalLink_descriptor;
         }
@@ -75529,8 +78621,7 @@ public final class ContextOuterClass {
 
         public static final int NAME_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 1;
@@ -75592,7 +78683,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.OpticalLinkDetailsOrBuilder getDetailsOrBuilder() {
-            return details_ == null ? context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance() : details_;
+            return getDetails();
         }
 
         public static final int OPTICAL_LINK_UUID_FIELD_NUMBER = 3;
@@ -75622,7 +78713,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.OpticalLinkIdOrBuilder getOpticalLinkUuidOrBuilder() {
-            return opticalLinkUuid_ == null ? context.ContextOuterClass.OpticalLinkId.getDefaultInstance() : opticalLinkUuid_;
+            return getOpticalLinkUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -75640,7 +78731,7 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
             }
             if (details_ != null) {
@@ -75649,7 +78740,7 @@ public final class ContextOuterClass {
             if (opticalLinkUuid_ != null) {
                 output.writeMessage(3, getOpticalLinkUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -75658,7 +78749,7 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
             }
             if (details_ != null) {
@@ -75667,7 +78758,7 @@ public final class ContextOuterClass {
             if (opticalLinkUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getOpticalLinkUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -75695,7 +78786,7 @@ public final class ContextOuterClass {
                 if (!getOpticalLinkUuid().equals(other.getOpticalLinkUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -75717,7 +78808,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + OPTICAL_LINK_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getOpticalLinkUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -75811,25 +78902,33 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.OpticalLink.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 name_ = "";
-                details_ = null;
-                if (detailsBuilder_ != null) {
-                    detailsBuilder_.dispose();
+                if (detailsBuilder_ == null) {
+                    details_ = null;
+                } else {
+                    details_ = null;
                     detailsBuilder_ = null;
                 }
-                opticalLinkUuid_ = null;
-                if (opticalLinkUuidBuilder_ != null) {
-                    opticalLinkUuidBuilder_.dispose();
+                if (opticalLinkUuidBuilder_ == null) {
+                    opticalLinkUuid_ = null;
+                } else {
+                    opticalLinkUuid_ = null;
                     opticalLinkUuidBuilder_ = null;
                 }
                 return this;
@@ -75857,24 +78956,49 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.OpticalLink buildPartial() {
                 context.ContextOuterClass.OpticalLink result = new context.ContextOuterClass.OpticalLink(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                result.name_ = name_;
+                if (detailsBuilder_ == null) {
+                    result.details_ = details_;
+                } else {
+                    result.details_ = detailsBuilder_.build();
+                }
+                if (opticalLinkUuidBuilder_ == null) {
+                    result.opticalLinkUuid_ = opticalLinkUuid_;
+                } else {
+                    result.opticalLinkUuid_ = opticalLinkUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.OpticalLink result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.details_ = detailsBuilder_ == null ? details_ : detailsBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.opticalLinkUuid_ = opticalLinkUuidBuilder_ == null ? opticalLinkUuid_ : opticalLinkUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -75892,7 +79016,6 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
                 if (other.hasDetails()) {
@@ -75901,7 +79024,7 @@ public final class ContextOuterClass {
                 if (other.hasOpticalLinkUuid()) {
                     mergeOpticalLinkUuid(other.getOpticalLinkUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -75913,61 +79036,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.OpticalLink parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getDetailsFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getOpticalLinkUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.OpticalLink) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private java.lang.Object name_ = "";
 
             /**
@@ -76011,7 +79093,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -76022,7 +79103,6 @@ public final class ContextOuterClass {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -76038,7 +79118,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -76052,7 +79131,7 @@ public final class ContextOuterClass {
              * @return Whether the details field is set.
              */
             public boolean hasDetails() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return detailsBuilder_ != null || details_ != null;
             }
 
             /**
@@ -76076,11 +79155,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     details_ = value;
+                    onChanged();
                 } else {
                     detailsBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -76090,11 +79168,10 @@ public final class ContextOuterClass {
             public Builder setDetails(context.ContextOuterClass.OpticalLinkDetails.Builder builderForValue) {
                 if (detailsBuilder_ == null) {
                     details_ = builderForValue.build();
+                    onChanged();
                 } else {
                     detailsBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -76103,16 +79180,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeDetails(context.ContextOuterClass.OpticalLinkDetails value) {
                 if (detailsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && details_ != null && details_ != context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance()) {
-                        getDetailsBuilder().mergeFrom(value);
+                    if (details_ != null) {
+                        details_ = context.ContextOuterClass.OpticalLinkDetails.newBuilder(details_).mergeFrom(value).buildPartial();
                     } else {
                         details_ = value;
                     }
+                    onChanged();
                 } else {
                     detailsBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -76120,13 +79196,13 @@ public final class ContextOuterClass {
              * .context.OpticalLinkDetails details = 2;
              */
             public Builder clearDetails() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                details_ = null;
-                if (detailsBuilder_ != null) {
-                    detailsBuilder_.dispose();
+                if (detailsBuilder_ == null) {
+                    details_ = null;
+                    onChanged();
+                } else {
+                    details_ = null;
                     detailsBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -76134,7 +79210,6 @@ public final class ContextOuterClass {
              * .context.OpticalLinkDetails details = 2;
              */
             public context.ContextOuterClass.OpticalLinkDetails.Builder getDetailsBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getDetailsFieldBuilder().getBuilder();
             }
@@ -76170,7 +79245,7 @@ public final class ContextOuterClass {
              * @return Whether the opticalLinkUuid field is set.
              */
             public boolean hasOpticalLinkUuid() {
-                return ((bitField0_ & 0x00000004) != 0);
+                return opticalLinkUuidBuilder_ != null || opticalLinkUuid_ != null;
             }
 
             /**
@@ -76194,11 +79269,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     opticalLinkUuid_ = value;
+                    onChanged();
                 } else {
                     opticalLinkUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -76208,11 +79282,10 @@ public final class ContextOuterClass {
             public Builder setOpticalLinkUuid(context.ContextOuterClass.OpticalLinkId.Builder builderForValue) {
                 if (opticalLinkUuidBuilder_ == null) {
                     opticalLinkUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     opticalLinkUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -76221,16 +79294,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeOpticalLinkUuid(context.ContextOuterClass.OpticalLinkId value) {
                 if (opticalLinkUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0) && opticalLinkUuid_ != null && opticalLinkUuid_ != context.ContextOuterClass.OpticalLinkId.getDefaultInstance()) {
-                        getOpticalLinkUuidBuilder().mergeFrom(value);
+                    if (opticalLinkUuid_ != null) {
+                        opticalLinkUuid_ = context.ContextOuterClass.OpticalLinkId.newBuilder(opticalLinkUuid_).mergeFrom(value).buildPartial();
                     } else {
                         opticalLinkUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     opticalLinkUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -76238,13 +79310,13 @@ public final class ContextOuterClass {
              * .context.OpticalLinkId optical_link_uuid = 3;
              */
             public Builder clearOpticalLinkUuid() {
-                bitField0_ = (bitField0_ & ~0x00000004);
-                opticalLinkUuid_ = null;
-                if (opticalLinkUuidBuilder_ != null) {
-                    opticalLinkUuidBuilder_.dispose();
+                if (opticalLinkUuidBuilder_ == null) {
+                    opticalLinkUuid_ = null;
+                    onChanged();
+                } else {
+                    opticalLinkUuid_ = null;
                     opticalLinkUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -76252,7 +79324,6 @@ public final class ContextOuterClass {
              * .context.OpticalLinkId optical_link_uuid = 3;
              */
             public context.ContextOuterClass.OpticalLinkId.Builder getOpticalLinkUuidBuilder() {
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return getOpticalLinkUuidFieldBuilder().getBuilder();
             }
@@ -76306,17 +79377,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public OpticalLink parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new OpticalLink(input, extensionRegistry);
             }
         };
 
@@ -76690,7 +79751,7 @@ public final class ContextOuterClass {
     private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
 
     static {
-        java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\tacl.proto\032\026kpi" + "_sample_types.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004" + "uuid\030\001 \001(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001" + "(\001\"Z\n\005Event\022%\n\ttimestamp\030\001 \001(\0132\022.context" + ".Timestamp\022*\n\nevent_type\030\002 \001(\0162\026.context" + ".EventTypeEnum\"0\n\tContextId\022#\n\014context_u" + "uid\030\001 \001(\0132\r.context.Uuid\"\351\001\n\007Context\022&\n\n" + "context_id\030\001 \001(\0132\022.context.ContextId\022\014\n\004" + "name\030\002 \001(\t\022)\n\014topology_ids\030\003 \003(\0132\023.conte" + "xt.TopologyId\022\'\n\013service_ids\030\004 \003(\0132\022.con" + "text.ServiceId\022#\n\tslice_ids\030\005 \003(\0132\020.cont" + "ext.SliceId\022/\n\ncontroller\030\006 \001(\0132\033.contex" + "t.TeraFlowController\"8\n\rContextIdList\022\'\n" + "\013context_ids\030\001 \003(\0132\022.context.ContextId\"1" + "\n\013ContextList\022\"\n\010contexts\030\001 \003(\0132\020.contex" + "t.Context\"U\n\014ContextEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022&\n\ncontext_id\030\002 \001(\0132\022.c" + "ontext.ContextId\"Z\n\nTopologyId\022&\n\ncontex" + "t_id\030\001 \001(\0132\022.context.ContextId\022$\n\rtopolo" + "gy_uuid\030\002 \001(\0132\r.context.Uuid\"\214\001\n\010Topolog" + "y\022(\n\013topology_id\030\001 \001(\0132\023.context.Topolog" + "yId\022\014\n\004name\030\002 \001(\t\022%\n\ndevice_ids\030\003 \003(\0132\021." + "context.DeviceId\022!\n\010link_ids\030\004 \003(\0132\017.con" + "text.LinkId\"\211\001\n\017TopologyDetails\022(\n\013topol" + "ogy_id\030\001 \001(\0132\023.context.TopologyId\022\014\n\004nam" + "e\030\002 \001(\t\022 \n\007devices\030\003 \003(\0132\017.context.Devic" + "e\022\034\n\005links\030\004 \003(\0132\r.context.Link\";\n\016Topol" + "ogyIdList\022)\n\014topology_ids\030\001 \003(\0132\023.contex" + "t.TopologyId\"5\n\014TopologyList\022%\n\ntopologi" + "es\030\001 \003(\0132\021.context.Topology\"X\n\rTopologyE" + "vent\022\035\n\005event\030\001 \001(\0132\016.context.Event\022(\n\013t" + "opology_id\030\002 \001(\0132\023.context.TopologyId\".\n" + "\010DeviceId\022\"\n\013device_uuid\030\001 \001(\0132\r.context" + ".Uuid\"\372\002\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.co" + "ntext.DeviceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_t" + "ype\030\003 \001(\t\022,\n\rdevice_config\030\004 \001(\0132\025.conte" + "xt.DeviceConfig\022G\n\031device_operational_st" + "atus\030\005 \001(\0162$.context.DeviceOperationalSt" + "atusEnum\0221\n\016device_drivers\030\006 \003(\0162\031.conte" + "xt.DeviceDriverEnum\022+\n\020device_endpoints\030" + "\007 \003(\0132\021.context.EndPoint\022&\n\ncomponents\030\010" + " \003(\0132\022.context.Component\022(\n\rcontroller_i" + "d\030\t \001(\0132\021.context.DeviceId\"\311\001\n\tComponent" + "\022%\n\016component_uuid\030\001 \001(\0132\r.context.Uuid\022" + "\014\n\004name\030\002 \001(\t\022\014\n\004type\030\003 \001(\t\0226\n\nattribute" + "s\030\004 \003(\0132\".context.Component.AttributesEn" + "try\022\016\n\006parent\030\005 \001(\t\0321\n\017AttributesEntry\022\013" + "\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"9\n\014Device" + "Config\022)\n\014config_rules\030\001 \003(\0132\023.context.C" + "onfigRule\"5\n\014DeviceIdList\022%\n\ndevice_ids\030" + "\001 \003(\0132\021.context.DeviceId\".\n\nDeviceList\022 " + "\n\007devices\030\001 \003(\0132\017.context.Device\"\216\001\n\014Dev" + "iceFilter\022)\n\ndevice_ids\030\001 \001(\0132\025.context." + "DeviceIdList\022\031\n\021include_endpoints\030\002 \001(\010\022" + "\034\n\024include_config_rules\030\003 \001(\010\022\032\n\022include" + "_components\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005eve" + "nt\030\001 \001(\0132\016.context.Event\022$\n\tdevice_id\030\002 " + "\001(\0132\021.context.DeviceId\022,\n\rdevice_config\030" + "\003 \001(\0132\025.context.DeviceConfig\"*\n\006LinkId\022 " + "\n\tlink_uuid\030\001 \001(\0132\r.context.Uuid\"I\n\016Link" + "Attributes\022\033\n\023total_capacity_gbps\030\001 \001(\002\022" + "\032\n\022used_capacity_gbps\030\002 \001(\002\"\223\001\n\004Link\022 \n\007" + "link_id\030\001 \001(\0132\017.context.LinkId\022\014\n\004name\030\002" + " \001(\t\022.\n\021link_endpoint_ids\030\003 \003(\0132\023.contex" + "t.EndPointId\022+\n\nattributes\030\004 \001(\0132\027.conte" + "xt.LinkAttributes\"/\n\nLinkIdList\022!\n\010link_" + "ids\030\001 \003(\0132\017.context.LinkId\"(\n\010LinkList\022\034" + "\n\005links\030\001 \003(\0132\r.context.Link\"L\n\tLinkEven" + "t\022\035\n\005event\030\001 \001(\0132\016.context.Event\022 \n\007link" + "_id\030\002 \001(\0132\017.context.LinkId\"X\n\tServiceId\022" + "&\n\ncontext_id\030\001 \001(\0132\022.context.ContextId\022" + "#\n\014service_uuid\030\002 \001(\0132\r.context.Uuid\"\333\002\n" + "\007Service\022&\n\nservice_id\030\001 \001(\0132\022.context.S" + "erviceId\022\014\n\004name\030\002 \001(\t\022.\n\014service_type\030\003" + " \001(\0162\030.context.ServiceTypeEnum\0221\n\024servic" + "e_endpoint_ids\030\004 \003(\0132\023.context.EndPointI" + "d\0220\n\023service_constraints\030\005 \003(\0132\023.context" + ".Constraint\022.\n\016service_status\030\006 \001(\0132\026.co" + "ntext.ServiceStatus\022.\n\016service_config\030\007 " + "\001(\0132\026.context.ServiceConfig\022%\n\ttimestamp" + "\030\010 \001(\0132\022.context.Timestamp\"C\n\rServiceSta" + "tus\0222\n\016service_status\030\001 \001(\0162\032.context.Se" + "rviceStatusEnum\":\n\rServiceConfig\022)\n\014conf" + "ig_rules\030\001 \003(\0132\023.context.ConfigRule\"8\n\rS" + "erviceIdList\022\'\n\013service_ids\030\001 \003(\0132\022.cont" + "ext.ServiceId\"1\n\013ServiceList\022\"\n\010services" + "\030\001 \003(\0132\020.context.Service\"\225\001\n\rServiceFilt" + "er\022+\n\013service_ids\030\001 \001(\0132\026.context.Servic" + "eIdList\022\034\n\024include_endpoint_ids\030\002 \001(\010\022\033\n" + "\023include_constraints\030\003 \001(\010\022\034\n\024include_co" + "nfig_rules\030\004 \001(\010\"U\n\014ServiceEvent\022\035\n\005even" + "t\030\001 \001(\0132\016.context.Event\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\"T\n\007SliceId\022&\n\nco" + "ntext_id\030\001 \001(\0132\022.context.ContextId\022!\n\nsl" + "ice_uuid\030\002 \001(\0132\r.context.Uuid\"\240\003\n\005Slice\022" + "\"\n\010slice_id\030\001 \001(\0132\020.context.SliceId\022\014\n\004n" + "ame\030\002 \001(\t\022/\n\022slice_endpoint_ids\030\003 \003(\0132\023." + "context.EndPointId\022.\n\021slice_constraints\030" + "\004 \003(\0132\023.context.Constraint\022-\n\021slice_serv" + "ice_ids\030\005 \003(\0132\022.context.ServiceId\022,\n\022sli" + "ce_subslice_ids\030\006 \003(\0132\020.context.SliceId\022" + "*\n\014slice_status\030\007 \001(\0132\024.context.SliceSta" + "tus\022*\n\014slice_config\030\010 \001(\0132\024.context.Slic" + "eConfig\022(\n\013slice_owner\030\t \001(\0132\023.context.S" + "liceOwner\022%\n\ttimestamp\030\n \001(\0132\022.context.T" + "imestamp\"E\n\nSliceOwner\022!\n\nowner_uuid\030\001 \001" + "(\0132\r.context.Uuid\022\024\n\014owner_string\030\002 \001(\t\"" + "=\n\013SliceStatus\022.\n\014slice_status\030\001 \001(\0162\030.c" + "ontext.SliceStatusEnum\"8\n\013SliceConfig\022)\n" + "\014config_rules\030\001 \003(\0132\023.context.ConfigRule" + "\"2\n\013SliceIdList\022#\n\tslice_ids\030\001 \003(\0132\020.con" + "text.SliceId\"+\n\tSliceList\022\036\n\006slices\030\001 \003(" + "\0132\016.context.Slice\"\312\001\n\013SliceFilter\022\'\n\tsli" + "ce_ids\030\001 \001(\0132\024.context.SliceIdList\022\034\n\024in" + "clude_endpoint_ids\030\002 \001(\010\022\033\n\023include_cons" + "traints\030\003 \001(\010\022\033\n\023include_service_ids\030\004 \001" + "(\010\022\034\n\024include_subslice_ids\030\005 \001(\010\022\034\n\024incl" + "ude_config_rules\030\006 \001(\010\"O\n\nSliceEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022\"\n\010slice_id\030" + "\002 \001(\0132\020.context.SliceId\"6\n\014ConnectionId\022" + "&\n\017connection_uuid\030\001 \001(\0132\r.context.Uuid\"" + "2\n\025ConnectionSettings_L0\022\031\n\021lsp_symbolic" + "_name\030\001 \001(\t\"\236\001\n\025ConnectionSettings_L2\022\027\n" + "\017src_mac_address\030\001 \001(\t\022\027\n\017dst_mac_addres" + "s\030\002 \001(\t\022\022\n\nether_type\030\003 \001(\r\022\017\n\007vlan_id\030\004" + " \001(\r\022\022\n\nmpls_label\030\005 \001(\r\022\032\n\022mpls_traffic" + "_class\030\006 \001(\r\"t\n\025ConnectionSettings_L3\022\026\n" + "\016src_ip_address\030\001 \001(\t\022\026\n\016dst_ip_address\030" + "\002 \001(\t\022\014\n\004dscp\030\003 \001(\r\022\020\n\010protocol\030\004 \001(\r\022\013\n" + "\003ttl\030\005 \001(\r\"[\n\025ConnectionSettings_L4\022\020\n\010s" + "rc_port\030\001 \001(\r\022\020\n\010dst_port\030\002 \001(\r\022\021\n\ttcp_f" + "lags\030\003 \001(\r\022\013\n\003ttl\030\004 \001(\r\"\304\001\n\022ConnectionSe" + "ttings\022*\n\002l0\030\001 \001(\0132\036.context.ConnectionS" + "ettings_L0\022*\n\002l2\030\002 \001(\0132\036.context.Connect" + "ionSettings_L2\022*\n\002l3\030\003 \001(\0132\036.context.Con" + "nectionSettings_L3\022*\n\002l4\030\004 \001(\0132\036.context" + ".ConnectionSettings_L4\"\363\001\n\nConnection\022,\n" + "\rconnection_id\030\001 \001(\0132\025.context.Connectio" + "nId\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\0223\n\026path_hops_endpoint_ids\030\003 \003(\0132\023.co" + "ntext.EndPointId\022+\n\017sub_service_ids\030\004 \003(" + "\0132\022.context.ServiceId\022-\n\010settings\030\005 \001(\0132" + "\033.context.ConnectionSettings\"A\n\020Connecti" + "onIdList\022-\n\016connection_ids\030\001 \003(\0132\025.conte" + "xt.ConnectionId\":\n\016ConnectionList\022(\n\013con" + "nections\030\001 \003(\0132\023.context.Connection\"^\n\017C" + "onnectionEvent\022\035\n\005event\030\001 \001(\0132\016.context." + "Event\022,\n\rconnection_id\030\002 \001(\0132\025.context.C" + "onnectionId\"\202\001\n\nEndPointId\022(\n\013topology_i" + "d\030\001 \001(\0132\023.context.TopologyId\022$\n\tdevice_i" + "d\030\002 \001(\0132\021.context.DeviceId\022$\n\rendpoint_u" + "uid\030\003 \001(\0132\r.context.Uuid\"\302\001\n\010EndPoint\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "\014\n\004name\030\002 \001(\t\022\025\n\rendpoint_type\030\003 \001(\t\0229\n\020" + "kpi_sample_types\030\004 \003(\0162\037.kpi_sample_type" + "s.KpiSampleType\022,\n\021endpoint_location\030\005 \001" + "(\0132\021.context.Location\"{\n\014EndPointName\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "\023\n\013device_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 " + "\001(\t\022\025\n\rendpoint_type\030\004 \001(\t\";\n\016EndPointId" + "List\022)\n\014endpoint_ids\030\001 \003(\0132\023.context.End" + "PointId\"A\n\020EndPointNameList\022-\n\016endpoint_" + "names\030\001 \003(\0132\025.context.EndPointName\"A\n\021Co" + "nfigRule_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n" + "\016resource_value\030\002 \001(\t\"]\n\016ConfigRule_ACL\022" + "(\n\013endpoint_id\030\001 \001(\0132\023.context.EndPointI" + "d\022!\n\010rule_set\030\002 \001(\0132\017.acl.AclRuleSet\"\234\001\n" + "\nConfigRule\022)\n\006action\030\001 \001(\0162\031.context.Co" + "nfigActionEnum\022,\n\006custom\030\002 \001(\0132\032.context" + ".ConfigRule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.cont" + "ext.ConfigRule_ACLH\000B\r\n\013config_rule\"F\n\021C" + "onstraint_Custom\022\027\n\017constraint_type\030\001 \001(" + "\t\022\030\n\020constraint_value\030\002 \001(\t\"E\n\023Constrain" + "t_Schedule\022\027\n\017start_timestamp\030\001 \001(\002\022\025\n\rd" + "uration_days\030\002 \001(\002\"3\n\014GPS_Position\022\020\n\010la" + "titude\030\001 \001(\002\022\021\n\tlongitude\030\002 \001(\002\"W\n\010Locat" + "ion\022\020\n\006region\030\001 \001(\tH\000\022-\n\014gps_position\030\002 " + "\001(\0132\025.context.GPS_PositionH\000B\n\n\010location" + "\"l\n\033Constraint_EndPointLocation\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022#\n\010loc" + "ation\030\002 \001(\0132\021.context.Location\"Y\n\033Constr" + "aint_EndPointPriority\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022\020\n\010priority\030\002 \001(" + "\r\"0\n\026Constraint_SLA_Latency\022\026\n\016e2e_laten" + "cy_ms\030\001 \001(\002\"0\n\027Constraint_SLA_Capacity\022\025" + "\n\rcapacity_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_" + "Availability\022\032\n\022num_disjoint_paths\030\001 \001(\r" + "\022\022\n\nall_active\030\002 \001(\010\022\024\n\014availability\030\003 \001" + "(\002\"V\n\036Constraint_SLA_Isolation_level\0224\n\017" + "isolation_level\030\001 \003(\0162\033.context.Isolatio" + "nLevelEnum\"\242\001\n\025Constraint_Exclusions\022\024\n\014" + "is_permanent\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021" + ".context.DeviceId\022)\n\014endpoint_ids\030\003 \003(\0132" + "\023.context.EndPointId\022!\n\010link_ids\030\004 \003(\0132\017" + ".context.LinkId\"\333\004\n\nConstraint\022-\n\006action" + "\030\001 \001(\0162\035.context.ConstraintActionEnum\022,\n" + "\006custom\030\002 \001(\0132\032.context.Constraint_Custo" + "mH\000\0220\n\010schedule\030\003 \001(\0132\034.context.Constrai" + "nt_ScheduleH\000\022A\n\021endpoint_location\030\004 \001(\013" + "2$.context.Constraint_EndPointLocationH\000" + "\022A\n\021endpoint_priority\030\005 \001(\0132$.context.Co" + "nstraint_EndPointPriorityH\000\0228\n\014sla_capac" + "ity\030\006 \001(\0132 .context.Constraint_SLA_Capac" + "ityH\000\0226\n\013sla_latency\030\007 \001(\0132\037.context.Con" + "straint_SLA_LatencyH\000\022@\n\020sla_availabilit" + "y\030\010 \001(\0132$.context.Constraint_SLA_Availab" + "ilityH\000\022@\n\rsla_isolation\030\t \001(\0132\'.context" + ".Constraint_SLA_Isolation_levelH\000\0224\n\nexc" + "lusions\030\n \001(\0132\036.context.Constraint_Exclu" + "sionsH\000B\014\n\nconstraint\"^\n\022TeraFlowControl" + "ler\022&\n\ncontext_id\030\001 \001(\0132\022.context.Contex" + "tId\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n" + "\024AuthenticationResult\022&\n\ncontext_id\030\001 \001(" + "\0132\022.context.ContextId\022\025\n\rauthenticated\030\002" + " \001(\010\"-\n\017OpticalConfigId\022\032\n\022opticalconfig" + "_uuid\030\001 \001(\t\"S\n\rOpticalConfig\0222\n\020opticalc" + "onfig_id\030\001 \001(\0132\030.context.OpticalConfigId" + "\022\016\n\006config\030\002 \001(\t\"C\n\021OpticalConfigList\022.\n" + "\016opticalconfigs\030\001 \003(\0132\026.context.OpticalC" + "onfig\"9\n\rOpticalLinkId\022(\n\021optical_link_u" + "uid\030\001 \001(\0132\r.context.Uuid\",\n\007FiberId\022!\n\nf" + "iber_uuid\030\001 \001(\0132\r.context.Uuid\"\341\001\n\005Fiber" + "\022\n\n\002ID\030\n \001(\t\022\020\n\010src_port\030\001 \001(\t\022\020\n\010dst_po" + "rt\030\002 \001(\t\022\027\n\017local_peer_port\030\003 \001(\t\022\030\n\020rem" + "ote_peer_port\030\004 \001(\t\022\017\n\007c_slots\030\005 \003(\005\022\017\n\007" + "l_slots\030\006 \003(\005\022\017\n\007s_slots\030\007 \003(\005\022\016\n\006length" + "\030\010 \001(\002\022\014\n\004used\030\t \001(\010\022$\n\nfiber_uuid\030\013 \001(\013" + "2\020.context.FiberId\"d\n\022OpticalLinkDetails" + "\022\016\n\006length\030\001 \001(\002\022\016\n\006source\030\002 \001(\t\022\016\n\006targ" + "et\030\003 \001(\t\022\036\n\006fibers\030\004 \003(\0132\016.context.Fiber" + "\"|\n\013OpticalLink\022\014\n\004name\030\001 \001(\t\022,\n\007details" + "\030\002 \001(\0132\033.context.OpticalLinkDetails\0221\n\021o" + "ptical_link_uuid\030\003 \001(\0132\026.context.Optical" + "LinkId*j\n\rEventTypeEnum\022\027\n\023EVENTTYPE_UND" + "EFINED\020\000\022\024\n\020EVENTTYPE_CREATE\020\001\022\024\n\020EVENTT" + "YPE_UPDATE\020\002\022\024\n\020EVENTTYPE_REMOVE\020\003*\346\002\n\020D" + "eviceDriverEnum\022\032\n\026DEVICEDRIVER_UNDEFINE" + "D\020\000\022\033\n\027DEVICEDRIVER_OPENCONFIG\020\001\022\036\n\032DEVI" + "CEDRIVER_TRANSPORT_API\020\002\022\023\n\017DEVICEDRIVER" + "_P4\020\003\022&\n\"DEVICEDRIVER_IETF_NETWORK_TOPOL" + "OGY\020\004\022\033\n\027DEVICEDRIVER_ONF_TR_532\020\005\022\023\n\017DE" + "VICEDRIVER_XR\020\006\022\033\n\027DEVICEDRIVER_IETF_L2V" + "PN\020\007\022 \n\034DEVICEDRIVER_GNMI_OPENCONFIG\020\010\022\032" + "\n\026DEVICEDRIVER_FLEXSCALE\020\t\022\032\n\026DEVICEDRIV" + "ER_IETF_ACTN\020\n\022\023\n\017DEVICEDRIVER_OC\020\013*\217\001\n\033" + "DeviceOperationalStatusEnum\022%\n!DEVICEOPE" + "RATIONALSTATUS_UNDEFINED\020\000\022$\n DEVICEOPER" + "ATIONALSTATUS_DISABLED\020\001\022#\n\037DEVICEOPERAT" + "IONALSTATUS_ENABLED\020\002*\320\001\n\017ServiceTypeEnu" + "m\022\027\n\023SERVICETYPE_UNKNOWN\020\000\022\024\n\020SERVICETYP" + "E_L3NM\020\001\022\024\n\020SERVICETYPE_L2NM\020\002\022)\n%SERVIC" + "ETYPE_TAPI_CONNECTIVITY_SERVICE\020\003\022\022\n\016SER" + "VICETYPE_TE\020\004\022\023\n\017SERVICETYPE_E2E\020\005\022$\n SE" + "RVICETYPE_OPTICAL_CONNECTIVITY\020\006*\304\001\n\021Ser" + "viceStatusEnum\022\033\n\027SERVICESTATUS_UNDEFINE" + "D\020\000\022\031\n\025SERVICESTATUS_PLANNED\020\001\022\030\n\024SERVIC" + "ESTATUS_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UPDATI" + "NG\020\003\022!\n\035SERVICESTATUS_PENDING_REMOVAL\020\004\022" + "\036\n\032SERVICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017Slic" + "eStatusEnum\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027" + "\n\023SLICESTATUS_PLANNED\020\001\022\024\n\020SLICESTATUS_I" + "NIT\020\002\022\026\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLICEST" + "ATUS_DEINIT\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATE" + "D\020\005*]\n\020ConfigActionEnum\022\032\n\026CONFIGACTION_" + "UNDEFINED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CON" + "FIGACTION_DELETE\020\002*m\n\024ConstraintActionEn" + "um\022\036\n\032CONSTRAINTACTION_UNDEFINED\020\000\022\030\n\024CO" + "NSTRAINTACTION_SET\020\001\022\033\n\027CONSTRAINTACTION" + "_DELETE\020\002*\203\002\n\022IsolationLevelEnum\022\020\n\014NO_I" + "SOLATION\020\000\022\026\n\022PHYSICAL_ISOLATION\020\001\022\025\n\021LO" + "GICAL_ISOLATION\020\002\022\025\n\021PROCESS_ISOLATION\020\003" + "\022\035\n\031PHYSICAL_MEMORY_ISOLATION\020\004\022\036\n\032PHYSI" + "CAL_NETWORK_ISOLATION\020\005\022\036\n\032VIRTUAL_RESOU" + "RCE_ISOLATION\020\006\022\037\n\033NETWORK_FUNCTIONS_ISO" + "LATION\020\007\022\025\n\021SERVICE_ISOLATION\020\0102\246\031\n\016Cont" + "extService\022:\n\016ListContextIds\022\016.context.E" + "mpty\032\026.context.ContextIdList\"\000\0226\n\014ListCo" + "ntexts\022\016.context.Empty\032\024.context.Context" + "List\"\000\0224\n\nGetContext\022\022.context.ContextId" + "\032\020.context.Context\"\000\0224\n\nSetContext\022\020.con" + "text.Context\032\022.context.ContextId\"\000\0225\n\rRe" + "moveContext\022\022.context.ContextId\032\016.contex" + "t.Empty\"\000\022=\n\020GetContextEvents\022\016.context." + "Empty\032\025.context.ContextEvent\"\0000\001\022@\n\017List" + "TopologyIds\022\022.context.ContextId\032\027.contex" + "t.TopologyIdList\"\000\022=\n\016ListTopologies\022\022.c" + "ontext.ContextId\032\025.context.TopologyList\"" + "\000\0227\n\013GetTopology\022\023.context.TopologyId\032\021." + "context.Topology\"\000\022E\n\022GetTopologyDetails" + "\022\023.context.TopologyId\032\030.context.Topology" + "Details\"\000\0227\n\013SetTopology\022\021.context.Topol" + "ogy\032\023.context.TopologyId\"\000\0227\n\016RemoveTopo" + "logy\022\023.context.TopologyId\032\016.context.Empt" + "y\"\000\022?\n\021GetTopologyEvents\022\016.context.Empty" + "\032\026.context.TopologyEvent\"\0000\001\0228\n\rListDevi" + "ceIds\022\016.context.Empty\032\025.context.DeviceId" + "List\"\000\0224\n\013ListDevices\022\016.context.Empty\032\023." + "context.DeviceList\"\000\0221\n\tGetDevice\022\021.cont" + "ext.DeviceId\032\017.context.Device\"\000\0221\n\tSetDe" + "vice\022\017.context.Device\032\021.context.DeviceId" + "\"\000\0223\n\014RemoveDevice\022\021.context.DeviceId\032\016." + "context.Empty\"\000\022;\n\017GetDeviceEvents\022\016.con" + "text.Empty\032\024.context.DeviceEvent\"\0000\001\022<\n\014" + "SelectDevice\022\025.context.DeviceFilter\032\023.co" + "ntext.DeviceList\"\000\022I\n\021ListEndPointNames\022" + "\027.context.EndPointIdList\032\031.context.EndPo" + "intNameList\"\000\0224\n\013ListLinkIds\022\016.context.E" + "mpty\032\023.context.LinkIdList\"\000\0220\n\tListLinks" + "\022\016.context.Empty\032\021.context.LinkList\"\000\022+\n" + "\007GetLink\022\017.context.LinkId\032\r.context.Link" + "\"\000\022+\n\007SetLink\022\r.context.Link\032\017.context.L" + "inkId\"\000\022/\n\nRemoveLink\022\017.context.LinkId\032\016" + ".context.Empty\"\000\0227\n\rGetLinkEvents\022\016.cont" + "ext.Empty\032\022.context.LinkEvent\"\0000\001\022>\n\016Lis" + "tServiceIds\022\022.context.ContextId\032\026.contex" + "t.ServiceIdList\"\000\022:\n\014ListServices\022\022.cont" + "ext.ContextId\032\024.context.ServiceList\"\000\0224\n" + "\nGetService\022\022.context.ServiceId\032\020.contex" + "t.Service\"\000\0224\n\nSetService\022\020.context.Serv" + "ice\032\022.context.ServiceId\"\000\0226\n\014UnsetServic" + "e\022\020.context.Service\032\022.context.ServiceId\"" + "\000\0225\n\rRemoveService\022\022.context.ServiceId\032\016" + ".context.Empty\"\000\022=\n\020GetServiceEvents\022\016.c" + "ontext.Empty\032\025.context.ServiceEvent\"\0000\001\022" + "?\n\rSelectService\022\026.context.ServiceFilter" + "\032\024.context.ServiceList\"\000\022:\n\014ListSliceIds" + "\022\022.context.ContextId\032\024.context.SliceIdLi" + "st\"\000\0226\n\nListSlices\022\022.context.ContextId\032\022" + ".context.SliceList\"\000\022.\n\010GetSlice\022\020.conte" + "xt.SliceId\032\016.context.Slice\"\000\022.\n\010SetSlice" + "\022\016.context.Slice\032\020.context.SliceId\"\000\0220\n\n" + "UnsetSlice\022\016.context.Slice\032\020.context.Sli" + "ceId\"\000\0221\n\013RemoveSlice\022\020.context.SliceId\032" + "\016.context.Empty\"\000\0229\n\016GetSliceEvents\022\016.co" + "ntext.Empty\032\023.context.SliceEvent\"\0000\001\0229\n\013" + "SelectSlice\022\024.context.SliceFilter\032\022.cont" + "ext.SliceList\"\000\022D\n\021ListConnectionIds\022\022.c" + "ontext.ServiceId\032\031.context.ConnectionIdL" + "ist\"\000\022@\n\017ListConnections\022\022.context.Servi" + "ceId\032\027.context.ConnectionList\"\000\022=\n\rGetCo" + "nnection\022\025.context.ConnectionId\032\023.contex" + "t.Connection\"\000\022=\n\rSetConnection\022\023.contex" + "t.Connection\032\025.context.ConnectionId\"\000\022;\n" + "\020RemoveConnection\022\025.context.ConnectionId" + "\032\016.context.Empty\"\000\022C\n\023GetConnectionEvent" + "s\022\016.context.Empty\032\030.context.ConnectionEv" + "ent\"\0000\001\022@\n\020GetOpticalConfig\022\016.context.Em" + "pty\032\032.context.OpticalConfigList\"\000\022F\n\020Set" + "OpticalConfig\022\026.context.OpticalConfig\032\030." + "context.OpticalConfigId\"\000\022I\n\023SelectOptic" + "alConfig\022\030.context.OpticalConfigId\032\026.con" + "text.OpticalConfig\"\000\0228\n\016SetOpticalLink\022\024" + ".context.OpticalLink\032\016.context.Empty\"\000\022@" + "\n\016GetOpticalLink\022\026.context.OpticalLinkId" + "\032\024.context.OpticalLink\"\000\022.\n\010GetFiber\022\020.c" + "ontext.FiberId\032\016.context.Fiber\"\000b\006proto3" };
+        java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\tacl.proto\032\026kpi" + "_sample_types.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004" + "uuid\030\001 \001(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001" + "(\001\"Z\n\005Event\022%\n\ttimestamp\030\001 \001(\0132\022.context" + ".Timestamp\022*\n\nevent_type\030\002 \001(\0162\026.context" + ".EventTypeEnum\"0\n\tContextId\022#\n\014context_u" + "uid\030\001 \001(\0132\r.context.Uuid\"\351\001\n\007Context\022&\n\n" + "context_id\030\001 \001(\0132\022.context.ContextId\022\014\n\004" + "name\030\002 \001(\t\022)\n\014topology_ids\030\003 \003(\0132\023.conte" + "xt.TopologyId\022\'\n\013service_ids\030\004 \003(\0132\022.con" + "text.ServiceId\022#\n\tslice_ids\030\005 \003(\0132\020.cont" + "ext.SliceId\022/\n\ncontroller\030\006 \001(\0132\033.contex" + "t.TeraFlowController\"8\n\rContextIdList\022\'\n" + "\013context_ids\030\001 \003(\0132\022.context.ContextId\"1" + "\n\013ContextList\022\"\n\010contexts\030\001 \003(\0132\020.contex" + "t.Context\"U\n\014ContextEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022&\n\ncontext_id\030\002 \001(\0132\022.c" + "ontext.ContextId\"Z\n\nTopologyId\022&\n\ncontex" + "t_id\030\001 \001(\0132\022.context.ContextId\022$\n\rtopolo" + "gy_uuid\030\002 \001(\0132\r.context.Uuid\"\214\001\n\010Topolog" + "y\022(\n\013topology_id\030\001 \001(\0132\023.context.Topolog" + "yId\022\014\n\004name\030\002 \001(\t\022%\n\ndevice_ids\030\003 \003(\0132\021." + "context.DeviceId\022!\n\010link_ids\030\004 \003(\0132\017.con" + "text.LinkId\"\211\001\n\017TopologyDetails\022(\n\013topol" + "ogy_id\030\001 \001(\0132\023.context.TopologyId\022\014\n\004nam" + "e\030\002 \001(\t\022 \n\007devices\030\003 \003(\0132\017.context.Devic" + "e\022\034\n\005links\030\004 \003(\0132\r.context.Link\";\n\016Topol" + "ogyIdList\022)\n\014topology_ids\030\001 \003(\0132\023.contex" + "t.TopologyId\"5\n\014TopologyList\022%\n\ntopologi" + "es\030\001 \003(\0132\021.context.Topology\"X\n\rTopologyE" + "vent\022\035\n\005event\030\001 \001(\0132\016.context.Event\022(\n\013t" + "opology_id\030\002 \001(\0132\023.context.TopologyId\".\n" + "\010DeviceId\022\"\n\013device_uuid\030\001 \001(\0132\r.context" + ".Uuid\"\372\002\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.co" + "ntext.DeviceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_t" + "ype\030\003 \001(\t\022,\n\rdevice_config\030\004 \001(\0132\025.conte" + "xt.DeviceConfig\022G\n\031device_operational_st" + "atus\030\005 \001(\0162$.context.DeviceOperationalSt" + "atusEnum\0221\n\016device_drivers\030\006 \003(\0162\031.conte" + "xt.DeviceDriverEnum\022+\n\020device_endpoints\030" + "\007 \003(\0132\021.context.EndPoint\022&\n\ncomponents\030\010" + " \003(\0132\022.context.Component\022(\n\rcontroller_i" + "d\030\t \001(\0132\021.context.DeviceId\"\311\001\n\tComponent" + "\022%\n\016component_uuid\030\001 \001(\0132\r.context.Uuid\022" + "\014\n\004name\030\002 \001(\t\022\014\n\004type\030\003 \001(\t\0226\n\nattribute" + "s\030\004 \003(\0132\".context.Component.AttributesEn" + "try\022\016\n\006parent\030\005 \001(\t\0321\n\017AttributesEntry\022\013" + "\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"9\n\014Device" + "Config\022)\n\014config_rules\030\001 \003(\0132\023.context.C" + "onfigRule\"5\n\014DeviceIdList\022%\n\ndevice_ids\030" + "\001 \003(\0132\021.context.DeviceId\".\n\nDeviceList\022 " + "\n\007devices\030\001 \003(\0132\017.context.Device\"\216\001\n\014Dev" + "iceFilter\022)\n\ndevice_ids\030\001 \001(\0132\025.context." + "DeviceIdList\022\031\n\021include_endpoints\030\002 \001(\010\022" + "\034\n\024include_config_rules\030\003 \001(\010\022\032\n\022include" + "_components\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005eve" + "nt\030\001 \001(\0132\016.context.Event\022$\n\tdevice_id\030\002 " + "\001(\0132\021.context.DeviceId\022,\n\rdevice_config\030" + "\003 \001(\0132\025.context.DeviceConfig\"*\n\006LinkId\022 " + "\n\tlink_uuid\030\001 \001(\0132\r.context.Uuid\"I\n\016Link" + "Attributes\022\033\n\023total_capacity_gbps\030\001 \001(\002\022" + "\032\n\022used_capacity_gbps\030\002 \001(\002\"\223\001\n\004Link\022 \n\007" + "link_id\030\001 \001(\0132\017.context.LinkId\022\014\n\004name\030\002" + " \001(\t\022.\n\021link_endpoint_ids\030\003 \003(\0132\023.contex" + "t.EndPointId\022+\n\nattributes\030\004 \001(\0132\027.conte" + "xt.LinkAttributes\"/\n\nLinkIdList\022!\n\010link_" + "ids\030\001 \003(\0132\017.context.LinkId\"(\n\010LinkList\022\034" + "\n\005links\030\001 \003(\0132\r.context.Link\"L\n\tLinkEven" + "t\022\035\n\005event\030\001 \001(\0132\016.context.Event\022 \n\007link" + "_id\030\002 \001(\0132\017.context.LinkId\"X\n\tServiceId\022" + "&\n\ncontext_id\030\001 \001(\0132\022.context.ContextId\022" + "#\n\014service_uuid\030\002 \001(\0132\r.context.Uuid\"\333\002\n" + "\007Service\022&\n\nservice_id\030\001 \001(\0132\022.context.S" + "erviceId\022\014\n\004name\030\002 \001(\t\022.\n\014service_type\030\003" + " \001(\0162\030.context.ServiceTypeEnum\0221\n\024servic" + "e_endpoint_ids\030\004 \003(\0132\023.context.EndPointI" + "d\0220\n\023service_constraints\030\005 \003(\0132\023.context" + ".Constraint\022.\n\016service_status\030\006 \001(\0132\026.co" + "ntext.ServiceStatus\022.\n\016service_config\030\007 " + "\001(\0132\026.context.ServiceConfig\022%\n\ttimestamp" + "\030\010 \001(\0132\022.context.Timestamp\"C\n\rServiceSta" + "tus\0222\n\016service_status\030\001 \001(\0162\032.context.Se" + "rviceStatusEnum\":\n\rServiceConfig\022)\n\014conf" + "ig_rules\030\001 \003(\0132\023.context.ConfigRule\"8\n\rS" + "erviceIdList\022\'\n\013service_ids\030\001 \003(\0132\022.cont" + "ext.ServiceId\"1\n\013ServiceList\022\"\n\010services" + "\030\001 \003(\0132\020.context.Service\"\225\001\n\rServiceFilt" + "er\022+\n\013service_ids\030\001 \001(\0132\026.context.Servic" + "eIdList\022\034\n\024include_endpoint_ids\030\002 \001(\010\022\033\n" + "\023include_constraints\030\003 \001(\010\022\034\n\024include_co" + "nfig_rules\030\004 \001(\010\"U\n\014ServiceEvent\022\035\n\005even" + "t\030\001 \001(\0132\016.context.Event\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\"T\n\007SliceId\022&\n\nco" + "ntext_id\030\001 \001(\0132\022.context.ContextId\022!\n\nsl" + "ice_uuid\030\002 \001(\0132\r.context.Uuid\"\240\003\n\005Slice\022" + "\"\n\010slice_id\030\001 \001(\0132\020.context.SliceId\022\014\n\004n" + "ame\030\002 \001(\t\022/\n\022slice_endpoint_ids\030\003 \003(\0132\023." + "context.EndPointId\022.\n\021slice_constraints\030" + "\004 \003(\0132\023.context.Constraint\022-\n\021slice_serv" + "ice_ids\030\005 \003(\0132\022.context.ServiceId\022,\n\022sli" + "ce_subslice_ids\030\006 \003(\0132\020.context.SliceId\022" + "*\n\014slice_status\030\007 \001(\0132\024.context.SliceSta" + "tus\022*\n\014slice_config\030\010 \001(\0132\024.context.Slic" + "eConfig\022(\n\013slice_owner\030\t \001(\0132\023.context.S" + "liceOwner\022%\n\ttimestamp\030\n \001(\0132\022.context.T" + "imestamp\"E\n\nSliceOwner\022!\n\nowner_uuid\030\001 \001" + "(\0132\r.context.Uuid\022\024\n\014owner_string\030\002 \001(\t\"" + "=\n\013SliceStatus\022.\n\014slice_status\030\001 \001(\0162\030.c" + "ontext.SliceStatusEnum\"8\n\013SliceConfig\022)\n" + "\014config_rules\030\001 \003(\0132\023.context.ConfigRule" + "\"2\n\013SliceIdList\022#\n\tslice_ids\030\001 \003(\0132\020.con" + "text.SliceId\"+\n\tSliceList\022\036\n\006slices\030\001 \003(" + "\0132\016.context.Slice\"\312\001\n\013SliceFilter\022\'\n\tsli" + "ce_ids\030\001 \001(\0132\024.context.SliceIdList\022\034\n\024in" + "clude_endpoint_ids\030\002 \001(\010\022\033\n\023include_cons" + "traints\030\003 \001(\010\022\033\n\023include_service_ids\030\004 \001" + "(\010\022\034\n\024include_subslice_ids\030\005 \001(\010\022\034\n\024incl" + "ude_config_rules\030\006 \001(\010\"O\n\nSliceEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022\"\n\010slice_id\030" + "\002 \001(\0132\020.context.SliceId\"6\n\014ConnectionId\022" + "&\n\017connection_uuid\030\001 \001(\0132\r.context.Uuid\"" + "2\n\025ConnectionSettings_L0\022\031\n\021lsp_symbolic" + "_name\030\001 \001(\t\"\236\001\n\025ConnectionSettings_L2\022\027\n" + "\017src_mac_address\030\001 \001(\t\022\027\n\017dst_mac_addres" + "s\030\002 \001(\t\022\022\n\nether_type\030\003 \001(\r\022\017\n\007vlan_id\030\004" + " \001(\r\022\022\n\nmpls_label\030\005 \001(\r\022\032\n\022mpls_traffic" + "_class\030\006 \001(\r\"t\n\025ConnectionSettings_L3\022\026\n" + "\016src_ip_address\030\001 \001(\t\022\026\n\016dst_ip_address\030" + "\002 \001(\t\022\014\n\004dscp\030\003 \001(\r\022\020\n\010protocol\030\004 \001(\r\022\013\n" + "\003ttl\030\005 \001(\r\"[\n\025ConnectionSettings_L4\022\020\n\010s" + "rc_port\030\001 \001(\r\022\020\n\010dst_port\030\002 \001(\r\022\021\n\ttcp_f" + "lags\030\003 \001(\r\022\013\n\003ttl\030\004 \001(\r\"\304\001\n\022ConnectionSe" + "ttings\022*\n\002l0\030\001 \001(\0132\036.context.ConnectionS" + "ettings_L0\022*\n\002l2\030\002 \001(\0132\036.context.Connect" + "ionSettings_L2\022*\n\002l3\030\003 \001(\0132\036.context.Con" + "nectionSettings_L3\022*\n\002l4\030\004 \001(\0132\036.context" + ".ConnectionSettings_L4\"\363\001\n\nConnection\022,\n" + "\rconnection_id\030\001 \001(\0132\025.context.Connectio" + "nId\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\0223\n\026path_hops_endpoint_ids\030\003 \003(\0132\023.co" + "ntext.EndPointId\022+\n\017sub_service_ids\030\004 \003(" + "\0132\022.context.ServiceId\022-\n\010settings\030\005 \001(\0132" + "\033.context.ConnectionSettings\"A\n\020Connecti" + "onIdList\022-\n\016connection_ids\030\001 \003(\0132\025.conte" + "xt.ConnectionId\":\n\016ConnectionList\022(\n\013con" + "nections\030\001 \003(\0132\023.context.Connection\"^\n\017C" + "onnectionEvent\022\035\n\005event\030\001 \001(\0132\016.context." + "Event\022,\n\rconnection_id\030\002 \001(\0132\025.context.C" + "onnectionId\"\202\001\n\nEndPointId\022(\n\013topology_i" + "d\030\001 \001(\0132\023.context.TopologyId\022$\n\tdevice_i" + "d\030\002 \001(\0132\021.context.DeviceId\022$\n\rendpoint_u" + "uid\030\003 \001(\0132\r.context.Uuid\"\302\001\n\010EndPoint\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "\014\n\004name\030\002 \001(\t\022\025\n\rendpoint_type\030\003 \001(\t\0229\n\020" + "kpi_sample_types\030\004 \003(\0162\037.kpi_sample_type" + "s.KpiSampleType\022,\n\021endpoint_location\030\005 \001" + "(\0132\021.context.Location\"{\n\014EndPointName\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "\023\n\013device_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 " + "\001(\t\022\025\n\rendpoint_type\030\004 \001(\t\";\n\016EndPointId" + "List\022)\n\014endpoint_ids\030\001 \003(\0132\023.context.End" + "PointId\"A\n\020EndPointNameList\022-\n\016endpoint_" + "names\030\001 \003(\0132\025.context.EndPointName\"A\n\021Co" + "nfigRule_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n" + "\016resource_value\030\002 \001(\t\"]\n\016ConfigRule_ACL\022" + "(\n\013endpoint_id\030\001 \001(\0132\023.context.EndPointI" + "d\022!\n\010rule_set\030\002 \001(\0132\017.acl.AclRuleSet\"\234\001\n" + "\nConfigRule\022)\n\006action\030\001 \001(\0162\031.context.Co" + "nfigActionEnum\022,\n\006custom\030\002 \001(\0132\032.context" + ".ConfigRule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.cont" + "ext.ConfigRule_ACLH\000B\r\n\013config_rule\"F\n\021C" + "onstraint_Custom\022\027\n\017constraint_type\030\001 \001(" + "\t\022\030\n\020constraint_value\030\002 \001(\t\"E\n\023Constrain" + "t_Schedule\022\027\n\017start_timestamp\030\001 \001(\002\022\025\n\rd" + "uration_days\030\002 \001(\002\"3\n\014GPS_Position\022\020\n\010la" + "titude\030\001 \001(\002\022\021\n\tlongitude\030\002 \001(\002\"W\n\010Locat" + "ion\022\020\n\006region\030\001 \001(\tH\000\022-\n\014gps_position\030\002 " + "\001(\0132\025.context.GPS_PositionH\000B\n\n\010location" + "\"l\n\033Constraint_EndPointLocation\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022#\n\010loc" + "ation\030\002 \001(\0132\021.context.Location\"Y\n\033Constr" + "aint_EndPointPriority\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022\020\n\010priority\030\002 \001(" + "\r\"0\n\026Constraint_SLA_Latency\022\026\n\016e2e_laten" + "cy_ms\030\001 \001(\002\"0\n\027Constraint_SLA_Capacity\022\025" + "\n\rcapacity_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_" + "Availability\022\032\n\022num_disjoint_paths\030\001 \001(\r" + "\022\022\n\nall_active\030\002 \001(\010\022\024\n\014availability\030\003 \001" + "(\002\"V\n\036Constraint_SLA_Isolation_level\0224\n\017" + "isolation_level\030\001 \003(\0162\033.context.Isolatio" + "nLevelEnum\"\242\001\n\025Constraint_Exclusions\022\024\n\014" + "is_permanent\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021" + ".context.DeviceId\022)\n\014endpoint_ids\030\003 \003(\0132" + "\023.context.EndPointId\022!\n\010link_ids\030\004 \003(\0132\017" + ".context.LinkId\"\333\004\n\nConstraint\022-\n\006action" + "\030\001 \001(\0162\035.context.ConstraintActionEnum\022,\n" + "\006custom\030\002 \001(\0132\032.context.Constraint_Custo" + "mH\000\0220\n\010schedule\030\003 \001(\0132\034.context.Constrai" + "nt_ScheduleH\000\022A\n\021endpoint_location\030\004 \001(\013" + "2$.context.Constraint_EndPointLocationH\000" + "\022A\n\021endpoint_priority\030\005 \001(\0132$.context.Co" + "nstraint_EndPointPriorityH\000\0228\n\014sla_capac" + "ity\030\006 \001(\0132 .context.Constraint_SLA_Capac" + "ityH\000\0226\n\013sla_latency\030\007 \001(\0132\037.context.Con" + "straint_SLA_LatencyH\000\022@\n\020sla_availabilit" + "y\030\010 \001(\0132$.context.Constraint_SLA_Availab" + "ilityH\000\022@\n\rsla_isolation\030\t \001(\0132\'.context" + ".Constraint_SLA_Isolation_levelH\000\0224\n\nexc" + "lusions\030\n \001(\0132\036.context.Constraint_Exclu" + "sionsH\000B\014\n\nconstraint\"^\n\022TeraFlowControl" + "ler\022&\n\ncontext_id\030\001 \001(\0132\022.context.Contex" + "tId\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n" + "\024AuthenticationResult\022&\n\ncontext_id\030\001 \001(" + "\0132\022.context.ContextId\022\025\n\rauthenticated\030\002" + " \001(\010\"-\n\017OpticalConfigId\022\032\n\022opticalconfig" + "_uuid\030\001 \001(\t\"S\n\rOpticalConfig\0222\n\020opticalc" + "onfig_id\030\001 \001(\0132\030.context.OpticalConfigId" + "\022\016\n\006config\030\002 \001(\t\"C\n\021OpticalConfigList\022.\n" + "\016opticalconfigs\030\001 \003(\0132\026.context.OpticalC" + "onfig\"9\n\rOpticalLinkId\022(\n\021optical_link_u" + "uid\030\001 \001(\0132\r.context.Uuid\",\n\007FiberId\022!\n\nf" + "iber_uuid\030\001 \001(\0132\r.context.Uuid\"\341\001\n\005Fiber" + "\022\n\n\002ID\030\n \001(\t\022\020\n\010src_port\030\001 \001(\t\022\020\n\010dst_po" + "rt\030\002 \001(\t\022\027\n\017local_peer_port\030\003 \001(\t\022\030\n\020rem" + "ote_peer_port\030\004 \001(\t\022\017\n\007c_slots\030\005 \003(\005\022\017\n\007" + "l_slots\030\006 \003(\005\022\017\n\007s_slots\030\007 \003(\005\022\016\n\006length" + "\030\010 \001(\002\022\014\n\004used\030\t \001(\010\022$\n\nfiber_uuid\030\013 \001(\013" + "2\020.context.FiberId\"d\n\022OpticalLinkDetails" + "\022\016\n\006length\030\001 \001(\002\022\016\n\006source\030\002 \001(\t\022\016\n\006targ" + "et\030\003 \001(\t\022\036\n\006fibers\030\004 \003(\0132\016.context.Fiber" + "\"|\n\013OpticalLink\022\014\n\004name\030\001 \001(\t\022,\n\007details" + "\030\002 \001(\0132\033.context.OpticalLinkDetails\0221\n\021o" + "ptical_link_uuid\030\003 \001(\0132\026.context.Optical" + "LinkId*j\n\rEventTypeEnum\022\027\n\023EVENTTYPE_UND" + "EFINED\020\000\022\024\n\020EVENTTYPE_CREATE\020\001\022\024\n\020EVENTT" + "YPE_UPDATE\020\002\022\024\n\020EVENTTYPE_REMOVE\020\003*\350\002\n\020D" + "eviceDriverEnum\022\032\n\026DEVICEDRIVER_UNDEFINE" + "D\020\000\022\033\n\027DEVICEDRIVER_OPENCONFIG\020\001\022\036\n\032DEVI" + "CEDRIVER_TRANSPORT_API\020\002\022\023\n\017DEVICEDRIVER" + "_P4\020\003\022&\n\"DEVICEDRIVER_IETF_NETWORK_TOPOL" + "OGY\020\004\022\033\n\027DEVICEDRIVER_ONF_TR_532\020\005\022\023\n\017DE" + "VICEDRIVER_XR\020\006\022\033\n\027DEVICEDRIVER_IETF_L2V" + "PN\020\007\022 \n\034DEVICEDRIVER_GNMI_OPENCONFIG\020\010\022\034" + "\n\030DEVICEDRIVER_OPTICAL_TFS\020\t\022\032\n\026DEVICEDR" + "IVER_IETF_ACTN\020\n\022\023\n\017DEVICEDRIVER_OC\020\013*\217\001" + "\n\033DeviceOperationalStatusEnum\022%\n!DEVICEO" + "PERATIONALSTATUS_UNDEFINED\020\000\022$\n DEVICEOP" + "ERATIONALSTATUS_DISABLED\020\001\022#\n\037DEVICEOPER" + "ATIONALSTATUS_ENABLED\020\002*\320\001\n\017ServiceTypeE" + "num\022\027\n\023SERVICETYPE_UNKNOWN\020\000\022\024\n\020SERVICET" + "YPE_L3NM\020\001\022\024\n\020SERVICETYPE_L2NM\020\002\022)\n%SERV" + "ICETYPE_TAPI_CONNECTIVITY_SERVICE\020\003\022\022\n\016S" + "ERVICETYPE_TE\020\004\022\023\n\017SERVICETYPE_E2E\020\005\022$\n " + "SERVICETYPE_OPTICAL_CONNECTIVITY\020\006*\304\001\n\021S" + "erviceStatusEnum\022\033\n\027SERVICESTATUS_UNDEFI" + "NED\020\000\022\031\n\025SERVICESTATUS_PLANNED\020\001\022\030\n\024SERV" + "ICESTATUS_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UPDA" + "TING\020\003\022!\n\035SERVICESTATUS_PENDING_REMOVAL\020" + "\004\022\036\n\032SERVICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017Sl" + "iceStatusEnum\022\031\n\025SLICESTATUS_UNDEFINED\020\000" + "\022\027\n\023SLICESTATUS_PLANNED\020\001\022\024\n\020SLICESTATUS" + "_INIT\020\002\022\026\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLICE" + "STATUS_DEINIT\020\004\022\034\n\030SLICESTATUS_SLA_VIOLA" + "TED\020\005*]\n\020ConfigActionEnum\022\032\n\026CONFIGACTIO" + "N_UNDEFINED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023C" + "ONFIGACTION_DELETE\020\002*m\n\024ConstraintAction" + "Enum\022\036\n\032CONSTRAINTACTION_UNDEFINED\020\000\022\030\n\024" + "CONSTRAINTACTION_SET\020\001\022\033\n\027CONSTRAINTACTI" + "ON_DELETE\020\002*\203\002\n\022IsolationLevelEnum\022\020\n\014NO" + "_ISOLATION\020\000\022\026\n\022PHYSICAL_ISOLATION\020\001\022\025\n\021" + "LOGICAL_ISOLATION\020\002\022\025\n\021PROCESS_ISOLATION" + "\020\003\022\035\n\031PHYSICAL_MEMORY_ISOLATION\020\004\022\036\n\032PHY" + "SICAL_NETWORK_ISOLATION\020\005\022\036\n\032VIRTUAL_RES" + "OURCE_ISOLATION\020\006\022\037\n\033NETWORK_FUNCTIONS_I" + "SOLATION\020\007\022\025\n\021SERVICE_ISOLATION\020\0102\246\031\n\016Co" + "ntextService\022:\n\016ListContextIds\022\016.context" + ".Empty\032\026.context.ContextIdList\"\000\0226\n\014List" + "Contexts\022\016.context.Empty\032\024.context.Conte" + "xtList\"\000\0224\n\nGetContext\022\022.context.Context" + "Id\032\020.context.Context\"\000\0224\n\nSetContext\022\020.c" + "ontext.Context\032\022.context.ContextId\"\000\0225\n\r" + "RemoveContext\022\022.context.ContextId\032\016.cont" + "ext.Empty\"\000\022=\n\020GetContextEvents\022\016.contex" + "t.Empty\032\025.context.ContextEvent\"\0000\001\022@\n\017Li" + "stTopologyIds\022\022.context.ContextId\032\027.cont" + "ext.TopologyIdList\"\000\022=\n\016ListTopologies\022\022" + ".context.ContextId\032\025.context.TopologyLis" + "t\"\000\0227\n\013GetTopology\022\023.context.TopologyId\032" + "\021.context.Topology\"\000\022E\n\022GetTopologyDetai" + "ls\022\023.context.TopologyId\032\030.context.Topolo" + "gyDetails\"\000\0227\n\013SetTopology\022\021.context.Top" + "ology\032\023.context.TopologyId\"\000\0227\n\016RemoveTo" + "pology\022\023.context.TopologyId\032\016.context.Em" + "pty\"\000\022?\n\021GetTopologyEvents\022\016.context.Emp" + "ty\032\026.context.TopologyEvent\"\0000\001\0228\n\rListDe" + "viceIds\022\016.context.Empty\032\025.context.Device" + "IdList\"\000\0224\n\013ListDevices\022\016.context.Empty\032" + "\023.context.DeviceList\"\000\0221\n\tGetDevice\022\021.co" + "ntext.DeviceId\032\017.context.Device\"\000\0221\n\tSet" + "Device\022\017.context.Device\032\021.context.Device" + "Id\"\000\0223\n\014RemoveDevice\022\021.context.DeviceId\032" + "\016.context.Empty\"\000\022;\n\017GetDeviceEvents\022\016.c" + "ontext.Empty\032\024.context.DeviceEvent\"\0000\001\022<" + "\n\014SelectDevice\022\025.context.DeviceFilter\032\023." + "context.DeviceList\"\000\022I\n\021ListEndPointName" + "s\022\027.context.EndPointIdList\032\031.context.End" + "PointNameList\"\000\0224\n\013ListLinkIds\022\016.context" + ".Empty\032\023.context.LinkIdList\"\000\0220\n\tListLin" + "ks\022\016.context.Empty\032\021.context.LinkList\"\000\022" + "+\n\007GetLink\022\017.context.LinkId\032\r.context.Li" + "nk\"\000\022+\n\007SetLink\022\r.context.Link\032\017.context" + ".LinkId\"\000\022/\n\nRemoveLink\022\017.context.LinkId" + "\032\016.context.Empty\"\000\0227\n\rGetLinkEvents\022\016.co" + "ntext.Empty\032\022.context.LinkEvent\"\0000\001\022>\n\016L" + "istServiceIds\022\022.context.ContextId\032\026.cont" + "ext.ServiceIdList\"\000\022:\n\014ListServices\022\022.co" + "ntext.ContextId\032\024.context.ServiceList\"\000\022" + "4\n\nGetService\022\022.context.ServiceId\032\020.cont" + "ext.Service\"\000\0224\n\nSetService\022\020.context.Se" + "rvice\032\022.context.ServiceId\"\000\0226\n\014UnsetServ" + "ice\022\020.context.Service\032\022.context.ServiceI" + "d\"\000\0225\n\rRemoveService\022\022.context.ServiceId" + "\032\016.context.Empty\"\000\022=\n\020GetServiceEvents\022\016" + ".context.Empty\032\025.context.ServiceEvent\"\0000" + "\001\022?\n\rSelectService\022\026.context.ServiceFilt" + "er\032\024.context.ServiceList\"\000\022:\n\014ListSliceI" + "ds\022\022.context.ContextId\032\024.context.SliceId" + "List\"\000\0226\n\nListSlices\022\022.context.ContextId" + "\032\022.context.SliceList\"\000\022.\n\010GetSlice\022\020.con" + "text.SliceId\032\016.context.Slice\"\000\022.\n\010SetSli" + "ce\022\016.context.Slice\032\020.context.SliceId\"\000\0220" + "\n\nUnsetSlice\022\016.context.Slice\032\020.context.S" + "liceId\"\000\0221\n\013RemoveSlice\022\020.context.SliceI" + "d\032\016.context.Empty\"\000\0229\n\016GetSliceEvents\022\016." + "context.Empty\032\023.context.SliceEvent\"\0000\001\0229" + "\n\013SelectSlice\022\024.context.SliceFilter\032\022.co" + "ntext.SliceList\"\000\022D\n\021ListConnectionIds\022\022" + ".context.ServiceId\032\031.context.ConnectionI" + "dList\"\000\022@\n\017ListConnections\022\022.context.Ser" + "viceId\032\027.context.ConnectionList\"\000\022=\n\rGet" + "Connection\022\025.context.ConnectionId\032\023.cont" + "ext.Connection\"\000\022=\n\rSetConnection\022\023.cont" + "ext.Connection\032\025.context.ConnectionId\"\000\022" + ";\n\020RemoveConnection\022\025.context.Connection" + "Id\032\016.context.Empty\"\000\022C\n\023GetConnectionEve" + "nts\022\016.context.Empty\032\030.context.Connection" + "Event\"\0000\001\022@\n\020GetOpticalConfig\022\016.context." + "Empty\032\032.context.OpticalConfigList\"\000\022F\n\020S" + "etOpticalConfig\022\026.context.OpticalConfig\032" + "\030.context.OpticalConfigId\"\000\022I\n\023SelectOpt" + "icalConfig\022\030.context.OpticalConfigId\032\026.c" + "ontext.OpticalConfig\"\000\0228\n\016SetOpticalLink" + "\022\024.context.OpticalLink\032\016.context.Empty\"\000" + "\022@\n\016GetOpticalLink\022\026.context.OpticalLink" + "Id\032\024.context.OpticalLink\"\000\022.\n\010GetFiber\022\020" + ".context.FiberId\032\016.context.Fiber\"\000b\006prot" + "o3" };
         descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { acl.Acl.getDescriptor(), kpi_sample_types.KpiSampleTypes.getDescriptor() });
         internal_static_context_Empty_descriptor = getDescriptor().getMessageTypes().get(0);
         internal_static_context_Empty_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Empty_descriptor, new java.lang.String[] {});
diff --git a/src/policy/target/generated-sources/grpc/context/ContextServiceGrpc.java b/src/policy/target/generated-sources/grpc/context/ContextServiceGrpc.java
index 233312dd7..a03f7e949 100644
--- a/src/policy/target/generated-sources/grpc/context/ContextServiceGrpc.java
+++ b/src/policy/target/generated-sources/grpc/context/ContextServiceGrpc.java
@@ -4,8 +4,7 @@ import static io.grpc.MethodDescriptor.generateFullMethodName;
 
 /**
  */
-@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.55.1)", comments = "Source: context.proto")
-@io.grpc.stub.annotations.GrpcGenerated
+@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.38.1)", comments = "Source: context.proto")
 public final class ContextServiceGrpc {
 
     private ContextServiceGrpc() {
@@ -883,299 +882,299 @@ public final class ContextServiceGrpc {
 
     /**
      */
-    public interface AsyncService {
+    public static abstract class ContextServiceImplBase implements io.grpc.BindableService {
 
         /**
          */
-        default void listContextIds(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listContextIds(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListContextIdsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listContexts(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listContexts(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListContextsMethod(), responseObserver);
         }
 
         /**
          */
-        default void getContext(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getContext(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetContextMethod(), responseObserver);
         }
 
         /**
          */
-        default void setContext(context.ContextOuterClass.Context request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setContext(context.ContextOuterClass.Context request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetContextMethod(), responseObserver);
         }
 
         /**
          */
-        default void removeContext(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void removeContext(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRemoveContextMethod(), responseObserver);
         }
 
         /**
          */
-        default void getContextEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getContextEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetContextEventsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listTopologyIds(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listTopologyIds(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListTopologyIdsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listTopologies(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listTopologies(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListTopologiesMethod(), responseObserver);
         }
 
         /**
          */
-        default void getTopology(context.ContextOuterClass.TopologyId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getTopology(context.ContextOuterClass.TopologyId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetTopologyMethod(), responseObserver);
         }
 
         /**
          */
-        default void getTopologyDetails(context.ContextOuterClass.TopologyId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getTopologyDetails(context.ContextOuterClass.TopologyId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetTopologyDetailsMethod(), responseObserver);
         }
 
         /**
          */
-        default void setTopology(context.ContextOuterClass.Topology request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setTopology(context.ContextOuterClass.Topology request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetTopologyMethod(), responseObserver);
         }
 
         /**
          */
-        default void removeTopology(context.ContextOuterClass.TopologyId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void removeTopology(context.ContextOuterClass.TopologyId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRemoveTopologyMethod(), responseObserver);
         }
 
         /**
          */
-        default void getTopologyEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getTopologyEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetTopologyEventsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listDeviceIds(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listDeviceIds(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListDeviceIdsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listDevices(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listDevices(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListDevicesMethod(), responseObserver);
         }
 
         /**
          */
-        default void getDevice(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getDevice(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetDeviceMethod(), responseObserver);
         }
 
         /**
          */
-        default void setDevice(context.ContextOuterClass.Device request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setDevice(context.ContextOuterClass.Device request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetDeviceMethod(), responseObserver);
         }
 
         /**
          */
-        default void removeDevice(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void removeDevice(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRemoveDeviceMethod(), responseObserver);
         }
 
         /**
          */
-        default void getDeviceEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getDeviceEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetDeviceEventsMethod(), responseObserver);
         }
 
         /**
          */
-        default void selectDevice(context.ContextOuterClass.DeviceFilter request, io.grpc.stub.StreamObserver responseObserver) {
+        public void selectDevice(context.ContextOuterClass.DeviceFilter request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSelectDeviceMethod(), responseObserver);
         }
 
         /**
          */
-        default void listEndPointNames(context.ContextOuterClass.EndPointIdList request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listEndPointNames(context.ContextOuterClass.EndPointIdList request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListEndPointNamesMethod(), responseObserver);
         }
 
         /**
          */
-        default void listLinkIds(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listLinkIds(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListLinkIdsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listLinks(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listLinks(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListLinksMethod(), responseObserver);
         }
 
         /**
          */
-        default void getLink(context.ContextOuterClass.LinkId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getLink(context.ContextOuterClass.LinkId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetLinkMethod(), responseObserver);
         }
 
         /**
          */
-        default void setLink(context.ContextOuterClass.Link request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setLink(context.ContextOuterClass.Link request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetLinkMethod(), responseObserver);
         }
 
         /**
          */
-        default void removeLink(context.ContextOuterClass.LinkId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void removeLink(context.ContextOuterClass.LinkId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRemoveLinkMethod(), responseObserver);
         }
 
         /**
          */
-        default void getLinkEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getLinkEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetLinkEventsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listServiceIds(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listServiceIds(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListServiceIdsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listServices(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listServices(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListServicesMethod(), responseObserver);
         }
 
         /**
          */
-        default void getService(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getService(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetServiceMethod(), responseObserver);
         }
 
         /**
          */
-        default void setService(context.ContextOuterClass.Service request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setService(context.ContextOuterClass.Service request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetServiceMethod(), responseObserver);
         }
 
         /**
          */
-        default void unsetService(context.ContextOuterClass.Service request, io.grpc.stub.StreamObserver responseObserver) {
+        public void unsetService(context.ContextOuterClass.Service request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getUnsetServiceMethod(), responseObserver);
         }
 
         /**
          */
-        default void removeService(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void removeService(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRemoveServiceMethod(), responseObserver);
         }
 
         /**
          */
-        default void getServiceEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getServiceEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetServiceEventsMethod(), responseObserver);
         }
 
         /**
          */
-        default void selectService(context.ContextOuterClass.ServiceFilter request, io.grpc.stub.StreamObserver responseObserver) {
+        public void selectService(context.ContextOuterClass.ServiceFilter request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSelectServiceMethod(), responseObserver);
         }
 
         /**
          */
-        default void listSliceIds(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listSliceIds(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListSliceIdsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listSlices(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listSlices(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListSlicesMethod(), responseObserver);
         }
 
         /**
          */
-        default void getSlice(context.ContextOuterClass.SliceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getSlice(context.ContextOuterClass.SliceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetSliceMethod(), responseObserver);
         }
 
         /**
          */
-        default void setSlice(context.ContextOuterClass.Slice request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setSlice(context.ContextOuterClass.Slice request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetSliceMethod(), responseObserver);
         }
 
         /**
          */
-        default void unsetSlice(context.ContextOuterClass.Slice request, io.grpc.stub.StreamObserver responseObserver) {
+        public void unsetSlice(context.ContextOuterClass.Slice request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getUnsetSliceMethod(), responseObserver);
         }
 
         /**
          */
-        default void removeSlice(context.ContextOuterClass.SliceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void removeSlice(context.ContextOuterClass.SliceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRemoveSliceMethod(), responseObserver);
         }
 
         /**
          */
-        default void getSliceEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getSliceEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetSliceEventsMethod(), responseObserver);
         }
 
         /**
          */
-        default void selectSlice(context.ContextOuterClass.SliceFilter request, io.grpc.stub.StreamObserver responseObserver) {
+        public void selectSlice(context.ContextOuterClass.SliceFilter request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSelectSliceMethod(), responseObserver);
         }
 
         /**
          */
-        default void listConnectionIds(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listConnectionIds(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListConnectionIdsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listConnections(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listConnections(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListConnectionsMethod(), responseObserver);
         }
 
         /**
          */
-        default void getConnection(context.ContextOuterClass.ConnectionId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getConnection(context.ContextOuterClass.ConnectionId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetConnectionMethod(), responseObserver);
         }
 
         /**
          */
-        default void setConnection(context.ContextOuterClass.Connection request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setConnection(context.ContextOuterClass.Connection request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetConnectionMethod(), responseObserver);
         }
 
         /**
          */
-        default void removeConnection(context.ContextOuterClass.ConnectionId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void removeConnection(context.ContextOuterClass.ConnectionId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRemoveConnectionMethod(), responseObserver);
         }
 
         /**
          */
-        default void getConnectionEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getConnectionEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetConnectionEventsMethod(), responseObserver);
         }
 
@@ -1184,54 +1183,47 @@ public final class ContextServiceGrpc {
          * ------------------------------ Experimental -----------------------------
          * 
*/ - default void getOpticalConfig(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) { + public void getOpticalConfig(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetOpticalConfigMethod(), responseObserver); } /** */ - default void setOpticalConfig(context.ContextOuterClass.OpticalConfig request, io.grpc.stub.StreamObserver responseObserver) { + public void setOpticalConfig(context.ContextOuterClass.OpticalConfig request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetOpticalConfigMethod(), responseObserver); } /** */ - default void selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request, io.grpc.stub.StreamObserver responseObserver) { + public void selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSelectOpticalConfigMethod(), responseObserver); } /** */ - default void setOpticalLink(context.ContextOuterClass.OpticalLink request, io.grpc.stub.StreamObserver responseObserver) { + public void setOpticalLink(context.ContextOuterClass.OpticalLink request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetOpticalLinkMethod(), responseObserver); } /** */ - default void getOpticalLink(context.ContextOuterClass.OpticalLinkId request, io.grpc.stub.StreamObserver responseObserver) { + public void getOpticalLink(context.ContextOuterClass.OpticalLinkId request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetOpticalLinkMethod(), responseObserver); } /** */ - default void getFiber(context.ContextOuterClass.FiberId request, io.grpc.stub.StreamObserver responseObserver) { + public void getFiber(context.ContextOuterClass.FiberId request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetFiberMethod(), responseObserver); } - } - - /** - * Base class for the server implementation of the service ContextService. - */ - public static abstract class ContextServiceImplBase implements io.grpc.BindableService, AsyncService { @java.lang.Override public io.grpc.ServerServiceDefinition bindService() { - return ContextServiceGrpc.bindService(this); + return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getListContextIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONTEXT_IDS))).addMethod(getListContextsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONTEXTS))).addMethod(getGetContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_CONTEXT))).addMethod(getSetContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_CONTEXT))).addMethod(getRemoveContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_CONTEXT))).addMethod(getGetContextEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_CONTEXT_EVENTS))).addMethod(getListTopologyIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_TOPOLOGY_IDS))).addMethod(getListTopologiesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_TOPOLOGIES))).addMethod(getGetTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY))).addMethod(getGetTopologyDetailsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY_DETAILS))).addMethod(getSetTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_TOPOLOGY))).addMethod(getRemoveTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_TOPOLOGY))).addMethod(getGetTopologyEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY_EVENTS))).addMethod(getListDeviceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_DEVICE_IDS))).addMethod(getListDevicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_DEVICES))).addMethod(getGetDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_DEVICE))).addMethod(getSetDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_DEVICE))).addMethod(getRemoveDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_DEVICE))).addMethod(getGetDeviceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_DEVICE_EVENTS))).addMethod(getSelectDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_DEVICE))).addMethod(getListEndPointNamesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_END_POINT_NAMES))).addMethod(getListLinkIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_LINK_IDS))).addMethod(getListLinksMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_LINKS))).addMethod(getGetLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_LINK))).addMethod(getSetLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_LINK))).addMethod(getRemoveLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_LINK))).addMethod(getGetLinkEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_LINK_EVENTS))).addMethod(getListServiceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SERVICE_IDS))).addMethod(getListServicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SERVICES))).addMethod(getGetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_SERVICE))).addMethod(getSetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_SERVICE))).addMethod(getUnsetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_UNSET_SERVICE))).addMethod(getRemoveServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_SERVICE))).addMethod(getGetServiceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_SERVICE_EVENTS))).addMethod(getSelectServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_SERVICE))).addMethod(getListSliceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SLICE_IDS))).addMethod(getListSlicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SLICES))).addMethod(getGetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_SLICE))).addMethod(getSetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_SLICE))).addMethod(getUnsetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_UNSET_SLICE))).addMethod(getRemoveSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_SLICE))).addMethod(getGetSliceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_SLICE_EVENTS))).addMethod(getSelectSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_SLICE))).addMethod(getListConnectionIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONNECTION_IDS))).addMethod(getListConnectionsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONNECTIONS))).addMethod(getGetConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_CONNECTION))).addMethod(getSetConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_CONNECTION))).addMethod(getRemoveConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_CONNECTION))).addMethod(getGetConnectionEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_CONNECTION_EVENTS))).addMethod(getGetOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_OPTICAL_CONFIG))).addMethod(getSetOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_OPTICAL_CONFIG))).addMethod(getSelectOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_OPTICAL_CONFIG))).addMethod(getSetOpticalLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_OPTICAL_LINK))).addMethod(getGetOpticalLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_OPTICAL_LINK))).addMethod(getGetFiberMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_FIBER))).build(); } } /** - * A stub to allow clients to do asynchronous rpc calls to service ContextService. */ public static class ContextServiceStub extends io.grpc.stub.AbstractAsyncStub { @@ -1579,7 +1571,6 @@ public final class ContextServiceGrpc { } /** - * A stub to allow clients to do synchronous rpc calls to service ContextService. */ public static class ContextServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub { @@ -1927,7 +1918,6 @@ public final class ContextServiceGrpc { } /** - * A stub to allow clients to do ListenableFuture-style rpc calls to service ContextService. */ public static class ContextServiceFutureStub extends io.grpc.stub.AbstractFutureStub { @@ -2344,11 +2334,11 @@ public final class ContextServiceGrpc { private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, io.grpc.stub.ServerCalls.ServerStreamingMethod, io.grpc.stub.ServerCalls.ClientStreamingMethod, io.grpc.stub.ServerCalls.BidiStreamingMethod { - private final AsyncService serviceImpl; + private final ContextServiceImplBase serviceImpl; private final int methodId; - MethodHandlers(AsyncService serviceImpl, int methodId) { + MethodHandlers(ContextServiceImplBase serviceImpl, int methodId) { this.serviceImpl = serviceImpl; this.methodId = methodId; } @@ -2537,10 +2527,6 @@ public final class ContextServiceGrpc { } } - public static io.grpc.ServerServiceDefinition bindService(AsyncService service) { - return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getListContextIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONTEXT_IDS))).addMethod(getListContextsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONTEXTS))).addMethod(getGetContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_CONTEXT))).addMethod(getSetContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_CONTEXT))).addMethod(getRemoveContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_CONTEXT))).addMethod(getGetContextEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_CONTEXT_EVENTS))).addMethod(getListTopologyIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_TOPOLOGY_IDS))).addMethod(getListTopologiesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_TOPOLOGIES))).addMethod(getGetTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY))).addMethod(getGetTopologyDetailsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY_DETAILS))).addMethod(getSetTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_TOPOLOGY))).addMethod(getRemoveTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_TOPOLOGY))).addMethod(getGetTopologyEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY_EVENTS))).addMethod(getListDeviceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_DEVICE_IDS))).addMethod(getListDevicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_DEVICES))).addMethod(getGetDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_DEVICE))).addMethod(getSetDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_DEVICE))).addMethod(getRemoveDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_DEVICE))).addMethod(getGetDeviceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_DEVICE_EVENTS))).addMethod(getSelectDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_DEVICE))).addMethod(getListEndPointNamesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_END_POINT_NAMES))).addMethod(getListLinkIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_LINK_IDS))).addMethod(getListLinksMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_LINKS))).addMethod(getGetLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_LINK))).addMethod(getSetLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_LINK))).addMethod(getRemoveLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_LINK))).addMethod(getGetLinkEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_LINK_EVENTS))).addMethod(getListServiceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SERVICE_IDS))).addMethod(getListServicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SERVICES))).addMethod(getGetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_SERVICE))).addMethod(getSetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_SERVICE))).addMethod(getUnsetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_UNSET_SERVICE))).addMethod(getRemoveServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_SERVICE))).addMethod(getGetServiceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_SERVICE_EVENTS))).addMethod(getSelectServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_SERVICE))).addMethod(getListSliceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SLICE_IDS))).addMethod(getListSlicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SLICES))).addMethod(getGetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_SLICE))).addMethod(getSetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_SLICE))).addMethod(getUnsetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_UNSET_SLICE))).addMethod(getRemoveSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_SLICE))).addMethod(getGetSliceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_SLICE_EVENTS))).addMethod(getSelectSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_SLICE))).addMethod(getListConnectionIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONNECTION_IDS))).addMethod(getListConnectionsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONNECTIONS))).addMethod(getGetConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_CONNECTION))).addMethod(getSetConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_CONNECTION))).addMethod(getRemoveConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_CONNECTION))).addMethod(getGetConnectionEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_CONNECTION_EVENTS))).addMethod(getGetOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_OPTICAL_CONFIG))).addMethod(getSetOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_OPTICAL_CONFIG))).addMethod(getSelectOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_OPTICAL_CONFIG))).addMethod(getSetOpticalLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_OPTICAL_LINK))).addMethod(getGetOpticalLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_OPTICAL_LINK))).addMethod(getGetFiberMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_FIBER))).build(); - } - private static abstract class ContextServiceBaseDescriptorSupplier implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier { ContextServiceBaseDescriptorSupplier() { diff --git a/src/policy/target/generated-sources/grpc/context_policy/ContextPolicyServiceGrpc.java b/src/policy/target/generated-sources/grpc/context_policy/ContextPolicyServiceGrpc.java index 721493b1e..f7123f88f 100644 --- a/src/policy/target/generated-sources/grpc/context_policy/ContextPolicyServiceGrpc.java +++ b/src/policy/target/generated-sources/grpc/context_policy/ContextPolicyServiceGrpc.java @@ -7,8 +7,7 @@ import static io.grpc.MethodDescriptor.generateFullMethodName; * created as a separate service to prevent import-loops in context and policy *
*/ -@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.55.1)", comments = "Source: context_policy.proto") -@io.grpc.stub.annotations.GrpcGenerated +@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.38.1)", comments = "Source: context_policy.proto") public final class ContextPolicyServiceGrpc { private ContextPolicyServiceGrpc() { @@ -139,55 +138,45 @@ public final class ContextPolicyServiceGrpc { * created as a separate service to prevent import-loops in context and policy * */ - public interface AsyncService { + public static abstract class ContextPolicyServiceImplBase implements io.grpc.BindableService { /** */ - default void listPolicyRuleIds(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) { + public void listPolicyRuleIds(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListPolicyRuleIdsMethod(), responseObserver); } /** */ - default void listPolicyRules(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) { + public void listPolicyRules(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListPolicyRulesMethod(), responseObserver); } /** */ - default void getPolicyRule(policy.Policy.PolicyRuleId request, io.grpc.stub.StreamObserver responseObserver) { + public void getPolicyRule(policy.Policy.PolicyRuleId request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetPolicyRuleMethod(), responseObserver); } /** */ - default void setPolicyRule(policy.Policy.PolicyRule request, io.grpc.stub.StreamObserver responseObserver) { + public void setPolicyRule(policy.Policy.PolicyRule request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetPolicyRuleMethod(), responseObserver); } /** */ - default void removePolicyRule(policy.Policy.PolicyRuleId request, io.grpc.stub.StreamObserver responseObserver) { + public void removePolicyRule(policy.Policy.PolicyRuleId request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRemovePolicyRuleMethod(), responseObserver); } - } - - /** - * Base class for the server implementation of the service ContextPolicyService. - *
-     * created as a separate service to prevent import-loops in context and policy
-     * 
- */ - public static abstract class ContextPolicyServiceImplBase implements io.grpc.BindableService, AsyncService { @java.lang.Override public io.grpc.ServerServiceDefinition bindService() { - return ContextPolicyServiceGrpc.bindService(this); + return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getListPolicyRuleIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_POLICY_RULE_IDS))).addMethod(getListPolicyRulesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_POLICY_RULES))).addMethod(getGetPolicyRuleMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_POLICY_RULE))).addMethod(getSetPolicyRuleMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_POLICY_RULE))).addMethod(getRemovePolicyRuleMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_POLICY_RULE))).build(); } } /** - * A stub to allow clients to do asynchronous rpc calls to service ContextPolicyService. *
      * created as a separate service to prevent import-loops in context and policy
      * 
@@ -235,7 +224,6 @@ public final class ContextPolicyServiceGrpc { } /** - * A stub to allow clients to do synchronous rpc calls to service ContextPolicyService. *
      * created as a separate service to prevent import-loops in context and policy
      * 
@@ -283,7 +271,6 @@ public final class ContextPolicyServiceGrpc { } /** - * A stub to allow clients to do ListenableFuture-style rpc calls to service ContextPolicyService. *
      * created as a separate service to prevent import-loops in context and policy
      * 
@@ -342,11 +329,11 @@ public final class ContextPolicyServiceGrpc { private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, io.grpc.stub.ServerCalls.ServerStreamingMethod, io.grpc.stub.ServerCalls.ClientStreamingMethod, io.grpc.stub.ServerCalls.BidiStreamingMethod { - private final AsyncService serviceImpl; + private final ContextPolicyServiceImplBase serviceImpl; private final int methodId; - MethodHandlers(AsyncService serviceImpl, int methodId) { + MethodHandlers(ContextPolicyServiceImplBase serviceImpl, int methodId) { this.serviceImpl = serviceImpl; this.methodId = methodId; } @@ -385,10 +372,6 @@ public final class ContextPolicyServiceGrpc { } } - public static io.grpc.ServerServiceDefinition bindService(AsyncService service) { - return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getListPolicyRuleIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_POLICY_RULE_IDS))).addMethod(getListPolicyRulesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_POLICY_RULES))).addMethod(getGetPolicyRuleMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_POLICY_RULE))).addMethod(getSetPolicyRuleMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_POLICY_RULE))).addMethod(getRemovePolicyRuleMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_POLICY_RULE))).build(); - } - private static abstract class ContextPolicyServiceBaseDescriptorSupplier implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier { ContextPolicyServiceBaseDescriptorSupplier() { diff --git a/src/policy/target/generated-sources/grpc/device/Device.java b/src/policy/target/generated-sources/grpc/device/Device.java index a127e8f1c..93bd49040 100644 --- a/src/policy/target/generated-sources/grpc/device/Device.java +++ b/src/policy/target/generated-sources/grpc/device/Device.java @@ -86,6 +86,80 @@ public final class Device { return new MonitoringSettings(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private MonitoringSettings(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + monitoring.Monitoring.KpiId.Builder subBuilder = null; + if (kpiId_ != null) { + subBuilder = kpiId_.toBuilder(); + } + kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(kpiId_); + kpiId_ = subBuilder.buildPartial(); + } + break; + } + case 18: + { + monitoring.Monitoring.KpiDescriptor.Builder subBuilder = null; + if (kpiDescriptor_ != null) { + subBuilder = kpiDescriptor_.toBuilder(); + } + kpiDescriptor_ = input.readMessage(monitoring.Monitoring.KpiDescriptor.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(kpiDescriptor_); + kpiDescriptor_ = subBuilder.buildPartial(); + } + break; + } + case 29: + { + samplingDurationS_ = input.readFloat(); + break; + } + case 37: + { + samplingIntervalS_ = input.readFloat(); + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return device.Device.internal_static_device_MonitoringSettings_descriptor; } @@ -122,7 +196,7 @@ public final class Device { */ @java.lang.Override public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() { - return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_; + return getKpiId(); } public static final int KPI_DESCRIPTOR_FIELD_NUMBER = 2; @@ -152,12 +226,12 @@ public final class Device { */ @java.lang.Override public monitoring.Monitoring.KpiDescriptorOrBuilder getKpiDescriptorOrBuilder() { - return kpiDescriptor_ == null ? monitoring.Monitoring.KpiDescriptor.getDefaultInstance() : kpiDescriptor_; + return getKpiDescriptor(); } public static final int SAMPLING_DURATION_S_FIELD_NUMBER = 3; - private float samplingDurationS_ = 0F; + private float samplingDurationS_; /** * float sampling_duration_s = 3; @@ -170,7 +244,7 @@ public final class Device { public static final int SAMPLING_INTERVAL_S_FIELD_NUMBER = 4; - private float samplingIntervalS_ = 0F; + private float samplingIntervalS_; /** * float sampling_interval_s = 4; @@ -202,13 +276,13 @@ public final class Device { if (kpiDescriptor_ != null) { output.writeMessage(2, getKpiDescriptor()); } - if (java.lang.Float.floatToRawIntBits(samplingDurationS_) != 0) { + if (samplingDurationS_ != 0F) { output.writeFloat(3, samplingDurationS_); } - if (java.lang.Float.floatToRawIntBits(samplingIntervalS_) != 0) { + if (samplingIntervalS_ != 0F) { output.writeFloat(4, samplingIntervalS_); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -223,13 +297,13 @@ public final class Device { if (kpiDescriptor_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getKpiDescriptor()); } - if (java.lang.Float.floatToRawIntBits(samplingDurationS_) != 0) { + if (samplingDurationS_ != 0F) { size += com.google.protobuf.CodedOutputStream.computeFloatSize(3, samplingDurationS_); } - if (java.lang.Float.floatToRawIntBits(samplingIntervalS_) != 0) { + if (samplingIntervalS_ != 0F) { size += com.google.protobuf.CodedOutputStream.computeFloatSize(4, samplingIntervalS_); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -259,7 +333,7 @@ public final class Device { return false; if (java.lang.Float.floatToIntBits(getSamplingIntervalS()) != java.lang.Float.floatToIntBits(other.getSamplingIntervalS())) return false; - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -283,7 +357,7 @@ public final class Device { hash = (53 * hash) + java.lang.Float.floatToIntBits(getSamplingDurationS()); hash = (37 * hash) + SAMPLING_INTERVAL_S_FIELD_NUMBER; hash = (53 * hash) + java.lang.Float.floatToIntBits(getSamplingIntervalS()); - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -377,24 +451,32 @@ public final class Device { // Construct using device.Device.MonitoringSettings.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; - kpiId_ = null; - if (kpiIdBuilder_ != null) { - kpiIdBuilder_.dispose(); + if (kpiIdBuilder_ == null) { + kpiId_ = null; + } else { + kpiId_ = null; kpiIdBuilder_ = null; } - kpiDescriptor_ = null; - if (kpiDescriptorBuilder_ != null) { - kpiDescriptorBuilder_.dispose(); + if (kpiDescriptorBuilder_ == null) { + kpiDescriptor_ = null; + } else { + kpiDescriptor_ = null; kpiDescriptorBuilder_ = null; } samplingDurationS_ = 0F; @@ -424,27 +506,50 @@ public final class Device { @java.lang.Override public device.Device.MonitoringSettings buildPartial() { device.Device.MonitoringSettings result = new device.Device.MonitoringSettings(this); - if (bitField0_ != 0) { - buildPartial0(result); + if (kpiIdBuilder_ == null) { + result.kpiId_ = kpiId_; + } else { + result.kpiId_ = kpiIdBuilder_.build(); + } + if (kpiDescriptorBuilder_ == null) { + result.kpiDescriptor_ = kpiDescriptor_; + } else { + result.kpiDescriptor_ = kpiDescriptorBuilder_.build(); } + result.samplingDurationS_ = samplingDurationS_; + result.samplingIntervalS_ = samplingIntervalS_; onBuilt(); return result; } - private void buildPartial0(device.Device.MonitoringSettings result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build(); - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.kpiDescriptor_ = kpiDescriptorBuilder_ == null ? kpiDescriptor_ : kpiDescriptorBuilder_.build(); - } - if (((from_bitField0_ & 0x00000004) != 0)) { - result.samplingDurationS_ = samplingDurationS_; - } - if (((from_bitField0_ & 0x00000008) != 0)) { - result.samplingIntervalS_ = samplingIntervalS_; - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -472,7 +577,7 @@ public final class Device { if (other.getSamplingIntervalS() != 0F) { setSamplingIntervalS(other.getSamplingIntervalS()); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -484,68 +589,20 @@ public final class Device { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + device.Device.MonitoringSettings parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000001; - break; - } - // case 10 - case 18: - { - input.readMessage(getKpiDescriptorFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000002; - break; - } - // case 18 - case 29: - { - samplingDurationS_ = input.readFloat(); - bitField0_ |= 0x00000004; - break; - } - // case 29 - case 37: - { - samplingIntervalS_ = input.readFloat(); - bitField0_ |= 0x00000008; - break; - } - // case 37 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (device.Device.MonitoringSettings) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } - private int bitField0_; - private monitoring.Monitoring.KpiId kpiId_; private com.google.protobuf.SingleFieldBuilderV3 kpiIdBuilder_; @@ -555,7 +612,7 @@ public final class Device { * @return Whether the kpiId field is set. */ public boolean hasKpiId() { - return ((bitField0_ & 0x00000001) != 0); + return kpiIdBuilder_ != null || kpiId_ != null; } /** @@ -579,11 +636,10 @@ public final class Device { throw new NullPointerException(); } kpiId_ = value; + onChanged(); } else { kpiIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -593,11 +649,10 @@ public final class Device { public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) { if (kpiIdBuilder_ == null) { kpiId_ = builderForValue.build(); + onChanged(); } else { kpiIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -606,16 +661,15 @@ public final class Device { */ public Builder mergeKpiId(monitoring.Monitoring.KpiId value) { if (kpiIdBuilder_ == null) { - if (((bitField0_ & 0x00000001) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) { - getKpiIdBuilder().mergeFrom(value); + if (kpiId_ != null) { + kpiId_ = monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial(); } else { kpiId_ = value; } + onChanged(); } else { kpiIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -623,13 +677,13 @@ public final class Device { * .monitoring.KpiId kpi_id = 1; */ public Builder clearKpiId() { - bitField0_ = (bitField0_ & ~0x00000001); - kpiId_ = null; - if (kpiIdBuilder_ != null) { - kpiIdBuilder_.dispose(); + if (kpiIdBuilder_ == null) { + kpiId_ = null; + onChanged(); + } else { + kpiId_ = null; kpiIdBuilder_ = null; } - onChanged(); return this; } @@ -637,7 +691,6 @@ public final class Device { * .monitoring.KpiId kpi_id = 1; */ public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() { - bitField0_ |= 0x00000001; onChanged(); return getKpiIdFieldBuilder().getBuilder(); } @@ -673,7 +726,7 @@ public final class Device { * @return Whether the kpiDescriptor field is set. */ public boolean hasKpiDescriptor() { - return ((bitField0_ & 0x00000002) != 0); + return kpiDescriptorBuilder_ != null || kpiDescriptor_ != null; } /** @@ -697,11 +750,10 @@ public final class Device { throw new NullPointerException(); } kpiDescriptor_ = value; + onChanged(); } else { kpiDescriptorBuilder_.setMessage(value); } - bitField0_ |= 0x00000002; - onChanged(); return this; } @@ -711,11 +763,10 @@ public final class Device { public Builder setKpiDescriptor(monitoring.Monitoring.KpiDescriptor.Builder builderForValue) { if (kpiDescriptorBuilder_ == null) { kpiDescriptor_ = builderForValue.build(); + onChanged(); } else { kpiDescriptorBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000002; - onChanged(); return this; } @@ -724,16 +775,15 @@ public final class Device { */ public Builder mergeKpiDescriptor(monitoring.Monitoring.KpiDescriptor value) { if (kpiDescriptorBuilder_ == null) { - if (((bitField0_ & 0x00000002) != 0) && kpiDescriptor_ != null && kpiDescriptor_ != monitoring.Monitoring.KpiDescriptor.getDefaultInstance()) { - getKpiDescriptorBuilder().mergeFrom(value); + if (kpiDescriptor_ != null) { + kpiDescriptor_ = monitoring.Monitoring.KpiDescriptor.newBuilder(kpiDescriptor_).mergeFrom(value).buildPartial(); } else { kpiDescriptor_ = value; } + onChanged(); } else { kpiDescriptorBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000002; - onChanged(); return this; } @@ -741,13 +791,13 @@ public final class Device { * .monitoring.KpiDescriptor kpi_descriptor = 2; */ public Builder clearKpiDescriptor() { - bitField0_ = (bitField0_ & ~0x00000002); - kpiDescriptor_ = null; - if (kpiDescriptorBuilder_ != null) { - kpiDescriptorBuilder_.dispose(); + if (kpiDescriptorBuilder_ == null) { + kpiDescriptor_ = null; + onChanged(); + } else { + kpiDescriptor_ = null; kpiDescriptorBuilder_ = null; } - onChanged(); return this; } @@ -755,7 +805,6 @@ public final class Device { * .monitoring.KpiDescriptor kpi_descriptor = 2; */ public monitoring.Monitoring.KpiDescriptor.Builder getKpiDescriptorBuilder() { - bitField0_ |= 0x00000002; onChanged(); return getKpiDescriptorFieldBuilder().getBuilder(); } @@ -800,7 +849,6 @@ public final class Device { */ public Builder setSamplingDurationS(float value) { samplingDurationS_ = value; - bitField0_ |= 0x00000004; onChanged(); return this; } @@ -810,7 +858,6 @@ public final class Device { * @return This builder for chaining. */ public Builder clearSamplingDurationS() { - bitField0_ = (bitField0_ & ~0x00000004); samplingDurationS_ = 0F; onChanged(); return this; @@ -834,7 +881,6 @@ public final class Device { */ public Builder setSamplingIntervalS(float value) { samplingIntervalS_ = value; - bitField0_ |= 0x00000008; onChanged(); return this; } @@ -844,7 +890,6 @@ public final class Device { * @return This builder for chaining. */ public Builder clearSamplingIntervalS() { - bitField0_ = (bitField0_ & ~0x00000008); samplingIntervalS_ = 0F; onChanged(); return this; @@ -877,17 +922,7 @@ public final class Device { @java.lang.Override public MonitoringSettings parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new MonitoringSettings(input, extensionRegistry); } }; diff --git a/src/policy/target/generated-sources/grpc/device/DeviceServiceGrpc.java b/src/policy/target/generated-sources/grpc/device/DeviceServiceGrpc.java index 7e0cf9a8b..a6886d8d6 100644 --- a/src/policy/target/generated-sources/grpc/device/DeviceServiceGrpc.java +++ b/src/policy/target/generated-sources/grpc/device/DeviceServiceGrpc.java @@ -4,8 +4,7 @@ import static io.grpc.MethodDescriptor.generateFullMethodName; /** */ -@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.55.1)", comments = "Source: device.proto") -@io.grpc.stub.annotations.GrpcGenerated +@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.38.1)", comments = "Source: device.proto") public final class DeviceServiceGrpc { private DeviceServiceGrpc() { @@ -133,52 +132,45 @@ public final class DeviceServiceGrpc { /** */ - public interface AsyncService { + public static abstract class DeviceServiceImplBase implements io.grpc.BindableService { /** */ - default void addDevice(context.ContextOuterClass.Device request, io.grpc.stub.StreamObserver responseObserver) { + public void addDevice(context.ContextOuterClass.Device request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getAddDeviceMethod(), responseObserver); } /** */ - default void configureDevice(context.ContextOuterClass.Device request, io.grpc.stub.StreamObserver responseObserver) { + public void configureDevice(context.ContextOuterClass.Device request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getConfigureDeviceMethod(), responseObserver); } /** */ - default void deleteDevice(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) { + public void deleteDevice(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getDeleteDeviceMethod(), responseObserver); } /** */ - default void getInitialConfig(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) { + public void getInitialConfig(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetInitialConfigMethod(), responseObserver); } /** */ - default void monitorDeviceKpi(device.Device.MonitoringSettings request, io.grpc.stub.StreamObserver responseObserver) { + public void monitorDeviceKpi(device.Device.MonitoringSettings request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getMonitorDeviceKpiMethod(), responseObserver); } - } - - /** - * Base class for the server implementation of the service DeviceService. - */ - public static abstract class DeviceServiceImplBase implements io.grpc.BindableService, AsyncService { @java.lang.Override public io.grpc.ServerServiceDefinition bindService() { - return DeviceServiceGrpc.bindService(this); + return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getAddDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_ADD_DEVICE))).addMethod(getConfigureDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_CONFIGURE_DEVICE))).addMethod(getDeleteDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_DELETE_DEVICE))).addMethod(getGetInitialConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_INITIAL_CONFIG))).addMethod(getMonitorDeviceKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_MONITOR_DEVICE_KPI))).build(); } } /** - * A stub to allow clients to do asynchronous rpc calls to service DeviceService. */ public static class DeviceServiceStub extends io.grpc.stub.AbstractAsyncStub { @@ -223,7 +215,6 @@ public final class DeviceServiceGrpc { } /** - * A stub to allow clients to do synchronous rpc calls to service DeviceService. */ public static class DeviceServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub { @@ -268,7 +259,6 @@ public final class DeviceServiceGrpc { } /** - * A stub to allow clients to do ListenableFuture-style rpc calls to service DeviceService. */ public static class DeviceServiceFutureStub extends io.grpc.stub.AbstractFutureStub { @@ -324,11 +314,11 @@ public final class DeviceServiceGrpc { private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, io.grpc.stub.ServerCalls.ServerStreamingMethod, io.grpc.stub.ServerCalls.ClientStreamingMethod, io.grpc.stub.ServerCalls.BidiStreamingMethod { - private final AsyncService serviceImpl; + private final DeviceServiceImplBase serviceImpl; private final int methodId; - MethodHandlers(AsyncService serviceImpl, int methodId) { + MethodHandlers(DeviceServiceImplBase serviceImpl, int methodId) { this.serviceImpl = serviceImpl; this.methodId = methodId; } @@ -367,10 +357,6 @@ public final class DeviceServiceGrpc { } } - public static io.grpc.ServerServiceDefinition bindService(AsyncService service) { - return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getAddDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_ADD_DEVICE))).addMethod(getConfigureDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_CONFIGURE_DEVICE))).addMethod(getDeleteDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_DELETE_DEVICE))).addMethod(getGetInitialConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_INITIAL_CONFIG))).addMethod(getMonitorDeviceKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_MONITOR_DEVICE_KPI))).build(); - } - private static abstract class DeviceServiceBaseDescriptorSupplier implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier { DeviceServiceBaseDescriptorSupplier() { diff --git a/src/policy/target/generated-sources/grpc/monitoring/Monitoring.java b/src/policy/target/generated-sources/grpc/monitoring/Monitoring.java index 2f98ce3eb..4c80f4a06 100644 --- a/src/policy/target/generated-sources/grpc/monitoring/Monitoring.java +++ b/src/policy/target/generated-sources/grpc/monitoring/Monitoring.java @@ -211,6 +211,160 @@ public final class Monitoring { return new KpiDescriptor(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private KpiDescriptor(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + monitoring.Monitoring.KpiId.Builder subBuilder = null; + if (kpiId_ != null) { + subBuilder = kpiId_.toBuilder(); + } + kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(kpiId_); + kpiId_ = subBuilder.buildPartial(); + } + break; + } + case 18: + { + java.lang.String s = input.readStringRequireUtf8(); + kpiDescription_ = s; + break; + } + case 26: + { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + kpiIdList_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + kpiIdList_.add(input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry)); + break; + } + case 32: + { + int rawValue = input.readEnum(); + kpiSampleType_ = rawValue; + break; + } + case 42: + { + context.ContextOuterClass.DeviceId.Builder subBuilder = null; + if (deviceId_ != null) { + subBuilder = deviceId_.toBuilder(); + } + deviceId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(deviceId_); + deviceId_ = subBuilder.buildPartial(); + } + break; + } + case 50: + { + context.ContextOuterClass.EndPointId.Builder subBuilder = null; + if (endpointId_ != null) { + subBuilder = endpointId_.toBuilder(); + } + endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(endpointId_); + endpointId_ = subBuilder.buildPartial(); + } + break; + } + case 58: + { + context.ContextOuterClass.ServiceId.Builder subBuilder = null; + if (serviceId_ != null) { + subBuilder = serviceId_.toBuilder(); + } + serviceId_ = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(serviceId_); + serviceId_ = subBuilder.buildPartial(); + } + break; + } + case 66: + { + context.ContextOuterClass.SliceId.Builder subBuilder = null; + if (sliceId_ != null) { + subBuilder = sliceId_.toBuilder(); + } + sliceId_ = input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(sliceId_); + sliceId_ = subBuilder.buildPartial(); + } + break; + } + case 74: + { + context.ContextOuterClass.ConnectionId.Builder subBuilder = null; + if (connectionId_ != null) { + subBuilder = connectionId_.toBuilder(); + } + connectionId_ = input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(connectionId_); + connectionId_ = subBuilder.buildPartial(); + } + break; + } + case 82: + { + context.ContextOuterClass.LinkId.Builder subBuilder = null; + if (linkId_ != null) { + subBuilder = linkId_.toBuilder(); + } + linkId_ = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(linkId_); + linkId_ = subBuilder.buildPartial(); + } + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + kpiIdList_ = java.util.Collections.unmodifiableList(kpiIdList_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return monitoring.Monitoring.internal_static_monitoring_KpiDescriptor_descriptor; } @@ -247,13 +401,12 @@ public final class Monitoring { */ @java.lang.Override public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() { - return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_; + return getKpiId(); } public static final int KPI_DESCRIPTION_FIELD_NUMBER = 2; - @SuppressWarnings("serial") - private volatile java.lang.Object kpiDescription_ = ""; + private volatile java.lang.Object kpiDescription_; /** * string kpi_description = 2; @@ -290,7 +443,6 @@ public final class Monitoring { public static final int KPI_ID_LIST_FIELD_NUMBER = 3; - @SuppressWarnings("serial") private java.util.List kpiIdList_; /** @@ -335,7 +487,7 @@ public final class Monitoring { public static final int KPI_SAMPLE_TYPE_FIELD_NUMBER = 4; - private int kpiSampleType_ = 0; + private int kpiSampleType_; /** * .kpi_sample_types.KpiSampleType kpi_sample_type = 4; @@ -352,7 +504,8 @@ public final class Monitoring { */ @java.lang.Override public kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleType() { - kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.forNumber(kpiSampleType_); + @SuppressWarnings("deprecation") + kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.valueOf(kpiSampleType_); return result == null ? kpi_sample_types.KpiSampleTypes.KpiSampleType.UNRECOGNIZED : result; } @@ -383,7 +536,7 @@ public final class Monitoring { */ @java.lang.Override public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() { - return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_; + return getDeviceId(); } public static final int ENDPOINT_ID_FIELD_NUMBER = 6; @@ -413,7 +566,7 @@ public final class Monitoring { */ @java.lang.Override public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() { - return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_; + return getEndpointId(); } public static final int SERVICE_ID_FIELD_NUMBER = 7; @@ -443,7 +596,7 @@ public final class Monitoring { */ @java.lang.Override public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() { - return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_; + return getServiceId(); } public static final int SLICE_ID_FIELD_NUMBER = 8; @@ -473,7 +626,7 @@ public final class Monitoring { */ @java.lang.Override public context.ContextOuterClass.SliceIdOrBuilder getSliceIdOrBuilder() { - return sliceId_ == null ? context.ContextOuterClass.SliceId.getDefaultInstance() : sliceId_; + return getSliceId(); } public static final int CONNECTION_ID_FIELD_NUMBER = 9; @@ -503,7 +656,7 @@ public final class Monitoring { */ @java.lang.Override public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder() { - return connectionId_ == null ? context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_; + return getConnectionId(); } public static final int LINK_ID_FIELD_NUMBER = 10; @@ -533,7 +686,7 @@ public final class Monitoring { */ @java.lang.Override public context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder() { - return linkId_ == null ? context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_; + return getLinkId(); } private byte memoizedIsInitialized = -1; @@ -554,7 +707,7 @@ public final class Monitoring { if (kpiId_ != null) { output.writeMessage(1, getKpiId()); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(kpiDescription_)) { + if (!getKpiDescriptionBytes().isEmpty()) { com.google.protobuf.GeneratedMessageV3.writeString(output, 2, kpiDescription_); } for (int i = 0; i < kpiIdList_.size(); i++) { @@ -581,7 +734,7 @@ public final class Monitoring { if (linkId_ != null) { output.writeMessage(10, getLinkId()); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -593,7 +746,7 @@ public final class Monitoring { if (kpiId_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getKpiId()); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(kpiDescription_)) { + if (!getKpiDescriptionBytes().isEmpty()) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, kpiDescription_); } for (int i = 0; i < kpiIdList_.size(); i++) { @@ -620,7 +773,7 @@ public final class Monitoring { if (linkId_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(10, getLinkId()); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -682,7 +835,7 @@ public final class Monitoring { if (!getLinkId().equals(other.getLinkId())) return false; } - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -730,7 +883,7 @@ public final class Monitoring { hash = (37 * hash) + LINK_ID_FIELD_NUMBER; hash = (53 * hash) + getLinkId().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -824,58 +977,71 @@ public final class Monitoring { // Construct using monitoring.Monitoring.KpiDescriptor.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + getKpiIdListFieldBuilder(); + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; - kpiId_ = null; - if (kpiIdBuilder_ != null) { - kpiIdBuilder_.dispose(); + if (kpiIdBuilder_ == null) { + kpiId_ = null; + } else { + kpiId_ = null; kpiIdBuilder_ = null; } kpiDescription_ = ""; if (kpiIdListBuilder_ == null) { kpiIdList_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); } else { - kpiIdList_ = null; kpiIdListBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000004); kpiSampleType_ = 0; - deviceId_ = null; - if (deviceIdBuilder_ != null) { - deviceIdBuilder_.dispose(); + if (deviceIdBuilder_ == null) { + deviceId_ = null; + } else { + deviceId_ = null; deviceIdBuilder_ = null; } - endpointId_ = null; - if (endpointIdBuilder_ != null) { - endpointIdBuilder_.dispose(); + if (endpointIdBuilder_ == null) { + endpointId_ = null; + } else { + endpointId_ = null; endpointIdBuilder_ = null; } - serviceId_ = null; - if (serviceIdBuilder_ != null) { - serviceIdBuilder_.dispose(); + if (serviceIdBuilder_ == null) { + serviceId_ = null; + } else { + serviceId_ = null; serviceIdBuilder_ = null; } - sliceId_ = null; - if (sliceIdBuilder_ != null) { - sliceIdBuilder_.dispose(); + if (sliceIdBuilder_ == null) { + sliceId_ = null; + } else { + sliceId_ = null; sliceIdBuilder_ = null; } - connectionId_ = null; - if (connectionIdBuilder_ != null) { - connectionIdBuilder_.dispose(); + if (connectionIdBuilder_ == null) { + connectionId_ = null; + } else { + connectionId_ = null; connectionIdBuilder_ = null; } - linkId_ = null; - if (linkIdBuilder_ != null) { - linkIdBuilder_.dispose(); + if (linkIdBuilder_ == null) { + linkId_ = null; + } else { + linkId_ = null; linkIdBuilder_ = null; } return this; @@ -903,55 +1069,85 @@ public final class Monitoring { @java.lang.Override public monitoring.Monitoring.KpiDescriptor buildPartial() { monitoring.Monitoring.KpiDescriptor result = new monitoring.Monitoring.KpiDescriptor(this); - buildPartialRepeatedFields(result); - if (bitField0_ != 0) { - buildPartial0(result); + int from_bitField0_ = bitField0_; + if (kpiIdBuilder_ == null) { + result.kpiId_ = kpiId_; + } else { + result.kpiId_ = kpiIdBuilder_.build(); } - onBuilt(); - return result; - } - - private void buildPartialRepeatedFields(monitoring.Monitoring.KpiDescriptor result) { + result.kpiDescription_ = kpiDescription_; if (kpiIdListBuilder_ == null) { - if (((bitField0_ & 0x00000004) != 0)) { + if (((bitField0_ & 0x00000001) != 0)) { kpiIdList_ = java.util.Collections.unmodifiableList(kpiIdList_); - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); } result.kpiIdList_ = kpiIdList_; } else { result.kpiIdList_ = kpiIdListBuilder_.build(); } - } - - private void buildPartial0(monitoring.Monitoring.KpiDescriptor result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build(); - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.kpiDescription_ = kpiDescription_; - } - if (((from_bitField0_ & 0x00000008) != 0)) { - result.kpiSampleType_ = kpiSampleType_; - } - if (((from_bitField0_ & 0x00000010) != 0)) { - result.deviceId_ = deviceIdBuilder_ == null ? deviceId_ : deviceIdBuilder_.build(); + result.kpiSampleType_ = kpiSampleType_; + if (deviceIdBuilder_ == null) { + result.deviceId_ = deviceId_; + } else { + result.deviceId_ = deviceIdBuilder_.build(); } - if (((from_bitField0_ & 0x00000020) != 0)) { - result.endpointId_ = endpointIdBuilder_ == null ? endpointId_ : endpointIdBuilder_.build(); + if (endpointIdBuilder_ == null) { + result.endpointId_ = endpointId_; + } else { + result.endpointId_ = endpointIdBuilder_.build(); } - if (((from_bitField0_ & 0x00000040) != 0)) { - result.serviceId_ = serviceIdBuilder_ == null ? serviceId_ : serviceIdBuilder_.build(); + if (serviceIdBuilder_ == null) { + result.serviceId_ = serviceId_; + } else { + result.serviceId_ = serviceIdBuilder_.build(); } - if (((from_bitField0_ & 0x00000080) != 0)) { - result.sliceId_ = sliceIdBuilder_ == null ? sliceId_ : sliceIdBuilder_.build(); + if (sliceIdBuilder_ == null) { + result.sliceId_ = sliceId_; + } else { + result.sliceId_ = sliceIdBuilder_.build(); } - if (((from_bitField0_ & 0x00000100) != 0)) { - result.connectionId_ = connectionIdBuilder_ == null ? connectionId_ : connectionIdBuilder_.build(); + if (connectionIdBuilder_ == null) { + result.connectionId_ = connectionId_; + } else { + result.connectionId_ = connectionIdBuilder_.build(); } - if (((from_bitField0_ & 0x00000200) != 0)) { - result.linkId_ = linkIdBuilder_ == null ? linkId_ : linkIdBuilder_.build(); + if (linkIdBuilder_ == null) { + result.linkId_ = linkId_; + } else { + result.linkId_ = linkIdBuilder_.build(); } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -972,14 +1168,13 @@ public final class Monitoring { } if (!other.getKpiDescription().isEmpty()) { kpiDescription_ = other.kpiDescription_; - bitField0_ |= 0x00000002; onChanged(); } if (kpiIdListBuilder_ == null) { if (!other.kpiIdList_.isEmpty()) { if (kpiIdList_.isEmpty()) { kpiIdList_ = other.kpiIdList_; - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); } else { ensureKpiIdListIsMutable(); kpiIdList_.addAll(other.kpiIdList_); @@ -992,7 +1187,7 @@ public final class Monitoring { kpiIdListBuilder_.dispose(); kpiIdListBuilder_ = null; kpiIdList_ = other.kpiIdList_; - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); kpiIdListBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getKpiIdListFieldBuilder() : null; } else { kpiIdListBuilder_.addAllMessages(other.kpiIdList_); @@ -1020,7 +1215,7 @@ public final class Monitoring { if (other.hasLinkId()) { mergeLinkId(other.getLinkId()); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -1032,110 +1227,17 @@ public final class Monitoring { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + monitoring.Monitoring.KpiDescriptor parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000001; - break; - } - // case 10 - case 18: - { - kpiDescription_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000002; - break; - } - // case 18 - case 26: - { - monitoring.Monitoring.KpiId m = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry); - if (kpiIdListBuilder_ == null) { - ensureKpiIdListIsMutable(); - kpiIdList_.add(m); - } else { - kpiIdListBuilder_.addMessage(m); - } - break; - } - // case 26 - case 32: - { - kpiSampleType_ = input.readEnum(); - bitField0_ |= 0x00000008; - break; - } - // case 32 - case 42: - { - input.readMessage(getDeviceIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000010; - break; - } - // case 42 - case 50: - { - input.readMessage(getEndpointIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000020; - break; - } - // case 50 - case 58: - { - input.readMessage(getServiceIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000040; - break; - } - // case 58 - case 66: - { - input.readMessage(getSliceIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000080; - break; - } - // case 66 - case 74: - { - input.readMessage(getConnectionIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000100; - break; - } - // case 74 - case 82: - { - input.readMessage(getLinkIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000200; - break; - } - // case 82 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (monitoring.Monitoring.KpiDescriptor) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } @@ -1150,7 +1252,7 @@ public final class Monitoring { * @return Whether the kpiId field is set. */ public boolean hasKpiId() { - return ((bitField0_ & 0x00000001) != 0); + return kpiIdBuilder_ != null || kpiId_ != null; } /** @@ -1174,11 +1276,10 @@ public final class Monitoring { throw new NullPointerException(); } kpiId_ = value; + onChanged(); } else { kpiIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -1188,11 +1289,10 @@ public final class Monitoring { public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) { if (kpiIdBuilder_ == null) { kpiId_ = builderForValue.build(); + onChanged(); } else { kpiIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -1201,16 +1301,15 @@ public final class Monitoring { */ public Builder mergeKpiId(monitoring.Monitoring.KpiId value) { if (kpiIdBuilder_ == null) { - if (((bitField0_ & 0x00000001) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) { - getKpiIdBuilder().mergeFrom(value); + if (kpiId_ != null) { + kpiId_ = monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial(); } else { kpiId_ = value; } + onChanged(); } else { kpiIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -1218,13 +1317,13 @@ public final class Monitoring { * .monitoring.KpiId kpi_id = 1; */ public Builder clearKpiId() { - bitField0_ = (bitField0_ & ~0x00000001); - kpiId_ = null; - if (kpiIdBuilder_ != null) { - kpiIdBuilder_.dispose(); + if (kpiIdBuilder_ == null) { + kpiId_ = null; + onChanged(); + } else { + kpiId_ = null; kpiIdBuilder_ = null; } - onChanged(); return this; } @@ -1232,7 +1331,6 @@ public final class Monitoring { * .monitoring.KpiId kpi_id = 1; */ public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() { - bitField0_ |= 0x00000001; onChanged(); return getKpiIdFieldBuilder().getBuilder(); } @@ -1302,7 +1400,6 @@ public final class Monitoring { throw new NullPointerException(); } kpiDescription_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -1313,7 +1410,6 @@ public final class Monitoring { */ public Builder clearKpiDescription() { kpiDescription_ = getDefaultInstance().getKpiDescription(); - bitField0_ = (bitField0_ & ~0x00000002); onChanged(); return this; } @@ -1329,7 +1425,6 @@ public final class Monitoring { } checkByteStringIsUtf8(value); kpiDescription_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -1337,9 +1432,9 @@ public final class Monitoring { private java.util.List kpiIdList_ = java.util.Collections.emptyList(); private void ensureKpiIdListIsMutable() { - if (!((bitField0_ & 0x00000004) != 0)) { + if (!((bitField0_ & 0x00000001) != 0)) { kpiIdList_ = new java.util.ArrayList(kpiIdList_); - bitField0_ |= 0x00000004; + bitField0_ |= 0x00000001; } } @@ -1491,7 +1586,7 @@ public final class Monitoring { public Builder clearKpiIdList() { if (kpiIdListBuilder_ == null) { kpiIdList_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); onChanged(); } else { kpiIdListBuilder_.clear(); @@ -1565,7 +1660,7 @@ public final class Monitoring { private com.google.protobuf.RepeatedFieldBuilderV3 getKpiIdListFieldBuilder() { if (kpiIdListBuilder_ == null) { - kpiIdListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(kpiIdList_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean()); + kpiIdListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(kpiIdList_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean()); kpiIdList_ = null; } return kpiIdListBuilder_; @@ -1589,7 +1684,6 @@ public final class Monitoring { */ public Builder setKpiSampleTypeValue(int value) { kpiSampleType_ = value; - bitField0_ |= 0x00000008; onChanged(); return this; } @@ -1600,7 +1694,8 @@ public final class Monitoring { */ @java.lang.Override public kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleType() { - kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.forNumber(kpiSampleType_); + @SuppressWarnings("deprecation") + kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.valueOf(kpiSampleType_); return result == null ? kpi_sample_types.KpiSampleTypes.KpiSampleType.UNRECOGNIZED : result; } @@ -1613,7 +1708,6 @@ public final class Monitoring { if (value == null) { throw new NullPointerException(); } - bitField0_ |= 0x00000008; kpiSampleType_ = value.getNumber(); onChanged(); return this; @@ -1624,7 +1718,6 @@ public final class Monitoring { * @return This builder for chaining. */ public Builder clearKpiSampleType() { - bitField0_ = (bitField0_ & ~0x00000008); kpiSampleType_ = 0; onChanged(); return this; @@ -1639,7 +1732,7 @@ public final class Monitoring { * @return Whether the deviceId field is set. */ public boolean hasDeviceId() { - return ((bitField0_ & 0x00000010) != 0); + return deviceIdBuilder_ != null || deviceId_ != null; } /** @@ -1663,11 +1756,10 @@ public final class Monitoring { throw new NullPointerException(); } deviceId_ = value; + onChanged(); } else { deviceIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000010; - onChanged(); return this; } @@ -1677,11 +1769,10 @@ public final class Monitoring { public Builder setDeviceId(context.ContextOuterClass.DeviceId.Builder builderForValue) { if (deviceIdBuilder_ == null) { deviceId_ = builderForValue.build(); + onChanged(); } else { deviceIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000010; - onChanged(); return this; } @@ -1690,16 +1781,15 @@ public final class Monitoring { */ public Builder mergeDeviceId(context.ContextOuterClass.DeviceId value) { if (deviceIdBuilder_ == null) { - if (((bitField0_ & 0x00000010) != 0) && deviceId_ != null && deviceId_ != context.ContextOuterClass.DeviceId.getDefaultInstance()) { - getDeviceIdBuilder().mergeFrom(value); + if (deviceId_ != null) { + deviceId_ = context.ContextOuterClass.DeviceId.newBuilder(deviceId_).mergeFrom(value).buildPartial(); } else { deviceId_ = value; } + onChanged(); } else { deviceIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000010; - onChanged(); return this; } @@ -1707,13 +1797,13 @@ public final class Monitoring { * .context.DeviceId device_id = 5; */ public Builder clearDeviceId() { - bitField0_ = (bitField0_ & ~0x00000010); - deviceId_ = null; - if (deviceIdBuilder_ != null) { - deviceIdBuilder_.dispose(); + if (deviceIdBuilder_ == null) { + deviceId_ = null; + onChanged(); + } else { + deviceId_ = null; deviceIdBuilder_ = null; } - onChanged(); return this; } @@ -1721,7 +1811,6 @@ public final class Monitoring { * .context.DeviceId device_id = 5; */ public context.ContextOuterClass.DeviceId.Builder getDeviceIdBuilder() { - bitField0_ |= 0x00000010; onChanged(); return getDeviceIdFieldBuilder().getBuilder(); } @@ -1757,7 +1846,7 @@ public final class Monitoring { * @return Whether the endpointId field is set. */ public boolean hasEndpointId() { - return ((bitField0_ & 0x00000020) != 0); + return endpointIdBuilder_ != null || endpointId_ != null; } /** @@ -1781,11 +1870,10 @@ public final class Monitoring { throw new NullPointerException(); } endpointId_ = value; + onChanged(); } else { endpointIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000020; - onChanged(); return this; } @@ -1795,11 +1883,10 @@ public final class Monitoring { public Builder setEndpointId(context.ContextOuterClass.EndPointId.Builder builderForValue) { if (endpointIdBuilder_ == null) { endpointId_ = builderForValue.build(); + onChanged(); } else { endpointIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000020; - onChanged(); return this; } @@ -1808,16 +1895,15 @@ public final class Monitoring { */ public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) { if (endpointIdBuilder_ == null) { - if (((bitField0_ & 0x00000020) != 0) && endpointId_ != null && endpointId_ != context.ContextOuterClass.EndPointId.getDefaultInstance()) { - getEndpointIdBuilder().mergeFrom(value); + if (endpointId_ != null) { + endpointId_ = context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial(); } else { endpointId_ = value; } + onChanged(); } else { endpointIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000020; - onChanged(); return this; } @@ -1825,13 +1911,13 @@ public final class Monitoring { * .context.EndPointId endpoint_id = 6; */ public Builder clearEndpointId() { - bitField0_ = (bitField0_ & ~0x00000020); - endpointId_ = null; - if (endpointIdBuilder_ != null) { - endpointIdBuilder_.dispose(); + if (endpointIdBuilder_ == null) { + endpointId_ = null; + onChanged(); + } else { + endpointId_ = null; endpointIdBuilder_ = null; } - onChanged(); return this; } @@ -1839,7 +1925,6 @@ public final class Monitoring { * .context.EndPointId endpoint_id = 6; */ public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() { - bitField0_ |= 0x00000020; onChanged(); return getEndpointIdFieldBuilder().getBuilder(); } @@ -1875,7 +1960,7 @@ public final class Monitoring { * @return Whether the serviceId field is set. */ public boolean hasServiceId() { - return ((bitField0_ & 0x00000040) != 0); + return serviceIdBuilder_ != null || serviceId_ != null; } /** @@ -1899,11 +1984,10 @@ public final class Monitoring { throw new NullPointerException(); } serviceId_ = value; + onChanged(); } else { serviceIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000040; - onChanged(); return this; } @@ -1913,11 +1997,10 @@ public final class Monitoring { public Builder setServiceId(context.ContextOuterClass.ServiceId.Builder builderForValue) { if (serviceIdBuilder_ == null) { serviceId_ = builderForValue.build(); + onChanged(); } else { serviceIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000040; - onChanged(); return this; } @@ -1926,16 +2009,15 @@ public final class Monitoring { */ public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) { if (serviceIdBuilder_ == null) { - if (((bitField0_ & 0x00000040) != 0) && serviceId_ != null && serviceId_ != context.ContextOuterClass.ServiceId.getDefaultInstance()) { - getServiceIdBuilder().mergeFrom(value); + if (serviceId_ != null) { + serviceId_ = context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial(); } else { serviceId_ = value; } + onChanged(); } else { serviceIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000040; - onChanged(); return this; } @@ -1943,13 +2025,13 @@ public final class Monitoring { * .context.ServiceId service_id = 7; */ public Builder clearServiceId() { - bitField0_ = (bitField0_ & ~0x00000040); - serviceId_ = null; - if (serviceIdBuilder_ != null) { - serviceIdBuilder_.dispose(); + if (serviceIdBuilder_ == null) { + serviceId_ = null; + onChanged(); + } else { + serviceId_ = null; serviceIdBuilder_ = null; } - onChanged(); return this; } @@ -1957,7 +2039,6 @@ public final class Monitoring { * .context.ServiceId service_id = 7; */ public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() { - bitField0_ |= 0x00000040; onChanged(); return getServiceIdFieldBuilder().getBuilder(); } @@ -1993,7 +2074,7 @@ public final class Monitoring { * @return Whether the sliceId field is set. */ public boolean hasSliceId() { - return ((bitField0_ & 0x00000080) != 0); + return sliceIdBuilder_ != null || sliceId_ != null; } /** @@ -2017,11 +2098,10 @@ public final class Monitoring { throw new NullPointerException(); } sliceId_ = value; + onChanged(); } else { sliceIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000080; - onChanged(); return this; } @@ -2031,11 +2111,10 @@ public final class Monitoring { public Builder setSliceId(context.ContextOuterClass.SliceId.Builder builderForValue) { if (sliceIdBuilder_ == null) { sliceId_ = builderForValue.build(); + onChanged(); } else { sliceIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000080; - onChanged(); return this; } @@ -2044,16 +2123,15 @@ public final class Monitoring { */ public Builder mergeSliceId(context.ContextOuterClass.SliceId value) { if (sliceIdBuilder_ == null) { - if (((bitField0_ & 0x00000080) != 0) && sliceId_ != null && sliceId_ != context.ContextOuterClass.SliceId.getDefaultInstance()) { - getSliceIdBuilder().mergeFrom(value); + if (sliceId_ != null) { + sliceId_ = context.ContextOuterClass.SliceId.newBuilder(sliceId_).mergeFrom(value).buildPartial(); } else { sliceId_ = value; } + onChanged(); } else { sliceIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000080; - onChanged(); return this; } @@ -2061,13 +2139,13 @@ public final class Monitoring { * .context.SliceId slice_id = 8; */ public Builder clearSliceId() { - bitField0_ = (bitField0_ & ~0x00000080); - sliceId_ = null; - if (sliceIdBuilder_ != null) { - sliceIdBuilder_.dispose(); + if (sliceIdBuilder_ == null) { + sliceId_ = null; + onChanged(); + } else { + sliceId_ = null; sliceIdBuilder_ = null; } - onChanged(); return this; } @@ -2075,7 +2153,6 @@ public final class Monitoring { * .context.SliceId slice_id = 8; */ public context.ContextOuterClass.SliceId.Builder getSliceIdBuilder() { - bitField0_ |= 0x00000080; onChanged(); return getSliceIdFieldBuilder().getBuilder(); } @@ -2111,7 +2188,7 @@ public final class Monitoring { * @return Whether the connectionId field is set. */ public boolean hasConnectionId() { - return ((bitField0_ & 0x00000100) != 0); + return connectionIdBuilder_ != null || connectionId_ != null; } /** @@ -2135,11 +2212,10 @@ public final class Monitoring { throw new NullPointerException(); } connectionId_ = value; + onChanged(); } else { connectionIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000100; - onChanged(); return this; } @@ -2149,11 +2225,10 @@ public final class Monitoring { public Builder setConnectionId(context.ContextOuterClass.ConnectionId.Builder builderForValue) { if (connectionIdBuilder_ == null) { connectionId_ = builderForValue.build(); + onChanged(); } else { connectionIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000100; - onChanged(); return this; } @@ -2162,16 +2237,15 @@ public final class Monitoring { */ public Builder mergeConnectionId(context.ContextOuterClass.ConnectionId value) { if (connectionIdBuilder_ == null) { - if (((bitField0_ & 0x00000100) != 0) && connectionId_ != null && connectionId_ != context.ContextOuterClass.ConnectionId.getDefaultInstance()) { - getConnectionIdBuilder().mergeFrom(value); + if (connectionId_ != null) { + connectionId_ = context.ContextOuterClass.ConnectionId.newBuilder(connectionId_).mergeFrom(value).buildPartial(); } else { connectionId_ = value; } + onChanged(); } else { connectionIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000100; - onChanged(); return this; } @@ -2179,13 +2253,13 @@ public final class Monitoring { * .context.ConnectionId connection_id = 9; */ public Builder clearConnectionId() { - bitField0_ = (bitField0_ & ~0x00000100); - connectionId_ = null; - if (connectionIdBuilder_ != null) { - connectionIdBuilder_.dispose(); + if (connectionIdBuilder_ == null) { + connectionId_ = null; + onChanged(); + } else { + connectionId_ = null; connectionIdBuilder_ = null; } - onChanged(); return this; } @@ -2193,7 +2267,6 @@ public final class Monitoring { * .context.ConnectionId connection_id = 9; */ public context.ContextOuterClass.ConnectionId.Builder getConnectionIdBuilder() { - bitField0_ |= 0x00000100; onChanged(); return getConnectionIdFieldBuilder().getBuilder(); } @@ -2229,7 +2302,7 @@ public final class Monitoring { * @return Whether the linkId field is set. */ public boolean hasLinkId() { - return ((bitField0_ & 0x00000200) != 0); + return linkIdBuilder_ != null || linkId_ != null; } /** @@ -2253,11 +2326,10 @@ public final class Monitoring { throw new NullPointerException(); } linkId_ = value; + onChanged(); } else { linkIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000200; - onChanged(); return this; } @@ -2267,11 +2339,10 @@ public final class Monitoring { public Builder setLinkId(context.ContextOuterClass.LinkId.Builder builderForValue) { if (linkIdBuilder_ == null) { linkId_ = builderForValue.build(); + onChanged(); } else { linkIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000200; - onChanged(); return this; } @@ -2280,16 +2351,15 @@ public final class Monitoring { */ public Builder mergeLinkId(context.ContextOuterClass.LinkId value) { if (linkIdBuilder_ == null) { - if (((bitField0_ & 0x00000200) != 0) && linkId_ != null && linkId_ != context.ContextOuterClass.LinkId.getDefaultInstance()) { - getLinkIdBuilder().mergeFrom(value); + if (linkId_ != null) { + linkId_ = context.ContextOuterClass.LinkId.newBuilder(linkId_).mergeFrom(value).buildPartial(); } else { linkId_ = value; } + onChanged(); } else { linkIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000200; - onChanged(); return this; } @@ -2297,13 +2367,13 @@ public final class Monitoring { * .context.LinkId link_id = 10; */ public Builder clearLinkId() { - bitField0_ = (bitField0_ & ~0x00000200); - linkId_ = null; - if (linkIdBuilder_ != null) { - linkIdBuilder_.dispose(); + if (linkIdBuilder_ == null) { + linkId_ = null; + onChanged(); + } else { + linkId_ = null; linkIdBuilder_ = null; } - onChanged(); return this; } @@ -2311,7 +2381,6 @@ public final class Monitoring { * .context.LinkId link_id = 10; */ public context.ContextOuterClass.LinkId.Builder getLinkIdBuilder() { - bitField0_ |= 0x00000200; onChanged(); return getLinkIdFieldBuilder().getBuilder(); } @@ -2365,17 +2434,7 @@ public final class Monitoring { @java.lang.Override public KpiDescriptor parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new KpiDescriptor(input, extensionRegistry); } }; @@ -2453,17 +2512,78 @@ public final class Monitoring { return new MonitorKpiRequest(); } - public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_descriptor; - } - @java.lang.Override - protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { - return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_fieldAccessorTable.ensureFieldAccessorsInitialized(monitoring.Monitoring.MonitorKpiRequest.class, monitoring.Monitoring.MonitorKpiRequest.Builder.class); + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; } - public static final int KPI_ID_FIELD_NUMBER = 1; - + private MonitorKpiRequest(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + monitoring.Monitoring.KpiId.Builder subBuilder = null; + if (kpiId_ != null) { + subBuilder = kpiId_.toBuilder(); + } + kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(kpiId_); + kpiId_ = subBuilder.buildPartial(); + } + break; + } + case 21: + { + monitoringWindowS_ = input.readFloat(); + break; + } + case 29: + { + samplingRateS_ = input.readFloat(); + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_fieldAccessorTable.ensureFieldAccessorsInitialized(monitoring.Monitoring.MonitorKpiRequest.class, monitoring.Monitoring.MonitorKpiRequest.Builder.class); + } + + public static final int KPI_ID_FIELD_NUMBER = 1; + private monitoring.Monitoring.KpiId kpiId_; /** @@ -2489,12 +2609,12 @@ public final class Monitoring { */ @java.lang.Override public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() { - return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_; + return getKpiId(); } public static final int MONITORING_WINDOW_S_FIELD_NUMBER = 2; - private float monitoringWindowS_ = 0F; + private float monitoringWindowS_; /** * float monitoring_window_s = 2; @@ -2507,7 +2627,7 @@ public final class Monitoring { public static final int SAMPLING_RATE_S_FIELD_NUMBER = 3; - private float samplingRateS_ = 0F; + private float samplingRateS_; /** *
@@ -2540,13 +2660,13 @@ public final class Monitoring {
             if (kpiId_ != null) {
                 output.writeMessage(1, getKpiId());
             }
-            if (java.lang.Float.floatToRawIntBits(monitoringWindowS_) != 0) {
+            if (monitoringWindowS_ != 0F) {
                 output.writeFloat(2, monitoringWindowS_);
             }
-            if (java.lang.Float.floatToRawIntBits(samplingRateS_) != 0) {
+            if (samplingRateS_ != 0F) {
                 output.writeFloat(3, samplingRateS_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -2558,13 +2678,13 @@ public final class Monitoring {
             if (kpiId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getKpiId());
             }
-            if (java.lang.Float.floatToRawIntBits(monitoringWindowS_) != 0) {
+            if (monitoringWindowS_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(2, monitoringWindowS_);
             }
-            if (java.lang.Float.floatToRawIntBits(samplingRateS_) != 0) {
+            if (samplingRateS_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(3, samplingRateS_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -2588,7 +2708,7 @@ public final class Monitoring {
                 return false;
             if (java.lang.Float.floatToIntBits(getSamplingRateS()) != java.lang.Float.floatToIntBits(other.getSamplingRateS()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -2608,7 +2728,7 @@ public final class Monitoring {
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getMonitoringWindowS());
             hash = (37 * hash) + SAMPLING_RATE_S_FIELD_NUMBER;
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getSamplingRateS());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -2702,19 +2822,26 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.MonitorKpiRequest.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
                 monitoringWindowS_ = 0F;
@@ -2744,24 +2871,45 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.MonitorKpiRequest buildPartial() {
                 monitoring.Monitoring.MonitorKpiRequest result = new monitoring.Monitoring.MonitorKpiRequest(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (kpiIdBuilder_ == null) {
+                    result.kpiId_ = kpiId_;
+                } else {
+                    result.kpiId_ = kpiIdBuilder_.build();
                 }
+                result.monitoringWindowS_ = monitoringWindowS_;
+                result.samplingRateS_ = samplingRateS_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.MonitorKpiRequest result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.monitoringWindowS_ = monitoringWindowS_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.samplingRateS_ = samplingRateS_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -2786,7 +2934,7 @@ public final class Monitoring {
                 if (other.getSamplingRateS() != 0F) {
                     setSamplingRateS(other.getSamplingRateS());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -2798,61 +2946,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.MonitorKpiRequest parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 21:
-                                {
-                                    monitoringWindowS_ = input.readFloat();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 21
-                            case 29:
-                                {
-                                    samplingRateS_ = input.readFloat();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 29
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.MonitorKpiRequest) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.KpiId kpiId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 kpiIdBuilder_;
@@ -2862,7 +2969,7 @@ public final class Monitoring {
              * @return Whether the kpiId field is set.
              */
             public boolean hasKpiId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return kpiIdBuilder_ != null || kpiId_ != null;
             }
 
             /**
@@ -2886,11 +2993,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiId_ = value;
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -2900,11 +3006,10 @@ public final class Monitoring {
             public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) {
                 if (kpiIdBuilder_ == null) {
                     kpiId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -2913,16 +3018,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiId(monitoring.Monitoring.KpiId value) {
                 if (kpiIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) {
-                        getKpiIdBuilder().mergeFrom(value);
+                    if (kpiId_ != null) {
+                        kpiId_ = monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial();
                     } else {
                         kpiId_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -2930,13 +3034,13 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 1;
              */
             public Builder clearKpiId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                    onChanged();
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -2944,7 +3048,6 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 1;
              */
             public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getKpiIdFieldBuilder().getBuilder();
             }
@@ -2989,7 +3092,6 @@ public final class Monitoring {
              */
             public Builder setMonitoringWindowS(float value) {
                 monitoringWindowS_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -2999,7 +3101,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearMonitoringWindowS() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 monitoringWindowS_ = 0F;
                 onChanged();
                 return this;
@@ -3031,7 +3132,6 @@ public final class Monitoring {
              */
             public Builder setSamplingRateS(float value) {
                 samplingRateS_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -3045,7 +3145,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearSamplingRateS() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 samplingRateS_ = 0F;
                 onChanged();
                 return this;
@@ -3078,17 +3177,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public MonitorKpiRequest parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new MonitorKpiRequest(input, extensionRegistry);
             }
         };
 
@@ -3233,6 +3322,93 @@ public final class Monitoring {
             return new KpiQuery();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private KpiQuery(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    kpiIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                kpiIds_.add(input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 21:
+                            {
+                                monitoringWindowS_ = input.readFloat();
+                                break;
+                            }
+                        case 24:
+                            {
+                                lastNSamples_ = input.readUInt32();
+                                break;
+                            }
+                        case 34:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (startTimestamp_ != null) {
+                                    subBuilder = startTimestamp_.toBuilder();
+                                }
+                                startTimestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(startTimestamp_);
+                                    startTimestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 42:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (endTimestamp_ != null) {
+                                    subBuilder = endTimestamp_.toBuilder();
+                                }
+                                endTimestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endTimestamp_);
+                                    endTimestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    kpiIds_ = java.util.Collections.unmodifiableList(kpiIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_KpiQuery_descriptor;
         }
@@ -3244,7 +3420,6 @@ public final class Monitoring {
 
         public static final int KPI_IDS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List kpiIds_;
 
         /**
@@ -3289,7 +3464,7 @@ public final class Monitoring {
 
         public static final int MONITORING_WINDOW_S_FIELD_NUMBER = 2;
 
-        private float monitoringWindowS_ = 0F;
+        private float monitoringWindowS_;
 
         /**
          * float monitoring_window_s = 2;
@@ -3302,7 +3477,7 @@ public final class Monitoring {
 
         public static final int LAST_N_SAMPLES_FIELD_NUMBER = 3;
 
-        private int lastNSamples_ = 0;
+        private int lastNSamples_;
 
         /**
          * 
@@ -3356,7 +3531,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getStartTimestampOrBuilder() {
-            return startTimestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : startTimestamp_;
+            return getStartTimestamp();
         }
 
         public static final int END_TIMESTAMP_FIELD_NUMBER = 5;
@@ -3398,7 +3573,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getEndTimestampOrBuilder() {
-            return endTimestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : endTimestamp_;
+            return getEndTimestamp();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -3419,7 +3594,7 @@ public final class Monitoring {
             for (int i = 0; i < kpiIds_.size(); i++) {
                 output.writeMessage(1, kpiIds_.get(i));
             }
-            if (java.lang.Float.floatToRawIntBits(monitoringWindowS_) != 0) {
+            if (monitoringWindowS_ != 0F) {
                 output.writeFloat(2, monitoringWindowS_);
             }
             if (lastNSamples_ != 0) {
@@ -3431,7 +3606,7 @@ public final class Monitoring {
             if (endTimestamp_ != null) {
                 output.writeMessage(5, getEndTimestamp());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -3443,7 +3618,7 @@ public final class Monitoring {
             for (int i = 0; i < kpiIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, kpiIds_.get(i));
             }
-            if (java.lang.Float.floatToRawIntBits(monitoringWindowS_) != 0) {
+            if (monitoringWindowS_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(2, monitoringWindowS_);
             }
             if (lastNSamples_ != 0) {
@@ -3455,7 +3630,7 @@ public final class Monitoring {
             if (endTimestamp_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, getEndTimestamp());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -3487,7 +3662,7 @@ public final class Monitoring {
                 if (!getEndTimestamp().equals(other.getEndTimestamp()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -3515,7 +3690,7 @@ public final class Monitoring {
                 hash = (37 * hash) + END_TIMESTAMP_FIELD_NUMBER;
                 hash = (53 * hash) + getEndTimestamp().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -3609,33 +3784,41 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.KpiQuery.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getKpiIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (kpiIdsBuilder_ == null) {
                     kpiIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    kpiIds_ = null;
                     kpiIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 monitoringWindowS_ = 0F;
                 lastNSamples_ = 0;
-                startTimestamp_ = null;
-                if (startTimestampBuilder_ != null) {
-                    startTimestampBuilder_.dispose();
+                if (startTimestampBuilder_ == null) {
+                    startTimestamp_ = null;
+                } else {
+                    startTimestamp_ = null;
                     startTimestampBuilder_ = null;
                 }
-                endTimestamp_ = null;
-                if (endTimestampBuilder_ != null) {
-                    endTimestampBuilder_.dispose();
+                if (endTimestampBuilder_ == null) {
+                    endTimestamp_ = null;
+                } else {
+                    endTimestamp_ = null;
                     endTimestampBuilder_ = null;
                 }
                 return this;
@@ -3663,15 +3846,7 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.KpiQuery buildPartial() {
                 monitoring.Monitoring.KpiQuery result = new monitoring.Monitoring.KpiQuery(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(monitoring.Monitoring.KpiQuery result) {
+                int from_bitField0_ = bitField0_;
                 if (kpiIdsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         kpiIds_ = java.util.Collections.unmodifiableList(kpiIds_);
@@ -3681,22 +3856,50 @@ public final class Monitoring {
                 } else {
                     result.kpiIds_ = kpiIdsBuilder_.build();
                 }
-            }
-
-            private void buildPartial0(monitoring.Monitoring.KpiQuery result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.monitoringWindowS_ = monitoringWindowS_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.lastNSamples_ = lastNSamples_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.startTimestamp_ = startTimestampBuilder_ == null ? startTimestamp_ : startTimestampBuilder_.build();
+                result.monitoringWindowS_ = monitoringWindowS_;
+                result.lastNSamples_ = lastNSamples_;
+                if (startTimestampBuilder_ == null) {
+                    result.startTimestamp_ = startTimestamp_;
+                } else {
+                    result.startTimestamp_ = startTimestampBuilder_.build();
                 }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.endTimestamp_ = endTimestampBuilder_ == null ? endTimestamp_ : endTimestampBuilder_.build();
+                if (endTimestampBuilder_ == null) {
+                    result.endTimestamp_ = endTimestamp_;
+                } else {
+                    result.endTimestamp_ = endTimestampBuilder_.build();
                 }
+                onBuilt();
+                return result;
+            }
+
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -3748,7 +3951,7 @@ public final class Monitoring {
                 if (other.hasEndTimestamp()) {
                     mergeEndTimestamp(other.getEndTimestamp());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -3760,75 +3963,17 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.KpiQuery parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    monitoring.Monitoring.KpiId m = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry);
-                                    if (kpiIdsBuilder_ == null) {
-                                        ensureKpiIdsIsMutable();
-                                        kpiIds_.add(m);
-                                    } else {
-                                        kpiIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            case 21:
-                                {
-                                    monitoringWindowS_ = input.readFloat();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 21
-                            case 24:
-                                {
-                                    lastNSamples_ = input.readUInt32();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 34:
-                                {
-                                    input.readMessage(getStartTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    input.readMessage(getEndTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 42
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.KpiQuery) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -4089,7 +4234,6 @@ public final class Monitoring {
              */
             public Builder setMonitoringWindowS(float value) {
                 monitoringWindowS_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -4099,7 +4243,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearMonitoringWindowS() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 monitoringWindowS_ = 0F;
                 onChanged();
                 return this;
@@ -4131,7 +4274,6 @@ public final class Monitoring {
              */
             public Builder setLastNSamples(int value) {
                 lastNSamples_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -4145,7 +4287,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearLastNSamples() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 lastNSamples_ = 0;
                 onChanged();
                 return this;
@@ -4164,7 +4305,7 @@ public final class Monitoring {
              * @return Whether the startTimestamp field is set.
              */
             public boolean hasStartTimestamp() {
-                return ((bitField0_ & 0x00000008) != 0);
+                return startTimestampBuilder_ != null || startTimestamp_ != null;
             }
 
             /**
@@ -4196,11 +4337,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     startTimestamp_ = value;
+                    onChanged();
                 } else {
                     startTimestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -4214,11 +4354,10 @@ public final class Monitoring {
             public Builder setStartTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (startTimestampBuilder_ == null) {
                     startTimestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     startTimestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -4231,16 +4370,15 @@ public final class Monitoring {
              */
             public Builder mergeStartTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (startTimestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0) && startTimestamp_ != null && startTimestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getStartTimestampBuilder().mergeFrom(value);
+                    if (startTimestamp_ != null) {
+                        startTimestamp_ = context.ContextOuterClass.Timestamp.newBuilder(startTimestamp_).mergeFrom(value).buildPartial();
                     } else {
                         startTimestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     startTimestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -4252,13 +4390,13 @@ public final class Monitoring {
              * .context.Timestamp start_timestamp = 4;
              */
             public Builder clearStartTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000008);
-                startTimestamp_ = null;
-                if (startTimestampBuilder_ != null) {
-                    startTimestampBuilder_.dispose();
+                if (startTimestampBuilder_ == null) {
+                    startTimestamp_ = null;
+                    onChanged();
+                } else {
+                    startTimestamp_ = null;
                     startTimestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -4270,7 +4408,6 @@ public final class Monitoring {
              * .context.Timestamp start_timestamp = 4;
              */
             public context.ContextOuterClass.Timestamp.Builder getStartTimestampBuilder() {
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return getStartTimestampFieldBuilder().getBuilder();
             }
@@ -4318,7 +4455,7 @@ public final class Monitoring {
              * @return Whether the endTimestamp field is set.
              */
             public boolean hasEndTimestamp() {
-                return ((bitField0_ & 0x00000010) != 0);
+                return endTimestampBuilder_ != null || endTimestamp_ != null;
             }
 
             /**
@@ -4350,11 +4487,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     endTimestamp_ = value;
+                    onChanged();
                 } else {
                     endTimestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -4368,11 +4504,10 @@ public final class Monitoring {
             public Builder setEndTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (endTimestampBuilder_ == null) {
                     endTimestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endTimestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -4385,16 +4520,15 @@ public final class Monitoring {
              */
             public Builder mergeEndTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (endTimestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000010) != 0) && endTimestamp_ != null && endTimestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getEndTimestampBuilder().mergeFrom(value);
+                    if (endTimestamp_ != null) {
+                        endTimestamp_ = context.ContextOuterClass.Timestamp.newBuilder(endTimestamp_).mergeFrom(value).buildPartial();
                     } else {
                         endTimestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     endTimestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -4406,13 +4540,13 @@ public final class Monitoring {
              * .context.Timestamp end_timestamp = 5;
              */
             public Builder clearEndTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000010);
-                endTimestamp_ = null;
-                if (endTimestampBuilder_ != null) {
-                    endTimestampBuilder_.dispose();
+                if (endTimestampBuilder_ == null) {
+                    endTimestamp_ = null;
+                    onChanged();
+                } else {
+                    endTimestamp_ = null;
                     endTimestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -4424,7 +4558,6 @@ public final class Monitoring {
              * .context.Timestamp end_timestamp = 5;
              */
             public context.ContextOuterClass.Timestamp.Builder getEndTimestampBuilder() {
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return getEndTimestampFieldBuilder().getBuilder();
             }
@@ -4486,17 +4619,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public KpiQuery parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new KpiQuery(input, extensionRegistry);
             }
         };
 
@@ -4579,6 +4702,70 @@ public final class Monitoring {
             return new RawKpi();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private RawKpi(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (timestamp_ != null) {
+                                    subBuilder = timestamp_.toBuilder();
+                                }
+                                timestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(timestamp_);
+                                    timestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                monitoring.Monitoring.KpiValue.Builder subBuilder = null;
+                                if (kpiValue_ != null) {
+                                    subBuilder = kpiValue_.toBuilder();
+                                }
+                                kpiValue_ = input.readMessage(monitoring.Monitoring.KpiValue.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiValue_);
+                                    kpiValue_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_RawKpi_descriptor;
         }
@@ -4615,7 +4802,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-            return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+            return getTimestamp();
         }
 
         public static final int KPI_VALUE_FIELD_NUMBER = 2;
@@ -4645,7 +4832,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder() {
-            return kpiValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_;
+            return getKpiValue();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -4669,7 +4856,7 @@ public final class Monitoring {
             if (kpiValue_ != null) {
                 output.writeMessage(2, getKpiValue());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -4684,7 +4871,7 @@ public final class Monitoring {
             if (kpiValue_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getKpiValue());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -4710,7 +4897,7 @@ public final class Monitoring {
                 if (!getKpiValue().equals(other.getKpiValue()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -4730,7 +4917,7 @@ public final class Monitoring {
                 hash = (37 * hash) + KPI_VALUE_FIELD_NUMBER;
                 hash = (53 * hash) + getKpiValue().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -4828,24 +5015,32 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.RawKpi.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
-                kpiValue_ = null;
-                if (kpiValueBuilder_ != null) {
-                    kpiValueBuilder_.dispose();
+                if (kpiValueBuilder_ == null) {
+                    kpiValue_ = null;
+                } else {
+                    kpiValue_ = null;
                     kpiValueBuilder_ = null;
                 }
                 return this;
@@ -4873,43 +5068,70 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.RawKpi buildPartial() {
                 monitoring.Monitoring.RawKpi result = new monitoring.Monitoring.RawKpi(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (timestampBuilder_ == null) {
+                    result.timestamp_ = timestamp_;
+                } else {
+                    result.timestamp_ = timestampBuilder_.build();
+                }
+                if (kpiValueBuilder_ == null) {
+                    result.kpiValue_ = kpiValue_;
+                } else {
+                    result.kpiValue_ = kpiValueBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.RawKpi result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.timestamp_ = timestampBuilder_ == null ? timestamp_ : timestampBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.kpiValue_ = kpiValueBuilder_ == null ? kpiValue_ : kpiValueBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
             }
 
             @java.lang.Override
-            public Builder mergeFrom(com.google.protobuf.Message other) {
-                if (other instanceof monitoring.Monitoring.RawKpi) {
-                    return mergeFrom((monitoring.Monitoring.RawKpi) other);
-                } else {
-                    super.mergeFrom(other);
-                    return this;
-                }
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
             }
 
-            public Builder mergeFrom(monitoring.Monitoring.RawKpi other) {
-                if (other == monitoring.Monitoring.RawKpi.getDefaultInstance())
-                    return this;
-                if (other.hasTimestamp()) {
-                    mergeTimestamp(other.getTimestamp());
-                }
-                if (other.hasKpiValue()) {
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof monitoring.Monitoring.RawKpi) {
+                    return mergeFrom((monitoring.Monitoring.RawKpi) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(monitoring.Monitoring.RawKpi other) {
+                if (other == monitoring.Monitoring.RawKpi.getDefaultInstance())
+                    return this;
+                if (other.hasTimestamp()) {
+                    mergeTimestamp(other.getTimestamp());
+                }
+                if (other.hasKpiValue()) {
                     mergeKpiValue(other.getKpiValue());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -4921,54 +5143,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.RawKpi parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getKpiValueFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.RawKpi) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Timestamp timestamp_;
 
             private com.google.protobuf.SingleFieldBuilderV3 timestampBuilder_;
@@ -4978,7 +5166,7 @@ public final class Monitoring {
              * @return Whether the timestamp field is set.
              */
             public boolean hasTimestamp() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return timestampBuilder_ != null || timestamp_ != null;
             }
 
             /**
@@ -5002,11 +5190,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     timestamp_ = value;
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -5016,11 +5203,10 @@ public final class Monitoring {
             public Builder setTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (timestampBuilder_ == null) {
                     timestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -5029,16 +5215,15 @@ public final class Monitoring {
              */
             public Builder mergeTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (timestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && timestamp_ != null && timestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getTimestampBuilder().mergeFrom(value);
+                    if (timestamp_ != null) {
+                        timestamp_ = context.ContextOuterClass.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial();
                     } else {
                         timestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     timestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -5046,13 +5231,13 @@ public final class Monitoring {
              * .context.Timestamp timestamp = 1;
              */
             public Builder clearTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                    onChanged();
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -5060,7 +5245,6 @@ public final class Monitoring {
              * .context.Timestamp timestamp = 1;
              */
             public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getTimestampFieldBuilder().getBuilder();
             }
@@ -5096,7 +5280,7 @@ public final class Monitoring {
              * @return Whether the kpiValue field is set.
              */
             public boolean hasKpiValue() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return kpiValueBuilder_ != null || kpiValue_ != null;
             }
 
             /**
@@ -5120,11 +5304,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiValue_ = value;
+                    onChanged();
                 } else {
                     kpiValueBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -5134,11 +5317,10 @@ public final class Monitoring {
             public Builder setKpiValue(monitoring.Monitoring.KpiValue.Builder builderForValue) {
                 if (kpiValueBuilder_ == null) {
                     kpiValue_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiValueBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -5147,16 +5329,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiValue(monitoring.Monitoring.KpiValue value) {
                 if (kpiValueBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && kpiValue_ != null && kpiValue_ != monitoring.Monitoring.KpiValue.getDefaultInstance()) {
-                        getKpiValueBuilder().mergeFrom(value);
+                    if (kpiValue_ != null) {
+                        kpiValue_ = monitoring.Monitoring.KpiValue.newBuilder(kpiValue_).mergeFrom(value).buildPartial();
                     } else {
                         kpiValue_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiValueBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -5164,13 +5345,13 @@ public final class Monitoring {
              * .monitoring.KpiValue kpi_value = 2;
              */
             public Builder clearKpiValue() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                kpiValue_ = null;
-                if (kpiValueBuilder_ != null) {
-                    kpiValueBuilder_.dispose();
+                if (kpiValueBuilder_ == null) {
+                    kpiValue_ = null;
+                    onChanged();
+                } else {
+                    kpiValue_ = null;
                     kpiValueBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -5178,7 +5359,6 @@ public final class Monitoring {
              * .monitoring.KpiValue kpi_value = 2;
              */
             public monitoring.Monitoring.KpiValue.Builder getKpiValueBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getKpiValueFieldBuilder().getBuilder();
             }
@@ -5232,17 +5412,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public RawKpi parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new RawKpi(input, extensionRegistry);
             }
         };
 
@@ -5334,6 +5504,70 @@ public final class Monitoring {
             return new RawKpiList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private RawKpiList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.KpiId.Builder subBuilder = null;
+                                if (kpiId_ != null) {
+                                    subBuilder = kpiId_.toBuilder();
+                                }
+                                kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiId_);
+                                    kpiId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    rawKpis_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                rawKpis_.add(input.readMessage(monitoring.Monitoring.RawKpi.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    rawKpis_ = java.util.Collections.unmodifiableList(rawKpis_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_RawKpiList_descriptor;
         }
@@ -5370,12 +5604,11 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
-            return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+            return getKpiId();
         }
 
         public static final int RAW_KPIS_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
         private java.util.List rawKpis_;
 
         /**
@@ -5439,7 +5672,7 @@ public final class Monitoring {
             for (int i = 0; i < rawKpis_.size(); i++) {
                 output.writeMessage(2, rawKpis_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -5454,7 +5687,7 @@ public final class Monitoring {
             for (int i = 0; i < rawKpis_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, rawKpis_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -5476,7 +5709,7 @@ public final class Monitoring {
             }
             if (!getRawKpisList().equals(other.getRawKpisList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -5496,7 +5729,7 @@ public final class Monitoring {
                 hash = (37 * hash) + RAW_KPIS_FIELD_NUMBER;
                 hash = (53 * hash) + getRawKpisList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -5594,28 +5827,35 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.RawKpiList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getRawKpisFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
                 if (rawKpisBuilder_ == null) {
                     rawKpis_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    rawKpis_ = null;
                     rawKpisBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000002);
                 return this;
             }
 
@@ -5641,31 +5881,53 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.RawKpiList buildPartial() {
                 monitoring.Monitoring.RawKpiList result = new monitoring.Monitoring.RawKpiList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (kpiIdBuilder_ == null) {
+                    result.kpiId_ = kpiId_;
+                } else {
+                    result.kpiId_ = kpiIdBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(monitoring.Monitoring.RawKpiList result) {
                 if (rawKpisBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         rawKpis_ = java.util.Collections.unmodifiableList(rawKpis_);
-                        bitField0_ = (bitField0_ & ~0x00000002);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.rawKpis_ = rawKpis_;
                 } else {
                     result.rawKpis_ = rawKpisBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.RawKpiList result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -5688,7 +5950,7 @@ public final class Monitoring {
                     if (!other.rawKpis_.isEmpty()) {
                         if (rawKpis_.isEmpty()) {
                             rawKpis_ = other.rawKpis_;
-                            bitField0_ = (bitField0_ & ~0x00000002);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureRawKpisIsMutable();
                             rawKpis_.addAll(other.rawKpis_);
@@ -5701,14 +5963,14 @@ public final class Monitoring {
                             rawKpisBuilder_.dispose();
                             rawKpisBuilder_ = null;
                             rawKpis_ = other.rawKpis_;
-                            bitField0_ = (bitField0_ & ~0x00000002);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             rawKpisBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getRawKpisFieldBuilder() : null;
                         } else {
                             rawKpisBuilder_.addAllMessages(other.rawKpis_);
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -5720,54 +5982,17 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.RawKpiList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    monitoring.Monitoring.RawKpi m = input.readMessage(monitoring.Monitoring.RawKpi.parser(), extensionRegistry);
-                                    if (rawKpisBuilder_ == null) {
-                                        ensureRawKpisIsMutable();
-                                        rawKpis_.add(m);
-                                    } else {
-                                        rawKpisBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.RawKpiList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -5782,7 +6007,7 @@ public final class Monitoring {
              * @return Whether the kpiId field is set.
              */
             public boolean hasKpiId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return kpiIdBuilder_ != null || kpiId_ != null;
             }
 
             /**
@@ -5806,11 +6031,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiId_ = value;
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -5820,11 +6044,10 @@ public final class Monitoring {
             public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) {
                 if (kpiIdBuilder_ == null) {
                     kpiId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -5833,16 +6056,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiId(monitoring.Monitoring.KpiId value) {
                 if (kpiIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) {
-                        getKpiIdBuilder().mergeFrom(value);
+                    if (kpiId_ != null) {
+                        kpiId_ = monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial();
                     } else {
                         kpiId_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -5850,13 +6072,13 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 1;
              */
             public Builder clearKpiId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                    onChanged();
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -5864,7 +6086,6 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 1;
              */
             public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getKpiIdFieldBuilder().getBuilder();
             }
@@ -5894,9 +6115,9 @@ public final class Monitoring {
             private java.util.List rawKpis_ = java.util.Collections.emptyList();
 
             private void ensureRawKpisIsMutable() {
-                if (!((bitField0_ & 0x00000002) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     rawKpis_ = new java.util.ArrayList(rawKpis_);
-                    bitField0_ |= 0x00000002;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -6048,7 +6269,7 @@ public final class Monitoring {
             public Builder clearRawKpis() {
                 if (rawKpisBuilder_ == null) {
                     rawKpis_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000002);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     rawKpisBuilder_.clear();
@@ -6122,7 +6343,7 @@ public final class Monitoring {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getRawKpisFieldBuilder() {
                 if (rawKpisBuilder_ == null) {
-                    rawKpisBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(rawKpis_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
+                    rawKpisBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(rawKpis_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     rawKpis_ = null;
                 }
                 return rawKpisBuilder_;
@@ -6155,17 +6376,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public RawKpiList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new RawKpiList(input, extensionRegistry);
             }
         };
 
@@ -6240,6 +6451,57 @@ public final class Monitoring {
             return new RawKpiTable();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private RawKpiTable(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    rawKpiLists_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                rawKpiLists_.add(input.readMessage(monitoring.Monitoring.RawKpiList.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    rawKpiLists_ = java.util.Collections.unmodifiableList(rawKpiLists_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_RawKpiTable_descriptor;
         }
@@ -6251,7 +6513,6 @@ public final class Monitoring {
 
         public static final int RAW_KPI_LISTS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List rawKpiLists_;
 
         /**
@@ -6312,7 +6573,7 @@ public final class Monitoring {
             for (int i = 0; i < rawKpiLists_.size(); i++) {
                 output.writeMessage(1, rawKpiLists_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -6324,7 +6585,7 @@ public final class Monitoring {
             for (int i = 0; i < rawKpiLists_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, rawKpiLists_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -6340,7 +6601,7 @@ public final class Monitoring {
             monitoring.Monitoring.RawKpiTable other = (monitoring.Monitoring.RawKpiTable) obj;
             if (!getRawKpiListsList().equals(other.getRawKpiListsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -6356,7 +6617,7 @@ public final class Monitoring {
                 hash = (37 * hash) + RAW_KPI_LISTS_FIELD_NUMBER;
                 hash = (53 * hash) + getRawKpiListsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -6454,23 +6715,29 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.RawKpiTable.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getRawKpiListsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (rawKpiListsBuilder_ == null) {
                     rawKpiLists_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    rawKpiLists_ = null;
                     rawKpiListsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -6496,15 +6763,7 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.RawKpiTable buildPartial() {
                 monitoring.Monitoring.RawKpiTable result = new monitoring.Monitoring.RawKpiTable(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(monitoring.Monitoring.RawKpiTable result) {
+                int from_bitField0_ = bitField0_;
                 if (rawKpiListsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         rawKpiLists_ = java.util.Collections.unmodifiableList(rawKpiLists_);
@@ -6514,10 +6773,38 @@ public final class Monitoring {
                 } else {
                     result.rawKpiLists_ = rawKpiListsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.RawKpiTable result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -6557,7 +6844,7 @@ public final class Monitoring {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -6569,47 +6856,17 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.RawKpiTable parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    monitoring.Monitoring.RawKpiList m = input.readMessage(monitoring.Monitoring.RawKpiList.parser(), extensionRegistry);
-                                    if (rawKpiListsBuilder_ == null) {
-                                        ensureRawKpiListsIsMutable();
-                                        rawKpiLists_.add(m);
-                                    } else {
-                                        rawKpiListsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.RawKpiTable) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -6879,17 +7136,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public RawKpiTable parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new RawKpiTable(input, extensionRegistry);
             }
         };
 
@@ -6951,6 +7198,57 @@ public final class Monitoring {
             return new KpiId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private KpiId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (kpiId_ != null) {
+                                    subBuilder = kpiId_.toBuilder();
+                                }
+                                kpiId_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiId_);
+                                    kpiId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_KpiId_descriptor;
         }
@@ -6987,7 +7285,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getKpiIdOrBuilder() {
-            return kpiId_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : kpiId_;
+            return getKpiId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -7008,7 +7306,7 @@ public final class Monitoring {
             if (kpiId_ != null) {
                 output.writeMessage(1, getKpiId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -7020,7 +7318,7 @@ public final class Monitoring {
             if (kpiId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getKpiId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -7040,7 +7338,7 @@ public final class Monitoring {
                 if (!getKpiId().equals(other.getKpiId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -7056,7 +7354,7 @@ public final class Monitoring {
                 hash = (37 * hash) + KPI_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getKpiId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -7150,19 +7448,26 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.KpiId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
                 return this;
@@ -7190,38 +7495,63 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.KpiId buildPartial() {
                 monitoring.Monitoring.KpiId result = new monitoring.Monitoring.KpiId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (kpiIdBuilder_ == null) {
+                    result.kpiId_ = kpiId_;
+                } else {
+                    result.kpiId_ = kpiIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.KpiId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
             }
 
             @java.lang.Override
-            public Builder mergeFrom(com.google.protobuf.Message other) {
-                if (other instanceof monitoring.Monitoring.KpiId) {
-                    return mergeFrom((monitoring.Monitoring.KpiId) other);
-                } else {
-                    super.mergeFrom(other);
-                    return this;
-                }
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
             }
 
-            public Builder mergeFrom(monitoring.Monitoring.KpiId other) {
-                if (other == monitoring.Monitoring.KpiId.getDefaultInstance())
-                    return this;
-                if (other.hasKpiId()) {
-                    mergeKpiId(other.getKpiId());
-                }
-                this.mergeUnknownFields(other.getUnknownFields());
-                onChanged();
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof monitoring.Monitoring.KpiId) {
+                    return mergeFrom((monitoring.Monitoring.KpiId) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(monitoring.Monitoring.KpiId other) {
+                if (other == monitoring.Monitoring.KpiId.getDefaultInstance())
+                    return this;
+                if (other.hasKpiId()) {
+                    mergeKpiId(other.getKpiId());
+                }
+                this.mergeUnknownFields(other.unknownFields);
+                onChanged();
                 return this;
             }
 
@@ -7232,47 +7562,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.KpiId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.KpiId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid kpiId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 kpiIdBuilder_;
@@ -7282,7 +7585,7 @@ public final class Monitoring {
              * @return Whether the kpiId field is set.
              */
             public boolean hasKpiId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return kpiIdBuilder_ != null || kpiId_ != null;
             }
 
             /**
@@ -7306,11 +7609,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiId_ = value;
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -7320,11 +7622,10 @@ public final class Monitoring {
             public Builder setKpiId(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (kpiIdBuilder_ == null) {
                     kpiId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -7333,16 +7634,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiId(context.ContextOuterClass.Uuid value) {
                 if (kpiIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && kpiId_ != null && kpiId_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getKpiIdBuilder().mergeFrom(value);
+                    if (kpiId_ != null) {
+                        kpiId_ = context.ContextOuterClass.Uuid.newBuilder(kpiId_).mergeFrom(value).buildPartial();
                     } else {
                         kpiId_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -7350,13 +7650,13 @@ public final class Monitoring {
              * .context.Uuid kpi_id = 1;
              */
             public Builder clearKpiId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                    onChanged();
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -7364,7 +7664,6 @@ public final class Monitoring {
              * .context.Uuid kpi_id = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getKpiIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getKpiIdFieldBuilder().getBuilder();
             }
@@ -7418,17 +7717,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public KpiId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new KpiId(input, extensionRegistry);
             }
         };
 
@@ -7524,6 +7813,83 @@ public final class Monitoring {
             return new Kpi();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Kpi(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.KpiId.Builder subBuilder = null;
+                                if (kpiId_ != null) {
+                                    subBuilder = kpiId_.toBuilder();
+                                }
+                                kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiId_);
+                                    kpiId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (timestamp_ != null) {
+                                    subBuilder = timestamp_.toBuilder();
+                                }
+                                timestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(timestamp_);
+                                    timestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 26:
+                            {
+                                monitoring.Monitoring.KpiValue.Builder subBuilder = null;
+                                if (kpiValue_ != null) {
+                                    subBuilder = kpiValue_.toBuilder();
+                                }
+                                kpiValue_ = input.readMessage(monitoring.Monitoring.KpiValue.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiValue_);
+                                    kpiValue_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_Kpi_descriptor;
         }
@@ -7560,7 +7926,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
-            return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+            return getKpiId();
         }
 
         public static final int TIMESTAMP_FIELD_NUMBER = 2;
@@ -7590,7 +7956,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-            return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+            return getTimestamp();
         }
 
         public static final int KPI_VALUE_FIELD_NUMBER = 3;
@@ -7620,7 +7986,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder() {
-            return kpiValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_;
+            return getKpiValue();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -7647,7 +8013,7 @@ public final class Monitoring {
             if (kpiValue_ != null) {
                 output.writeMessage(3, getKpiValue());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -7665,7 +8031,7 @@ public final class Monitoring {
             if (kpiValue_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getKpiValue());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -7697,7 +8063,7 @@ public final class Monitoring {
                 if (!getKpiValue().equals(other.getKpiValue()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -7721,7 +8087,7 @@ public final class Monitoring {
                 hash = (37 * hash) + KPI_VALUE_FIELD_NUMBER;
                 hash = (53 * hash) + getKpiValue().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -7815,29 +8181,38 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.Kpi.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
-                kpiValue_ = null;
-                if (kpiValueBuilder_ != null) {
-                    kpiValueBuilder_.dispose();
+                if (kpiValueBuilder_ == null) {
+                    kpiValue_ = null;
+                } else {
+                    kpiValue_ = null;
                     kpiValueBuilder_ = null;
                 }
                 return this;
@@ -7865,24 +8240,53 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.Kpi buildPartial() {
                 monitoring.Monitoring.Kpi result = new monitoring.Monitoring.Kpi(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (kpiIdBuilder_ == null) {
+                    result.kpiId_ = kpiId_;
+                } else {
+                    result.kpiId_ = kpiIdBuilder_.build();
+                }
+                if (timestampBuilder_ == null) {
+                    result.timestamp_ = timestamp_;
+                } else {
+                    result.timestamp_ = timestampBuilder_.build();
+                }
+                if (kpiValueBuilder_ == null) {
+                    result.kpiValue_ = kpiValue_;
+                } else {
+                    result.kpiValue_ = kpiValueBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.Kpi result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.timestamp_ = timestampBuilder_ == null ? timestamp_ : timestampBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.kpiValue_ = kpiValueBuilder_ == null ? kpiValue_ : kpiValueBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -7907,7 +8311,7 @@ public final class Monitoring {
                 if (other.hasKpiValue()) {
                     mergeKpiValue(other.getKpiValue());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -7919,61 +8323,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.Kpi parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getKpiValueFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.Kpi) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.KpiId kpiId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 kpiIdBuilder_;
@@ -7983,7 +8346,7 @@ public final class Monitoring {
              * @return Whether the kpiId field is set.
              */
             public boolean hasKpiId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return kpiIdBuilder_ != null || kpiId_ != null;
             }
 
             /**
@@ -8007,11 +8370,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiId_ = value;
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -8021,11 +8383,10 @@ public final class Monitoring {
             public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) {
                 if (kpiIdBuilder_ == null) {
                     kpiId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -8034,16 +8395,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiId(monitoring.Monitoring.KpiId value) {
                 if (kpiIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) {
-                        getKpiIdBuilder().mergeFrom(value);
+                    if (kpiId_ != null) {
+                        kpiId_ = monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial();
                     } else {
                         kpiId_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -8051,13 +8411,13 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 1;
              */
             public Builder clearKpiId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                    onChanged();
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -8065,7 +8425,6 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 1;
              */
             public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getKpiIdFieldBuilder().getBuilder();
             }
@@ -8101,7 +8460,7 @@ public final class Monitoring {
              * @return Whether the timestamp field is set.
              */
             public boolean hasTimestamp() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return timestampBuilder_ != null || timestamp_ != null;
             }
 
             /**
@@ -8125,11 +8484,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     timestamp_ = value;
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -8139,11 +8497,10 @@ public final class Monitoring {
             public Builder setTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (timestampBuilder_ == null) {
                     timestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -8152,16 +8509,15 @@ public final class Monitoring {
              */
             public Builder mergeTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (timestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && timestamp_ != null && timestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getTimestampBuilder().mergeFrom(value);
+                    if (timestamp_ != null) {
+                        timestamp_ = context.ContextOuterClass.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial();
                     } else {
                         timestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     timestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -8169,13 +8525,13 @@ public final class Monitoring {
              * .context.Timestamp timestamp = 2;
              */
             public Builder clearTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                    onChanged();
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -8183,7 +8539,6 @@ public final class Monitoring {
              * .context.Timestamp timestamp = 2;
              */
             public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getTimestampFieldBuilder().getBuilder();
             }
@@ -8219,7 +8574,7 @@ public final class Monitoring {
              * @return Whether the kpiValue field is set.
              */
             public boolean hasKpiValue() {
-                return ((bitField0_ & 0x00000004) != 0);
+                return kpiValueBuilder_ != null || kpiValue_ != null;
             }
 
             /**
@@ -8243,11 +8598,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiValue_ = value;
+                    onChanged();
                 } else {
                     kpiValueBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -8257,11 +8611,10 @@ public final class Monitoring {
             public Builder setKpiValue(monitoring.Monitoring.KpiValue.Builder builderForValue) {
                 if (kpiValueBuilder_ == null) {
                     kpiValue_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiValueBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -8270,16 +8623,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiValue(monitoring.Monitoring.KpiValue value) {
                 if (kpiValueBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0) && kpiValue_ != null && kpiValue_ != monitoring.Monitoring.KpiValue.getDefaultInstance()) {
-                        getKpiValueBuilder().mergeFrom(value);
+                    if (kpiValue_ != null) {
+                        kpiValue_ = monitoring.Monitoring.KpiValue.newBuilder(kpiValue_).mergeFrom(value).buildPartial();
                     } else {
                         kpiValue_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiValueBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -8287,13 +8639,13 @@ public final class Monitoring {
              * .monitoring.KpiValue kpi_value = 3;
              */
             public Builder clearKpiValue() {
-                bitField0_ = (bitField0_ & ~0x00000004);
-                kpiValue_ = null;
-                if (kpiValueBuilder_ != null) {
-                    kpiValueBuilder_.dispose();
+                if (kpiValueBuilder_ == null) {
+                    kpiValue_ = null;
+                    onChanged();
+                } else {
+                    kpiValue_ = null;
                     kpiValueBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -8301,7 +8653,6 @@ public final class Monitoring {
              * .monitoring.KpiValue kpi_value = 3;
              */
             public monitoring.Monitoring.KpiValue.Builder getKpiValueBuilder() {
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return getKpiValueFieldBuilder().getBuilder();
             }
@@ -8355,17 +8706,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public Kpi parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Kpi(input, extensionRegistry);
             }
         };
 
@@ -8474,6 +8815,85 @@ public final class Monitoring {
             return new KpiValueRange();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private KpiValueRange(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.KpiValue.Builder subBuilder = null;
+                                if (kpiMinValue_ != null) {
+                                    subBuilder = kpiMinValue_.toBuilder();
+                                }
+                                kpiMinValue_ = input.readMessage(monitoring.Monitoring.KpiValue.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiMinValue_);
+                                    kpiMinValue_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                monitoring.Monitoring.KpiValue.Builder subBuilder = null;
+                                if (kpiMaxValue_ != null) {
+                                    subBuilder = kpiMaxValue_.toBuilder();
+                                }
+                                kpiMaxValue_ = input.readMessage(monitoring.Monitoring.KpiValue.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiMaxValue_);
+                                    kpiMaxValue_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 24:
+                            {
+                                inRange_ = input.readBool();
+                                break;
+                            }
+                        case 32:
+                            {
+                                includeMinValue_ = input.readBool();
+                                break;
+                            }
+                        case 40:
+                            {
+                                includeMaxValue_ = input.readBool();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_KpiValueRange_descriptor;
         }
@@ -8510,7 +8930,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiValueOrBuilder getKpiMinValueOrBuilder() {
-            return kpiMinValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiMinValue_;
+            return getKpiMinValue();
         }
 
         public static final int KPIMAXVALUE_FIELD_NUMBER = 2;
@@ -8540,12 +8960,12 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiValueOrBuilder getKpiMaxValueOrBuilder() {
-            return kpiMaxValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiMaxValue_;
+            return getKpiMaxValue();
         }
 
         public static final int INRANGE_FIELD_NUMBER = 3;
 
-        private boolean inRange_ = false;
+        private boolean inRange_;
 
         /**
          * 
@@ -8562,7 +8982,7 @@ public final class Monitoring {
 
         public static final int INCLUDEMINVALUE_FIELD_NUMBER = 4;
 
-        private boolean includeMinValue_ = false;
+        private boolean includeMinValue_;
 
         /**
          * 
@@ -8579,7 +8999,7 @@ public final class Monitoring {
 
         public static final int INCLUDEMAXVALUE_FIELD_NUMBER = 5;
 
-        private boolean includeMaxValue_ = false;
+        private boolean includeMaxValue_;
 
         /**
          * 
@@ -8624,7 +9044,7 @@ public final class Monitoring {
             if (includeMaxValue_ != false) {
                 output.writeBool(5, includeMaxValue_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -8648,7 +9068,7 @@ public final class Monitoring {
             if (includeMaxValue_ != false) {
                 size += com.google.protobuf.CodedOutputStream.computeBoolSize(5, includeMaxValue_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -8680,7 +9100,7 @@ public final class Monitoring {
                 return false;
             if (getIncludeMaxValue() != other.getIncludeMaxValue())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -8706,7 +9126,7 @@ public final class Monitoring {
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeMinValue());
             hash = (37 * hash) + INCLUDEMAXVALUE_FIELD_NUMBER;
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeMaxValue());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -8800,24 +9220,32 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.KpiValueRange.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                kpiMinValue_ = null;
-                if (kpiMinValueBuilder_ != null) {
-                    kpiMinValueBuilder_.dispose();
+                if (kpiMinValueBuilder_ == null) {
+                    kpiMinValue_ = null;
+                } else {
+                    kpiMinValue_ = null;
                     kpiMinValueBuilder_ = null;
                 }
-                kpiMaxValue_ = null;
-                if (kpiMaxValueBuilder_ != null) {
-                    kpiMaxValueBuilder_.dispose();
+                if (kpiMaxValueBuilder_ == null) {
+                    kpiMaxValue_ = null;
+                } else {
+                    kpiMaxValue_ = null;
                     kpiMaxValueBuilder_ = null;
                 }
                 inRange_ = false;
@@ -8848,30 +9276,51 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.KpiValueRange buildPartial() {
                 monitoring.Monitoring.KpiValueRange result = new monitoring.Monitoring.KpiValueRange(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (kpiMinValueBuilder_ == null) {
+                    result.kpiMinValue_ = kpiMinValue_;
+                } else {
+                    result.kpiMinValue_ = kpiMinValueBuilder_.build();
                 }
+                if (kpiMaxValueBuilder_ == null) {
+                    result.kpiMaxValue_ = kpiMaxValue_;
+                } else {
+                    result.kpiMaxValue_ = kpiMaxValueBuilder_.build();
+                }
+                result.inRange_ = inRange_;
+                result.includeMinValue_ = includeMinValue_;
+                result.includeMaxValue_ = includeMaxValue_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.KpiValueRange result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.kpiMinValue_ = kpiMinValueBuilder_ == null ? kpiMinValue_ : kpiMinValueBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.kpiMaxValue_ = kpiMaxValueBuilder_ == null ? kpiMaxValue_ : kpiMaxValueBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.inRange_ = inRange_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.includeMinValue_ = includeMinValue_;
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.includeMaxValue_ = includeMaxValue_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -8902,7 +9351,7 @@ public final class Monitoring {
                 if (other.getIncludeMaxValue() != false) {
                     setIncludeMaxValue(other.getIncludeMaxValue());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -8914,75 +9363,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.KpiValueRange parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getKpiMinValueFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getKpiMaxValueFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 24:
-                                {
-                                    inRange_ = input.readBool();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 32:
-                                {
-                                    includeMinValue_ = input.readBool();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 32
-                            case 40:
-                                {
-                                    includeMaxValue_ = input.readBool();
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 40
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.KpiValueRange) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.KpiValue kpiMinValue_;
 
             private com.google.protobuf.SingleFieldBuilderV3 kpiMinValueBuilder_;
@@ -8992,7 +9386,7 @@ public final class Monitoring {
              * @return Whether the kpiMinValue field is set.
              */
             public boolean hasKpiMinValue() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return kpiMinValueBuilder_ != null || kpiMinValue_ != null;
             }
 
             /**
@@ -9016,11 +9410,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiMinValue_ = value;
+                    onChanged();
                 } else {
                     kpiMinValueBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -9030,11 +9423,10 @@ public final class Monitoring {
             public Builder setKpiMinValue(monitoring.Monitoring.KpiValue.Builder builderForValue) {
                 if (kpiMinValueBuilder_ == null) {
                     kpiMinValue_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiMinValueBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -9043,16 +9435,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiMinValue(monitoring.Monitoring.KpiValue value) {
                 if (kpiMinValueBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && kpiMinValue_ != null && kpiMinValue_ != monitoring.Monitoring.KpiValue.getDefaultInstance()) {
-                        getKpiMinValueBuilder().mergeFrom(value);
+                    if (kpiMinValue_ != null) {
+                        kpiMinValue_ = monitoring.Monitoring.KpiValue.newBuilder(kpiMinValue_).mergeFrom(value).buildPartial();
                     } else {
                         kpiMinValue_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiMinValueBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -9060,13 +9451,13 @@ public final class Monitoring {
              * .monitoring.KpiValue kpiMinValue = 1;
              */
             public Builder clearKpiMinValue() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                kpiMinValue_ = null;
-                if (kpiMinValueBuilder_ != null) {
-                    kpiMinValueBuilder_.dispose();
+                if (kpiMinValueBuilder_ == null) {
+                    kpiMinValue_ = null;
+                    onChanged();
+                } else {
+                    kpiMinValue_ = null;
                     kpiMinValueBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -9074,7 +9465,6 @@ public final class Monitoring {
              * .monitoring.KpiValue kpiMinValue = 1;
              */
             public monitoring.Monitoring.KpiValue.Builder getKpiMinValueBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getKpiMinValueFieldBuilder().getBuilder();
             }
@@ -9110,7 +9500,7 @@ public final class Monitoring {
              * @return Whether the kpiMaxValue field is set.
              */
             public boolean hasKpiMaxValue() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return kpiMaxValueBuilder_ != null || kpiMaxValue_ != null;
             }
 
             /**
@@ -9134,11 +9524,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiMaxValue_ = value;
+                    onChanged();
                 } else {
                     kpiMaxValueBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -9148,11 +9537,10 @@ public final class Monitoring {
             public Builder setKpiMaxValue(monitoring.Monitoring.KpiValue.Builder builderForValue) {
                 if (kpiMaxValueBuilder_ == null) {
                     kpiMaxValue_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiMaxValueBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -9161,16 +9549,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiMaxValue(monitoring.Monitoring.KpiValue value) {
                 if (kpiMaxValueBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && kpiMaxValue_ != null && kpiMaxValue_ != monitoring.Monitoring.KpiValue.getDefaultInstance()) {
-                        getKpiMaxValueBuilder().mergeFrom(value);
+                    if (kpiMaxValue_ != null) {
+                        kpiMaxValue_ = monitoring.Monitoring.KpiValue.newBuilder(kpiMaxValue_).mergeFrom(value).buildPartial();
                     } else {
                         kpiMaxValue_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiMaxValueBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -9178,13 +9565,13 @@ public final class Monitoring {
              * .monitoring.KpiValue kpiMaxValue = 2;
              */
             public Builder clearKpiMaxValue() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                kpiMaxValue_ = null;
-                if (kpiMaxValueBuilder_ != null) {
-                    kpiMaxValueBuilder_.dispose();
+                if (kpiMaxValueBuilder_ == null) {
+                    kpiMaxValue_ = null;
+                    onChanged();
+                } else {
+                    kpiMaxValue_ = null;
                     kpiMaxValueBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -9192,7 +9579,6 @@ public final class Monitoring {
              * .monitoring.KpiValue kpiMaxValue = 2;
              */
             public monitoring.Monitoring.KpiValue.Builder getKpiMaxValueBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getKpiMaxValueFieldBuilder().getBuilder();
             }
@@ -9245,7 +9631,6 @@ public final class Monitoring {
              */
             public Builder setInRange(boolean value) {
                 inRange_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -9259,7 +9644,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearInRange() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 inRange_ = false;
                 onChanged();
                 return this;
@@ -9291,7 +9675,6 @@ public final class Monitoring {
              */
             public Builder setIncludeMinValue(boolean value) {
                 includeMinValue_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -9305,7 +9688,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearIncludeMinValue() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 includeMinValue_ = false;
                 onChanged();
                 return this;
@@ -9337,7 +9719,6 @@ public final class Monitoring {
              */
             public Builder setIncludeMaxValue(boolean value) {
                 includeMaxValue_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -9351,7 +9732,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearIncludeMaxValue() {
-                bitField0_ = (bitField0_ & ~0x00000010);
                 includeMaxValue_ = false;
                 onChanged();
                 return this;
@@ -9384,17 +9764,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public KpiValueRange parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new KpiValueRange(input, extensionRegistry);
             }
         };
 
@@ -9506,7 +9876,7 @@ public final class Monitoring {
          */
         boolean getBoolVal();
 
-        monitoring.Monitoring.KpiValue.ValueCase getValueCase();
+        public monitoring.Monitoring.KpiValue.ValueCase getValueCase();
     }
 
     /**
@@ -9531,6 +9901,87 @@ public final class Monitoring {
             return new KpiValue();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private KpiValue(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                valueCase_ = 1;
+                                value_ = input.readInt32();
+                                break;
+                            }
+                        case 16:
+                            {
+                                valueCase_ = 2;
+                                value_ = input.readUInt32();
+                                break;
+                            }
+                        case 24:
+                            {
+                                valueCase_ = 3;
+                                value_ = input.readInt64();
+                                break;
+                            }
+                        case 32:
+                            {
+                                valueCase_ = 4;
+                                value_ = input.readUInt64();
+                                break;
+                            }
+                        case 45:
+                            {
+                                valueCase_ = 5;
+                                value_ = input.readFloat();
+                                break;
+                            }
+                        case 50:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                valueCase_ = 6;
+                                value_ = s;
+                                break;
+                            }
+                        case 56:
+                            {
+                                valueCase_ = 7;
+                                value_ = input.readBool();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_KpiValue_descriptor;
         }
@@ -9542,7 +9993,6 @@ public final class Monitoring {
 
         private int valueCase_ = 0;
 
-        @SuppressWarnings("serial")
         private java.lang.Object value_;
 
         public enum ValueCase implements com.google.protobuf.Internal.EnumLite, com.google.protobuf.AbstractMessage.InternalOneOfEnum {
@@ -9829,7 +10279,7 @@ public final class Monitoring {
             if (valueCase_ == 7) {
                 output.writeBool(7, (boolean) ((java.lang.Boolean) value_));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -9859,7 +10309,7 @@ public final class Monitoring {
             if (valueCase_ == 7) {
                 size += com.google.protobuf.CodedOutputStream.computeBoolSize(7, (boolean) ((java.lang.Boolean) value_));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -9907,7 +10357,7 @@ public final class Monitoring {
                 case 0:
                 default:
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -9951,7 +10401,7 @@ public final class Monitoring {
                 case 0:
                 default:
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -10045,16 +10495,22 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.KpiValue.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 valueCase_ = 0;
                 value_ = null;
                 return this;
@@ -10082,21 +10538,60 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.KpiValue buildPartial() {
                 monitoring.Monitoring.KpiValue result = new monitoring.Monitoring.KpiValue(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (valueCase_ == 1) {
+                    result.value_ = value_;
+                }
+                if (valueCase_ == 2) {
+                    result.value_ = value_;
+                }
+                if (valueCase_ == 3) {
+                    result.value_ = value_;
+                }
+                if (valueCase_ == 4) {
+                    result.value_ = value_;
+                }
+                if (valueCase_ == 5) {
+                    result.value_ = value_;
+                }
+                if (valueCase_ == 6) {
+                    result.value_ = value_;
+                }
+                if (valueCase_ == 7) {
+                    result.value_ = value_;
                 }
-                buildPartialOneofs(result);
+                result.valueCase_ = valueCase_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.KpiValue result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
             }
 
-            private void buildPartialOneofs(monitoring.Monitoring.KpiValue result) {
-                result.valueCase_ = valueCase_;
-                result.value_ = this.value_;
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -10155,7 +10650,7 @@ public final class Monitoring {
                             break;
                         }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -10167,85 +10662,17 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.KpiValue parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    value_ = input.readInt32();
-                                    valueCase_ = 1;
-                                    break;
-                                }
-                            // case 8
-                            case 16:
-                                {
-                                    value_ = input.readUInt32();
-                                    valueCase_ = 2;
-                                    break;
-                                }
-                            // case 16
-                            case 24:
-                                {
-                                    value_ = input.readInt64();
-                                    valueCase_ = 3;
-                                    break;
-                                }
-                            // case 24
-                            case 32:
-                                {
-                                    value_ = input.readUInt64();
-                                    valueCase_ = 4;
-                                    break;
-                                }
-                            // case 32
-                            case 45:
-                                {
-                                    value_ = input.readFloat();
-                                    valueCase_ = 5;
-                                    break;
-                                }
-                            // case 45
-                            case 50:
-                                {
-                                    java.lang.String s = input.readStringRequireUtf8();
-                                    valueCase_ = 6;
-                                    value_ = s;
-                                    break;
-                                }
-                            // case 50
-                            case 56:
-                                {
-                                    value_ = input.readBool();
-                                    valueCase_ = 7;
-                                    break;
-                                }
-                            // case 56
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.KpiValue) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -10264,8 +10691,6 @@ public final class Monitoring {
                 return this;
             }
 
-            private int bitField0_;
-
             /**
              * int32 int32Val = 1;
              * @return Whether the int32Val field is set.
@@ -10653,17 +11078,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public KpiValue parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new KpiValue(input, extensionRegistry);
             }
         };
 
@@ -10734,6 +11149,57 @@ public final class Monitoring {
             return new KpiList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private KpiList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    kpi_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                kpi_.add(input.readMessage(monitoring.Monitoring.Kpi.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    kpi_ = java.util.Collections.unmodifiableList(kpi_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_KpiList_descriptor;
         }
@@ -10745,7 +11211,6 @@ public final class Monitoring {
 
         public static final int KPI_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List kpi_;
 
         /**
@@ -10806,7 +11271,7 @@ public final class Monitoring {
             for (int i = 0; i < kpi_.size(); i++) {
                 output.writeMessage(1, kpi_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -10818,7 +11283,7 @@ public final class Monitoring {
             for (int i = 0; i < kpi_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, kpi_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -10834,7 +11299,7 @@ public final class Monitoring {
             monitoring.Monitoring.KpiList other = (monitoring.Monitoring.KpiList) obj;
             if (!getKpiList().equals(other.getKpiList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -10850,7 +11315,7 @@ public final class Monitoring {
                 hash = (37 * hash) + KPI_FIELD_NUMBER;
                 hash = (53 * hash) + getKpiList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -10944,23 +11409,29 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.KpiList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getKpiFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (kpiBuilder_ == null) {
                     kpi_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    kpi_ = null;
                     kpiBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -10986,15 +11457,7 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.KpiList buildPartial() {
                 monitoring.Monitoring.KpiList result = new monitoring.Monitoring.KpiList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(monitoring.Monitoring.KpiList result) {
+                int from_bitField0_ = bitField0_;
                 if (kpiBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         kpi_ = java.util.Collections.unmodifiableList(kpi_);
@@ -11004,10 +11467,38 @@ public final class Monitoring {
                 } else {
                     result.kpi_ = kpiBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.KpiList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -11047,7 +11538,7 @@ public final class Monitoring {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -11059,47 +11550,17 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.KpiList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    monitoring.Monitoring.Kpi m = input.readMessage(monitoring.Monitoring.Kpi.parser(), extensionRegistry);
-                                    if (kpiBuilder_ == null) {
-                                        ensureKpiIsMutable();
-                                        kpi_.add(m);
-                                    } else {
-                                        kpiBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.KpiList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -11369,17 +11830,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public KpiList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new KpiList(input, extensionRegistry);
             }
         };
 
@@ -11450,6 +11901,57 @@ public final class Monitoring {
             return new KpiDescriptorList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private KpiDescriptorList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    kpiDescriptorList_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                kpiDescriptorList_.add(input.readMessage(monitoring.Monitoring.KpiDescriptor.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    kpiDescriptorList_ = java.util.Collections.unmodifiableList(kpiDescriptorList_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_KpiDescriptorList_descriptor;
         }
@@ -11461,7 +11963,6 @@ public final class Monitoring {
 
         public static final int KPI_DESCRIPTOR_LIST_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List kpiDescriptorList_;
 
         /**
@@ -11522,7 +12023,7 @@ public final class Monitoring {
             for (int i = 0; i < kpiDescriptorList_.size(); i++) {
                 output.writeMessage(1, kpiDescriptorList_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -11534,7 +12035,7 @@ public final class Monitoring {
             for (int i = 0; i < kpiDescriptorList_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, kpiDescriptorList_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -11550,7 +12051,7 @@ public final class Monitoring {
             monitoring.Monitoring.KpiDescriptorList other = (monitoring.Monitoring.KpiDescriptorList) obj;
             if (!getKpiDescriptorListList().equals(other.getKpiDescriptorListList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -11566,7 +12067,7 @@ public final class Monitoring {
                 hash = (37 * hash) + KPI_DESCRIPTOR_LIST_FIELD_NUMBER;
                 hash = (53 * hash) + getKpiDescriptorListList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -11660,23 +12161,29 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.KpiDescriptorList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getKpiDescriptorListFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (kpiDescriptorListBuilder_ == null) {
                     kpiDescriptorList_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    kpiDescriptorList_ = null;
                     kpiDescriptorListBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -11702,15 +12209,7 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.KpiDescriptorList buildPartial() {
                 monitoring.Monitoring.KpiDescriptorList result = new monitoring.Monitoring.KpiDescriptorList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(monitoring.Monitoring.KpiDescriptorList result) {
+                int from_bitField0_ = bitField0_;
                 if (kpiDescriptorListBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         kpiDescriptorList_ = java.util.Collections.unmodifiableList(kpiDescriptorList_);
@@ -11720,10 +12219,38 @@ public final class Monitoring {
                 } else {
                     result.kpiDescriptorList_ = kpiDescriptorListBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.KpiDescriptorList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -11763,7 +12290,7 @@ public final class Monitoring {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -11775,47 +12302,17 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.KpiDescriptorList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    monitoring.Monitoring.KpiDescriptor m = input.readMessage(monitoring.Monitoring.KpiDescriptor.parser(), extensionRegistry);
-                                    if (kpiDescriptorListBuilder_ == null) {
-                                        ensureKpiDescriptorListIsMutable();
-                                        kpiDescriptorList_.add(m);
-                                    } else {
-                                        kpiDescriptorListBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.KpiDescriptorList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -12085,17 +12582,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public KpiDescriptorList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new KpiDescriptorList(input, extensionRegistry);
             }
         };
 
@@ -12244,6 +12731,106 @@ public final class Monitoring {
             return new SubsDescriptor();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SubsDescriptor(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.SubscriptionID.Builder subBuilder = null;
+                                if (subsId_ != null) {
+                                    subBuilder = subsId_.toBuilder();
+                                }
+                                subsId_ = input.readMessage(monitoring.Monitoring.SubscriptionID.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(subsId_);
+                                    subsId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                monitoring.Monitoring.KpiId.Builder subBuilder = null;
+                                if (kpiId_ != null) {
+                                    subBuilder = kpiId_.toBuilder();
+                                }
+                                kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiId_);
+                                    kpiId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 29:
+                            {
+                                samplingDurationS_ = input.readFloat();
+                                break;
+                            }
+                        case 37:
+                            {
+                                samplingIntervalS_ = input.readFloat();
+                                break;
+                            }
+                        case 42:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (startTimestamp_ != null) {
+                                    subBuilder = startTimestamp_.toBuilder();
+                                }
+                                startTimestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(startTimestamp_);
+                                    startTimestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 50:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (endTimestamp_ != null) {
+                                    subBuilder = endTimestamp_.toBuilder();
+                                }
+                                endTimestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endTimestamp_);
+                                    endTimestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_SubsDescriptor_descriptor;
         }
@@ -12280,7 +12867,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.SubscriptionIDOrBuilder getSubsIdOrBuilder() {
-            return subsId_ == null ? monitoring.Monitoring.SubscriptionID.getDefaultInstance() : subsId_;
+            return getSubsId();
         }
 
         public static final int KPI_ID_FIELD_NUMBER = 2;
@@ -12310,12 +12897,12 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
-            return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+            return getKpiId();
         }
 
         public static final int SAMPLING_DURATION_S_FIELD_NUMBER = 3;
 
-        private float samplingDurationS_ = 0F;
+        private float samplingDurationS_;
 
         /**
          * float sampling_duration_s = 3;
@@ -12328,7 +12915,7 @@ public final class Monitoring {
 
         public static final int SAMPLING_INTERVAL_S_FIELD_NUMBER = 4;
 
-        private float samplingIntervalS_ = 0F;
+        private float samplingIntervalS_;
 
         /**
          * float sampling_interval_s = 4;
@@ -12378,7 +12965,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getStartTimestampOrBuilder() {
-            return startTimestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : startTimestamp_;
+            return getStartTimestamp();
         }
 
         public static final int END_TIMESTAMP_FIELD_NUMBER = 6;
@@ -12420,7 +13007,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getEndTimestampOrBuilder() {
-            return endTimestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : endTimestamp_;
+            return getEndTimestamp();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -12444,10 +13031,10 @@ public final class Monitoring {
             if (kpiId_ != null) {
                 output.writeMessage(2, getKpiId());
             }
-            if (java.lang.Float.floatToRawIntBits(samplingDurationS_) != 0) {
+            if (samplingDurationS_ != 0F) {
                 output.writeFloat(3, samplingDurationS_);
             }
-            if (java.lang.Float.floatToRawIntBits(samplingIntervalS_) != 0) {
+            if (samplingIntervalS_ != 0F) {
                 output.writeFloat(4, samplingIntervalS_);
             }
             if (startTimestamp_ != null) {
@@ -12456,7 +13043,7 @@ public final class Monitoring {
             if (endTimestamp_ != null) {
                 output.writeMessage(6, getEndTimestamp());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -12471,10 +13058,10 @@ public final class Monitoring {
             if (kpiId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getKpiId());
             }
-            if (java.lang.Float.floatToRawIntBits(samplingDurationS_) != 0) {
+            if (samplingDurationS_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(3, samplingDurationS_);
             }
-            if (java.lang.Float.floatToRawIntBits(samplingIntervalS_) != 0) {
+            if (samplingIntervalS_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(4, samplingIntervalS_);
             }
             if (startTimestamp_ != null) {
@@ -12483,7 +13070,7 @@ public final class Monitoring {
             if (endTimestamp_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(6, getEndTimestamp());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -12525,7 +13112,7 @@ public final class Monitoring {
                 if (!getEndTimestamp().equals(other.getEndTimestamp()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -12557,7 +13144,7 @@ public final class Monitoring {
                 hash = (37 * hash) + END_TIMESTAMP_FIELD_NUMBER;
                 hash = (53 * hash) + getEndTimestamp().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -12651,36 +13238,46 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.SubsDescriptor.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                subsId_ = null;
-                if (subsIdBuilder_ != null) {
-                    subsIdBuilder_.dispose();
+                if (subsIdBuilder_ == null) {
+                    subsId_ = null;
+                } else {
+                    subsId_ = null;
                     subsIdBuilder_ = null;
                 }
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
                 samplingDurationS_ = 0F;
                 samplingIntervalS_ = 0F;
-                startTimestamp_ = null;
-                if (startTimestampBuilder_ != null) {
-                    startTimestampBuilder_.dispose();
+                if (startTimestampBuilder_ == null) {
+                    startTimestamp_ = null;
+                } else {
+                    startTimestamp_ = null;
                     startTimestampBuilder_ = null;
                 }
-                endTimestamp_ = null;
-                if (endTimestampBuilder_ != null) {
-                    endTimestampBuilder_.dispose();
+                if (endTimestampBuilder_ == null) {
+                    endTimestamp_ = null;
+                } else {
+                    endTimestamp_ = null;
                     endTimestampBuilder_ = null;
                 }
                 return this;
@@ -12708,33 +13305,60 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.SubsDescriptor buildPartial() {
                 monitoring.Monitoring.SubsDescriptor result = new monitoring.Monitoring.SubsDescriptor(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (subsIdBuilder_ == null) {
+                    result.subsId_ = subsId_;
+                } else {
+                    result.subsId_ = subsIdBuilder_.build();
+                }
+                if (kpiIdBuilder_ == null) {
+                    result.kpiId_ = kpiId_;
+                } else {
+                    result.kpiId_ = kpiIdBuilder_.build();
+                }
+                result.samplingDurationS_ = samplingDurationS_;
+                result.samplingIntervalS_ = samplingIntervalS_;
+                if (startTimestampBuilder_ == null) {
+                    result.startTimestamp_ = startTimestamp_;
+                } else {
+                    result.startTimestamp_ = startTimestampBuilder_.build();
+                }
+                if (endTimestampBuilder_ == null) {
+                    result.endTimestamp_ = endTimestamp_;
+                } else {
+                    result.endTimestamp_ = endTimestampBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.SubsDescriptor result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.subsId_ = subsIdBuilder_ == null ? subsId_ : subsIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.samplingDurationS_ = samplingDurationS_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.samplingIntervalS_ = samplingIntervalS_;
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.startTimestamp_ = startTimestampBuilder_ == null ? startTimestamp_ : startTimestampBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000020) != 0)) {
-                    result.endTimestamp_ = endTimestampBuilder_ == null ? endTimestamp_ : endTimestampBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -12768,7 +13392,7 @@ public final class Monitoring {
                 if (other.hasEndTimestamp()) {
                     mergeEndTimestamp(other.getEndTimestamp());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -12780,82 +13404,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.SubsDescriptor parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getSubsIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 29:
-                                {
-                                    samplingDurationS_ = input.readFloat();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 29
-                            case 37:
-                                {
-                                    samplingIntervalS_ = input.readFloat();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 37
-                            case 42:
-                                {
-                                    input.readMessage(getStartTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 42
-                            case 50:
-                                {
-                                    input.readMessage(getEndTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000020;
-                                    break;
-                                }
-                            // case 50
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.SubsDescriptor) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.SubscriptionID subsId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 subsIdBuilder_;
@@ -12865,7 +13427,7 @@ public final class Monitoring {
              * @return Whether the subsId field is set.
              */
             public boolean hasSubsId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return subsIdBuilder_ != null || subsId_ != null;
             }
 
             /**
@@ -12889,11 +13451,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     subsId_ = value;
+                    onChanged();
                 } else {
                     subsIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -12903,11 +13464,10 @@ public final class Monitoring {
             public Builder setSubsId(monitoring.Monitoring.SubscriptionID.Builder builderForValue) {
                 if (subsIdBuilder_ == null) {
                     subsId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     subsIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -12916,16 +13476,15 @@ public final class Monitoring {
              */
             public Builder mergeSubsId(monitoring.Monitoring.SubscriptionID value) {
                 if (subsIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && subsId_ != null && subsId_ != monitoring.Monitoring.SubscriptionID.getDefaultInstance()) {
-                        getSubsIdBuilder().mergeFrom(value);
+                    if (subsId_ != null) {
+                        subsId_ = monitoring.Monitoring.SubscriptionID.newBuilder(subsId_).mergeFrom(value).buildPartial();
                     } else {
                         subsId_ = value;
                     }
+                    onChanged();
                 } else {
                     subsIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -12933,13 +13492,13 @@ public final class Monitoring {
              * .monitoring.SubscriptionID subs_id = 1;
              */
             public Builder clearSubsId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                subsId_ = null;
-                if (subsIdBuilder_ != null) {
-                    subsIdBuilder_.dispose();
+                if (subsIdBuilder_ == null) {
+                    subsId_ = null;
+                    onChanged();
+                } else {
+                    subsId_ = null;
                     subsIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -12947,7 +13506,6 @@ public final class Monitoring {
              * .monitoring.SubscriptionID subs_id = 1;
              */
             public monitoring.Monitoring.SubscriptionID.Builder getSubsIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getSubsIdFieldBuilder().getBuilder();
             }
@@ -12983,7 +13541,7 @@ public final class Monitoring {
              * @return Whether the kpiId field is set.
              */
             public boolean hasKpiId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return kpiIdBuilder_ != null || kpiId_ != null;
             }
 
             /**
@@ -13007,11 +13565,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiId_ = value;
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -13021,11 +13578,10 @@ public final class Monitoring {
             public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) {
                 if (kpiIdBuilder_ == null) {
                     kpiId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -13034,16 +13590,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiId(monitoring.Monitoring.KpiId value) {
                 if (kpiIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) {
-                        getKpiIdBuilder().mergeFrom(value);
+                    if (kpiId_ != null) {
+                        kpiId_ = monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial();
                     } else {
                         kpiId_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -13051,13 +13606,13 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 2;
              */
             public Builder clearKpiId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                    onChanged();
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -13065,7 +13620,6 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 2;
              */
             public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getKpiIdFieldBuilder().getBuilder();
             }
@@ -13110,7 +13664,6 @@ public final class Monitoring {
              */
             public Builder setSamplingDurationS(float value) {
                 samplingDurationS_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -13120,7 +13673,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearSamplingDurationS() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 samplingDurationS_ = 0F;
                 onChanged();
                 return this;
@@ -13144,7 +13696,6 @@ public final class Monitoring {
              */
             public Builder setSamplingIntervalS(float value) {
                 samplingIntervalS_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -13154,7 +13705,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearSamplingIntervalS() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 samplingIntervalS_ = 0F;
                 onChanged();
                 return this;
@@ -13173,7 +13723,7 @@ public final class Monitoring {
              * @return Whether the startTimestamp field is set.
              */
             public boolean hasStartTimestamp() {
-                return ((bitField0_ & 0x00000010) != 0);
+                return startTimestampBuilder_ != null || startTimestamp_ != null;
             }
 
             /**
@@ -13205,11 +13755,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     startTimestamp_ = value;
+                    onChanged();
                 } else {
                     startTimestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -13223,11 +13772,10 @@ public final class Monitoring {
             public Builder setStartTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (startTimestampBuilder_ == null) {
                     startTimestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     startTimestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -13240,16 +13788,15 @@ public final class Monitoring {
              */
             public Builder mergeStartTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (startTimestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000010) != 0) && startTimestamp_ != null && startTimestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getStartTimestampBuilder().mergeFrom(value);
+                    if (startTimestamp_ != null) {
+                        startTimestamp_ = context.ContextOuterClass.Timestamp.newBuilder(startTimestamp_).mergeFrom(value).buildPartial();
                     } else {
                         startTimestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     startTimestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -13261,13 +13808,13 @@ public final class Monitoring {
              * .context.Timestamp start_timestamp = 5;
              */
             public Builder clearStartTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000010);
-                startTimestamp_ = null;
-                if (startTimestampBuilder_ != null) {
-                    startTimestampBuilder_.dispose();
+                if (startTimestampBuilder_ == null) {
+                    startTimestamp_ = null;
+                    onChanged();
+                } else {
+                    startTimestamp_ = null;
                     startTimestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -13279,7 +13826,6 @@ public final class Monitoring {
              * .context.Timestamp start_timestamp = 5;
              */
             public context.ContextOuterClass.Timestamp.Builder getStartTimestampBuilder() {
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return getStartTimestampFieldBuilder().getBuilder();
             }
@@ -13327,7 +13873,7 @@ public final class Monitoring {
              * @return Whether the endTimestamp field is set.
              */
             public boolean hasEndTimestamp() {
-                return ((bitField0_ & 0x00000020) != 0);
+                return endTimestampBuilder_ != null || endTimestamp_ != null;
             }
 
             /**
@@ -13359,11 +13905,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     endTimestamp_ = value;
+                    onChanged();
                 } else {
                     endTimestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -13377,11 +13922,10 @@ public final class Monitoring {
             public Builder setEndTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (endTimestampBuilder_ == null) {
                     endTimestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endTimestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -13394,16 +13938,15 @@ public final class Monitoring {
              */
             public Builder mergeEndTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (endTimestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000020) != 0) && endTimestamp_ != null && endTimestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getEndTimestampBuilder().mergeFrom(value);
+                    if (endTimestamp_ != null) {
+                        endTimestamp_ = context.ContextOuterClass.Timestamp.newBuilder(endTimestamp_).mergeFrom(value).buildPartial();
                     } else {
                         endTimestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     endTimestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -13415,13 +13958,13 @@ public final class Monitoring {
              * .context.Timestamp end_timestamp = 6;
              */
             public Builder clearEndTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000020);
-                endTimestamp_ = null;
-                if (endTimestampBuilder_ != null) {
-                    endTimestampBuilder_.dispose();
+                if (endTimestampBuilder_ == null) {
+                    endTimestamp_ = null;
+                    onChanged();
+                } else {
+                    endTimestamp_ = null;
                     endTimestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -13433,7 +13976,6 @@ public final class Monitoring {
              * .context.Timestamp end_timestamp = 6;
              */
             public context.ContextOuterClass.Timestamp.Builder getEndTimestampBuilder() {
-                bitField0_ |= 0x00000020;
                 onChanged();
                 return getEndTimestampFieldBuilder().getBuilder();
             }
@@ -13495,17 +14037,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public SubsDescriptor parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SubsDescriptor(input, extensionRegistry);
             }
         };
 
@@ -13567,6 +14099,57 @@ public final class Monitoring {
             return new SubscriptionID();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SubscriptionID(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (subsId_ != null) {
+                                    subBuilder = subsId_.toBuilder();
+                                }
+                                subsId_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(subsId_);
+                                    subsId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_SubscriptionID_descriptor;
         }
@@ -13603,7 +14186,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getSubsIdOrBuilder() {
-            return subsId_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : subsId_;
+            return getSubsId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -13624,7 +14207,7 @@ public final class Monitoring {
             if (subsId_ != null) {
                 output.writeMessage(1, getSubsId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -13636,7 +14219,7 @@ public final class Monitoring {
             if (subsId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getSubsId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -13656,7 +14239,7 @@ public final class Monitoring {
                 if (!getSubsId().equals(other.getSubsId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -13672,7 +14255,7 @@ public final class Monitoring {
                 hash = (37 * hash) + SUBS_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getSubsId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -13766,19 +14349,26 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.SubscriptionID.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                subsId_ = null;
-                if (subsIdBuilder_ != null) {
-                    subsIdBuilder_.dispose();
+                if (subsIdBuilder_ == null) {
+                    subsId_ = null;
+                } else {
+                    subsId_ = null;
                     subsIdBuilder_ = null;
                 }
                 return this;
@@ -13806,18 +14396,43 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.SubscriptionID buildPartial() {
                 monitoring.Monitoring.SubscriptionID result = new monitoring.Monitoring.SubscriptionID(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (subsIdBuilder_ == null) {
+                    result.subsId_ = subsId_;
+                } else {
+                    result.subsId_ = subsIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.SubscriptionID result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.subsId_ = subsIdBuilder_ == null ? subsId_ : subsIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -13836,7 +14451,7 @@ public final class Monitoring {
                 if (other.hasSubsId()) {
                     mergeSubsId(other.getSubsId());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -13848,47 +14463,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.SubscriptionID parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getSubsIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.SubscriptionID) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid subsId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 subsIdBuilder_;
@@ -13898,7 +14486,7 @@ public final class Monitoring {
              * @return Whether the subsId field is set.
              */
             public boolean hasSubsId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return subsIdBuilder_ != null || subsId_ != null;
             }
 
             /**
@@ -13922,11 +14510,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     subsId_ = value;
+                    onChanged();
                 } else {
                     subsIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -13936,11 +14523,10 @@ public final class Monitoring {
             public Builder setSubsId(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (subsIdBuilder_ == null) {
                     subsId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     subsIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -13949,16 +14535,15 @@ public final class Monitoring {
              */
             public Builder mergeSubsId(context.ContextOuterClass.Uuid value) {
                 if (subsIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && subsId_ != null && subsId_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getSubsIdBuilder().mergeFrom(value);
+                    if (subsId_ != null) {
+                        subsId_ = context.ContextOuterClass.Uuid.newBuilder(subsId_).mergeFrom(value).buildPartial();
                     } else {
                         subsId_ = value;
                     }
+                    onChanged();
                 } else {
                     subsIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -13966,13 +14551,13 @@ public final class Monitoring {
              * .context.Uuid subs_id = 1;
              */
             public Builder clearSubsId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                subsId_ = null;
-                if (subsIdBuilder_ != null) {
-                    subsIdBuilder_.dispose();
+                if (subsIdBuilder_ == null) {
+                    subsId_ = null;
+                    onChanged();
+                } else {
+                    subsId_ = null;
                     subsIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -13980,7 +14565,6 @@ public final class Monitoring {
              * .context.Uuid subs_id = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getSubsIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getSubsIdFieldBuilder().getBuilder();
             }
@@ -14034,17 +14618,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public SubscriptionID parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SubscriptionID(input, extensionRegistry);
             }
         };
 
@@ -14123,6 +14697,70 @@ public final class Monitoring {
             return new SubsResponse();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SubsResponse(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.SubscriptionID.Builder subBuilder = null;
+                                if (subsId_ != null) {
+                                    subBuilder = subsId_.toBuilder();
+                                }
+                                subsId_ = input.readMessage(monitoring.Monitoring.SubscriptionID.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(subsId_);
+                                    subsId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                monitoring.Monitoring.KpiList.Builder subBuilder = null;
+                                if (kpiList_ != null) {
+                                    subBuilder = kpiList_.toBuilder();
+                                }
+                                kpiList_ = input.readMessage(monitoring.Monitoring.KpiList.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiList_);
+                                    kpiList_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_SubsResponse_descriptor;
         }
@@ -14159,7 +14797,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.SubscriptionIDOrBuilder getSubsIdOrBuilder() {
-            return subsId_ == null ? monitoring.Monitoring.SubscriptionID.getDefaultInstance() : subsId_;
+            return getSubsId();
         }
 
         public static final int KPI_LIST_FIELD_NUMBER = 2;
@@ -14189,7 +14827,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiListOrBuilder getKpiListOrBuilder() {
-            return kpiList_ == null ? monitoring.Monitoring.KpiList.getDefaultInstance() : kpiList_;
+            return getKpiList();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -14213,7 +14851,7 @@ public final class Monitoring {
             if (kpiList_ != null) {
                 output.writeMessage(2, getKpiList());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -14228,7 +14866,7 @@ public final class Monitoring {
             if (kpiList_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getKpiList());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -14254,7 +14892,7 @@ public final class Monitoring {
                 if (!getKpiList().equals(other.getKpiList()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -14274,7 +14912,7 @@ public final class Monitoring {
                 hash = (37 * hash) + KPI_LIST_FIELD_NUMBER;
                 hash = (53 * hash) + getKpiList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -14368,24 +15006,32 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.SubsResponse.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                subsId_ = null;
-                if (subsIdBuilder_ != null) {
-                    subsIdBuilder_.dispose();
+                if (subsIdBuilder_ == null) {
+                    subsId_ = null;
+                } else {
+                    subsId_ = null;
                     subsIdBuilder_ = null;
                 }
-                kpiList_ = null;
-                if (kpiListBuilder_ != null) {
-                    kpiListBuilder_.dispose();
+                if (kpiListBuilder_ == null) {
+                    kpiList_ = null;
+                } else {
+                    kpiList_ = null;
                     kpiListBuilder_ = null;
                 }
                 return this;
@@ -14413,21 +15059,48 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.SubsResponse buildPartial() {
                 monitoring.Monitoring.SubsResponse result = new monitoring.Monitoring.SubsResponse(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (subsIdBuilder_ == null) {
+                    result.subsId_ = subsId_;
+                } else {
+                    result.subsId_ = subsIdBuilder_.build();
+                }
+                if (kpiListBuilder_ == null) {
+                    result.kpiList_ = kpiList_;
+                } else {
+                    result.kpiList_ = kpiListBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.SubsResponse result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.subsId_ = subsIdBuilder_ == null ? subsId_ : subsIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.kpiList_ = kpiListBuilder_ == null ? kpiList_ : kpiListBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -14449,7 +15122,7 @@ public final class Monitoring {
                 if (other.hasKpiList()) {
                     mergeKpiList(other.getKpiList());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -14461,54 +15134,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.SubsResponse parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getSubsIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getKpiListFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.SubsResponse) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.SubscriptionID subsId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 subsIdBuilder_;
@@ -14518,7 +15157,7 @@ public final class Monitoring {
              * @return Whether the subsId field is set.
              */
             public boolean hasSubsId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return subsIdBuilder_ != null || subsId_ != null;
             }
 
             /**
@@ -14542,11 +15181,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     subsId_ = value;
+                    onChanged();
                 } else {
                     subsIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -14556,11 +15194,10 @@ public final class Monitoring {
             public Builder setSubsId(monitoring.Monitoring.SubscriptionID.Builder builderForValue) {
                 if (subsIdBuilder_ == null) {
                     subsId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     subsIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -14569,16 +15206,15 @@ public final class Monitoring {
              */
             public Builder mergeSubsId(monitoring.Monitoring.SubscriptionID value) {
                 if (subsIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && subsId_ != null && subsId_ != monitoring.Monitoring.SubscriptionID.getDefaultInstance()) {
-                        getSubsIdBuilder().mergeFrom(value);
+                    if (subsId_ != null) {
+                        subsId_ = monitoring.Monitoring.SubscriptionID.newBuilder(subsId_).mergeFrom(value).buildPartial();
                     } else {
                         subsId_ = value;
                     }
+                    onChanged();
                 } else {
                     subsIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -14586,13 +15222,13 @@ public final class Monitoring {
              * .monitoring.SubscriptionID subs_id = 1;
              */
             public Builder clearSubsId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                subsId_ = null;
-                if (subsIdBuilder_ != null) {
-                    subsIdBuilder_.dispose();
+                if (subsIdBuilder_ == null) {
+                    subsId_ = null;
+                    onChanged();
+                } else {
+                    subsId_ = null;
                     subsIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -14600,7 +15236,6 @@ public final class Monitoring {
              * .monitoring.SubscriptionID subs_id = 1;
              */
             public monitoring.Monitoring.SubscriptionID.Builder getSubsIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getSubsIdFieldBuilder().getBuilder();
             }
@@ -14636,7 +15271,7 @@ public final class Monitoring {
              * @return Whether the kpiList field is set.
              */
             public boolean hasKpiList() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return kpiListBuilder_ != null || kpiList_ != null;
             }
 
             /**
@@ -14660,11 +15295,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiList_ = value;
+                    onChanged();
                 } else {
                     kpiListBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -14674,11 +15308,10 @@ public final class Monitoring {
             public Builder setKpiList(monitoring.Monitoring.KpiList.Builder builderForValue) {
                 if (kpiListBuilder_ == null) {
                     kpiList_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiListBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -14687,16 +15320,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiList(monitoring.Monitoring.KpiList value) {
                 if (kpiListBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && kpiList_ != null && kpiList_ != monitoring.Monitoring.KpiList.getDefaultInstance()) {
-                        getKpiListBuilder().mergeFrom(value);
+                    if (kpiList_ != null) {
+                        kpiList_ = monitoring.Monitoring.KpiList.newBuilder(kpiList_).mergeFrom(value).buildPartial();
                     } else {
                         kpiList_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiListBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -14704,13 +15336,13 @@ public final class Monitoring {
              * .monitoring.KpiList kpi_list = 2;
              */
             public Builder clearKpiList() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                kpiList_ = null;
-                if (kpiListBuilder_ != null) {
-                    kpiListBuilder_.dispose();
+                if (kpiListBuilder_ == null) {
+                    kpiList_ = null;
+                    onChanged();
+                } else {
+                    kpiList_ = null;
                     kpiListBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -14718,7 +15350,6 @@ public final class Monitoring {
              * .monitoring.KpiList kpi_list = 2;
              */
             public monitoring.Monitoring.KpiList.Builder getKpiListBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getKpiListFieldBuilder().getBuilder();
             }
@@ -14772,17 +15403,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public SubsResponse parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SubsResponse(input, extensionRegistry);
             }
         };
 
@@ -14853,6 +15474,57 @@ public final class Monitoring {
             return new SubsList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SubsList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    subsDescriptor_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                subsDescriptor_.add(input.readMessage(monitoring.Monitoring.SubsDescriptor.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    subsDescriptor_ = java.util.Collections.unmodifiableList(subsDescriptor_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_SubsList_descriptor;
         }
@@ -14864,7 +15536,6 @@ public final class Monitoring {
 
         public static final int SUBS_DESCRIPTOR_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List subsDescriptor_;
 
         /**
@@ -14925,7 +15596,7 @@ public final class Monitoring {
             for (int i = 0; i < subsDescriptor_.size(); i++) {
                 output.writeMessage(1, subsDescriptor_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -14937,7 +15608,7 @@ public final class Monitoring {
             for (int i = 0; i < subsDescriptor_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, subsDescriptor_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -14953,7 +15624,7 @@ public final class Monitoring {
             monitoring.Monitoring.SubsList other = (monitoring.Monitoring.SubsList) obj;
             if (!getSubsDescriptorList().equals(other.getSubsDescriptorList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -14969,7 +15640,7 @@ public final class Monitoring {
                 hash = (37 * hash) + SUBS_DESCRIPTOR_FIELD_NUMBER;
                 hash = (53 * hash) + getSubsDescriptorList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -15063,23 +15734,29 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.SubsList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getSubsDescriptorFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (subsDescriptorBuilder_ == null) {
                     subsDescriptor_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    subsDescriptor_ = null;
                     subsDescriptorBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -15105,15 +15782,7 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.SubsList buildPartial() {
                 monitoring.Monitoring.SubsList result = new monitoring.Monitoring.SubsList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(monitoring.Monitoring.SubsList result) {
+                int from_bitField0_ = bitField0_;
                 if (subsDescriptorBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         subsDescriptor_ = java.util.Collections.unmodifiableList(subsDescriptor_);
@@ -15123,10 +15792,38 @@ public final class Monitoring {
                 } else {
                     result.subsDescriptor_ = subsDescriptorBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.SubsList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -15166,7 +15863,7 @@ public final class Monitoring {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -15178,47 +15875,17 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.SubsList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    monitoring.Monitoring.SubsDescriptor m = input.readMessage(monitoring.Monitoring.SubsDescriptor.parser(), extensionRegistry);
-                                    if (subsDescriptorBuilder_ == null) {
-                                        ensureSubsDescriptorIsMutable();
-                                        subsDescriptor_.add(m);
-                                    } else {
-                                        subsDescriptorBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.SubsList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -15488,17 +16155,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public SubsList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SubsList(input, extensionRegistry);
             }
         };
 
@@ -15637,6 +16294,108 @@ public final class Monitoring {
             return new AlarmDescriptor();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private AlarmDescriptor(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.AlarmID.Builder subBuilder = null;
+                                if (alarmId_ != null) {
+                                    subBuilder = alarmId_.toBuilder();
+                                }
+                                alarmId_ = input.readMessage(monitoring.Monitoring.AlarmID.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(alarmId_);
+                                    alarmId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                alarmDescription_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 34:
+                            {
+                                monitoring.Monitoring.KpiId.Builder subBuilder = null;
+                                if (kpiId_ != null) {
+                                    subBuilder = kpiId_.toBuilder();
+                                }
+                                kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiId_);
+                                    kpiId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 42:
+                            {
+                                monitoring.Monitoring.KpiValueRange.Builder subBuilder = null;
+                                if (kpiValueRange_ != null) {
+                                    subBuilder = kpiValueRange_.toBuilder();
+                                }
+                                kpiValueRange_ = input.readMessage(monitoring.Monitoring.KpiValueRange.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiValueRange_);
+                                    kpiValueRange_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 50:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (timestamp_ != null) {
+                                    subBuilder = timestamp_.toBuilder();
+                                }
+                                timestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(timestamp_);
+                                    timestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_AlarmDescriptor_descriptor;
         }
@@ -15673,13 +16432,12 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.AlarmIDOrBuilder getAlarmIdOrBuilder() {
-            return alarmId_ == null ? monitoring.Monitoring.AlarmID.getDefaultInstance() : alarmId_;
+            return getAlarmId();
         }
 
         public static final int ALARM_DESCRIPTION_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object alarmDescription_ = "";
+        private volatile java.lang.Object alarmDescription_;
 
         /**
          * string alarm_description = 2;
@@ -15716,8 +16474,7 @@ public final class Monitoring {
 
         public static final int NAME_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 3;
@@ -15779,7 +16536,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
-            return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+            return getKpiId();
         }
 
         public static final int KPI_VALUE_RANGE_FIELD_NUMBER = 5;
@@ -15809,7 +16566,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiValueRangeOrBuilder getKpiValueRangeOrBuilder() {
-            return kpiValueRange_ == null ? monitoring.Monitoring.KpiValueRange.getDefaultInstance() : kpiValueRange_;
+            return getKpiValueRange();
         }
 
         public static final int TIMESTAMP_FIELD_NUMBER = 6;
@@ -15839,7 +16596,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-            return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+            return getTimestamp();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -15860,10 +16617,10 @@ public final class Monitoring {
             if (alarmId_ != null) {
                 output.writeMessage(1, getAlarmId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(alarmDescription_)) {
+            if (!getAlarmDescriptionBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, alarmDescription_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 3, name_);
             }
             if (kpiId_ != null) {
@@ -15875,7 +16632,7 @@ public final class Monitoring {
             if (timestamp_ != null) {
                 output.writeMessage(6, getTimestamp());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -15887,10 +16644,10 @@ public final class Monitoring {
             if (alarmId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getAlarmId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(alarmDescription_)) {
+            if (!getAlarmDescriptionBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, alarmDescription_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, name_);
             }
             if (kpiId_ != null) {
@@ -15902,7 +16659,7 @@ public final class Monitoring {
             if (timestamp_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(6, getTimestamp());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -15944,7 +16701,7 @@ public final class Monitoring {
                 if (!getTimestamp().equals(other.getTimestamp()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -15976,7 +16733,7 @@ public final class Monitoring {
                 hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
                 hash = (53 * hash) + getTimestamp().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -16070,36 +16827,46 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.AlarmDescriptor.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                alarmId_ = null;
-                if (alarmIdBuilder_ != null) {
-                    alarmIdBuilder_.dispose();
+                if (alarmIdBuilder_ == null) {
+                    alarmId_ = null;
+                } else {
+                    alarmId_ = null;
                     alarmIdBuilder_ = null;
                 }
                 alarmDescription_ = "";
                 name_ = "";
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                kpiValueRange_ = null;
-                if (kpiValueRangeBuilder_ != null) {
-                    kpiValueRangeBuilder_.dispose();
+                if (kpiValueRangeBuilder_ == null) {
+                    kpiValueRange_ = null;
+                } else {
+                    kpiValueRange_ = null;
                     kpiValueRangeBuilder_ = null;
                 }
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
                 return this;
@@ -16127,33 +16894,60 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.AlarmDescriptor buildPartial() {
                 monitoring.Monitoring.AlarmDescriptor result = new monitoring.Monitoring.AlarmDescriptor(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (alarmIdBuilder_ == null) {
+                    result.alarmId_ = alarmId_;
+                } else {
+                    result.alarmId_ = alarmIdBuilder_.build();
+                }
+                result.alarmDescription_ = alarmDescription_;
+                result.name_ = name_;
+                if (kpiIdBuilder_ == null) {
+                    result.kpiId_ = kpiId_;
+                } else {
+                    result.kpiId_ = kpiIdBuilder_.build();
+                }
+                if (kpiValueRangeBuilder_ == null) {
+                    result.kpiValueRange_ = kpiValueRange_;
+                } else {
+                    result.kpiValueRange_ = kpiValueRangeBuilder_.build();
+                }
+                if (timestampBuilder_ == null) {
+                    result.timestamp_ = timestamp_;
+                } else {
+                    result.timestamp_ = timestampBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.AlarmDescriptor result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.alarmId_ = alarmIdBuilder_ == null ? alarmId_ : alarmIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.alarmDescription_ = alarmDescription_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.kpiValueRange_ = kpiValueRangeBuilder_ == null ? kpiValueRange_ : kpiValueRangeBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000020) != 0)) {
-                    result.timestamp_ = timestampBuilder_ == null ? timestamp_ : timestampBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -16174,12 +16968,10 @@ public final class Monitoring {
                 }
                 if (!other.getAlarmDescription().isEmpty()) {
                     alarmDescription_ = other.alarmDescription_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000004;
                     onChanged();
                 }
                 if (other.hasKpiId()) {
@@ -16191,7 +16983,7 @@ public final class Monitoring {
                 if (other.hasTimestamp()) {
                     mergeTimestamp(other.getTimestamp());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -16203,82 +16995,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.AlarmDescriptor parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getAlarmIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    alarmDescription_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    input.readMessage(getKpiValueRangeFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 42
-                            case 50:
-                                {
-                                    input.readMessage(getTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000020;
-                                    break;
-                                }
-                            // case 50
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.AlarmDescriptor) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.AlarmID alarmId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 alarmIdBuilder_;
@@ -16288,7 +17018,7 @@ public final class Monitoring {
              * @return Whether the alarmId field is set.
              */
             public boolean hasAlarmId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return alarmIdBuilder_ != null || alarmId_ != null;
             }
 
             /**
@@ -16312,11 +17042,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     alarmId_ = value;
+                    onChanged();
                 } else {
                     alarmIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -16326,11 +17055,10 @@ public final class Monitoring {
             public Builder setAlarmId(monitoring.Monitoring.AlarmID.Builder builderForValue) {
                 if (alarmIdBuilder_ == null) {
                     alarmId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     alarmIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -16339,16 +17067,15 @@ public final class Monitoring {
              */
             public Builder mergeAlarmId(monitoring.Monitoring.AlarmID value) {
                 if (alarmIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && alarmId_ != null && alarmId_ != monitoring.Monitoring.AlarmID.getDefaultInstance()) {
-                        getAlarmIdBuilder().mergeFrom(value);
+                    if (alarmId_ != null) {
+                        alarmId_ = monitoring.Monitoring.AlarmID.newBuilder(alarmId_).mergeFrom(value).buildPartial();
                     } else {
                         alarmId_ = value;
                     }
+                    onChanged();
                 } else {
                     alarmIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -16356,13 +17083,13 @@ public final class Monitoring {
              * .monitoring.AlarmID alarm_id = 1;
              */
             public Builder clearAlarmId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                alarmId_ = null;
-                if (alarmIdBuilder_ != null) {
-                    alarmIdBuilder_.dispose();
+                if (alarmIdBuilder_ == null) {
+                    alarmId_ = null;
+                    onChanged();
+                } else {
+                    alarmId_ = null;
                     alarmIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -16370,7 +17097,6 @@ public final class Monitoring {
              * .monitoring.AlarmID alarm_id = 1;
              */
             public monitoring.Monitoring.AlarmID.Builder getAlarmIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getAlarmIdFieldBuilder().getBuilder();
             }
@@ -16440,7 +17166,6 @@ public final class Monitoring {
                     throw new NullPointerException();
                 }
                 alarmDescription_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -16451,7 +17176,6 @@ public final class Monitoring {
              */
             public Builder clearAlarmDescription() {
                 alarmDescription_ = getDefaultInstance().getAlarmDescription();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -16467,7 +17191,6 @@ public final class Monitoring {
                 }
                 checkByteStringIsUtf8(value);
                 alarmDescription_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -16515,7 +17238,6 @@ public final class Monitoring {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -16526,7 +17248,6 @@ public final class Monitoring {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -16542,7 +17263,6 @@ public final class Monitoring {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -16556,7 +17276,7 @@ public final class Monitoring {
              * @return Whether the kpiId field is set.
              */
             public boolean hasKpiId() {
-                return ((bitField0_ & 0x00000008) != 0);
+                return kpiIdBuilder_ != null || kpiId_ != null;
             }
 
             /**
@@ -16580,11 +17300,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiId_ = value;
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -16594,11 +17313,10 @@ public final class Monitoring {
             public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) {
                 if (kpiIdBuilder_ == null) {
                     kpiId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -16607,16 +17325,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiId(monitoring.Monitoring.KpiId value) {
                 if (kpiIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) {
-                        getKpiIdBuilder().mergeFrom(value);
+                    if (kpiId_ != null) {
+                        kpiId_ = monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial();
                     } else {
                         kpiId_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -16624,13 +17341,13 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 4;
              */
             public Builder clearKpiId() {
-                bitField0_ = (bitField0_ & ~0x00000008);
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                    onChanged();
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -16638,7 +17355,6 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 4;
              */
             public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() {
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return getKpiIdFieldBuilder().getBuilder();
             }
@@ -16674,7 +17390,7 @@ public final class Monitoring {
              * @return Whether the kpiValueRange field is set.
              */
             public boolean hasKpiValueRange() {
-                return ((bitField0_ & 0x00000010) != 0);
+                return kpiValueRangeBuilder_ != null || kpiValueRange_ != null;
             }
 
             /**
@@ -16698,11 +17414,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiValueRange_ = value;
+                    onChanged();
                 } else {
                     kpiValueRangeBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -16712,11 +17427,10 @@ public final class Monitoring {
             public Builder setKpiValueRange(monitoring.Monitoring.KpiValueRange.Builder builderForValue) {
                 if (kpiValueRangeBuilder_ == null) {
                     kpiValueRange_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiValueRangeBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -16725,16 +17439,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiValueRange(monitoring.Monitoring.KpiValueRange value) {
                 if (kpiValueRangeBuilder_ == null) {
-                    if (((bitField0_ & 0x00000010) != 0) && kpiValueRange_ != null && kpiValueRange_ != monitoring.Monitoring.KpiValueRange.getDefaultInstance()) {
-                        getKpiValueRangeBuilder().mergeFrom(value);
+                    if (kpiValueRange_ != null) {
+                        kpiValueRange_ = monitoring.Monitoring.KpiValueRange.newBuilder(kpiValueRange_).mergeFrom(value).buildPartial();
                     } else {
                         kpiValueRange_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiValueRangeBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -16742,13 +17455,13 @@ public final class Monitoring {
              * .monitoring.KpiValueRange kpi_value_range = 5;
              */
             public Builder clearKpiValueRange() {
-                bitField0_ = (bitField0_ & ~0x00000010);
-                kpiValueRange_ = null;
-                if (kpiValueRangeBuilder_ != null) {
-                    kpiValueRangeBuilder_.dispose();
+                if (kpiValueRangeBuilder_ == null) {
+                    kpiValueRange_ = null;
+                    onChanged();
+                } else {
+                    kpiValueRange_ = null;
                     kpiValueRangeBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -16756,7 +17469,6 @@ public final class Monitoring {
              * .monitoring.KpiValueRange kpi_value_range = 5;
              */
             public monitoring.Monitoring.KpiValueRange.Builder getKpiValueRangeBuilder() {
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return getKpiValueRangeFieldBuilder().getBuilder();
             }
@@ -16792,7 +17504,7 @@ public final class Monitoring {
              * @return Whether the timestamp field is set.
              */
             public boolean hasTimestamp() {
-                return ((bitField0_ & 0x00000020) != 0);
+                return timestampBuilder_ != null || timestamp_ != null;
             }
 
             /**
@@ -16816,11 +17528,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     timestamp_ = value;
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -16830,11 +17541,10 @@ public final class Monitoring {
             public Builder setTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (timestampBuilder_ == null) {
                     timestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -16843,16 +17553,15 @@ public final class Monitoring {
              */
             public Builder mergeTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (timestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000020) != 0) && timestamp_ != null && timestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getTimestampBuilder().mergeFrom(value);
+                    if (timestamp_ != null) {
+                        timestamp_ = context.ContextOuterClass.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial();
                     } else {
                         timestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     timestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -16860,13 +17569,13 @@ public final class Monitoring {
              * .context.Timestamp timestamp = 6;
              */
             public Builder clearTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000020);
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                    onChanged();
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -16874,7 +17583,6 @@ public final class Monitoring {
              * .context.Timestamp timestamp = 6;
              */
             public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
-                bitField0_ |= 0x00000020;
                 onChanged();
                 return getTimestampFieldBuilder().getBuilder();
             }
@@ -16928,17 +17636,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public AlarmDescriptor parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new AlarmDescriptor(input, extensionRegistry);
             }
         };
 
@@ -17000,6 +17698,57 @@ public final class Monitoring {
             return new AlarmID();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private AlarmID(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (alarmId_ != null) {
+                                    subBuilder = alarmId_.toBuilder();
+                                }
+                                alarmId_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(alarmId_);
+                                    alarmId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_AlarmID_descriptor;
         }
@@ -17036,7 +17785,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getAlarmIdOrBuilder() {
-            return alarmId_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : alarmId_;
+            return getAlarmId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -17057,7 +17806,7 @@ public final class Monitoring {
             if (alarmId_ != null) {
                 output.writeMessage(1, getAlarmId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -17069,7 +17818,7 @@ public final class Monitoring {
             if (alarmId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getAlarmId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -17089,7 +17838,7 @@ public final class Monitoring {
                 if (!getAlarmId().equals(other.getAlarmId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -17105,7 +17854,7 @@ public final class Monitoring {
                 hash = (37 * hash) + ALARM_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getAlarmId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -17199,19 +17948,26 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.AlarmID.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                alarmId_ = null;
-                if (alarmIdBuilder_ != null) {
-                    alarmIdBuilder_.dispose();
+                if (alarmIdBuilder_ == null) {
+                    alarmId_ = null;
+                } else {
+                    alarmId_ = null;
                     alarmIdBuilder_ = null;
                 }
                 return this;
@@ -17239,18 +17995,43 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.AlarmID buildPartial() {
                 monitoring.Monitoring.AlarmID result = new monitoring.Monitoring.AlarmID(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (alarmIdBuilder_ == null) {
+                    result.alarmId_ = alarmId_;
+                } else {
+                    result.alarmId_ = alarmIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.AlarmID result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.alarmId_ = alarmIdBuilder_ == null ? alarmId_ : alarmIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -17269,7 +18050,7 @@ public final class Monitoring {
                 if (other.hasAlarmId()) {
                     mergeAlarmId(other.getAlarmId());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -17278,50 +18059,23 @@ public final class Monitoring {
             public final boolean isInitialized() {
                 return true;
             }
-
-            @java.lang.Override
-            public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
-                try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getAlarmIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
+                monitoring.Monitoring.AlarmID parsedMessage = null;
+                try {
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.AlarmID) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid alarmId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 alarmIdBuilder_;
@@ -17331,7 +18085,7 @@ public final class Monitoring {
              * @return Whether the alarmId field is set.
              */
             public boolean hasAlarmId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return alarmIdBuilder_ != null || alarmId_ != null;
             }
 
             /**
@@ -17355,11 +18109,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     alarmId_ = value;
+                    onChanged();
                 } else {
                     alarmIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -17369,11 +18122,10 @@ public final class Monitoring {
             public Builder setAlarmId(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (alarmIdBuilder_ == null) {
                     alarmId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     alarmIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -17382,16 +18134,15 @@ public final class Monitoring {
              */
             public Builder mergeAlarmId(context.ContextOuterClass.Uuid value) {
                 if (alarmIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && alarmId_ != null && alarmId_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getAlarmIdBuilder().mergeFrom(value);
+                    if (alarmId_ != null) {
+                        alarmId_ = context.ContextOuterClass.Uuid.newBuilder(alarmId_).mergeFrom(value).buildPartial();
                     } else {
                         alarmId_ = value;
                     }
+                    onChanged();
                 } else {
                     alarmIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -17399,13 +18150,13 @@ public final class Monitoring {
              * .context.Uuid alarm_id = 1;
              */
             public Builder clearAlarmId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                alarmId_ = null;
-                if (alarmIdBuilder_ != null) {
-                    alarmIdBuilder_.dispose();
+                if (alarmIdBuilder_ == null) {
+                    alarmId_ = null;
+                    onChanged();
+                } else {
+                    alarmId_ = null;
                     alarmIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -17413,7 +18164,6 @@ public final class Monitoring {
              * .context.Uuid alarm_id = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getAlarmIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getAlarmIdFieldBuilder().getBuilder();
             }
@@ -17467,17 +18217,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public AlarmID parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new AlarmID(input, extensionRegistry);
             }
         };
 
@@ -17551,6 +18291,67 @@ public final class Monitoring {
             return new AlarmSubscription();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private AlarmSubscription(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.AlarmID.Builder subBuilder = null;
+                                if (alarmId_ != null) {
+                                    subBuilder = alarmId_.toBuilder();
+                                }
+                                alarmId_ = input.readMessage(monitoring.Monitoring.AlarmID.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(alarmId_);
+                                    alarmId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 21:
+                            {
+                                subscriptionTimeoutS_ = input.readFloat();
+                                break;
+                            }
+                        case 29:
+                            {
+                                subscriptionFrequencyMs_ = input.readFloat();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_AlarmSubscription_descriptor;
         }
@@ -17587,12 +18388,12 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.AlarmIDOrBuilder getAlarmIdOrBuilder() {
-            return alarmId_ == null ? monitoring.Monitoring.AlarmID.getDefaultInstance() : alarmId_;
+            return getAlarmId();
         }
 
         public static final int SUBSCRIPTION_TIMEOUT_S_FIELD_NUMBER = 2;
 
-        private float subscriptionTimeoutS_ = 0F;
+        private float subscriptionTimeoutS_;
 
         /**
          * float subscription_timeout_s = 2;
@@ -17605,7 +18406,7 @@ public final class Monitoring {
 
         public static final int SUBSCRIPTION_FREQUENCY_MS_FIELD_NUMBER = 3;
 
-        private float subscriptionFrequencyMs_ = 0F;
+        private float subscriptionFrequencyMs_;
 
         /**
          * float subscription_frequency_ms = 3;
@@ -17634,13 +18435,13 @@ public final class Monitoring {
             if (alarmId_ != null) {
                 output.writeMessage(1, getAlarmId());
             }
-            if (java.lang.Float.floatToRawIntBits(subscriptionTimeoutS_) != 0) {
+            if (subscriptionTimeoutS_ != 0F) {
                 output.writeFloat(2, subscriptionTimeoutS_);
             }
-            if (java.lang.Float.floatToRawIntBits(subscriptionFrequencyMs_) != 0) {
+            if (subscriptionFrequencyMs_ != 0F) {
                 output.writeFloat(3, subscriptionFrequencyMs_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -17652,13 +18453,13 @@ public final class Monitoring {
             if (alarmId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getAlarmId());
             }
-            if (java.lang.Float.floatToRawIntBits(subscriptionTimeoutS_) != 0) {
+            if (subscriptionTimeoutS_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(2, subscriptionTimeoutS_);
             }
-            if (java.lang.Float.floatToRawIntBits(subscriptionFrequencyMs_) != 0) {
+            if (subscriptionFrequencyMs_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(3, subscriptionFrequencyMs_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -17682,7 +18483,7 @@ public final class Monitoring {
                 return false;
             if (java.lang.Float.floatToIntBits(getSubscriptionFrequencyMs()) != java.lang.Float.floatToIntBits(other.getSubscriptionFrequencyMs()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -17702,7 +18503,7 @@ public final class Monitoring {
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getSubscriptionTimeoutS());
             hash = (37 * hash) + SUBSCRIPTION_FREQUENCY_MS_FIELD_NUMBER;
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getSubscriptionFrequencyMs());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -17796,19 +18597,26 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.AlarmSubscription.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                alarmId_ = null;
-                if (alarmIdBuilder_ != null) {
-                    alarmIdBuilder_.dispose();
+                if (alarmIdBuilder_ == null) {
+                    alarmId_ = null;
+                } else {
+                    alarmId_ = null;
                     alarmIdBuilder_ = null;
                 }
                 subscriptionTimeoutS_ = 0F;
@@ -17838,24 +18646,45 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.AlarmSubscription buildPartial() {
                 monitoring.Monitoring.AlarmSubscription result = new monitoring.Monitoring.AlarmSubscription(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (alarmIdBuilder_ == null) {
+                    result.alarmId_ = alarmId_;
+                } else {
+                    result.alarmId_ = alarmIdBuilder_.build();
                 }
+                result.subscriptionTimeoutS_ = subscriptionTimeoutS_;
+                result.subscriptionFrequencyMs_ = subscriptionFrequencyMs_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.AlarmSubscription result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.alarmId_ = alarmIdBuilder_ == null ? alarmId_ : alarmIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.subscriptionTimeoutS_ = subscriptionTimeoutS_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.subscriptionFrequencyMs_ = subscriptionFrequencyMs_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -17880,7 +18709,7 @@ public final class Monitoring {
                 if (other.getSubscriptionFrequencyMs() != 0F) {
                     setSubscriptionFrequencyMs(other.getSubscriptionFrequencyMs());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -17892,61 +18721,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.AlarmSubscription parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getAlarmIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 21:
-                                {
-                                    subscriptionTimeoutS_ = input.readFloat();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 21
-                            case 29:
-                                {
-                                    subscriptionFrequencyMs_ = input.readFloat();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 29
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.AlarmSubscription) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.AlarmID alarmId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 alarmIdBuilder_;
@@ -17956,7 +18744,7 @@ public final class Monitoring {
              * @return Whether the alarmId field is set.
              */
             public boolean hasAlarmId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return alarmIdBuilder_ != null || alarmId_ != null;
             }
 
             /**
@@ -17980,11 +18768,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     alarmId_ = value;
+                    onChanged();
                 } else {
                     alarmIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -17994,11 +18781,10 @@ public final class Monitoring {
             public Builder setAlarmId(monitoring.Monitoring.AlarmID.Builder builderForValue) {
                 if (alarmIdBuilder_ == null) {
                     alarmId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     alarmIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -18007,16 +18793,15 @@ public final class Monitoring {
              */
             public Builder mergeAlarmId(monitoring.Monitoring.AlarmID value) {
                 if (alarmIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && alarmId_ != null && alarmId_ != monitoring.Monitoring.AlarmID.getDefaultInstance()) {
-                        getAlarmIdBuilder().mergeFrom(value);
+                    if (alarmId_ != null) {
+                        alarmId_ = monitoring.Monitoring.AlarmID.newBuilder(alarmId_).mergeFrom(value).buildPartial();
                     } else {
                         alarmId_ = value;
                     }
+                    onChanged();
                 } else {
                     alarmIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -18024,13 +18809,13 @@ public final class Monitoring {
              * .monitoring.AlarmID alarm_id = 1;
              */
             public Builder clearAlarmId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                alarmId_ = null;
-                if (alarmIdBuilder_ != null) {
-                    alarmIdBuilder_.dispose();
+                if (alarmIdBuilder_ == null) {
+                    alarmId_ = null;
+                    onChanged();
+                } else {
+                    alarmId_ = null;
                     alarmIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -18038,7 +18823,6 @@ public final class Monitoring {
              * .monitoring.AlarmID alarm_id = 1;
              */
             public monitoring.Monitoring.AlarmID.Builder getAlarmIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getAlarmIdFieldBuilder().getBuilder();
             }
@@ -18083,7 +18867,6 @@ public final class Monitoring {
              */
             public Builder setSubscriptionTimeoutS(float value) {
                 subscriptionTimeoutS_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -18093,7 +18876,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearSubscriptionTimeoutS() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 subscriptionTimeoutS_ = 0F;
                 onChanged();
                 return this;
@@ -18117,7 +18899,6 @@ public final class Monitoring {
              */
             public Builder setSubscriptionFrequencyMs(float value) {
                 subscriptionFrequencyMs_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -18127,7 +18908,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearSubscriptionFrequencyMs() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 subscriptionFrequencyMs_ = 0F;
                 onChanged();
                 return this;
@@ -18160,17 +18940,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public AlarmSubscription parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new AlarmSubscription(input, extensionRegistry);
             }
         };
 
@@ -18262,6 +19032,76 @@ public final class Monitoring {
             return new AlarmResponse();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private AlarmResponse(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.AlarmID.Builder subBuilder = null;
+                                if (alarmId_ != null) {
+                                    subBuilder = alarmId_.toBuilder();
+                                }
+                                alarmId_ = input.readMessage(monitoring.Monitoring.AlarmID.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(alarmId_);
+                                    alarmId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                text_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                monitoring.Monitoring.KpiList.Builder subBuilder = null;
+                                if (kpiList_ != null) {
+                                    subBuilder = kpiList_.toBuilder();
+                                }
+                                kpiList_ = input.readMessage(monitoring.Monitoring.KpiList.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiList_);
+                                    kpiList_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_AlarmResponse_descriptor;
         }
@@ -18298,13 +19138,12 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.AlarmIDOrBuilder getAlarmIdOrBuilder() {
-            return alarmId_ == null ? monitoring.Monitoring.AlarmID.getDefaultInstance() : alarmId_;
+            return getAlarmId();
         }
 
         public static final int TEXT_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object text_ = "";
+        private volatile java.lang.Object text_;
 
         /**
          * string text = 2;
@@ -18366,7 +19205,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiListOrBuilder getKpiListOrBuilder() {
-            return kpiList_ == null ? monitoring.Monitoring.KpiList.getDefaultInstance() : kpiList_;
+            return getKpiList();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -18387,13 +19226,13 @@ public final class Monitoring {
             if (alarmId_ != null) {
                 output.writeMessage(1, getAlarmId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(text_)) {
+            if (!getTextBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, text_);
             }
             if (kpiList_ != null) {
                 output.writeMessage(3, getKpiList());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -18405,13 +19244,13 @@ public final class Monitoring {
             if (alarmId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getAlarmId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(text_)) {
+            if (!getTextBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, text_);
             }
             if (kpiList_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getKpiList());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -18439,7 +19278,7 @@ public final class Monitoring {
                 if (!getKpiList().equals(other.getKpiList()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -18461,7 +19300,7 @@ public final class Monitoring {
                 hash = (37 * hash) + KPI_LIST_FIELD_NUMBER;
                 hash = (53 * hash) + getKpiList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -18555,25 +19394,33 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.AlarmResponse.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                alarmId_ = null;
-                if (alarmIdBuilder_ != null) {
-                    alarmIdBuilder_.dispose();
+                if (alarmIdBuilder_ == null) {
+                    alarmId_ = null;
+                } else {
+                    alarmId_ = null;
                     alarmIdBuilder_ = null;
                 }
                 text_ = "";
-                kpiList_ = null;
-                if (kpiListBuilder_ != null) {
-                    kpiListBuilder_.dispose();
+                if (kpiListBuilder_ == null) {
+                    kpiList_ = null;
+                } else {
+                    kpiList_ = null;
                     kpiListBuilder_ = null;
                 }
                 return this;
@@ -18601,24 +19448,49 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.AlarmResponse buildPartial() {
                 monitoring.Monitoring.AlarmResponse result = new monitoring.Monitoring.AlarmResponse(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (alarmIdBuilder_ == null) {
+                    result.alarmId_ = alarmId_;
+                } else {
+                    result.alarmId_ = alarmIdBuilder_.build();
+                }
+                result.text_ = text_;
+                if (kpiListBuilder_ == null) {
+                    result.kpiList_ = kpiList_;
+                } else {
+                    result.kpiList_ = kpiListBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.AlarmResponse result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.alarmId_ = alarmIdBuilder_ == null ? alarmId_ : alarmIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.text_ = text_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.kpiList_ = kpiListBuilder_ == null ? kpiList_ : kpiListBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -18639,13 +19511,12 @@ public final class Monitoring {
                 }
                 if (!other.getText().isEmpty()) {
                     text_ = other.text_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (other.hasKpiList()) {
                     mergeKpiList(other.getKpiList());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -18657,61 +19528,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.AlarmResponse parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getAlarmIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    text_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getKpiListFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.AlarmResponse) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.AlarmID alarmId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 alarmIdBuilder_;
@@ -18721,7 +19551,7 @@ public final class Monitoring {
              * @return Whether the alarmId field is set.
              */
             public boolean hasAlarmId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return alarmIdBuilder_ != null || alarmId_ != null;
             }
 
             /**
@@ -18745,11 +19575,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     alarmId_ = value;
+                    onChanged();
                 } else {
                     alarmIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -18759,11 +19588,10 @@ public final class Monitoring {
             public Builder setAlarmId(monitoring.Monitoring.AlarmID.Builder builderForValue) {
                 if (alarmIdBuilder_ == null) {
                     alarmId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     alarmIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -18772,16 +19600,15 @@ public final class Monitoring {
              */
             public Builder mergeAlarmId(monitoring.Monitoring.AlarmID value) {
                 if (alarmIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && alarmId_ != null && alarmId_ != monitoring.Monitoring.AlarmID.getDefaultInstance()) {
-                        getAlarmIdBuilder().mergeFrom(value);
+                    if (alarmId_ != null) {
+                        alarmId_ = monitoring.Monitoring.AlarmID.newBuilder(alarmId_).mergeFrom(value).buildPartial();
                     } else {
                         alarmId_ = value;
                     }
+                    onChanged();
                 } else {
                     alarmIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -18789,13 +19616,13 @@ public final class Monitoring {
              * .monitoring.AlarmID alarm_id = 1;
              */
             public Builder clearAlarmId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                alarmId_ = null;
-                if (alarmIdBuilder_ != null) {
-                    alarmIdBuilder_.dispose();
+                if (alarmIdBuilder_ == null) {
+                    alarmId_ = null;
+                    onChanged();
+                } else {
+                    alarmId_ = null;
                     alarmIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -18803,7 +19630,6 @@ public final class Monitoring {
              * .monitoring.AlarmID alarm_id = 1;
              */
             public monitoring.Monitoring.AlarmID.Builder getAlarmIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getAlarmIdFieldBuilder().getBuilder();
             }
@@ -18873,7 +19699,6 @@ public final class Monitoring {
                     throw new NullPointerException();
                 }
                 text_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -18884,7 +19709,6 @@ public final class Monitoring {
              */
             public Builder clearText() {
                 text_ = getDefaultInstance().getText();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -18900,7 +19724,6 @@ public final class Monitoring {
                 }
                 checkByteStringIsUtf8(value);
                 text_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -18914,7 +19737,7 @@ public final class Monitoring {
              * @return Whether the kpiList field is set.
              */
             public boolean hasKpiList() {
-                return ((bitField0_ & 0x00000004) != 0);
+                return kpiListBuilder_ != null || kpiList_ != null;
             }
 
             /**
@@ -18938,11 +19761,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiList_ = value;
+                    onChanged();
                 } else {
                     kpiListBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -18952,11 +19774,10 @@ public final class Monitoring {
             public Builder setKpiList(monitoring.Monitoring.KpiList.Builder builderForValue) {
                 if (kpiListBuilder_ == null) {
                     kpiList_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiListBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -18965,16 +19786,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiList(monitoring.Monitoring.KpiList value) {
                 if (kpiListBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0) && kpiList_ != null && kpiList_ != monitoring.Monitoring.KpiList.getDefaultInstance()) {
-                        getKpiListBuilder().mergeFrom(value);
+                    if (kpiList_ != null) {
+                        kpiList_ = monitoring.Monitoring.KpiList.newBuilder(kpiList_).mergeFrom(value).buildPartial();
                     } else {
                         kpiList_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiListBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -18982,13 +19802,13 @@ public final class Monitoring {
              * .monitoring.KpiList kpi_list = 3;
              */
             public Builder clearKpiList() {
-                bitField0_ = (bitField0_ & ~0x00000004);
-                kpiList_ = null;
-                if (kpiListBuilder_ != null) {
-                    kpiListBuilder_.dispose();
+                if (kpiListBuilder_ == null) {
+                    kpiList_ = null;
+                    onChanged();
+                } else {
+                    kpiList_ = null;
                     kpiListBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -18996,7 +19816,6 @@ public final class Monitoring {
              * .monitoring.KpiList kpi_list = 3;
              */
             public monitoring.Monitoring.KpiList.Builder getKpiListBuilder() {
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return getKpiListFieldBuilder().getBuilder();
             }
@@ -19050,17 +19869,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public AlarmResponse parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new AlarmResponse(input, extensionRegistry);
             }
         };
 
@@ -19131,6 +19940,57 @@ public final class Monitoring {
             return new AlarmList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private AlarmList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    alarmDescriptor_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                alarmDescriptor_.add(input.readMessage(monitoring.Monitoring.AlarmDescriptor.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    alarmDescriptor_ = java.util.Collections.unmodifiableList(alarmDescriptor_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_AlarmList_descriptor;
         }
@@ -19142,7 +20002,6 @@ public final class Monitoring {
 
         public static final int ALARM_DESCRIPTOR_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List alarmDescriptor_;
 
         /**
@@ -19203,7 +20062,7 @@ public final class Monitoring {
             for (int i = 0; i < alarmDescriptor_.size(); i++) {
                 output.writeMessage(1, alarmDescriptor_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -19215,7 +20074,7 @@ public final class Monitoring {
             for (int i = 0; i < alarmDescriptor_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, alarmDescriptor_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -19231,7 +20090,7 @@ public final class Monitoring {
             monitoring.Monitoring.AlarmList other = (monitoring.Monitoring.AlarmList) obj;
             if (!getAlarmDescriptorList().equals(other.getAlarmDescriptorList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -19247,7 +20106,7 @@ public final class Monitoring {
                 hash = (37 * hash) + ALARM_DESCRIPTOR_FIELD_NUMBER;
                 hash = (53 * hash) + getAlarmDescriptorList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -19341,23 +20200,29 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.AlarmList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getAlarmDescriptorFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (alarmDescriptorBuilder_ == null) {
                     alarmDescriptor_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    alarmDescriptor_ = null;
                     alarmDescriptorBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -19383,15 +20248,7 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.AlarmList buildPartial() {
                 monitoring.Monitoring.AlarmList result = new monitoring.Monitoring.AlarmList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(monitoring.Monitoring.AlarmList result) {
+                int from_bitField0_ = bitField0_;
                 if (alarmDescriptorBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         alarmDescriptor_ = java.util.Collections.unmodifiableList(alarmDescriptor_);
@@ -19401,10 +20258,38 @@ public final class Monitoring {
                 } else {
                     result.alarmDescriptor_ = alarmDescriptorBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.AlarmList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -19444,7 +20329,7 @@ public final class Monitoring {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -19456,47 +20341,17 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.AlarmList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    monitoring.Monitoring.AlarmDescriptor m = input.readMessage(monitoring.Monitoring.AlarmDescriptor.parser(), extensionRegistry);
-                                    if (alarmDescriptorBuilder_ == null) {
-                                        ensureAlarmDescriptorIsMutable();
-                                        alarmDescriptor_.add(m);
-                                    } else {
-                                        alarmDescriptorBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.AlarmList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -19766,17 +20621,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public AlarmList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new AlarmList(input, extensionRegistry);
             }
         };
 
diff --git a/src/policy/target/generated-sources/grpc/monitoring/MonitoringServiceGrpc.java b/src/policy/target/generated-sources/grpc/monitoring/MonitoringServiceGrpc.java
index 7a275e577..83dffd625 100644
--- a/src/policy/target/generated-sources/grpc/monitoring/MonitoringServiceGrpc.java
+++ b/src/policy/target/generated-sources/grpc/monitoring/MonitoringServiceGrpc.java
@@ -4,8 +4,7 @@ import static io.grpc.MethodDescriptor.generateFullMethodName;
 
 /**
  */
-@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.55.1)", comments = "Source: monitoring.proto")
-@io.grpc.stub.annotations.GrpcGenerated
+@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.38.1)", comments = "Source: monitoring.proto")
 public final class MonitoringServiceGrpc {
 
     private MonitoringServiceGrpc() {
@@ -328,130 +327,123 @@ public final class MonitoringServiceGrpc {
 
     /**
      */
-    public interface AsyncService {
+    public static abstract class MonitoringServiceImplBase implements io.grpc.BindableService {
 
         /**
          */
-        default void setKpi(monitoring.Monitoring.KpiDescriptor request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setKpi(monitoring.Monitoring.KpiDescriptor request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetKpiMethod(), responseObserver);
         }
 
         /**
          */
-        default void deleteKpi(monitoring.Monitoring.KpiId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void deleteKpi(monitoring.Monitoring.KpiId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getDeleteKpiMethod(), responseObserver);
         }
 
         /**
          */
-        default void getKpiDescriptor(monitoring.Monitoring.KpiId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getKpiDescriptor(monitoring.Monitoring.KpiId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetKpiDescriptorMethod(), responseObserver);
         }
 
         /**
          */
-        default void getKpiDescriptorList(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getKpiDescriptorList(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetKpiDescriptorListMethod(), responseObserver);
         }
 
         /**
          */
-        default void includeKpi(monitoring.Monitoring.Kpi request, io.grpc.stub.StreamObserver responseObserver) {
+        public void includeKpi(monitoring.Monitoring.Kpi request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getIncludeKpiMethod(), responseObserver);
         }
 
         /**
          */
-        default void monitorKpi(monitoring.Monitoring.MonitorKpiRequest request, io.grpc.stub.StreamObserver responseObserver) {
+        public void monitorKpi(monitoring.Monitoring.MonitorKpiRequest request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getMonitorKpiMethod(), responseObserver);
         }
 
         /**
          */
-        default void queryKpiData(monitoring.Monitoring.KpiQuery request, io.grpc.stub.StreamObserver responseObserver) {
+        public void queryKpiData(monitoring.Monitoring.KpiQuery request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getQueryKpiDataMethod(), responseObserver);
         }
 
         /**
          */
-        default void setKpiSubscription(monitoring.Monitoring.SubsDescriptor request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setKpiSubscription(monitoring.Monitoring.SubsDescriptor request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetKpiSubscriptionMethod(), responseObserver);
         }
 
         /**
          */
-        default void getSubsDescriptor(monitoring.Monitoring.SubscriptionID request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getSubsDescriptor(monitoring.Monitoring.SubscriptionID request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetSubsDescriptorMethod(), responseObserver);
         }
 
         /**
          */
-        default void getSubscriptions(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getSubscriptions(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetSubscriptionsMethod(), responseObserver);
         }
 
         /**
          */
-        default void deleteSubscription(monitoring.Monitoring.SubscriptionID request, io.grpc.stub.StreamObserver responseObserver) {
+        public void deleteSubscription(monitoring.Monitoring.SubscriptionID request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getDeleteSubscriptionMethod(), responseObserver);
         }
 
         /**
          */
-        default void setKpiAlarm(monitoring.Monitoring.AlarmDescriptor request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setKpiAlarm(monitoring.Monitoring.AlarmDescriptor request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetKpiAlarmMethod(), responseObserver);
         }
 
         /**
          */
-        default void getAlarms(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getAlarms(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetAlarmsMethod(), responseObserver);
         }
 
         /**
          */
-        default void getAlarmDescriptor(monitoring.Monitoring.AlarmID request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getAlarmDescriptor(monitoring.Monitoring.AlarmID request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetAlarmDescriptorMethod(), responseObserver);
         }
 
         /**
          */
-        default void getAlarmResponseStream(monitoring.Monitoring.AlarmSubscription request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getAlarmResponseStream(monitoring.Monitoring.AlarmSubscription request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetAlarmResponseStreamMethod(), responseObserver);
         }
 
         /**
          */
-        default void deleteAlarm(monitoring.Monitoring.AlarmID request, io.grpc.stub.StreamObserver responseObserver) {
+        public void deleteAlarm(monitoring.Monitoring.AlarmID request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getDeleteAlarmMethod(), responseObserver);
         }
 
         /**
          */
-        default void getStreamKpi(monitoring.Monitoring.KpiId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getStreamKpi(monitoring.Monitoring.KpiId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetStreamKpiMethod(), responseObserver);
         }
 
         /**
          */
-        default void getInstantKpi(monitoring.Monitoring.KpiId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getInstantKpi(monitoring.Monitoring.KpiId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetInstantKpiMethod(), responseObserver);
         }
-    }
-
-    /**
-     * Base class for the server implementation of the service MonitoringService.
-     */
-    public static abstract class MonitoringServiceImplBase implements io.grpc.BindableService, AsyncService {
 
         @java.lang.Override
         public io.grpc.ServerServiceDefinition bindService() {
-            return MonitoringServiceGrpc.bindService(this);
+            return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getSetKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_KPI))).addMethod(getDeleteKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_DELETE_KPI))).addMethod(getGetKpiDescriptorMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_KPI_DESCRIPTOR))).addMethod(getGetKpiDescriptorListMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_KPI_DESCRIPTOR_LIST))).addMethod(getIncludeKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_INCLUDE_KPI))).addMethod(getMonitorKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_MONITOR_KPI))).addMethod(getQueryKpiDataMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_QUERY_KPI_DATA))).addMethod(getSetKpiSubscriptionMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_SET_KPI_SUBSCRIPTION))).addMethod(getGetSubsDescriptorMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_SUBS_DESCRIPTOR))).addMethod(getGetSubscriptionsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_SUBSCRIPTIONS))).addMethod(getDeleteSubscriptionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_DELETE_SUBSCRIPTION))).addMethod(getSetKpiAlarmMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_KPI_ALARM))).addMethod(getGetAlarmsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_ALARMS))).addMethod(getGetAlarmDescriptorMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_ALARM_DESCRIPTOR))).addMethod(getGetAlarmResponseStreamMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_ALARM_RESPONSE_STREAM))).addMethod(getDeleteAlarmMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_DELETE_ALARM))).addMethod(getGetStreamKpiMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_STREAM_KPI))).addMethod(getGetInstantKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_INSTANT_KPI))).build();
         }
     }
 
     /**
-     * A stub to allow clients to do asynchronous rpc calls to service MonitoringService.
      */
     public static class MonitoringServiceStub extends io.grpc.stub.AbstractAsyncStub {
 
@@ -574,7 +566,6 @@ public final class MonitoringServiceGrpc {
     }
 
     /**
-     * A stub to allow clients to do synchronous rpc calls to service MonitoringService.
      */
     public static class MonitoringServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub {
 
@@ -697,7 +688,6 @@ public final class MonitoringServiceGrpc {
     }
 
     /**
-     * A stub to allow clients to do ListenableFuture-style rpc calls to service MonitoringService.
      */
     public static class MonitoringServiceFutureStub extends io.grpc.stub.AbstractFutureStub {
 
@@ -839,11 +829,11 @@ public final class MonitoringServiceGrpc {
 
     private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, io.grpc.stub.ServerCalls.ServerStreamingMethod, io.grpc.stub.ServerCalls.ClientStreamingMethod, io.grpc.stub.ServerCalls.BidiStreamingMethod {
 
-        private final AsyncService serviceImpl;
+        private final MonitoringServiceImplBase serviceImpl;
 
         private final int methodId;
 
-        MethodHandlers(AsyncService serviceImpl, int methodId) {
+        MethodHandlers(MonitoringServiceImplBase serviceImpl, int methodId) {
             this.serviceImpl = serviceImpl;
             this.methodId = methodId;
         }
@@ -921,10 +911,6 @@ public final class MonitoringServiceGrpc {
         }
     }
 
-    public static io.grpc.ServerServiceDefinition bindService(AsyncService service) {
-        return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getSetKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_KPI))).addMethod(getDeleteKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_DELETE_KPI))).addMethod(getGetKpiDescriptorMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_KPI_DESCRIPTOR))).addMethod(getGetKpiDescriptorListMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_KPI_DESCRIPTOR_LIST))).addMethod(getIncludeKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_INCLUDE_KPI))).addMethod(getMonitorKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_MONITOR_KPI))).addMethod(getQueryKpiDataMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_QUERY_KPI_DATA))).addMethod(getSetKpiSubscriptionMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_SET_KPI_SUBSCRIPTION))).addMethod(getGetSubsDescriptorMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_SUBS_DESCRIPTOR))).addMethod(getGetSubscriptionsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_SUBSCRIPTIONS))).addMethod(getDeleteSubscriptionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_DELETE_SUBSCRIPTION))).addMethod(getSetKpiAlarmMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_KPI_ALARM))).addMethod(getGetAlarmsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_ALARMS))).addMethod(getGetAlarmDescriptorMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_ALARM_DESCRIPTOR))).addMethod(getGetAlarmResponseStreamMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_ALARM_RESPONSE_STREAM))).addMethod(getDeleteAlarmMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_DELETE_ALARM))).addMethod(getGetStreamKpiMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_STREAM_KPI))).addMethod(getGetInstantKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_INSTANT_KPI))).build();
-    }
-
     private static abstract class MonitoringServiceBaseDescriptorSupplier implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
 
         MonitoringServiceBaseDescriptorSupplier() {
diff --git a/src/policy/target/generated-sources/grpc/policy/Policy.java b/src/policy/target/generated-sources/grpc/policy/Policy.java
index 30aa624d4..b57d9ae75 100644
--- a/src/policy/target/generated-sources/grpc/policy/Policy.java
+++ b/src/policy/target/generated-sources/grpc/policy/Policy.java
@@ -346,6 +346,57 @@ public final class Policy {
             return new PolicyRuleId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private PolicyRuleId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (uuid_ != null) {
+                                    subBuilder = uuid_.toBuilder();
+                                }
+                                uuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(uuid_);
+                                    uuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return policy.Policy.internal_static_policy_PolicyRuleId_descriptor;
         }
@@ -382,7 +433,7 @@ public final class Policy {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getUuidOrBuilder() {
-            return uuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : uuid_;
+            return getUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -403,7 +454,7 @@ public final class Policy {
             if (uuid_ != null) {
                 output.writeMessage(1, getUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -415,7 +466,7 @@ public final class Policy {
             if (uuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -435,7 +486,7 @@ public final class Policy {
                 if (!getUuid().equals(other.getUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -451,7 +502,7 @@ public final class Policy {
                 hash = (37 * hash) + UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -545,19 +596,26 @@ public final class Policy {
 
             // Construct using policy.Policy.PolicyRuleId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                uuid_ = null;
-                if (uuidBuilder_ != null) {
-                    uuidBuilder_.dispose();
+                if (uuidBuilder_ == null) {
+                    uuid_ = null;
+                } else {
+                    uuid_ = null;
                     uuidBuilder_ = null;
                 }
                 return this;
@@ -585,18 +643,43 @@ public final class Policy {
             @java.lang.Override
             public policy.Policy.PolicyRuleId buildPartial() {
                 policy.Policy.PolicyRuleId result = new policy.Policy.PolicyRuleId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (uuidBuilder_ == null) {
+                    result.uuid_ = uuid_;
+                } else {
+                    result.uuid_ = uuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(policy.Policy.PolicyRuleId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.uuid_ = uuidBuilder_ == null ? uuid_ : uuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -615,7 +698,7 @@ public final class Policy {
                 if (other.hasUuid()) {
                     mergeUuid(other.getUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -627,47 +710,20 @@ public final class Policy {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                policy.Policy.PolicyRuleId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (policy.Policy.PolicyRuleId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid uuid_;
 
             private com.google.protobuf.SingleFieldBuilderV3 uuidBuilder_;
@@ -677,7 +733,7 @@ public final class Policy {
              * @return Whether the uuid field is set.
              */
             public boolean hasUuid() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return uuidBuilder_ != null || uuid_ != null;
             }
 
             /**
@@ -701,11 +757,10 @@ public final class Policy {
                         throw new NullPointerException();
                     }
                     uuid_ = value;
+                    onChanged();
                 } else {
                     uuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -715,11 +770,10 @@ public final class Policy {
             public Builder setUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (uuidBuilder_ == null) {
                     uuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     uuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -728,16 +782,15 @@ public final class Policy {
              */
             public Builder mergeUuid(context.ContextOuterClass.Uuid value) {
                 if (uuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && uuid_ != null && uuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getUuidBuilder().mergeFrom(value);
+                    if (uuid_ != null) {
+                        uuid_ = context.ContextOuterClass.Uuid.newBuilder(uuid_).mergeFrom(value).buildPartial();
                     } else {
                         uuid_ = value;
                     }
+                    onChanged();
                 } else {
                     uuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -745,13 +798,13 @@ public final class Policy {
              * .context.Uuid uuid = 1;
              */
             public Builder clearUuid() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                uuid_ = null;
-                if (uuidBuilder_ != null) {
-                    uuidBuilder_.dispose();
+                if (uuidBuilder_ == null) {
+                    uuid_ = null;
+                    onChanged();
+                } else {
+                    uuid_ = null;
                     uuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -759,7 +812,6 @@ public final class Policy {
              * .context.Uuid uuid = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getUuidBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getUuidFieldBuilder().getBuilder();
             }
@@ -813,17 +865,7 @@ public final class Policy {
 
             @java.lang.Override
             public PolicyRuleId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new PolicyRuleId(input, extensionRegistry);
             }
         };
 
@@ -894,6 +936,56 @@ public final class Policy {
             return new PolicyRuleState();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private PolicyRuleState(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                int rawValue = input.readEnum();
+                                policyRuleState_ = rawValue;
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                policyRuleStateMessage_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return policy.Policy.internal_static_policy_PolicyRuleState_descriptor;
         }
@@ -905,7 +997,7 @@ public final class Policy {
 
         public static final int POLICYRULESTATE_FIELD_NUMBER = 1;
 
-        private int policyRuleState_ = 0;
+        private int policyRuleState_;
 
         /**
          * .policy.PolicyRuleStateEnum policyRuleState = 1;
@@ -922,14 +1014,14 @@ public final class Policy {
          */
         @java.lang.Override
         public policy.Policy.PolicyRuleStateEnum getPolicyRuleState() {
-            policy.Policy.PolicyRuleStateEnum result = policy.Policy.PolicyRuleStateEnum.forNumber(policyRuleState_);
+            @SuppressWarnings("deprecation")
+            policy.Policy.PolicyRuleStateEnum result = policy.Policy.PolicyRuleStateEnum.valueOf(policyRuleState_);
             return result == null ? policy.Policy.PolicyRuleStateEnum.UNRECOGNIZED : result;
         }
 
         public static final int POLICYRULESTATEMESSAGE_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object policyRuleStateMessage_ = "";
+        private volatile java.lang.Object policyRuleStateMessage_;
 
         /**
          * string policyRuleStateMessage = 2;
@@ -982,10 +1074,10 @@ public final class Policy {
             if (policyRuleState_ != policy.Policy.PolicyRuleStateEnum.POLICY_UNDEFINED.getNumber()) {
                 output.writeEnum(1, policyRuleState_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(policyRuleStateMessage_)) {
+            if (!getPolicyRuleStateMessageBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, policyRuleStateMessage_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -997,10 +1089,10 @@ public final class Policy {
             if (policyRuleState_ != policy.Policy.PolicyRuleStateEnum.POLICY_UNDEFINED.getNumber()) {
                 size += com.google.protobuf.CodedOutputStream.computeEnumSize(1, policyRuleState_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(policyRuleStateMessage_)) {
+            if (!getPolicyRuleStateMessageBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, policyRuleStateMessage_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -1018,7 +1110,7 @@ public final class Policy {
                 return false;
             if (!getPolicyRuleStateMessage().equals(other.getPolicyRuleStateMessage()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -1034,7 +1126,7 @@ public final class Policy {
             hash = (53 * hash) + policyRuleState_;
             hash = (37 * hash) + POLICYRULESTATEMESSAGE_FIELD_NUMBER;
             hash = (53 * hash) + getPolicyRuleStateMessage().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -1128,16 +1220,22 @@ public final class Policy {
 
             // Construct using policy.Policy.PolicyRuleState.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 policyRuleState_ = 0;
                 policyRuleStateMessage_ = "";
                 return this;
@@ -1165,21 +1263,40 @@ public final class Policy {
             @java.lang.Override
             public policy.Policy.PolicyRuleState buildPartial() {
                 policy.Policy.PolicyRuleState result = new policy.Policy.PolicyRuleState(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.policyRuleState_ = policyRuleState_;
+                result.policyRuleStateMessage_ = policyRuleStateMessage_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(policy.Policy.PolicyRuleState result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.policyRuleState_ = policyRuleState_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.policyRuleStateMessage_ = policyRuleStateMessage_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -1200,10 +1317,9 @@ public final class Policy {
                 }
                 if (!other.getPolicyRuleStateMessage().isEmpty()) {
                     policyRuleStateMessage_ = other.policyRuleStateMessage_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -1215,54 +1331,20 @@ public final class Policy {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                policy.Policy.PolicyRuleState parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    policyRuleState_ = input.readEnum();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            case 18:
-                                {
-                                    policyRuleStateMessage_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (policy.Policy.PolicyRuleState) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private int policyRuleState_ = 0;
 
             /**
@@ -1281,7 +1363,6 @@ public final class Policy {
              */
             public Builder setPolicyRuleStateValue(int value) {
                 policyRuleState_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -1292,7 +1373,8 @@ public final class Policy {
              */
             @java.lang.Override
             public policy.Policy.PolicyRuleStateEnum getPolicyRuleState() {
-                policy.Policy.PolicyRuleStateEnum result = policy.Policy.PolicyRuleStateEnum.forNumber(policyRuleState_);
+                @SuppressWarnings("deprecation")
+                policy.Policy.PolicyRuleStateEnum result = policy.Policy.PolicyRuleStateEnum.valueOf(policyRuleState_);
                 return result == null ? policy.Policy.PolicyRuleStateEnum.UNRECOGNIZED : result;
             }
 
@@ -1305,7 +1387,6 @@ public final class Policy {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000001;
                 policyRuleState_ = value.getNumber();
                 onChanged();
                 return this;
@@ -1316,7 +1397,6 @@ public final class Policy {
              * @return This builder for chaining.
              */
             public Builder clearPolicyRuleState() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 policyRuleState_ = 0;
                 onChanged();
                 return this;
@@ -1365,7 +1445,6 @@ public final class Policy {
                     throw new NullPointerException();
                 }
                 policyRuleStateMessage_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -1376,7 +1455,6 @@ public final class Policy {
              */
             public Builder clearPolicyRuleStateMessage() {
                 policyRuleStateMessage_ = getDefaultInstance().getPolicyRuleStateMessage();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -1392,7 +1470,6 @@ public final class Policy {
                 }
                 checkByteStringIsUtf8(value);
                 policyRuleStateMessage_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -1424,17 +1501,7 @@ public final class Policy {
 
             @java.lang.Override
             public PolicyRuleState parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new PolicyRuleState(input, extensionRegistry);
             }
         };
 
@@ -1648,6 +1715,106 @@ public final class Policy {
             return new PolicyRuleBasic();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private PolicyRuleBasic(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                policy.Policy.PolicyRuleId.Builder subBuilder = null;
+                                if (policyRuleId_ != null) {
+                                    subBuilder = policyRuleId_.toBuilder();
+                                }
+                                policyRuleId_ = input.readMessage(policy.Policy.PolicyRuleId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(policyRuleId_);
+                                    policyRuleId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                policy.Policy.PolicyRuleState.Builder subBuilder = null;
+                                if (policyRuleState_ != null) {
+                                    subBuilder = policyRuleState_.toBuilder();
+                                }
+                                policyRuleState_ = input.readMessage(policy.Policy.PolicyRuleState.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(policyRuleState_);
+                                    policyRuleState_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 24:
+                            {
+                                priority_ = input.readUInt32();
+                                break;
+                            }
+                        case 34:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    conditionList_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                conditionList_.add(input.readMessage(policy.PolicyCondition.PolicyRuleCondition.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 40:
+                            {
+                                int rawValue = input.readEnum();
+                                booleanOperator_ = rawValue;
+                                break;
+                            }
+                        case 50:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                                    actionList_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                actionList_.add(input.readMessage(policy.PolicyAction.PolicyRuleAction.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    conditionList_ = java.util.Collections.unmodifiableList(conditionList_);
+                }
+                if (((mutable_bitField0_ & 0x00000002) != 0)) {
+                    actionList_ = java.util.Collections.unmodifiableList(actionList_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return policy.Policy.internal_static_policy_PolicyRuleBasic_descriptor;
         }
@@ -1684,7 +1851,7 @@ public final class Policy {
          */
         @java.lang.Override
         public policy.Policy.PolicyRuleIdOrBuilder getPolicyRuleIdOrBuilder() {
-            return policyRuleId_ == null ? policy.Policy.PolicyRuleId.getDefaultInstance() : policyRuleId_;
+            return getPolicyRuleId();
         }
 
         public static final int POLICYRULESTATE_FIELD_NUMBER = 2;
@@ -1726,12 +1893,12 @@ public final class Policy {
          */
         @java.lang.Override
         public policy.Policy.PolicyRuleStateOrBuilder getPolicyRuleStateOrBuilder() {
-            return policyRuleState_ == null ? policy.Policy.PolicyRuleState.getDefaultInstance() : policyRuleState_;
+            return getPolicyRuleState();
         }
 
         public static final int PRIORITY_FIELD_NUMBER = 3;
 
-        private int priority_ = 0;
+        private int priority_;
 
         /**
          * uint32 priority = 3;
@@ -1744,7 +1911,6 @@ public final class Policy {
 
         public static final int CONDITIONLIST_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
         private java.util.List conditionList_;
 
         /**
@@ -1809,7 +1975,7 @@ public final class Policy {
 
         public static final int BOOLEANOPERATOR_FIELD_NUMBER = 5;
 
-        private int booleanOperator_ = 0;
+        private int booleanOperator_;
 
         /**
          * 
@@ -1834,13 +2000,13 @@ public final class Policy {
          */
         @java.lang.Override
         public policy.PolicyCondition.BooleanOperator getBooleanOperator() {
-            policy.PolicyCondition.BooleanOperator result = policy.PolicyCondition.BooleanOperator.forNumber(booleanOperator_);
+            @SuppressWarnings("deprecation")
+            policy.PolicyCondition.BooleanOperator result = policy.PolicyCondition.BooleanOperator.valueOf(booleanOperator_);
             return result == null ? policy.PolicyCondition.BooleanOperator.UNRECOGNIZED : result;
         }
 
         public static final int ACTIONLIST_FIELD_NUMBER = 6;
 
-        @SuppressWarnings("serial")
         private java.util.List actionList_;
 
         /**
@@ -1936,7 +2102,7 @@ public final class Policy {
             for (int i = 0; i < actionList_.size(); i++) {
                 output.writeMessage(6, actionList_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -1963,7 +2129,7 @@ public final class Policy {
             for (int i = 0; i < actionList_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(6, actionList_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -1997,7 +2163,7 @@ public final class Policy {
                 return false;
             if (!getActionListList().equals(other.getActionListList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -2029,7 +2195,7 @@ public final class Policy {
                 hash = (37 * hash) + ACTIONLIST_FIELD_NUMBER;
                 hash = (53 * hash) + getActionListList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -2127,42 +2293,50 @@ public final class Policy {
 
             // Construct using policy.Policy.PolicyRuleBasic.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getConditionListFieldBuilder();
+                    getActionListFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                policyRuleId_ = null;
-                if (policyRuleIdBuilder_ != null) {
-                    policyRuleIdBuilder_.dispose();
+                if (policyRuleIdBuilder_ == null) {
+                    policyRuleId_ = null;
+                } else {
+                    policyRuleId_ = null;
                     policyRuleIdBuilder_ = null;
                 }
-                policyRuleState_ = null;
-                if (policyRuleStateBuilder_ != null) {
-                    policyRuleStateBuilder_.dispose();
+                if (policyRuleStateBuilder_ == null) {
+                    policyRuleState_ = null;
+                } else {
+                    policyRuleState_ = null;
                     policyRuleStateBuilder_ = null;
                 }
                 priority_ = 0;
                 if (conditionListBuilder_ == null) {
                     conditionList_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    conditionList_ = null;
                     conditionListBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000008);
                 booleanOperator_ = 0;
                 if (actionListBuilder_ == null) {
                     actionList_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
                 } else {
-                    actionList_ = null;
                     actionListBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000020);
                 return this;
             }
 
@@ -2188,49 +2362,69 @@ public final class Policy {
             @java.lang.Override
             public policy.Policy.PolicyRuleBasic buildPartial() {
                 policy.Policy.PolicyRuleBasic result = new policy.Policy.PolicyRuleBasic(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (policyRuleIdBuilder_ == null) {
+                    result.policyRuleId_ = policyRuleId_;
+                } else {
+                    result.policyRuleId_ = policyRuleIdBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(policy.Policy.PolicyRuleBasic result) {
+                if (policyRuleStateBuilder_ == null) {
+                    result.policyRuleState_ = policyRuleState_;
+                } else {
+                    result.policyRuleState_ = policyRuleStateBuilder_.build();
+                }
+                result.priority_ = priority_;
                 if (conditionListBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         conditionList_ = java.util.Collections.unmodifiableList(conditionList_);
-                        bitField0_ = (bitField0_ & ~0x00000008);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.conditionList_ = conditionList_;
                 } else {
                     result.conditionList_ = conditionListBuilder_.build();
                 }
+                result.booleanOperator_ = booleanOperator_;
                 if (actionListBuilder_ == null) {
-                    if (((bitField0_ & 0x00000020) != 0)) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
                         actionList_ = java.util.Collections.unmodifiableList(actionList_);
-                        bitField0_ = (bitField0_ & ~0x00000020);
+                        bitField0_ = (bitField0_ & ~0x00000002);
                     }
                     result.actionList_ = actionList_;
                 } else {
                     result.actionList_ = actionListBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(policy.Policy.PolicyRuleBasic result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.policyRuleId_ = policyRuleIdBuilder_ == null ? policyRuleId_ : policyRuleIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.policyRuleState_ = policyRuleStateBuilder_ == null ? policyRuleState_ : policyRuleStateBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.priority_ = priority_;
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.booleanOperator_ = booleanOperator_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -2259,7 +2453,7 @@ public final class Policy {
                     if (!other.conditionList_.isEmpty()) {
                         if (conditionList_.isEmpty()) {
                             conditionList_ = other.conditionList_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureConditionListIsMutable();
                             conditionList_.addAll(other.conditionList_);
@@ -2272,7 +2466,7 @@ public final class Policy {
                             conditionListBuilder_.dispose();
                             conditionListBuilder_ = null;
                             conditionList_ = other.conditionList_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             conditionListBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getConditionListFieldBuilder() : null;
                         } else {
                             conditionListBuilder_.addAllMessages(other.conditionList_);
@@ -2286,7 +2480,7 @@ public final class Policy {
                     if (!other.actionList_.isEmpty()) {
                         if (actionList_.isEmpty()) {
                             actionList_ = other.actionList_;
-                            bitField0_ = (bitField0_ & ~0x00000020);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                         } else {
                             ensureActionListIsMutable();
                             actionList_.addAll(other.actionList_);
@@ -2299,14 +2493,14 @@ public final class Policy {
                             actionListBuilder_.dispose();
                             actionListBuilder_ = null;
                             actionList_ = other.actionList_;
-                            bitField0_ = (bitField0_ & ~0x00000020);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                             actionListBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getActionListFieldBuilder() : null;
                         } else {
                             actionListBuilder_.addAllMessages(other.actionList_);
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -2318,87 +2512,17 @@ public final class Policy {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                policy.Policy.PolicyRuleBasic parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getPolicyRuleIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getPolicyRuleStateFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 24:
-                                {
-                                    priority_ = input.readUInt32();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 34:
-                                {
-                                    policy.PolicyCondition.PolicyRuleCondition m = input.readMessage(policy.PolicyCondition.PolicyRuleCondition.parser(), extensionRegistry);
-                                    if (conditionListBuilder_ == null) {
-                                        ensureConditionListIsMutable();
-                                        conditionList_.add(m);
-                                    } else {
-                                        conditionListBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 34
-                            case 40:
-                                {
-                                    booleanOperator_ = input.readEnum();
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 40
-                            case 50:
-                                {
-                                    policy.PolicyAction.PolicyRuleAction m = input.readMessage(policy.PolicyAction.PolicyRuleAction.parser(), extensionRegistry);
-                                    if (actionListBuilder_ == null) {
-                                        ensureActionListIsMutable();
-                                        actionList_.add(m);
-                                    } else {
-                                        actionListBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 50
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (policy.Policy.PolicyRuleBasic) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -2413,7 +2537,7 @@ public final class Policy {
              * @return Whether the policyRuleId field is set.
              */
             public boolean hasPolicyRuleId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return policyRuleIdBuilder_ != null || policyRuleId_ != null;
             }
 
             /**
@@ -2437,11 +2561,10 @@ public final class Policy {
                         throw new NullPointerException();
                     }
                     policyRuleId_ = value;
+                    onChanged();
                 } else {
                     policyRuleIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -2451,11 +2574,10 @@ public final class Policy {
             public Builder setPolicyRuleId(policy.Policy.PolicyRuleId.Builder builderForValue) {
                 if (policyRuleIdBuilder_ == null) {
                     policyRuleId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     policyRuleIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -2464,16 +2586,15 @@ public final class Policy {
              */
             public Builder mergePolicyRuleId(policy.Policy.PolicyRuleId value) {
                 if (policyRuleIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && policyRuleId_ != null && policyRuleId_ != policy.Policy.PolicyRuleId.getDefaultInstance()) {
-                        getPolicyRuleIdBuilder().mergeFrom(value);
+                    if (policyRuleId_ != null) {
+                        policyRuleId_ = policy.Policy.PolicyRuleId.newBuilder(policyRuleId_).mergeFrom(value).buildPartial();
                     } else {
                         policyRuleId_ = value;
                     }
+                    onChanged();
                 } else {
                     policyRuleIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -2481,13 +2602,13 @@ public final class Policy {
              * .policy.PolicyRuleId policyRuleId = 1;
              */
             public Builder clearPolicyRuleId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                policyRuleId_ = null;
-                if (policyRuleIdBuilder_ != null) {
-                    policyRuleIdBuilder_.dispose();
+                if (policyRuleIdBuilder_ == null) {
+                    policyRuleId_ = null;
+                    onChanged();
+                } else {
+                    policyRuleId_ = null;
                     policyRuleIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -2495,7 +2616,6 @@ public final class Policy {
              * .policy.PolicyRuleId policyRuleId = 1;
              */
             public policy.Policy.PolicyRuleId.Builder getPolicyRuleIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getPolicyRuleIdFieldBuilder().getBuilder();
             }
@@ -2535,7 +2655,7 @@ public final class Policy {
              *  @return Whether the policyRuleState field is set.
              */
             public boolean hasPolicyRuleState() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return policyRuleStateBuilder_ != null || policyRuleState_ != null;
             }
 
             /**
@@ -2567,11 +2687,10 @@ public final class Policy {
                         throw new NullPointerException();
                     }
                     policyRuleState_ = value;
+                    onChanged();
                 } else {
                     policyRuleStateBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -2585,11 +2704,10 @@ public final class Policy {
             public Builder setPolicyRuleState(policy.Policy.PolicyRuleState.Builder builderForValue) {
                 if (policyRuleStateBuilder_ == null) {
                     policyRuleState_ = builderForValue.build();
+                    onChanged();
                 } else {
                     policyRuleStateBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -2602,16 +2720,15 @@ public final class Policy {
              */
             public Builder mergePolicyRuleState(policy.Policy.PolicyRuleState value) {
                 if (policyRuleStateBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && policyRuleState_ != null && policyRuleState_ != policy.Policy.PolicyRuleState.getDefaultInstance()) {
-                        getPolicyRuleStateBuilder().mergeFrom(value);
+                    if (policyRuleState_ != null) {
+                        policyRuleState_ = policy.Policy.PolicyRuleState.newBuilder(policyRuleState_).mergeFrom(value).buildPartial();
                     } else {
                         policyRuleState_ = value;
                     }
+                    onChanged();
                 } else {
                     policyRuleStateBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -2623,13 +2740,13 @@ public final class Policy {
              *  .policy.PolicyRuleState policyRuleState = 2;
              */
             public Builder clearPolicyRuleState() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                policyRuleState_ = null;
-                if (policyRuleStateBuilder_ != null) {
-                    policyRuleStateBuilder_.dispose();
+                if (policyRuleStateBuilder_ == null) {
+                    policyRuleState_ = null;
+                    onChanged();
+                } else {
+                    policyRuleState_ = null;
                     policyRuleStateBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -2641,7 +2758,6 @@ public final class Policy {
              *  .policy.PolicyRuleState policyRuleState = 2;
              */
             public policy.Policy.PolicyRuleState.Builder getPolicyRuleStateBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getPolicyRuleStateFieldBuilder().getBuilder();
             }
@@ -2694,7 +2810,6 @@ public final class Policy {
              */
             public Builder setPriority(int value) {
                 priority_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -2704,7 +2819,6 @@ public final class Policy {
              * @return This builder for chaining.
              */
             public Builder clearPriority() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 priority_ = 0;
                 onChanged();
                 return this;
@@ -2713,9 +2827,9 @@ public final class Policy {
             private java.util.List conditionList_ = java.util.Collections.emptyList();
 
             private void ensureConditionListIsMutable() {
-                if (!((bitField0_ & 0x00000008) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     conditionList_ = new java.util.ArrayList(conditionList_);
-                    bitField0_ |= 0x00000008;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -2911,7 +3025,7 @@ public final class Policy {
             public Builder clearConditionList() {
                 if (conditionListBuilder_ == null) {
                     conditionList_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000008);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     conditionListBuilder_.clear();
@@ -3013,7 +3127,7 @@ public final class Policy {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getConditionListFieldBuilder() {
                 if (conditionListBuilder_ == null) {
-                    conditionListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(conditionList_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean());
+                    conditionListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(conditionList_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     conditionList_ = null;
                 }
                 return conditionListBuilder_;
@@ -3045,7 +3159,6 @@ public final class Policy {
              */
             public Builder setBooleanOperatorValue(int value) {
                 booleanOperator_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -3060,7 +3173,8 @@ public final class Policy {
              */
             @java.lang.Override
             public policy.PolicyCondition.BooleanOperator getBooleanOperator() {
-                policy.PolicyCondition.BooleanOperator result = policy.PolicyCondition.BooleanOperator.forNumber(booleanOperator_);
+                @SuppressWarnings("deprecation")
+                policy.PolicyCondition.BooleanOperator result = policy.PolicyCondition.BooleanOperator.valueOf(booleanOperator_);
                 return result == null ? policy.PolicyCondition.BooleanOperator.UNRECOGNIZED : result;
             }
 
@@ -3077,7 +3191,6 @@ public final class Policy {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000010;
                 booleanOperator_ = value.getNumber();
                 onChanged();
                 return this;
@@ -3092,7 +3205,6 @@ public final class Policy {
              * @return This builder for chaining.
              */
             public Builder clearBooleanOperator() {
-                bitField0_ = (bitField0_ & ~0x00000010);
                 booleanOperator_ = 0;
                 onChanged();
                 return this;
@@ -3101,9 +3213,9 @@ public final class Policy {
             private java.util.List actionList_ = java.util.Collections.emptyList();
 
             private void ensureActionListIsMutable() {
-                if (!((bitField0_ & 0x00000020) != 0)) {
+                if (!((bitField0_ & 0x00000002) != 0)) {
                     actionList_ = new java.util.ArrayList(actionList_);
-                    bitField0_ |= 0x00000020;
+                    bitField0_ |= 0x00000002;
                 }
             }
 
@@ -3299,7 +3411,7 @@ public final class Policy {
             public Builder clearActionList() {
                 if (actionListBuilder_ == null) {
                     actionList_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000020);
+                    bitField0_ = (bitField0_ & ~0x00000002);
                     onChanged();
                 } else {
                     actionListBuilder_.clear();
@@ -3401,7 +3513,7 @@ public final class Policy {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getActionListFieldBuilder() {
                 if (actionListBuilder_ == null) {
-                    actionListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(actionList_, ((bitField0_ & 0x00000020) != 0), getParentForChildren(), isClean());
+                    actionListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(actionList_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
                     actionList_ = null;
                 }
                 return actionListBuilder_;
@@ -3434,17 +3546,7 @@ public final class Policy {
 
             @java.lang.Override
             public PolicyRuleBasic parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new PolicyRuleBasic(input, extensionRegistry);
             }
         };
 
@@ -3597,6 +3699,83 @@ public final class Policy {
             return new PolicyRuleService();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private PolicyRuleService(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                policy.Policy.PolicyRuleBasic.Builder subBuilder = null;
+                                if (policyRuleBasic_ != null) {
+                                    subBuilder = policyRuleBasic_.toBuilder();
+                                }
+                                policyRuleBasic_ = input.readMessage(policy.Policy.PolicyRuleBasic.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(policyRuleBasic_);
+                                    policyRuleBasic_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.ServiceId.Builder subBuilder = null;
+                                if (serviceId_ != null) {
+                                    subBuilder = serviceId_.toBuilder();
+                                }
+                                serviceId_ = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(serviceId_);
+                                    serviceId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 26:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    deviceList_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                deviceList_.add(input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    deviceList_ = java.util.Collections.unmodifiableList(deviceList_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return policy.Policy.internal_static_policy_PolicyRuleService_descriptor;
         }
@@ -3645,7 +3824,7 @@ public final class Policy {
          */
         @java.lang.Override
         public policy.Policy.PolicyRuleBasicOrBuilder getPolicyRuleBasicOrBuilder() {
-            return policyRuleBasic_ == null ? policy.Policy.PolicyRuleBasic.getDefaultInstance() : policyRuleBasic_;
+            return getPolicyRuleBasic();
         }
 
         public static final int SERVICEID_FIELD_NUMBER = 2;
@@ -3687,12 +3866,11 @@ public final class Policy {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
-            return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+            return getServiceId();
         }
 
         public static final int DEVICELIST_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
         private java.util.List deviceList_;
 
         /**
@@ -3779,7 +3957,7 @@ public final class Policy {
             for (int i = 0; i < deviceList_.size(); i++) {
                 output.writeMessage(3, deviceList_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -3797,7 +3975,7 @@ public final class Policy {
             for (int i = 0; i < deviceList_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, deviceList_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -3825,7 +4003,7 @@ public final class Policy {
             }
             if (!getDeviceListList().equals(other.getDeviceListList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -3849,7 +4027,7 @@ public final class Policy {
                 hash = (37 * hash) + DEVICELIST_FIELD_NUMBER;
                 hash = (53 * hash) + getDeviceListList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -3947,33 +4125,41 @@ public final class Policy {
 
             // Construct using policy.Policy.PolicyRuleService.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getDeviceListFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                policyRuleBasic_ = null;
-                if (policyRuleBasicBuilder_ != null) {
-                    policyRuleBasicBuilder_.dispose();
+                if (policyRuleBasicBuilder_ == null) {
+                    policyRuleBasic_ = null;
+                } else {
+                    policyRuleBasic_ = null;
                     policyRuleBasicBuilder_ = null;
                 }
-                serviceId_ = null;
-                if (serviceIdBuilder_ != null) {
-                    serviceIdBuilder_.dispose();
+                if (serviceIdBuilder_ == null) {
+                    serviceId_ = null;
+                } else {
+                    serviceId_ = null;
                     serviceIdBuilder_ = null;
                 }
                 if (deviceListBuilder_ == null) {
                     deviceList_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    deviceList_ = null;
                     deviceListBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000004);
                 return this;
             }
 
@@ -3999,34 +4185,58 @@ public final class Policy {
             @java.lang.Override
             public policy.Policy.PolicyRuleService buildPartial() {
                 policy.Policy.PolicyRuleService result = new policy.Policy.PolicyRuleService(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (policyRuleBasicBuilder_ == null) {
+                    result.policyRuleBasic_ = policyRuleBasic_;
+                } else {
+                    result.policyRuleBasic_ = policyRuleBasicBuilder_.build();
+                }
+                if (serviceIdBuilder_ == null) {
+                    result.serviceId_ = serviceId_;
+                } else {
+                    result.serviceId_ = serviceIdBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(policy.Policy.PolicyRuleService result) {
                 if (deviceListBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         deviceList_ = java.util.Collections.unmodifiableList(deviceList_);
-                        bitField0_ = (bitField0_ & ~0x00000004);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.deviceList_ = deviceList_;
                 } else {
                     result.deviceList_ = deviceListBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(policy.Policy.PolicyRuleService result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.policyRuleBasic_ = policyRuleBasicBuilder_ == null ? policyRuleBasic_ : policyRuleBasicBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.serviceId_ = serviceIdBuilder_ == null ? serviceId_ : serviceIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -4052,7 +4262,7 @@ public final class Policy {
                     if (!other.deviceList_.isEmpty()) {
                         if (deviceList_.isEmpty()) {
                             deviceList_ = other.deviceList_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureDeviceListIsMutable();
                             deviceList_.addAll(other.deviceList_);
@@ -4065,14 +4275,14 @@ public final class Policy {
                             deviceListBuilder_.dispose();
                             deviceListBuilder_ = null;
                             deviceList_ = other.deviceList_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             deviceListBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getDeviceListFieldBuilder() : null;
                         } else {
                             deviceListBuilder_.addAllMessages(other.deviceList_);
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -4084,61 +4294,17 @@ public final class Policy {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                policy.Policy.PolicyRuleService parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getPolicyRuleBasicFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getServiceIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    context.ContextOuterClass.DeviceId m = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
-                                    if (deviceListBuilder_ == null) {
-                                        ensureDeviceListIsMutable();
-                                        deviceList_.add(m);
-                                    } else {
-                                        deviceListBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 26
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (policy.Policy.PolicyRuleService) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -4157,7 +4323,7 @@ public final class Policy {
              * @return Whether the policyRuleBasic field is set.
              */
             public boolean hasPolicyRuleBasic() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return policyRuleBasicBuilder_ != null || policyRuleBasic_ != null;
             }
 
             /**
@@ -4189,11 +4355,10 @@ public final class Policy {
                         throw new NullPointerException();
                     }
                     policyRuleBasic_ = value;
+                    onChanged();
                 } else {
                     policyRuleBasicBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -4207,11 +4372,10 @@ public final class Policy {
             public Builder setPolicyRuleBasic(policy.Policy.PolicyRuleBasic.Builder builderForValue) {
                 if (policyRuleBasicBuilder_ == null) {
                     policyRuleBasic_ = builderForValue.build();
+                    onChanged();
                 } else {
                     policyRuleBasicBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -4224,16 +4388,15 @@ public final class Policy {
              */
             public Builder mergePolicyRuleBasic(policy.Policy.PolicyRuleBasic value) {
                 if (policyRuleBasicBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && policyRuleBasic_ != null && policyRuleBasic_ != policy.Policy.PolicyRuleBasic.getDefaultInstance()) {
-                        getPolicyRuleBasicBuilder().mergeFrom(value);
+                    if (policyRuleBasic_ != null) {
+                        policyRuleBasic_ = policy.Policy.PolicyRuleBasic.newBuilder(policyRuleBasic_).mergeFrom(value).buildPartial();
                     } else {
                         policyRuleBasic_ = value;
                     }
+                    onChanged();
                 } else {
                     policyRuleBasicBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -4245,13 +4408,13 @@ public final class Policy {
              * .policy.PolicyRuleBasic policyRuleBasic = 1;
              */
             public Builder clearPolicyRuleBasic() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                policyRuleBasic_ = null;
-                if (policyRuleBasicBuilder_ != null) {
-                    policyRuleBasicBuilder_.dispose();
+                if (policyRuleBasicBuilder_ == null) {
+                    policyRuleBasic_ = null;
+                    onChanged();
+                } else {
+                    policyRuleBasic_ = null;
                     policyRuleBasicBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -4263,7 +4426,6 @@ public final class Policy {
              * .policy.PolicyRuleBasic policyRuleBasic = 1;
              */
             public policy.Policy.PolicyRuleBasic.Builder getPolicyRuleBasicBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getPolicyRuleBasicFieldBuilder().getBuilder();
             }
@@ -4311,7 +4473,7 @@ public final class Policy {
              * @return Whether the serviceId field is set.
              */
             public boolean hasServiceId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return serviceIdBuilder_ != null || serviceId_ != null;
             }
 
             /**
@@ -4343,11 +4505,10 @@ public final class Policy {
                         throw new NullPointerException();
                     }
                     serviceId_ = value;
+                    onChanged();
                 } else {
                     serviceIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -4361,11 +4522,10 @@ public final class Policy {
             public Builder setServiceId(context.ContextOuterClass.ServiceId.Builder builderForValue) {
                 if (serviceIdBuilder_ == null) {
                     serviceId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     serviceIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -4378,16 +4538,15 @@ public final class Policy {
              */
             public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) {
                 if (serviceIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && serviceId_ != null && serviceId_ != context.ContextOuterClass.ServiceId.getDefaultInstance()) {
-                        getServiceIdBuilder().mergeFrom(value);
+                    if (serviceId_ != null) {
+                        serviceId_ = context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial();
                     } else {
                         serviceId_ = value;
                     }
+                    onChanged();
                 } else {
                     serviceIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -4399,13 +4558,13 @@ public final class Policy {
              * .context.ServiceId serviceId = 2;
              */
             public Builder clearServiceId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                serviceId_ = null;
-                if (serviceIdBuilder_ != null) {
-                    serviceIdBuilder_.dispose();
+                if (serviceIdBuilder_ == null) {
+                    serviceId_ = null;
+                    onChanged();
+                } else {
+                    serviceId_ = null;
                     serviceIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -4417,7 +4576,6 @@ public final class Policy {
              * .context.ServiceId serviceId = 2;
              */
             public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getServiceIdFieldBuilder().getBuilder();
             }
@@ -4455,9 +4613,9 @@ public final class Policy {
             private java.util.List deviceList_ = java.util.Collections.emptyList();
 
             private void ensureDeviceListIsMutable() {
-                if (!((bitField0_ & 0x00000004) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     deviceList_ = new java.util.ArrayList(deviceList_);
-                    bitField0_ |= 0x00000004;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -4653,7 +4811,7 @@ public final class Policy {
             public Builder clearDeviceList() {
                 if (deviceListBuilder_ == null) {
                     deviceList_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000004);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     deviceListBuilder_.clear();
@@ -4755,7 +4913,7 @@ public final class Policy {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getDeviceListFieldBuilder() {
                 if (deviceListBuilder_ == null) {
-                    deviceListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(deviceList_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
+                    deviceListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(deviceList_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     deviceList_ = null;
                 }
                 return deviceListBuilder_;
@@ -4788,17 +4946,7 @@ public final class Policy {
 
             @java.lang.Override
             public PolicyRuleService parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new PolicyRuleService(input, extensionRegistry);
             }
         };
 
@@ -4922,6 +5070,70 @@ public final class Policy {
             return new PolicyRuleDevice();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private PolicyRuleDevice(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                policy.Policy.PolicyRuleBasic.Builder subBuilder = null;
+                                if (policyRuleBasic_ != null) {
+                                    subBuilder = policyRuleBasic_.toBuilder();
+                                }
+                                policyRuleBasic_ = input.readMessage(policy.Policy.PolicyRuleBasic.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(policyRuleBasic_);
+                                    policyRuleBasic_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    deviceList_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                deviceList_.add(input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    deviceList_ = java.util.Collections.unmodifiableList(deviceList_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return policy.Policy.internal_static_policy_PolicyRuleDevice_descriptor;
         }
@@ -4970,12 +5182,11 @@ public final class Policy {
          */
         @java.lang.Override
         public policy.Policy.PolicyRuleBasicOrBuilder getPolicyRuleBasicOrBuilder() {
-            return policyRuleBasic_ == null ? policy.Policy.PolicyRuleBasic.getDefaultInstance() : policyRuleBasic_;
+            return getPolicyRuleBasic();
         }
 
         public static final int DEVICELIST_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
         private java.util.List deviceList_;
 
         /**
@@ -5059,7 +5270,7 @@ public final class Policy {
             for (int i = 0; i < deviceList_.size(); i++) {
                 output.writeMessage(2, deviceList_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -5074,7 +5285,7 @@ public final class Policy {
             for (int i = 0; i < deviceList_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, deviceList_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -5096,7 +5307,7 @@ public final class Policy {
             }
             if (!getDeviceListList().equals(other.getDeviceListList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -5116,7 +5327,7 @@ public final class Policy {
                 hash = (37 * hash) + DEVICELIST_FIELD_NUMBER;
                 hash = (53 * hash) + getDeviceListList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -5214,28 +5425,35 @@ public final class Policy {
 
             // Construct using policy.Policy.PolicyRuleDevice.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getDeviceListFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                policyRuleBasic_ = null;
-                if (policyRuleBasicBuilder_ != null) {
-                    policyRuleBasicBuilder_.dispose();
+                if (policyRuleBasicBuilder_ == null) {
+                    policyRuleBasic_ = null;
+                } else {
+                    policyRuleBasic_ = null;
                     policyRuleBasicBuilder_ = null;
                 }
                 if (deviceListBuilder_ == null) {
                     deviceList_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    deviceList_ = null;
                     deviceListBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000002);
                 return this;
             }
 
@@ -5261,31 +5479,53 @@ public final class Policy {
             @java.lang.Override
             public policy.Policy.PolicyRuleDevice buildPartial() {
                 policy.Policy.PolicyRuleDevice result = new policy.Policy.PolicyRuleDevice(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (policyRuleBasicBuilder_ == null) {
+                    result.policyRuleBasic_ = policyRuleBasic_;
+                } else {
+                    result.policyRuleBasic_ = policyRuleBasicBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(policy.Policy.PolicyRuleDevice result) {
                 if (deviceListBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         deviceList_ = java.util.Collections.unmodifiableList(deviceList_);
-                        bitField0_ = (bitField0_ & ~0x00000002);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.deviceList_ = deviceList_;
                 } else {
                     result.deviceList_ = deviceListBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(policy.Policy.PolicyRuleDevice result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.policyRuleBasic_ = policyRuleBasicBuilder_ == null ? policyRuleBasic_ : policyRuleBasicBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -5308,7 +5548,7 @@ public final class Policy {
                     if (!other.deviceList_.isEmpty()) {
                         if (deviceList_.isEmpty()) {
                             deviceList_ = other.deviceList_;
-                            bitField0_ = (bitField0_ & ~0x00000002);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureDeviceListIsMutable();
                             deviceList_.addAll(other.deviceList_);
@@ -5321,14 +5561,14 @@ public final class Policy {
                             deviceListBuilder_.dispose();
                             deviceListBuilder_ = null;
                             deviceList_ = other.deviceList_;
-                            bitField0_ = (bitField0_ & ~0x00000002);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             deviceListBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getDeviceListFieldBuilder() : null;
                         } else {
                             deviceListBuilder_.addAllMessages(other.deviceList_);
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -5340,54 +5580,17 @@ public final class Policy {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                policy.Policy.PolicyRuleDevice parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getPolicyRuleBasicFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    context.ContextOuterClass.DeviceId m = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
-                                    if (deviceListBuilder_ == null) {
-                                        ensureDeviceListIsMutable();
-                                        deviceList_.add(m);
-                                    } else {
-                                        deviceListBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (policy.Policy.PolicyRuleDevice) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -5406,7 +5609,7 @@ public final class Policy {
              * @return Whether the policyRuleBasic field is set.
              */
             public boolean hasPolicyRuleBasic() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return policyRuleBasicBuilder_ != null || policyRuleBasic_ != null;
             }
 
             /**
@@ -5438,11 +5641,10 @@ public final class Policy {
                         throw new NullPointerException();
                     }
                     policyRuleBasic_ = value;
+                    onChanged();
                 } else {
                     policyRuleBasicBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -5456,11 +5658,10 @@ public final class Policy {
             public Builder setPolicyRuleBasic(policy.Policy.PolicyRuleBasic.Builder builderForValue) {
                 if (policyRuleBasicBuilder_ == null) {
                     policyRuleBasic_ = builderForValue.build();
+                    onChanged();
                 } else {
                     policyRuleBasicBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -5473,16 +5674,15 @@ public final class Policy {
              */
             public Builder mergePolicyRuleBasic(policy.Policy.PolicyRuleBasic value) {
                 if (policyRuleBasicBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && policyRuleBasic_ != null && policyRuleBasic_ != policy.Policy.PolicyRuleBasic.getDefaultInstance()) {
-                        getPolicyRuleBasicBuilder().mergeFrom(value);
+                    if (policyRuleBasic_ != null) {
+                        policyRuleBasic_ = policy.Policy.PolicyRuleBasic.newBuilder(policyRuleBasic_).mergeFrom(value).buildPartial();
                     } else {
                         policyRuleBasic_ = value;
                     }
+                    onChanged();
                 } else {
                     policyRuleBasicBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -5494,13 +5694,13 @@ public final class Policy {
              * .policy.PolicyRuleBasic policyRuleBasic = 1;
              */
             public Builder clearPolicyRuleBasic() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                policyRuleBasic_ = null;
-                if (policyRuleBasicBuilder_ != null) {
-                    policyRuleBasicBuilder_.dispose();
+                if (policyRuleBasicBuilder_ == null) {
+                    policyRuleBasic_ = null;
+                    onChanged();
+                } else {
+                    policyRuleBasic_ = null;
                     policyRuleBasicBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -5512,7 +5712,6 @@ public final class Policy {
              * .policy.PolicyRuleBasic policyRuleBasic = 1;
              */
             public policy.Policy.PolicyRuleBasic.Builder getPolicyRuleBasicBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getPolicyRuleBasicFieldBuilder().getBuilder();
             }
@@ -5550,9 +5749,9 @@ public final class Policy {
             private java.util.List deviceList_ = java.util.Collections.emptyList();
 
             private void ensureDeviceListIsMutable() {
-                if (!((bitField0_ & 0x00000002) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     deviceList_ = new java.util.ArrayList(deviceList_);
-                    bitField0_ |= 0x00000002;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -5748,7 +5947,7 @@ public final class Policy {
             public Builder clearDeviceList() {
                 if (deviceListBuilder_ == null) {
                     deviceList_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000002);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     deviceListBuilder_.clear();
@@ -5850,7 +6049,7 @@ public final class Policy {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getDeviceListFieldBuilder() {
                 if (deviceListBuilder_ == null) {
-                    deviceListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(deviceList_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
+                    deviceListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(deviceList_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     deviceList_ = null;
                 }
                 return deviceListBuilder_;
@@ -5883,17 +6082,7 @@ public final class Policy {
 
             @java.lang.Override
             public PolicyRuleDevice parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new PolicyRuleDevice(input, extensionRegistry);
             }
         };
 
@@ -5949,7 +6138,7 @@ public final class Policy {
          */
         policy.Policy.PolicyRuleDeviceOrBuilder getDeviceOrBuilder();
 
-        policy.Policy.PolicyRule.PolicyRuleCase getPolicyRuleCase();
+        public policy.Policy.PolicyRule.PolicyRuleCase getPolicyRuleCase();
     }
 
     /**
@@ -5978,6 +6167,72 @@ public final class Policy {
             return new PolicyRule();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private PolicyRule(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                policy.Policy.PolicyRuleService.Builder subBuilder = null;
+                                if (policyRuleCase_ == 1) {
+                                    subBuilder = ((policy.Policy.PolicyRuleService) policyRule_).toBuilder();
+                                }
+                                policyRule_ = input.readMessage(policy.Policy.PolicyRuleService.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((policy.Policy.PolicyRuleService) policyRule_);
+                                    policyRule_ = subBuilder.buildPartial();
+                                }
+                                policyRuleCase_ = 1;
+                                break;
+                            }
+                        case 18:
+                            {
+                                policy.Policy.PolicyRuleDevice.Builder subBuilder = null;
+                                if (policyRuleCase_ == 2) {
+                                    subBuilder = ((policy.Policy.PolicyRuleDevice) policyRule_).toBuilder();
+                                }
+                                policyRule_ = input.readMessage(policy.Policy.PolicyRuleDevice.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((policy.Policy.PolicyRuleDevice) policyRule_);
+                                    policyRule_ = subBuilder.buildPartial();
+                                }
+                                policyRuleCase_ = 2;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return policy.Policy.internal_static_policy_PolicyRule_descriptor;
         }
@@ -5989,7 +6244,6 @@ public final class Policy {
 
         private int policyRuleCase_ = 0;
 
-        @SuppressWarnings("serial")
         private java.lang.Object policyRule_;
 
         public enum PolicyRuleCase implements com.google.protobuf.Internal.EnumLite, com.google.protobuf.AbstractMessage.InternalOneOfEnum {
@@ -6123,7 +6377,7 @@ public final class Policy {
             if (policyRuleCase_ == 2) {
                 output.writeMessage(2, (policy.Policy.PolicyRuleDevice) policyRule_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -6138,7 +6392,7 @@ public final class Policy {
             if (policyRuleCase_ == 2) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, (policy.Policy.PolicyRuleDevice) policyRule_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -6166,7 +6420,7 @@ public final class Policy {
                 case 0:
                 default:
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -6190,7 +6444,7 @@ public final class Policy {
                 case 0:
                 default:
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -6288,22 +6542,22 @@ public final class Policy {
 
             // Construct using policy.Policy.PolicyRule.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                if (serviceBuilder_ != null) {
-                    serviceBuilder_.clear();
-                }
-                if (deviceBuilder_ != null) {
-                    deviceBuilder_.clear();
-                }
                 policyRuleCase_ = 0;
                 policyRule_ = null;
                 return this;
@@ -6329,29 +6583,55 @@ public final class Policy {
             }
 
             @java.lang.Override
-            public policy.Policy.PolicyRule buildPartial() {
-                policy.Policy.PolicyRule result = new policy.Policy.PolicyRule(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                buildPartialOneofs(result);
-                onBuilt();
-                return result;
+            public policy.Policy.PolicyRule buildPartial() {
+                policy.Policy.PolicyRule result = new policy.Policy.PolicyRule(this);
+                if (policyRuleCase_ == 1) {
+                    if (serviceBuilder_ == null) {
+                        result.policyRule_ = policyRule_;
+                    } else {
+                        result.policyRule_ = serviceBuilder_.build();
+                    }
+                }
+                if (policyRuleCase_ == 2) {
+                    if (deviceBuilder_ == null) {
+                        result.policyRule_ = policyRule_;
+                    } else {
+                        result.policyRule_ = deviceBuilder_.build();
+                    }
+                }
+                result.policyRuleCase_ = policyRuleCase_;
+                onBuilt();
+                return result;
+            }
+
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
             }
 
-            private void buildPartial0(policy.Policy.PolicyRule result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
             }
 
-            private void buildPartialOneofs(policy.Policy.PolicyRule result) {
-                result.policyRuleCase_ = policyRuleCase_;
-                result.policyRule_ = this.policyRule_;
-                if (policyRuleCase_ == 1 && serviceBuilder_ != null) {
-                    result.policyRule_ = serviceBuilder_.build();
-                }
-                if (policyRuleCase_ == 2 && deviceBuilder_ != null) {
-                    result.policyRule_ = deviceBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -6383,7 +6663,7 @@ public final class Policy {
                             break;
                         }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -6395,49 +6675,17 @@ public final class Policy {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                policy.Policy.PolicyRule parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getServiceFieldBuilder().getBuilder(), extensionRegistry);
-                                    policyRuleCase_ = 1;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getDeviceFieldBuilder().getBuilder(), extensionRegistry);
-                                    policyRuleCase_ = 2;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (policy.Policy.PolicyRule) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -6456,8 +6704,6 @@ public final class Policy {
                 return this;
             }
 
-            private int bitField0_;
-
             private com.google.protobuf.SingleFieldBuilderV3 serviceBuilder_;
 
             /**
@@ -6533,9 +6779,8 @@ public final class Policy {
                 } else {
                     if (policyRuleCase_ == 1) {
                         serviceBuilder_.mergeFrom(value);
-                    } else {
-                        serviceBuilder_.setMessage(value);
                     }
+                    serviceBuilder_.setMessage(value);
                 }
                 policyRuleCase_ = 1;
                 return this;
@@ -6596,6 +6841,7 @@ public final class Policy {
                 }
                 policyRuleCase_ = 1;
                 onChanged();
+                ;
                 return serviceBuilder_;
             }
 
@@ -6674,9 +6920,8 @@ public final class Policy {
                 } else {
                     if (policyRuleCase_ == 2) {
                         deviceBuilder_.mergeFrom(value);
-                    } else {
-                        deviceBuilder_.setMessage(value);
                     }
+                    deviceBuilder_.setMessage(value);
                 }
                 policyRuleCase_ = 2;
                 return this;
@@ -6737,6 +6982,7 @@ public final class Policy {
                 }
                 policyRuleCase_ = 2;
                 onChanged();
+                ;
                 return deviceBuilder_;
             }
 
@@ -6767,17 +7013,7 @@ public final class Policy {
 
             @java.lang.Override
             public PolicyRule parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new PolicyRule(input, extensionRegistry);
             }
         };
 
@@ -6852,6 +7088,57 @@ public final class Policy {
             return new PolicyRuleIdList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private PolicyRuleIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    policyRuleIdList_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                policyRuleIdList_.add(input.readMessage(policy.Policy.PolicyRuleId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    policyRuleIdList_ = java.util.Collections.unmodifiableList(policyRuleIdList_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return policy.Policy.internal_static_policy_PolicyRuleIdList_descriptor;
         }
@@ -6863,7 +7150,6 @@ public final class Policy {
 
         public static final int POLICYRULEIDLIST_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List policyRuleIdList_;
 
         /**
@@ -6924,7 +7210,7 @@ public final class Policy {
             for (int i = 0; i < policyRuleIdList_.size(); i++) {
                 output.writeMessage(1, policyRuleIdList_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -6936,7 +7222,7 @@ public final class Policy {
             for (int i = 0; i < policyRuleIdList_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, policyRuleIdList_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -6952,7 +7238,7 @@ public final class Policy {
             policy.Policy.PolicyRuleIdList other = (policy.Policy.PolicyRuleIdList) obj;
             if (!getPolicyRuleIdListList().equals(other.getPolicyRuleIdListList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -6968,7 +7254,7 @@ public final class Policy {
                 hash = (37 * hash) + POLICYRULEIDLIST_FIELD_NUMBER;
                 hash = (53 * hash) + getPolicyRuleIdListList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -7066,23 +7352,29 @@ public final class Policy {
 
             // Construct using policy.Policy.PolicyRuleIdList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getPolicyRuleIdListFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (policyRuleIdListBuilder_ == null) {
                     policyRuleIdList_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    policyRuleIdList_ = null;
                     policyRuleIdListBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -7108,15 +7400,7 @@ public final class Policy {
             @java.lang.Override
             public policy.Policy.PolicyRuleIdList buildPartial() {
                 policy.Policy.PolicyRuleIdList result = new policy.Policy.PolicyRuleIdList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(policy.Policy.PolicyRuleIdList result) {
+                int from_bitField0_ = bitField0_;
                 if (policyRuleIdListBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         policyRuleIdList_ = java.util.Collections.unmodifiableList(policyRuleIdList_);
@@ -7126,10 +7410,38 @@ public final class Policy {
                 } else {
                     result.policyRuleIdList_ = policyRuleIdListBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(policy.Policy.PolicyRuleIdList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -7169,7 +7481,7 @@ public final class Policy {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -7181,47 +7493,17 @@ public final class Policy {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                policy.Policy.PolicyRuleIdList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    policy.Policy.PolicyRuleId m = input.readMessage(policy.Policy.PolicyRuleId.parser(), extensionRegistry);
-                                    if (policyRuleIdListBuilder_ == null) {
-                                        ensurePolicyRuleIdListIsMutable();
-                                        policyRuleIdList_.add(m);
-                                    } else {
-                                        policyRuleIdListBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (policy.Policy.PolicyRuleIdList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -7491,17 +7773,7 @@ public final class Policy {
 
             @java.lang.Override
             public PolicyRuleIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new PolicyRuleIdList(input, extensionRegistry);
             }
         };
 
@@ -7576,6 +7848,57 @@ public final class Policy {
             return new PolicyRuleServiceList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private PolicyRuleServiceList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    policyRuleServiceList_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                policyRuleServiceList_.add(input.readMessage(policy.Policy.PolicyRuleService.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    policyRuleServiceList_ = java.util.Collections.unmodifiableList(policyRuleServiceList_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return policy.Policy.internal_static_policy_PolicyRuleServiceList_descriptor;
         }
@@ -7587,7 +7910,6 @@ public final class Policy {
 
         public static final int POLICYRULESERVICELIST_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List policyRuleServiceList_;
 
         /**
@@ -7648,7 +7970,7 @@ public final class Policy {
             for (int i = 0; i < policyRuleServiceList_.size(); i++) {
                 output.writeMessage(1, policyRuleServiceList_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -7660,7 +7982,7 @@ public final class Policy {
             for (int i = 0; i < policyRuleServiceList_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, policyRuleServiceList_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -7676,7 +7998,7 @@ public final class Policy {
             policy.Policy.PolicyRuleServiceList other = (policy.Policy.PolicyRuleServiceList) obj;
             if (!getPolicyRuleServiceListList().equals(other.getPolicyRuleServiceListList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -7692,7 +8014,7 @@ public final class Policy {
                 hash = (37 * hash) + POLICYRULESERVICELIST_FIELD_NUMBER;
                 hash = (53 * hash) + getPolicyRuleServiceListList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -7790,23 +8112,29 @@ public final class Policy {
 
             // Construct using policy.Policy.PolicyRuleServiceList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getPolicyRuleServiceListFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (policyRuleServiceListBuilder_ == null) {
                     policyRuleServiceList_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    policyRuleServiceList_ = null;
                     policyRuleServiceListBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -7832,15 +8160,7 @@ public final class Policy {
             @java.lang.Override
             public policy.Policy.PolicyRuleServiceList buildPartial() {
                 policy.Policy.PolicyRuleServiceList result = new policy.Policy.PolicyRuleServiceList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(policy.Policy.PolicyRuleServiceList result) {
+                int from_bitField0_ = bitField0_;
                 if (policyRuleServiceListBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         policyRuleServiceList_ = java.util.Collections.unmodifiableList(policyRuleServiceList_);
@@ -7850,10 +8170,38 @@ public final class Policy {
                 } else {
                     result.policyRuleServiceList_ = policyRuleServiceListBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(policy.Policy.PolicyRuleServiceList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -7893,7 +8241,7 @@ public final class Policy {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -7905,47 +8253,17 @@ public final class Policy {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                policy.Policy.PolicyRuleServiceList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    policy.Policy.PolicyRuleService m = input.readMessage(policy.Policy.PolicyRuleService.parser(), extensionRegistry);
-                                    if (policyRuleServiceListBuilder_ == null) {
-                                        ensurePolicyRuleServiceListIsMutable();
-                                        policyRuleServiceList_.add(m);
-                                    } else {
-                                        policyRuleServiceListBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (policy.Policy.PolicyRuleServiceList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -8215,17 +8533,7 @@ public final class Policy {
 
             @java.lang.Override
             public PolicyRuleServiceList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new PolicyRuleServiceList(input, extensionRegistry);
             }
         };
 
@@ -8300,6 +8608,57 @@ public final class Policy {
             return new PolicyRuleDeviceList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private PolicyRuleDeviceList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    policyRuleDeviceList_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                policyRuleDeviceList_.add(input.readMessage(policy.Policy.PolicyRuleDevice.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    policyRuleDeviceList_ = java.util.Collections.unmodifiableList(policyRuleDeviceList_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return policy.Policy.internal_static_policy_PolicyRuleDeviceList_descriptor;
         }
@@ -8311,7 +8670,6 @@ public final class Policy {
 
         public static final int POLICYRULEDEVICELIST_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List policyRuleDeviceList_;
 
         /**
@@ -8372,7 +8730,7 @@ public final class Policy {
             for (int i = 0; i < policyRuleDeviceList_.size(); i++) {
                 output.writeMessage(1, policyRuleDeviceList_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -8384,7 +8742,7 @@ public final class Policy {
             for (int i = 0; i < policyRuleDeviceList_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, policyRuleDeviceList_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -8400,7 +8758,7 @@ public final class Policy {
             policy.Policy.PolicyRuleDeviceList other = (policy.Policy.PolicyRuleDeviceList) obj;
             if (!getPolicyRuleDeviceListList().equals(other.getPolicyRuleDeviceListList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -8416,7 +8774,7 @@ public final class Policy {
                 hash = (37 * hash) + POLICYRULEDEVICELIST_FIELD_NUMBER;
                 hash = (53 * hash) + getPolicyRuleDeviceListList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -8514,23 +8872,29 @@ public final class Policy {
 
             // Construct using policy.Policy.PolicyRuleDeviceList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getPolicyRuleDeviceListFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (policyRuleDeviceListBuilder_ == null) {
                     policyRuleDeviceList_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    policyRuleDeviceList_ = null;
                     policyRuleDeviceListBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -8556,15 +8920,7 @@ public final class Policy {
             @java.lang.Override
             public policy.Policy.PolicyRuleDeviceList buildPartial() {
                 policy.Policy.PolicyRuleDeviceList result = new policy.Policy.PolicyRuleDeviceList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(policy.Policy.PolicyRuleDeviceList result) {
+                int from_bitField0_ = bitField0_;
                 if (policyRuleDeviceListBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         policyRuleDeviceList_ = java.util.Collections.unmodifiableList(policyRuleDeviceList_);
@@ -8574,10 +8930,38 @@ public final class Policy {
                 } else {
                     result.policyRuleDeviceList_ = policyRuleDeviceListBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(policy.Policy.PolicyRuleDeviceList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -8617,7 +9001,7 @@ public final class Policy {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -8629,47 +9013,17 @@ public final class Policy {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                policy.Policy.PolicyRuleDeviceList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    policy.Policy.PolicyRuleDevice m = input.readMessage(policy.Policy.PolicyRuleDevice.parser(), extensionRegistry);
-                                    if (policyRuleDeviceListBuilder_ == null) {
-                                        ensurePolicyRuleDeviceListIsMutable();
-                                        policyRuleDeviceList_.add(m);
-                                    } else {
-                                        policyRuleDeviceListBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (policy.Policy.PolicyRuleDeviceList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -8939,17 +9293,7 @@ public final class Policy {
 
             @java.lang.Override
             public PolicyRuleDeviceList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new PolicyRuleDeviceList(input, extensionRegistry);
             }
         };
 
@@ -9024,6 +9368,57 @@ public final class Policy {
             return new PolicyRuleList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private PolicyRuleList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    policyRules_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                policyRules_.add(input.readMessage(policy.Policy.PolicyRule.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    policyRules_ = java.util.Collections.unmodifiableList(policyRules_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return policy.Policy.internal_static_policy_PolicyRuleList_descriptor;
         }
@@ -9035,7 +9430,6 @@ public final class Policy {
 
         public static final int POLICYRULES_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List policyRules_;
 
         /**
@@ -9096,7 +9490,7 @@ public final class Policy {
             for (int i = 0; i < policyRules_.size(); i++) {
                 output.writeMessage(1, policyRules_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -9108,7 +9502,7 @@ public final class Policy {
             for (int i = 0; i < policyRules_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, policyRules_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -9124,7 +9518,7 @@ public final class Policy {
             policy.Policy.PolicyRuleList other = (policy.Policy.PolicyRuleList) obj;
             if (!getPolicyRulesList().equals(other.getPolicyRulesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -9140,7 +9534,7 @@ public final class Policy {
                 hash = (37 * hash) + POLICYRULES_FIELD_NUMBER;
                 hash = (53 * hash) + getPolicyRulesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -9238,23 +9632,29 @@ public final class Policy {
 
             // Construct using policy.Policy.PolicyRuleList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getPolicyRulesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (policyRulesBuilder_ == null) {
                     policyRules_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    policyRules_ = null;
                     policyRulesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -9280,15 +9680,7 @@ public final class Policy {
             @java.lang.Override
             public policy.Policy.PolicyRuleList buildPartial() {
                 policy.Policy.PolicyRuleList result = new policy.Policy.PolicyRuleList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(policy.Policy.PolicyRuleList result) {
+                int from_bitField0_ = bitField0_;
                 if (policyRulesBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         policyRules_ = java.util.Collections.unmodifiableList(policyRules_);
@@ -9298,10 +9690,38 @@ public final class Policy {
                 } else {
                     result.policyRules_ = policyRulesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(policy.Policy.PolicyRuleList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -9341,7 +9761,7 @@ public final class Policy {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -9353,47 +9773,17 @@ public final class Policy {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                policy.Policy.PolicyRuleList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    policy.Policy.PolicyRule m = input.readMessage(policy.Policy.PolicyRule.parser(), extensionRegistry);
-                                    if (policyRulesBuilder_ == null) {
-                                        ensurePolicyRulesIsMutable();
-                                        policyRules_.add(m);
-                                    } else {
-                                        policyRulesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (policy.Policy.PolicyRuleList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -9663,17 +10053,7 @@ public final class Policy {
 
             @java.lang.Override
             public PolicyRuleList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new PolicyRuleList(input, extensionRegistry);
             }
         };
 
diff --git a/src/policy/target/generated-sources/grpc/policy/PolicyAction.java b/src/policy/target/generated-sources/grpc/policy/PolicyAction.java
index 097097d6f..8e84a0a84 100644
--- a/src/policy/target/generated-sources/grpc/policy/PolicyAction.java
+++ b/src/policy/target/generated-sources/grpc/policy/PolicyAction.java
@@ -229,6 +229,63 @@ public final class PolicyAction {
             return new PolicyRuleAction();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private PolicyRuleAction(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                int rawValue = input.readEnum();
+                                action_ = rawValue;
+                                break;
+                            }
+                        case 18:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    actionConfig_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                actionConfig_.add(input.readMessage(policy.PolicyAction.PolicyRuleActionConfig.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    actionConfig_ = java.util.Collections.unmodifiableList(actionConfig_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return policy.PolicyAction.internal_static_policy_PolicyRuleAction_descriptor;
         }
@@ -240,7 +297,7 @@ public final class PolicyAction {
 
         public static final int ACTION_FIELD_NUMBER = 1;
 
-        private int action_ = 0;
+        private int action_;
 
         /**
          * .policy.PolicyRuleActionEnum action = 1;
@@ -257,13 +314,13 @@ public final class PolicyAction {
          */
         @java.lang.Override
         public policy.PolicyAction.PolicyRuleActionEnum getAction() {
-            policy.PolicyAction.PolicyRuleActionEnum result = policy.PolicyAction.PolicyRuleActionEnum.forNumber(action_);
+            @SuppressWarnings("deprecation")
+            policy.PolicyAction.PolicyRuleActionEnum result = policy.PolicyAction.PolicyRuleActionEnum.valueOf(action_);
             return result == null ? policy.PolicyAction.PolicyRuleActionEnum.UNRECOGNIZED : result;
         }
 
         public static final int ACTION_CONFIG_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
         private java.util.List actionConfig_;
 
         /**
@@ -327,7 +384,7 @@ public final class PolicyAction {
             for (int i = 0; i < actionConfig_.size(); i++) {
                 output.writeMessage(2, actionConfig_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -342,7 +399,7 @@ public final class PolicyAction {
             for (int i = 0; i < actionConfig_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, actionConfig_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -360,7 +417,7 @@ public final class PolicyAction {
                 return false;
             if (!getActionConfigList().equals(other.getActionConfigList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -378,7 +435,7 @@ public final class PolicyAction {
                 hash = (37 * hash) + ACTION_CONFIG_FIELD_NUMBER;
                 hash = (53 * hash) + getActionConfigList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -476,24 +533,30 @@ public final class PolicyAction {
 
             // Construct using policy.PolicyAction.PolicyRuleAction.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getActionConfigFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 action_ = 0;
                 if (actionConfigBuilder_ == null) {
                     actionConfig_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    actionConfig_ = null;
                     actionConfigBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000002);
                 return this;
             }
 
@@ -519,31 +582,49 @@ public final class PolicyAction {
             @java.lang.Override
             public policy.PolicyAction.PolicyRuleAction buildPartial() {
                 policy.PolicyAction.PolicyRuleAction result = new policy.PolicyAction.PolicyRuleAction(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(policy.PolicyAction.PolicyRuleAction result) {
+                int from_bitField0_ = bitField0_;
+                result.action_ = action_;
                 if (actionConfigBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         actionConfig_ = java.util.Collections.unmodifiableList(actionConfig_);
-                        bitField0_ = (bitField0_ & ~0x00000002);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.actionConfig_ = actionConfig_;
                 } else {
                     result.actionConfig_ = actionConfigBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(policy.PolicyAction.PolicyRuleAction result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.action_ = action_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -566,7 +647,7 @@ public final class PolicyAction {
                     if (!other.actionConfig_.isEmpty()) {
                         if (actionConfig_.isEmpty()) {
                             actionConfig_ = other.actionConfig_;
-                            bitField0_ = (bitField0_ & ~0x00000002);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureActionConfigIsMutable();
                             actionConfig_.addAll(other.actionConfig_);
@@ -579,14 +660,14 @@ public final class PolicyAction {
                             actionConfigBuilder_.dispose();
                             actionConfigBuilder_ = null;
                             actionConfig_ = other.actionConfig_;
-                            bitField0_ = (bitField0_ & ~0x00000002);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             actionConfigBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getActionConfigFieldBuilder() : null;
                         } else {
                             actionConfigBuilder_.addAllMessages(other.actionConfig_);
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -598,54 +679,17 @@ public final class PolicyAction {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                policy.PolicyAction.PolicyRuleAction parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    action_ = input.readEnum();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            case 18:
-                                {
-                                    policy.PolicyAction.PolicyRuleActionConfig m = input.readMessage(policy.PolicyAction.PolicyRuleActionConfig.parser(), extensionRegistry);
-                                    if (actionConfigBuilder_ == null) {
-                                        ensureActionConfigIsMutable();
-                                        actionConfig_.add(m);
-                                    } else {
-                                        actionConfigBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (policy.PolicyAction.PolicyRuleAction) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -669,7 +713,6 @@ public final class PolicyAction {
              */
             public Builder setActionValue(int value) {
                 action_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -680,7 +723,8 @@ public final class PolicyAction {
              */
             @java.lang.Override
             public policy.PolicyAction.PolicyRuleActionEnum getAction() {
-                policy.PolicyAction.PolicyRuleActionEnum result = policy.PolicyAction.PolicyRuleActionEnum.forNumber(action_);
+                @SuppressWarnings("deprecation")
+                policy.PolicyAction.PolicyRuleActionEnum result = policy.PolicyAction.PolicyRuleActionEnum.valueOf(action_);
                 return result == null ? policy.PolicyAction.PolicyRuleActionEnum.UNRECOGNIZED : result;
             }
 
@@ -693,7 +737,6 @@ public final class PolicyAction {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000001;
                 action_ = value.getNumber();
                 onChanged();
                 return this;
@@ -704,7 +747,6 @@ public final class PolicyAction {
              * @return This builder for chaining.
              */
             public Builder clearAction() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 action_ = 0;
                 onChanged();
                 return this;
@@ -713,9 +755,9 @@ public final class PolicyAction {
             private java.util.List actionConfig_ = java.util.Collections.emptyList();
 
             private void ensureActionConfigIsMutable() {
-                if (!((bitField0_ & 0x00000002) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     actionConfig_ = new java.util.ArrayList(actionConfig_);
-                    bitField0_ |= 0x00000002;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -867,7 +909,7 @@ public final class PolicyAction {
             public Builder clearActionConfig() {
                 if (actionConfigBuilder_ == null) {
                     actionConfig_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000002);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     actionConfigBuilder_.clear();
@@ -941,7 +983,7 @@ public final class PolicyAction {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getActionConfigFieldBuilder() {
                 if (actionConfigBuilder_ == null) {
-                    actionConfigBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(actionConfig_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
+                    actionConfigBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(actionConfig_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     actionConfig_ = null;
                 }
                 return actionConfigBuilder_;
@@ -974,17 +1016,7 @@ public final class PolicyAction {
 
             @java.lang.Override
             public PolicyRuleAction parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new PolicyRuleAction(input, extensionRegistry);
             }
         };
 
@@ -1059,6 +1091,56 @@ public final class PolicyAction {
             return new PolicyRuleActionConfig();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private PolicyRuleActionConfig(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                actionKey_ = s;
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                actionValue_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return policy.PolicyAction.internal_static_policy_PolicyRuleActionConfig_descriptor;
         }
@@ -1070,8 +1152,7 @@ public final class PolicyAction {
 
         public static final int ACTION_KEY_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object actionKey_ = "";
+        private volatile java.lang.Object actionKey_;
 
         /**
          * string action_key = 1;
@@ -1108,8 +1189,7 @@ public final class PolicyAction {
 
         public static final int ACTION_VALUE_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object actionValue_ = "";
+        private volatile java.lang.Object actionValue_;
 
         /**
          * string action_value = 2;
@@ -1159,13 +1239,13 @@ public final class PolicyAction {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(actionKey_)) {
+            if (!getActionKeyBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, actionKey_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(actionValue_)) {
+            if (!getActionValueBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, actionValue_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -1174,13 +1254,13 @@ public final class PolicyAction {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(actionKey_)) {
+            if (!getActionKeyBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, actionKey_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(actionValue_)) {
+            if (!getActionValueBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, actionValue_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -1198,7 +1278,7 @@ public final class PolicyAction {
                 return false;
             if (!getActionValue().equals(other.getActionValue()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -1214,7 +1294,7 @@ public final class PolicyAction {
             hash = (53 * hash) + getActionKey().hashCode();
             hash = (37 * hash) + ACTION_VALUE_FIELD_NUMBER;
             hash = (53 * hash) + getActionValue().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -1312,16 +1392,22 @@ public final class PolicyAction {
 
             // Construct using policy.PolicyAction.PolicyRuleActionConfig.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 actionKey_ = "";
                 actionValue_ = "";
                 return this;
@@ -1349,21 +1435,40 @@ public final class PolicyAction {
             @java.lang.Override
             public policy.PolicyAction.PolicyRuleActionConfig buildPartial() {
                 policy.PolicyAction.PolicyRuleActionConfig result = new policy.PolicyAction.PolicyRuleActionConfig(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.actionKey_ = actionKey_;
+                result.actionValue_ = actionValue_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(policy.PolicyAction.PolicyRuleActionConfig result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.actionKey_ = actionKey_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.actionValue_ = actionValue_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -1381,15 +1486,13 @@ public final class PolicyAction {
                     return this;
                 if (!other.getActionKey().isEmpty()) {
                     actionKey_ = other.actionKey_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
                 if (!other.getActionValue().isEmpty()) {
                     actionValue_ = other.actionValue_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -1401,54 +1504,20 @@ public final class PolicyAction {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                policy.PolicyAction.PolicyRuleActionConfig parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    actionKey_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    actionValue_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (policy.PolicyAction.PolicyRuleActionConfig) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private java.lang.Object actionKey_ = "";
 
             /**
@@ -1492,7 +1561,6 @@ public final class PolicyAction {
                     throw new NullPointerException();
                 }
                 actionKey_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -1503,7 +1571,6 @@ public final class PolicyAction {
              */
             public Builder clearActionKey() {
                 actionKey_ = getDefaultInstance().getActionKey();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -1519,7 +1586,6 @@ public final class PolicyAction {
                 }
                 checkByteStringIsUtf8(value);
                 actionKey_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -1567,7 +1633,6 @@ public final class PolicyAction {
                     throw new NullPointerException();
                 }
                 actionValue_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -1578,7 +1643,6 @@ public final class PolicyAction {
              */
             public Builder clearActionValue() {
                 actionValue_ = getDefaultInstance().getActionValue();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -1594,7 +1658,6 @@ public final class PolicyAction {
                 }
                 checkByteStringIsUtf8(value);
                 actionValue_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -1626,17 +1689,7 @@ public final class PolicyAction {
 
             @java.lang.Override
             public PolicyRuleActionConfig parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new PolicyRuleActionConfig(input, extensionRegistry);
             }
         };
 
diff --git a/src/policy/target/generated-sources/grpc/policy/PolicyCondition.java b/src/policy/target/generated-sources/grpc/policy/PolicyCondition.java
index 118359b08..269c8b438 100644
--- a/src/policy/target/generated-sources/grpc/policy/PolicyCondition.java
+++ b/src/policy/target/generated-sources/grpc/policy/PolicyCondition.java
@@ -449,6 +449,76 @@ public final class PolicyCondition {
             return new PolicyRuleCondition();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private PolicyRuleCondition(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.KpiId.Builder subBuilder = null;
+                                if (kpiId_ != null) {
+                                    subBuilder = kpiId_.toBuilder();
+                                }
+                                kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiId_);
+                                    kpiId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 16:
+                            {
+                                int rawValue = input.readEnum();
+                                numericalOperator_ = rawValue;
+                                break;
+                            }
+                        case 26:
+                            {
+                                monitoring.Monitoring.KpiValue.Builder subBuilder = null;
+                                if (kpiValue_ != null) {
+                                    subBuilder = kpiValue_.toBuilder();
+                                }
+                                kpiValue_ = input.readMessage(monitoring.Monitoring.KpiValue.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiValue_);
+                                    kpiValue_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return policy.PolicyCondition.internal_static_policy_PolicyRuleCondition_descriptor;
         }
@@ -485,12 +555,12 @@ public final class PolicyCondition {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
-            return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+            return getKpiId();
         }
 
         public static final int NUMERICALOPERATOR_FIELD_NUMBER = 2;
 
-        private int numericalOperator_ = 0;
+        private int numericalOperator_;
 
         /**
          * .policy.NumericalOperator numericalOperator = 2;
@@ -507,7 +577,8 @@ public final class PolicyCondition {
          */
         @java.lang.Override
         public policy.PolicyCondition.NumericalOperator getNumericalOperator() {
-            policy.PolicyCondition.NumericalOperator result = policy.PolicyCondition.NumericalOperator.forNumber(numericalOperator_);
+            @SuppressWarnings("deprecation")
+            policy.PolicyCondition.NumericalOperator result = policy.PolicyCondition.NumericalOperator.valueOf(numericalOperator_);
             return result == null ? policy.PolicyCondition.NumericalOperator.UNRECOGNIZED : result;
         }
 
@@ -538,7 +609,7 @@ public final class PolicyCondition {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder() {
-            return kpiValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_;
+            return getKpiValue();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -565,7 +636,7 @@ public final class PolicyCondition {
             if (kpiValue_ != null) {
                 output.writeMessage(3, getKpiValue());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -583,7 +654,7 @@ public final class PolicyCondition {
             if (kpiValue_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getKpiValue());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -611,7 +682,7 @@ public final class PolicyCondition {
                 if (!getKpiValue().equals(other.getKpiValue()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -633,7 +704,7 @@ public final class PolicyCondition {
                 hash = (37 * hash) + KPIVALUE_FIELD_NUMBER;
                 hash = (53 * hash) + getKpiValue().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -731,25 +802,33 @@ public final class PolicyCondition {
 
             // Construct using policy.PolicyCondition.PolicyRuleCondition.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
                 numericalOperator_ = 0;
-                kpiValue_ = null;
-                if (kpiValueBuilder_ != null) {
-                    kpiValueBuilder_.dispose();
+                if (kpiValueBuilder_ == null) {
+                    kpiValue_ = null;
+                } else {
+                    kpiValue_ = null;
                     kpiValueBuilder_ = null;
                 }
                 return this;
@@ -777,24 +856,49 @@ public final class PolicyCondition {
             @java.lang.Override
             public policy.PolicyCondition.PolicyRuleCondition buildPartial() {
                 policy.PolicyCondition.PolicyRuleCondition result = new policy.PolicyCondition.PolicyRuleCondition(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (kpiIdBuilder_ == null) {
+                    result.kpiId_ = kpiId_;
+                } else {
+                    result.kpiId_ = kpiIdBuilder_.build();
+                }
+                result.numericalOperator_ = numericalOperator_;
+                if (kpiValueBuilder_ == null) {
+                    result.kpiValue_ = kpiValue_;
+                } else {
+                    result.kpiValue_ = kpiValueBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(policy.PolicyCondition.PolicyRuleCondition result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.numericalOperator_ = numericalOperator_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.kpiValue_ = kpiValueBuilder_ == null ? kpiValue_ : kpiValueBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -819,7 +923,7 @@ public final class PolicyCondition {
                 if (other.hasKpiValue()) {
                     mergeKpiValue(other.getKpiValue());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -831,61 +935,20 @@ public final class PolicyCondition {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                policy.PolicyCondition.PolicyRuleCondition parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 16:
-                                {
-                                    numericalOperator_ = input.readEnum();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            case 26:
-                                {
-                                    input.readMessage(getKpiValueFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (policy.PolicyCondition.PolicyRuleCondition) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.KpiId kpiId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 kpiIdBuilder_;
@@ -895,7 +958,7 @@ public final class PolicyCondition {
              * @return Whether the kpiId field is set.
              */
             public boolean hasKpiId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return kpiIdBuilder_ != null || kpiId_ != null;
             }
 
             /**
@@ -919,11 +982,10 @@ public final class PolicyCondition {
                         throw new NullPointerException();
                     }
                     kpiId_ = value;
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -933,11 +995,10 @@ public final class PolicyCondition {
             public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) {
                 if (kpiIdBuilder_ == null) {
                     kpiId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -946,16 +1007,15 @@ public final class PolicyCondition {
              */
             public Builder mergeKpiId(monitoring.Monitoring.KpiId value) {
                 if (kpiIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) {
-                        getKpiIdBuilder().mergeFrom(value);
+                    if (kpiId_ != null) {
+                        kpiId_ = monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial();
                     } else {
                         kpiId_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -963,13 +1023,13 @@ public final class PolicyCondition {
              * .monitoring.KpiId kpiId = 1;
              */
             public Builder clearKpiId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                    onChanged();
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -977,7 +1037,6 @@ public final class PolicyCondition {
              * .monitoring.KpiId kpiId = 1;
              */
             public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getKpiIdFieldBuilder().getBuilder();
             }
@@ -1022,7 +1081,6 @@ public final class PolicyCondition {
              */
             public Builder setNumericalOperatorValue(int value) {
                 numericalOperator_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -1033,7 +1091,8 @@ public final class PolicyCondition {
              */
             @java.lang.Override
             public policy.PolicyCondition.NumericalOperator getNumericalOperator() {
-                policy.PolicyCondition.NumericalOperator result = policy.PolicyCondition.NumericalOperator.forNumber(numericalOperator_);
+                @SuppressWarnings("deprecation")
+                policy.PolicyCondition.NumericalOperator result = policy.PolicyCondition.NumericalOperator.valueOf(numericalOperator_);
                 return result == null ? policy.PolicyCondition.NumericalOperator.UNRECOGNIZED : result;
             }
 
@@ -1046,7 +1105,6 @@ public final class PolicyCondition {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000002;
                 numericalOperator_ = value.getNumber();
                 onChanged();
                 return this;
@@ -1057,7 +1115,6 @@ public final class PolicyCondition {
              * @return This builder for chaining.
              */
             public Builder clearNumericalOperator() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 numericalOperator_ = 0;
                 onChanged();
                 return this;
@@ -1072,7 +1129,7 @@ public final class PolicyCondition {
              * @return Whether the kpiValue field is set.
              */
             public boolean hasKpiValue() {
-                return ((bitField0_ & 0x00000004) != 0);
+                return kpiValueBuilder_ != null || kpiValue_ != null;
             }
 
             /**
@@ -1096,11 +1153,10 @@ public final class PolicyCondition {
                         throw new NullPointerException();
                     }
                     kpiValue_ = value;
+                    onChanged();
                 } else {
                     kpiValueBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -1110,11 +1166,10 @@ public final class PolicyCondition {
             public Builder setKpiValue(monitoring.Monitoring.KpiValue.Builder builderForValue) {
                 if (kpiValueBuilder_ == null) {
                     kpiValue_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiValueBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -1123,16 +1178,15 @@ public final class PolicyCondition {
              */
             public Builder mergeKpiValue(monitoring.Monitoring.KpiValue value) {
                 if (kpiValueBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0) && kpiValue_ != null && kpiValue_ != monitoring.Monitoring.KpiValue.getDefaultInstance()) {
-                        getKpiValueBuilder().mergeFrom(value);
+                    if (kpiValue_ != null) {
+                        kpiValue_ = monitoring.Monitoring.KpiValue.newBuilder(kpiValue_).mergeFrom(value).buildPartial();
                     } else {
                         kpiValue_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiValueBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -1140,13 +1194,13 @@ public final class PolicyCondition {
              * .monitoring.KpiValue kpiValue = 3;
              */
             public Builder clearKpiValue() {
-                bitField0_ = (bitField0_ & ~0x00000004);
-                kpiValue_ = null;
-                if (kpiValueBuilder_ != null) {
-                    kpiValueBuilder_.dispose();
+                if (kpiValueBuilder_ == null) {
+                    kpiValue_ = null;
+                    onChanged();
+                } else {
+                    kpiValue_ = null;
                     kpiValueBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -1154,7 +1208,6 @@ public final class PolicyCondition {
              * .monitoring.KpiValue kpiValue = 3;
              */
             public monitoring.Monitoring.KpiValue.Builder getKpiValueBuilder() {
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return getKpiValueFieldBuilder().getBuilder();
             }
@@ -1208,17 +1261,7 @@ public final class PolicyCondition {
 
             @java.lang.Override
             public PolicyRuleCondition parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new PolicyRuleCondition(input, extensionRegistry);
             }
         };
 
diff --git a/src/policy/target/generated-sources/grpc/policy/PolicyServiceGrpc.java b/src/policy/target/generated-sources/grpc/policy/PolicyServiceGrpc.java
index 6bc2e2808..e701a2256 100644
--- a/src/policy/target/generated-sources/grpc/policy/PolicyServiceGrpc.java
+++ b/src/policy/target/generated-sources/grpc/policy/PolicyServiceGrpc.java
@@ -4,8 +4,7 @@ import static io.grpc.MethodDescriptor.generateFullMethodName;
 
 /**
  */
-@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.55.1)", comments = "Source: policy.proto")
-@io.grpc.stub.annotations.GrpcGenerated
+@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.38.1)", comments = "Source: policy.proto")
 public final class PolicyServiceGrpc {
 
     private PolicyServiceGrpc() {
@@ -178,70 +177,63 @@ public final class PolicyServiceGrpc {
 
     /**
      */
-    public interface AsyncService {
+    public static abstract class PolicyServiceImplBase implements io.grpc.BindableService {
 
         /**
          */
-        default void policyAddService(policy.Policy.PolicyRuleService request, io.grpc.stub.StreamObserver responseObserver) {
+        public void policyAddService(policy.Policy.PolicyRuleService request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPolicyAddServiceMethod(), responseObserver);
         }
 
         /**
          */
-        default void policyAddDevice(policy.Policy.PolicyRuleDevice request, io.grpc.stub.StreamObserver responseObserver) {
+        public void policyAddDevice(policy.Policy.PolicyRuleDevice request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPolicyAddDeviceMethod(), responseObserver);
         }
 
         /**
          */
-        default void policyUpdateService(policy.Policy.PolicyRuleService request, io.grpc.stub.StreamObserver responseObserver) {
+        public void policyUpdateService(policy.Policy.PolicyRuleService request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPolicyUpdateServiceMethod(), responseObserver);
         }
 
         /**
          */
-        default void policyUpdateDevice(policy.Policy.PolicyRuleDevice request, io.grpc.stub.StreamObserver responseObserver) {
+        public void policyUpdateDevice(policy.Policy.PolicyRuleDevice request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPolicyUpdateDeviceMethod(), responseObserver);
         }
 
         /**
          */
-        default void policyDelete(policy.Policy.PolicyRuleId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void policyDelete(policy.Policy.PolicyRuleId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getPolicyDeleteMethod(), responseObserver);
         }
 
         /**
          */
-        default void getPolicyService(policy.Policy.PolicyRuleId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getPolicyService(policy.Policy.PolicyRuleId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetPolicyServiceMethod(), responseObserver);
         }
 
         /**
          */
-        default void getPolicyDevice(policy.Policy.PolicyRuleId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getPolicyDevice(policy.Policy.PolicyRuleId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetPolicyDeviceMethod(), responseObserver);
         }
 
         /**
          */
-        default void getPolicyByServiceId(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getPolicyByServiceId(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetPolicyByServiceIdMethod(), responseObserver);
         }
-    }
-
-    /**
-     * Base class for the server implementation of the service PolicyService.
-     */
-    public static abstract class PolicyServiceImplBase implements io.grpc.BindableService, AsyncService {
 
         @java.lang.Override
         public io.grpc.ServerServiceDefinition bindService() {
-            return PolicyServiceGrpc.bindService(this);
+            return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getPolicyAddServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_POLICY_ADD_SERVICE))).addMethod(getPolicyAddDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_POLICY_ADD_DEVICE))).addMethod(getPolicyUpdateServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_POLICY_UPDATE_SERVICE))).addMethod(getPolicyUpdateDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_POLICY_UPDATE_DEVICE))).addMethod(getPolicyDeleteMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_POLICY_DELETE))).addMethod(getGetPolicyServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_POLICY_SERVICE))).addMethod(getGetPolicyDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_POLICY_DEVICE))).addMethod(getGetPolicyByServiceIdMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_POLICY_BY_SERVICE_ID))).build();
         }
     }
 
     /**
-     * A stub to allow clients to do asynchronous rpc calls to service PolicyService.
      */
     public static class PolicyServiceStub extends io.grpc.stub.AbstractAsyncStub {
 
@@ -304,7 +296,6 @@ public final class PolicyServiceGrpc {
     }
 
     /**
-     * A stub to allow clients to do synchronous rpc calls to service PolicyService.
      */
     public static class PolicyServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub {
 
@@ -367,7 +358,6 @@ public final class PolicyServiceGrpc {
     }
 
     /**
-     * A stub to allow clients to do ListenableFuture-style rpc calls to service PolicyService.
      */
     public static class PolicyServiceFutureStub extends io.grpc.stub.AbstractFutureStub {
 
@@ -447,11 +437,11 @@ public final class PolicyServiceGrpc {
 
     private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, io.grpc.stub.ServerCalls.ServerStreamingMethod, io.grpc.stub.ServerCalls.ClientStreamingMethod, io.grpc.stub.ServerCalls.BidiStreamingMethod {
 
-        private final AsyncService serviceImpl;
+        private final PolicyServiceImplBase serviceImpl;
 
         private final int methodId;
 
-        MethodHandlers(AsyncService serviceImpl, int methodId) {
+        MethodHandlers(PolicyServiceImplBase serviceImpl, int methodId) {
             this.serviceImpl = serviceImpl;
             this.methodId = methodId;
         }
@@ -499,10 +489,6 @@ public final class PolicyServiceGrpc {
         }
     }
 
-    public static io.grpc.ServerServiceDefinition bindService(AsyncService service) {
-        return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getPolicyAddServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_POLICY_ADD_SERVICE))).addMethod(getPolicyAddDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_POLICY_ADD_DEVICE))).addMethod(getPolicyUpdateServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_POLICY_UPDATE_SERVICE))).addMethod(getPolicyUpdateDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_POLICY_UPDATE_DEVICE))).addMethod(getPolicyDeleteMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_POLICY_DELETE))).addMethod(getGetPolicyServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_POLICY_SERVICE))).addMethod(getGetPolicyDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_POLICY_DEVICE))).addMethod(getGetPolicyByServiceIdMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_POLICY_BY_SERVICE_ID))).build();
-    }
-
     private static abstract class PolicyServiceBaseDescriptorSupplier implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
 
         PolicyServiceBaseDescriptorSupplier() {
diff --git a/src/policy/target/generated-sources/grpc/service/ServiceServiceGrpc.java b/src/policy/target/generated-sources/grpc/service/ServiceServiceGrpc.java
index 7b5a36772..4cd985462 100644
--- a/src/policy/target/generated-sources/grpc/service/ServiceServiceGrpc.java
+++ b/src/policy/target/generated-sources/grpc/service/ServiceServiceGrpc.java
@@ -4,8 +4,7 @@ import static io.grpc.MethodDescriptor.generateFullMethodName;
 
 /**
  */
-@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.55.1)", comments = "Source: service.proto")
-@io.grpc.stub.annotations.GrpcGenerated
+@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.38.1)", comments = "Source: service.proto")
 public final class ServiceServiceGrpc {
 
     private ServiceServiceGrpc() {
@@ -118,46 +117,39 @@ public final class ServiceServiceGrpc {
 
     /**
      */
-    public interface AsyncService {
+    public static abstract class ServiceServiceImplBase implements io.grpc.BindableService {
 
         /**
          */
-        default void createService(context.ContextOuterClass.Service request, io.grpc.stub.StreamObserver responseObserver) {
+        public void createService(context.ContextOuterClass.Service request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getCreateServiceMethod(), responseObserver);
         }
 
         /**
          */
-        default void updateService(context.ContextOuterClass.Service request, io.grpc.stub.StreamObserver responseObserver) {
+        public void updateService(context.ContextOuterClass.Service request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getUpdateServiceMethod(), responseObserver);
         }
 
         /**
          */
-        default void deleteService(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void deleteService(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getDeleteServiceMethod(), responseObserver);
         }
 
         /**
          */
-        default void recomputeConnections(context.ContextOuterClass.Service request, io.grpc.stub.StreamObserver responseObserver) {
+        public void recomputeConnections(context.ContextOuterClass.Service request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRecomputeConnectionsMethod(), responseObserver);
         }
-    }
-
-    /**
-     * Base class for the server implementation of the service ServiceService.
-     */
-    public static abstract class ServiceServiceImplBase implements io.grpc.BindableService, AsyncService {
 
         @java.lang.Override
         public io.grpc.ServerServiceDefinition bindService() {
-            return ServiceServiceGrpc.bindService(this);
+            return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getCreateServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_CREATE_SERVICE))).addMethod(getUpdateServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_UPDATE_SERVICE))).addMethod(getDeleteServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_DELETE_SERVICE))).addMethod(getRecomputeConnectionsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_RECOMPUTE_CONNECTIONS))).build();
         }
     }
 
     /**
-     * A stub to allow clients to do asynchronous rpc calls to service ServiceService.
      */
     public static class ServiceServiceStub extends io.grpc.stub.AbstractAsyncStub {
 
@@ -196,7 +188,6 @@ public final class ServiceServiceGrpc {
     }
 
     /**
-     * A stub to allow clients to do synchronous rpc calls to service ServiceService.
      */
     public static class ServiceServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub {
 
@@ -235,7 +226,6 @@ public final class ServiceServiceGrpc {
     }
 
     /**
-     * A stub to allow clients to do ListenableFuture-style rpc calls to service ServiceService.
      */
     public static class ServiceServiceFutureStub extends io.grpc.stub.AbstractFutureStub {
 
@@ -283,11 +273,11 @@ public final class ServiceServiceGrpc {
 
     private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, io.grpc.stub.ServerCalls.ServerStreamingMethod, io.grpc.stub.ServerCalls.ClientStreamingMethod, io.grpc.stub.ServerCalls.BidiStreamingMethod {
 
-        private final AsyncService serviceImpl;
+        private final ServiceServiceImplBase serviceImpl;
 
         private final int methodId;
 
-        MethodHandlers(AsyncService serviceImpl, int methodId) {
+        MethodHandlers(ServiceServiceImplBase serviceImpl, int methodId) {
             this.serviceImpl = serviceImpl;
             this.methodId = methodId;
         }
@@ -323,10 +313,6 @@ public final class ServiceServiceGrpc {
         }
     }
 
-    public static io.grpc.ServerServiceDefinition bindService(AsyncService service) {
-        return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getCreateServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_CREATE_SERVICE))).addMethod(getUpdateServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_UPDATE_SERVICE))).addMethod(getDeleteServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_DELETE_SERVICE))).addMethod(getRecomputeConnectionsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_RECOMPUTE_CONNECTIONS))).build();
-    }
-
     private static abstract class ServiceServiceBaseDescriptorSupplier implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
 
         ServiceServiceBaseDescriptorSupplier() {
diff --git a/src/ztp/src/test/java/org/etsi/tfs/ztp/SerializerTest.java b/src/ztp/src/test/java/org/etsi/tfs/ztp/SerializerTest.java
index 52b50db1b..346ff5891 100644
--- a/src/ztp/src/test/java/org/etsi/tfs/ztp/SerializerTest.java
+++ b/src/ztp/src/test/java/org/etsi/tfs/ztp/SerializerTest.java
@@ -1227,7 +1227,8 @@ class SerializerTest {
                         DeviceDriverEnum.GNMI_OPENCONFIG,
                         ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG),
                 Arguments.of(
-                        DeviceDriverEnum.OPTICAL_TFS, ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS),
+                        DeviceDriverEnum.OPTICAL_TFS,
+                        ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS),
                 Arguments.of(
                         DeviceDriverEnum.IETF_ACTN, ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN),
                 Arguments.of(
diff --git a/src/ztp/target/generated-sources/grpc/acl/Acl.java b/src/ztp/target/generated-sources/grpc/acl/Acl.java
index cba5f55d7..f1895fa72 100644
--- a/src/ztp/target/generated-sources/grpc/acl/Acl.java
+++ b/src/ztp/target/generated-sources/grpc/acl/Acl.java
@@ -485,6 +485,86 @@ public final class Acl {
             return new AclMatch();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private AclMatch(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                dscp_ = input.readUInt32();
+                                break;
+                            }
+                        case 16:
+                            {
+                                protocol_ = input.readUInt32();
+                                break;
+                            }
+                        case 26:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                srcAddress_ = s;
+                                break;
+                            }
+                        case 34:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                dstAddress_ = s;
+                                break;
+                            }
+                        case 40:
+                            {
+                                srcPort_ = input.readUInt32();
+                                break;
+                            }
+                        case 48:
+                            {
+                                dstPort_ = input.readUInt32();
+                                break;
+                            }
+                        case 56:
+                            {
+                                startMplsLabel_ = input.readUInt32();
+                                break;
+                            }
+                        case 64:
+                            {
+                                endMplsLabel_ = input.readUInt32();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return acl.Acl.internal_static_acl_AclMatch_descriptor;
         }
@@ -496,7 +576,7 @@ public final class Acl {
 
         public static final int DSCP_FIELD_NUMBER = 1;
 
-        private int dscp_ = 0;
+        private int dscp_;
 
         /**
          * uint32 dscp = 1;
@@ -509,7 +589,7 @@ public final class Acl {
 
         public static final int PROTOCOL_FIELD_NUMBER = 2;
 
-        private int protocol_ = 0;
+        private int protocol_;
 
         /**
          * uint32 protocol = 2;
@@ -522,8 +602,7 @@ public final class Acl {
 
         public static final int SRC_ADDRESS_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object srcAddress_ = "";
+        private volatile java.lang.Object srcAddress_;
 
         /**
          * string src_address = 3;
@@ -560,8 +639,7 @@ public final class Acl {
 
         public static final int DST_ADDRESS_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object dstAddress_ = "";
+        private volatile java.lang.Object dstAddress_;
 
         /**
          * string dst_address = 4;
@@ -598,7 +676,7 @@ public final class Acl {
 
         public static final int SRC_PORT_FIELD_NUMBER = 5;
 
-        private int srcPort_ = 0;
+        private int srcPort_;
 
         /**
          * uint32 src_port = 5;
@@ -611,7 +689,7 @@ public final class Acl {
 
         public static final int DST_PORT_FIELD_NUMBER = 6;
 
-        private int dstPort_ = 0;
+        private int dstPort_;
 
         /**
          * uint32 dst_port = 6;
@@ -624,7 +702,7 @@ public final class Acl {
 
         public static final int START_MPLS_LABEL_FIELD_NUMBER = 7;
 
-        private int startMplsLabel_ = 0;
+        private int startMplsLabel_;
 
         /**
          * uint32 start_mpls_label = 7;
@@ -637,7 +715,7 @@ public final class Acl {
 
         public static final int END_MPLS_LABEL_FIELD_NUMBER = 8;
 
-        private int endMplsLabel_ = 0;
+        private int endMplsLabel_;
 
         /**
          * uint32 end_mpls_label = 8;
@@ -669,10 +747,10 @@ public final class Acl {
             if (protocol_ != 0) {
                 output.writeUInt32(2, protocol_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcAddress_)) {
+            if (!getSrcAddressBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 3, srcAddress_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstAddress_)) {
+            if (!getDstAddressBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 4, dstAddress_);
             }
             if (srcPort_ != 0) {
@@ -687,7 +765,7 @@ public final class Acl {
             if (endMplsLabel_ != 0) {
                 output.writeUInt32(8, endMplsLabel_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -702,10 +780,10 @@ public final class Acl {
             if (protocol_ != 0) {
                 size += com.google.protobuf.CodedOutputStream.computeUInt32Size(2, protocol_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcAddress_)) {
+            if (!getSrcAddressBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, srcAddress_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstAddress_)) {
+            if (!getDstAddressBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, dstAddress_);
             }
             if (srcPort_ != 0) {
@@ -720,7 +798,7 @@ public final class Acl {
             if (endMplsLabel_ != 0) {
                 size += com.google.protobuf.CodedOutputStream.computeUInt32Size(8, endMplsLabel_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -750,7 +828,7 @@ public final class Acl {
                 return false;
             if (getEndMplsLabel() != other.getEndMplsLabel())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -778,7 +856,7 @@ public final class Acl {
             hash = (53 * hash) + getStartMplsLabel();
             hash = (37 * hash) + END_MPLS_LABEL_FIELD_NUMBER;
             hash = (53 * hash) + getEndMplsLabel();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -872,16 +950,22 @@ public final class Acl {
 
             // Construct using acl.Acl.AclMatch.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 dscp_ = 0;
                 protocol_ = 0;
                 srcAddress_ = "";
@@ -915,39 +999,46 @@ public final class Acl {
             @java.lang.Override
             public acl.Acl.AclMatch buildPartial() {
                 acl.Acl.AclMatch result = new acl.Acl.AclMatch(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.dscp_ = dscp_;
+                result.protocol_ = protocol_;
+                result.srcAddress_ = srcAddress_;
+                result.dstAddress_ = dstAddress_;
+                result.srcPort_ = srcPort_;
+                result.dstPort_ = dstPort_;
+                result.startMplsLabel_ = startMplsLabel_;
+                result.endMplsLabel_ = endMplsLabel_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(acl.Acl.AclMatch result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.dscp_ = dscp_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.protocol_ = protocol_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.srcAddress_ = srcAddress_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.dstAddress_ = dstAddress_;
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.srcPort_ = srcPort_;
-                }
-                if (((from_bitField0_ & 0x00000020) != 0)) {
-                    result.dstPort_ = dstPort_;
-                }
-                if (((from_bitField0_ & 0x00000040) != 0)) {
-                    result.startMplsLabel_ = startMplsLabel_;
-                }
-                if (((from_bitField0_ & 0x00000080) != 0)) {
-                    result.endMplsLabel_ = endMplsLabel_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -971,12 +1062,10 @@ public final class Acl {
                 }
                 if (!other.getSrcAddress().isEmpty()) {
                     srcAddress_ = other.srcAddress_;
-                    bitField0_ |= 0x00000004;
                     onChanged();
                 }
                 if (!other.getDstAddress().isEmpty()) {
                     dstAddress_ = other.dstAddress_;
-                    bitField0_ |= 0x00000008;
                     onChanged();
                 }
                 if (other.getSrcPort() != 0) {
@@ -991,7 +1080,7 @@ public final class Acl {
                 if (other.getEndMplsLabel() != 0) {
                     setEndMplsLabel(other.getEndMplsLabel());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -1003,96 +1092,20 @@ public final class Acl {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                acl.Acl.AclMatch parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    dscp_ = input.readUInt32();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            case 16:
-                                {
-                                    protocol_ = input.readUInt32();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            case 26:
-                                {
-                                    srcAddress_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    dstAddress_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 34
-                            case 40:
-                                {
-                                    srcPort_ = input.readUInt32();
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 40
-                            case 48:
-                                {
-                                    dstPort_ = input.readUInt32();
-                                    bitField0_ |= 0x00000020;
-                                    break;
-                                }
-                            // case 48
-                            case 56:
-                                {
-                                    startMplsLabel_ = input.readUInt32();
-                                    bitField0_ |= 0x00000040;
-                                    break;
-                                }
-                            // case 56
-                            case 64:
-                                {
-                                    endMplsLabel_ = input.readUInt32();
-                                    bitField0_ |= 0x00000080;
-                                    break;
-                                }
-                            // case 64
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (acl.Acl.AclMatch) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private int dscp_;
 
             /**
@@ -1111,7 +1124,6 @@ public final class Acl {
              */
             public Builder setDscp(int value) {
                 dscp_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -1121,7 +1133,6 @@ public final class Acl {
              * @return This builder for chaining.
              */
             public Builder clearDscp() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 dscp_ = 0;
                 onChanged();
                 return this;
@@ -1145,7 +1156,6 @@ public final class Acl {
              */
             public Builder setProtocol(int value) {
                 protocol_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -1155,7 +1165,6 @@ public final class Acl {
              * @return This builder for chaining.
              */
             public Builder clearProtocol() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 protocol_ = 0;
                 onChanged();
                 return this;
@@ -1204,7 +1213,6 @@ public final class Acl {
                     throw new NullPointerException();
                 }
                 srcAddress_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -1215,7 +1223,6 @@ public final class Acl {
              */
             public Builder clearSrcAddress() {
                 srcAddress_ = getDefaultInstance().getSrcAddress();
-                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -1231,7 +1238,6 @@ public final class Acl {
                 }
                 checkByteStringIsUtf8(value);
                 srcAddress_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -1279,7 +1285,6 @@ public final class Acl {
                     throw new NullPointerException();
                 }
                 dstAddress_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -1290,7 +1295,6 @@ public final class Acl {
              */
             public Builder clearDstAddress() {
                 dstAddress_ = getDefaultInstance().getDstAddress();
-                bitField0_ = (bitField0_ & ~0x00000008);
                 onChanged();
                 return this;
             }
@@ -1306,7 +1310,6 @@ public final class Acl {
                 }
                 checkByteStringIsUtf8(value);
                 dstAddress_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -1329,7 +1332,6 @@ public final class Acl {
              */
             public Builder setSrcPort(int value) {
                 srcPort_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -1339,7 +1341,6 @@ public final class Acl {
              * @return This builder for chaining.
              */
             public Builder clearSrcPort() {
-                bitField0_ = (bitField0_ & ~0x00000010);
                 srcPort_ = 0;
                 onChanged();
                 return this;
@@ -1363,7 +1364,6 @@ public final class Acl {
              */
             public Builder setDstPort(int value) {
                 dstPort_ = value;
-                bitField0_ |= 0x00000020;
                 onChanged();
                 return this;
             }
@@ -1373,7 +1373,6 @@ public final class Acl {
              * @return This builder for chaining.
              */
             public Builder clearDstPort() {
-                bitField0_ = (bitField0_ & ~0x00000020);
                 dstPort_ = 0;
                 onChanged();
                 return this;
@@ -1397,7 +1396,6 @@ public final class Acl {
              */
             public Builder setStartMplsLabel(int value) {
                 startMplsLabel_ = value;
-                bitField0_ |= 0x00000040;
                 onChanged();
                 return this;
             }
@@ -1407,7 +1405,6 @@ public final class Acl {
              * @return This builder for chaining.
              */
             public Builder clearStartMplsLabel() {
-                bitField0_ = (bitField0_ & ~0x00000040);
                 startMplsLabel_ = 0;
                 onChanged();
                 return this;
@@ -1431,7 +1428,6 @@ public final class Acl {
              */
             public Builder setEndMplsLabel(int value) {
                 endMplsLabel_ = value;
-                bitField0_ |= 0x00000080;
                 onChanged();
                 return this;
             }
@@ -1441,7 +1437,6 @@ public final class Acl {
              * @return This builder for chaining.
              */
             public Builder clearEndMplsLabel() {
-                bitField0_ = (bitField0_ & ~0x00000080);
                 endMplsLabel_ = 0;
                 onChanged();
                 return this;
@@ -1474,17 +1469,7 @@ public final class Acl {
 
             @java.lang.Override
             public AclMatch parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new AclMatch(input, extensionRegistry);
             }
         };
 
@@ -1555,6 +1540,56 @@ public final class Acl {
             return new AclAction();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private AclAction(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                int rawValue = input.readEnum();
+                                forwardAction_ = rawValue;
+                                break;
+                            }
+                        case 16:
+                            {
+                                int rawValue = input.readEnum();
+                                logAction_ = rawValue;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return acl.Acl.internal_static_acl_AclAction_descriptor;
         }
@@ -1566,7 +1601,7 @@ public final class Acl {
 
         public static final int FORWARD_ACTION_FIELD_NUMBER = 1;
 
-        private int forwardAction_ = 0;
+        private int forwardAction_;
 
         /**
          * .acl.AclForwardActionEnum forward_action = 1;
@@ -1583,13 +1618,14 @@ public final class Acl {
          */
         @java.lang.Override
         public acl.Acl.AclForwardActionEnum getForwardAction() {
-            acl.Acl.AclForwardActionEnum result = acl.Acl.AclForwardActionEnum.forNumber(forwardAction_);
+            @SuppressWarnings("deprecation")
+            acl.Acl.AclForwardActionEnum result = acl.Acl.AclForwardActionEnum.valueOf(forwardAction_);
             return result == null ? acl.Acl.AclForwardActionEnum.UNRECOGNIZED : result;
         }
 
         public static final int LOG_ACTION_FIELD_NUMBER = 2;
 
-        private int logAction_ = 0;
+        private int logAction_;
 
         /**
          * .acl.AclLogActionEnum log_action = 2;
@@ -1606,7 +1642,8 @@ public final class Acl {
          */
         @java.lang.Override
         public acl.Acl.AclLogActionEnum getLogAction() {
-            acl.Acl.AclLogActionEnum result = acl.Acl.AclLogActionEnum.forNumber(logAction_);
+            @SuppressWarnings("deprecation")
+            acl.Acl.AclLogActionEnum result = acl.Acl.AclLogActionEnum.valueOf(logAction_);
             return result == null ? acl.Acl.AclLogActionEnum.UNRECOGNIZED : result;
         }
 
@@ -1631,7 +1668,7 @@ public final class Acl {
             if (logAction_ != acl.Acl.AclLogActionEnum.ACLLOGACTION_UNDEFINED.getNumber()) {
                 output.writeEnum(2, logAction_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -1646,7 +1683,7 @@ public final class Acl {
             if (logAction_ != acl.Acl.AclLogActionEnum.ACLLOGACTION_UNDEFINED.getNumber()) {
                 size += com.google.protobuf.CodedOutputStream.computeEnumSize(2, logAction_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -1664,7 +1701,7 @@ public final class Acl {
                 return false;
             if (logAction_ != other.logAction_)
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -1680,7 +1717,7 @@ public final class Acl {
             hash = (53 * hash) + forwardAction_;
             hash = (37 * hash) + LOG_ACTION_FIELD_NUMBER;
             hash = (53 * hash) + logAction_;
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -1774,16 +1811,22 @@ public final class Acl {
 
             // Construct using acl.Acl.AclAction.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 forwardAction_ = 0;
                 logAction_ = 0;
                 return this;
@@ -1811,21 +1854,40 @@ public final class Acl {
             @java.lang.Override
             public acl.Acl.AclAction buildPartial() {
                 acl.Acl.AclAction result = new acl.Acl.AclAction(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.forwardAction_ = forwardAction_;
+                result.logAction_ = logAction_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(acl.Acl.AclAction result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.forwardAction_ = forwardAction_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.logAction_ = logAction_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -1847,7 +1909,7 @@ public final class Acl {
                 if (other.logAction_ != 0) {
                     setLogActionValue(other.getLogActionValue());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -1859,54 +1921,20 @@ public final class Acl {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                acl.Acl.AclAction parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    forwardAction_ = input.readEnum();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            case 16:
-                                {
-                                    logAction_ = input.readEnum();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (acl.Acl.AclAction) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private int forwardAction_ = 0;
 
             /**
@@ -1925,7 +1953,6 @@ public final class Acl {
              */
             public Builder setForwardActionValue(int value) {
                 forwardAction_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -1936,7 +1963,8 @@ public final class Acl {
              */
             @java.lang.Override
             public acl.Acl.AclForwardActionEnum getForwardAction() {
-                acl.Acl.AclForwardActionEnum result = acl.Acl.AclForwardActionEnum.forNumber(forwardAction_);
+                @SuppressWarnings("deprecation")
+                acl.Acl.AclForwardActionEnum result = acl.Acl.AclForwardActionEnum.valueOf(forwardAction_);
                 return result == null ? acl.Acl.AclForwardActionEnum.UNRECOGNIZED : result;
             }
 
@@ -1949,7 +1977,6 @@ public final class Acl {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000001;
                 forwardAction_ = value.getNumber();
                 onChanged();
                 return this;
@@ -1960,7 +1987,6 @@ public final class Acl {
              * @return This builder for chaining.
              */
             public Builder clearForwardAction() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 forwardAction_ = 0;
                 onChanged();
                 return this;
@@ -1984,7 +2010,6 @@ public final class Acl {
              */
             public Builder setLogActionValue(int value) {
                 logAction_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -1995,7 +2020,8 @@ public final class Acl {
              */
             @java.lang.Override
             public acl.Acl.AclLogActionEnum getLogAction() {
-                acl.Acl.AclLogActionEnum result = acl.Acl.AclLogActionEnum.forNumber(logAction_);
+                @SuppressWarnings("deprecation")
+                acl.Acl.AclLogActionEnum result = acl.Acl.AclLogActionEnum.valueOf(logAction_);
                 return result == null ? acl.Acl.AclLogActionEnum.UNRECOGNIZED : result;
             }
 
@@ -2008,7 +2034,6 @@ public final class Acl {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000002;
                 logAction_ = value.getNumber();
                 onChanged();
                 return this;
@@ -2019,7 +2044,6 @@ public final class Acl {
              * @return This builder for chaining.
              */
             public Builder clearLogAction() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 logAction_ = 0;
                 onChanged();
                 return this;
@@ -2052,17 +2076,7 @@ public final class Acl {
 
             @java.lang.Override
             public AclAction parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new AclAction(input, extensionRegistry);
             }
         };
 
@@ -2160,6 +2174,81 @@ public final class Acl {
             return new AclEntry();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private AclEntry(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                sequenceId_ = input.readUInt32();
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                description_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                acl.Acl.AclMatch.Builder subBuilder = null;
+                                if (match_ != null) {
+                                    subBuilder = match_.toBuilder();
+                                }
+                                match_ = input.readMessage(acl.Acl.AclMatch.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(match_);
+                                    match_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 34:
+                            {
+                                acl.Acl.AclAction.Builder subBuilder = null;
+                                if (action_ != null) {
+                                    subBuilder = action_.toBuilder();
+                                }
+                                action_ = input.readMessage(acl.Acl.AclAction.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(action_);
+                                    action_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return acl.Acl.internal_static_acl_AclEntry_descriptor;
         }
@@ -2171,7 +2260,7 @@ public final class Acl {
 
         public static final int SEQUENCE_ID_FIELD_NUMBER = 1;
 
-        private int sequenceId_ = 0;
+        private int sequenceId_;
 
         /**
          * uint32 sequence_id = 1;
@@ -2184,8 +2273,7 @@ public final class Acl {
 
         public static final int DESCRIPTION_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object description_ = "";
+        private volatile java.lang.Object description_;
 
         /**
          * string description = 2;
@@ -2247,7 +2335,7 @@ public final class Acl {
          */
         @java.lang.Override
         public acl.Acl.AclMatchOrBuilder getMatchOrBuilder() {
-            return match_ == null ? acl.Acl.AclMatch.getDefaultInstance() : match_;
+            return getMatch();
         }
 
         public static final int ACTION_FIELD_NUMBER = 4;
@@ -2277,7 +2365,7 @@ public final class Acl {
          */
         @java.lang.Override
         public acl.Acl.AclActionOrBuilder getActionOrBuilder() {
-            return action_ == null ? acl.Acl.AclAction.getDefaultInstance() : action_;
+            return getAction();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -2298,7 +2386,7 @@ public final class Acl {
             if (sequenceId_ != 0) {
                 output.writeUInt32(1, sequenceId_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(description_)) {
+            if (!getDescriptionBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, description_);
             }
             if (match_ != null) {
@@ -2307,7 +2395,7 @@ public final class Acl {
             if (action_ != null) {
                 output.writeMessage(4, getAction());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -2319,7 +2407,7 @@ public final class Acl {
             if (sequenceId_ != 0) {
                 size += com.google.protobuf.CodedOutputStream.computeUInt32Size(1, sequenceId_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(description_)) {
+            if (!getDescriptionBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, description_);
             }
             if (match_ != null) {
@@ -2328,7 +2416,7 @@ public final class Acl {
             if (action_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, getAction());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -2358,7 +2446,7 @@ public final class Acl {
                 if (!getAction().equals(other.getAction()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -2382,7 +2470,7 @@ public final class Acl {
                 hash = (37 * hash) + ACTION_FIELD_NUMBER;
                 hash = (53 * hash) + getAction().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -2476,26 +2564,34 @@ public final class Acl {
 
             // Construct using acl.Acl.AclEntry.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 sequenceId_ = 0;
                 description_ = "";
-                match_ = null;
-                if (matchBuilder_ != null) {
-                    matchBuilder_.dispose();
+                if (matchBuilder_ == null) {
+                    match_ = null;
+                } else {
+                    match_ = null;
                     matchBuilder_ = null;
                 }
-                action_ = null;
-                if (actionBuilder_ != null) {
-                    actionBuilder_.dispose();
+                if (actionBuilder_ == null) {
+                    action_ = null;
+                } else {
+                    action_ = null;
                     actionBuilder_ = null;
                 }
                 return this;
@@ -2523,27 +2619,50 @@ public final class Acl {
             @java.lang.Override
             public acl.Acl.AclEntry buildPartial() {
                 acl.Acl.AclEntry result = new acl.Acl.AclEntry(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                result.sequenceId_ = sequenceId_;
+                result.description_ = description_;
+                if (matchBuilder_ == null) {
+                    result.match_ = match_;
+                } else {
+                    result.match_ = matchBuilder_.build();
+                }
+                if (actionBuilder_ == null) {
+                    result.action_ = action_;
+                } else {
+                    result.action_ = actionBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(acl.Acl.AclEntry result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.sequenceId_ = sequenceId_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.description_ = description_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.match_ = matchBuilder_ == null ? match_ : matchBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.action_ = actionBuilder_ == null ? action_ : actionBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -2564,7 +2683,6 @@ public final class Acl {
                 }
                 if (!other.getDescription().isEmpty()) {
                     description_ = other.description_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (other.hasMatch()) {
@@ -2573,7 +2691,7 @@ public final class Acl {
                 if (other.hasAction()) {
                     mergeAction(other.getAction());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -2585,68 +2703,20 @@ public final class Acl {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                acl.Acl.AclEntry parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    sequenceId_ = input.readUInt32();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            case 18:
-                                {
-                                    description_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getMatchFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    input.readMessage(getActionFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 34
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (acl.Acl.AclEntry) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private int sequenceId_;
 
             /**
@@ -2665,7 +2735,6 @@ public final class Acl {
              */
             public Builder setSequenceId(int value) {
                 sequenceId_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -2675,7 +2744,6 @@ public final class Acl {
              * @return This builder for chaining.
              */
             public Builder clearSequenceId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 sequenceId_ = 0;
                 onChanged();
                 return this;
@@ -2724,7 +2792,6 @@ public final class Acl {
                     throw new NullPointerException();
                 }
                 description_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -2735,7 +2802,6 @@ public final class Acl {
              */
             public Builder clearDescription() {
                 description_ = getDefaultInstance().getDescription();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -2751,7 +2817,6 @@ public final class Acl {
                 }
                 checkByteStringIsUtf8(value);
                 description_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -2765,7 +2830,7 @@ public final class Acl {
              * @return Whether the match field is set.
              */
             public boolean hasMatch() {
-                return ((bitField0_ & 0x00000004) != 0);
+                return matchBuilder_ != null || match_ != null;
             }
 
             /**
@@ -2789,11 +2854,10 @@ public final class Acl {
                         throw new NullPointerException();
                     }
                     match_ = value;
+                    onChanged();
                 } else {
                     matchBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -2803,11 +2867,10 @@ public final class Acl {
             public Builder setMatch(acl.Acl.AclMatch.Builder builderForValue) {
                 if (matchBuilder_ == null) {
                     match_ = builderForValue.build();
+                    onChanged();
                 } else {
                     matchBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -2816,16 +2879,15 @@ public final class Acl {
              */
             public Builder mergeMatch(acl.Acl.AclMatch value) {
                 if (matchBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0) && match_ != null && match_ != acl.Acl.AclMatch.getDefaultInstance()) {
-                        getMatchBuilder().mergeFrom(value);
+                    if (match_ != null) {
+                        match_ = acl.Acl.AclMatch.newBuilder(match_).mergeFrom(value).buildPartial();
                     } else {
                         match_ = value;
                     }
+                    onChanged();
                 } else {
                     matchBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -2833,13 +2895,13 @@ public final class Acl {
              * .acl.AclMatch match = 3;
              */
             public Builder clearMatch() {
-                bitField0_ = (bitField0_ & ~0x00000004);
-                match_ = null;
-                if (matchBuilder_ != null) {
-                    matchBuilder_.dispose();
+                if (matchBuilder_ == null) {
+                    match_ = null;
+                    onChanged();
+                } else {
+                    match_ = null;
                     matchBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -2847,7 +2909,6 @@ public final class Acl {
              * .acl.AclMatch match = 3;
              */
             public acl.Acl.AclMatch.Builder getMatchBuilder() {
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return getMatchFieldBuilder().getBuilder();
             }
@@ -2883,7 +2944,7 @@ public final class Acl {
              * @return Whether the action field is set.
              */
             public boolean hasAction() {
-                return ((bitField0_ & 0x00000008) != 0);
+                return actionBuilder_ != null || action_ != null;
             }
 
             /**
@@ -2907,11 +2968,10 @@ public final class Acl {
                         throw new NullPointerException();
                     }
                     action_ = value;
+                    onChanged();
                 } else {
                     actionBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -2921,11 +2981,10 @@ public final class Acl {
             public Builder setAction(acl.Acl.AclAction.Builder builderForValue) {
                 if (actionBuilder_ == null) {
                     action_ = builderForValue.build();
+                    onChanged();
                 } else {
                     actionBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -2934,16 +2993,15 @@ public final class Acl {
              */
             public Builder mergeAction(acl.Acl.AclAction value) {
                 if (actionBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0) && action_ != null && action_ != acl.Acl.AclAction.getDefaultInstance()) {
-                        getActionBuilder().mergeFrom(value);
+                    if (action_ != null) {
+                        action_ = acl.Acl.AclAction.newBuilder(action_).mergeFrom(value).buildPartial();
                     } else {
                         action_ = value;
                     }
+                    onChanged();
                 } else {
                     actionBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -2951,13 +3009,13 @@ public final class Acl {
              * .acl.AclAction action = 4;
              */
             public Builder clearAction() {
-                bitField0_ = (bitField0_ & ~0x00000008);
-                action_ = null;
-                if (actionBuilder_ != null) {
-                    actionBuilder_.dispose();
+                if (actionBuilder_ == null) {
+                    action_ = null;
+                    onChanged();
+                } else {
+                    action_ = null;
                     actionBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -2965,7 +3023,6 @@ public final class Acl {
              * .acl.AclAction action = 4;
              */
             public acl.Acl.AclAction.Builder getActionBuilder() {
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return getActionFieldBuilder().getBuilder();
             }
@@ -3019,17 +3076,7 @@ public final class Acl {
 
             @java.lang.Override
             public AclEntry parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new AclEntry(input, extensionRegistry);
             }
         };
 
@@ -3152,6 +3199,81 @@ public final class Acl {
             return new AclRuleSet();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private AclRuleSet(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 16:
+                            {
+                                int rawValue = input.readEnum();
+                                type_ = rawValue;
+                                break;
+                            }
+                        case 26:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                description_ = s;
+                                break;
+                            }
+                        case 34:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                userId_ = s;
+                                break;
+                            }
+                        case 42:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    entries_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                entries_.add(input.readMessage(acl.Acl.AclEntry.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    entries_ = java.util.Collections.unmodifiableList(entries_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return acl.Acl.internal_static_acl_AclRuleSet_descriptor;
         }
@@ -3163,8 +3285,7 @@ public final class Acl {
 
         public static final int NAME_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 1;
@@ -3201,7 +3322,7 @@ public final class Acl {
 
         public static final int TYPE_FIELD_NUMBER = 2;
 
-        private int type_ = 0;
+        private int type_;
 
         /**
          * .acl.AclRuleTypeEnum type = 2;
@@ -3218,14 +3339,14 @@ public final class Acl {
          */
         @java.lang.Override
         public acl.Acl.AclRuleTypeEnum getType() {
-            acl.Acl.AclRuleTypeEnum result = acl.Acl.AclRuleTypeEnum.forNumber(type_);
+            @SuppressWarnings("deprecation")
+            acl.Acl.AclRuleTypeEnum result = acl.Acl.AclRuleTypeEnum.valueOf(type_);
             return result == null ? acl.Acl.AclRuleTypeEnum.UNRECOGNIZED : result;
         }
 
         public static final int DESCRIPTION_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object description_ = "";
+        private volatile java.lang.Object description_;
 
         /**
          * string description = 3;
@@ -3262,8 +3383,7 @@ public final class Acl {
 
         public static final int USER_ID_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object userId_ = "";
+        private volatile java.lang.Object userId_;
 
         /**
          * string user_id = 4;
@@ -3300,7 +3420,6 @@ public final class Acl {
 
         public static final int ENTRIES_FIELD_NUMBER = 5;
 
-        @SuppressWarnings("serial")
         private java.util.List entries_;
 
         /**
@@ -3358,22 +3477,22 @@ public final class Acl {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
             }
             if (type_ != acl.Acl.AclRuleTypeEnum.ACLRULETYPE_UNDEFINED.getNumber()) {
                 output.writeEnum(2, type_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(description_)) {
+            if (!getDescriptionBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 3, description_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(userId_)) {
+            if (!getUserIdBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 4, userId_);
             }
             for (int i = 0; i < entries_.size(); i++) {
                 output.writeMessage(5, entries_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -3382,22 +3501,22 @@ public final class Acl {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
             }
             if (type_ != acl.Acl.AclRuleTypeEnum.ACLRULETYPE_UNDEFINED.getNumber()) {
                 size += com.google.protobuf.CodedOutputStream.computeEnumSize(2, type_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(description_)) {
+            if (!getDescriptionBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, description_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(userId_)) {
+            if (!getUserIdBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, userId_);
             }
             for (int i = 0; i < entries_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, entries_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -3421,7 +3540,7 @@ public final class Acl {
                 return false;
             if (!getEntriesList().equals(other.getEntriesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -3445,7 +3564,7 @@ public final class Acl {
                 hash = (37 * hash) + ENTRIES_FIELD_NUMBER;
                 hash = (53 * hash) + getEntriesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -3539,27 +3658,33 @@ public final class Acl {
 
             // Construct using acl.Acl.AclRuleSet.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getEntriesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 name_ = "";
                 type_ = 0;
                 description_ = "";
                 userId_ = "";
                 if (entriesBuilder_ == null) {
                     entries_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    entries_ = null;
                     entriesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000010);
                 return this;
             }
 
@@ -3585,40 +3710,52 @@ public final class Acl {
             @java.lang.Override
             public acl.Acl.AclRuleSet buildPartial() {
                 acl.Acl.AclRuleSet result = new acl.Acl.AclRuleSet(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(acl.Acl.AclRuleSet result) {
+                int from_bitField0_ = bitField0_;
+                result.name_ = name_;
+                result.type_ = type_;
+                result.description_ = description_;
+                result.userId_ = userId_;
                 if (entriesBuilder_ == null) {
-                    if (((bitField0_ & 0x00000010) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         entries_ = java.util.Collections.unmodifiableList(entries_);
-                        bitField0_ = (bitField0_ & ~0x00000010);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.entries_ = entries_;
                 } else {
                     result.entries_ = entriesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(acl.Acl.AclRuleSet result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.type_ = type_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.description_ = description_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.userId_ = userId_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -3636,7 +3773,6 @@ public final class Acl {
                     return this;
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
                 if (other.type_ != 0) {
@@ -3644,19 +3780,17 @@ public final class Acl {
                 }
                 if (!other.getDescription().isEmpty()) {
                     description_ = other.description_;
-                    bitField0_ |= 0x00000004;
                     onChanged();
                 }
                 if (!other.getUserId().isEmpty()) {
                     userId_ = other.userId_;
-                    bitField0_ |= 0x00000008;
                     onChanged();
                 }
                 if (entriesBuilder_ == null) {
                     if (!other.entries_.isEmpty()) {
                         if (entries_.isEmpty()) {
                             entries_ = other.entries_;
-                            bitField0_ = (bitField0_ & ~0x00000010);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureEntriesIsMutable();
                             entries_.addAll(other.entries_);
@@ -3669,14 +3803,14 @@ public final class Acl {
                             entriesBuilder_.dispose();
                             entriesBuilder_ = null;
                             entries_ = other.entries_;
-                            bitField0_ = (bitField0_ & ~0x00000010);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             entriesBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getEntriesFieldBuilder() : null;
                         } else {
                             entriesBuilder_.addAllMessages(other.entries_);
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -3688,75 +3822,17 @@ public final class Acl {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                acl.Acl.AclRuleSet parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 16:
-                                {
-                                    type_ = input.readEnum();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            case 26:
-                                {
-                                    description_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    userId_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    acl.Acl.AclEntry m = input.readMessage(acl.Acl.AclEntry.parser(), extensionRegistry);
-                                    if (entriesBuilder_ == null) {
-                                        ensureEntriesIsMutable();
-                                        entries_.add(m);
-                                    } else {
-                                        entriesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 42
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (acl.Acl.AclRuleSet) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -3805,7 +3881,6 @@ public final class Acl {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -3816,7 +3891,6 @@ public final class Acl {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -3832,7 +3906,6 @@ public final class Acl {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -3855,7 +3928,6 @@ public final class Acl {
              */
             public Builder setTypeValue(int value) {
                 type_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -3866,7 +3938,8 @@ public final class Acl {
              */
             @java.lang.Override
             public acl.Acl.AclRuleTypeEnum getType() {
-                acl.Acl.AclRuleTypeEnum result = acl.Acl.AclRuleTypeEnum.forNumber(type_);
+                @SuppressWarnings("deprecation")
+                acl.Acl.AclRuleTypeEnum result = acl.Acl.AclRuleTypeEnum.valueOf(type_);
                 return result == null ? acl.Acl.AclRuleTypeEnum.UNRECOGNIZED : result;
             }
 
@@ -3879,7 +3952,6 @@ public final class Acl {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000002;
                 type_ = value.getNumber();
                 onChanged();
                 return this;
@@ -3890,7 +3962,6 @@ public final class Acl {
              * @return This builder for chaining.
              */
             public Builder clearType() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 type_ = 0;
                 onChanged();
                 return this;
@@ -3939,7 +4010,6 @@ public final class Acl {
                     throw new NullPointerException();
                 }
                 description_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -3950,7 +4020,6 @@ public final class Acl {
              */
             public Builder clearDescription() {
                 description_ = getDefaultInstance().getDescription();
-                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -3966,7 +4035,6 @@ public final class Acl {
                 }
                 checkByteStringIsUtf8(value);
                 description_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -4014,7 +4082,6 @@ public final class Acl {
                     throw new NullPointerException();
                 }
                 userId_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -4025,7 +4092,6 @@ public final class Acl {
              */
             public Builder clearUserId() {
                 userId_ = getDefaultInstance().getUserId();
-                bitField0_ = (bitField0_ & ~0x00000008);
                 onChanged();
                 return this;
             }
@@ -4041,7 +4107,6 @@ public final class Acl {
                 }
                 checkByteStringIsUtf8(value);
                 userId_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -4049,9 +4114,9 @@ public final class Acl {
             private java.util.List entries_ = java.util.Collections.emptyList();
 
             private void ensureEntriesIsMutable() {
-                if (!((bitField0_ & 0x00000010) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     entries_ = new java.util.ArrayList(entries_);
-                    bitField0_ |= 0x00000010;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -4203,7 +4268,7 @@ public final class Acl {
             public Builder clearEntries() {
                 if (entriesBuilder_ == null) {
                     entries_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000010);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     entriesBuilder_.clear();
@@ -4277,7 +4342,7 @@ public final class Acl {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getEntriesFieldBuilder() {
                 if (entriesBuilder_ == null) {
-                    entriesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(entries_, ((bitField0_ & 0x00000010) != 0), getParentForChildren(), isClean());
+                    entriesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(entries_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     entries_ = null;
                 }
                 return entriesBuilder_;
@@ -4310,17 +4375,7 @@ public final class Acl {
 
             @java.lang.Override
             public AclRuleSet parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new AclRuleSet(input, extensionRegistry);
             }
         };
 
diff --git a/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java b/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java
index 9bcff8a50..459377049 100644
--- a/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java
+++ b/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java
@@ -184,9 +184,9 @@ public final class ContextOuterClass {
          */
         DEVICEDRIVER_GNMI_OPENCONFIG(8),
         /**
-         * DEVICEDRIVER_FLEXSCALE = 9;
+         * DEVICEDRIVER_OPTICAL_TFS = 9;
          */
-        DEVICEDRIVER_FLEXSCALE(9),
+        DEVICEDRIVER_OPTICAL_TFS(9),
         /**
          * DEVICEDRIVER_IETF_ACTN = 10;
          */
@@ -247,9 +247,9 @@ public final class ContextOuterClass {
         public static final int DEVICEDRIVER_GNMI_OPENCONFIG_VALUE = 8;
 
         /**
-         * DEVICEDRIVER_FLEXSCALE = 9;
+         * DEVICEDRIVER_OPTICAL_TFS = 9;
          */
-        public static final int DEVICEDRIVER_FLEXSCALE_VALUE = 9;
+        public static final int DEVICEDRIVER_OPTICAL_TFS_VALUE = 9;
 
         /**
          * DEVICEDRIVER_IETF_ACTN = 10;
@@ -303,7 +303,7 @@ public final class ContextOuterClass {
                 case 8:
                     return DEVICEDRIVER_GNMI_OPENCONFIG;
                 case 9:
-                    return DEVICEDRIVER_FLEXSCALE;
+                    return DEVICEDRIVER_OPTICAL_TFS;
                 case 10:
                     return DEVICEDRIVER_IETF_ACTN;
                 case 11:
@@ -1363,6 +1363,44 @@ public final class ContextOuterClass {
             return new Empty();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Empty(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Empty_descriptor;
         }
@@ -1387,7 +1425,7 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -1396,7 +1434,7 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -1410,7 +1448,7 @@ public final class ContextOuterClass {
                 return super.equals(obj);
             }
             context.ContextOuterClass.Empty other = (context.ContextOuterClass.Empty) obj;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -1422,7 +1460,7 @@ public final class ContextOuterClass {
             }
             int hash = 41;
             hash = (19 * hash) + getDescriptor().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -1520,10 +1558,17 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Empty.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
@@ -1558,6 +1603,36 @@ public final class ContextOuterClass {
                 return result;
             }
 
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
+            }
+
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.Message other) {
                 if (other instanceof context.ContextOuterClass.Empty) {
@@ -1571,7 +1646,7 @@ public final class ContextOuterClass {
             public Builder mergeFrom(context.ContextOuterClass.Empty other) {
                 if (other == context.ContextOuterClass.Empty.getDefaultInstance())
                     return this;
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -1583,35 +1658,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Empty parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Empty) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -1642,17 +1699,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Empty parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Empty(input, extensionRegistry);
             }
         };
 
@@ -1710,6 +1757,50 @@ public final class ContextOuterClass {
             return new Uuid();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Uuid(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                uuid_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Uuid_descriptor;
         }
@@ -1721,8 +1812,7 @@ public final class ContextOuterClass {
 
         public static final int UUID_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object uuid_ = "";
+        private volatile java.lang.Object uuid_;
 
         /**
          * string uuid = 1;
@@ -1772,10 +1862,10 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uuid_)) {
+            if (!getUuidBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, uuid_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -1784,10 +1874,10 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uuid_)) {
+            if (!getUuidBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, uuid_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -1803,7 +1893,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.Uuid other = (context.ContextOuterClass.Uuid) obj;
             if (!getUuid().equals(other.getUuid()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -1817,7 +1907,7 @@ public final class ContextOuterClass {
             hash = (19 * hash) + getDescriptor().hashCode();
             hash = (37 * hash) + UUID_FIELD_NUMBER;
             hash = (53 * hash) + getUuid().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -1911,16 +2001,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Uuid.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 uuid_ = "";
                 return this;
             }
@@ -1947,18 +2043,39 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Uuid buildPartial() {
                 context.ContextOuterClass.Uuid result = new context.ContextOuterClass.Uuid(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.uuid_ = uuid_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Uuid result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.uuid_ = uuid_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -1976,10 +2093,9 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getUuid().isEmpty()) {
                     uuid_ = other.uuid_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -1991,47 +2107,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Uuid parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    uuid_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Uuid) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private java.lang.Object uuid_ = "";
 
             /**
@@ -2075,7 +2164,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 uuid_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -2086,7 +2174,6 @@ public final class ContextOuterClass {
              */
             public Builder clearUuid() {
                 uuid_ = getDefaultInstance().getUuid();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -2102,7 +2189,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 uuid_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -2134,17 +2220,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Uuid parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Uuid(input, extensionRegistry);
             }
         };
 
@@ -2195,6 +2271,49 @@ public final class ContextOuterClass {
             return new Timestamp();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Timestamp(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 9:
+                            {
+                                timestamp_ = input.readDouble();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Timestamp_descriptor;
         }
@@ -2206,7 +2325,7 @@ public final class ContextOuterClass {
 
         public static final int TIMESTAMP_FIELD_NUMBER = 1;
 
-        private double timestamp_ = 0D;
+        private double timestamp_;
 
         /**
          * double timestamp = 1;
@@ -2232,10 +2351,10 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (java.lang.Double.doubleToRawLongBits(timestamp_) != 0) {
+            if (timestamp_ != 0D) {
                 output.writeDouble(1, timestamp_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -2244,10 +2363,10 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (java.lang.Double.doubleToRawLongBits(timestamp_) != 0) {
+            if (timestamp_ != 0D) {
                 size += com.google.protobuf.CodedOutputStream.computeDoubleSize(1, timestamp_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -2263,7 +2382,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.Timestamp other = (context.ContextOuterClass.Timestamp) obj;
             if (java.lang.Double.doubleToLongBits(getTimestamp()) != java.lang.Double.doubleToLongBits(other.getTimestamp()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -2277,7 +2396,7 @@ public final class ContextOuterClass {
             hash = (19 * hash) + getDescriptor().hashCode();
             hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
             hash = (53 * hash) + com.google.protobuf.Internal.hashLong(java.lang.Double.doubleToLongBits(getTimestamp()));
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -2371,16 +2490,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Timestamp.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 timestamp_ = 0D;
                 return this;
             }
@@ -2407,18 +2532,39 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Timestamp buildPartial() {
                 context.ContextOuterClass.Timestamp result = new context.ContextOuterClass.Timestamp(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.timestamp_ = timestamp_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Timestamp result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.timestamp_ = timestamp_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -2437,7 +2583,7 @@ public final class ContextOuterClass {
                 if (other.getTimestamp() != 0D) {
                     setTimestamp(other.getTimestamp());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -2449,47 +2595,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Timestamp parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 9:
-                                {
-                                    timestamp_ = input.readDouble();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 9
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Timestamp) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private double timestamp_;
 
             /**
@@ -2508,7 +2627,6 @@ public final class ContextOuterClass {
              */
             public Builder setTimestamp(double value) {
                 timestamp_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -2518,7 +2636,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 timestamp_ = 0D;
                 onChanged();
                 return this;
@@ -2551,17 +2668,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Timestamp parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Timestamp(input, extensionRegistry);
             }
         };
 
@@ -2636,6 +2743,63 @@ public final class ContextOuterClass {
             return new Event();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Event(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (timestamp_ != null) {
+                                    subBuilder = timestamp_.toBuilder();
+                                }
+                                timestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(timestamp_);
+                                    timestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 16:
+                            {
+                                int rawValue = input.readEnum();
+                                eventType_ = rawValue;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Event_descriptor;
         }
@@ -2672,12 +2836,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-            return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+            return getTimestamp();
         }
 
         public static final int EVENT_TYPE_FIELD_NUMBER = 2;
 
-        private int eventType_ = 0;
+        private int eventType_;
 
         /**
          * .context.EventTypeEnum event_type = 2;
@@ -2694,7 +2858,8 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EventTypeEnum getEventType() {
-            context.ContextOuterClass.EventTypeEnum result = context.ContextOuterClass.EventTypeEnum.forNumber(eventType_);
+            @SuppressWarnings("deprecation")
+            context.ContextOuterClass.EventTypeEnum result = context.ContextOuterClass.EventTypeEnum.valueOf(eventType_);
             return result == null ? context.ContextOuterClass.EventTypeEnum.UNRECOGNIZED : result;
         }
 
@@ -2719,7 +2884,7 @@ public final class ContextOuterClass {
             if (eventType_ != context.ContextOuterClass.EventTypeEnum.EVENTTYPE_UNDEFINED.getNumber()) {
                 output.writeEnum(2, eventType_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -2734,7 +2899,7 @@ public final class ContextOuterClass {
             if (eventType_ != context.ContextOuterClass.EventTypeEnum.EVENTTYPE_UNDEFINED.getNumber()) {
                 size += com.google.protobuf.CodedOutputStream.computeEnumSize(2, eventType_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -2756,7 +2921,7 @@ public final class ContextOuterClass {
             }
             if (eventType_ != other.eventType_)
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -2774,7 +2939,7 @@ public final class ContextOuterClass {
             }
             hash = (37 * hash) + EVENT_TYPE_FIELD_NUMBER;
             hash = (53 * hash) + eventType_;
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -2868,19 +3033,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Event.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
                 eventType_ = 0;
@@ -2909,21 +3081,44 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Event buildPartial() {
                 context.ContextOuterClass.Event result = new context.ContextOuterClass.Event(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (timestampBuilder_ == null) {
+                    result.timestamp_ = timestamp_;
+                } else {
+                    result.timestamp_ = timestampBuilder_.build();
                 }
+                result.eventType_ = eventType_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Event result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.timestamp_ = timestampBuilder_ == null ? timestamp_ : timestampBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.eventType_ = eventType_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -2945,7 +3140,7 @@ public final class ContextOuterClass {
                 if (other.eventType_ != 0) {
                     setEventTypeValue(other.getEventTypeValue());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -2957,54 +3152,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Event parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 16:
-                                {
-                                    eventType_ = input.readEnum();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Event) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Timestamp timestamp_;
 
             private com.google.protobuf.SingleFieldBuilderV3 timestampBuilder_;
@@ -3014,7 +3175,7 @@ public final class ContextOuterClass {
              * @return Whether the timestamp field is set.
              */
             public boolean hasTimestamp() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return timestampBuilder_ != null || timestamp_ != null;
             }
 
             /**
@@ -3038,11 +3199,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     timestamp_ = value;
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -3052,11 +3212,10 @@ public final class ContextOuterClass {
             public Builder setTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (timestampBuilder_ == null) {
                     timestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -3065,16 +3224,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (timestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && timestamp_ != null && timestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getTimestampBuilder().mergeFrom(value);
+                    if (timestamp_ != null) {
+                        timestamp_ = context.ContextOuterClass.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial();
                     } else {
                         timestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     timestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -3082,13 +3240,13 @@ public final class ContextOuterClass {
              * .context.Timestamp timestamp = 1;
              */
             public Builder clearTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                    onChanged();
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -3096,7 +3254,6 @@ public final class ContextOuterClass {
              * .context.Timestamp timestamp = 1;
              */
             public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getTimestampFieldBuilder().getBuilder();
             }
@@ -3141,7 +3298,6 @@ public final class ContextOuterClass {
              */
             public Builder setEventTypeValue(int value) {
                 eventType_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -3152,7 +3308,8 @@ public final class ContextOuterClass {
              */
             @java.lang.Override
             public context.ContextOuterClass.EventTypeEnum getEventType() {
-                context.ContextOuterClass.EventTypeEnum result = context.ContextOuterClass.EventTypeEnum.forNumber(eventType_);
+                @SuppressWarnings("deprecation")
+                context.ContextOuterClass.EventTypeEnum result = context.ContextOuterClass.EventTypeEnum.valueOf(eventType_);
                 return result == null ? context.ContextOuterClass.EventTypeEnum.UNRECOGNIZED : result;
             }
 
@@ -3165,7 +3322,6 @@ public final class ContextOuterClass {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000002;
                 eventType_ = value.getNumber();
                 onChanged();
                 return this;
@@ -3176,7 +3332,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearEventType() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 eventType_ = 0;
                 onChanged();
                 return this;
@@ -3209,17 +3364,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Event parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Event(input, extensionRegistry);
             }
         };
 
@@ -3285,6 +3430,57 @@ public final class ContextOuterClass {
             return new ContextId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ContextId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (contextUuid_ != null) {
+                                    subBuilder = contextUuid_.toBuilder();
+                                }
+                                contextUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(contextUuid_);
+                                    contextUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ContextId_descriptor;
         }
@@ -3321,7 +3517,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getContextUuidOrBuilder() {
-            return contextUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : contextUuid_;
+            return getContextUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -3342,7 +3538,7 @@ public final class ContextOuterClass {
             if (contextUuid_ != null) {
                 output.writeMessage(1, getContextUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -3354,7 +3550,7 @@ public final class ContextOuterClass {
             if (contextUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getContextUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -3374,7 +3570,7 @@ public final class ContextOuterClass {
                 if (!getContextUuid().equals(other.getContextUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -3390,7 +3586,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONTEXT_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getContextUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -3488,19 +3684,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ContextId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                contextUuid_ = null;
-                if (contextUuidBuilder_ != null) {
-                    contextUuidBuilder_.dispose();
+                if (contextUuidBuilder_ == null) {
+                    contextUuid_ = null;
+                } else {
+                    contextUuid_ = null;
                     contextUuidBuilder_ = null;
                 }
                 return this;
@@ -3528,18 +3731,43 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ContextId buildPartial() {
                 context.ContextOuterClass.ContextId result = new context.ContextOuterClass.ContextId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (contextUuidBuilder_ == null) {
+                    result.contextUuid_ = contextUuid_;
+                } else {
+                    result.contextUuid_ = contextUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ContextId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.contextUuid_ = contextUuidBuilder_ == null ? contextUuid_ : contextUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -3558,7 +3786,7 @@ public final class ContextOuterClass {
                 if (other.hasContextUuid()) {
                     mergeContextUuid(other.getContextUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -3570,47 +3798,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ContextId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getContextUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ContextId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid contextUuid_;
 
             private com.google.protobuf.SingleFieldBuilderV3 contextUuidBuilder_;
@@ -3620,7 +3821,7 @@ public final class ContextOuterClass {
              * @return Whether the contextUuid field is set.
              */
             public boolean hasContextUuid() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return contextUuidBuilder_ != null || contextUuid_ != null;
             }
 
             /**
@@ -3644,11 +3845,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     contextUuid_ = value;
+                    onChanged();
                 } else {
                     contextUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -3658,11 +3858,10 @@ public final class ContextOuterClass {
             public Builder setContextUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (contextUuidBuilder_ == null) {
                     contextUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     contextUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -3671,16 +3870,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeContextUuid(context.ContextOuterClass.Uuid value) {
                 if (contextUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && contextUuid_ != null && contextUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getContextUuidBuilder().mergeFrom(value);
+                    if (contextUuid_ != null) {
+                        contextUuid_ = context.ContextOuterClass.Uuid.newBuilder(contextUuid_).mergeFrom(value).buildPartial();
                     } else {
                         contextUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     contextUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -3688,13 +3886,13 @@ public final class ContextOuterClass {
              * .context.Uuid context_uuid = 1;
              */
             public Builder clearContextUuid() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                contextUuid_ = null;
-                if (contextUuidBuilder_ != null) {
-                    contextUuidBuilder_.dispose();
+                if (contextUuidBuilder_ == null) {
+                    contextUuid_ = null;
+                    onChanged();
+                } else {
+                    contextUuid_ = null;
                     contextUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -3702,7 +3900,6 @@ public final class ContextOuterClass {
              * .context.Uuid context_uuid = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getContextUuidBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getContextUuidFieldBuilder().getBuilder();
             }
@@ -3756,17 +3953,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ContextId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ContextId(input, extensionRegistry);
             }
         };
 
@@ -3936,6 +4123,113 @@ public final class ContextOuterClass {
             return new Context();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Context(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ContextId.Builder subBuilder = null;
+                                if (contextId_ != null) {
+                                    subBuilder = contextId_.toBuilder();
+                                }
+                                contextId_ = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(contextId_);
+                                    contextId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    topologyIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                topologyIds_.add(input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 34:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                                    serviceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                serviceIds_.add(input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 42:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000004) != 0)) {
+                                    sliceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000004;
+                                }
+                                sliceIds_.add(input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 50:
+                            {
+                                context.ContextOuterClass.TeraFlowController.Builder subBuilder = null;
+                                if (controller_ != null) {
+                                    subBuilder = controller_.toBuilder();
+                                }
+                                controller_ = input.readMessage(context.ContextOuterClass.TeraFlowController.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(controller_);
+                                    controller_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    topologyIds_ = java.util.Collections.unmodifiableList(topologyIds_);
+                }
+                if (((mutable_bitField0_ & 0x00000002) != 0)) {
+                    serviceIds_ = java.util.Collections.unmodifiableList(serviceIds_);
+                }
+                if (((mutable_bitField0_ & 0x00000004) != 0)) {
+                    sliceIds_ = java.util.Collections.unmodifiableList(sliceIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Context_descriptor;
         }
@@ -3972,13 +4266,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() {
-            return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
+            return getContextId();
         }
 
         public static final int NAME_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 2;
@@ -4015,7 +4308,6 @@ public final class ContextOuterClass {
 
         public static final int TOPOLOGY_IDS_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
         private java.util.List topologyIds_;
 
         /**
@@ -4060,7 +4352,6 @@ public final class ContextOuterClass {
 
         public static final int SERVICE_IDS_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
         private java.util.List serviceIds_;
 
         /**
@@ -4105,7 +4396,6 @@ public final class ContextOuterClass {
 
         public static final int SLICE_IDS_FIELD_NUMBER = 5;
 
-        @SuppressWarnings("serial")
         private java.util.List sliceIds_;
 
         /**
@@ -4175,7 +4465,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.TeraFlowControllerOrBuilder getControllerOrBuilder() {
-            return controller_ == null ? context.ContextOuterClass.TeraFlowController.getDefaultInstance() : controller_;
+            return getController();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -4196,7 +4486,7 @@ public final class ContextOuterClass {
             if (contextId_ != null) {
                 output.writeMessage(1, getContextId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
             }
             for (int i = 0; i < topologyIds_.size(); i++) {
@@ -4211,7 +4501,7 @@ public final class ContextOuterClass {
             if (controller_ != null) {
                 output.writeMessage(6, getController());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -4223,7 +4513,7 @@ public final class ContextOuterClass {
             if (contextId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getContextId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
             }
             for (int i = 0; i < topologyIds_.size(); i++) {
@@ -4238,7 +4528,7 @@ public final class ContextOuterClass {
             if (controller_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(6, getController());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -4272,7 +4562,7 @@ public final class ContextOuterClass {
                 if (!getController().equals(other.getController()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -4306,7 +4596,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONTROLLER_FIELD_NUMBER;
                 hash = (53 * hash) + getController().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -4400,46 +4690,54 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Context.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getTopologyIdsFieldBuilder();
+                    getServiceIdsFieldBuilder();
+                    getSliceIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
                 name_ = "";
                 if (topologyIdsBuilder_ == null) {
                     topologyIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    topologyIds_ = null;
                     topologyIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000004);
                 if (serviceIdsBuilder_ == null) {
                     serviceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
                 } else {
-                    serviceIds_ = null;
                     serviceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000008);
                 if (sliceIdsBuilder_ == null) {
                     sliceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000004);
                 } else {
-                    sliceIds_ = null;
                     sliceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000010);
-                controller_ = null;
-                if (controllerBuilder_ != null) {
-                    controllerBuilder_.dispose();
+                if (controllerBuilder_ == null) {
+                    controller_ = null;
+                } else {
+                    controller_ = null;
                     controllerBuilder_ = null;
                 }
                 return this;
@@ -4467,55 +4765,77 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Context buildPartial() {
                 context.ContextOuterClass.Context result = new context.ContextOuterClass.Context(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (contextIdBuilder_ == null) {
+                    result.contextId_ = contextId_;
+                } else {
+                    result.contextId_ = contextIdBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Context result) {
+                result.name_ = name_;
                 if (topologyIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         topologyIds_ = java.util.Collections.unmodifiableList(topologyIds_);
-                        bitField0_ = (bitField0_ & ~0x00000004);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.topologyIds_ = topologyIds_;
                 } else {
                     result.topologyIds_ = topologyIdsBuilder_.build();
                 }
                 if (serviceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0)) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
                         serviceIds_ = java.util.Collections.unmodifiableList(serviceIds_);
-                        bitField0_ = (bitField0_ & ~0x00000008);
+                        bitField0_ = (bitField0_ & ~0x00000002);
                     }
                     result.serviceIds_ = serviceIds_;
                 } else {
                     result.serviceIds_ = serviceIdsBuilder_.build();
                 }
                 if (sliceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000010) != 0)) {
+                    if (((bitField0_ & 0x00000004) != 0)) {
                         sliceIds_ = java.util.Collections.unmodifiableList(sliceIds_);
-                        bitField0_ = (bitField0_ & ~0x00000010);
+                        bitField0_ = (bitField0_ & ~0x00000004);
                     }
                     result.sliceIds_ = sliceIds_;
                 } else {
                     result.sliceIds_ = sliceIdsBuilder_.build();
                 }
+                if (controllerBuilder_ == null) {
+                    result.controller_ = controller_;
+                } else {
+                    result.controller_ = controllerBuilder_.build();
+                }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Context result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.contextId_ = contextIdBuilder_ == null ? contextId_ : contextIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000020) != 0)) {
-                    result.controller_ = controllerBuilder_ == null ? controller_ : controllerBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -4536,14 +4856,13 @@ public final class ContextOuterClass {
                 }
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (topologyIdsBuilder_ == null) {
                     if (!other.topologyIds_.isEmpty()) {
                         if (topologyIds_.isEmpty()) {
                             topologyIds_ = other.topologyIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureTopologyIdsIsMutable();
                             topologyIds_.addAll(other.topologyIds_);
@@ -4556,7 +4875,7 @@ public final class ContextOuterClass {
                             topologyIdsBuilder_.dispose();
                             topologyIdsBuilder_ = null;
                             topologyIds_ = other.topologyIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             topologyIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getTopologyIdsFieldBuilder() : null;
                         } else {
                             topologyIdsBuilder_.addAllMessages(other.topologyIds_);
@@ -4567,7 +4886,7 @@ public final class ContextOuterClass {
                     if (!other.serviceIds_.isEmpty()) {
                         if (serviceIds_.isEmpty()) {
                             serviceIds_ = other.serviceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                         } else {
                             ensureServiceIdsIsMutable();
                             serviceIds_.addAll(other.serviceIds_);
@@ -4580,7 +4899,7 @@ public final class ContextOuterClass {
                             serviceIdsBuilder_.dispose();
                             serviceIdsBuilder_ = null;
                             serviceIds_ = other.serviceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                             serviceIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getServiceIdsFieldBuilder() : null;
                         } else {
                             serviceIdsBuilder_.addAllMessages(other.serviceIds_);
@@ -4591,7 +4910,7 @@ public final class ContextOuterClass {
                     if (!other.sliceIds_.isEmpty()) {
                         if (sliceIds_.isEmpty()) {
                             sliceIds_ = other.sliceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000010);
+                            bitField0_ = (bitField0_ & ~0x00000004);
                         } else {
                             ensureSliceIdsIsMutable();
                             sliceIds_.addAll(other.sliceIds_);
@@ -4604,7 +4923,7 @@ public final class ContextOuterClass {
                             sliceIdsBuilder_.dispose();
                             sliceIdsBuilder_ = null;
                             sliceIds_ = other.sliceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000010);
+                            bitField0_ = (bitField0_ & ~0x00000004);
                             sliceIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getSliceIdsFieldBuilder() : null;
                         } else {
                             sliceIdsBuilder_.addAllMessages(other.sliceIds_);
@@ -4614,7 +4933,7 @@ public final class ContextOuterClass {
                 if (other.hasController()) {
                     mergeController(other.getController());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -4626,92 +4945,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Context parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getContextIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    context.ContextOuterClass.TopologyId m = input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry);
-                                    if (topologyIdsBuilder_ == null) {
-                                        ensureTopologyIdsIsMutable();
-                                        topologyIds_.add(m);
-                                    } else {
-                                        topologyIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    context.ContextOuterClass.ServiceId m = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
-                                    if (serviceIdsBuilder_ == null) {
-                                        ensureServiceIdsIsMutable();
-                                        serviceIds_.add(m);
-                                    } else {
-                                        serviceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    context.ContextOuterClass.SliceId m = input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry);
-                                    if (sliceIdsBuilder_ == null) {
-                                        ensureSliceIdsIsMutable();
-                                        sliceIds_.add(m);
-                                    } else {
-                                        sliceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 42
-                            case 50:
-                                {
-                                    input.readMessage(getControllerFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000020;
-                                    break;
-                                }
-                            // case 50
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Context) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -4726,7 +4970,7 @@ public final class ContextOuterClass {
              * @return Whether the contextId field is set.
              */
             public boolean hasContextId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return contextIdBuilder_ != null || contextId_ != null;
             }
 
             /**
@@ -4750,11 +4994,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     contextId_ = value;
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -4764,11 +5007,10 @@ public final class ContextOuterClass {
             public Builder setContextId(context.ContextOuterClass.ContextId.Builder builderForValue) {
                 if (contextIdBuilder_ == null) {
                     contextId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -4777,16 +5019,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeContextId(context.ContextOuterClass.ContextId value) {
                 if (contextIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && contextId_ != null && contextId_ != context.ContextOuterClass.ContextId.getDefaultInstance()) {
-                        getContextIdBuilder().mergeFrom(value);
+                    if (contextId_ != null) {
+                        contextId_ = context.ContextOuterClass.ContextId.newBuilder(contextId_).mergeFrom(value).buildPartial();
                     } else {
                         contextId_ = value;
                     }
+                    onChanged();
                 } else {
                     contextIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -4794,13 +5035,13 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public Builder clearContextId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                    onChanged();
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -4808,7 +5049,6 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public context.ContextOuterClass.ContextId.Builder getContextIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getContextIdFieldBuilder().getBuilder();
             }
@@ -4878,7 +5118,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -4889,7 +5128,6 @@ public final class ContextOuterClass {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -4905,7 +5143,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -4913,9 +5150,9 @@ public final class ContextOuterClass {
             private java.util.List topologyIds_ = java.util.Collections.emptyList();
 
             private void ensureTopologyIdsIsMutable() {
-                if (!((bitField0_ & 0x00000004) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     topologyIds_ = new java.util.ArrayList(topologyIds_);
-                    bitField0_ |= 0x00000004;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -5067,7 +5304,7 @@ public final class ContextOuterClass {
             public Builder clearTopologyIds() {
                 if (topologyIdsBuilder_ == null) {
                     topologyIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000004);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     topologyIdsBuilder_.clear();
@@ -5141,7 +5378,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getTopologyIdsFieldBuilder() {
                 if (topologyIdsBuilder_ == null) {
-                    topologyIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(topologyIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
+                    topologyIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(topologyIds_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     topologyIds_ = null;
                 }
                 return topologyIdsBuilder_;
@@ -5150,9 +5387,9 @@ public final class ContextOuterClass {
             private java.util.List serviceIds_ = java.util.Collections.emptyList();
 
             private void ensureServiceIdsIsMutable() {
-                if (!((bitField0_ & 0x00000008) != 0)) {
+                if (!((bitField0_ & 0x00000002) != 0)) {
                     serviceIds_ = new java.util.ArrayList(serviceIds_);
-                    bitField0_ |= 0x00000008;
+                    bitField0_ |= 0x00000002;
                 }
             }
 
@@ -5304,7 +5541,7 @@ public final class ContextOuterClass {
             public Builder clearServiceIds() {
                 if (serviceIdsBuilder_ == null) {
                     serviceIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000008);
+                    bitField0_ = (bitField0_ & ~0x00000002);
                     onChanged();
                 } else {
                     serviceIdsBuilder_.clear();
@@ -5378,7 +5615,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getServiceIdsFieldBuilder() {
                 if (serviceIdsBuilder_ == null) {
-                    serviceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(serviceIds_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean());
+                    serviceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(serviceIds_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
                     serviceIds_ = null;
                 }
                 return serviceIdsBuilder_;
@@ -5387,9 +5624,9 @@ public final class ContextOuterClass {
             private java.util.List sliceIds_ = java.util.Collections.emptyList();
 
             private void ensureSliceIdsIsMutable() {
-                if (!((bitField0_ & 0x00000010) != 0)) {
+                if (!((bitField0_ & 0x00000004) != 0)) {
                     sliceIds_ = new java.util.ArrayList(sliceIds_);
-                    bitField0_ |= 0x00000010;
+                    bitField0_ |= 0x00000004;
                 }
             }
 
@@ -5541,7 +5778,7 @@ public final class ContextOuterClass {
             public Builder clearSliceIds() {
                 if (sliceIdsBuilder_ == null) {
                     sliceIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000010);
+                    bitField0_ = (bitField0_ & ~0x00000004);
                     onChanged();
                 } else {
                     sliceIdsBuilder_.clear();
@@ -5615,7 +5852,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getSliceIdsFieldBuilder() {
                 if (sliceIdsBuilder_ == null) {
-                    sliceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceIds_, ((bitField0_ & 0x00000010) != 0), getParentForChildren(), isClean());
+                    sliceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
                     sliceIds_ = null;
                 }
                 return sliceIdsBuilder_;
@@ -5630,7 +5867,7 @@ public final class ContextOuterClass {
              * @return Whether the controller field is set.
              */
             public boolean hasController() {
-                return ((bitField0_ & 0x00000020) != 0);
+                return controllerBuilder_ != null || controller_ != null;
             }
 
             /**
@@ -5654,11 +5891,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     controller_ = value;
+                    onChanged();
                 } else {
                     controllerBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -5668,11 +5904,10 @@ public final class ContextOuterClass {
             public Builder setController(context.ContextOuterClass.TeraFlowController.Builder builderForValue) {
                 if (controllerBuilder_ == null) {
                     controller_ = builderForValue.build();
+                    onChanged();
                 } else {
                     controllerBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -5681,16 +5916,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeController(context.ContextOuterClass.TeraFlowController value) {
                 if (controllerBuilder_ == null) {
-                    if (((bitField0_ & 0x00000020) != 0) && controller_ != null && controller_ != context.ContextOuterClass.TeraFlowController.getDefaultInstance()) {
-                        getControllerBuilder().mergeFrom(value);
+                    if (controller_ != null) {
+                        controller_ = context.ContextOuterClass.TeraFlowController.newBuilder(controller_).mergeFrom(value).buildPartial();
                     } else {
                         controller_ = value;
                     }
+                    onChanged();
                 } else {
                     controllerBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -5698,13 +5932,13 @@ public final class ContextOuterClass {
              * .context.TeraFlowController controller = 6;
              */
             public Builder clearController() {
-                bitField0_ = (bitField0_ & ~0x00000020);
-                controller_ = null;
-                if (controllerBuilder_ != null) {
-                    controllerBuilder_.dispose();
+                if (controllerBuilder_ == null) {
+                    controller_ = null;
+                    onChanged();
+                } else {
+                    controller_ = null;
                     controllerBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -5712,7 +5946,6 @@ public final class ContextOuterClass {
              * .context.TeraFlowController controller = 6;
              */
             public context.ContextOuterClass.TeraFlowController.Builder getControllerBuilder() {
-                bitField0_ |= 0x00000020;
                 onChanged();
                 return getControllerFieldBuilder().getBuilder();
             }
@@ -5766,17 +5999,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Context parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Context(input, extensionRegistry);
             }
         };
 
@@ -5847,6 +6070,57 @@ public final class ContextOuterClass {
             return new ContextIdList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ContextIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    contextIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                contextIds_.add(input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    contextIds_ = java.util.Collections.unmodifiableList(contextIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ContextIdList_descriptor;
         }
@@ -5858,7 +6132,6 @@ public final class ContextOuterClass {
 
         public static final int CONTEXT_IDS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List contextIds_;
 
         /**
@@ -5919,7 +6192,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < contextIds_.size(); i++) {
                 output.writeMessage(1, contextIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -5931,7 +6204,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < contextIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, contextIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -5947,7 +6220,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.ContextIdList other = (context.ContextOuterClass.ContextIdList) obj;
             if (!getContextIdsList().equals(other.getContextIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -5963,7 +6236,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONTEXT_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getContextIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -6057,23 +6330,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ContextIdList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getContextIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (contextIdsBuilder_ == null) {
                     contextIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    contextIds_ = null;
                     contextIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -6099,15 +6378,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ContextIdList buildPartial() {
                 context.ContextOuterClass.ContextIdList result = new context.ContextOuterClass.ContextIdList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.ContextIdList result) {
+                int from_bitField0_ = bitField0_;
                 if (contextIdsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         contextIds_ = java.util.Collections.unmodifiableList(contextIds_);
@@ -6117,10 +6388,38 @@ public final class ContextOuterClass {
                 } else {
                     result.contextIds_ = contextIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ContextIdList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -6160,7 +6459,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -6172,47 +6471,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ContextIdList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.ContextId m = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry);
-                                    if (contextIdsBuilder_ == null) {
-                                        ensureContextIdsIsMutable();
-                                        contextIds_.add(m);
-                                    } else {
-                                        contextIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ContextIdList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -6482,17 +6751,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ContextIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ContextIdList(input, extensionRegistry);
             }
         };
 
@@ -6563,6 +6822,57 @@ public final class ContextOuterClass {
             return new ContextList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ContextList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    contexts_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                contexts_.add(input.readMessage(context.ContextOuterClass.Context.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    contexts_ = java.util.Collections.unmodifiableList(contexts_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ContextList_descriptor;
         }
@@ -6574,7 +6884,6 @@ public final class ContextOuterClass {
 
         public static final int CONTEXTS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List contexts_;
 
         /**
@@ -6635,7 +6944,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < contexts_.size(); i++) {
                 output.writeMessage(1, contexts_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -6647,7 +6956,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < contexts_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, contexts_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -6663,7 +6972,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.ContextList other = (context.ContextOuterClass.ContextList) obj;
             if (!getContextsList().equals(other.getContextsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -6679,7 +6988,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONTEXTS_FIELD_NUMBER;
                 hash = (53 * hash) + getContextsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -6773,23 +7082,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ContextList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getContextsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (contextsBuilder_ == null) {
                     contexts_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    contexts_ = null;
                     contextsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -6815,15 +7130,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ContextList buildPartial() {
                 context.ContextOuterClass.ContextList result = new context.ContextOuterClass.ContextList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.ContextList result) {
+                int from_bitField0_ = bitField0_;
                 if (contextsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         contexts_ = java.util.Collections.unmodifiableList(contexts_);
@@ -6833,10 +7140,38 @@ public final class ContextOuterClass {
                 } else {
                     result.contexts_ = contextsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ContextList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -6876,7 +7211,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -6888,47 +7223,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ContextList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.Context m = input.readMessage(context.ContextOuterClass.Context.parser(), extensionRegistry);
-                                    if (contextsBuilder_ == null) {
-                                        ensureContextsIsMutable();
-                                        contexts_.add(m);
-                                    } else {
-                                        contextsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ContextList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -7198,17 +7503,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ContextList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ContextList(input, extensionRegistry);
             }
         };
 
@@ -7287,6 +7582,70 @@ public final class ContextOuterClass {
             return new ContextEvent();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ContextEvent(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Event.Builder subBuilder = null;
+                                if (event_ != null) {
+                                    subBuilder = event_.toBuilder();
+                                }
+                                event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(event_);
+                                    event_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.ContextId.Builder subBuilder = null;
+                                if (contextId_ != null) {
+                                    subBuilder = contextId_.toBuilder();
+                                }
+                                contextId_ = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(contextId_);
+                                    contextId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ContextEvent_descriptor;
         }
@@ -7323,7 +7682,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-            return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+            return getEvent();
         }
 
         public static final int CONTEXT_ID_FIELD_NUMBER = 2;
@@ -7353,7 +7712,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() {
-            return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
+            return getContextId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -7377,7 +7736,7 @@ public final class ContextOuterClass {
             if (contextId_ != null) {
                 output.writeMessage(2, getContextId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -7392,7 +7751,7 @@ public final class ContextOuterClass {
             if (contextId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getContextId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -7418,7 +7777,7 @@ public final class ContextOuterClass {
                 if (!getContextId().equals(other.getContextId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -7438,7 +7797,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONTEXT_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getContextId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -7532,24 +7891,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ContextEvent.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
                 return this;
@@ -7577,21 +7944,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ContextEvent buildPartial() {
                 context.ContextOuterClass.ContextEvent result = new context.ContextOuterClass.ContextEvent(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (eventBuilder_ == null) {
+                    result.event_ = event_;
+                } else {
+                    result.event_ = eventBuilder_.build();
+                }
+                if (contextIdBuilder_ == null) {
+                    result.contextId_ = contextId_;
+                } else {
+                    result.contextId_ = contextIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ContextEvent result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.event_ = eventBuilder_ == null ? event_ : eventBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.contextId_ = contextIdBuilder_ == null ? contextId_ : contextIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -7613,7 +8007,7 @@ public final class ContextOuterClass {
                 if (other.hasContextId()) {
                     mergeContextId(other.getContextId());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -7625,54 +8019,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ContextEvent parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEventFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getContextIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ContextEvent) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Event event_;
 
             private com.google.protobuf.SingleFieldBuilderV3 eventBuilder_;
@@ -7682,7 +8042,7 @@ public final class ContextOuterClass {
              * @return Whether the event field is set.
              */
             public boolean hasEvent() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return eventBuilder_ != null || event_ != null;
             }
 
             /**
@@ -7706,11 +8066,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     event_ = value;
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -7720,11 +8079,10 @@ public final class ContextOuterClass {
             public Builder setEvent(context.ContextOuterClass.Event.Builder builderForValue) {
                 if (eventBuilder_ == null) {
                     event_ = builderForValue.build();
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -7733,16 +8091,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEvent(context.ContextOuterClass.Event value) {
                 if (eventBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && event_ != null && event_ != context.ContextOuterClass.Event.getDefaultInstance()) {
-                        getEventBuilder().mergeFrom(value);
+                    if (event_ != null) {
+                        event_ = context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
                     } else {
                         event_ = value;
                     }
+                    onChanged();
                 } else {
                     eventBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -7750,13 +8107,13 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public Builder clearEvent() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                    onChanged();
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -7764,7 +8121,6 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public context.ContextOuterClass.Event.Builder getEventBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEventFieldBuilder().getBuilder();
             }
@@ -7800,7 +8156,7 @@ public final class ContextOuterClass {
              * @return Whether the contextId field is set.
              */
             public boolean hasContextId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return contextIdBuilder_ != null || contextId_ != null;
             }
 
             /**
@@ -7824,11 +8180,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     contextId_ = value;
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -7838,11 +8193,10 @@ public final class ContextOuterClass {
             public Builder setContextId(context.ContextOuterClass.ContextId.Builder builderForValue) {
                 if (contextIdBuilder_ == null) {
                     contextId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -7851,16 +8205,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeContextId(context.ContextOuterClass.ContextId value) {
                 if (contextIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && contextId_ != null && contextId_ != context.ContextOuterClass.ContextId.getDefaultInstance()) {
-                        getContextIdBuilder().mergeFrom(value);
+                    if (contextId_ != null) {
+                        contextId_ = context.ContextOuterClass.ContextId.newBuilder(contextId_).mergeFrom(value).buildPartial();
                     } else {
                         contextId_ = value;
                     }
+                    onChanged();
                 } else {
                     contextIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -7868,13 +8221,13 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 2;
              */
             public Builder clearContextId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                    onChanged();
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -7882,7 +8235,6 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 2;
              */
             public context.ContextOuterClass.ContextId.Builder getContextIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getContextIdFieldBuilder().getBuilder();
             }
@@ -7936,17 +8288,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ContextEvent parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ContextEvent(input, extensionRegistry);
             }
         };
 
@@ -8029,6 +8371,70 @@ public final class ContextOuterClass {
             return new TopologyId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private TopologyId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ContextId.Builder subBuilder = null;
+                                if (contextId_ != null) {
+                                    subBuilder = contextId_.toBuilder();
+                                }
+                                contextId_ = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(contextId_);
+                                    contextId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (topologyUuid_ != null) {
+                                    subBuilder = topologyUuid_.toBuilder();
+                                }
+                                topologyUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(topologyUuid_);
+                                    topologyUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_TopologyId_descriptor;
         }
@@ -8065,7 +8471,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() {
-            return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
+            return getContextId();
         }
 
         public static final int TOPOLOGY_UUID_FIELD_NUMBER = 2;
@@ -8095,7 +8501,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getTopologyUuidOrBuilder() {
-            return topologyUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : topologyUuid_;
+            return getTopologyUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -8119,7 +8525,7 @@ public final class ContextOuterClass {
             if (topologyUuid_ != null) {
                 output.writeMessage(2, getTopologyUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -8134,7 +8540,7 @@ public final class ContextOuterClass {
             if (topologyUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getTopologyUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -8160,7 +8566,7 @@ public final class ContextOuterClass {
                 if (!getTopologyUuid().equals(other.getTopologyUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -8180,7 +8586,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + TOPOLOGY_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getTopologyUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -8278,24 +8684,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.TopologyId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
-                topologyUuid_ = null;
-                if (topologyUuidBuilder_ != null) {
-                    topologyUuidBuilder_.dispose();
+                if (topologyUuidBuilder_ == null) {
+                    topologyUuid_ = null;
+                } else {
+                    topologyUuid_ = null;
                     topologyUuidBuilder_ = null;
                 }
                 return this;
@@ -8323,21 +8737,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.TopologyId buildPartial() {
                 context.ContextOuterClass.TopologyId result = new context.ContextOuterClass.TopologyId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (contextIdBuilder_ == null) {
+                    result.contextId_ = contextId_;
+                } else {
+                    result.contextId_ = contextIdBuilder_.build();
+                }
+                if (topologyUuidBuilder_ == null) {
+                    result.topologyUuid_ = topologyUuid_;
+                } else {
+                    result.topologyUuid_ = topologyUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.TopologyId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.contextId_ = contextIdBuilder_ == null ? contextId_ : contextIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.topologyUuid_ = topologyUuidBuilder_ == null ? topologyUuid_ : topologyUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -8359,7 +8800,7 @@ public final class ContextOuterClass {
                 if (other.hasTopologyUuid()) {
                     mergeTopologyUuid(other.getTopologyUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -8371,54 +8812,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.TopologyId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getContextIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getTopologyUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.TopologyId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.ContextId contextId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 contextIdBuilder_;
@@ -8428,7 +8835,7 @@ public final class ContextOuterClass {
              * @return Whether the contextId field is set.
              */
             public boolean hasContextId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return contextIdBuilder_ != null || contextId_ != null;
             }
 
             /**
@@ -8452,11 +8859,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     contextId_ = value;
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -8466,11 +8872,10 @@ public final class ContextOuterClass {
             public Builder setContextId(context.ContextOuterClass.ContextId.Builder builderForValue) {
                 if (contextIdBuilder_ == null) {
                     contextId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -8479,16 +8884,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeContextId(context.ContextOuterClass.ContextId value) {
                 if (contextIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && contextId_ != null && contextId_ != context.ContextOuterClass.ContextId.getDefaultInstance()) {
-                        getContextIdBuilder().mergeFrom(value);
+                    if (contextId_ != null) {
+                        contextId_ = context.ContextOuterClass.ContextId.newBuilder(contextId_).mergeFrom(value).buildPartial();
                     } else {
                         contextId_ = value;
                     }
+                    onChanged();
                 } else {
                     contextIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -8496,13 +8900,13 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public Builder clearContextId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                    onChanged();
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -8510,7 +8914,6 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public context.ContextOuterClass.ContextId.Builder getContextIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getContextIdFieldBuilder().getBuilder();
             }
@@ -8546,7 +8949,7 @@ public final class ContextOuterClass {
              * @return Whether the topologyUuid field is set.
              */
             public boolean hasTopologyUuid() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return topologyUuidBuilder_ != null || topologyUuid_ != null;
             }
 
             /**
@@ -8570,11 +8973,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     topologyUuid_ = value;
+                    onChanged();
                 } else {
                     topologyUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -8584,11 +8986,10 @@ public final class ContextOuterClass {
             public Builder setTopologyUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (topologyUuidBuilder_ == null) {
                     topologyUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     topologyUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -8597,16 +8998,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeTopologyUuid(context.ContextOuterClass.Uuid value) {
                 if (topologyUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && topologyUuid_ != null && topologyUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getTopologyUuidBuilder().mergeFrom(value);
+                    if (topologyUuid_ != null) {
+                        topologyUuid_ = context.ContextOuterClass.Uuid.newBuilder(topologyUuid_).mergeFrom(value).buildPartial();
                     } else {
                         topologyUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     topologyUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -8614,13 +9014,13 @@ public final class ContextOuterClass {
              * .context.Uuid topology_uuid = 2;
              */
             public Builder clearTopologyUuid() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                topologyUuid_ = null;
-                if (topologyUuidBuilder_ != null) {
-                    topologyUuidBuilder_.dispose();
+                if (topologyUuidBuilder_ == null) {
+                    topologyUuid_ = null;
+                    onChanged();
+                } else {
+                    topologyUuid_ = null;
                     topologyUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -8628,7 +9028,6 @@ public final class ContextOuterClass {
              * .context.Uuid topology_uuid = 2;
              */
             public context.ContextOuterClass.Uuid.Builder getTopologyUuidBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getTopologyUuidFieldBuilder().getBuilder();
             }
@@ -8682,17 +9081,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public TopologyId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new TopologyId(input, extensionRegistry);
             }
         };
 
@@ -8819,6 +9208,88 @@ public final class ContextOuterClass {
             return new Topology();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Topology(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.TopologyId.Builder subBuilder = null;
+                                if (topologyId_ != null) {
+                                    subBuilder = topologyId_.toBuilder();
+                                }
+                                topologyId_ = input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(topologyId_);
+                                    topologyId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    deviceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                deviceIds_.add(input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 34:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                                    linkIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                linkIds_.add(input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    deviceIds_ = java.util.Collections.unmodifiableList(deviceIds_);
+                }
+                if (((mutable_bitField0_ & 0x00000002) != 0)) {
+                    linkIds_ = java.util.Collections.unmodifiableList(linkIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Topology_descriptor;
         }
@@ -8855,13 +9326,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.TopologyIdOrBuilder getTopologyIdOrBuilder() {
-            return topologyId_ == null ? context.ContextOuterClass.TopologyId.getDefaultInstance() : topologyId_;
+            return getTopologyId();
         }
 
         public static final int NAME_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 2;
@@ -8898,7 +9368,6 @@ public final class ContextOuterClass {
 
         public static final int DEVICE_IDS_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
         private java.util.List deviceIds_;
 
         /**
@@ -8943,7 +9412,6 @@ public final class ContextOuterClass {
 
         public static final int LINK_IDS_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
         private java.util.List linkIds_;
 
         /**
@@ -9004,7 +9472,7 @@ public final class ContextOuterClass {
             if (topologyId_ != null) {
                 output.writeMessage(1, getTopologyId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
             }
             for (int i = 0; i < deviceIds_.size(); i++) {
@@ -9013,7 +9481,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < linkIds_.size(); i++) {
                 output.writeMessage(4, linkIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -9025,7 +9493,7 @@ public final class ContextOuterClass {
             if (topologyId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getTopologyId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
             }
             for (int i = 0; i < deviceIds_.size(); i++) {
@@ -9034,7 +9502,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < linkIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, linkIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -9060,7 +9528,7 @@ public final class ContextOuterClass {
                 return false;
             if (!getLinkIdsList().equals(other.getLinkIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -9086,7 +9554,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + LINK_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getLinkIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -9180,36 +9648,43 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Topology.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getDeviceIdsFieldBuilder();
+                    getLinkIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                topologyId_ = null;
-                if (topologyIdBuilder_ != null) {
-                    topologyIdBuilder_.dispose();
+                if (topologyIdBuilder_ == null) {
+                    topologyId_ = null;
+                } else {
+                    topologyId_ = null;
                     topologyIdBuilder_ = null;
                 }
                 name_ = "";
                 if (deviceIdsBuilder_ == null) {
                     deviceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    deviceIds_ = null;
                     deviceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000004);
                 if (linkIdsBuilder_ == null) {
                     linkIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
                 } else {
-                    linkIds_ = null;
                     linkIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000008);
                 return this;
             }
 
@@ -9235,43 +9710,63 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Topology buildPartial() {
                 context.ContextOuterClass.Topology result = new context.ContextOuterClass.Topology(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (topologyIdBuilder_ == null) {
+                    result.topologyId_ = topologyId_;
+                } else {
+                    result.topologyId_ = topologyIdBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Topology result) {
+                result.name_ = name_;
                 if (deviceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         deviceIds_ = java.util.Collections.unmodifiableList(deviceIds_);
-                        bitField0_ = (bitField0_ & ~0x00000004);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.deviceIds_ = deviceIds_;
                 } else {
                     result.deviceIds_ = deviceIdsBuilder_.build();
                 }
                 if (linkIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0)) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
                         linkIds_ = java.util.Collections.unmodifiableList(linkIds_);
-                        bitField0_ = (bitField0_ & ~0x00000008);
+                        bitField0_ = (bitField0_ & ~0x00000002);
                     }
                     result.linkIds_ = linkIds_;
                 } else {
                     result.linkIds_ = linkIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Topology result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.topologyId_ = topologyIdBuilder_ == null ? topologyId_ : topologyIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.name_ = name_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -9292,14 +9787,13 @@ public final class ContextOuterClass {
                 }
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (deviceIdsBuilder_ == null) {
                     if (!other.deviceIds_.isEmpty()) {
                         if (deviceIds_.isEmpty()) {
                             deviceIds_ = other.deviceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureDeviceIdsIsMutable();
                             deviceIds_.addAll(other.deviceIds_);
@@ -9312,7 +9806,7 @@ public final class ContextOuterClass {
                             deviceIdsBuilder_.dispose();
                             deviceIdsBuilder_ = null;
                             deviceIds_ = other.deviceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             deviceIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getDeviceIdsFieldBuilder() : null;
                         } else {
                             deviceIdsBuilder_.addAllMessages(other.deviceIds_);
@@ -9323,7 +9817,7 @@ public final class ContextOuterClass {
                     if (!other.linkIds_.isEmpty()) {
                         if (linkIds_.isEmpty()) {
                             linkIds_ = other.linkIds_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                         } else {
                             ensureLinkIdsIsMutable();
                             linkIds_.addAll(other.linkIds_);
@@ -9336,14 +9830,14 @@ public final class ContextOuterClass {
                             linkIdsBuilder_.dispose();
                             linkIdsBuilder_ = null;
                             linkIds_ = other.linkIds_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                             linkIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getLinkIdsFieldBuilder() : null;
                         } else {
                             linkIdsBuilder_.addAllMessages(other.linkIds_);
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -9355,73 +9849,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Topology parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getTopologyIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    context.ContextOuterClass.DeviceId m = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
-                                    if (deviceIdsBuilder_ == null) {
-                                        ensureDeviceIdsIsMutable();
-                                        deviceIds_.add(m);
-                                    } else {
-                                        deviceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    context.ContextOuterClass.LinkId m = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry);
-                                    if (linkIdsBuilder_ == null) {
-                                        ensureLinkIdsIsMutable();
-                                        linkIds_.add(m);
-                                    } else {
-                                        linkIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 34
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Topology) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -9436,7 +9874,7 @@ public final class ContextOuterClass {
              * @return Whether the topologyId field is set.
              */
             public boolean hasTopologyId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return topologyIdBuilder_ != null || topologyId_ != null;
             }
 
             /**
@@ -9460,11 +9898,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     topologyId_ = value;
+                    onChanged();
                 } else {
                     topologyIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -9474,11 +9911,10 @@ public final class ContextOuterClass {
             public Builder setTopologyId(context.ContextOuterClass.TopologyId.Builder builderForValue) {
                 if (topologyIdBuilder_ == null) {
                     topologyId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     topologyIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -9487,16 +9923,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeTopologyId(context.ContextOuterClass.TopologyId value) {
                 if (topologyIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && topologyId_ != null && topologyId_ != context.ContextOuterClass.TopologyId.getDefaultInstance()) {
-                        getTopologyIdBuilder().mergeFrom(value);
+                    if (topologyId_ != null) {
+                        topologyId_ = context.ContextOuterClass.TopologyId.newBuilder(topologyId_).mergeFrom(value).buildPartial();
                     } else {
                         topologyId_ = value;
                     }
+                    onChanged();
                 } else {
                     topologyIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -9504,13 +9939,13 @@ public final class ContextOuterClass {
              * .context.TopologyId topology_id = 1;
              */
             public Builder clearTopologyId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                topologyId_ = null;
-                if (topologyIdBuilder_ != null) {
-                    topologyIdBuilder_.dispose();
+                if (topologyIdBuilder_ == null) {
+                    topologyId_ = null;
+                    onChanged();
+                } else {
+                    topologyId_ = null;
                     topologyIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -9518,7 +9953,6 @@ public final class ContextOuterClass {
              * .context.TopologyId topology_id = 1;
              */
             public context.ContextOuterClass.TopologyId.Builder getTopologyIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getTopologyIdFieldBuilder().getBuilder();
             }
@@ -9588,7 +10022,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -9599,7 +10032,6 @@ public final class ContextOuterClass {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -9615,7 +10047,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -9623,9 +10054,9 @@ public final class ContextOuterClass {
             private java.util.List deviceIds_ = java.util.Collections.emptyList();
 
             private void ensureDeviceIdsIsMutable() {
-                if (!((bitField0_ & 0x00000004) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     deviceIds_ = new java.util.ArrayList(deviceIds_);
-                    bitField0_ |= 0x00000004;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -9777,7 +10208,7 @@ public final class ContextOuterClass {
             public Builder clearDeviceIds() {
                 if (deviceIdsBuilder_ == null) {
                     deviceIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000004);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     deviceIdsBuilder_.clear();
@@ -9851,7 +10282,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getDeviceIdsFieldBuilder() {
                 if (deviceIdsBuilder_ == null) {
-                    deviceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(deviceIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
+                    deviceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(deviceIds_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     deviceIds_ = null;
                 }
                 return deviceIdsBuilder_;
@@ -9860,9 +10291,9 @@ public final class ContextOuterClass {
             private java.util.List linkIds_ = java.util.Collections.emptyList();
 
             private void ensureLinkIdsIsMutable() {
-                if (!((bitField0_ & 0x00000008) != 0)) {
+                if (!((bitField0_ & 0x00000002) != 0)) {
                     linkIds_ = new java.util.ArrayList(linkIds_);
-                    bitField0_ |= 0x00000008;
+                    bitField0_ |= 0x00000002;
                 }
             }
 
@@ -10014,7 +10445,7 @@ public final class ContextOuterClass {
             public Builder clearLinkIds() {
                 if (linkIdsBuilder_ == null) {
                     linkIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000008);
+                    bitField0_ = (bitField0_ & ~0x00000002);
                     onChanged();
                 } else {
                     linkIdsBuilder_.clear();
@@ -10088,7 +10519,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getLinkIdsFieldBuilder() {
                 if (linkIdsBuilder_ == null) {
-                    linkIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(linkIds_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean());
+                    linkIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(linkIds_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
                     linkIds_ = null;
                 }
                 return linkIdsBuilder_;
@@ -10121,17 +10552,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Topology parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Topology(input, extensionRegistry);
             }
         };
 
@@ -10258,6 +10679,88 @@ public final class ContextOuterClass {
             return new TopologyDetails();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private TopologyDetails(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.TopologyId.Builder subBuilder = null;
+                                if (topologyId_ != null) {
+                                    subBuilder = topologyId_.toBuilder();
+                                }
+                                topologyId_ = input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(topologyId_);
+                                    topologyId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    devices_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                devices_.add(input.readMessage(context.ContextOuterClass.Device.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 34:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                                    links_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                links_.add(input.readMessage(context.ContextOuterClass.Link.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    devices_ = java.util.Collections.unmodifiableList(devices_);
+                }
+                if (((mutable_bitField0_ & 0x00000002) != 0)) {
+                    links_ = java.util.Collections.unmodifiableList(links_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_TopologyDetails_descriptor;
         }
@@ -10294,13 +10797,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.TopologyIdOrBuilder getTopologyIdOrBuilder() {
-            return topologyId_ == null ? context.ContextOuterClass.TopologyId.getDefaultInstance() : topologyId_;
+            return getTopologyId();
         }
 
         public static final int NAME_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 2;
@@ -10337,7 +10839,6 @@ public final class ContextOuterClass {
 
         public static final int DEVICES_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
         private java.util.List devices_;
 
         /**
@@ -10382,7 +10883,6 @@ public final class ContextOuterClass {
 
         public static final int LINKS_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
         private java.util.List links_;
 
         /**
@@ -10443,7 +10943,7 @@ public final class ContextOuterClass {
             if (topologyId_ != null) {
                 output.writeMessage(1, getTopologyId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
             }
             for (int i = 0; i < devices_.size(); i++) {
@@ -10452,7 +10952,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < links_.size(); i++) {
                 output.writeMessage(4, links_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -10464,7 +10964,7 @@ public final class ContextOuterClass {
             if (topologyId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getTopologyId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
             }
             for (int i = 0; i < devices_.size(); i++) {
@@ -10473,7 +10973,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < links_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, links_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -10499,7 +10999,7 @@ public final class ContextOuterClass {
                 return false;
             if (!getLinksList().equals(other.getLinksList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -10525,7 +11025,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + LINKS_FIELD_NUMBER;
                 hash = (53 * hash) + getLinksList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -10619,36 +11119,43 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.TopologyDetails.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getDevicesFieldBuilder();
+                    getLinksFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                topologyId_ = null;
-                if (topologyIdBuilder_ != null) {
-                    topologyIdBuilder_.dispose();
+                if (topologyIdBuilder_ == null) {
+                    topologyId_ = null;
+                } else {
+                    topologyId_ = null;
                     topologyIdBuilder_ = null;
                 }
                 name_ = "";
                 if (devicesBuilder_ == null) {
                     devices_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    devices_ = null;
                     devicesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000004);
                 if (linksBuilder_ == null) {
                     links_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
                 } else {
-                    links_ = null;
                     linksBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000008);
                 return this;
             }
 
@@ -10674,43 +11181,63 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.TopologyDetails buildPartial() {
                 context.ContextOuterClass.TopologyDetails result = new context.ContextOuterClass.TopologyDetails(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (topologyIdBuilder_ == null) {
+                    result.topologyId_ = topologyId_;
+                } else {
+                    result.topologyId_ = topologyIdBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.TopologyDetails result) {
+                result.name_ = name_;
                 if (devicesBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         devices_ = java.util.Collections.unmodifiableList(devices_);
-                        bitField0_ = (bitField0_ & ~0x00000004);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.devices_ = devices_;
                 } else {
                     result.devices_ = devicesBuilder_.build();
                 }
                 if (linksBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0)) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
                         links_ = java.util.Collections.unmodifiableList(links_);
-                        bitField0_ = (bitField0_ & ~0x00000008);
+                        bitField0_ = (bitField0_ & ~0x00000002);
                     }
                     result.links_ = links_;
                 } else {
                     result.links_ = linksBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.TopologyDetails result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.topologyId_ = topologyIdBuilder_ == null ? topologyId_ : topologyIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.name_ = name_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -10731,14 +11258,13 @@ public final class ContextOuterClass {
                 }
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (devicesBuilder_ == null) {
                     if (!other.devices_.isEmpty()) {
                         if (devices_.isEmpty()) {
                             devices_ = other.devices_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureDevicesIsMutable();
                             devices_.addAll(other.devices_);
@@ -10751,7 +11277,7 @@ public final class ContextOuterClass {
                             devicesBuilder_.dispose();
                             devicesBuilder_ = null;
                             devices_ = other.devices_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             devicesBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getDevicesFieldBuilder() : null;
                         } else {
                             devicesBuilder_.addAllMessages(other.devices_);
@@ -10762,7 +11288,7 @@ public final class ContextOuterClass {
                     if (!other.links_.isEmpty()) {
                         if (links_.isEmpty()) {
                             links_ = other.links_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                         } else {
                             ensureLinksIsMutable();
                             links_.addAll(other.links_);
@@ -10775,14 +11301,14 @@ public final class ContextOuterClass {
                             linksBuilder_.dispose();
                             linksBuilder_ = null;
                             links_ = other.links_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                             linksBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getLinksFieldBuilder() : null;
                         } else {
                             linksBuilder_.addAllMessages(other.links_);
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -10794,73 +11320,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.TopologyDetails parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getTopologyIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    context.ContextOuterClass.Device m = input.readMessage(context.ContextOuterClass.Device.parser(), extensionRegistry);
-                                    if (devicesBuilder_ == null) {
-                                        ensureDevicesIsMutable();
-                                        devices_.add(m);
-                                    } else {
-                                        devicesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    context.ContextOuterClass.Link m = input.readMessage(context.ContextOuterClass.Link.parser(), extensionRegistry);
-                                    if (linksBuilder_ == null) {
-                                        ensureLinksIsMutable();
-                                        links_.add(m);
-                                    } else {
-                                        linksBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 34
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.TopologyDetails) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -10875,7 +11345,7 @@ public final class ContextOuterClass {
              * @return Whether the topologyId field is set.
              */
             public boolean hasTopologyId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return topologyIdBuilder_ != null || topologyId_ != null;
             }
 
             /**
@@ -10899,11 +11369,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     topologyId_ = value;
+                    onChanged();
                 } else {
                     topologyIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -10913,11 +11382,10 @@ public final class ContextOuterClass {
             public Builder setTopologyId(context.ContextOuterClass.TopologyId.Builder builderForValue) {
                 if (topologyIdBuilder_ == null) {
                     topologyId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     topologyIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -10926,16 +11394,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeTopologyId(context.ContextOuterClass.TopologyId value) {
                 if (topologyIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && topologyId_ != null && topologyId_ != context.ContextOuterClass.TopologyId.getDefaultInstance()) {
-                        getTopologyIdBuilder().mergeFrom(value);
+                    if (topologyId_ != null) {
+                        topologyId_ = context.ContextOuterClass.TopologyId.newBuilder(topologyId_).mergeFrom(value).buildPartial();
                     } else {
                         topologyId_ = value;
                     }
+                    onChanged();
                 } else {
                     topologyIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -10943,13 +11410,13 @@ public final class ContextOuterClass {
              * .context.TopologyId topology_id = 1;
              */
             public Builder clearTopologyId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                topologyId_ = null;
-                if (topologyIdBuilder_ != null) {
-                    topologyIdBuilder_.dispose();
+                if (topologyIdBuilder_ == null) {
+                    topologyId_ = null;
+                    onChanged();
+                } else {
+                    topologyId_ = null;
                     topologyIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -10957,7 +11424,6 @@ public final class ContextOuterClass {
              * .context.TopologyId topology_id = 1;
              */
             public context.ContextOuterClass.TopologyId.Builder getTopologyIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getTopologyIdFieldBuilder().getBuilder();
             }
@@ -11027,7 +11493,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -11038,7 +11503,6 @@ public final class ContextOuterClass {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -11054,7 +11518,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -11062,9 +11525,9 @@ public final class ContextOuterClass {
             private java.util.List devices_ = java.util.Collections.emptyList();
 
             private void ensureDevicesIsMutable() {
-                if (!((bitField0_ & 0x00000004) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     devices_ = new java.util.ArrayList(devices_);
-                    bitField0_ |= 0x00000004;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -11216,7 +11679,7 @@ public final class ContextOuterClass {
             public Builder clearDevices() {
                 if (devicesBuilder_ == null) {
                     devices_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000004);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     devicesBuilder_.clear();
@@ -11290,7 +11753,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getDevicesFieldBuilder() {
                 if (devicesBuilder_ == null) {
-                    devicesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(devices_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
+                    devicesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(devices_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     devices_ = null;
                 }
                 return devicesBuilder_;
@@ -11299,9 +11762,9 @@ public final class ContextOuterClass {
             private java.util.List links_ = java.util.Collections.emptyList();
 
             private void ensureLinksIsMutable() {
-                if (!((bitField0_ & 0x00000008) != 0)) {
+                if (!((bitField0_ & 0x00000002) != 0)) {
                     links_ = new java.util.ArrayList(links_);
-                    bitField0_ |= 0x00000008;
+                    bitField0_ |= 0x00000002;
                 }
             }
 
@@ -11453,7 +11916,7 @@ public final class ContextOuterClass {
             public Builder clearLinks() {
                 if (linksBuilder_ == null) {
                     links_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000008);
+                    bitField0_ = (bitField0_ & ~0x00000002);
                     onChanged();
                 } else {
                     linksBuilder_.clear();
@@ -11527,7 +11990,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getLinksFieldBuilder() {
                 if (linksBuilder_ == null) {
-                    linksBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(links_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean());
+                    linksBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(links_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
                     links_ = null;
                 }
                 return linksBuilder_;
@@ -11560,17 +12023,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public TopologyDetails parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new TopologyDetails(input, extensionRegistry);
             }
         };
 
@@ -11641,6 +12094,57 @@ public final class ContextOuterClass {
             return new TopologyIdList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private TopologyIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    topologyIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                topologyIds_.add(input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    topologyIds_ = java.util.Collections.unmodifiableList(topologyIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_TopologyIdList_descriptor;
         }
@@ -11652,7 +12156,6 @@ public final class ContextOuterClass {
 
         public static final int TOPOLOGY_IDS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List topologyIds_;
 
         /**
@@ -11713,7 +12216,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < topologyIds_.size(); i++) {
                 output.writeMessage(1, topologyIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -11725,7 +12228,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < topologyIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, topologyIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -11741,7 +12244,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.TopologyIdList other = (context.ContextOuterClass.TopologyIdList) obj;
             if (!getTopologyIdsList().equals(other.getTopologyIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -11757,7 +12260,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + TOPOLOGY_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getTopologyIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -11851,23 +12354,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.TopologyIdList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getTopologyIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (topologyIdsBuilder_ == null) {
                     topologyIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    topologyIds_ = null;
                     topologyIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -11893,15 +12402,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.TopologyIdList buildPartial() {
                 context.ContextOuterClass.TopologyIdList result = new context.ContextOuterClass.TopologyIdList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.TopologyIdList result) {
+                int from_bitField0_ = bitField0_;
                 if (topologyIdsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         topologyIds_ = java.util.Collections.unmodifiableList(topologyIds_);
@@ -11911,10 +12412,38 @@ public final class ContextOuterClass {
                 } else {
                     result.topologyIds_ = topologyIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.TopologyIdList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -11954,7 +12483,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -11966,47 +12495,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.TopologyIdList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.TopologyId m = input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry);
-                                    if (topologyIdsBuilder_ == null) {
-                                        ensureTopologyIdsIsMutable();
-                                        topologyIds_.add(m);
-                                    } else {
-                                        topologyIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.TopologyIdList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -12276,17 +12775,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public TopologyIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new TopologyIdList(input, extensionRegistry);
             }
         };
 
@@ -12357,6 +12846,57 @@ public final class ContextOuterClass {
             return new TopologyList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private TopologyList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    topologies_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                topologies_.add(input.readMessage(context.ContextOuterClass.Topology.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    topologies_ = java.util.Collections.unmodifiableList(topologies_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_TopologyList_descriptor;
         }
@@ -12368,7 +12908,6 @@ public final class ContextOuterClass {
 
         public static final int TOPOLOGIES_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List topologies_;
 
         /**
@@ -12429,7 +12968,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < topologies_.size(); i++) {
                 output.writeMessage(1, topologies_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -12441,7 +12980,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < topologies_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, topologies_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -12457,7 +12996,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.TopologyList other = (context.ContextOuterClass.TopologyList) obj;
             if (!getTopologiesList().equals(other.getTopologiesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -12473,7 +13012,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + TOPOLOGIES_FIELD_NUMBER;
                 hash = (53 * hash) + getTopologiesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -12567,23 +13106,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.TopologyList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getTopologiesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (topologiesBuilder_ == null) {
                     topologies_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    topologies_ = null;
                     topologiesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -12609,15 +13154,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.TopologyList buildPartial() {
                 context.ContextOuterClass.TopologyList result = new context.ContextOuterClass.TopologyList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.TopologyList result) {
+                int from_bitField0_ = bitField0_;
                 if (topologiesBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         topologies_ = java.util.Collections.unmodifiableList(topologies_);
@@ -12627,10 +13164,38 @@ public final class ContextOuterClass {
                 } else {
                     result.topologies_ = topologiesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.TopologyList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -12670,7 +13235,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -12682,47 +13247,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.TopologyList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.Topology m = input.readMessage(context.ContextOuterClass.Topology.parser(), extensionRegistry);
-                                    if (topologiesBuilder_ == null) {
-                                        ensureTopologiesIsMutable();
-                                        topologies_.add(m);
-                                    } else {
-                                        topologiesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.TopologyList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -12992,17 +13527,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public TopologyList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new TopologyList(input, extensionRegistry);
             }
         };
 
@@ -13081,6 +13606,70 @@ public final class ContextOuterClass {
             return new TopologyEvent();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private TopologyEvent(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Event.Builder subBuilder = null;
+                                if (event_ != null) {
+                                    subBuilder = event_.toBuilder();
+                                }
+                                event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(event_);
+                                    event_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.TopologyId.Builder subBuilder = null;
+                                if (topologyId_ != null) {
+                                    subBuilder = topologyId_.toBuilder();
+                                }
+                                topologyId_ = input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(topologyId_);
+                                    topologyId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_TopologyEvent_descriptor;
         }
@@ -13117,7 +13706,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-            return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+            return getEvent();
         }
 
         public static final int TOPOLOGY_ID_FIELD_NUMBER = 2;
@@ -13147,7 +13736,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.TopologyIdOrBuilder getTopologyIdOrBuilder() {
-            return topologyId_ == null ? context.ContextOuterClass.TopologyId.getDefaultInstance() : topologyId_;
+            return getTopologyId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -13171,7 +13760,7 @@ public final class ContextOuterClass {
             if (topologyId_ != null) {
                 output.writeMessage(2, getTopologyId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -13186,7 +13775,7 @@ public final class ContextOuterClass {
             if (topologyId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getTopologyId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -13212,7 +13801,7 @@ public final class ContextOuterClass {
                 if (!getTopologyId().equals(other.getTopologyId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -13232,7 +13821,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + TOPOLOGY_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getTopologyId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -13326,24 +13915,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.TopologyEvent.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                topologyId_ = null;
-                if (topologyIdBuilder_ != null) {
-                    topologyIdBuilder_.dispose();
+                if (topologyIdBuilder_ == null) {
+                    topologyId_ = null;
+                } else {
+                    topologyId_ = null;
                     topologyIdBuilder_ = null;
                 }
                 return this;
@@ -13371,21 +13968,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.TopologyEvent buildPartial() {
                 context.ContextOuterClass.TopologyEvent result = new context.ContextOuterClass.TopologyEvent(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (eventBuilder_ == null) {
+                    result.event_ = event_;
+                } else {
+                    result.event_ = eventBuilder_.build();
+                }
+                if (topologyIdBuilder_ == null) {
+                    result.topologyId_ = topologyId_;
+                } else {
+                    result.topologyId_ = topologyIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.TopologyEvent result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.event_ = eventBuilder_ == null ? event_ : eventBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.topologyId_ = topologyIdBuilder_ == null ? topologyId_ : topologyIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -13407,7 +14031,7 @@ public final class ContextOuterClass {
                 if (other.hasTopologyId()) {
                     mergeTopologyId(other.getTopologyId());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -13419,54 +14043,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.TopologyEvent parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEventFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getTopologyIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.TopologyEvent) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Event event_;
 
             private com.google.protobuf.SingleFieldBuilderV3 eventBuilder_;
@@ -13476,7 +14066,7 @@ public final class ContextOuterClass {
              * @return Whether the event field is set.
              */
             public boolean hasEvent() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return eventBuilder_ != null || event_ != null;
             }
 
             /**
@@ -13500,11 +14090,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     event_ = value;
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -13514,11 +14103,10 @@ public final class ContextOuterClass {
             public Builder setEvent(context.ContextOuterClass.Event.Builder builderForValue) {
                 if (eventBuilder_ == null) {
                     event_ = builderForValue.build();
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -13527,16 +14115,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEvent(context.ContextOuterClass.Event value) {
                 if (eventBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && event_ != null && event_ != context.ContextOuterClass.Event.getDefaultInstance()) {
-                        getEventBuilder().mergeFrom(value);
+                    if (event_ != null) {
+                        event_ = context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
                     } else {
                         event_ = value;
                     }
+                    onChanged();
                 } else {
                     eventBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -13544,13 +14131,13 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public Builder clearEvent() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                    onChanged();
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -13558,7 +14145,6 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public context.ContextOuterClass.Event.Builder getEventBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEventFieldBuilder().getBuilder();
             }
@@ -13594,7 +14180,7 @@ public final class ContextOuterClass {
              * @return Whether the topologyId field is set.
              */
             public boolean hasTopologyId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return topologyIdBuilder_ != null || topologyId_ != null;
             }
 
             /**
@@ -13618,11 +14204,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     topologyId_ = value;
+                    onChanged();
                 } else {
                     topologyIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -13632,11 +14217,10 @@ public final class ContextOuterClass {
             public Builder setTopologyId(context.ContextOuterClass.TopologyId.Builder builderForValue) {
                 if (topologyIdBuilder_ == null) {
                     topologyId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     topologyIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -13645,16 +14229,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeTopologyId(context.ContextOuterClass.TopologyId value) {
                 if (topologyIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && topologyId_ != null && topologyId_ != context.ContextOuterClass.TopologyId.getDefaultInstance()) {
-                        getTopologyIdBuilder().mergeFrom(value);
+                    if (topologyId_ != null) {
+                        topologyId_ = context.ContextOuterClass.TopologyId.newBuilder(topologyId_).mergeFrom(value).buildPartial();
                     } else {
                         topologyId_ = value;
                     }
+                    onChanged();
                 } else {
                     topologyIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -13662,13 +14245,13 @@ public final class ContextOuterClass {
              * .context.TopologyId topology_id = 2;
              */
             public Builder clearTopologyId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                topologyId_ = null;
-                if (topologyIdBuilder_ != null) {
-                    topologyIdBuilder_.dispose();
+                if (topologyIdBuilder_ == null) {
+                    topologyId_ = null;
+                    onChanged();
+                } else {
+                    topologyId_ = null;
                     topologyIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -13676,7 +14259,6 @@ public final class ContextOuterClass {
              * .context.TopologyId topology_id = 2;
              */
             public context.ContextOuterClass.TopologyId.Builder getTopologyIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getTopologyIdFieldBuilder().getBuilder();
             }
@@ -13730,17 +14312,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public TopologyEvent parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new TopologyEvent(input, extensionRegistry);
             }
         };
 
@@ -13806,6 +14378,57 @@ public final class ContextOuterClass {
             return new DeviceId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (deviceUuid_ != null) {
+                                    subBuilder = deviceUuid_.toBuilder();
+                                }
+                                deviceUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(deviceUuid_);
+                                    deviceUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_DeviceId_descriptor;
         }
@@ -13842,7 +14465,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getDeviceUuidOrBuilder() {
-            return deviceUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : deviceUuid_;
+            return getDeviceUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -13863,7 +14486,7 @@ public final class ContextOuterClass {
             if (deviceUuid_ != null) {
                 output.writeMessage(1, getDeviceUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -13875,7 +14498,7 @@ public final class ContextOuterClass {
             if (deviceUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getDeviceUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -13895,7 +14518,7 @@ public final class ContextOuterClass {
                 if (!getDeviceUuid().equals(other.getDeviceUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -13911,7 +14534,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + DEVICE_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getDeviceUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -14009,19 +14632,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.DeviceId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                deviceUuid_ = null;
-                if (deviceUuidBuilder_ != null) {
-                    deviceUuidBuilder_.dispose();
+                if (deviceUuidBuilder_ == null) {
+                    deviceUuid_ = null;
+                } else {
+                    deviceUuid_ = null;
                     deviceUuidBuilder_ = null;
                 }
                 return this;
@@ -14049,18 +14679,43 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.DeviceId buildPartial() {
                 context.ContextOuterClass.DeviceId result = new context.ContextOuterClass.DeviceId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (deviceUuidBuilder_ == null) {
+                    result.deviceUuid_ = deviceUuid_;
+                } else {
+                    result.deviceUuid_ = deviceUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.DeviceId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.deviceUuid_ = deviceUuidBuilder_ == null ? deviceUuid_ : deviceUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -14079,7 +14734,7 @@ public final class ContextOuterClass {
                 if (other.hasDeviceUuid()) {
                     mergeDeviceUuid(other.getDeviceUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -14091,47 +14746,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.DeviceId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getDeviceUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.DeviceId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid deviceUuid_;
 
             private com.google.protobuf.SingleFieldBuilderV3 deviceUuidBuilder_;
@@ -14141,7 +14769,7 @@ public final class ContextOuterClass {
              * @return Whether the deviceUuid field is set.
              */
             public boolean hasDeviceUuid() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return deviceUuidBuilder_ != null || deviceUuid_ != null;
             }
 
             /**
@@ -14165,11 +14793,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     deviceUuid_ = value;
+                    onChanged();
                 } else {
                     deviceUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -14179,11 +14806,10 @@ public final class ContextOuterClass {
             public Builder setDeviceUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (deviceUuidBuilder_ == null) {
                     deviceUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     deviceUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -14192,16 +14818,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeDeviceUuid(context.ContextOuterClass.Uuid value) {
                 if (deviceUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && deviceUuid_ != null && deviceUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getDeviceUuidBuilder().mergeFrom(value);
+                    if (deviceUuid_ != null) {
+                        deviceUuid_ = context.ContextOuterClass.Uuid.newBuilder(deviceUuid_).mergeFrom(value).buildPartial();
                     } else {
                         deviceUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     deviceUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -14209,13 +14834,13 @@ public final class ContextOuterClass {
              * .context.Uuid device_uuid = 1;
              */
             public Builder clearDeviceUuid() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                deviceUuid_ = null;
-                if (deviceUuidBuilder_ != null) {
-                    deviceUuidBuilder_.dispose();
+                if (deviceUuidBuilder_ == null) {
+                    deviceUuid_ = null;
+                    onChanged();
+                } else {
+                    deviceUuid_ = null;
                     deviceUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -14223,7 +14848,6 @@ public final class ContextOuterClass {
              * .context.Uuid device_uuid = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getDeviceUuidBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getDeviceUuidFieldBuilder().getBuilder();
             }
@@ -14277,17 +14901,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public DeviceId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceId(input, extensionRegistry);
             }
         };
 
@@ -14539,6 +15153,154 @@ public final class ContextOuterClass {
             return new Device();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Device(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.DeviceId.Builder subBuilder = null;
+                                if (deviceId_ != null) {
+                                    subBuilder = deviceId_.toBuilder();
+                                }
+                                deviceId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(deviceId_);
+                                    deviceId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                deviceType_ = s;
+                                break;
+                            }
+                        case 34:
+                            {
+                                context.ContextOuterClass.DeviceConfig.Builder subBuilder = null;
+                                if (deviceConfig_ != null) {
+                                    subBuilder = deviceConfig_.toBuilder();
+                                }
+                                deviceConfig_ = input.readMessage(context.ContextOuterClass.DeviceConfig.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(deviceConfig_);
+                                    deviceConfig_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 40:
+                            {
+                                int rawValue = input.readEnum();
+                                deviceOperationalStatus_ = rawValue;
+                                break;
+                            }
+                        case 48:
+                            {
+                                int rawValue = input.readEnum();
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    deviceDrivers_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                deviceDrivers_.add(rawValue);
+                                break;
+                            }
+                        case 50:
+                            {
+                                int length = input.readRawVarint32();
+                                int oldLimit = input.pushLimit(length);
+                                while (input.getBytesUntilLimit() > 0) {
+                                    int rawValue = input.readEnum();
+                                    if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                        deviceDrivers_ = new java.util.ArrayList();
+                                        mutable_bitField0_ |= 0x00000001;
+                                    }
+                                    deviceDrivers_.add(rawValue);
+                                }
+                                input.popLimit(oldLimit);
+                                break;
+                            }
+                        case 58:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                                    deviceEndpoints_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                deviceEndpoints_.add(input.readMessage(context.ContextOuterClass.EndPoint.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 66:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000004) != 0)) {
+                                    components_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000004;
+                                }
+                                components_.add(input.readMessage(context.ContextOuterClass.Component.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 74:
+                            {
+                                context.ContextOuterClass.DeviceId.Builder subBuilder = null;
+                                if (controllerId_ != null) {
+                                    subBuilder = controllerId_.toBuilder();
+                                }
+                                controllerId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(controllerId_);
+                                    controllerId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    deviceDrivers_ = java.util.Collections.unmodifiableList(deviceDrivers_);
+                }
+                if (((mutable_bitField0_ & 0x00000002) != 0)) {
+                    deviceEndpoints_ = java.util.Collections.unmodifiableList(deviceEndpoints_);
+                }
+                if (((mutable_bitField0_ & 0x00000004) != 0)) {
+                    components_ = java.util.Collections.unmodifiableList(components_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Device_descriptor;
         }
@@ -14575,13 +15337,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() {
-            return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
+            return getDeviceId();
         }
 
         public static final int NAME_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 2;
@@ -14618,8 +15379,7 @@ public final class ContextOuterClass {
 
         public static final int DEVICE_TYPE_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object deviceType_ = "";
+        private volatile java.lang.Object deviceType_;
 
         /**
          * string device_type = 3;
@@ -14681,12 +15441,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.DeviceConfigOrBuilder getDeviceConfigOrBuilder() {
-            return deviceConfig_ == null ? context.ContextOuterClass.DeviceConfig.getDefaultInstance() : deviceConfig_;
+            return getDeviceConfig();
         }
 
         public static final int DEVICE_OPERATIONAL_STATUS_FIELD_NUMBER = 5;
 
-        private int deviceOperationalStatus_ = 0;
+        private int deviceOperationalStatus_;
 
         /**
          * .context.DeviceOperationalStatusEnum device_operational_status = 5;
@@ -14703,19 +15463,20 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.DeviceOperationalStatusEnum getDeviceOperationalStatus() {
-            context.ContextOuterClass.DeviceOperationalStatusEnum result = context.ContextOuterClass.DeviceOperationalStatusEnum.forNumber(deviceOperationalStatus_);
+            @SuppressWarnings("deprecation")
+            context.ContextOuterClass.DeviceOperationalStatusEnum result = context.ContextOuterClass.DeviceOperationalStatusEnum.valueOf(deviceOperationalStatus_);
             return result == null ? context.ContextOuterClass.DeviceOperationalStatusEnum.UNRECOGNIZED : result;
         }
 
         public static final int DEVICE_DRIVERS_FIELD_NUMBER = 6;
 
-        @SuppressWarnings("serial")
         private java.util.List deviceDrivers_;
 
         private static final com.google.protobuf.Internal.ListAdapter.Converter deviceDrivers_converter_ = new com.google.protobuf.Internal.ListAdapter.Converter() {
 
             public context.ContextOuterClass.DeviceDriverEnum convert(java.lang.Integer from) {
-                context.ContextOuterClass.DeviceDriverEnum result = context.ContextOuterClass.DeviceDriverEnum.forNumber(from);
+                @SuppressWarnings("deprecation")
+                context.ContextOuterClass.DeviceDriverEnum result = context.ContextOuterClass.DeviceDriverEnum.valueOf(from);
                 return result == null ? context.ContextOuterClass.DeviceDriverEnum.UNRECOGNIZED : result;
             }
         };
@@ -14771,7 +15532,6 @@ public final class ContextOuterClass {
 
         public static final int DEVICE_ENDPOINTS_FIELD_NUMBER = 7;
 
-        @SuppressWarnings("serial")
         private java.util.List deviceEndpoints_;
 
         /**
@@ -14816,7 +15576,6 @@ public final class ContextOuterClass {
 
         public static final int COMPONENTS_FIELD_NUMBER = 8;
 
-        @SuppressWarnings("serial")
         private java.util.List components_;
 
         /**
@@ -14918,7 +15677,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.DeviceIdOrBuilder getControllerIdOrBuilder() {
-            return controllerId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : controllerId_;
+            return getControllerId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -14940,10 +15699,10 @@ public final class ContextOuterClass {
             if (deviceId_ != null) {
                 output.writeMessage(1, getDeviceId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(deviceType_)) {
+            if (!getDeviceTypeBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 3, deviceType_);
             }
             if (deviceConfig_ != null) {
@@ -14968,7 +15727,7 @@ public final class ContextOuterClass {
             if (controllerId_ != null) {
                 output.writeMessage(9, getControllerId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -14980,10 +15739,10 @@ public final class ContextOuterClass {
             if (deviceId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getDeviceId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(deviceType_)) {
+            if (!getDeviceTypeBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, deviceType_);
             }
             if (deviceConfig_ != null) {
@@ -15013,7 +15772,7 @@ public final class ContextOuterClass {
             if (controllerId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(9, getControllerId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -15057,7 +15816,7 @@ public final class ContextOuterClass {
                 if (!getControllerId().equals(other.getControllerId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -15099,7 +15858,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONTROLLER_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getControllerId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -15193,48 +15952,57 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Device.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getDeviceEndpointsFieldBuilder();
+                    getComponentsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                deviceId_ = null;
-                if (deviceIdBuilder_ != null) {
-                    deviceIdBuilder_.dispose();
+                if (deviceIdBuilder_ == null) {
+                    deviceId_ = null;
+                } else {
+                    deviceId_ = null;
                     deviceIdBuilder_ = null;
                 }
                 name_ = "";
                 deviceType_ = "";
-                deviceConfig_ = null;
-                if (deviceConfigBuilder_ != null) {
-                    deviceConfigBuilder_.dispose();
+                if (deviceConfigBuilder_ == null) {
+                    deviceConfig_ = null;
+                } else {
+                    deviceConfig_ = null;
                     deviceConfigBuilder_ = null;
                 }
                 deviceOperationalStatus_ = 0;
                 deviceDrivers_ = java.util.Collections.emptyList();
-                bitField0_ = (bitField0_ & ~0x00000020);
+                bitField0_ = (bitField0_ & ~0x00000001);
                 if (deviceEndpointsBuilder_ == null) {
                     deviceEndpoints_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
                 } else {
-                    deviceEndpoints_ = null;
                     deviceEndpointsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000040);
                 if (componentsBuilder_ == null) {
                     components_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000004);
                 } else {
-                    components_ = null;
                     componentsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000080);
-                controllerId_ = null;
-                if (controllerIdBuilder_ != null) {
-                    controllerIdBuilder_.dispose();
+                if (controllerIdBuilder_ == null) {
+                    controllerId_ = null;
+                } else {
+                    controllerId_ = null;
                     controllerIdBuilder_ = null;
                 }
                 return this;
@@ -15262,60 +16030,80 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Device buildPartial() {
                 context.ContextOuterClass.Device result = new context.ContextOuterClass.Device(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (deviceIdBuilder_ == null) {
+                    result.deviceId_ = deviceId_;
+                } else {
+                    result.deviceId_ = deviceIdBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Device result) {
-                if (((bitField0_ & 0x00000020) != 0)) {
+                result.name_ = name_;
+                result.deviceType_ = deviceType_;
+                if (deviceConfigBuilder_ == null) {
+                    result.deviceConfig_ = deviceConfig_;
+                } else {
+                    result.deviceConfig_ = deviceConfigBuilder_.build();
+                }
+                result.deviceOperationalStatus_ = deviceOperationalStatus_;
+                if (((bitField0_ & 0x00000001) != 0)) {
                     deviceDrivers_ = java.util.Collections.unmodifiableList(deviceDrivers_);
-                    bitField0_ = (bitField0_ & ~0x00000020);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 }
                 result.deviceDrivers_ = deviceDrivers_;
                 if (deviceEndpointsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000040) != 0)) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
                         deviceEndpoints_ = java.util.Collections.unmodifiableList(deviceEndpoints_);
-                        bitField0_ = (bitField0_ & ~0x00000040);
+                        bitField0_ = (bitField0_ & ~0x00000002);
                     }
                     result.deviceEndpoints_ = deviceEndpoints_;
                 } else {
                     result.deviceEndpoints_ = deviceEndpointsBuilder_.build();
                 }
                 if (componentsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000080) != 0)) {
+                    if (((bitField0_ & 0x00000004) != 0)) {
                         components_ = java.util.Collections.unmodifiableList(components_);
-                        bitField0_ = (bitField0_ & ~0x00000080);
+                        bitField0_ = (bitField0_ & ~0x00000004);
                     }
                     result.components_ = components_;
                 } else {
                     result.components_ = componentsBuilder_.build();
                 }
+                if (controllerIdBuilder_ == null) {
+                    result.controllerId_ = controllerId_;
+                } else {
+                    result.controllerId_ = controllerIdBuilder_.build();
+                }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Device result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.deviceId_ = deviceIdBuilder_ == null ? deviceId_ : deviceIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.deviceType_ = deviceType_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.deviceConfig_ = deviceConfigBuilder_ == null ? deviceConfig_ : deviceConfigBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.deviceOperationalStatus_ = deviceOperationalStatus_;
-                }
-                if (((from_bitField0_ & 0x00000100) != 0)) {
-                    result.controllerId_ = controllerIdBuilder_ == null ? controllerId_ : controllerIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -15336,12 +16124,10 @@ public final class ContextOuterClass {
                 }
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (!other.getDeviceType().isEmpty()) {
                     deviceType_ = other.deviceType_;
-                    bitField0_ |= 0x00000004;
                     onChanged();
                 }
                 if (other.hasDeviceConfig()) {
@@ -15353,7 +16139,7 @@ public final class ContextOuterClass {
                 if (!other.deviceDrivers_.isEmpty()) {
                     if (deviceDrivers_.isEmpty()) {
                         deviceDrivers_ = other.deviceDrivers_;
-                        bitField0_ = (bitField0_ & ~0x00000020);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     } else {
                         ensureDeviceDriversIsMutable();
                         deviceDrivers_.addAll(other.deviceDrivers_);
@@ -15364,7 +16150,7 @@ public final class ContextOuterClass {
                     if (!other.deviceEndpoints_.isEmpty()) {
                         if (deviceEndpoints_.isEmpty()) {
                             deviceEndpoints_ = other.deviceEndpoints_;
-                            bitField0_ = (bitField0_ & ~0x00000040);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                         } else {
                             ensureDeviceEndpointsIsMutable();
                             deviceEndpoints_.addAll(other.deviceEndpoints_);
@@ -15377,7 +16163,7 @@ public final class ContextOuterClass {
                             deviceEndpointsBuilder_.dispose();
                             deviceEndpointsBuilder_ = null;
                             deviceEndpoints_ = other.deviceEndpoints_;
-                            bitField0_ = (bitField0_ & ~0x00000040);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                             deviceEndpointsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getDeviceEndpointsFieldBuilder() : null;
                         } else {
                             deviceEndpointsBuilder_.addAllMessages(other.deviceEndpoints_);
@@ -15388,7 +16174,7 @@ public final class ContextOuterClass {
                     if (!other.components_.isEmpty()) {
                         if (components_.isEmpty()) {
                             components_ = other.components_;
-                            bitField0_ = (bitField0_ & ~0x00000080);
+                            bitField0_ = (bitField0_ & ~0x00000004);
                         } else {
                             ensureComponentsIsMutable();
                             components_.addAll(other.components_);
@@ -15401,7 +16187,7 @@ public final class ContextOuterClass {
                             componentsBuilder_.dispose();
                             componentsBuilder_ = null;
                             components_ = other.components_;
-                            bitField0_ = (bitField0_ & ~0x00000080);
+                            bitField0_ = (bitField0_ & ~0x00000004);
                             componentsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getComponentsFieldBuilder() : null;
                         } else {
                             componentsBuilder_.addAllMessages(other.components_);
@@ -15411,7 +16197,7 @@ public final class ContextOuterClass {
                 if (other.hasControllerId()) {
                     mergeControllerId(other.getControllerId());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -15423,122 +16209,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Device parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getDeviceIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    deviceType_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    input.readMessage(getDeviceConfigFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 34
-                            case 40:
-                                {
-                                    deviceOperationalStatus_ = input.readEnum();
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 40
-                            case 48:
-                                {
-                                    int tmpRaw = input.readEnum();
-                                    ensureDeviceDriversIsMutable();
-                                    deviceDrivers_.add(tmpRaw);
-                                    break;
-                                }
-                            // case 48
-                            case 50:
-                                {
-                                    int length = input.readRawVarint32();
-                                    int oldLimit = input.pushLimit(length);
-                                    while (input.getBytesUntilLimit() > 0) {
-                                        int tmpRaw = input.readEnum();
-                                        ensureDeviceDriversIsMutable();
-                                        deviceDrivers_.add(tmpRaw);
-                                    }
-                                    input.popLimit(oldLimit);
-                                    break;
-                                }
-                            // case 50
-                            case 58:
-                                {
-                                    context.ContextOuterClass.EndPoint m = input.readMessage(context.ContextOuterClass.EndPoint.parser(), extensionRegistry);
-                                    if (deviceEndpointsBuilder_ == null) {
-                                        ensureDeviceEndpointsIsMutable();
-                                        deviceEndpoints_.add(m);
-                                    } else {
-                                        deviceEndpointsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 58
-                            case 66:
-                                {
-                                    context.ContextOuterClass.Component m = input.readMessage(context.ContextOuterClass.Component.parser(), extensionRegistry);
-                                    if (componentsBuilder_ == null) {
-                                        ensureComponentsIsMutable();
-                                        components_.add(m);
-                                    } else {
-                                        componentsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 66
-                            case 74:
-                                {
-                                    input.readMessage(getControllerIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000100;
-                                    break;
-                                }
-                            // case 74
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Device) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -15553,7 +16234,7 @@ public final class ContextOuterClass {
              * @return Whether the deviceId field is set.
              */
             public boolean hasDeviceId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return deviceIdBuilder_ != null || deviceId_ != null;
             }
 
             /**
@@ -15577,11 +16258,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     deviceId_ = value;
+                    onChanged();
                 } else {
                     deviceIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -15591,11 +16271,10 @@ public final class ContextOuterClass {
             public Builder setDeviceId(context.ContextOuterClass.DeviceId.Builder builderForValue) {
                 if (deviceIdBuilder_ == null) {
                     deviceId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     deviceIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -15604,16 +16283,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeDeviceId(context.ContextOuterClass.DeviceId value) {
                 if (deviceIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && deviceId_ != null && deviceId_ != context.ContextOuterClass.DeviceId.getDefaultInstance()) {
-                        getDeviceIdBuilder().mergeFrom(value);
+                    if (deviceId_ != null) {
+                        deviceId_ = context.ContextOuterClass.DeviceId.newBuilder(deviceId_).mergeFrom(value).buildPartial();
                     } else {
                         deviceId_ = value;
                     }
+                    onChanged();
                 } else {
                     deviceIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -15621,13 +16299,13 @@ public final class ContextOuterClass {
              * .context.DeviceId device_id = 1;
              */
             public Builder clearDeviceId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                deviceId_ = null;
-                if (deviceIdBuilder_ != null) {
-                    deviceIdBuilder_.dispose();
+                if (deviceIdBuilder_ == null) {
+                    deviceId_ = null;
+                    onChanged();
+                } else {
+                    deviceId_ = null;
                     deviceIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -15635,7 +16313,6 @@ public final class ContextOuterClass {
              * .context.DeviceId device_id = 1;
              */
             public context.ContextOuterClass.DeviceId.Builder getDeviceIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getDeviceIdFieldBuilder().getBuilder();
             }
@@ -15705,7 +16382,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -15716,7 +16392,6 @@ public final class ContextOuterClass {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -15732,7 +16407,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -15780,7 +16454,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 deviceType_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -15791,7 +16464,6 @@ public final class ContextOuterClass {
              */
             public Builder clearDeviceType() {
                 deviceType_ = getDefaultInstance().getDeviceType();
-                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -15807,7 +16479,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 deviceType_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -15821,7 +16492,7 @@ public final class ContextOuterClass {
              * @return Whether the deviceConfig field is set.
              */
             public boolean hasDeviceConfig() {
-                return ((bitField0_ & 0x00000008) != 0);
+                return deviceConfigBuilder_ != null || deviceConfig_ != null;
             }
 
             /**
@@ -15845,11 +16516,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     deviceConfig_ = value;
+                    onChanged();
                 } else {
                     deviceConfigBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -15859,11 +16529,10 @@ public final class ContextOuterClass {
             public Builder setDeviceConfig(context.ContextOuterClass.DeviceConfig.Builder builderForValue) {
                 if (deviceConfigBuilder_ == null) {
                     deviceConfig_ = builderForValue.build();
+                    onChanged();
                 } else {
                     deviceConfigBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -15872,16 +16541,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeDeviceConfig(context.ContextOuterClass.DeviceConfig value) {
                 if (deviceConfigBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0) && deviceConfig_ != null && deviceConfig_ != context.ContextOuterClass.DeviceConfig.getDefaultInstance()) {
-                        getDeviceConfigBuilder().mergeFrom(value);
+                    if (deviceConfig_ != null) {
+                        deviceConfig_ = context.ContextOuterClass.DeviceConfig.newBuilder(deviceConfig_).mergeFrom(value).buildPartial();
                     } else {
                         deviceConfig_ = value;
                     }
+                    onChanged();
                 } else {
                     deviceConfigBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -15889,13 +16557,13 @@ public final class ContextOuterClass {
              * .context.DeviceConfig device_config = 4;
              */
             public Builder clearDeviceConfig() {
-                bitField0_ = (bitField0_ & ~0x00000008);
-                deviceConfig_ = null;
-                if (deviceConfigBuilder_ != null) {
-                    deviceConfigBuilder_.dispose();
+                if (deviceConfigBuilder_ == null) {
+                    deviceConfig_ = null;
+                    onChanged();
+                } else {
+                    deviceConfig_ = null;
                     deviceConfigBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -15903,7 +16571,6 @@ public final class ContextOuterClass {
              * .context.DeviceConfig device_config = 4;
              */
             public context.ContextOuterClass.DeviceConfig.Builder getDeviceConfigBuilder() {
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return getDeviceConfigFieldBuilder().getBuilder();
             }
@@ -15948,7 +16615,6 @@ public final class ContextOuterClass {
              */
             public Builder setDeviceOperationalStatusValue(int value) {
                 deviceOperationalStatus_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -15959,7 +16625,8 @@ public final class ContextOuterClass {
              */
             @java.lang.Override
             public context.ContextOuterClass.DeviceOperationalStatusEnum getDeviceOperationalStatus() {
-                context.ContextOuterClass.DeviceOperationalStatusEnum result = context.ContextOuterClass.DeviceOperationalStatusEnum.forNumber(deviceOperationalStatus_);
+                @SuppressWarnings("deprecation")
+                context.ContextOuterClass.DeviceOperationalStatusEnum result = context.ContextOuterClass.DeviceOperationalStatusEnum.valueOf(deviceOperationalStatus_);
                 return result == null ? context.ContextOuterClass.DeviceOperationalStatusEnum.UNRECOGNIZED : result;
             }
 
@@ -15972,7 +16639,6 @@ public final class ContextOuterClass {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000010;
                 deviceOperationalStatus_ = value.getNumber();
                 onChanged();
                 return this;
@@ -15983,7 +16649,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearDeviceOperationalStatus() {
-                bitField0_ = (bitField0_ & ~0x00000010);
                 deviceOperationalStatus_ = 0;
                 onChanged();
                 return this;
@@ -15992,9 +16657,9 @@ public final class ContextOuterClass {
             private java.util.List deviceDrivers_ = java.util.Collections.emptyList();
 
             private void ensureDeviceDriversIsMutable() {
-                if (!((bitField0_ & 0x00000020) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     deviceDrivers_ = new java.util.ArrayList(deviceDrivers_);
-                    bitField0_ |= 0x00000020;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -16074,7 +16739,7 @@ public final class ContextOuterClass {
              */
             public Builder clearDeviceDrivers() {
                 deviceDrivers_ = java.util.Collections.emptyList();
-                bitField0_ = (bitField0_ & ~0x00000020);
+                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -16098,8 +16763,8 @@ public final class ContextOuterClass {
 
             /**
              * repeated .context.DeviceDriverEnum device_drivers = 6;
-             * @param index The index to set the value at.
-             * @param value The enum numeric value on the wire for deviceDrivers to set.
+             * @param index The index of the value to return.
+             * @return The enum numeric value on the wire of deviceDrivers at the given index.
              * @return This builder for chaining.
              */
             public Builder setDeviceDriversValue(int index, int value) {
@@ -16138,9 +16803,9 @@ public final class ContextOuterClass {
             private java.util.List deviceEndpoints_ = java.util.Collections.emptyList();
 
             private void ensureDeviceEndpointsIsMutable() {
-                if (!((bitField0_ & 0x00000040) != 0)) {
+                if (!((bitField0_ & 0x00000002) != 0)) {
                     deviceEndpoints_ = new java.util.ArrayList(deviceEndpoints_);
-                    bitField0_ |= 0x00000040;
+                    bitField0_ |= 0x00000002;
                 }
             }
 
@@ -16292,7 +16957,7 @@ public final class ContextOuterClass {
             public Builder clearDeviceEndpoints() {
                 if (deviceEndpointsBuilder_ == null) {
                     deviceEndpoints_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000040);
+                    bitField0_ = (bitField0_ & ~0x00000002);
                     onChanged();
                 } else {
                     deviceEndpointsBuilder_.clear();
@@ -16366,7 +17031,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getDeviceEndpointsFieldBuilder() {
                 if (deviceEndpointsBuilder_ == null) {
-                    deviceEndpointsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(deviceEndpoints_, ((bitField0_ & 0x00000040) != 0), getParentForChildren(), isClean());
+                    deviceEndpointsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(deviceEndpoints_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
                     deviceEndpoints_ = null;
                 }
                 return deviceEndpointsBuilder_;
@@ -16375,9 +17040,9 @@ public final class ContextOuterClass {
             private java.util.List components_ = java.util.Collections.emptyList();
 
             private void ensureComponentsIsMutable() {
-                if (!((bitField0_ & 0x00000080) != 0)) {
+                if (!((bitField0_ & 0x00000004) != 0)) {
                     components_ = new java.util.ArrayList(components_);
-                    bitField0_ |= 0x00000080;
+                    bitField0_ |= 0x00000004;
                 }
             }
 
@@ -16573,7 +17238,7 @@ public final class ContextOuterClass {
             public Builder clearComponents() {
                 if (componentsBuilder_ == null) {
                     components_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000080);
+                    bitField0_ = (bitField0_ & ~0x00000004);
                     onChanged();
                 } else {
                     componentsBuilder_.clear();
@@ -16675,7 +17340,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getComponentsFieldBuilder() {
                 if (componentsBuilder_ == null) {
-                    componentsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(components_, ((bitField0_ & 0x00000080) != 0), getParentForChildren(), isClean());
+                    componentsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(components_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
                     components_ = null;
                 }
                 return componentsBuilder_;
@@ -16694,7 +17359,7 @@ public final class ContextOuterClass {
              * @return Whether the controllerId field is set.
              */
             public boolean hasControllerId() {
-                return ((bitField0_ & 0x00000100) != 0);
+                return controllerIdBuilder_ != null || controllerId_ != null;
             }
 
             /**
@@ -16726,11 +17391,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     controllerId_ = value;
+                    onChanged();
                 } else {
                     controllerIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000100;
-                onChanged();
                 return this;
             }
 
@@ -16744,11 +17408,10 @@ public final class ContextOuterClass {
             public Builder setControllerId(context.ContextOuterClass.DeviceId.Builder builderForValue) {
                 if (controllerIdBuilder_ == null) {
                     controllerId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     controllerIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000100;
-                onChanged();
                 return this;
             }
 
@@ -16761,16 +17424,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeControllerId(context.ContextOuterClass.DeviceId value) {
                 if (controllerIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000100) != 0) && controllerId_ != null && controllerId_ != context.ContextOuterClass.DeviceId.getDefaultInstance()) {
-                        getControllerIdBuilder().mergeFrom(value);
+                    if (controllerId_ != null) {
+                        controllerId_ = context.ContextOuterClass.DeviceId.newBuilder(controllerId_).mergeFrom(value).buildPartial();
                     } else {
                         controllerId_ = value;
                     }
+                    onChanged();
                 } else {
                     controllerIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000100;
-                onChanged();
                 return this;
             }
 
@@ -16782,13 +17444,13 @@ public final class ContextOuterClass {
              * .context.DeviceId controller_id = 9;
              */
             public Builder clearControllerId() {
-                bitField0_ = (bitField0_ & ~0x00000100);
-                controllerId_ = null;
-                if (controllerIdBuilder_ != null) {
-                    controllerIdBuilder_.dispose();
+                if (controllerIdBuilder_ == null) {
+                    controllerId_ = null;
+                    onChanged();
+                } else {
+                    controllerId_ = null;
                     controllerIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -16800,7 +17462,6 @@ public final class ContextOuterClass {
              * .context.DeviceId controller_id = 9;
              */
             public context.ContextOuterClass.DeviceId.Builder getControllerIdBuilder() {
-                bitField0_ |= 0x00000100;
                 onChanged();
                 return getControllerIdFieldBuilder().getBuilder();
             }
@@ -16862,17 +17523,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Device parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Device(input, extensionRegistry);
             }
         };
 
@@ -16975,9 +17626,7 @@ public final class ContextOuterClass {
          *
          * map<string, string> attributes = 4;
          */
-        /* nullable */
-        java.lang.String getAttributesOrDefault(java.lang.String key, /* nullable */
-        java.lang.String defaultValue);
+        java.lang.String getAttributesOrDefault(java.lang.String key, java.lang.String defaultValue);
 
         /**
          * 
@@ -17030,6 +17679,86 @@ public final class ContextOuterClass {
             return new Component();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Component(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (componentUuid_ != null) {
+                                    subBuilder = componentUuid_.toBuilder();
+                                }
+                                componentUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(componentUuid_);
+                                    componentUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                type_ = s;
+                                break;
+                            }
+                        case 34:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    attributes_ = com.google.protobuf.MapField.newMapField(AttributesDefaultEntryHolder.defaultEntry);
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                com.google.protobuf.MapEntry attributes__ = input.readMessage(AttributesDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
+                                attributes_.getMutableMap().put(attributes__.getKey(), attributes__.getValue());
+                                break;
+                            }
+                        case 42:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                parent_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Component_descriptor;
         }
@@ -17077,13 +17806,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getComponentUuidOrBuilder() {
-            return componentUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : componentUuid_;
+            return getComponentUuid();
         }
 
         public static final int NAME_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 2;
@@ -17120,8 +17848,7 @@ public final class ContextOuterClass {
 
         public static final int TYPE_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object type_ = "";
+        private volatile java.lang.Object type_;
 
         /**
          * string type = 3;
@@ -17163,7 +17890,6 @@ public final class ContextOuterClass {
             static final com.google.protobuf.MapEntry defaultEntry = com.google.protobuf.MapEntry.newDefaultInstance(context.ContextOuterClass.internal_static_context_Component_AttributesEntry_descriptor, com.google.protobuf.WireFormat.FieldType.STRING, "", com.google.protobuf.WireFormat.FieldType.STRING, "");
         }
 
-        @SuppressWarnings("serial")
         private com.google.protobuf.MapField attributes_;
 
         private com.google.protobuf.MapField internalGetAttributes() {
@@ -17187,7 +17913,7 @@ public final class ContextOuterClass {
         @java.lang.Override
         public boolean containsAttributes(java.lang.String key) {
             if (key == null) {
-                throw new NullPointerException("map key");
+                throw new java.lang.NullPointerException();
             }
             return internalGetAttributes().getMap().containsKey(key);
         }
@@ -17221,11 +17947,9 @@ public final class ContextOuterClass {
          * map<string, string> attributes = 4;
          */
         @java.lang.Override
-        public /* nullable */
-        java.lang.String getAttributesOrDefault(java.lang.String key, /* nullable */
-        java.lang.String defaultValue) {
+        public java.lang.String getAttributesOrDefault(java.lang.String key, java.lang.String defaultValue) {
             if (key == null) {
-                throw new NullPointerException("map key");
+                throw new java.lang.NullPointerException();
             }
             java.util.Map map = internalGetAttributes().getMap();
             return map.containsKey(key) ? map.get(key) : defaultValue;
@@ -17241,7 +17965,7 @@ public final class ContextOuterClass {
         @java.lang.Override
         public java.lang.String getAttributesOrThrow(java.lang.String key) {
             if (key == null) {
-                throw new NullPointerException("map key");
+                throw new java.lang.NullPointerException();
             }
             java.util.Map map = internalGetAttributes().getMap();
             if (!map.containsKey(key)) {
@@ -17252,8 +17976,7 @@ public final class ContextOuterClass {
 
         public static final int PARENT_FIELD_NUMBER = 5;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object parent_ = "";
+        private volatile java.lang.Object parent_;
 
         /**
          * string parent = 5;
@@ -17306,17 +18029,17 @@ public final class ContextOuterClass {
             if (componentUuid_ != null) {
                 output.writeMessage(1, getComponentUuid());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(type_)) {
+            if (!getTypeBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 3, type_);
             }
             com.google.protobuf.GeneratedMessageV3.serializeStringMapTo(output, internalGetAttributes(), AttributesDefaultEntryHolder.defaultEntry, 4);
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(parent_)) {
+            if (!getParentBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 5, parent_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -17328,20 +18051,20 @@ public final class ContextOuterClass {
             if (componentUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getComponentUuid());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(type_)) {
+            if (!getTypeBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, type_);
             }
             for (java.util.Map.Entry entry : internalGetAttributes().getMap().entrySet()) {
                 com.google.protobuf.MapEntry attributes__ = AttributesDefaultEntryHolder.defaultEntry.newBuilderForType().setKey(entry.getKey()).setValue(entry.getValue()).build();
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, attributes__);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(parent_)) {
+            if (!getParentBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, parent_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -17369,7 +18092,7 @@ public final class ContextOuterClass {
                 return false;
             if (!getParent().equals(other.getParent()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -17395,7 +18118,7 @@ public final class ContextOuterClass {
             }
             hash = (37 * hash) + PARENT_FIELD_NUMBER;
             hash = (53 * hash) + getParent().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -17513,19 +18236,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Component.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                componentUuid_ = null;
-                if (componentUuidBuilder_ != null) {
-                    componentUuidBuilder_.dispose();
+                if (componentUuidBuilder_ == null) {
+                    componentUuid_ = null;
+                } else {
+                    componentUuid_ = null;
                     componentUuidBuilder_ = null;
                 }
                 name_ = "";
@@ -17557,31 +18287,49 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Component buildPartial() {
                 context.ContextOuterClass.Component result = new context.ContextOuterClass.Component(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (componentUuidBuilder_ == null) {
+                    result.componentUuid_ = componentUuid_;
+                } else {
+                    result.componentUuid_ = componentUuidBuilder_.build();
                 }
+                result.name_ = name_;
+                result.type_ = type_;
+                result.attributes_ = internalGetAttributes();
+                result.attributes_.makeImmutable();
+                result.parent_ = parent_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Component result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.componentUuid_ = componentUuidBuilder_ == null ? componentUuid_ : componentUuidBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.type_ = type_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.attributes_ = internalGetAttributes();
-                    result.attributes_.makeImmutable();
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.parent_ = parent_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -17602,22 +18350,18 @@ public final class ContextOuterClass {
                 }
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (!other.getType().isEmpty()) {
                     type_ = other.type_;
-                    bitField0_ |= 0x00000004;
                     onChanged();
                 }
                 internalGetMutableAttributes().mergeFrom(other.internalGetAttributes());
-                bitField0_ |= 0x00000008;
                 if (!other.getParent().isEmpty()) {
                     parent_ = other.parent_;
-                    bitField0_ |= 0x00000010;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -17629,71 +18373,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Component parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getComponentUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    type_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    com.google.protobuf.MapEntry attributes__ = input.readMessage(AttributesDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
-                                    internalGetMutableAttributes().getMutableMap().put(attributes__.getKey(), attributes__.getValue());
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    parent_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 42
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Component) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -17708,7 +18398,7 @@ public final class ContextOuterClass {
              * @return Whether the componentUuid field is set.
              */
             public boolean hasComponentUuid() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return componentUuidBuilder_ != null || componentUuid_ != null;
             }
 
             /**
@@ -17732,11 +18422,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     componentUuid_ = value;
+                    onChanged();
                 } else {
                     componentUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -17746,11 +18435,10 @@ public final class ContextOuterClass {
             public Builder setComponentUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (componentUuidBuilder_ == null) {
                     componentUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     componentUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -17759,16 +18447,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeComponentUuid(context.ContextOuterClass.Uuid value) {
                 if (componentUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && componentUuid_ != null && componentUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getComponentUuidBuilder().mergeFrom(value);
+                    if (componentUuid_ != null) {
+                        componentUuid_ = context.ContextOuterClass.Uuid.newBuilder(componentUuid_).mergeFrom(value).buildPartial();
                     } else {
                         componentUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     componentUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -17776,13 +18463,13 @@ public final class ContextOuterClass {
              * .context.Uuid component_uuid = 1;
              */
             public Builder clearComponentUuid() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                componentUuid_ = null;
-                if (componentUuidBuilder_ != null) {
-                    componentUuidBuilder_.dispose();
+                if (componentUuidBuilder_ == null) {
+                    componentUuid_ = null;
+                    onChanged();
+                } else {
+                    componentUuid_ = null;
                     componentUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -17790,7 +18477,6 @@ public final class ContextOuterClass {
              * .context.Uuid component_uuid = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getComponentUuidBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getComponentUuidFieldBuilder().getBuilder();
             }
@@ -17860,7 +18546,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -17871,7 +18556,6 @@ public final class ContextOuterClass {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -17887,7 +18571,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -17935,7 +18618,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 type_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -17946,7 +18628,6 @@ public final class ContextOuterClass {
              */
             public Builder clearType() {
                 type_ = getDefaultInstance().getType();
-                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -17962,7 +18643,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 type_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -17977,14 +18657,14 @@ public final class ContextOuterClass {
             }
 
             private com.google.protobuf.MapField internalGetMutableAttributes() {
+                onChanged();
+                ;
                 if (attributes_ == null) {
                     attributes_ = com.google.protobuf.MapField.newMapField(AttributesDefaultEntryHolder.defaultEntry);
                 }
                 if (!attributes_.isMutable()) {
                     attributes_ = attributes_.copy();
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return attributes_;
             }
 
@@ -18002,7 +18682,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public boolean containsAttributes(java.lang.String key) {
                 if (key == null) {
-                    throw new NullPointerException("map key");
+                    throw new java.lang.NullPointerException();
                 }
                 return internalGetAttributes().getMap().containsKey(key);
             }
@@ -18036,11 +18716,9 @@ public final class ContextOuterClass {
              * map<string, string> attributes = 4;
              */
             @java.lang.Override
-            public /* nullable */
-            java.lang.String getAttributesOrDefault(java.lang.String key, /* nullable */
-            java.lang.String defaultValue) {
+            public java.lang.String getAttributesOrDefault(java.lang.String key, java.lang.String defaultValue) {
                 if (key == null) {
-                    throw new NullPointerException("map key");
+                    throw new java.lang.NullPointerException();
                 }
                 java.util.Map map = internalGetAttributes().getMap();
                 return map.containsKey(key) ? map.get(key) : defaultValue;
@@ -18056,7 +18734,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public java.lang.String getAttributesOrThrow(java.lang.String key) {
                 if (key == null) {
-                    throw new NullPointerException("map key");
+                    throw new java.lang.NullPointerException();
                 }
                 java.util.Map map = internalGetAttributes().getMap();
                 if (!map.containsKey(key)) {
@@ -18066,7 +18744,6 @@ public final class ContextOuterClass {
             }
 
             public Builder clearAttributes() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 internalGetMutableAttributes().getMutableMap().clear();
                 return this;
             }
@@ -18080,7 +18757,7 @@ public final class ContextOuterClass {
              */
             public Builder removeAttributes(java.lang.String key) {
                 if (key == null) {
-                    throw new NullPointerException("map key");
+                    throw new java.lang.NullPointerException();
                 }
                 internalGetMutableAttributes().getMutableMap().remove(key);
                 return this;
@@ -18091,7 +18768,6 @@ public final class ContextOuterClass {
              */
             @java.lang.Deprecated
             public java.util.Map getMutableAttributes() {
-                bitField0_ |= 0x00000008;
                 return internalGetMutableAttributes().getMutableMap();
             }
 
@@ -18104,13 +18780,12 @@ public final class ContextOuterClass {
              */
             public Builder putAttributes(java.lang.String key, java.lang.String value) {
                 if (key == null) {
-                    throw new NullPointerException("map key");
+                    throw new java.lang.NullPointerException();
                 }
                 if (value == null) {
-                    throw new NullPointerException("map value");
+                    throw new java.lang.NullPointerException();
                 }
                 internalGetMutableAttributes().getMutableMap().put(key, value);
-                bitField0_ |= 0x00000008;
                 return this;
             }
 
@@ -18123,7 +18798,6 @@ public final class ContextOuterClass {
              */
             public Builder putAllAttributes(java.util.Map values) {
                 internalGetMutableAttributes().getMutableMap().putAll(values);
-                bitField0_ |= 0x00000008;
                 return this;
             }
 
@@ -18170,7 +18844,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 parent_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -18181,7 +18854,6 @@ public final class ContextOuterClass {
              */
             public Builder clearParent() {
                 parent_ = getDefaultInstance().getParent();
-                bitField0_ = (bitField0_ & ~0x00000010);
                 onChanged();
                 return this;
             }
@@ -18197,7 +18869,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 parent_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -18229,17 +18900,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Component parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Component(input, extensionRegistry);
             }
         };
 
@@ -18310,6 +18971,57 @@ public final class ContextOuterClass {
             return new DeviceConfig();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceConfig(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    configRules_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                configRules_.add(input.readMessage(context.ContextOuterClass.ConfigRule.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    configRules_ = java.util.Collections.unmodifiableList(configRules_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_DeviceConfig_descriptor;
         }
@@ -18321,7 +19033,6 @@ public final class ContextOuterClass {
 
         public static final int CONFIG_RULES_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List configRules_;
 
         /**
@@ -18382,7 +19093,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < configRules_.size(); i++) {
                 output.writeMessage(1, configRules_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -18394,7 +19105,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < configRules_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, configRules_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -18410,7 +19121,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.DeviceConfig other = (context.ContextOuterClass.DeviceConfig) obj;
             if (!getConfigRulesList().equals(other.getConfigRulesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -18426,7 +19137,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONFIG_RULES_FIELD_NUMBER;
                 hash = (53 * hash) + getConfigRulesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -18520,23 +19231,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.DeviceConfig.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getConfigRulesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (configRulesBuilder_ == null) {
                     configRules_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    configRules_ = null;
                     configRulesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -18562,15 +19279,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.DeviceConfig buildPartial() {
                 context.ContextOuterClass.DeviceConfig result = new context.ContextOuterClass.DeviceConfig(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.DeviceConfig result) {
+                int from_bitField0_ = bitField0_;
                 if (configRulesBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         configRules_ = java.util.Collections.unmodifiableList(configRules_);
@@ -18580,10 +19289,38 @@ public final class ContextOuterClass {
                 } else {
                     result.configRules_ = configRulesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.DeviceConfig result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -18623,7 +19360,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -18635,47 +19372,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.DeviceConfig parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.ConfigRule m = input.readMessage(context.ContextOuterClass.ConfigRule.parser(), extensionRegistry);
-                                    if (configRulesBuilder_ == null) {
-                                        ensureConfigRulesIsMutable();
-                                        configRules_.add(m);
-                                    } else {
-                                        configRulesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.DeviceConfig) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -18945,17 +19652,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public DeviceConfig parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceConfig(input, extensionRegistry);
             }
         };
 
@@ -19026,6 +19723,57 @@ public final class ContextOuterClass {
             return new DeviceIdList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    deviceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                deviceIds_.add(input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    deviceIds_ = java.util.Collections.unmodifiableList(deviceIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_DeviceIdList_descriptor;
         }
@@ -19037,7 +19785,6 @@ public final class ContextOuterClass {
 
         public static final int DEVICE_IDS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List deviceIds_;
 
         /**
@@ -19098,7 +19845,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < deviceIds_.size(); i++) {
                 output.writeMessage(1, deviceIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -19110,7 +19857,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < deviceIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, deviceIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -19126,7 +19873,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.DeviceIdList other = (context.ContextOuterClass.DeviceIdList) obj;
             if (!getDeviceIdsList().equals(other.getDeviceIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -19142,7 +19889,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + DEVICE_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getDeviceIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -19236,23 +19983,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.DeviceIdList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getDeviceIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (deviceIdsBuilder_ == null) {
                     deviceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    deviceIds_ = null;
                     deviceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -19278,15 +20031,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.DeviceIdList buildPartial() {
                 context.ContextOuterClass.DeviceIdList result = new context.ContextOuterClass.DeviceIdList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.DeviceIdList result) {
+                int from_bitField0_ = bitField0_;
                 if (deviceIdsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         deviceIds_ = java.util.Collections.unmodifiableList(deviceIds_);
@@ -19296,10 +20041,38 @@ public final class ContextOuterClass {
                 } else {
                     result.deviceIds_ = deviceIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.DeviceIdList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -19339,7 +20112,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -19351,47 +20124,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.DeviceIdList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.DeviceId m = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
-                                    if (deviceIdsBuilder_ == null) {
-                                        ensureDeviceIdsIsMutable();
-                                        deviceIds_.add(m);
-                                    } else {
-                                        deviceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.DeviceIdList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -19661,17 +20404,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public DeviceIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceIdList(input, extensionRegistry);
             }
         };
 
@@ -19742,6 +20475,57 @@ public final class ContextOuterClass {
             return new DeviceList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    devices_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                devices_.add(input.readMessage(context.ContextOuterClass.Device.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    devices_ = java.util.Collections.unmodifiableList(devices_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_DeviceList_descriptor;
         }
@@ -19753,7 +20537,6 @@ public final class ContextOuterClass {
 
         public static final int DEVICES_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List devices_;
 
         /**
@@ -19814,7 +20597,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < devices_.size(); i++) {
                 output.writeMessage(1, devices_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -19826,7 +20609,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < devices_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, devices_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -19842,7 +20625,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.DeviceList other = (context.ContextOuterClass.DeviceList) obj;
             if (!getDevicesList().equals(other.getDevicesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -19858,7 +20641,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + DEVICES_FIELD_NUMBER;
                 hash = (53 * hash) + getDevicesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -19952,23 +20735,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.DeviceList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getDevicesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (devicesBuilder_ == null) {
                     devices_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    devices_ = null;
                     devicesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -19994,15 +20783,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.DeviceList buildPartial() {
                 context.ContextOuterClass.DeviceList result = new context.ContextOuterClass.DeviceList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.DeviceList result) {
+                int from_bitField0_ = bitField0_;
                 if (devicesBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         devices_ = java.util.Collections.unmodifiableList(devices_);
@@ -20012,10 +20793,38 @@ public final class ContextOuterClass {
                 } else {
                     result.devices_ = devicesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.DeviceList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -20055,7 +20864,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -20067,47 +20876,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.DeviceList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.Device m = input.readMessage(context.ContextOuterClass.Device.parser(), extensionRegistry);
-                                    if (devicesBuilder_ == null) {
-                                        ensureDevicesIsMutable();
-                                        devices_.add(m);
-                                    } else {
-                                        devicesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.DeviceList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -20377,17 +21156,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public DeviceList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceList(input, extensionRegistry);
             }
         };
 
@@ -20467,6 +21236,72 @@ public final class ContextOuterClass {
             return new DeviceFilter();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceFilter(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.DeviceIdList.Builder subBuilder = null;
+                                if (deviceIds_ != null) {
+                                    subBuilder = deviceIds_.toBuilder();
+                                }
+                                deviceIds_ = input.readMessage(context.ContextOuterClass.DeviceIdList.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(deviceIds_);
+                                    deviceIds_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 16:
+                            {
+                                includeEndpoints_ = input.readBool();
+                                break;
+                            }
+                        case 24:
+                            {
+                                includeConfigRules_ = input.readBool();
+                                break;
+                            }
+                        case 32:
+                            {
+                                includeComponents_ = input.readBool();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_DeviceFilter_descriptor;
         }
@@ -20503,12 +21338,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.DeviceIdListOrBuilder getDeviceIdsOrBuilder() {
-            return deviceIds_ == null ? context.ContextOuterClass.DeviceIdList.getDefaultInstance() : deviceIds_;
+            return getDeviceIds();
         }
 
         public static final int INCLUDE_ENDPOINTS_FIELD_NUMBER = 2;
 
-        private boolean includeEndpoints_ = false;
+        private boolean includeEndpoints_;
 
         /**
          * bool include_endpoints = 2;
@@ -20521,7 +21356,7 @@ public final class ContextOuterClass {
 
         public static final int INCLUDE_CONFIG_RULES_FIELD_NUMBER = 3;
 
-        private boolean includeConfigRules_ = false;
+        private boolean includeConfigRules_;
 
         /**
          * bool include_config_rules = 3;
@@ -20534,7 +21369,7 @@ public final class ContextOuterClass {
 
         public static final int INCLUDE_COMPONENTS_FIELD_NUMBER = 4;
 
-        private boolean includeComponents_ = false;
+        private boolean includeComponents_;
 
         /**
          * bool include_components = 4;
@@ -20572,7 +21407,7 @@ public final class ContextOuterClass {
             if (includeComponents_ != false) {
                 output.writeBool(4, includeComponents_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -20593,7 +21428,7 @@ public final class ContextOuterClass {
             if (includeComponents_ != false) {
                 size += com.google.protobuf.CodedOutputStream.computeBoolSize(4, includeComponents_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -20619,7 +21454,7 @@ public final class ContextOuterClass {
                 return false;
             if (getIncludeComponents() != other.getIncludeComponents())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -20641,7 +21476,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeConfigRules());
             hash = (37 * hash) + INCLUDE_COMPONENTS_FIELD_NUMBER;
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeComponents());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -20735,19 +21570,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.DeviceFilter.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                deviceIds_ = null;
-                if (deviceIdsBuilder_ != null) {
-                    deviceIdsBuilder_.dispose();
+                if (deviceIdsBuilder_ == null) {
+                    deviceIds_ = null;
+                } else {
+                    deviceIds_ = null;
                     deviceIdsBuilder_ = null;
                 }
                 includeEndpoints_ = false;
@@ -20778,27 +21620,46 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.DeviceFilter buildPartial() {
                 context.ContextOuterClass.DeviceFilter result = new context.ContextOuterClass.DeviceFilter(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (deviceIdsBuilder_ == null) {
+                    result.deviceIds_ = deviceIds_;
+                } else {
+                    result.deviceIds_ = deviceIdsBuilder_.build();
                 }
+                result.includeEndpoints_ = includeEndpoints_;
+                result.includeConfigRules_ = includeConfigRules_;
+                result.includeComponents_ = includeComponents_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.DeviceFilter result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.deviceIds_ = deviceIdsBuilder_ == null ? deviceIds_ : deviceIdsBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.includeEndpoints_ = includeEndpoints_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.includeConfigRules_ = includeConfigRules_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.includeComponents_ = includeComponents_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -20826,7 +21687,7 @@ public final class ContextOuterClass {
                 if (other.getIncludeComponents() != false) {
                     setIncludeComponents(other.getIncludeComponents());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -20838,68 +21699,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.DeviceFilter parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getDeviceIdsFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 16:
-                                {
-                                    includeEndpoints_ = input.readBool();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            case 24:
-                                {
-                                    includeConfigRules_ = input.readBool();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 32:
-                                {
-                                    includeComponents_ = input.readBool();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 32
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.DeviceFilter) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.DeviceIdList deviceIds_;
 
             private com.google.protobuf.SingleFieldBuilderV3 deviceIdsBuilder_;
@@ -20909,7 +21722,7 @@ public final class ContextOuterClass {
              * @return Whether the deviceIds field is set.
              */
             public boolean hasDeviceIds() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return deviceIdsBuilder_ != null || deviceIds_ != null;
             }
 
             /**
@@ -20933,11 +21746,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     deviceIds_ = value;
+                    onChanged();
                 } else {
                     deviceIdsBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -20947,11 +21759,10 @@ public final class ContextOuterClass {
             public Builder setDeviceIds(context.ContextOuterClass.DeviceIdList.Builder builderForValue) {
                 if (deviceIdsBuilder_ == null) {
                     deviceIds_ = builderForValue.build();
+                    onChanged();
                 } else {
                     deviceIdsBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -20960,16 +21771,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeDeviceIds(context.ContextOuterClass.DeviceIdList value) {
                 if (deviceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && deviceIds_ != null && deviceIds_ != context.ContextOuterClass.DeviceIdList.getDefaultInstance()) {
-                        getDeviceIdsBuilder().mergeFrom(value);
+                    if (deviceIds_ != null) {
+                        deviceIds_ = context.ContextOuterClass.DeviceIdList.newBuilder(deviceIds_).mergeFrom(value).buildPartial();
                     } else {
                         deviceIds_ = value;
                     }
+                    onChanged();
                 } else {
                     deviceIdsBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -20977,13 +21787,13 @@ public final class ContextOuterClass {
              * .context.DeviceIdList device_ids = 1;
              */
             public Builder clearDeviceIds() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                deviceIds_ = null;
-                if (deviceIdsBuilder_ != null) {
-                    deviceIdsBuilder_.dispose();
+                if (deviceIdsBuilder_ == null) {
+                    deviceIds_ = null;
+                    onChanged();
+                } else {
+                    deviceIds_ = null;
                     deviceIdsBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -20991,7 +21801,6 @@ public final class ContextOuterClass {
              * .context.DeviceIdList device_ids = 1;
              */
             public context.ContextOuterClass.DeviceIdList.Builder getDeviceIdsBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getDeviceIdsFieldBuilder().getBuilder();
             }
@@ -21036,7 +21845,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeEndpoints(boolean value) {
                 includeEndpoints_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -21046,7 +21854,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeEndpoints() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 includeEndpoints_ = false;
                 onChanged();
                 return this;
@@ -21070,7 +21877,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeConfigRules(boolean value) {
                 includeConfigRules_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -21080,7 +21886,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeConfigRules() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 includeConfigRules_ = false;
                 onChanged();
                 return this;
@@ -21104,7 +21909,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeComponents(boolean value) {
                 includeComponents_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -21114,7 +21918,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeComponents() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 includeComponents_ = false;
                 onChanged();
                 return this;
@@ -21147,17 +21950,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public DeviceFilter parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceFilter(input, extensionRegistry);
             }
         };
 
@@ -21253,6 +22046,83 @@ public final class ContextOuterClass {
             return new DeviceEvent();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceEvent(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Event.Builder subBuilder = null;
+                                if (event_ != null) {
+                                    subBuilder = event_.toBuilder();
+                                }
+                                event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(event_);
+                                    event_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.DeviceId.Builder subBuilder = null;
+                                if (deviceId_ != null) {
+                                    subBuilder = deviceId_.toBuilder();
+                                }
+                                deviceId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(deviceId_);
+                                    deviceId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 26:
+                            {
+                                context.ContextOuterClass.DeviceConfig.Builder subBuilder = null;
+                                if (deviceConfig_ != null) {
+                                    subBuilder = deviceConfig_.toBuilder();
+                                }
+                                deviceConfig_ = input.readMessage(context.ContextOuterClass.DeviceConfig.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(deviceConfig_);
+                                    deviceConfig_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_DeviceEvent_descriptor;
         }
@@ -21289,7 +22159,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-            return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+            return getEvent();
         }
 
         public static final int DEVICE_ID_FIELD_NUMBER = 2;
@@ -21319,7 +22189,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() {
-            return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
+            return getDeviceId();
         }
 
         public static final int DEVICE_CONFIG_FIELD_NUMBER = 3;
@@ -21349,7 +22219,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.DeviceConfigOrBuilder getDeviceConfigOrBuilder() {
-            return deviceConfig_ == null ? context.ContextOuterClass.DeviceConfig.getDefaultInstance() : deviceConfig_;
+            return getDeviceConfig();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -21376,7 +22246,7 @@ public final class ContextOuterClass {
             if (deviceConfig_ != null) {
                 output.writeMessage(3, getDeviceConfig());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -21394,7 +22264,7 @@ public final class ContextOuterClass {
             if (deviceConfig_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getDeviceConfig());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -21426,7 +22296,7 @@ public final class ContextOuterClass {
                 if (!getDeviceConfig().equals(other.getDeviceConfig()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -21450,7 +22320,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + DEVICE_CONFIG_FIELD_NUMBER;
                 hash = (53 * hash) + getDeviceConfig().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -21544,29 +22414,38 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.DeviceEvent.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                deviceId_ = null;
-                if (deviceIdBuilder_ != null) {
-                    deviceIdBuilder_.dispose();
+                if (deviceIdBuilder_ == null) {
+                    deviceId_ = null;
+                } else {
+                    deviceId_ = null;
                     deviceIdBuilder_ = null;
                 }
-                deviceConfig_ = null;
-                if (deviceConfigBuilder_ != null) {
-                    deviceConfigBuilder_.dispose();
+                if (deviceConfigBuilder_ == null) {
+                    deviceConfig_ = null;
+                } else {
+                    deviceConfig_ = null;
                     deviceConfigBuilder_ = null;
                 }
                 return this;
@@ -21594,24 +22473,53 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.DeviceEvent buildPartial() {
                 context.ContextOuterClass.DeviceEvent result = new context.ContextOuterClass.DeviceEvent(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (eventBuilder_ == null) {
+                    result.event_ = event_;
+                } else {
+                    result.event_ = eventBuilder_.build();
+                }
+                if (deviceIdBuilder_ == null) {
+                    result.deviceId_ = deviceId_;
+                } else {
+                    result.deviceId_ = deviceIdBuilder_.build();
+                }
+                if (deviceConfigBuilder_ == null) {
+                    result.deviceConfig_ = deviceConfig_;
+                } else {
+                    result.deviceConfig_ = deviceConfigBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.DeviceEvent result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.event_ = eventBuilder_ == null ? event_ : eventBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.deviceId_ = deviceIdBuilder_ == null ? deviceId_ : deviceIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.deviceConfig_ = deviceConfigBuilder_ == null ? deviceConfig_ : deviceConfigBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -21636,7 +22544,7 @@ public final class ContextOuterClass {
                 if (other.hasDeviceConfig()) {
                     mergeDeviceConfig(other.getDeviceConfig());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -21648,61 +22556,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.DeviceEvent parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEventFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getDeviceIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getDeviceConfigFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.DeviceEvent) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Event event_;
 
             private com.google.protobuf.SingleFieldBuilderV3 eventBuilder_;
@@ -21712,7 +22579,7 @@ public final class ContextOuterClass {
              * @return Whether the event field is set.
              */
             public boolean hasEvent() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return eventBuilder_ != null || event_ != null;
             }
 
             /**
@@ -21736,11 +22603,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     event_ = value;
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -21750,11 +22616,10 @@ public final class ContextOuterClass {
             public Builder setEvent(context.ContextOuterClass.Event.Builder builderForValue) {
                 if (eventBuilder_ == null) {
                     event_ = builderForValue.build();
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -21763,16 +22628,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEvent(context.ContextOuterClass.Event value) {
                 if (eventBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && event_ != null && event_ != context.ContextOuterClass.Event.getDefaultInstance()) {
-                        getEventBuilder().mergeFrom(value);
+                    if (event_ != null) {
+                        event_ = context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
                     } else {
                         event_ = value;
                     }
+                    onChanged();
                 } else {
                     eventBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -21780,13 +22644,13 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public Builder clearEvent() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                    onChanged();
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -21794,7 +22658,6 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public context.ContextOuterClass.Event.Builder getEventBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEventFieldBuilder().getBuilder();
             }
@@ -21830,7 +22693,7 @@ public final class ContextOuterClass {
              * @return Whether the deviceId field is set.
              */
             public boolean hasDeviceId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return deviceIdBuilder_ != null || deviceId_ != null;
             }
 
             /**
@@ -21854,11 +22717,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     deviceId_ = value;
+                    onChanged();
                 } else {
                     deviceIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -21868,11 +22730,10 @@ public final class ContextOuterClass {
             public Builder setDeviceId(context.ContextOuterClass.DeviceId.Builder builderForValue) {
                 if (deviceIdBuilder_ == null) {
                     deviceId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     deviceIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -21881,16 +22742,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeDeviceId(context.ContextOuterClass.DeviceId value) {
                 if (deviceIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && deviceId_ != null && deviceId_ != context.ContextOuterClass.DeviceId.getDefaultInstance()) {
-                        getDeviceIdBuilder().mergeFrom(value);
+                    if (deviceId_ != null) {
+                        deviceId_ = context.ContextOuterClass.DeviceId.newBuilder(deviceId_).mergeFrom(value).buildPartial();
                     } else {
                         deviceId_ = value;
                     }
+                    onChanged();
                 } else {
                     deviceIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -21898,13 +22758,13 @@ public final class ContextOuterClass {
              * .context.DeviceId device_id = 2;
              */
             public Builder clearDeviceId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                deviceId_ = null;
-                if (deviceIdBuilder_ != null) {
-                    deviceIdBuilder_.dispose();
+                if (deviceIdBuilder_ == null) {
+                    deviceId_ = null;
+                    onChanged();
+                } else {
+                    deviceId_ = null;
                     deviceIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -21912,7 +22772,6 @@ public final class ContextOuterClass {
              * .context.DeviceId device_id = 2;
              */
             public context.ContextOuterClass.DeviceId.Builder getDeviceIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getDeviceIdFieldBuilder().getBuilder();
             }
@@ -21948,7 +22807,7 @@ public final class ContextOuterClass {
              * @return Whether the deviceConfig field is set.
              */
             public boolean hasDeviceConfig() {
-                return ((bitField0_ & 0x00000004) != 0);
+                return deviceConfigBuilder_ != null || deviceConfig_ != null;
             }
 
             /**
@@ -21972,11 +22831,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     deviceConfig_ = value;
+                    onChanged();
                 } else {
                     deviceConfigBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -21986,11 +22844,10 @@ public final class ContextOuterClass {
             public Builder setDeviceConfig(context.ContextOuterClass.DeviceConfig.Builder builderForValue) {
                 if (deviceConfigBuilder_ == null) {
                     deviceConfig_ = builderForValue.build();
+                    onChanged();
                 } else {
                     deviceConfigBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -21999,16 +22856,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeDeviceConfig(context.ContextOuterClass.DeviceConfig value) {
                 if (deviceConfigBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0) && deviceConfig_ != null && deviceConfig_ != context.ContextOuterClass.DeviceConfig.getDefaultInstance()) {
-                        getDeviceConfigBuilder().mergeFrom(value);
+                    if (deviceConfig_ != null) {
+                        deviceConfig_ = context.ContextOuterClass.DeviceConfig.newBuilder(deviceConfig_).mergeFrom(value).buildPartial();
                     } else {
                         deviceConfig_ = value;
                     }
+                    onChanged();
                 } else {
                     deviceConfigBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -22016,13 +22872,13 @@ public final class ContextOuterClass {
              * .context.DeviceConfig device_config = 3;
              */
             public Builder clearDeviceConfig() {
-                bitField0_ = (bitField0_ & ~0x00000004);
-                deviceConfig_ = null;
-                if (deviceConfigBuilder_ != null) {
-                    deviceConfigBuilder_.dispose();
+                if (deviceConfigBuilder_ == null) {
+                    deviceConfig_ = null;
+                    onChanged();
+                } else {
+                    deviceConfig_ = null;
                     deviceConfigBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -22030,7 +22886,6 @@ public final class ContextOuterClass {
              * .context.DeviceConfig device_config = 3;
              */
             public context.ContextOuterClass.DeviceConfig.Builder getDeviceConfigBuilder() {
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return getDeviceConfigFieldBuilder().getBuilder();
             }
@@ -22084,17 +22939,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public DeviceEvent parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceEvent(input, extensionRegistry);
             }
         };
 
@@ -22160,6 +23005,57 @@ public final class ContextOuterClass {
             return new LinkId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private LinkId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (linkUuid_ != null) {
+                                    subBuilder = linkUuid_.toBuilder();
+                                }
+                                linkUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(linkUuid_);
+                                    linkUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_LinkId_descriptor;
         }
@@ -22196,7 +23092,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getLinkUuidOrBuilder() {
-            return linkUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : linkUuid_;
+            return getLinkUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -22217,7 +23113,7 @@ public final class ContextOuterClass {
             if (linkUuid_ != null) {
                 output.writeMessage(1, getLinkUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -22229,7 +23125,7 @@ public final class ContextOuterClass {
             if (linkUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getLinkUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -22249,7 +23145,7 @@ public final class ContextOuterClass {
                 if (!getLinkUuid().equals(other.getLinkUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -22265,7 +23161,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + LINK_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getLinkUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -22363,19 +23259,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.LinkId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                linkUuid_ = null;
-                if (linkUuidBuilder_ != null) {
-                    linkUuidBuilder_.dispose();
+                if (linkUuidBuilder_ == null) {
+                    linkUuid_ = null;
+                } else {
+                    linkUuid_ = null;
                     linkUuidBuilder_ = null;
                 }
                 return this;
@@ -22403,18 +23306,43 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.LinkId buildPartial() {
                 context.ContextOuterClass.LinkId result = new context.ContextOuterClass.LinkId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (linkUuidBuilder_ == null) {
+                    result.linkUuid_ = linkUuid_;
+                } else {
+                    result.linkUuid_ = linkUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.LinkId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.linkUuid_ = linkUuidBuilder_ == null ? linkUuid_ : linkUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -22433,7 +23361,7 @@ public final class ContextOuterClass {
                 if (other.hasLinkUuid()) {
                     mergeLinkUuid(other.getLinkUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -22445,47 +23373,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.LinkId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getLinkUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.LinkId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid linkUuid_;
 
             private com.google.protobuf.SingleFieldBuilderV3 linkUuidBuilder_;
@@ -22495,7 +23396,7 @@ public final class ContextOuterClass {
              * @return Whether the linkUuid field is set.
              */
             public boolean hasLinkUuid() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return linkUuidBuilder_ != null || linkUuid_ != null;
             }
 
             /**
@@ -22519,11 +23420,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     linkUuid_ = value;
+                    onChanged();
                 } else {
                     linkUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -22533,11 +23433,10 @@ public final class ContextOuterClass {
             public Builder setLinkUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (linkUuidBuilder_ == null) {
                     linkUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     linkUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -22546,16 +23445,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeLinkUuid(context.ContextOuterClass.Uuid value) {
                 if (linkUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && linkUuid_ != null && linkUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getLinkUuidBuilder().mergeFrom(value);
+                    if (linkUuid_ != null) {
+                        linkUuid_ = context.ContextOuterClass.Uuid.newBuilder(linkUuid_).mergeFrom(value).buildPartial();
                     } else {
                         linkUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     linkUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -22563,13 +23461,13 @@ public final class ContextOuterClass {
              * .context.Uuid link_uuid = 1;
              */
             public Builder clearLinkUuid() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                linkUuid_ = null;
-                if (linkUuidBuilder_ != null) {
-                    linkUuidBuilder_.dispose();
+                if (linkUuidBuilder_ == null) {
+                    linkUuid_ = null;
+                    onChanged();
+                } else {
+                    linkUuid_ = null;
                     linkUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -22577,7 +23475,6 @@ public final class ContextOuterClass {
              * .context.Uuid link_uuid = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getLinkUuidBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getLinkUuidFieldBuilder().getBuilder();
             }
@@ -22631,17 +23528,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public LinkId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new LinkId(input, extensionRegistry);
             }
         };
 
@@ -22698,6 +23585,54 @@ public final class ContextOuterClass {
             return new LinkAttributes();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private LinkAttributes(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 13:
+                            {
+                                totalCapacityGbps_ = input.readFloat();
+                                break;
+                            }
+                        case 21:
+                            {
+                                usedCapacityGbps_ = input.readFloat();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_LinkAttributes_descriptor;
         }
@@ -22709,7 +23644,7 @@ public final class ContextOuterClass {
 
         public static final int TOTAL_CAPACITY_GBPS_FIELD_NUMBER = 1;
 
-        private float totalCapacityGbps_ = 0F;
+        private float totalCapacityGbps_;
 
         /**
          * float total_capacity_gbps = 1;
@@ -22722,7 +23657,7 @@ public final class ContextOuterClass {
 
         public static final int USED_CAPACITY_GBPS_FIELD_NUMBER = 2;
 
-        private float usedCapacityGbps_ = 0F;
+        private float usedCapacityGbps_;
 
         /**
          * float used_capacity_gbps = 2;
@@ -22748,13 +23683,13 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (java.lang.Float.floatToRawIntBits(totalCapacityGbps_) != 0) {
+            if (totalCapacityGbps_ != 0F) {
                 output.writeFloat(1, totalCapacityGbps_);
             }
-            if (java.lang.Float.floatToRawIntBits(usedCapacityGbps_) != 0) {
+            if (usedCapacityGbps_ != 0F) {
                 output.writeFloat(2, usedCapacityGbps_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -22763,13 +23698,13 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (java.lang.Float.floatToRawIntBits(totalCapacityGbps_) != 0) {
+            if (totalCapacityGbps_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, totalCapacityGbps_);
             }
-            if (java.lang.Float.floatToRawIntBits(usedCapacityGbps_) != 0) {
+            if (usedCapacityGbps_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(2, usedCapacityGbps_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -22787,7 +23722,7 @@ public final class ContextOuterClass {
                 return false;
             if (java.lang.Float.floatToIntBits(getUsedCapacityGbps()) != java.lang.Float.floatToIntBits(other.getUsedCapacityGbps()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -22803,7 +23738,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getTotalCapacityGbps());
             hash = (37 * hash) + USED_CAPACITY_GBPS_FIELD_NUMBER;
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getUsedCapacityGbps());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -22897,16 +23832,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.LinkAttributes.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 totalCapacityGbps_ = 0F;
                 usedCapacityGbps_ = 0F;
                 return this;
@@ -22934,21 +23875,40 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.LinkAttributes buildPartial() {
                 context.ContextOuterClass.LinkAttributes result = new context.ContextOuterClass.LinkAttributes(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.totalCapacityGbps_ = totalCapacityGbps_;
+                result.usedCapacityGbps_ = usedCapacityGbps_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.LinkAttributes result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.totalCapacityGbps_ = totalCapacityGbps_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.usedCapacityGbps_ = usedCapacityGbps_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -22970,7 +23930,7 @@ public final class ContextOuterClass {
                 if (other.getUsedCapacityGbps() != 0F) {
                     setUsedCapacityGbps(other.getUsedCapacityGbps());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -22982,54 +23942,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.LinkAttributes parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 13:
-                                {
-                                    totalCapacityGbps_ = input.readFloat();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 13
-                            case 21:
-                                {
-                                    usedCapacityGbps_ = input.readFloat();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 21
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.LinkAttributes) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private float totalCapacityGbps_;
 
             /**
@@ -23048,7 +23974,6 @@ public final class ContextOuterClass {
              */
             public Builder setTotalCapacityGbps(float value) {
                 totalCapacityGbps_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -23058,7 +23983,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearTotalCapacityGbps() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 totalCapacityGbps_ = 0F;
                 onChanged();
                 return this;
@@ -23082,7 +24006,6 @@ public final class ContextOuterClass {
              */
             public Builder setUsedCapacityGbps(float value) {
                 usedCapacityGbps_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -23092,7 +24015,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearUsedCapacityGbps() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 usedCapacityGbps_ = 0F;
                 onChanged();
                 return this;
@@ -23125,17 +24047,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public LinkAttributes parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new LinkAttributes(input, extensionRegistry);
             }
         };
 
@@ -23253,6 +24165,89 @@ public final class ContextOuterClass {
             return new Link();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Link(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.LinkId.Builder subBuilder = null;
+                                if (linkId_ != null) {
+                                    subBuilder = linkId_.toBuilder();
+                                }
+                                linkId_ = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(linkId_);
+                                    linkId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    linkEndpointIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                linkEndpointIds_.add(input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 34:
+                            {
+                                context.ContextOuterClass.LinkAttributes.Builder subBuilder = null;
+                                if (attributes_ != null) {
+                                    subBuilder = attributes_.toBuilder();
+                                }
+                                attributes_ = input.readMessage(context.ContextOuterClass.LinkAttributes.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(attributes_);
+                                    attributes_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    linkEndpointIds_ = java.util.Collections.unmodifiableList(linkEndpointIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Link_descriptor;
         }
@@ -23289,13 +24284,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder() {
-            return linkId_ == null ? context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_;
+            return getLinkId();
         }
 
         public static final int NAME_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 2;
@@ -23332,7 +24326,6 @@ public final class ContextOuterClass {
 
         public static final int LINK_ENDPOINT_IDS_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
         private java.util.List linkEndpointIds_;
 
         /**
@@ -23402,7 +24395,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.LinkAttributesOrBuilder getAttributesOrBuilder() {
-            return attributes_ == null ? context.ContextOuterClass.LinkAttributes.getDefaultInstance() : attributes_;
+            return getAttributes();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -23423,7 +24416,7 @@ public final class ContextOuterClass {
             if (linkId_ != null) {
                 output.writeMessage(1, getLinkId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
             }
             for (int i = 0; i < linkEndpointIds_.size(); i++) {
@@ -23432,7 +24425,7 @@ public final class ContextOuterClass {
             if (attributes_ != null) {
                 output.writeMessage(4, getAttributes());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -23444,7 +24437,7 @@ public final class ContextOuterClass {
             if (linkId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getLinkId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
             }
             for (int i = 0; i < linkEndpointIds_.size(); i++) {
@@ -23453,7 +24446,7 @@ public final class ContextOuterClass {
             if (attributes_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, getAttributes());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -23483,7 +24476,7 @@ public final class ContextOuterClass {
                 if (!getAttributes().equals(other.getAttributes()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -23509,7 +24502,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + ATTRIBUTES_FIELD_NUMBER;
                 hash = (53 * hash) + getAttributes().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -23603,32 +24596,40 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Link.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getLinkEndpointIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                linkId_ = null;
-                if (linkIdBuilder_ != null) {
-                    linkIdBuilder_.dispose();
+                if (linkIdBuilder_ == null) {
+                    linkId_ = null;
+                } else {
+                    linkId_ = null;
                     linkIdBuilder_ = null;
                 }
                 name_ = "";
                 if (linkEndpointIdsBuilder_ == null) {
                     linkEndpointIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    linkEndpointIds_ = null;
                     linkEndpointIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000004);
-                attributes_ = null;
-                if (attributesBuilder_ != null) {
-                    attributesBuilder_.dispose();
+                if (attributesBuilder_ == null) {
+                    attributes_ = null;
+                } else {
+                    attributes_ = null;
                     attributesBuilder_ = null;
                 }
                 return this;
@@ -23656,37 +24657,59 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Link buildPartial() {
                 context.ContextOuterClass.Link result = new context.ContextOuterClass.Link(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (linkIdBuilder_ == null) {
+                    result.linkId_ = linkId_;
+                } else {
+                    result.linkId_ = linkIdBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Link result) {
+                result.name_ = name_;
                 if (linkEndpointIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         linkEndpointIds_ = java.util.Collections.unmodifiableList(linkEndpointIds_);
-                        bitField0_ = (bitField0_ & ~0x00000004);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.linkEndpointIds_ = linkEndpointIds_;
                 } else {
                     result.linkEndpointIds_ = linkEndpointIdsBuilder_.build();
                 }
+                if (attributesBuilder_ == null) {
+                    result.attributes_ = attributes_;
+                } else {
+                    result.attributes_ = attributesBuilder_.build();
+                }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Link result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.linkId_ = linkIdBuilder_ == null ? linkId_ : linkIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.attributes_ = attributesBuilder_ == null ? attributes_ : attributesBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -23707,14 +24730,13 @@ public final class ContextOuterClass {
                 }
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (linkEndpointIdsBuilder_ == null) {
                     if (!other.linkEndpointIds_.isEmpty()) {
                         if (linkEndpointIds_.isEmpty()) {
                             linkEndpointIds_ = other.linkEndpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureLinkEndpointIdsIsMutable();
                             linkEndpointIds_.addAll(other.linkEndpointIds_);
@@ -23727,7 +24749,7 @@ public final class ContextOuterClass {
                             linkEndpointIdsBuilder_.dispose();
                             linkEndpointIdsBuilder_ = null;
                             linkEndpointIds_ = other.linkEndpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             linkEndpointIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getLinkEndpointIdsFieldBuilder() : null;
                         } else {
                             linkEndpointIdsBuilder_.addAllMessages(other.linkEndpointIds_);
@@ -23737,7 +24759,7 @@ public final class ContextOuterClass {
                 if (other.hasAttributes()) {
                     mergeAttributes(other.getAttributes());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -23749,68 +24771,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Link parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getLinkIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    context.ContextOuterClass.EndPointId m = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-                                    if (linkEndpointIdsBuilder_ == null) {
-                                        ensureLinkEndpointIdsIsMutable();
-                                        linkEndpointIds_.add(m);
-                                    } else {
-                                        linkEndpointIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    input.readMessage(getAttributesFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 34
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Link) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -23825,7 +24796,7 @@ public final class ContextOuterClass {
              * @return Whether the linkId field is set.
              */
             public boolean hasLinkId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return linkIdBuilder_ != null || linkId_ != null;
             }
 
             /**
@@ -23849,11 +24820,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     linkId_ = value;
+                    onChanged();
                 } else {
                     linkIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -23863,11 +24833,10 @@ public final class ContextOuterClass {
             public Builder setLinkId(context.ContextOuterClass.LinkId.Builder builderForValue) {
                 if (linkIdBuilder_ == null) {
                     linkId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     linkIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -23876,16 +24845,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeLinkId(context.ContextOuterClass.LinkId value) {
                 if (linkIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && linkId_ != null && linkId_ != context.ContextOuterClass.LinkId.getDefaultInstance()) {
-                        getLinkIdBuilder().mergeFrom(value);
+                    if (linkId_ != null) {
+                        linkId_ = context.ContextOuterClass.LinkId.newBuilder(linkId_).mergeFrom(value).buildPartial();
                     } else {
                         linkId_ = value;
                     }
+                    onChanged();
                 } else {
                     linkIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -23893,13 +24861,13 @@ public final class ContextOuterClass {
              * .context.LinkId link_id = 1;
              */
             public Builder clearLinkId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                linkId_ = null;
-                if (linkIdBuilder_ != null) {
-                    linkIdBuilder_.dispose();
+                if (linkIdBuilder_ == null) {
+                    linkId_ = null;
+                    onChanged();
+                } else {
+                    linkId_ = null;
                     linkIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -23907,7 +24875,6 @@ public final class ContextOuterClass {
              * .context.LinkId link_id = 1;
              */
             public context.ContextOuterClass.LinkId.Builder getLinkIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getLinkIdFieldBuilder().getBuilder();
             }
@@ -23977,7 +24944,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -23988,7 +24954,6 @@ public final class ContextOuterClass {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -24004,7 +24969,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -24012,9 +24976,9 @@ public final class ContextOuterClass {
             private java.util.List linkEndpointIds_ = java.util.Collections.emptyList();
 
             private void ensureLinkEndpointIdsIsMutable() {
-                if (!((bitField0_ & 0x00000004) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     linkEndpointIds_ = new java.util.ArrayList(linkEndpointIds_);
-                    bitField0_ |= 0x00000004;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -24166,7 +25130,7 @@ public final class ContextOuterClass {
             public Builder clearLinkEndpointIds() {
                 if (linkEndpointIdsBuilder_ == null) {
                     linkEndpointIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000004);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     linkEndpointIdsBuilder_.clear();
@@ -24240,7 +25204,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getLinkEndpointIdsFieldBuilder() {
                 if (linkEndpointIdsBuilder_ == null) {
-                    linkEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(linkEndpointIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
+                    linkEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(linkEndpointIds_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     linkEndpointIds_ = null;
                 }
                 return linkEndpointIdsBuilder_;
@@ -24255,7 +25219,7 @@ public final class ContextOuterClass {
              * @return Whether the attributes field is set.
              */
             public boolean hasAttributes() {
-                return ((bitField0_ & 0x00000008) != 0);
+                return attributesBuilder_ != null || attributes_ != null;
             }
 
             /**
@@ -24279,11 +25243,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     attributes_ = value;
+                    onChanged();
                 } else {
                     attributesBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -24293,11 +25256,10 @@ public final class ContextOuterClass {
             public Builder setAttributes(context.ContextOuterClass.LinkAttributes.Builder builderForValue) {
                 if (attributesBuilder_ == null) {
                     attributes_ = builderForValue.build();
+                    onChanged();
                 } else {
                     attributesBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -24306,16 +25268,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeAttributes(context.ContextOuterClass.LinkAttributes value) {
                 if (attributesBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0) && attributes_ != null && attributes_ != context.ContextOuterClass.LinkAttributes.getDefaultInstance()) {
-                        getAttributesBuilder().mergeFrom(value);
+                    if (attributes_ != null) {
+                        attributes_ = context.ContextOuterClass.LinkAttributes.newBuilder(attributes_).mergeFrom(value).buildPartial();
                     } else {
                         attributes_ = value;
                     }
+                    onChanged();
                 } else {
                     attributesBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -24323,13 +25284,13 @@ public final class ContextOuterClass {
              * .context.LinkAttributes attributes = 4;
              */
             public Builder clearAttributes() {
-                bitField0_ = (bitField0_ & ~0x00000008);
-                attributes_ = null;
-                if (attributesBuilder_ != null) {
-                    attributesBuilder_.dispose();
+                if (attributesBuilder_ == null) {
+                    attributes_ = null;
+                    onChanged();
+                } else {
+                    attributes_ = null;
                     attributesBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -24337,7 +25298,6 @@ public final class ContextOuterClass {
              * .context.LinkAttributes attributes = 4;
              */
             public context.ContextOuterClass.LinkAttributes.Builder getAttributesBuilder() {
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return getAttributesFieldBuilder().getBuilder();
             }
@@ -24391,17 +25351,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Link parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Link(input, extensionRegistry);
             }
         };
 
@@ -24472,6 +25422,57 @@ public final class ContextOuterClass {
             return new LinkIdList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private LinkIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    linkIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                linkIds_.add(input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    linkIds_ = java.util.Collections.unmodifiableList(linkIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_LinkIdList_descriptor;
         }
@@ -24483,7 +25484,6 @@ public final class ContextOuterClass {
 
         public static final int LINK_IDS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List linkIds_;
 
         /**
@@ -24544,7 +25544,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < linkIds_.size(); i++) {
                 output.writeMessage(1, linkIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -24556,7 +25556,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < linkIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, linkIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -24572,7 +25572,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.LinkIdList other = (context.ContextOuterClass.LinkIdList) obj;
             if (!getLinkIdsList().equals(other.getLinkIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -24588,7 +25588,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + LINK_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getLinkIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -24682,23 +25682,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.LinkIdList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getLinkIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (linkIdsBuilder_ == null) {
                     linkIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    linkIds_ = null;
                     linkIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -24724,15 +25730,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.LinkIdList buildPartial() {
                 context.ContextOuterClass.LinkIdList result = new context.ContextOuterClass.LinkIdList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.LinkIdList result) {
+                int from_bitField0_ = bitField0_;
                 if (linkIdsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         linkIds_ = java.util.Collections.unmodifiableList(linkIds_);
@@ -24742,10 +25740,38 @@ public final class ContextOuterClass {
                 } else {
                     result.linkIds_ = linkIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.LinkIdList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -24785,7 +25811,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -24797,47 +25823,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.LinkIdList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.LinkId m = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry);
-                                    if (linkIdsBuilder_ == null) {
-                                        ensureLinkIdsIsMutable();
-                                        linkIds_.add(m);
-                                    } else {
-                                        linkIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.LinkIdList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -25107,17 +26103,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public LinkIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new LinkIdList(input, extensionRegistry);
             }
         };
 
@@ -25188,6 +26174,57 @@ public final class ContextOuterClass {
             return new LinkList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private LinkList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    links_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                links_.add(input.readMessage(context.ContextOuterClass.Link.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    links_ = java.util.Collections.unmodifiableList(links_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_LinkList_descriptor;
         }
@@ -25199,7 +26236,6 @@ public final class ContextOuterClass {
 
         public static final int LINKS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List links_;
 
         /**
@@ -25260,7 +26296,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < links_.size(); i++) {
                 output.writeMessage(1, links_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -25272,7 +26308,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < links_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, links_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -25288,7 +26324,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.LinkList other = (context.ContextOuterClass.LinkList) obj;
             if (!getLinksList().equals(other.getLinksList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -25304,7 +26340,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + LINKS_FIELD_NUMBER;
                 hash = (53 * hash) + getLinksList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -25398,23 +26434,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.LinkList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getLinksFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (linksBuilder_ == null) {
                     links_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    links_ = null;
                     linksBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -25440,15 +26482,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.LinkList buildPartial() {
                 context.ContextOuterClass.LinkList result = new context.ContextOuterClass.LinkList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.LinkList result) {
+                int from_bitField0_ = bitField0_;
                 if (linksBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         links_ = java.util.Collections.unmodifiableList(links_);
@@ -25458,10 +26492,38 @@ public final class ContextOuterClass {
                 } else {
                     result.links_ = linksBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.LinkList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -25501,7 +26563,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -25513,47 +26575,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.LinkList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.Link m = input.readMessage(context.ContextOuterClass.Link.parser(), extensionRegistry);
-                                    if (linksBuilder_ == null) {
-                                        ensureLinksIsMutable();
-                                        links_.add(m);
-                                    } else {
-                                        linksBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.LinkList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -25823,17 +26855,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public LinkList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new LinkList(input, extensionRegistry);
             }
         };
 
@@ -25912,6 +26934,70 @@ public final class ContextOuterClass {
             return new LinkEvent();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private LinkEvent(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Event.Builder subBuilder = null;
+                                if (event_ != null) {
+                                    subBuilder = event_.toBuilder();
+                                }
+                                event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(event_);
+                                    event_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.LinkId.Builder subBuilder = null;
+                                if (linkId_ != null) {
+                                    subBuilder = linkId_.toBuilder();
+                                }
+                                linkId_ = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(linkId_);
+                                    linkId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_LinkEvent_descriptor;
         }
@@ -25948,7 +27034,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-            return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+            return getEvent();
         }
 
         public static final int LINK_ID_FIELD_NUMBER = 2;
@@ -25978,7 +27064,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder() {
-            return linkId_ == null ? context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_;
+            return getLinkId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -26002,7 +27088,7 @@ public final class ContextOuterClass {
             if (linkId_ != null) {
                 output.writeMessage(2, getLinkId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -26017,7 +27103,7 @@ public final class ContextOuterClass {
             if (linkId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getLinkId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -26043,7 +27129,7 @@ public final class ContextOuterClass {
                 if (!getLinkId().equals(other.getLinkId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -26063,7 +27149,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + LINK_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getLinkId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -26157,24 +27243,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.LinkEvent.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                linkId_ = null;
-                if (linkIdBuilder_ != null) {
-                    linkIdBuilder_.dispose();
+                if (linkIdBuilder_ == null) {
+                    linkId_ = null;
+                } else {
+                    linkId_ = null;
                     linkIdBuilder_ = null;
                 }
                 return this;
@@ -26202,21 +27296,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.LinkEvent buildPartial() {
                 context.ContextOuterClass.LinkEvent result = new context.ContextOuterClass.LinkEvent(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (eventBuilder_ == null) {
+                    result.event_ = event_;
+                } else {
+                    result.event_ = eventBuilder_.build();
+                }
+                if (linkIdBuilder_ == null) {
+                    result.linkId_ = linkId_;
+                } else {
+                    result.linkId_ = linkIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.LinkEvent result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.event_ = eventBuilder_ == null ? event_ : eventBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.linkId_ = linkIdBuilder_ == null ? linkId_ : linkIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -26238,7 +27359,7 @@ public final class ContextOuterClass {
                 if (other.hasLinkId()) {
                     mergeLinkId(other.getLinkId());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -26250,54 +27371,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.LinkEvent parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEventFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getLinkIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.LinkEvent) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Event event_;
 
             private com.google.protobuf.SingleFieldBuilderV3 eventBuilder_;
@@ -26307,7 +27394,7 @@ public final class ContextOuterClass {
              * @return Whether the event field is set.
              */
             public boolean hasEvent() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return eventBuilder_ != null || event_ != null;
             }
 
             /**
@@ -26331,11 +27418,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     event_ = value;
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -26345,11 +27431,10 @@ public final class ContextOuterClass {
             public Builder setEvent(context.ContextOuterClass.Event.Builder builderForValue) {
                 if (eventBuilder_ == null) {
                     event_ = builderForValue.build();
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -26358,16 +27443,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEvent(context.ContextOuterClass.Event value) {
                 if (eventBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && event_ != null && event_ != context.ContextOuterClass.Event.getDefaultInstance()) {
-                        getEventBuilder().mergeFrom(value);
+                    if (event_ != null) {
+                        event_ = context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
                     } else {
                         event_ = value;
                     }
+                    onChanged();
                 } else {
                     eventBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -26375,13 +27459,13 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public Builder clearEvent() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                    onChanged();
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -26389,7 +27473,6 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public context.ContextOuterClass.Event.Builder getEventBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEventFieldBuilder().getBuilder();
             }
@@ -26425,7 +27508,7 @@ public final class ContextOuterClass {
              * @return Whether the linkId field is set.
              */
             public boolean hasLinkId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return linkIdBuilder_ != null || linkId_ != null;
             }
 
             /**
@@ -26449,11 +27532,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     linkId_ = value;
+                    onChanged();
                 } else {
                     linkIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -26463,11 +27545,10 @@ public final class ContextOuterClass {
             public Builder setLinkId(context.ContextOuterClass.LinkId.Builder builderForValue) {
                 if (linkIdBuilder_ == null) {
                     linkId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     linkIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -26476,16 +27557,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeLinkId(context.ContextOuterClass.LinkId value) {
                 if (linkIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && linkId_ != null && linkId_ != context.ContextOuterClass.LinkId.getDefaultInstance()) {
-                        getLinkIdBuilder().mergeFrom(value);
+                    if (linkId_ != null) {
+                        linkId_ = context.ContextOuterClass.LinkId.newBuilder(linkId_).mergeFrom(value).buildPartial();
                     } else {
                         linkId_ = value;
                     }
+                    onChanged();
                 } else {
                     linkIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -26493,13 +27573,13 @@ public final class ContextOuterClass {
              * .context.LinkId link_id = 2;
              */
             public Builder clearLinkId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                linkId_ = null;
-                if (linkIdBuilder_ != null) {
-                    linkIdBuilder_.dispose();
+                if (linkIdBuilder_ == null) {
+                    linkId_ = null;
+                    onChanged();
+                } else {
+                    linkId_ = null;
                     linkIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -26507,7 +27587,6 @@ public final class ContextOuterClass {
              * .context.LinkId link_id = 2;
              */
             public context.ContextOuterClass.LinkId.Builder getLinkIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getLinkIdFieldBuilder().getBuilder();
             }
@@ -26561,17 +27640,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public LinkEvent parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new LinkEvent(input, extensionRegistry);
             }
         };
 
@@ -26654,6 +27723,70 @@ public final class ContextOuterClass {
             return new ServiceId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ServiceId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ContextId.Builder subBuilder = null;
+                                if (contextId_ != null) {
+                                    subBuilder = contextId_.toBuilder();
+                                }
+                                contextId_ = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(contextId_);
+                                    contextId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (serviceUuid_ != null) {
+                                    subBuilder = serviceUuid_.toBuilder();
+                                }
+                                serviceUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(serviceUuid_);
+                                    serviceUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ServiceId_descriptor;
         }
@@ -26690,7 +27823,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() {
-            return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
+            return getContextId();
         }
 
         public static final int SERVICE_UUID_FIELD_NUMBER = 2;
@@ -26720,7 +27853,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getServiceUuidOrBuilder() {
-            return serviceUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : serviceUuid_;
+            return getServiceUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -26744,7 +27877,7 @@ public final class ContextOuterClass {
             if (serviceUuid_ != null) {
                 output.writeMessage(2, getServiceUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -26759,7 +27892,7 @@ public final class ContextOuterClass {
             if (serviceUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getServiceUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -26785,7 +27918,7 @@ public final class ContextOuterClass {
                 if (!getServiceUuid().equals(other.getServiceUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -26805,7 +27938,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SERVICE_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getServiceUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -26903,24 +28036,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ServiceId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
-                serviceUuid_ = null;
-                if (serviceUuidBuilder_ != null) {
-                    serviceUuidBuilder_.dispose();
+                if (serviceUuidBuilder_ == null) {
+                    serviceUuid_ = null;
+                } else {
+                    serviceUuid_ = null;
                     serviceUuidBuilder_ = null;
                 }
                 return this;
@@ -26948,21 +28089,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ServiceId buildPartial() {
                 context.ContextOuterClass.ServiceId result = new context.ContextOuterClass.ServiceId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (contextIdBuilder_ == null) {
+                    result.contextId_ = contextId_;
+                } else {
+                    result.contextId_ = contextIdBuilder_.build();
+                }
+                if (serviceUuidBuilder_ == null) {
+                    result.serviceUuid_ = serviceUuid_;
+                } else {
+                    result.serviceUuid_ = serviceUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ServiceId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.contextId_ = contextIdBuilder_ == null ? contextId_ : contextIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.serviceUuid_ = serviceUuidBuilder_ == null ? serviceUuid_ : serviceUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -26984,7 +28152,7 @@ public final class ContextOuterClass {
                 if (other.hasServiceUuid()) {
                     mergeServiceUuid(other.getServiceUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -26996,54 +28164,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ServiceId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getContextIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getServiceUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ServiceId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.ContextId contextId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 contextIdBuilder_;
@@ -27053,7 +28187,7 @@ public final class ContextOuterClass {
              * @return Whether the contextId field is set.
              */
             public boolean hasContextId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return contextIdBuilder_ != null || contextId_ != null;
             }
 
             /**
@@ -27077,11 +28211,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     contextId_ = value;
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -27091,11 +28224,10 @@ public final class ContextOuterClass {
             public Builder setContextId(context.ContextOuterClass.ContextId.Builder builderForValue) {
                 if (contextIdBuilder_ == null) {
                     contextId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -27104,16 +28236,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeContextId(context.ContextOuterClass.ContextId value) {
                 if (contextIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && contextId_ != null && contextId_ != context.ContextOuterClass.ContextId.getDefaultInstance()) {
-                        getContextIdBuilder().mergeFrom(value);
+                    if (contextId_ != null) {
+                        contextId_ = context.ContextOuterClass.ContextId.newBuilder(contextId_).mergeFrom(value).buildPartial();
                     } else {
                         contextId_ = value;
                     }
+                    onChanged();
                 } else {
                     contextIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -27121,13 +28252,13 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public Builder clearContextId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                    onChanged();
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -27135,7 +28266,6 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public context.ContextOuterClass.ContextId.Builder getContextIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getContextIdFieldBuilder().getBuilder();
             }
@@ -27171,7 +28301,7 @@ public final class ContextOuterClass {
              * @return Whether the serviceUuid field is set.
              */
             public boolean hasServiceUuid() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return serviceUuidBuilder_ != null || serviceUuid_ != null;
             }
 
             /**
@@ -27195,11 +28325,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     serviceUuid_ = value;
+                    onChanged();
                 } else {
                     serviceUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -27209,11 +28338,10 @@ public final class ContextOuterClass {
             public Builder setServiceUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (serviceUuidBuilder_ == null) {
                     serviceUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     serviceUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -27222,16 +28350,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeServiceUuid(context.ContextOuterClass.Uuid value) {
                 if (serviceUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && serviceUuid_ != null && serviceUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getServiceUuidBuilder().mergeFrom(value);
+                    if (serviceUuid_ != null) {
+                        serviceUuid_ = context.ContextOuterClass.Uuid.newBuilder(serviceUuid_).mergeFrom(value).buildPartial();
                     } else {
                         serviceUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     serviceUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -27239,13 +28366,13 @@ public final class ContextOuterClass {
              * .context.Uuid service_uuid = 2;
              */
             public Builder clearServiceUuid() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                serviceUuid_ = null;
-                if (serviceUuidBuilder_ != null) {
-                    serviceUuidBuilder_.dispose();
+                if (serviceUuidBuilder_ == null) {
+                    serviceUuid_ = null;
+                    onChanged();
+                } else {
+                    serviceUuid_ = null;
                     serviceUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -27253,7 +28380,6 @@ public final class ContextOuterClass {
              * .context.Uuid service_uuid = 2;
              */
             public context.ContextOuterClass.Uuid.Builder getServiceUuidBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getServiceUuidFieldBuilder().getBuilder();
             }
@@ -27307,17 +28433,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ServiceId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ServiceId(input, extensionRegistry);
             }
         };
 
@@ -27508,6 +28624,133 @@ public final class ContextOuterClass {
             return new Service();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Service(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ServiceId.Builder subBuilder = null;
+                                if (serviceId_ != null) {
+                                    subBuilder = serviceId_.toBuilder();
+                                }
+                                serviceId_ = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(serviceId_);
+                                    serviceId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 24:
+                            {
+                                int rawValue = input.readEnum();
+                                serviceType_ = rawValue;
+                                break;
+                            }
+                        case 34:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    serviceEndpointIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                serviceEndpointIds_.add(input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 42:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                                    serviceConstraints_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                serviceConstraints_.add(input.readMessage(context.ContextOuterClass.Constraint.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 50:
+                            {
+                                context.ContextOuterClass.ServiceStatus.Builder subBuilder = null;
+                                if (serviceStatus_ != null) {
+                                    subBuilder = serviceStatus_.toBuilder();
+                                }
+                                serviceStatus_ = input.readMessage(context.ContextOuterClass.ServiceStatus.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(serviceStatus_);
+                                    serviceStatus_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 58:
+                            {
+                                context.ContextOuterClass.ServiceConfig.Builder subBuilder = null;
+                                if (serviceConfig_ != null) {
+                                    subBuilder = serviceConfig_.toBuilder();
+                                }
+                                serviceConfig_ = input.readMessage(context.ContextOuterClass.ServiceConfig.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(serviceConfig_);
+                                    serviceConfig_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 66:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (timestamp_ != null) {
+                                    subBuilder = timestamp_.toBuilder();
+                                }
+                                timestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(timestamp_);
+                                    timestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    serviceEndpointIds_ = java.util.Collections.unmodifiableList(serviceEndpointIds_);
+                }
+                if (((mutable_bitField0_ & 0x00000002) != 0)) {
+                    serviceConstraints_ = java.util.Collections.unmodifiableList(serviceConstraints_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Service_descriptor;
         }
@@ -27544,13 +28787,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
-            return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+            return getServiceId();
         }
 
         public static final int NAME_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 2;
@@ -27587,7 +28829,7 @@ public final class ContextOuterClass {
 
         public static final int SERVICE_TYPE_FIELD_NUMBER = 3;
 
-        private int serviceType_ = 0;
+        private int serviceType_;
 
         /**
          * .context.ServiceTypeEnum service_type = 3;
@@ -27604,13 +28846,13 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceTypeEnum getServiceType() {
-            context.ContextOuterClass.ServiceTypeEnum result = context.ContextOuterClass.ServiceTypeEnum.forNumber(serviceType_);
+            @SuppressWarnings("deprecation")
+            context.ContextOuterClass.ServiceTypeEnum result = context.ContextOuterClass.ServiceTypeEnum.valueOf(serviceType_);
             return result == null ? context.ContextOuterClass.ServiceTypeEnum.UNRECOGNIZED : result;
         }
 
         public static final int SERVICE_ENDPOINT_IDS_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
         private java.util.List serviceEndpointIds_;
 
         /**
@@ -27655,7 +28897,6 @@ public final class ContextOuterClass {
 
         public static final int SERVICE_CONSTRAINTS_FIELD_NUMBER = 5;
 
-        @SuppressWarnings("serial")
         private java.util.List serviceConstraints_;
 
         /**
@@ -27725,7 +28966,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceStatusOrBuilder getServiceStatusOrBuilder() {
-            return serviceStatus_ == null ? context.ContextOuterClass.ServiceStatus.getDefaultInstance() : serviceStatus_;
+            return getServiceStatus();
         }
 
         public static final int SERVICE_CONFIG_FIELD_NUMBER = 7;
@@ -27755,7 +28996,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceConfigOrBuilder getServiceConfigOrBuilder() {
-            return serviceConfig_ == null ? context.ContextOuterClass.ServiceConfig.getDefaultInstance() : serviceConfig_;
+            return getServiceConfig();
         }
 
         public static final int TIMESTAMP_FIELD_NUMBER = 8;
@@ -27785,7 +29026,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-            return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+            return getTimestamp();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -27806,7 +29047,7 @@ public final class ContextOuterClass {
             if (serviceId_ != null) {
                 output.writeMessage(1, getServiceId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
             }
             if (serviceType_ != context.ContextOuterClass.ServiceTypeEnum.SERVICETYPE_UNKNOWN.getNumber()) {
@@ -27827,7 +29068,7 @@ public final class ContextOuterClass {
             if (timestamp_ != null) {
                 output.writeMessage(8, getTimestamp());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -27839,7 +29080,7 @@ public final class ContextOuterClass {
             if (serviceId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getServiceId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
             }
             if (serviceType_ != context.ContextOuterClass.ServiceTypeEnum.SERVICETYPE_UNKNOWN.getNumber()) {
@@ -27860,7 +29101,7 @@ public final class ContextOuterClass {
             if (timestamp_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(8, getTimestamp());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -27906,7 +29147,7 @@ public final class ContextOuterClass {
                 if (!getTimestamp().equals(other.getTimestamp()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -27946,7 +29187,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
                 hash = (53 * hash) + getTimestamp().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -28040,50 +29281,60 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Service.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getServiceEndpointIdsFieldBuilder();
+                    getServiceConstraintsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                serviceId_ = null;
-                if (serviceIdBuilder_ != null) {
-                    serviceIdBuilder_.dispose();
+                if (serviceIdBuilder_ == null) {
+                    serviceId_ = null;
+                } else {
+                    serviceId_ = null;
                     serviceIdBuilder_ = null;
                 }
                 name_ = "";
                 serviceType_ = 0;
                 if (serviceEndpointIdsBuilder_ == null) {
                     serviceEndpointIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    serviceEndpointIds_ = null;
                     serviceEndpointIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000008);
                 if (serviceConstraintsBuilder_ == null) {
                     serviceConstraints_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
                 } else {
-                    serviceConstraints_ = null;
                     serviceConstraintsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000010);
-                serviceStatus_ = null;
-                if (serviceStatusBuilder_ != null) {
-                    serviceStatusBuilder_.dispose();
+                if (serviceStatusBuilder_ == null) {
+                    serviceStatus_ = null;
+                } else {
+                    serviceStatus_ = null;
                     serviceStatusBuilder_ = null;
                 }
-                serviceConfig_ = null;
-                if (serviceConfigBuilder_ != null) {
-                    serviceConfigBuilder_.dispose();
+                if (serviceConfigBuilder_ == null) {
+                    serviceConfig_ = null;
+                } else {
+                    serviceConfig_ = null;
                     serviceConfigBuilder_ = null;
                 }
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
                 return this;
@@ -28111,55 +29362,79 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Service buildPartial() {
                 context.ContextOuterClass.Service result = new context.ContextOuterClass.Service(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (serviceIdBuilder_ == null) {
+                    result.serviceId_ = serviceId_;
+                } else {
+                    result.serviceId_ = serviceIdBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Service result) {
+                result.name_ = name_;
+                result.serviceType_ = serviceType_;
                 if (serviceEndpointIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         serviceEndpointIds_ = java.util.Collections.unmodifiableList(serviceEndpointIds_);
-                        bitField0_ = (bitField0_ & ~0x00000008);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.serviceEndpointIds_ = serviceEndpointIds_;
                 } else {
                     result.serviceEndpointIds_ = serviceEndpointIdsBuilder_.build();
                 }
                 if (serviceConstraintsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000010) != 0)) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
                         serviceConstraints_ = java.util.Collections.unmodifiableList(serviceConstraints_);
-                        bitField0_ = (bitField0_ & ~0x00000010);
+                        bitField0_ = (bitField0_ & ~0x00000002);
                     }
                     result.serviceConstraints_ = serviceConstraints_;
                 } else {
                     result.serviceConstraints_ = serviceConstraintsBuilder_.build();
                 }
-            }
-
-            private void buildPartial0(context.ContextOuterClass.Service result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.serviceId_ = serviceIdBuilder_ == null ? serviceId_ : serviceIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.serviceType_ = serviceType_;
-                }
-                if (((from_bitField0_ & 0x00000020) != 0)) {
-                    result.serviceStatus_ = serviceStatusBuilder_ == null ? serviceStatus_ : serviceStatusBuilder_.build();
+                if (serviceStatusBuilder_ == null) {
+                    result.serviceStatus_ = serviceStatus_;
+                } else {
+                    result.serviceStatus_ = serviceStatusBuilder_.build();
                 }
-                if (((from_bitField0_ & 0x00000040) != 0)) {
-                    result.serviceConfig_ = serviceConfigBuilder_ == null ? serviceConfig_ : serviceConfigBuilder_.build();
+                if (serviceConfigBuilder_ == null) {
+                    result.serviceConfig_ = serviceConfig_;
+                } else {
+                    result.serviceConfig_ = serviceConfigBuilder_.build();
                 }
-                if (((from_bitField0_ & 0x00000080) != 0)) {
-                    result.timestamp_ = timestampBuilder_ == null ? timestamp_ : timestampBuilder_.build();
+                if (timestampBuilder_ == null) {
+                    result.timestamp_ = timestamp_;
+                } else {
+                    result.timestamp_ = timestampBuilder_.build();
                 }
+                onBuilt();
+                return result;
+            }
+
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -28180,7 +29455,6 @@ public final class ContextOuterClass {
                 }
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (other.serviceType_ != 0) {
@@ -28190,7 +29464,7 @@ public final class ContextOuterClass {
                     if (!other.serviceEndpointIds_.isEmpty()) {
                         if (serviceEndpointIds_.isEmpty()) {
                             serviceEndpointIds_ = other.serviceEndpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureServiceEndpointIdsIsMutable();
                             serviceEndpointIds_.addAll(other.serviceEndpointIds_);
@@ -28203,7 +29477,7 @@ public final class ContextOuterClass {
                             serviceEndpointIdsBuilder_.dispose();
                             serviceEndpointIdsBuilder_ = null;
                             serviceEndpointIds_ = other.serviceEndpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             serviceEndpointIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getServiceEndpointIdsFieldBuilder() : null;
                         } else {
                             serviceEndpointIdsBuilder_.addAllMessages(other.serviceEndpointIds_);
@@ -28214,7 +29488,7 @@ public final class ContextOuterClass {
                     if (!other.serviceConstraints_.isEmpty()) {
                         if (serviceConstraints_.isEmpty()) {
                             serviceConstraints_ = other.serviceConstraints_;
-                            bitField0_ = (bitField0_ & ~0x00000010);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                         } else {
                             ensureServiceConstraintsIsMutable();
                             serviceConstraints_.addAll(other.serviceConstraints_);
@@ -28227,7 +29501,7 @@ public final class ContextOuterClass {
                             serviceConstraintsBuilder_.dispose();
                             serviceConstraintsBuilder_ = null;
                             serviceConstraints_ = other.serviceConstraints_;
-                            bitField0_ = (bitField0_ & ~0x00000010);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                             serviceConstraintsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getServiceConstraintsFieldBuilder() : null;
                         } else {
                             serviceConstraintsBuilder_.addAllMessages(other.serviceConstraints_);
@@ -28243,7 +29517,7 @@ public final class ContextOuterClass {
                 if (other.hasTimestamp()) {
                     mergeTimestamp(other.getTimestamp());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -28255,101 +29529,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Service parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getServiceIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 24:
-                                {
-                                    serviceType_ = input.readEnum();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 34:
-                                {
-                                    context.ContextOuterClass.EndPointId m = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-                                    if (serviceEndpointIdsBuilder_ == null) {
-                                        ensureServiceEndpointIdsIsMutable();
-                                        serviceEndpointIds_.add(m);
-                                    } else {
-                                        serviceEndpointIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    context.ContextOuterClass.Constraint m = input.readMessage(context.ContextOuterClass.Constraint.parser(), extensionRegistry);
-                                    if (serviceConstraintsBuilder_ == null) {
-                                        ensureServiceConstraintsIsMutable();
-                                        serviceConstraints_.add(m);
-                                    } else {
-                                        serviceConstraintsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 42
-                            case 50:
-                                {
-                                    input.readMessage(getServiceStatusFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000020;
-                                    break;
-                                }
-                            // case 50
-                            case 58:
-                                {
-                                    input.readMessage(getServiceConfigFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000040;
-                                    break;
-                                }
-                            // case 58
-                            case 66:
-                                {
-                                    input.readMessage(getTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000080;
-                                    break;
-                                }
-                            // case 66
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Service) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -28364,7 +29554,7 @@ public final class ContextOuterClass {
              * @return Whether the serviceId field is set.
              */
             public boolean hasServiceId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return serviceIdBuilder_ != null || serviceId_ != null;
             }
 
             /**
@@ -28388,11 +29578,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     serviceId_ = value;
+                    onChanged();
                 } else {
                     serviceIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -28402,11 +29591,10 @@ public final class ContextOuterClass {
             public Builder setServiceId(context.ContextOuterClass.ServiceId.Builder builderForValue) {
                 if (serviceIdBuilder_ == null) {
                     serviceId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     serviceIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -28415,16 +29603,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) {
                 if (serviceIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && serviceId_ != null && serviceId_ != context.ContextOuterClass.ServiceId.getDefaultInstance()) {
-                        getServiceIdBuilder().mergeFrom(value);
+                    if (serviceId_ != null) {
+                        serviceId_ = context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial();
                     } else {
                         serviceId_ = value;
                     }
+                    onChanged();
                 } else {
                     serviceIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -28432,13 +29619,13 @@ public final class ContextOuterClass {
              * .context.ServiceId service_id = 1;
              */
             public Builder clearServiceId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                serviceId_ = null;
-                if (serviceIdBuilder_ != null) {
-                    serviceIdBuilder_.dispose();
+                if (serviceIdBuilder_ == null) {
+                    serviceId_ = null;
+                    onChanged();
+                } else {
+                    serviceId_ = null;
                     serviceIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -28446,7 +29633,6 @@ public final class ContextOuterClass {
              * .context.ServiceId service_id = 1;
              */
             public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getServiceIdFieldBuilder().getBuilder();
             }
@@ -28516,7 +29702,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -28527,7 +29712,6 @@ public final class ContextOuterClass {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -28543,7 +29727,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -28566,7 +29749,6 @@ public final class ContextOuterClass {
              */
             public Builder setServiceTypeValue(int value) {
                 serviceType_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -28577,7 +29759,8 @@ public final class ContextOuterClass {
              */
             @java.lang.Override
             public context.ContextOuterClass.ServiceTypeEnum getServiceType() {
-                context.ContextOuterClass.ServiceTypeEnum result = context.ContextOuterClass.ServiceTypeEnum.forNumber(serviceType_);
+                @SuppressWarnings("deprecation")
+                context.ContextOuterClass.ServiceTypeEnum result = context.ContextOuterClass.ServiceTypeEnum.valueOf(serviceType_);
                 return result == null ? context.ContextOuterClass.ServiceTypeEnum.UNRECOGNIZED : result;
             }
 
@@ -28590,7 +29773,6 @@ public final class ContextOuterClass {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000004;
                 serviceType_ = value.getNumber();
                 onChanged();
                 return this;
@@ -28601,7 +29783,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearServiceType() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 serviceType_ = 0;
                 onChanged();
                 return this;
@@ -28610,9 +29791,9 @@ public final class ContextOuterClass {
             private java.util.List serviceEndpointIds_ = java.util.Collections.emptyList();
 
             private void ensureServiceEndpointIdsIsMutable() {
-                if (!((bitField0_ & 0x00000008) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     serviceEndpointIds_ = new java.util.ArrayList(serviceEndpointIds_);
-                    bitField0_ |= 0x00000008;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -28764,7 +29945,7 @@ public final class ContextOuterClass {
             public Builder clearServiceEndpointIds() {
                 if (serviceEndpointIdsBuilder_ == null) {
                     serviceEndpointIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000008);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     serviceEndpointIdsBuilder_.clear();
@@ -28838,7 +30019,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getServiceEndpointIdsFieldBuilder() {
                 if (serviceEndpointIdsBuilder_ == null) {
-                    serviceEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(serviceEndpointIds_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean());
+                    serviceEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(serviceEndpointIds_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     serviceEndpointIds_ = null;
                 }
                 return serviceEndpointIdsBuilder_;
@@ -28847,9 +30028,9 @@ public final class ContextOuterClass {
             private java.util.List serviceConstraints_ = java.util.Collections.emptyList();
 
             private void ensureServiceConstraintsIsMutable() {
-                if (!((bitField0_ & 0x00000010) != 0)) {
+                if (!((bitField0_ & 0x00000002) != 0)) {
                     serviceConstraints_ = new java.util.ArrayList(serviceConstraints_);
-                    bitField0_ |= 0x00000010;
+                    bitField0_ |= 0x00000002;
                 }
             }
 
@@ -29001,7 +30182,7 @@ public final class ContextOuterClass {
             public Builder clearServiceConstraints() {
                 if (serviceConstraintsBuilder_ == null) {
                     serviceConstraints_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000010);
+                    bitField0_ = (bitField0_ & ~0x00000002);
                     onChanged();
                 } else {
                     serviceConstraintsBuilder_.clear();
@@ -29075,7 +30256,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getServiceConstraintsFieldBuilder() {
                 if (serviceConstraintsBuilder_ == null) {
-                    serviceConstraintsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(serviceConstraints_, ((bitField0_ & 0x00000010) != 0), getParentForChildren(), isClean());
+                    serviceConstraintsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(serviceConstraints_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
                     serviceConstraints_ = null;
                 }
                 return serviceConstraintsBuilder_;
@@ -29090,7 +30271,7 @@ public final class ContextOuterClass {
              * @return Whether the serviceStatus field is set.
              */
             public boolean hasServiceStatus() {
-                return ((bitField0_ & 0x00000020) != 0);
+                return serviceStatusBuilder_ != null || serviceStatus_ != null;
             }
 
             /**
@@ -29114,11 +30295,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     serviceStatus_ = value;
+                    onChanged();
                 } else {
                     serviceStatusBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -29128,11 +30308,10 @@ public final class ContextOuterClass {
             public Builder setServiceStatus(context.ContextOuterClass.ServiceStatus.Builder builderForValue) {
                 if (serviceStatusBuilder_ == null) {
                     serviceStatus_ = builderForValue.build();
+                    onChanged();
                 } else {
                     serviceStatusBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -29141,16 +30320,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeServiceStatus(context.ContextOuterClass.ServiceStatus value) {
                 if (serviceStatusBuilder_ == null) {
-                    if (((bitField0_ & 0x00000020) != 0) && serviceStatus_ != null && serviceStatus_ != context.ContextOuterClass.ServiceStatus.getDefaultInstance()) {
-                        getServiceStatusBuilder().mergeFrom(value);
+                    if (serviceStatus_ != null) {
+                        serviceStatus_ = context.ContextOuterClass.ServiceStatus.newBuilder(serviceStatus_).mergeFrom(value).buildPartial();
                     } else {
                         serviceStatus_ = value;
                     }
+                    onChanged();
                 } else {
                     serviceStatusBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -29158,13 +30336,13 @@ public final class ContextOuterClass {
              * .context.ServiceStatus service_status = 6;
              */
             public Builder clearServiceStatus() {
-                bitField0_ = (bitField0_ & ~0x00000020);
-                serviceStatus_ = null;
-                if (serviceStatusBuilder_ != null) {
-                    serviceStatusBuilder_.dispose();
+                if (serviceStatusBuilder_ == null) {
+                    serviceStatus_ = null;
+                    onChanged();
+                } else {
+                    serviceStatus_ = null;
                     serviceStatusBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -29172,7 +30350,6 @@ public final class ContextOuterClass {
              * .context.ServiceStatus service_status = 6;
              */
             public context.ContextOuterClass.ServiceStatus.Builder getServiceStatusBuilder() {
-                bitField0_ |= 0x00000020;
                 onChanged();
                 return getServiceStatusFieldBuilder().getBuilder();
             }
@@ -29208,7 +30385,7 @@ public final class ContextOuterClass {
              * @return Whether the serviceConfig field is set.
              */
             public boolean hasServiceConfig() {
-                return ((bitField0_ & 0x00000040) != 0);
+                return serviceConfigBuilder_ != null || serviceConfig_ != null;
             }
 
             /**
@@ -29232,11 +30409,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     serviceConfig_ = value;
+                    onChanged();
                 } else {
                     serviceConfigBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000040;
-                onChanged();
                 return this;
             }
 
@@ -29246,11 +30422,10 @@ public final class ContextOuterClass {
             public Builder setServiceConfig(context.ContextOuterClass.ServiceConfig.Builder builderForValue) {
                 if (serviceConfigBuilder_ == null) {
                     serviceConfig_ = builderForValue.build();
+                    onChanged();
                 } else {
                     serviceConfigBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000040;
-                onChanged();
                 return this;
             }
 
@@ -29259,16 +30434,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeServiceConfig(context.ContextOuterClass.ServiceConfig value) {
                 if (serviceConfigBuilder_ == null) {
-                    if (((bitField0_ & 0x00000040) != 0) && serviceConfig_ != null && serviceConfig_ != context.ContextOuterClass.ServiceConfig.getDefaultInstance()) {
-                        getServiceConfigBuilder().mergeFrom(value);
+                    if (serviceConfig_ != null) {
+                        serviceConfig_ = context.ContextOuterClass.ServiceConfig.newBuilder(serviceConfig_).mergeFrom(value).buildPartial();
                     } else {
                         serviceConfig_ = value;
                     }
+                    onChanged();
                 } else {
                     serviceConfigBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000040;
-                onChanged();
                 return this;
             }
 
@@ -29276,13 +30450,13 @@ public final class ContextOuterClass {
              * .context.ServiceConfig service_config = 7;
              */
             public Builder clearServiceConfig() {
-                bitField0_ = (bitField0_ & ~0x00000040);
-                serviceConfig_ = null;
-                if (serviceConfigBuilder_ != null) {
-                    serviceConfigBuilder_.dispose();
+                if (serviceConfigBuilder_ == null) {
+                    serviceConfig_ = null;
+                    onChanged();
+                } else {
+                    serviceConfig_ = null;
                     serviceConfigBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -29290,7 +30464,6 @@ public final class ContextOuterClass {
              * .context.ServiceConfig service_config = 7;
              */
             public context.ContextOuterClass.ServiceConfig.Builder getServiceConfigBuilder() {
-                bitField0_ |= 0x00000040;
                 onChanged();
                 return getServiceConfigFieldBuilder().getBuilder();
             }
@@ -29326,7 +30499,7 @@ public final class ContextOuterClass {
              * @return Whether the timestamp field is set.
              */
             public boolean hasTimestamp() {
-                return ((bitField0_ & 0x00000080) != 0);
+                return timestampBuilder_ != null || timestamp_ != null;
             }
 
             /**
@@ -29350,11 +30523,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     timestamp_ = value;
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000080;
-                onChanged();
                 return this;
             }
 
@@ -29364,11 +30536,10 @@ public final class ContextOuterClass {
             public Builder setTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (timestampBuilder_ == null) {
                     timestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000080;
-                onChanged();
                 return this;
             }
 
@@ -29377,16 +30548,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (timestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000080) != 0) && timestamp_ != null && timestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getTimestampBuilder().mergeFrom(value);
+                    if (timestamp_ != null) {
+                        timestamp_ = context.ContextOuterClass.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial();
                     } else {
                         timestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     timestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000080;
-                onChanged();
                 return this;
             }
 
@@ -29394,13 +30564,13 @@ public final class ContextOuterClass {
              * .context.Timestamp timestamp = 8;
              */
             public Builder clearTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000080);
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                    onChanged();
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -29408,7 +30578,6 @@ public final class ContextOuterClass {
              * .context.Timestamp timestamp = 8;
              */
             public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
-                bitField0_ |= 0x00000080;
                 onChanged();
                 return getTimestampFieldBuilder().getBuilder();
             }
@@ -29462,17 +30631,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Service parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Service(input, extensionRegistry);
             }
         };
 
@@ -29530,6 +30689,50 @@ public final class ContextOuterClass {
             return new ServiceStatus();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ServiceStatus(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                int rawValue = input.readEnum();
+                                serviceStatus_ = rawValue;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ServiceStatus_descriptor;
         }
@@ -29541,7 +30744,7 @@ public final class ContextOuterClass {
 
         public static final int SERVICE_STATUS_FIELD_NUMBER = 1;
 
-        private int serviceStatus_ = 0;
+        private int serviceStatus_;
 
         /**
          * .context.ServiceStatusEnum service_status = 1;
@@ -29558,7 +30761,8 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceStatusEnum getServiceStatus() {
-            context.ContextOuterClass.ServiceStatusEnum result = context.ContextOuterClass.ServiceStatusEnum.forNumber(serviceStatus_);
+            @SuppressWarnings("deprecation")
+            context.ContextOuterClass.ServiceStatusEnum result = context.ContextOuterClass.ServiceStatusEnum.valueOf(serviceStatus_);
             return result == null ? context.ContextOuterClass.ServiceStatusEnum.UNRECOGNIZED : result;
         }
 
@@ -29580,7 +30784,7 @@ public final class ContextOuterClass {
             if (serviceStatus_ != context.ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_UNDEFINED.getNumber()) {
                 output.writeEnum(1, serviceStatus_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -29592,7 +30796,7 @@ public final class ContextOuterClass {
             if (serviceStatus_ != context.ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_UNDEFINED.getNumber()) {
                 size += com.google.protobuf.CodedOutputStream.computeEnumSize(1, serviceStatus_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -29608,7 +30812,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.ServiceStatus other = (context.ContextOuterClass.ServiceStatus) obj;
             if (serviceStatus_ != other.serviceStatus_)
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -29622,7 +30826,7 @@ public final class ContextOuterClass {
             hash = (19 * hash) + getDescriptor().hashCode();
             hash = (37 * hash) + SERVICE_STATUS_FIELD_NUMBER;
             hash = (53 * hash) + serviceStatus_;
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -29716,16 +30920,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ServiceStatus.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 serviceStatus_ = 0;
                 return this;
             }
@@ -29752,18 +30962,39 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ServiceStatus buildPartial() {
                 context.ContextOuterClass.ServiceStatus result = new context.ContextOuterClass.ServiceStatus(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.serviceStatus_ = serviceStatus_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ServiceStatus result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.serviceStatus_ = serviceStatus_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -29782,7 +31013,7 @@ public final class ContextOuterClass {
                 if (other.serviceStatus_ != 0) {
                     setServiceStatusValue(other.getServiceStatusValue());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -29794,47 +31025,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ServiceStatus parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    serviceStatus_ = input.readEnum();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ServiceStatus) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private int serviceStatus_ = 0;
 
             /**
@@ -29853,7 +31057,6 @@ public final class ContextOuterClass {
              */
             public Builder setServiceStatusValue(int value) {
                 serviceStatus_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -29864,7 +31067,8 @@ public final class ContextOuterClass {
              */
             @java.lang.Override
             public context.ContextOuterClass.ServiceStatusEnum getServiceStatus() {
-                context.ContextOuterClass.ServiceStatusEnum result = context.ContextOuterClass.ServiceStatusEnum.forNumber(serviceStatus_);
+                @SuppressWarnings("deprecation")
+                context.ContextOuterClass.ServiceStatusEnum result = context.ContextOuterClass.ServiceStatusEnum.valueOf(serviceStatus_);
                 return result == null ? context.ContextOuterClass.ServiceStatusEnum.UNRECOGNIZED : result;
             }
 
@@ -29877,7 +31081,6 @@ public final class ContextOuterClass {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000001;
                 serviceStatus_ = value.getNumber();
                 onChanged();
                 return this;
@@ -29888,7 +31091,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearServiceStatus() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 serviceStatus_ = 0;
                 onChanged();
                 return this;
@@ -29921,17 +31123,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ServiceStatus parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ServiceStatus(input, extensionRegistry);
             }
         };
 
@@ -30002,6 +31194,57 @@ public final class ContextOuterClass {
             return new ServiceConfig();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ServiceConfig(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    configRules_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                configRules_.add(input.readMessage(context.ContextOuterClass.ConfigRule.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    configRules_ = java.util.Collections.unmodifiableList(configRules_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ServiceConfig_descriptor;
         }
@@ -30013,7 +31256,6 @@ public final class ContextOuterClass {
 
         public static final int CONFIG_RULES_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List configRules_;
 
         /**
@@ -30074,7 +31316,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < configRules_.size(); i++) {
                 output.writeMessage(1, configRules_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -30086,7 +31328,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < configRules_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, configRules_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -30102,7 +31344,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.ServiceConfig other = (context.ContextOuterClass.ServiceConfig) obj;
             if (!getConfigRulesList().equals(other.getConfigRulesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -30118,7 +31360,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONFIG_RULES_FIELD_NUMBER;
                 hash = (53 * hash) + getConfigRulesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -30212,23 +31454,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ServiceConfig.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getConfigRulesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (configRulesBuilder_ == null) {
                     configRules_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    configRules_ = null;
                     configRulesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -30254,15 +31502,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ServiceConfig buildPartial() {
                 context.ContextOuterClass.ServiceConfig result = new context.ContextOuterClass.ServiceConfig(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.ServiceConfig result) {
+                int from_bitField0_ = bitField0_;
                 if (configRulesBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         configRules_ = java.util.Collections.unmodifiableList(configRules_);
@@ -30272,10 +31512,38 @@ public final class ContextOuterClass {
                 } else {
                     result.configRules_ = configRulesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ServiceConfig result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -30315,7 +31583,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -30327,47 +31595,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ServiceConfig parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.ConfigRule m = input.readMessage(context.ContextOuterClass.ConfigRule.parser(), extensionRegistry);
-                                    if (configRulesBuilder_ == null) {
-                                        ensureConfigRulesIsMutable();
-                                        configRules_.add(m);
-                                    } else {
-                                        configRulesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ServiceConfig) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -30637,17 +31875,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ServiceConfig parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ServiceConfig(input, extensionRegistry);
             }
         };
 
@@ -30718,6 +31946,57 @@ public final class ContextOuterClass {
             return new ServiceIdList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ServiceIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    serviceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                serviceIds_.add(input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    serviceIds_ = java.util.Collections.unmodifiableList(serviceIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ServiceIdList_descriptor;
         }
@@ -30729,7 +32008,6 @@ public final class ContextOuterClass {
 
         public static final int SERVICE_IDS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List serviceIds_;
 
         /**
@@ -30790,7 +32068,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < serviceIds_.size(); i++) {
                 output.writeMessage(1, serviceIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -30802,7 +32080,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < serviceIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, serviceIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -30818,7 +32096,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.ServiceIdList other = (context.ContextOuterClass.ServiceIdList) obj;
             if (!getServiceIdsList().equals(other.getServiceIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -30834,7 +32112,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SERVICE_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getServiceIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -30928,23 +32206,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ServiceIdList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getServiceIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (serviceIdsBuilder_ == null) {
                     serviceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    serviceIds_ = null;
                     serviceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -30970,15 +32254,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ServiceIdList buildPartial() {
                 context.ContextOuterClass.ServiceIdList result = new context.ContextOuterClass.ServiceIdList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.ServiceIdList result) {
+                int from_bitField0_ = bitField0_;
                 if (serviceIdsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         serviceIds_ = java.util.Collections.unmodifiableList(serviceIds_);
@@ -30988,10 +32264,38 @@ public final class ContextOuterClass {
                 } else {
                     result.serviceIds_ = serviceIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ServiceIdList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -31031,7 +32335,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -31043,47 +32347,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ServiceIdList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.ServiceId m = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
-                                    if (serviceIdsBuilder_ == null) {
-                                        ensureServiceIdsIsMutable();
-                                        serviceIds_.add(m);
-                                    } else {
-                                        serviceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ServiceIdList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -31353,17 +32627,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ServiceIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ServiceIdList(input, extensionRegistry);
             }
         };
 
@@ -31434,6 +32698,57 @@ public final class ContextOuterClass {
             return new ServiceList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ServiceList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    services_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                services_.add(input.readMessage(context.ContextOuterClass.Service.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    services_ = java.util.Collections.unmodifiableList(services_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ServiceList_descriptor;
         }
@@ -31445,7 +32760,6 @@ public final class ContextOuterClass {
 
         public static final int SERVICES_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List services_;
 
         /**
@@ -31506,7 +32820,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < services_.size(); i++) {
                 output.writeMessage(1, services_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -31518,7 +32832,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < services_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, services_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -31534,7 +32848,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.ServiceList other = (context.ContextOuterClass.ServiceList) obj;
             if (!getServicesList().equals(other.getServicesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -31550,7 +32864,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SERVICES_FIELD_NUMBER;
                 hash = (53 * hash) + getServicesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -31644,23 +32958,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ServiceList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getServicesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (servicesBuilder_ == null) {
                     services_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    services_ = null;
                     servicesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -31686,15 +33006,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ServiceList buildPartial() {
                 context.ContextOuterClass.ServiceList result = new context.ContextOuterClass.ServiceList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.ServiceList result) {
+                int from_bitField0_ = bitField0_;
                 if (servicesBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         services_ = java.util.Collections.unmodifiableList(services_);
@@ -31704,10 +33016,38 @@ public final class ContextOuterClass {
                 } else {
                     result.services_ = servicesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ServiceList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -31747,7 +33087,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -31759,47 +33099,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ServiceList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.Service m = input.readMessage(context.ContextOuterClass.Service.parser(), extensionRegistry);
-                                    if (servicesBuilder_ == null) {
-                                        ensureServicesIsMutable();
-                                        services_.add(m);
-                                    } else {
-                                        servicesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ServiceList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -32069,17 +33379,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ServiceList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ServiceList(input, extensionRegistry);
             }
         };
 
@@ -32159,6 +33459,72 @@ public final class ContextOuterClass {
             return new ServiceFilter();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ServiceFilter(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ServiceIdList.Builder subBuilder = null;
+                                if (serviceIds_ != null) {
+                                    subBuilder = serviceIds_.toBuilder();
+                                }
+                                serviceIds_ = input.readMessage(context.ContextOuterClass.ServiceIdList.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(serviceIds_);
+                                    serviceIds_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 16:
+                            {
+                                includeEndpointIds_ = input.readBool();
+                                break;
+                            }
+                        case 24:
+                            {
+                                includeConstraints_ = input.readBool();
+                                break;
+                            }
+                        case 32:
+                            {
+                                includeConfigRules_ = input.readBool();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ServiceFilter_descriptor;
         }
@@ -32195,12 +33561,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceIdListOrBuilder getServiceIdsOrBuilder() {
-            return serviceIds_ == null ? context.ContextOuterClass.ServiceIdList.getDefaultInstance() : serviceIds_;
+            return getServiceIds();
         }
 
         public static final int INCLUDE_ENDPOINT_IDS_FIELD_NUMBER = 2;
 
-        private boolean includeEndpointIds_ = false;
+        private boolean includeEndpointIds_;
 
         /**
          * bool include_endpoint_ids = 2;
@@ -32213,7 +33579,7 @@ public final class ContextOuterClass {
 
         public static final int INCLUDE_CONSTRAINTS_FIELD_NUMBER = 3;
 
-        private boolean includeConstraints_ = false;
+        private boolean includeConstraints_;
 
         /**
          * bool include_constraints = 3;
@@ -32226,7 +33592,7 @@ public final class ContextOuterClass {
 
         public static final int INCLUDE_CONFIG_RULES_FIELD_NUMBER = 4;
 
-        private boolean includeConfigRules_ = false;
+        private boolean includeConfigRules_;
 
         /**
          * bool include_config_rules = 4;
@@ -32264,7 +33630,7 @@ public final class ContextOuterClass {
             if (includeConfigRules_ != false) {
                 output.writeBool(4, includeConfigRules_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -32285,7 +33651,7 @@ public final class ContextOuterClass {
             if (includeConfigRules_ != false) {
                 size += com.google.protobuf.CodedOutputStream.computeBoolSize(4, includeConfigRules_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -32311,7 +33677,7 @@ public final class ContextOuterClass {
                 return false;
             if (getIncludeConfigRules() != other.getIncludeConfigRules())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -32333,7 +33699,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeConstraints());
             hash = (37 * hash) + INCLUDE_CONFIG_RULES_FIELD_NUMBER;
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeConfigRules());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -32427,19 +33793,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ServiceFilter.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                serviceIds_ = null;
-                if (serviceIdsBuilder_ != null) {
-                    serviceIdsBuilder_.dispose();
+                if (serviceIdsBuilder_ == null) {
+                    serviceIds_ = null;
+                } else {
+                    serviceIds_ = null;
                     serviceIdsBuilder_ = null;
                 }
                 includeEndpointIds_ = false;
@@ -32470,27 +33843,46 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ServiceFilter buildPartial() {
                 context.ContextOuterClass.ServiceFilter result = new context.ContextOuterClass.ServiceFilter(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (serviceIdsBuilder_ == null) {
+                    result.serviceIds_ = serviceIds_;
+                } else {
+                    result.serviceIds_ = serviceIdsBuilder_.build();
                 }
+                result.includeEndpointIds_ = includeEndpointIds_;
+                result.includeConstraints_ = includeConstraints_;
+                result.includeConfigRules_ = includeConfigRules_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ServiceFilter result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.serviceIds_ = serviceIdsBuilder_ == null ? serviceIds_ : serviceIdsBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.includeEndpointIds_ = includeEndpointIds_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.includeConstraints_ = includeConstraints_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.includeConfigRules_ = includeConfigRules_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -32518,7 +33910,7 @@ public final class ContextOuterClass {
                 if (other.getIncludeConfigRules() != false) {
                     setIncludeConfigRules(other.getIncludeConfigRules());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -32530,68 +33922,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ServiceFilter parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getServiceIdsFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 16:
-                                {
-                                    includeEndpointIds_ = input.readBool();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            case 24:
-                                {
-                                    includeConstraints_ = input.readBool();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 32:
-                                {
-                                    includeConfigRules_ = input.readBool();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 32
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ServiceFilter) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.ServiceIdList serviceIds_;
 
             private com.google.protobuf.SingleFieldBuilderV3 serviceIdsBuilder_;
@@ -32601,7 +33945,7 @@ public final class ContextOuterClass {
              * @return Whether the serviceIds field is set.
              */
             public boolean hasServiceIds() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return serviceIdsBuilder_ != null || serviceIds_ != null;
             }
 
             /**
@@ -32625,11 +33969,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     serviceIds_ = value;
+                    onChanged();
                 } else {
                     serviceIdsBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -32639,11 +33982,10 @@ public final class ContextOuterClass {
             public Builder setServiceIds(context.ContextOuterClass.ServiceIdList.Builder builderForValue) {
                 if (serviceIdsBuilder_ == null) {
                     serviceIds_ = builderForValue.build();
+                    onChanged();
                 } else {
                     serviceIdsBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -32652,16 +33994,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeServiceIds(context.ContextOuterClass.ServiceIdList value) {
                 if (serviceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && serviceIds_ != null && serviceIds_ != context.ContextOuterClass.ServiceIdList.getDefaultInstance()) {
-                        getServiceIdsBuilder().mergeFrom(value);
+                    if (serviceIds_ != null) {
+                        serviceIds_ = context.ContextOuterClass.ServiceIdList.newBuilder(serviceIds_).mergeFrom(value).buildPartial();
                     } else {
                         serviceIds_ = value;
                     }
+                    onChanged();
                 } else {
                     serviceIdsBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -32669,13 +34010,13 @@ public final class ContextOuterClass {
              * .context.ServiceIdList service_ids = 1;
              */
             public Builder clearServiceIds() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                serviceIds_ = null;
-                if (serviceIdsBuilder_ != null) {
-                    serviceIdsBuilder_.dispose();
+                if (serviceIdsBuilder_ == null) {
+                    serviceIds_ = null;
+                    onChanged();
+                } else {
+                    serviceIds_ = null;
                     serviceIdsBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -32683,7 +34024,6 @@ public final class ContextOuterClass {
              * .context.ServiceIdList service_ids = 1;
              */
             public context.ContextOuterClass.ServiceIdList.Builder getServiceIdsBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getServiceIdsFieldBuilder().getBuilder();
             }
@@ -32728,7 +34068,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeEndpointIds(boolean value) {
                 includeEndpointIds_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -32738,7 +34077,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeEndpointIds() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 includeEndpointIds_ = false;
                 onChanged();
                 return this;
@@ -32762,7 +34100,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeConstraints(boolean value) {
                 includeConstraints_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -32772,7 +34109,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeConstraints() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 includeConstraints_ = false;
                 onChanged();
                 return this;
@@ -32796,7 +34132,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeConfigRules(boolean value) {
                 includeConfigRules_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -32806,7 +34141,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeConfigRules() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 includeConfigRules_ = false;
                 onChanged();
                 return this;
@@ -32839,17 +34173,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ServiceFilter parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ServiceFilter(input, extensionRegistry);
             }
         };
 
@@ -32928,6 +34252,70 @@ public final class ContextOuterClass {
             return new ServiceEvent();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ServiceEvent(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Event.Builder subBuilder = null;
+                                if (event_ != null) {
+                                    subBuilder = event_.toBuilder();
+                                }
+                                event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(event_);
+                                    event_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.ServiceId.Builder subBuilder = null;
+                                if (serviceId_ != null) {
+                                    subBuilder = serviceId_.toBuilder();
+                                }
+                                serviceId_ = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(serviceId_);
+                                    serviceId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ServiceEvent_descriptor;
         }
@@ -32964,7 +34352,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-            return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+            return getEvent();
         }
 
         public static final int SERVICE_ID_FIELD_NUMBER = 2;
@@ -32994,7 +34382,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
-            return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+            return getServiceId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -33018,7 +34406,7 @@ public final class ContextOuterClass {
             if (serviceId_ != null) {
                 output.writeMessage(2, getServiceId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -33033,7 +34421,7 @@ public final class ContextOuterClass {
             if (serviceId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getServiceId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -33059,7 +34447,7 @@ public final class ContextOuterClass {
                 if (!getServiceId().equals(other.getServiceId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -33079,7 +34467,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SERVICE_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getServiceId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -33173,24 +34561,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ServiceEvent.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                serviceId_ = null;
-                if (serviceIdBuilder_ != null) {
-                    serviceIdBuilder_.dispose();
+                if (serviceIdBuilder_ == null) {
+                    serviceId_ = null;
+                } else {
+                    serviceId_ = null;
                     serviceIdBuilder_ = null;
                 }
                 return this;
@@ -33218,21 +34614,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ServiceEvent buildPartial() {
                 context.ContextOuterClass.ServiceEvent result = new context.ContextOuterClass.ServiceEvent(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (eventBuilder_ == null) {
+                    result.event_ = event_;
+                } else {
+                    result.event_ = eventBuilder_.build();
+                }
+                if (serviceIdBuilder_ == null) {
+                    result.serviceId_ = serviceId_;
+                } else {
+                    result.serviceId_ = serviceIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ServiceEvent result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.event_ = eventBuilder_ == null ? event_ : eventBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.serviceId_ = serviceIdBuilder_ == null ? serviceId_ : serviceIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -33254,7 +34677,7 @@ public final class ContextOuterClass {
                 if (other.hasServiceId()) {
                     mergeServiceId(other.getServiceId());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -33266,54 +34689,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ServiceEvent parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEventFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getServiceIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ServiceEvent) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Event event_;
 
             private com.google.protobuf.SingleFieldBuilderV3 eventBuilder_;
@@ -33323,7 +34712,7 @@ public final class ContextOuterClass {
              * @return Whether the event field is set.
              */
             public boolean hasEvent() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return eventBuilder_ != null || event_ != null;
             }
 
             /**
@@ -33347,11 +34736,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     event_ = value;
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -33361,11 +34749,10 @@ public final class ContextOuterClass {
             public Builder setEvent(context.ContextOuterClass.Event.Builder builderForValue) {
                 if (eventBuilder_ == null) {
                     event_ = builderForValue.build();
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -33374,16 +34761,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEvent(context.ContextOuterClass.Event value) {
                 if (eventBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && event_ != null && event_ != context.ContextOuterClass.Event.getDefaultInstance()) {
-                        getEventBuilder().mergeFrom(value);
+                    if (event_ != null) {
+                        event_ = context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
                     } else {
                         event_ = value;
                     }
+                    onChanged();
                 } else {
                     eventBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -33391,13 +34777,13 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public Builder clearEvent() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                    onChanged();
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -33405,7 +34791,6 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public context.ContextOuterClass.Event.Builder getEventBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEventFieldBuilder().getBuilder();
             }
@@ -33441,7 +34826,7 @@ public final class ContextOuterClass {
              * @return Whether the serviceId field is set.
              */
             public boolean hasServiceId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return serviceIdBuilder_ != null || serviceId_ != null;
             }
 
             /**
@@ -33465,11 +34850,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     serviceId_ = value;
+                    onChanged();
                 } else {
                     serviceIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -33479,11 +34863,10 @@ public final class ContextOuterClass {
             public Builder setServiceId(context.ContextOuterClass.ServiceId.Builder builderForValue) {
                 if (serviceIdBuilder_ == null) {
                     serviceId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     serviceIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -33492,16 +34875,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) {
                 if (serviceIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && serviceId_ != null && serviceId_ != context.ContextOuterClass.ServiceId.getDefaultInstance()) {
-                        getServiceIdBuilder().mergeFrom(value);
+                    if (serviceId_ != null) {
+                        serviceId_ = context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial();
                     } else {
                         serviceId_ = value;
                     }
+                    onChanged();
                 } else {
                     serviceIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -33509,13 +34891,13 @@ public final class ContextOuterClass {
              * .context.ServiceId service_id = 2;
              */
             public Builder clearServiceId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                serviceId_ = null;
-                if (serviceIdBuilder_ != null) {
-                    serviceIdBuilder_.dispose();
+                if (serviceIdBuilder_ == null) {
+                    serviceId_ = null;
+                    onChanged();
+                } else {
+                    serviceId_ = null;
                     serviceIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -33523,7 +34905,6 @@ public final class ContextOuterClass {
              * .context.ServiceId service_id = 2;
              */
             public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getServiceIdFieldBuilder().getBuilder();
             }
@@ -33577,17 +34958,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ServiceEvent parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ServiceEvent(input, extensionRegistry);
             }
         };
 
@@ -33670,6 +35041,70 @@ public final class ContextOuterClass {
             return new SliceId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SliceId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ContextId.Builder subBuilder = null;
+                                if (contextId_ != null) {
+                                    subBuilder = contextId_.toBuilder();
+                                }
+                                contextId_ = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(contextId_);
+                                    contextId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (sliceUuid_ != null) {
+                                    subBuilder = sliceUuid_.toBuilder();
+                                }
+                                sliceUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(sliceUuid_);
+                                    sliceUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_SliceId_descriptor;
         }
@@ -33706,7 +35141,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() {
-            return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
+            return getContextId();
         }
 
         public static final int SLICE_UUID_FIELD_NUMBER = 2;
@@ -33736,7 +35171,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getSliceUuidOrBuilder() {
-            return sliceUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : sliceUuid_;
+            return getSliceUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -33760,7 +35195,7 @@ public final class ContextOuterClass {
             if (sliceUuid_ != null) {
                 output.writeMessage(2, getSliceUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -33775,7 +35210,7 @@ public final class ContextOuterClass {
             if (sliceUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getSliceUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -33801,7 +35236,7 @@ public final class ContextOuterClass {
                 if (!getSliceUuid().equals(other.getSliceUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -33821,7 +35256,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SLICE_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getSliceUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -33919,24 +35354,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.SliceId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
-                sliceUuid_ = null;
-                if (sliceUuidBuilder_ != null) {
-                    sliceUuidBuilder_.dispose();
+                if (sliceUuidBuilder_ == null) {
+                    sliceUuid_ = null;
+                } else {
+                    sliceUuid_ = null;
                     sliceUuidBuilder_ = null;
                 }
                 return this;
@@ -33964,21 +35407,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.SliceId buildPartial() {
                 context.ContextOuterClass.SliceId result = new context.ContextOuterClass.SliceId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (contextIdBuilder_ == null) {
+                    result.contextId_ = contextId_;
+                } else {
+                    result.contextId_ = contextIdBuilder_.build();
+                }
+                if (sliceUuidBuilder_ == null) {
+                    result.sliceUuid_ = sliceUuid_;
+                } else {
+                    result.sliceUuid_ = sliceUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.SliceId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.contextId_ = contextIdBuilder_ == null ? contextId_ : contextIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.sliceUuid_ = sliceUuidBuilder_ == null ? sliceUuid_ : sliceUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -34000,7 +35470,7 @@ public final class ContextOuterClass {
                 if (other.hasSliceUuid()) {
                     mergeSliceUuid(other.getSliceUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -34012,54 +35482,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.SliceId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getContextIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getSliceUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.SliceId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.ContextId contextId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 contextIdBuilder_;
@@ -34069,7 +35505,7 @@ public final class ContextOuterClass {
              * @return Whether the contextId field is set.
              */
             public boolean hasContextId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return contextIdBuilder_ != null || contextId_ != null;
             }
 
             /**
@@ -34093,11 +35529,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     contextId_ = value;
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -34107,11 +35542,10 @@ public final class ContextOuterClass {
             public Builder setContextId(context.ContextOuterClass.ContextId.Builder builderForValue) {
                 if (contextIdBuilder_ == null) {
                     contextId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -34120,16 +35554,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeContextId(context.ContextOuterClass.ContextId value) {
                 if (contextIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && contextId_ != null && contextId_ != context.ContextOuterClass.ContextId.getDefaultInstance()) {
-                        getContextIdBuilder().mergeFrom(value);
+                    if (contextId_ != null) {
+                        contextId_ = context.ContextOuterClass.ContextId.newBuilder(contextId_).mergeFrom(value).buildPartial();
                     } else {
                         contextId_ = value;
                     }
+                    onChanged();
                 } else {
                     contextIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -34137,13 +35570,13 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public Builder clearContextId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                    onChanged();
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -34151,7 +35584,6 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public context.ContextOuterClass.ContextId.Builder getContextIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getContextIdFieldBuilder().getBuilder();
             }
@@ -34187,7 +35619,7 @@ public final class ContextOuterClass {
              * @return Whether the sliceUuid field is set.
              */
             public boolean hasSliceUuid() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return sliceUuidBuilder_ != null || sliceUuid_ != null;
             }
 
             /**
@@ -34211,11 +35643,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     sliceUuid_ = value;
+                    onChanged();
                 } else {
                     sliceUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -34225,11 +35656,10 @@ public final class ContextOuterClass {
             public Builder setSliceUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (sliceUuidBuilder_ == null) {
                     sliceUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     sliceUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -34238,16 +35668,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeSliceUuid(context.ContextOuterClass.Uuid value) {
                 if (sliceUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && sliceUuid_ != null && sliceUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getSliceUuidBuilder().mergeFrom(value);
+                    if (sliceUuid_ != null) {
+                        sliceUuid_ = context.ContextOuterClass.Uuid.newBuilder(sliceUuid_).mergeFrom(value).buildPartial();
                     } else {
                         sliceUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     sliceUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -34255,13 +35684,13 @@ public final class ContextOuterClass {
              * .context.Uuid slice_uuid = 2;
              */
             public Builder clearSliceUuid() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                sliceUuid_ = null;
-                if (sliceUuidBuilder_ != null) {
-                    sliceUuidBuilder_.dispose();
+                if (sliceUuidBuilder_ == null) {
+                    sliceUuid_ = null;
+                    onChanged();
+                } else {
+                    sliceUuid_ = null;
                     sliceUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -34269,7 +35698,6 @@ public final class ContextOuterClass {
              * .context.Uuid slice_uuid = 2;
              */
             public context.ContextOuterClass.Uuid.Builder getSliceUuidBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getSliceUuidFieldBuilder().getBuilder();
             }
@@ -34323,17 +35751,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public SliceId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SliceId(input, extensionRegistry);
             }
         };
 
@@ -34580,6 +35998,164 @@ public final class ContextOuterClass {
             return new Slice();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Slice(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.SliceId.Builder subBuilder = null;
+                                if (sliceId_ != null) {
+                                    subBuilder = sliceId_.toBuilder();
+                                }
+                                sliceId_ = input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(sliceId_);
+                                    sliceId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    sliceEndpointIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                sliceEndpointIds_.add(input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 34:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                                    sliceConstraints_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                sliceConstraints_.add(input.readMessage(context.ContextOuterClass.Constraint.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 42:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000004) != 0)) {
+                                    sliceServiceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000004;
+                                }
+                                sliceServiceIds_.add(input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 50:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000008) != 0)) {
+                                    sliceSubsliceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000008;
+                                }
+                                sliceSubsliceIds_.add(input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 58:
+                            {
+                                context.ContextOuterClass.SliceStatus.Builder subBuilder = null;
+                                if (sliceStatus_ != null) {
+                                    subBuilder = sliceStatus_.toBuilder();
+                                }
+                                sliceStatus_ = input.readMessage(context.ContextOuterClass.SliceStatus.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(sliceStatus_);
+                                    sliceStatus_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 66:
+                            {
+                                context.ContextOuterClass.SliceConfig.Builder subBuilder = null;
+                                if (sliceConfig_ != null) {
+                                    subBuilder = sliceConfig_.toBuilder();
+                                }
+                                sliceConfig_ = input.readMessage(context.ContextOuterClass.SliceConfig.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(sliceConfig_);
+                                    sliceConfig_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 74:
+                            {
+                                context.ContextOuterClass.SliceOwner.Builder subBuilder = null;
+                                if (sliceOwner_ != null) {
+                                    subBuilder = sliceOwner_.toBuilder();
+                                }
+                                sliceOwner_ = input.readMessage(context.ContextOuterClass.SliceOwner.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(sliceOwner_);
+                                    sliceOwner_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 82:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (timestamp_ != null) {
+                                    subBuilder = timestamp_.toBuilder();
+                                }
+                                timestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(timestamp_);
+                                    timestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    sliceEndpointIds_ = java.util.Collections.unmodifiableList(sliceEndpointIds_);
+                }
+                if (((mutable_bitField0_ & 0x00000002) != 0)) {
+                    sliceConstraints_ = java.util.Collections.unmodifiableList(sliceConstraints_);
+                }
+                if (((mutable_bitField0_ & 0x00000004) != 0)) {
+                    sliceServiceIds_ = java.util.Collections.unmodifiableList(sliceServiceIds_);
+                }
+                if (((mutable_bitField0_ & 0x00000008) != 0)) {
+                    sliceSubsliceIds_ = java.util.Collections.unmodifiableList(sliceSubsliceIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Slice_descriptor;
         }
@@ -34616,13 +36192,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.SliceIdOrBuilder getSliceIdOrBuilder() {
-            return sliceId_ == null ? context.ContextOuterClass.SliceId.getDefaultInstance() : sliceId_;
+            return getSliceId();
         }
 
         public static final int NAME_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 2;
@@ -34659,7 +36234,6 @@ public final class ContextOuterClass {
 
         public static final int SLICE_ENDPOINT_IDS_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
         private java.util.List sliceEndpointIds_;
 
         /**
@@ -34704,7 +36278,6 @@ public final class ContextOuterClass {
 
         public static final int SLICE_CONSTRAINTS_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
         private java.util.List sliceConstraints_;
 
         /**
@@ -34749,7 +36322,6 @@ public final class ContextOuterClass {
 
         public static final int SLICE_SERVICE_IDS_FIELD_NUMBER = 5;
 
-        @SuppressWarnings("serial")
         private java.util.List sliceServiceIds_;
 
         /**
@@ -34794,7 +36366,6 @@ public final class ContextOuterClass {
 
         public static final int SLICE_SUBSLICE_IDS_FIELD_NUMBER = 6;
 
-        @SuppressWarnings("serial")
         private java.util.List sliceSubsliceIds_;
 
         /**
@@ -34864,7 +36435,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.SliceStatusOrBuilder getSliceStatusOrBuilder() {
-            return sliceStatus_ == null ? context.ContextOuterClass.SliceStatus.getDefaultInstance() : sliceStatus_;
+            return getSliceStatus();
         }
 
         public static final int SLICE_CONFIG_FIELD_NUMBER = 8;
@@ -34894,7 +36465,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.SliceConfigOrBuilder getSliceConfigOrBuilder() {
-            return sliceConfig_ == null ? context.ContextOuterClass.SliceConfig.getDefaultInstance() : sliceConfig_;
+            return getSliceConfig();
         }
 
         public static final int SLICE_OWNER_FIELD_NUMBER = 9;
@@ -34924,7 +36495,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.SliceOwnerOrBuilder getSliceOwnerOrBuilder() {
-            return sliceOwner_ == null ? context.ContextOuterClass.SliceOwner.getDefaultInstance() : sliceOwner_;
+            return getSliceOwner();
         }
 
         public static final int TIMESTAMP_FIELD_NUMBER = 10;
@@ -34954,7 +36525,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-            return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+            return getTimestamp();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -34975,7 +36546,7 @@ public final class ContextOuterClass {
             if (sliceId_ != null) {
                 output.writeMessage(1, getSliceId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
             }
             for (int i = 0; i < sliceEndpointIds_.size(); i++) {
@@ -35002,7 +36573,7 @@ public final class ContextOuterClass {
             if (timestamp_ != null) {
                 output.writeMessage(10, getTimestamp());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -35014,7 +36585,7 @@ public final class ContextOuterClass {
             if (sliceId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getSliceId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
             }
             for (int i = 0; i < sliceEndpointIds_.size(); i++) {
@@ -35041,7 +36612,7 @@ public final class ContextOuterClass {
             if (timestamp_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(10, getTimestamp());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -35095,7 +36666,7 @@ public final class ContextOuterClass {
                 if (!getTimestamp().equals(other.getTimestamp()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -35145,7 +36716,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
                 hash = (53 * hash) + getTimestamp().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -35239,68 +36810,79 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Slice.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getSliceEndpointIdsFieldBuilder();
+                    getSliceConstraintsFieldBuilder();
+                    getSliceServiceIdsFieldBuilder();
+                    getSliceSubsliceIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                sliceId_ = null;
-                if (sliceIdBuilder_ != null) {
-                    sliceIdBuilder_.dispose();
+                if (sliceIdBuilder_ == null) {
+                    sliceId_ = null;
+                } else {
+                    sliceId_ = null;
                     sliceIdBuilder_ = null;
                 }
                 name_ = "";
                 if (sliceEndpointIdsBuilder_ == null) {
                     sliceEndpointIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    sliceEndpointIds_ = null;
                     sliceEndpointIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000004);
                 if (sliceConstraintsBuilder_ == null) {
                     sliceConstraints_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
                 } else {
-                    sliceConstraints_ = null;
                     sliceConstraintsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000008);
                 if (sliceServiceIdsBuilder_ == null) {
                     sliceServiceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000004);
                 } else {
-                    sliceServiceIds_ = null;
                     sliceServiceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000010);
                 if (sliceSubsliceIdsBuilder_ == null) {
                     sliceSubsliceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000008);
                 } else {
-                    sliceSubsliceIds_ = null;
                     sliceSubsliceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000020);
-                sliceStatus_ = null;
-                if (sliceStatusBuilder_ != null) {
-                    sliceStatusBuilder_.dispose();
+                if (sliceStatusBuilder_ == null) {
+                    sliceStatus_ = null;
+                } else {
+                    sliceStatus_ = null;
                     sliceStatusBuilder_ = null;
                 }
-                sliceConfig_ = null;
-                if (sliceConfigBuilder_ != null) {
-                    sliceConfigBuilder_.dispose();
+                if (sliceConfigBuilder_ == null) {
+                    sliceConfig_ = null;
+                } else {
+                    sliceConfig_ = null;
                     sliceConfigBuilder_ = null;
                 }
-                sliceOwner_ = null;
-                if (sliceOwnerBuilder_ != null) {
-                    sliceOwnerBuilder_.dispose();
+                if (sliceOwnerBuilder_ == null) {
+                    sliceOwner_ = null;
+                } else {
+                    sliceOwner_ = null;
                     sliceOwnerBuilder_ = null;
                 }
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
                 return this;
@@ -35328,73 +36910,101 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Slice buildPartial() {
                 context.ContextOuterClass.Slice result = new context.ContextOuterClass.Slice(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (sliceIdBuilder_ == null) {
+                    result.sliceId_ = sliceId_;
+                } else {
+                    result.sliceId_ = sliceIdBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Slice result) {
+                result.name_ = name_;
                 if (sliceEndpointIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         sliceEndpointIds_ = java.util.Collections.unmodifiableList(sliceEndpointIds_);
-                        bitField0_ = (bitField0_ & ~0x00000004);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.sliceEndpointIds_ = sliceEndpointIds_;
                 } else {
                     result.sliceEndpointIds_ = sliceEndpointIdsBuilder_.build();
                 }
                 if (sliceConstraintsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0)) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
                         sliceConstraints_ = java.util.Collections.unmodifiableList(sliceConstraints_);
-                        bitField0_ = (bitField0_ & ~0x00000008);
+                        bitField0_ = (bitField0_ & ~0x00000002);
                     }
                     result.sliceConstraints_ = sliceConstraints_;
                 } else {
                     result.sliceConstraints_ = sliceConstraintsBuilder_.build();
                 }
                 if (sliceServiceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000010) != 0)) {
+                    if (((bitField0_ & 0x00000004) != 0)) {
                         sliceServiceIds_ = java.util.Collections.unmodifiableList(sliceServiceIds_);
-                        bitField0_ = (bitField0_ & ~0x00000010);
+                        bitField0_ = (bitField0_ & ~0x00000004);
                     }
                     result.sliceServiceIds_ = sliceServiceIds_;
                 } else {
                     result.sliceServiceIds_ = sliceServiceIdsBuilder_.build();
                 }
                 if (sliceSubsliceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000020) != 0)) {
+                    if (((bitField0_ & 0x00000008) != 0)) {
                         sliceSubsliceIds_ = java.util.Collections.unmodifiableList(sliceSubsliceIds_);
-                        bitField0_ = (bitField0_ & ~0x00000020);
+                        bitField0_ = (bitField0_ & ~0x00000008);
                     }
                     result.sliceSubsliceIds_ = sliceSubsliceIds_;
                 } else {
                     result.sliceSubsliceIds_ = sliceSubsliceIdsBuilder_.build();
                 }
-            }
-
-            private void buildPartial0(context.ContextOuterClass.Slice result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.sliceId_ = sliceIdBuilder_ == null ? sliceId_ : sliceIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000040) != 0)) {
-                    result.sliceStatus_ = sliceStatusBuilder_ == null ? sliceStatus_ : sliceStatusBuilder_.build();
+                if (sliceStatusBuilder_ == null) {
+                    result.sliceStatus_ = sliceStatus_;
+                } else {
+                    result.sliceStatus_ = sliceStatusBuilder_.build();
                 }
-                if (((from_bitField0_ & 0x00000080) != 0)) {
-                    result.sliceConfig_ = sliceConfigBuilder_ == null ? sliceConfig_ : sliceConfigBuilder_.build();
+                if (sliceConfigBuilder_ == null) {
+                    result.sliceConfig_ = sliceConfig_;
+                } else {
+                    result.sliceConfig_ = sliceConfigBuilder_.build();
                 }
-                if (((from_bitField0_ & 0x00000100) != 0)) {
-                    result.sliceOwner_ = sliceOwnerBuilder_ == null ? sliceOwner_ : sliceOwnerBuilder_.build();
+                if (sliceOwnerBuilder_ == null) {
+                    result.sliceOwner_ = sliceOwner_;
+                } else {
+                    result.sliceOwner_ = sliceOwnerBuilder_.build();
                 }
-                if (((from_bitField0_ & 0x00000200) != 0)) {
-                    result.timestamp_ = timestampBuilder_ == null ? timestamp_ : timestampBuilder_.build();
+                if (timestampBuilder_ == null) {
+                    result.timestamp_ = timestamp_;
+                } else {
+                    result.timestamp_ = timestampBuilder_.build();
                 }
+                onBuilt();
+                return result;
+            }
+
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -35415,14 +37025,13 @@ public final class ContextOuterClass {
                 }
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (sliceEndpointIdsBuilder_ == null) {
                     if (!other.sliceEndpointIds_.isEmpty()) {
                         if (sliceEndpointIds_.isEmpty()) {
                             sliceEndpointIds_ = other.sliceEndpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureSliceEndpointIdsIsMutable();
                             sliceEndpointIds_.addAll(other.sliceEndpointIds_);
@@ -35435,7 +37044,7 @@ public final class ContextOuterClass {
                             sliceEndpointIdsBuilder_.dispose();
                             sliceEndpointIdsBuilder_ = null;
                             sliceEndpointIds_ = other.sliceEndpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             sliceEndpointIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getSliceEndpointIdsFieldBuilder() : null;
                         } else {
                             sliceEndpointIdsBuilder_.addAllMessages(other.sliceEndpointIds_);
@@ -35446,7 +37055,7 @@ public final class ContextOuterClass {
                     if (!other.sliceConstraints_.isEmpty()) {
                         if (sliceConstraints_.isEmpty()) {
                             sliceConstraints_ = other.sliceConstraints_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                         } else {
                             ensureSliceConstraintsIsMutable();
                             sliceConstraints_.addAll(other.sliceConstraints_);
@@ -35459,7 +37068,7 @@ public final class ContextOuterClass {
                             sliceConstraintsBuilder_.dispose();
                             sliceConstraintsBuilder_ = null;
                             sliceConstraints_ = other.sliceConstraints_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                             sliceConstraintsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getSliceConstraintsFieldBuilder() : null;
                         } else {
                             sliceConstraintsBuilder_.addAllMessages(other.sliceConstraints_);
@@ -35470,7 +37079,7 @@ public final class ContextOuterClass {
                     if (!other.sliceServiceIds_.isEmpty()) {
                         if (sliceServiceIds_.isEmpty()) {
                             sliceServiceIds_ = other.sliceServiceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000010);
+                            bitField0_ = (bitField0_ & ~0x00000004);
                         } else {
                             ensureSliceServiceIdsIsMutable();
                             sliceServiceIds_.addAll(other.sliceServiceIds_);
@@ -35483,7 +37092,7 @@ public final class ContextOuterClass {
                             sliceServiceIdsBuilder_.dispose();
                             sliceServiceIdsBuilder_ = null;
                             sliceServiceIds_ = other.sliceServiceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000010);
+                            bitField0_ = (bitField0_ & ~0x00000004);
                             sliceServiceIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getSliceServiceIdsFieldBuilder() : null;
                         } else {
                             sliceServiceIdsBuilder_.addAllMessages(other.sliceServiceIds_);
@@ -35494,7 +37103,7 @@ public final class ContextOuterClass {
                     if (!other.sliceSubsliceIds_.isEmpty()) {
                         if (sliceSubsliceIds_.isEmpty()) {
                             sliceSubsliceIds_ = other.sliceSubsliceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000020);
+                            bitField0_ = (bitField0_ & ~0x00000008);
                         } else {
                             ensureSliceSubsliceIdsIsMutable();
                             sliceSubsliceIds_.addAll(other.sliceSubsliceIds_);
@@ -35507,7 +37116,7 @@ public final class ContextOuterClass {
                             sliceSubsliceIdsBuilder_.dispose();
                             sliceSubsliceIdsBuilder_ = null;
                             sliceSubsliceIds_ = other.sliceSubsliceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000020);
+                            bitField0_ = (bitField0_ & ~0x00000008);
                             sliceSubsliceIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getSliceSubsliceIdsFieldBuilder() : null;
                         } else {
                             sliceSubsliceIdsBuilder_.addAllMessages(other.sliceSubsliceIds_);
@@ -35526,7 +37135,7 @@ public final class ContextOuterClass {
                 if (other.hasTimestamp()) {
                     mergeTimestamp(other.getTimestamp());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -35538,125 +37147,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Slice parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getSliceIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    context.ContextOuterClass.EndPointId m = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-                                    if (sliceEndpointIdsBuilder_ == null) {
-                                        ensureSliceEndpointIdsIsMutable();
-                                        sliceEndpointIds_.add(m);
-                                    } else {
-                                        sliceEndpointIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    context.ContextOuterClass.Constraint m = input.readMessage(context.ContextOuterClass.Constraint.parser(), extensionRegistry);
-                                    if (sliceConstraintsBuilder_ == null) {
-                                        ensureSliceConstraintsIsMutable();
-                                        sliceConstraints_.add(m);
-                                    } else {
-                                        sliceConstraintsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    context.ContextOuterClass.ServiceId m = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
-                                    if (sliceServiceIdsBuilder_ == null) {
-                                        ensureSliceServiceIdsIsMutable();
-                                        sliceServiceIds_.add(m);
-                                    } else {
-                                        sliceServiceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 42
-                            case 50:
-                                {
-                                    context.ContextOuterClass.SliceId m = input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry);
-                                    if (sliceSubsliceIdsBuilder_ == null) {
-                                        ensureSliceSubsliceIdsIsMutable();
-                                        sliceSubsliceIds_.add(m);
-                                    } else {
-                                        sliceSubsliceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 50
-                            case 58:
-                                {
-                                    input.readMessage(getSliceStatusFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000040;
-                                    break;
-                                }
-                            // case 58
-                            case 66:
-                                {
-                                    input.readMessage(getSliceConfigFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000080;
-                                    break;
-                                }
-                            // case 66
-                            case 74:
-                                {
-                                    input.readMessage(getSliceOwnerFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000100;
-                                    break;
-                                }
-                            // case 74
-                            case 82:
-                                {
-                                    input.readMessage(getTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000200;
-                                    break;
-                                }
-                            // case 82
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Slice) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -35671,7 +37172,7 @@ public final class ContextOuterClass {
              * @return Whether the sliceId field is set.
              */
             public boolean hasSliceId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return sliceIdBuilder_ != null || sliceId_ != null;
             }
 
             /**
@@ -35695,11 +37196,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     sliceId_ = value;
+                    onChanged();
                 } else {
                     sliceIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -35709,11 +37209,10 @@ public final class ContextOuterClass {
             public Builder setSliceId(context.ContextOuterClass.SliceId.Builder builderForValue) {
                 if (sliceIdBuilder_ == null) {
                     sliceId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     sliceIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -35722,16 +37221,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeSliceId(context.ContextOuterClass.SliceId value) {
                 if (sliceIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && sliceId_ != null && sliceId_ != context.ContextOuterClass.SliceId.getDefaultInstance()) {
-                        getSliceIdBuilder().mergeFrom(value);
+                    if (sliceId_ != null) {
+                        sliceId_ = context.ContextOuterClass.SliceId.newBuilder(sliceId_).mergeFrom(value).buildPartial();
                     } else {
                         sliceId_ = value;
                     }
+                    onChanged();
                 } else {
                     sliceIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -35739,13 +37237,13 @@ public final class ContextOuterClass {
              * .context.SliceId slice_id = 1;
              */
             public Builder clearSliceId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                sliceId_ = null;
-                if (sliceIdBuilder_ != null) {
-                    sliceIdBuilder_.dispose();
+                if (sliceIdBuilder_ == null) {
+                    sliceId_ = null;
+                    onChanged();
+                } else {
+                    sliceId_ = null;
                     sliceIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -35753,7 +37251,6 @@ public final class ContextOuterClass {
              * .context.SliceId slice_id = 1;
              */
             public context.ContextOuterClass.SliceId.Builder getSliceIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getSliceIdFieldBuilder().getBuilder();
             }
@@ -35823,7 +37320,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -35834,7 +37330,6 @@ public final class ContextOuterClass {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -35850,7 +37345,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -35858,9 +37352,9 @@ public final class ContextOuterClass {
             private java.util.List sliceEndpointIds_ = java.util.Collections.emptyList();
 
             private void ensureSliceEndpointIdsIsMutable() {
-                if (!((bitField0_ & 0x00000004) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     sliceEndpointIds_ = new java.util.ArrayList(sliceEndpointIds_);
-                    bitField0_ |= 0x00000004;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -36012,7 +37506,7 @@ public final class ContextOuterClass {
             public Builder clearSliceEndpointIds() {
                 if (sliceEndpointIdsBuilder_ == null) {
                     sliceEndpointIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000004);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     sliceEndpointIdsBuilder_.clear();
@@ -36086,7 +37580,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getSliceEndpointIdsFieldBuilder() {
                 if (sliceEndpointIdsBuilder_ == null) {
-                    sliceEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceEndpointIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
+                    sliceEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceEndpointIds_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     sliceEndpointIds_ = null;
                 }
                 return sliceEndpointIdsBuilder_;
@@ -36095,9 +37589,9 @@ public final class ContextOuterClass {
             private java.util.List sliceConstraints_ = java.util.Collections.emptyList();
 
             private void ensureSliceConstraintsIsMutable() {
-                if (!((bitField0_ & 0x00000008) != 0)) {
+                if (!((bitField0_ & 0x00000002) != 0)) {
                     sliceConstraints_ = new java.util.ArrayList(sliceConstraints_);
-                    bitField0_ |= 0x00000008;
+                    bitField0_ |= 0x00000002;
                 }
             }
 
@@ -36249,7 +37743,7 @@ public final class ContextOuterClass {
             public Builder clearSliceConstraints() {
                 if (sliceConstraintsBuilder_ == null) {
                     sliceConstraints_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000008);
+                    bitField0_ = (bitField0_ & ~0x00000002);
                     onChanged();
                 } else {
                     sliceConstraintsBuilder_.clear();
@@ -36323,7 +37817,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getSliceConstraintsFieldBuilder() {
                 if (sliceConstraintsBuilder_ == null) {
-                    sliceConstraintsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceConstraints_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean());
+                    sliceConstraintsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceConstraints_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
                     sliceConstraints_ = null;
                 }
                 return sliceConstraintsBuilder_;
@@ -36332,9 +37826,9 @@ public final class ContextOuterClass {
             private java.util.List sliceServiceIds_ = java.util.Collections.emptyList();
 
             private void ensureSliceServiceIdsIsMutable() {
-                if (!((bitField0_ & 0x00000010) != 0)) {
+                if (!((bitField0_ & 0x00000004) != 0)) {
                     sliceServiceIds_ = new java.util.ArrayList(sliceServiceIds_);
-                    bitField0_ |= 0x00000010;
+                    bitField0_ |= 0x00000004;
                 }
             }
 
@@ -36486,7 +37980,7 @@ public final class ContextOuterClass {
             public Builder clearSliceServiceIds() {
                 if (sliceServiceIdsBuilder_ == null) {
                     sliceServiceIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000010);
+                    bitField0_ = (bitField0_ & ~0x00000004);
                     onChanged();
                 } else {
                     sliceServiceIdsBuilder_.clear();
@@ -36560,7 +38054,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getSliceServiceIdsFieldBuilder() {
                 if (sliceServiceIdsBuilder_ == null) {
-                    sliceServiceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceServiceIds_, ((bitField0_ & 0x00000010) != 0), getParentForChildren(), isClean());
+                    sliceServiceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceServiceIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
                     sliceServiceIds_ = null;
                 }
                 return sliceServiceIdsBuilder_;
@@ -36569,9 +38063,9 @@ public final class ContextOuterClass {
             private java.util.List sliceSubsliceIds_ = java.util.Collections.emptyList();
 
             private void ensureSliceSubsliceIdsIsMutable() {
-                if (!((bitField0_ & 0x00000020) != 0)) {
+                if (!((bitField0_ & 0x00000008) != 0)) {
                     sliceSubsliceIds_ = new java.util.ArrayList(sliceSubsliceIds_);
-                    bitField0_ |= 0x00000020;
+                    bitField0_ |= 0x00000008;
                 }
             }
 
@@ -36723,7 +38217,7 @@ public final class ContextOuterClass {
             public Builder clearSliceSubsliceIds() {
                 if (sliceSubsliceIdsBuilder_ == null) {
                     sliceSubsliceIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000020);
+                    bitField0_ = (bitField0_ & ~0x00000008);
                     onChanged();
                 } else {
                     sliceSubsliceIdsBuilder_.clear();
@@ -36797,7 +38291,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getSliceSubsliceIdsFieldBuilder() {
                 if (sliceSubsliceIdsBuilder_ == null) {
-                    sliceSubsliceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceSubsliceIds_, ((bitField0_ & 0x00000020) != 0), getParentForChildren(), isClean());
+                    sliceSubsliceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(sliceSubsliceIds_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean());
                     sliceSubsliceIds_ = null;
                 }
                 return sliceSubsliceIdsBuilder_;
@@ -36812,7 +38306,7 @@ public final class ContextOuterClass {
              * @return Whether the sliceStatus field is set.
              */
             public boolean hasSliceStatus() {
-                return ((bitField0_ & 0x00000040) != 0);
+                return sliceStatusBuilder_ != null || sliceStatus_ != null;
             }
 
             /**
@@ -36836,11 +38330,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     sliceStatus_ = value;
+                    onChanged();
                 } else {
                     sliceStatusBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000040;
-                onChanged();
                 return this;
             }
 
@@ -36850,11 +38343,10 @@ public final class ContextOuterClass {
             public Builder setSliceStatus(context.ContextOuterClass.SliceStatus.Builder builderForValue) {
                 if (sliceStatusBuilder_ == null) {
                     sliceStatus_ = builderForValue.build();
+                    onChanged();
                 } else {
                     sliceStatusBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000040;
-                onChanged();
                 return this;
             }
 
@@ -36863,16 +38355,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeSliceStatus(context.ContextOuterClass.SliceStatus value) {
                 if (sliceStatusBuilder_ == null) {
-                    if (((bitField0_ & 0x00000040) != 0) && sliceStatus_ != null && sliceStatus_ != context.ContextOuterClass.SliceStatus.getDefaultInstance()) {
-                        getSliceStatusBuilder().mergeFrom(value);
+                    if (sliceStatus_ != null) {
+                        sliceStatus_ = context.ContextOuterClass.SliceStatus.newBuilder(sliceStatus_).mergeFrom(value).buildPartial();
                     } else {
                         sliceStatus_ = value;
                     }
+                    onChanged();
                 } else {
                     sliceStatusBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000040;
-                onChanged();
                 return this;
             }
 
@@ -36880,13 +38371,13 @@ public final class ContextOuterClass {
              * .context.SliceStatus slice_status = 7;
              */
             public Builder clearSliceStatus() {
-                bitField0_ = (bitField0_ & ~0x00000040);
-                sliceStatus_ = null;
-                if (sliceStatusBuilder_ != null) {
-                    sliceStatusBuilder_.dispose();
+                if (sliceStatusBuilder_ == null) {
+                    sliceStatus_ = null;
+                    onChanged();
+                } else {
+                    sliceStatus_ = null;
                     sliceStatusBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -36894,7 +38385,6 @@ public final class ContextOuterClass {
              * .context.SliceStatus slice_status = 7;
              */
             public context.ContextOuterClass.SliceStatus.Builder getSliceStatusBuilder() {
-                bitField0_ |= 0x00000040;
                 onChanged();
                 return getSliceStatusFieldBuilder().getBuilder();
             }
@@ -36930,7 +38420,7 @@ public final class ContextOuterClass {
              * @return Whether the sliceConfig field is set.
              */
             public boolean hasSliceConfig() {
-                return ((bitField0_ & 0x00000080) != 0);
+                return sliceConfigBuilder_ != null || sliceConfig_ != null;
             }
 
             /**
@@ -36954,11 +38444,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     sliceConfig_ = value;
+                    onChanged();
                 } else {
                     sliceConfigBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000080;
-                onChanged();
                 return this;
             }
 
@@ -36968,11 +38457,10 @@ public final class ContextOuterClass {
             public Builder setSliceConfig(context.ContextOuterClass.SliceConfig.Builder builderForValue) {
                 if (sliceConfigBuilder_ == null) {
                     sliceConfig_ = builderForValue.build();
+                    onChanged();
                 } else {
                     sliceConfigBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000080;
-                onChanged();
                 return this;
             }
 
@@ -36981,16 +38469,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeSliceConfig(context.ContextOuterClass.SliceConfig value) {
                 if (sliceConfigBuilder_ == null) {
-                    if (((bitField0_ & 0x00000080) != 0) && sliceConfig_ != null && sliceConfig_ != context.ContextOuterClass.SliceConfig.getDefaultInstance()) {
-                        getSliceConfigBuilder().mergeFrom(value);
+                    if (sliceConfig_ != null) {
+                        sliceConfig_ = context.ContextOuterClass.SliceConfig.newBuilder(sliceConfig_).mergeFrom(value).buildPartial();
                     } else {
                         sliceConfig_ = value;
                     }
+                    onChanged();
                 } else {
                     sliceConfigBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000080;
-                onChanged();
                 return this;
             }
 
@@ -36998,13 +38485,13 @@ public final class ContextOuterClass {
              * .context.SliceConfig slice_config = 8;
              */
             public Builder clearSliceConfig() {
-                bitField0_ = (bitField0_ & ~0x00000080);
-                sliceConfig_ = null;
-                if (sliceConfigBuilder_ != null) {
-                    sliceConfigBuilder_.dispose();
+                if (sliceConfigBuilder_ == null) {
+                    sliceConfig_ = null;
+                    onChanged();
+                } else {
+                    sliceConfig_ = null;
                     sliceConfigBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -37012,7 +38499,6 @@ public final class ContextOuterClass {
              * .context.SliceConfig slice_config = 8;
              */
             public context.ContextOuterClass.SliceConfig.Builder getSliceConfigBuilder() {
-                bitField0_ |= 0x00000080;
                 onChanged();
                 return getSliceConfigFieldBuilder().getBuilder();
             }
@@ -37048,7 +38534,7 @@ public final class ContextOuterClass {
              * @return Whether the sliceOwner field is set.
              */
             public boolean hasSliceOwner() {
-                return ((bitField0_ & 0x00000100) != 0);
+                return sliceOwnerBuilder_ != null || sliceOwner_ != null;
             }
 
             /**
@@ -37072,11 +38558,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     sliceOwner_ = value;
+                    onChanged();
                 } else {
                     sliceOwnerBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000100;
-                onChanged();
                 return this;
             }
 
@@ -37086,11 +38571,10 @@ public final class ContextOuterClass {
             public Builder setSliceOwner(context.ContextOuterClass.SliceOwner.Builder builderForValue) {
                 if (sliceOwnerBuilder_ == null) {
                     sliceOwner_ = builderForValue.build();
+                    onChanged();
                 } else {
                     sliceOwnerBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000100;
-                onChanged();
                 return this;
             }
 
@@ -37099,16 +38583,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeSliceOwner(context.ContextOuterClass.SliceOwner value) {
                 if (sliceOwnerBuilder_ == null) {
-                    if (((bitField0_ & 0x00000100) != 0) && sliceOwner_ != null && sliceOwner_ != context.ContextOuterClass.SliceOwner.getDefaultInstance()) {
-                        getSliceOwnerBuilder().mergeFrom(value);
+                    if (sliceOwner_ != null) {
+                        sliceOwner_ = context.ContextOuterClass.SliceOwner.newBuilder(sliceOwner_).mergeFrom(value).buildPartial();
                     } else {
                         sliceOwner_ = value;
                     }
+                    onChanged();
                 } else {
                     sliceOwnerBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000100;
-                onChanged();
                 return this;
             }
 
@@ -37116,13 +38599,13 @@ public final class ContextOuterClass {
              * .context.SliceOwner slice_owner = 9;
              */
             public Builder clearSliceOwner() {
-                bitField0_ = (bitField0_ & ~0x00000100);
-                sliceOwner_ = null;
-                if (sliceOwnerBuilder_ != null) {
-                    sliceOwnerBuilder_.dispose();
+                if (sliceOwnerBuilder_ == null) {
+                    sliceOwner_ = null;
+                    onChanged();
+                } else {
+                    sliceOwner_ = null;
                     sliceOwnerBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -37130,7 +38613,6 @@ public final class ContextOuterClass {
              * .context.SliceOwner slice_owner = 9;
              */
             public context.ContextOuterClass.SliceOwner.Builder getSliceOwnerBuilder() {
-                bitField0_ |= 0x00000100;
                 onChanged();
                 return getSliceOwnerFieldBuilder().getBuilder();
             }
@@ -37166,7 +38648,7 @@ public final class ContextOuterClass {
              * @return Whether the timestamp field is set.
              */
             public boolean hasTimestamp() {
-                return ((bitField0_ & 0x00000200) != 0);
+                return timestampBuilder_ != null || timestamp_ != null;
             }
 
             /**
@@ -37190,11 +38672,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     timestamp_ = value;
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000200;
-                onChanged();
                 return this;
             }
 
@@ -37204,11 +38685,10 @@ public final class ContextOuterClass {
             public Builder setTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (timestampBuilder_ == null) {
                     timestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000200;
-                onChanged();
                 return this;
             }
 
@@ -37217,16 +38697,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (timestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000200) != 0) && timestamp_ != null && timestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getTimestampBuilder().mergeFrom(value);
+                    if (timestamp_ != null) {
+                        timestamp_ = context.ContextOuterClass.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial();
                     } else {
                         timestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     timestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000200;
-                onChanged();
                 return this;
             }
 
@@ -37234,13 +38713,13 @@ public final class ContextOuterClass {
              * .context.Timestamp timestamp = 10;
              */
             public Builder clearTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000200);
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                    onChanged();
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -37248,7 +38727,6 @@ public final class ContextOuterClass {
              * .context.Timestamp timestamp = 10;
              */
             public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
-                bitField0_ |= 0x00000200;
                 onChanged();
                 return getTimestampFieldBuilder().getBuilder();
             }
@@ -37302,17 +38780,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Slice parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Slice(input, extensionRegistry);
             }
         };
 
@@ -37387,6 +38855,63 @@ public final class ContextOuterClass {
             return new SliceOwner();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SliceOwner(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (ownerUuid_ != null) {
+                                    subBuilder = ownerUuid_.toBuilder();
+                                }
+                                ownerUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(ownerUuid_);
+                                    ownerUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                ownerString_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_SliceOwner_descriptor;
         }
@@ -37423,13 +38948,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getOwnerUuidOrBuilder() {
-            return ownerUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : ownerUuid_;
+            return getOwnerUuid();
         }
 
         public static final int OWNER_STRING_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object ownerString_ = "";
+        private volatile java.lang.Object ownerString_;
 
         /**
          * string owner_string = 2;
@@ -37482,10 +39006,10 @@ public final class ContextOuterClass {
             if (ownerUuid_ != null) {
                 output.writeMessage(1, getOwnerUuid());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(ownerString_)) {
+            if (!getOwnerStringBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, ownerString_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -37497,10 +39021,10 @@ public final class ContextOuterClass {
             if (ownerUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getOwnerUuid());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(ownerString_)) {
+            if (!getOwnerStringBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, ownerString_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -37522,7 +39046,7 @@ public final class ContextOuterClass {
             }
             if (!getOwnerString().equals(other.getOwnerString()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -37540,7 +39064,7 @@ public final class ContextOuterClass {
             }
             hash = (37 * hash) + OWNER_STRING_FIELD_NUMBER;
             hash = (53 * hash) + getOwnerString().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -37634,19 +39158,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.SliceOwner.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                ownerUuid_ = null;
-                if (ownerUuidBuilder_ != null) {
-                    ownerUuidBuilder_.dispose();
+                if (ownerUuidBuilder_ == null) {
+                    ownerUuid_ = null;
+                } else {
+                    ownerUuid_ = null;
                     ownerUuidBuilder_ = null;
                 }
                 ownerString_ = "";
@@ -37675,21 +39206,44 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.SliceOwner buildPartial() {
                 context.ContextOuterClass.SliceOwner result = new context.ContextOuterClass.SliceOwner(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (ownerUuidBuilder_ == null) {
+                    result.ownerUuid_ = ownerUuid_;
+                } else {
+                    result.ownerUuid_ = ownerUuidBuilder_.build();
                 }
+                result.ownerString_ = ownerString_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.SliceOwner result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.ownerUuid_ = ownerUuidBuilder_ == null ? ownerUuid_ : ownerUuidBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.ownerString_ = ownerString_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -37710,10 +39264,9 @@ public final class ContextOuterClass {
                 }
                 if (!other.getOwnerString().isEmpty()) {
                     ownerString_ = other.ownerString_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -37725,54 +39278,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.SliceOwner parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getOwnerUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    ownerString_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.SliceOwner) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid ownerUuid_;
 
             private com.google.protobuf.SingleFieldBuilderV3 ownerUuidBuilder_;
@@ -37782,7 +39301,7 @@ public final class ContextOuterClass {
              * @return Whether the ownerUuid field is set.
              */
             public boolean hasOwnerUuid() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return ownerUuidBuilder_ != null || ownerUuid_ != null;
             }
 
             /**
@@ -37806,11 +39325,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     ownerUuid_ = value;
+                    onChanged();
                 } else {
                     ownerUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -37820,11 +39338,10 @@ public final class ContextOuterClass {
             public Builder setOwnerUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (ownerUuidBuilder_ == null) {
                     ownerUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     ownerUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -37833,16 +39350,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeOwnerUuid(context.ContextOuterClass.Uuid value) {
                 if (ownerUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && ownerUuid_ != null && ownerUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getOwnerUuidBuilder().mergeFrom(value);
+                    if (ownerUuid_ != null) {
+                        ownerUuid_ = context.ContextOuterClass.Uuid.newBuilder(ownerUuid_).mergeFrom(value).buildPartial();
                     } else {
                         ownerUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     ownerUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -37850,13 +39366,13 @@ public final class ContextOuterClass {
              * .context.Uuid owner_uuid = 1;
              */
             public Builder clearOwnerUuid() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                ownerUuid_ = null;
-                if (ownerUuidBuilder_ != null) {
-                    ownerUuidBuilder_.dispose();
+                if (ownerUuidBuilder_ == null) {
+                    ownerUuid_ = null;
+                    onChanged();
+                } else {
+                    ownerUuid_ = null;
                     ownerUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -37864,7 +39380,6 @@ public final class ContextOuterClass {
              * .context.Uuid owner_uuid = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getOwnerUuidBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getOwnerUuidFieldBuilder().getBuilder();
             }
@@ -37934,7 +39449,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 ownerString_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -37945,7 +39459,6 @@ public final class ContextOuterClass {
              */
             public Builder clearOwnerString() {
                 ownerString_ = getDefaultInstance().getOwnerString();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -37961,7 +39474,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 ownerString_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -37993,17 +39505,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public SliceOwner parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SliceOwner(input, extensionRegistry);
             }
         };
 
@@ -38061,6 +39563,50 @@ public final class ContextOuterClass {
             return new SliceStatus();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SliceStatus(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                int rawValue = input.readEnum();
+                                sliceStatus_ = rawValue;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_SliceStatus_descriptor;
         }
@@ -38072,7 +39618,7 @@ public final class ContextOuterClass {
 
         public static final int SLICE_STATUS_FIELD_NUMBER = 1;
 
-        private int sliceStatus_ = 0;
+        private int sliceStatus_;
 
         /**
          * .context.SliceStatusEnum slice_status = 1;
@@ -38089,7 +39635,8 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.SliceStatusEnum getSliceStatus() {
-            context.ContextOuterClass.SliceStatusEnum result = context.ContextOuterClass.SliceStatusEnum.forNumber(sliceStatus_);
+            @SuppressWarnings("deprecation")
+            context.ContextOuterClass.SliceStatusEnum result = context.ContextOuterClass.SliceStatusEnum.valueOf(sliceStatus_);
             return result == null ? context.ContextOuterClass.SliceStatusEnum.UNRECOGNIZED : result;
         }
 
@@ -38111,7 +39658,7 @@ public final class ContextOuterClass {
             if (sliceStatus_ != context.ContextOuterClass.SliceStatusEnum.SLICESTATUS_UNDEFINED.getNumber()) {
                 output.writeEnum(1, sliceStatus_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -38123,7 +39670,7 @@ public final class ContextOuterClass {
             if (sliceStatus_ != context.ContextOuterClass.SliceStatusEnum.SLICESTATUS_UNDEFINED.getNumber()) {
                 size += com.google.protobuf.CodedOutputStream.computeEnumSize(1, sliceStatus_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -38139,7 +39686,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.SliceStatus other = (context.ContextOuterClass.SliceStatus) obj;
             if (sliceStatus_ != other.sliceStatus_)
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -38153,7 +39700,7 @@ public final class ContextOuterClass {
             hash = (19 * hash) + getDescriptor().hashCode();
             hash = (37 * hash) + SLICE_STATUS_FIELD_NUMBER;
             hash = (53 * hash) + sliceStatus_;
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -38247,16 +39794,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.SliceStatus.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 sliceStatus_ = 0;
                 return this;
             }
@@ -38283,18 +39836,39 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.SliceStatus buildPartial() {
                 context.ContextOuterClass.SliceStatus result = new context.ContextOuterClass.SliceStatus(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.sliceStatus_ = sliceStatus_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.SliceStatus result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.sliceStatus_ = sliceStatus_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -38313,7 +39887,7 @@ public final class ContextOuterClass {
                 if (other.sliceStatus_ != 0) {
                     setSliceStatusValue(other.getSliceStatusValue());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -38325,47 +39899,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.SliceStatus parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    sliceStatus_ = input.readEnum();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.SliceStatus) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private int sliceStatus_ = 0;
 
             /**
@@ -38384,7 +39931,6 @@ public final class ContextOuterClass {
              */
             public Builder setSliceStatusValue(int value) {
                 sliceStatus_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -38395,7 +39941,8 @@ public final class ContextOuterClass {
              */
             @java.lang.Override
             public context.ContextOuterClass.SliceStatusEnum getSliceStatus() {
-                context.ContextOuterClass.SliceStatusEnum result = context.ContextOuterClass.SliceStatusEnum.forNumber(sliceStatus_);
+                @SuppressWarnings("deprecation")
+                context.ContextOuterClass.SliceStatusEnum result = context.ContextOuterClass.SliceStatusEnum.valueOf(sliceStatus_);
                 return result == null ? context.ContextOuterClass.SliceStatusEnum.UNRECOGNIZED : result;
             }
 
@@ -38408,7 +39955,6 @@ public final class ContextOuterClass {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000001;
                 sliceStatus_ = value.getNumber();
                 onChanged();
                 return this;
@@ -38419,7 +39965,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearSliceStatus() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 sliceStatus_ = 0;
                 onChanged();
                 return this;
@@ -38452,17 +39997,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public SliceStatus parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SliceStatus(input, extensionRegistry);
             }
         };
 
@@ -38533,6 +40068,57 @@ public final class ContextOuterClass {
             return new SliceConfig();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SliceConfig(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    configRules_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                configRules_.add(input.readMessage(context.ContextOuterClass.ConfigRule.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    configRules_ = java.util.Collections.unmodifiableList(configRules_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_SliceConfig_descriptor;
         }
@@ -38544,7 +40130,6 @@ public final class ContextOuterClass {
 
         public static final int CONFIG_RULES_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List configRules_;
 
         /**
@@ -38605,7 +40190,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < configRules_.size(); i++) {
                 output.writeMessage(1, configRules_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -38617,7 +40202,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < configRules_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, configRules_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -38633,7 +40218,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.SliceConfig other = (context.ContextOuterClass.SliceConfig) obj;
             if (!getConfigRulesList().equals(other.getConfigRulesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -38649,7 +40234,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONFIG_RULES_FIELD_NUMBER;
                 hash = (53 * hash) + getConfigRulesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -38743,23 +40328,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.SliceConfig.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getConfigRulesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (configRulesBuilder_ == null) {
                     configRules_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    configRules_ = null;
                     configRulesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -38785,15 +40376,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.SliceConfig buildPartial() {
                 context.ContextOuterClass.SliceConfig result = new context.ContextOuterClass.SliceConfig(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.SliceConfig result) {
+                int from_bitField0_ = bitField0_;
                 if (configRulesBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         configRules_ = java.util.Collections.unmodifiableList(configRules_);
@@ -38803,10 +40386,38 @@ public final class ContextOuterClass {
                 } else {
                     result.configRules_ = configRulesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.SliceConfig result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -38846,7 +40457,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -38858,47 +40469,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.SliceConfig parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.ConfigRule m = input.readMessage(context.ContextOuterClass.ConfigRule.parser(), extensionRegistry);
-                                    if (configRulesBuilder_ == null) {
-                                        ensureConfigRulesIsMutable();
-                                        configRules_.add(m);
-                                    } else {
-                                        configRulesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.SliceConfig) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -39168,17 +40749,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public SliceConfig parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SliceConfig(input, extensionRegistry);
             }
         };
 
@@ -39249,6 +40820,57 @@ public final class ContextOuterClass {
             return new SliceIdList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SliceIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    sliceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                sliceIds_.add(input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    sliceIds_ = java.util.Collections.unmodifiableList(sliceIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_SliceIdList_descriptor;
         }
@@ -39260,7 +40882,6 @@ public final class ContextOuterClass {
 
         public static final int SLICE_IDS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List sliceIds_;
 
         /**
@@ -39321,7 +40942,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < sliceIds_.size(); i++) {
                 output.writeMessage(1, sliceIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -39333,7 +40954,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < sliceIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, sliceIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -39349,7 +40970,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.SliceIdList other = (context.ContextOuterClass.SliceIdList) obj;
             if (!getSliceIdsList().equals(other.getSliceIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -39365,7 +40986,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SLICE_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getSliceIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -39459,23 +41080,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.SliceIdList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getSliceIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (sliceIdsBuilder_ == null) {
                     sliceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    sliceIds_ = null;
                     sliceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -39501,15 +41128,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.SliceIdList buildPartial() {
                 context.ContextOuterClass.SliceIdList result = new context.ContextOuterClass.SliceIdList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.SliceIdList result) {
+                int from_bitField0_ = bitField0_;
                 if (sliceIdsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         sliceIds_ = java.util.Collections.unmodifiableList(sliceIds_);
@@ -39519,10 +41138,38 @@ public final class ContextOuterClass {
                 } else {
                     result.sliceIds_ = sliceIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.SliceIdList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -39562,7 +41209,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -39574,47 +41221,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.SliceIdList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.SliceId m = input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry);
-                                    if (sliceIdsBuilder_ == null) {
-                                        ensureSliceIdsIsMutable();
-                                        sliceIds_.add(m);
-                                    } else {
-                                        sliceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.SliceIdList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -39884,17 +41501,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public SliceIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SliceIdList(input, extensionRegistry);
             }
         };
 
@@ -39965,6 +41572,57 @@ public final class ContextOuterClass {
             return new SliceList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SliceList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    slices_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                slices_.add(input.readMessage(context.ContextOuterClass.Slice.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    slices_ = java.util.Collections.unmodifiableList(slices_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_SliceList_descriptor;
         }
@@ -39976,7 +41634,6 @@ public final class ContextOuterClass {
 
         public static final int SLICES_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List slices_;
 
         /**
@@ -40037,7 +41694,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < slices_.size(); i++) {
                 output.writeMessage(1, slices_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -40049,7 +41706,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < slices_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, slices_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -40065,7 +41722,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.SliceList other = (context.ContextOuterClass.SliceList) obj;
             if (!getSlicesList().equals(other.getSlicesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -40081,7 +41738,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SLICES_FIELD_NUMBER;
                 hash = (53 * hash) + getSlicesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -40175,23 +41832,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.SliceList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getSlicesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (slicesBuilder_ == null) {
                     slices_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    slices_ = null;
                     slicesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -40217,15 +41880,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.SliceList buildPartial() {
                 context.ContextOuterClass.SliceList result = new context.ContextOuterClass.SliceList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.SliceList result) {
+                int from_bitField0_ = bitField0_;
                 if (slicesBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         slices_ = java.util.Collections.unmodifiableList(slices_);
@@ -40235,10 +41890,38 @@ public final class ContextOuterClass {
                 } else {
                     result.slices_ = slicesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.SliceList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -40278,7 +41961,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -40290,47 +41973,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.SliceList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.Slice m = input.readMessage(context.ContextOuterClass.Slice.parser(), extensionRegistry);
-                                    if (slicesBuilder_ == null) {
-                                        ensureSlicesIsMutable();
-                                        slices_.add(m);
-                                    } else {
-                                        slicesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.SliceList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -40600,17 +42253,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public SliceList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SliceList(input, extensionRegistry);
             }
         };
 
@@ -40702,6 +42345,82 @@ public final class ContextOuterClass {
             return new SliceFilter();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SliceFilter(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.SliceIdList.Builder subBuilder = null;
+                                if (sliceIds_ != null) {
+                                    subBuilder = sliceIds_.toBuilder();
+                                }
+                                sliceIds_ = input.readMessage(context.ContextOuterClass.SliceIdList.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(sliceIds_);
+                                    sliceIds_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 16:
+                            {
+                                includeEndpointIds_ = input.readBool();
+                                break;
+                            }
+                        case 24:
+                            {
+                                includeConstraints_ = input.readBool();
+                                break;
+                            }
+                        case 32:
+                            {
+                                includeServiceIds_ = input.readBool();
+                                break;
+                            }
+                        case 40:
+                            {
+                                includeSubsliceIds_ = input.readBool();
+                                break;
+                            }
+                        case 48:
+                            {
+                                includeConfigRules_ = input.readBool();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_SliceFilter_descriptor;
         }
@@ -40738,12 +42457,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.SliceIdListOrBuilder getSliceIdsOrBuilder() {
-            return sliceIds_ == null ? context.ContextOuterClass.SliceIdList.getDefaultInstance() : sliceIds_;
+            return getSliceIds();
         }
 
         public static final int INCLUDE_ENDPOINT_IDS_FIELD_NUMBER = 2;
 
-        private boolean includeEndpointIds_ = false;
+        private boolean includeEndpointIds_;
 
         /**
          * bool include_endpoint_ids = 2;
@@ -40756,7 +42475,7 @@ public final class ContextOuterClass {
 
         public static final int INCLUDE_CONSTRAINTS_FIELD_NUMBER = 3;
 
-        private boolean includeConstraints_ = false;
+        private boolean includeConstraints_;
 
         /**
          * bool include_constraints = 3;
@@ -40769,7 +42488,7 @@ public final class ContextOuterClass {
 
         public static final int INCLUDE_SERVICE_IDS_FIELD_NUMBER = 4;
 
-        private boolean includeServiceIds_ = false;
+        private boolean includeServiceIds_;
 
         /**
          * bool include_service_ids = 4;
@@ -40782,7 +42501,7 @@ public final class ContextOuterClass {
 
         public static final int INCLUDE_SUBSLICE_IDS_FIELD_NUMBER = 5;
 
-        private boolean includeSubsliceIds_ = false;
+        private boolean includeSubsliceIds_;
 
         /**
          * bool include_subslice_ids = 5;
@@ -40795,7 +42514,7 @@ public final class ContextOuterClass {
 
         public static final int INCLUDE_CONFIG_RULES_FIELD_NUMBER = 6;
 
-        private boolean includeConfigRules_ = false;
+        private boolean includeConfigRules_;
 
         /**
          * bool include_config_rules = 6;
@@ -40839,7 +42558,7 @@ public final class ContextOuterClass {
             if (includeConfigRules_ != false) {
                 output.writeBool(6, includeConfigRules_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -40866,7 +42585,7 @@ public final class ContextOuterClass {
             if (includeConfigRules_ != false) {
                 size += com.google.protobuf.CodedOutputStream.computeBoolSize(6, includeConfigRules_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -40896,7 +42615,7 @@ public final class ContextOuterClass {
                 return false;
             if (getIncludeConfigRules() != other.getIncludeConfigRules())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -40922,7 +42641,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeSubsliceIds());
             hash = (37 * hash) + INCLUDE_CONFIG_RULES_FIELD_NUMBER;
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeConfigRules());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -41016,19 +42735,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.SliceFilter.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                sliceIds_ = null;
-                if (sliceIdsBuilder_ != null) {
-                    sliceIdsBuilder_.dispose();
+                if (sliceIdsBuilder_ == null) {
+                    sliceIds_ = null;
+                } else {
+                    sliceIds_ = null;
                     sliceIdsBuilder_ = null;
                 }
                 includeEndpointIds_ = false;
@@ -41061,33 +42787,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.SliceFilter buildPartial() {
                 context.ContextOuterClass.SliceFilter result = new context.ContextOuterClass.SliceFilter(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (sliceIdsBuilder_ == null) {
+                    result.sliceIds_ = sliceIds_;
+                } else {
+                    result.sliceIds_ = sliceIdsBuilder_.build();
                 }
+                result.includeEndpointIds_ = includeEndpointIds_;
+                result.includeConstraints_ = includeConstraints_;
+                result.includeServiceIds_ = includeServiceIds_;
+                result.includeSubsliceIds_ = includeSubsliceIds_;
+                result.includeConfigRules_ = includeConfigRules_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.SliceFilter result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.sliceIds_ = sliceIdsBuilder_ == null ? sliceIds_ : sliceIdsBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.includeEndpointIds_ = includeEndpointIds_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.includeConstraints_ = includeConstraints_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.includeServiceIds_ = includeServiceIds_;
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.includeSubsliceIds_ = includeSubsliceIds_;
-                }
-                if (((from_bitField0_ & 0x00000020) != 0)) {
-                    result.includeConfigRules_ = includeConfigRules_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -41121,7 +42862,7 @@ public final class ContextOuterClass {
                 if (other.getIncludeConfigRules() != false) {
                     setIncludeConfigRules(other.getIncludeConfigRules());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -41133,82 +42874,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.SliceFilter parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getSliceIdsFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 16:
-                                {
-                                    includeEndpointIds_ = input.readBool();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            case 24:
-                                {
-                                    includeConstraints_ = input.readBool();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 32:
-                                {
-                                    includeServiceIds_ = input.readBool();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 32
-                            case 40:
-                                {
-                                    includeSubsliceIds_ = input.readBool();
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 40
-                            case 48:
-                                {
-                                    includeConfigRules_ = input.readBool();
-                                    bitField0_ |= 0x00000020;
-                                    break;
-                                }
-                            // case 48
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.SliceFilter) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.SliceIdList sliceIds_;
 
             private com.google.protobuf.SingleFieldBuilderV3 sliceIdsBuilder_;
@@ -41218,7 +42897,7 @@ public final class ContextOuterClass {
              * @return Whether the sliceIds field is set.
              */
             public boolean hasSliceIds() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return sliceIdsBuilder_ != null || sliceIds_ != null;
             }
 
             /**
@@ -41242,11 +42921,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     sliceIds_ = value;
+                    onChanged();
                 } else {
                     sliceIdsBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -41256,11 +42934,10 @@ public final class ContextOuterClass {
             public Builder setSliceIds(context.ContextOuterClass.SliceIdList.Builder builderForValue) {
                 if (sliceIdsBuilder_ == null) {
                     sliceIds_ = builderForValue.build();
+                    onChanged();
                 } else {
                     sliceIdsBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -41269,16 +42946,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeSliceIds(context.ContextOuterClass.SliceIdList value) {
                 if (sliceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && sliceIds_ != null && sliceIds_ != context.ContextOuterClass.SliceIdList.getDefaultInstance()) {
-                        getSliceIdsBuilder().mergeFrom(value);
+                    if (sliceIds_ != null) {
+                        sliceIds_ = context.ContextOuterClass.SliceIdList.newBuilder(sliceIds_).mergeFrom(value).buildPartial();
                     } else {
                         sliceIds_ = value;
                     }
+                    onChanged();
                 } else {
                     sliceIdsBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -41286,13 +42962,13 @@ public final class ContextOuterClass {
              * .context.SliceIdList slice_ids = 1;
              */
             public Builder clearSliceIds() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                sliceIds_ = null;
-                if (sliceIdsBuilder_ != null) {
-                    sliceIdsBuilder_.dispose();
+                if (sliceIdsBuilder_ == null) {
+                    sliceIds_ = null;
+                    onChanged();
+                } else {
+                    sliceIds_ = null;
                     sliceIdsBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -41300,7 +42976,6 @@ public final class ContextOuterClass {
              * .context.SliceIdList slice_ids = 1;
              */
             public context.ContextOuterClass.SliceIdList.Builder getSliceIdsBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getSliceIdsFieldBuilder().getBuilder();
             }
@@ -41345,7 +43020,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeEndpointIds(boolean value) {
                 includeEndpointIds_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -41355,7 +43029,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeEndpointIds() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 includeEndpointIds_ = false;
                 onChanged();
                 return this;
@@ -41379,7 +43052,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeConstraints(boolean value) {
                 includeConstraints_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -41389,7 +43061,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeConstraints() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 includeConstraints_ = false;
                 onChanged();
                 return this;
@@ -41413,7 +43084,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeServiceIds(boolean value) {
                 includeServiceIds_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -41423,7 +43093,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeServiceIds() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 includeServiceIds_ = false;
                 onChanged();
                 return this;
@@ -41447,7 +43116,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeSubsliceIds(boolean value) {
                 includeSubsliceIds_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -41457,7 +43125,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeSubsliceIds() {
-                bitField0_ = (bitField0_ & ~0x00000010);
                 includeSubsliceIds_ = false;
                 onChanged();
                 return this;
@@ -41481,7 +43148,6 @@ public final class ContextOuterClass {
              */
             public Builder setIncludeConfigRules(boolean value) {
                 includeConfigRules_ = value;
-                bitField0_ |= 0x00000020;
                 onChanged();
                 return this;
             }
@@ -41491,7 +43157,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIncludeConfigRules() {
-                bitField0_ = (bitField0_ & ~0x00000020);
                 includeConfigRules_ = false;
                 onChanged();
                 return this;
@@ -41524,17 +43189,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public SliceFilter parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SliceFilter(input, extensionRegistry);
             }
         };
 
@@ -41613,6 +43268,70 @@ public final class ContextOuterClass {
             return new SliceEvent();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SliceEvent(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Event.Builder subBuilder = null;
+                                if (event_ != null) {
+                                    subBuilder = event_.toBuilder();
+                                }
+                                event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(event_);
+                                    event_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.SliceId.Builder subBuilder = null;
+                                if (sliceId_ != null) {
+                                    subBuilder = sliceId_.toBuilder();
+                                }
+                                sliceId_ = input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(sliceId_);
+                                    sliceId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_SliceEvent_descriptor;
         }
@@ -41649,7 +43368,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-            return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+            return getEvent();
         }
 
         public static final int SLICE_ID_FIELD_NUMBER = 2;
@@ -41679,7 +43398,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.SliceIdOrBuilder getSliceIdOrBuilder() {
-            return sliceId_ == null ? context.ContextOuterClass.SliceId.getDefaultInstance() : sliceId_;
+            return getSliceId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -41703,7 +43422,7 @@ public final class ContextOuterClass {
             if (sliceId_ != null) {
                 output.writeMessage(2, getSliceId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -41718,7 +43437,7 @@ public final class ContextOuterClass {
             if (sliceId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getSliceId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -41744,7 +43463,7 @@ public final class ContextOuterClass {
                 if (!getSliceId().equals(other.getSliceId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -41764,7 +43483,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SLICE_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getSliceId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -41858,24 +43577,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.SliceEvent.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                sliceId_ = null;
-                if (sliceIdBuilder_ != null) {
-                    sliceIdBuilder_.dispose();
+                if (sliceIdBuilder_ == null) {
+                    sliceId_ = null;
+                } else {
+                    sliceId_ = null;
                     sliceIdBuilder_ = null;
                 }
                 return this;
@@ -41903,21 +43630,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.SliceEvent buildPartial() {
                 context.ContextOuterClass.SliceEvent result = new context.ContextOuterClass.SliceEvent(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (eventBuilder_ == null) {
+                    result.event_ = event_;
+                } else {
+                    result.event_ = eventBuilder_.build();
+                }
+                if (sliceIdBuilder_ == null) {
+                    result.sliceId_ = sliceId_;
+                } else {
+                    result.sliceId_ = sliceIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.SliceEvent result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.event_ = eventBuilder_ == null ? event_ : eventBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.sliceId_ = sliceIdBuilder_ == null ? sliceId_ : sliceIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -41939,7 +43693,7 @@ public final class ContextOuterClass {
                 if (other.hasSliceId()) {
                     mergeSliceId(other.getSliceId());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -41951,54 +43705,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.SliceEvent parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEventFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getSliceIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.SliceEvent) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Event event_;
 
             private com.google.protobuf.SingleFieldBuilderV3 eventBuilder_;
@@ -42008,7 +43728,7 @@ public final class ContextOuterClass {
              * @return Whether the event field is set.
              */
             public boolean hasEvent() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return eventBuilder_ != null || event_ != null;
             }
 
             /**
@@ -42032,11 +43752,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     event_ = value;
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -42046,11 +43765,10 @@ public final class ContextOuterClass {
             public Builder setEvent(context.ContextOuterClass.Event.Builder builderForValue) {
                 if (eventBuilder_ == null) {
                     event_ = builderForValue.build();
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -42059,16 +43777,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEvent(context.ContextOuterClass.Event value) {
                 if (eventBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && event_ != null && event_ != context.ContextOuterClass.Event.getDefaultInstance()) {
-                        getEventBuilder().mergeFrom(value);
+                    if (event_ != null) {
+                        event_ = context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
                     } else {
                         event_ = value;
                     }
+                    onChanged();
                 } else {
                     eventBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -42076,13 +43793,13 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public Builder clearEvent() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                    onChanged();
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -42090,7 +43807,6 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public context.ContextOuterClass.Event.Builder getEventBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEventFieldBuilder().getBuilder();
             }
@@ -42126,7 +43842,7 @@ public final class ContextOuterClass {
              * @return Whether the sliceId field is set.
              */
             public boolean hasSliceId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return sliceIdBuilder_ != null || sliceId_ != null;
             }
 
             /**
@@ -42150,11 +43866,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     sliceId_ = value;
+                    onChanged();
                 } else {
                     sliceIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -42164,11 +43879,10 @@ public final class ContextOuterClass {
             public Builder setSliceId(context.ContextOuterClass.SliceId.Builder builderForValue) {
                 if (sliceIdBuilder_ == null) {
                     sliceId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     sliceIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -42177,16 +43891,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeSliceId(context.ContextOuterClass.SliceId value) {
                 if (sliceIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && sliceId_ != null && sliceId_ != context.ContextOuterClass.SliceId.getDefaultInstance()) {
-                        getSliceIdBuilder().mergeFrom(value);
+                    if (sliceId_ != null) {
+                        sliceId_ = context.ContextOuterClass.SliceId.newBuilder(sliceId_).mergeFrom(value).buildPartial();
                     } else {
                         sliceId_ = value;
                     }
+                    onChanged();
                 } else {
                     sliceIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -42194,13 +43907,13 @@ public final class ContextOuterClass {
              * .context.SliceId slice_id = 2;
              */
             public Builder clearSliceId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                sliceId_ = null;
-                if (sliceIdBuilder_ != null) {
-                    sliceIdBuilder_.dispose();
+                if (sliceIdBuilder_ == null) {
+                    sliceId_ = null;
+                    onChanged();
+                } else {
+                    sliceId_ = null;
                     sliceIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -42208,7 +43921,6 @@ public final class ContextOuterClass {
              * .context.SliceId slice_id = 2;
              */
             public context.ContextOuterClass.SliceId.Builder getSliceIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getSliceIdFieldBuilder().getBuilder();
             }
@@ -42262,17 +43974,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public SliceEvent parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SliceEvent(input, extensionRegistry);
             }
         };
 
@@ -42338,6 +44040,57 @@ public final class ContextOuterClass {
             return new ConnectionId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (connectionUuid_ != null) {
+                                    subBuilder = connectionUuid_.toBuilder();
+                                }
+                                connectionUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(connectionUuid_);
+                                    connectionUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionId_descriptor;
         }
@@ -42374,7 +44127,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getConnectionUuidOrBuilder() {
-            return connectionUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : connectionUuid_;
+            return getConnectionUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -42395,7 +44148,7 @@ public final class ContextOuterClass {
             if (connectionUuid_ != null) {
                 output.writeMessage(1, getConnectionUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -42407,7 +44160,7 @@ public final class ContextOuterClass {
             if (connectionUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getConnectionUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -42427,7 +44180,7 @@ public final class ContextOuterClass {
                 if (!getConnectionUuid().equals(other.getConnectionUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -42443,7 +44196,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONNECTION_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getConnectionUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -42541,19 +44294,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                connectionUuid_ = null;
-                if (connectionUuidBuilder_ != null) {
-                    connectionUuidBuilder_.dispose();
+                if (connectionUuidBuilder_ == null) {
+                    connectionUuid_ = null;
+                } else {
+                    connectionUuid_ = null;
                     connectionUuidBuilder_ = null;
                 }
                 return this;
@@ -42581,18 +44341,43 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionId buildPartial() {
                 context.ContextOuterClass.ConnectionId result = new context.ContextOuterClass.ConnectionId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (connectionUuidBuilder_ == null) {
+                    result.connectionUuid_ = connectionUuid_;
+                } else {
+                    result.connectionUuid_ = connectionUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.connectionUuid_ = connectionUuidBuilder_ == null ? connectionUuid_ : connectionUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -42611,7 +44396,7 @@ public final class ContextOuterClass {
                 if (other.hasConnectionUuid()) {
                     mergeConnectionUuid(other.getConnectionUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -42623,47 +44408,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getConnectionUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid connectionUuid_;
 
             private com.google.protobuf.SingleFieldBuilderV3 connectionUuidBuilder_;
@@ -42673,7 +44431,7 @@ public final class ContextOuterClass {
              * @return Whether the connectionUuid field is set.
              */
             public boolean hasConnectionUuid() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return connectionUuidBuilder_ != null || connectionUuid_ != null;
             }
 
             /**
@@ -42697,11 +44455,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     connectionUuid_ = value;
+                    onChanged();
                 } else {
                     connectionUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -42711,11 +44468,10 @@ public final class ContextOuterClass {
             public Builder setConnectionUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (connectionUuidBuilder_ == null) {
                     connectionUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     connectionUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -42724,16 +44480,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeConnectionUuid(context.ContextOuterClass.Uuid value) {
                 if (connectionUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && connectionUuid_ != null && connectionUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getConnectionUuidBuilder().mergeFrom(value);
+                    if (connectionUuid_ != null) {
+                        connectionUuid_ = context.ContextOuterClass.Uuid.newBuilder(connectionUuid_).mergeFrom(value).buildPartial();
                     } else {
                         connectionUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     connectionUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -42741,13 +44496,13 @@ public final class ContextOuterClass {
              * .context.Uuid connection_uuid = 1;
              */
             public Builder clearConnectionUuid() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                connectionUuid_ = null;
-                if (connectionUuidBuilder_ != null) {
-                    connectionUuidBuilder_.dispose();
+                if (connectionUuidBuilder_ == null) {
+                    connectionUuid_ = null;
+                    onChanged();
+                } else {
+                    connectionUuid_ = null;
                     connectionUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -42755,7 +44510,6 @@ public final class ContextOuterClass {
              * .context.Uuid connection_uuid = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getConnectionUuidBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getConnectionUuidFieldBuilder().getBuilder();
             }
@@ -42809,17 +44563,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionId(input, extensionRegistry);
             }
         };
 
@@ -42877,6 +44621,50 @@ public final class ContextOuterClass {
             return new ConnectionSettings_L0();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionSettings_L0(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                lspSymbolicName_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionSettings_L0_descriptor;
         }
@@ -42888,8 +44676,7 @@ public final class ContextOuterClass {
 
         public static final int LSP_SYMBOLIC_NAME_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object lspSymbolicName_ = "";
+        private volatile java.lang.Object lspSymbolicName_;
 
         /**
          * string lsp_symbolic_name = 1;
@@ -42939,10 +44726,10 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(lspSymbolicName_)) {
+            if (!getLspSymbolicNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, lspSymbolicName_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -42951,10 +44738,10 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(lspSymbolicName_)) {
+            if (!getLspSymbolicNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, lspSymbolicName_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -42970,7 +44757,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.ConnectionSettings_L0 other = (context.ContextOuterClass.ConnectionSettings_L0) obj;
             if (!getLspSymbolicName().equals(other.getLspSymbolicName()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -42984,7 +44771,7 @@ public final class ContextOuterClass {
             hash = (19 * hash) + getDescriptor().hashCode();
             hash = (37 * hash) + LSP_SYMBOLIC_NAME_FIELD_NUMBER;
             hash = (53 * hash) + getLspSymbolicName().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -43078,16 +44865,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionSettings_L0.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 lspSymbolicName_ = "";
                 return this;
             }
@@ -43114,18 +44907,39 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionSettings_L0 buildPartial() {
                 context.ContextOuterClass.ConnectionSettings_L0 result = new context.ContextOuterClass.ConnectionSettings_L0(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.lspSymbolicName_ = lspSymbolicName_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionSettings_L0 result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.lspSymbolicName_ = lspSymbolicName_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -43143,10 +44957,9 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getLspSymbolicName().isEmpty()) {
                     lspSymbolicName_ = other.lspSymbolicName_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -43158,47 +44971,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionSettings_L0 parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    lspSymbolicName_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionSettings_L0) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private java.lang.Object lspSymbolicName_ = "";
 
             /**
@@ -43242,7 +45028,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 lspSymbolicName_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -43253,7 +45038,6 @@ public final class ContextOuterClass {
              */
             public Builder clearLspSymbolicName() {
                 lspSymbolicName_ = getDefaultInstance().getLspSymbolicName();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -43269,7 +45053,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 lspSymbolicName_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -43301,17 +45084,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionSettings_L0 parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionSettings_L0(input, extensionRegistry);
             }
         };
 
@@ -43406,6 +45179,76 @@ public final class ContextOuterClass {
             return new ConnectionSettings_L2();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionSettings_L2(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                srcMacAddress_ = s;
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                dstMacAddress_ = s;
+                                break;
+                            }
+                        case 24:
+                            {
+                                etherType_ = input.readUInt32();
+                                break;
+                            }
+                        case 32:
+                            {
+                                vlanId_ = input.readUInt32();
+                                break;
+                            }
+                        case 40:
+                            {
+                                mplsLabel_ = input.readUInt32();
+                                break;
+                            }
+                        case 48:
+                            {
+                                mplsTrafficClass_ = input.readUInt32();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionSettings_L2_descriptor;
         }
@@ -43417,8 +45260,7 @@ public final class ContextOuterClass {
 
         public static final int SRC_MAC_ADDRESS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object srcMacAddress_ = "";
+        private volatile java.lang.Object srcMacAddress_;
 
         /**
          * string src_mac_address = 1;
@@ -43455,8 +45297,7 @@ public final class ContextOuterClass {
 
         public static final int DST_MAC_ADDRESS_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object dstMacAddress_ = "";
+        private volatile java.lang.Object dstMacAddress_;
 
         /**
          * string dst_mac_address = 2;
@@ -43493,7 +45334,7 @@ public final class ContextOuterClass {
 
         public static final int ETHER_TYPE_FIELD_NUMBER = 3;
 
-        private int etherType_ = 0;
+        private int etherType_;
 
         /**
          * uint32 ether_type = 3;
@@ -43506,7 +45347,7 @@ public final class ContextOuterClass {
 
         public static final int VLAN_ID_FIELD_NUMBER = 4;
 
-        private int vlanId_ = 0;
+        private int vlanId_;
 
         /**
          * uint32 vlan_id = 4;
@@ -43519,7 +45360,7 @@ public final class ContextOuterClass {
 
         public static final int MPLS_LABEL_FIELD_NUMBER = 5;
 
-        private int mplsLabel_ = 0;
+        private int mplsLabel_;
 
         /**
          * uint32 mpls_label = 5;
@@ -43532,7 +45373,7 @@ public final class ContextOuterClass {
 
         public static final int MPLS_TRAFFIC_CLASS_FIELD_NUMBER = 6;
 
-        private int mplsTrafficClass_ = 0;
+        private int mplsTrafficClass_;
 
         /**
          * uint32 mpls_traffic_class = 6;
@@ -43558,10 +45399,10 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcMacAddress_)) {
+            if (!getSrcMacAddressBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, srcMacAddress_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstMacAddress_)) {
+            if (!getDstMacAddressBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, dstMacAddress_);
             }
             if (etherType_ != 0) {
@@ -43576,7 +45417,7 @@ public final class ContextOuterClass {
             if (mplsTrafficClass_ != 0) {
                 output.writeUInt32(6, mplsTrafficClass_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -43585,10 +45426,10 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcMacAddress_)) {
+            if (!getSrcMacAddressBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, srcMacAddress_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstMacAddress_)) {
+            if (!getDstMacAddressBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, dstMacAddress_);
             }
             if (etherType_ != 0) {
@@ -43603,7 +45444,7 @@ public final class ContextOuterClass {
             if (mplsTrafficClass_ != 0) {
                 size += com.google.protobuf.CodedOutputStream.computeUInt32Size(6, mplsTrafficClass_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -43629,7 +45470,7 @@ public final class ContextOuterClass {
                 return false;
             if (getMplsTrafficClass() != other.getMplsTrafficClass())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -43653,7 +45494,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + getMplsLabel();
             hash = (37 * hash) + MPLS_TRAFFIC_CLASS_FIELD_NUMBER;
             hash = (53 * hash) + getMplsTrafficClass();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -43747,16 +45588,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionSettings_L2.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 srcMacAddress_ = "";
                 dstMacAddress_ = "";
                 etherType_ = 0;
@@ -43788,33 +45635,44 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionSettings_L2 buildPartial() {
                 context.ContextOuterClass.ConnectionSettings_L2 result = new context.ContextOuterClass.ConnectionSettings_L2(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.srcMacAddress_ = srcMacAddress_;
+                result.dstMacAddress_ = dstMacAddress_;
+                result.etherType_ = etherType_;
+                result.vlanId_ = vlanId_;
+                result.mplsLabel_ = mplsLabel_;
+                result.mplsTrafficClass_ = mplsTrafficClass_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionSettings_L2 result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.srcMacAddress_ = srcMacAddress_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.dstMacAddress_ = dstMacAddress_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.etherType_ = etherType_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.vlanId_ = vlanId_;
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.mplsLabel_ = mplsLabel_;
-                }
-                if (((from_bitField0_ & 0x00000020) != 0)) {
-                    result.mplsTrafficClass_ = mplsTrafficClass_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -43832,12 +45690,10 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getSrcMacAddress().isEmpty()) {
                     srcMacAddress_ = other.srcMacAddress_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
                 if (!other.getDstMacAddress().isEmpty()) {
                     dstMacAddress_ = other.dstMacAddress_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (other.getEtherType() != 0) {
@@ -43852,7 +45708,7 @@ public final class ContextOuterClass {
                 if (other.getMplsTrafficClass() != 0) {
                     setMplsTrafficClass(other.getMplsTrafficClass());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -43864,82 +45720,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionSettings_L2 parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    srcMacAddress_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    dstMacAddress_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 24:
-                                {
-                                    etherType_ = input.readUInt32();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 32:
-                                {
-                                    vlanId_ = input.readUInt32();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 32
-                            case 40:
-                                {
-                                    mplsLabel_ = input.readUInt32();
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 40
-                            case 48:
-                                {
-                                    mplsTrafficClass_ = input.readUInt32();
-                                    bitField0_ |= 0x00000020;
-                                    break;
-                                }
-                            // case 48
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionSettings_L2) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private java.lang.Object srcMacAddress_ = "";
 
             /**
@@ -43983,7 +45777,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 srcMacAddress_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -43994,7 +45787,6 @@ public final class ContextOuterClass {
              */
             public Builder clearSrcMacAddress() {
                 srcMacAddress_ = getDefaultInstance().getSrcMacAddress();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -44010,7 +45802,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 srcMacAddress_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -44058,7 +45849,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 dstMacAddress_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -44069,7 +45859,6 @@ public final class ContextOuterClass {
              */
             public Builder clearDstMacAddress() {
                 dstMacAddress_ = getDefaultInstance().getDstMacAddress();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -44085,7 +45874,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 dstMacAddress_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -44108,7 +45896,6 @@ public final class ContextOuterClass {
              */
             public Builder setEtherType(int value) {
                 etherType_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -44118,7 +45905,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearEtherType() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 etherType_ = 0;
                 onChanged();
                 return this;
@@ -44142,7 +45928,6 @@ public final class ContextOuterClass {
              */
             public Builder setVlanId(int value) {
                 vlanId_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -44152,7 +45937,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearVlanId() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 vlanId_ = 0;
                 onChanged();
                 return this;
@@ -44176,7 +45960,6 @@ public final class ContextOuterClass {
              */
             public Builder setMplsLabel(int value) {
                 mplsLabel_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -44186,7 +45969,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearMplsLabel() {
-                bitField0_ = (bitField0_ & ~0x00000010);
                 mplsLabel_ = 0;
                 onChanged();
                 return this;
@@ -44210,7 +45992,6 @@ public final class ContextOuterClass {
              */
             public Builder setMplsTrafficClass(int value) {
                 mplsTrafficClass_ = value;
-                bitField0_ |= 0x00000020;
                 onChanged();
                 return this;
             }
@@ -44220,7 +46001,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearMplsTrafficClass() {
-                bitField0_ = (bitField0_ & ~0x00000020);
                 mplsTrafficClass_ = 0;
                 onChanged();
                 return this;
@@ -44253,17 +46033,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionSettings_L2 parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionSettings_L2(input, extensionRegistry);
             }
         };
 
@@ -44352,6 +46122,71 @@ public final class ContextOuterClass {
             return new ConnectionSettings_L3();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionSettings_L3(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                srcIpAddress_ = s;
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                dstIpAddress_ = s;
+                                break;
+                            }
+                        case 24:
+                            {
+                                dscp_ = input.readUInt32();
+                                break;
+                            }
+                        case 32:
+                            {
+                                protocol_ = input.readUInt32();
+                                break;
+                            }
+                        case 40:
+                            {
+                                ttl_ = input.readUInt32();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionSettings_L3_descriptor;
         }
@@ -44363,8 +46198,7 @@ public final class ContextOuterClass {
 
         public static final int SRC_IP_ADDRESS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object srcIpAddress_ = "";
+        private volatile java.lang.Object srcIpAddress_;
 
         /**
          * string src_ip_address = 1;
@@ -44401,8 +46235,7 @@ public final class ContextOuterClass {
 
         public static final int DST_IP_ADDRESS_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object dstIpAddress_ = "";
+        private volatile java.lang.Object dstIpAddress_;
 
         /**
          * string dst_ip_address = 2;
@@ -44439,7 +46272,7 @@ public final class ContextOuterClass {
 
         public static final int DSCP_FIELD_NUMBER = 3;
 
-        private int dscp_ = 0;
+        private int dscp_;
 
         /**
          * uint32 dscp = 3;
@@ -44452,7 +46285,7 @@ public final class ContextOuterClass {
 
         public static final int PROTOCOL_FIELD_NUMBER = 4;
 
-        private int protocol_ = 0;
+        private int protocol_;
 
         /**
          * uint32 protocol = 4;
@@ -44465,7 +46298,7 @@ public final class ContextOuterClass {
 
         public static final int TTL_FIELD_NUMBER = 5;
 
-        private int ttl_ = 0;
+        private int ttl_;
 
         /**
          * uint32 ttl = 5;
@@ -44491,10 +46324,10 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcIpAddress_)) {
+            if (!getSrcIpAddressBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, srcIpAddress_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstIpAddress_)) {
+            if (!getDstIpAddressBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, dstIpAddress_);
             }
             if (dscp_ != 0) {
@@ -44506,7 +46339,7 @@ public final class ContextOuterClass {
             if (ttl_ != 0) {
                 output.writeUInt32(5, ttl_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -44515,10 +46348,10 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcIpAddress_)) {
+            if (!getSrcIpAddressBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, srcIpAddress_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstIpAddress_)) {
+            if (!getDstIpAddressBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, dstIpAddress_);
             }
             if (dscp_ != 0) {
@@ -44530,7 +46363,7 @@ public final class ContextOuterClass {
             if (ttl_ != 0) {
                 size += com.google.protobuf.CodedOutputStream.computeUInt32Size(5, ttl_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -44554,7 +46387,7 @@ public final class ContextOuterClass {
                 return false;
             if (getTtl() != other.getTtl())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -44576,7 +46409,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + getProtocol();
             hash = (37 * hash) + TTL_FIELD_NUMBER;
             hash = (53 * hash) + getTtl();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -44670,16 +46503,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionSettings_L3.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 srcIpAddress_ = "";
                 dstIpAddress_ = "";
                 dscp_ = 0;
@@ -44710,30 +46549,43 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionSettings_L3 buildPartial() {
                 context.ContextOuterClass.ConnectionSettings_L3 result = new context.ContextOuterClass.ConnectionSettings_L3(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.srcIpAddress_ = srcIpAddress_;
+                result.dstIpAddress_ = dstIpAddress_;
+                result.dscp_ = dscp_;
+                result.protocol_ = protocol_;
+                result.ttl_ = ttl_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionSettings_L3 result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.srcIpAddress_ = srcIpAddress_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.dstIpAddress_ = dstIpAddress_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.dscp_ = dscp_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.protocol_ = protocol_;
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.ttl_ = ttl_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -44751,12 +46603,10 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getSrcIpAddress().isEmpty()) {
                     srcIpAddress_ = other.srcIpAddress_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
                 if (!other.getDstIpAddress().isEmpty()) {
                     dstIpAddress_ = other.dstIpAddress_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (other.getDscp() != 0) {
@@ -44768,7 +46618,7 @@ public final class ContextOuterClass {
                 if (other.getTtl() != 0) {
                     setTtl(other.getTtl());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -44780,75 +46630,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionSettings_L3 parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    srcIpAddress_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    dstIpAddress_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 24:
-                                {
-                                    dscp_ = input.readUInt32();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 32:
-                                {
-                                    protocol_ = input.readUInt32();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 32
-                            case 40:
-                                {
-                                    ttl_ = input.readUInt32();
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 40
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionSettings_L3) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private java.lang.Object srcIpAddress_ = "";
 
             /**
@@ -44892,7 +46687,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 srcIpAddress_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -44903,7 +46697,6 @@ public final class ContextOuterClass {
              */
             public Builder clearSrcIpAddress() {
                 srcIpAddress_ = getDefaultInstance().getSrcIpAddress();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -44919,7 +46712,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 srcIpAddress_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -44967,7 +46759,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 dstIpAddress_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -44978,7 +46769,6 @@ public final class ContextOuterClass {
              */
             public Builder clearDstIpAddress() {
                 dstIpAddress_ = getDefaultInstance().getDstIpAddress();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -44994,7 +46784,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 dstIpAddress_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -45017,7 +46806,6 @@ public final class ContextOuterClass {
              */
             public Builder setDscp(int value) {
                 dscp_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -45027,7 +46815,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearDscp() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 dscp_ = 0;
                 onChanged();
                 return this;
@@ -45051,7 +46838,6 @@ public final class ContextOuterClass {
              */
             public Builder setProtocol(int value) {
                 protocol_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -45061,7 +46847,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearProtocol() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 protocol_ = 0;
                 onChanged();
                 return this;
@@ -45085,7 +46870,6 @@ public final class ContextOuterClass {
              */
             public Builder setTtl(int value) {
                 ttl_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -45095,7 +46879,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearTtl() {
-                bitField0_ = (bitField0_ & ~0x00000010);
                 ttl_ = 0;
                 onChanged();
                 return this;
@@ -45128,17 +46911,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionSettings_L3 parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionSettings_L3(input, extensionRegistry);
             }
         };
 
@@ -45207,6 +46980,64 @@ public final class ContextOuterClass {
             return new ConnectionSettings_L4();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionSettings_L4(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                srcPort_ = input.readUInt32();
+                                break;
+                            }
+                        case 16:
+                            {
+                                dstPort_ = input.readUInt32();
+                                break;
+                            }
+                        case 24:
+                            {
+                                tcpFlags_ = input.readUInt32();
+                                break;
+                            }
+                        case 32:
+                            {
+                                ttl_ = input.readUInt32();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionSettings_L4_descriptor;
         }
@@ -45218,7 +47049,7 @@ public final class ContextOuterClass {
 
         public static final int SRC_PORT_FIELD_NUMBER = 1;
 
-        private int srcPort_ = 0;
+        private int srcPort_;
 
         /**
          * uint32 src_port = 1;
@@ -45231,7 +47062,7 @@ public final class ContextOuterClass {
 
         public static final int DST_PORT_FIELD_NUMBER = 2;
 
-        private int dstPort_ = 0;
+        private int dstPort_;
 
         /**
          * uint32 dst_port = 2;
@@ -45244,7 +47075,7 @@ public final class ContextOuterClass {
 
         public static final int TCP_FLAGS_FIELD_NUMBER = 3;
 
-        private int tcpFlags_ = 0;
+        private int tcpFlags_;
 
         /**
          * uint32 tcp_flags = 3;
@@ -45257,7 +47088,7 @@ public final class ContextOuterClass {
 
         public static final int TTL_FIELD_NUMBER = 4;
 
-        private int ttl_ = 0;
+        private int ttl_;
 
         /**
          * uint32 ttl = 4;
@@ -45295,7 +47126,7 @@ public final class ContextOuterClass {
             if (ttl_ != 0) {
                 output.writeUInt32(4, ttl_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -45316,7 +47147,7 @@ public final class ContextOuterClass {
             if (ttl_ != 0) {
                 size += com.google.protobuf.CodedOutputStream.computeUInt32Size(4, ttl_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -45338,7 +47169,7 @@ public final class ContextOuterClass {
                 return false;
             if (getTtl() != other.getTtl())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -45358,7 +47189,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + getTcpFlags();
             hash = (37 * hash) + TTL_FIELD_NUMBER;
             hash = (53 * hash) + getTtl();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -45452,16 +47283,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionSettings_L4.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 srcPort_ = 0;
                 dstPort_ = 0;
                 tcpFlags_ = 0;
@@ -45491,27 +47328,42 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionSettings_L4 buildPartial() {
                 context.ContextOuterClass.ConnectionSettings_L4 result = new context.ContextOuterClass.ConnectionSettings_L4(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.srcPort_ = srcPort_;
+                result.dstPort_ = dstPort_;
+                result.tcpFlags_ = tcpFlags_;
+                result.ttl_ = ttl_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionSettings_L4 result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.srcPort_ = srcPort_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.dstPort_ = dstPort_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.tcpFlags_ = tcpFlags_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.ttl_ = ttl_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -45539,7 +47391,7 @@ public final class ContextOuterClass {
                 if (other.getTtl() != 0) {
                     setTtl(other.getTtl());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -45551,68 +47403,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionSettings_L4 parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    srcPort_ = input.readUInt32();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            case 16:
-                                {
-                                    dstPort_ = input.readUInt32();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            case 24:
-                                {
-                                    tcpFlags_ = input.readUInt32();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 32:
-                                {
-                                    ttl_ = input.readUInt32();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 32
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionSettings_L4) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private int srcPort_;
 
             /**
@@ -45631,7 +47435,6 @@ public final class ContextOuterClass {
              */
             public Builder setSrcPort(int value) {
                 srcPort_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -45641,7 +47444,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearSrcPort() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 srcPort_ = 0;
                 onChanged();
                 return this;
@@ -45665,7 +47467,6 @@ public final class ContextOuterClass {
              */
             public Builder setDstPort(int value) {
                 dstPort_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -45675,7 +47476,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearDstPort() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 dstPort_ = 0;
                 onChanged();
                 return this;
@@ -45699,7 +47499,6 @@ public final class ContextOuterClass {
              */
             public Builder setTcpFlags(int value) {
                 tcpFlags_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -45709,7 +47508,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearTcpFlags() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 tcpFlags_ = 0;
                 onChanged();
                 return this;
@@ -45733,7 +47531,6 @@ public final class ContextOuterClass {
              */
             public Builder setTtl(int value) {
                 ttl_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -45743,7 +47540,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearTtl() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 ttl_ = 0;
                 onChanged();
                 return this;
@@ -45776,17 +47572,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionSettings_L4 parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionSettings_L4(input, extensionRegistry);
             }
         };
 
@@ -45899,6 +47685,96 @@ public final class ContextOuterClass {
             return new ConnectionSettings();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionSettings(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ConnectionSettings_L0.Builder subBuilder = null;
+                                if (l0_ != null) {
+                                    subBuilder = l0_.toBuilder();
+                                }
+                                l0_ = input.readMessage(context.ContextOuterClass.ConnectionSettings_L0.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(l0_);
+                                    l0_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.ConnectionSettings_L2.Builder subBuilder = null;
+                                if (l2_ != null) {
+                                    subBuilder = l2_.toBuilder();
+                                }
+                                l2_ = input.readMessage(context.ContextOuterClass.ConnectionSettings_L2.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(l2_);
+                                    l2_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 26:
+                            {
+                                context.ContextOuterClass.ConnectionSettings_L3.Builder subBuilder = null;
+                                if (l3_ != null) {
+                                    subBuilder = l3_.toBuilder();
+                                }
+                                l3_ = input.readMessage(context.ContextOuterClass.ConnectionSettings_L3.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(l3_);
+                                    l3_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 34:
+                            {
+                                context.ContextOuterClass.ConnectionSettings_L4.Builder subBuilder = null;
+                                if (l4_ != null) {
+                                    subBuilder = l4_.toBuilder();
+                                }
+                                l4_ = input.readMessage(context.ContextOuterClass.ConnectionSettings_L4.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(l4_);
+                                    l4_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionSettings_descriptor;
         }
@@ -45935,7 +47811,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConnectionSettings_L0OrBuilder getL0OrBuilder() {
-            return l0_ == null ? context.ContextOuterClass.ConnectionSettings_L0.getDefaultInstance() : l0_;
+            return getL0();
         }
 
         public static final int L2_FIELD_NUMBER = 2;
@@ -45965,7 +47841,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConnectionSettings_L2OrBuilder getL2OrBuilder() {
-            return l2_ == null ? context.ContextOuterClass.ConnectionSettings_L2.getDefaultInstance() : l2_;
+            return getL2();
         }
 
         public static final int L3_FIELD_NUMBER = 3;
@@ -45995,7 +47871,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConnectionSettings_L3OrBuilder getL3OrBuilder() {
-            return l3_ == null ? context.ContextOuterClass.ConnectionSettings_L3.getDefaultInstance() : l3_;
+            return getL3();
         }
 
         public static final int L4_FIELD_NUMBER = 4;
@@ -46025,7 +47901,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConnectionSettings_L4OrBuilder getL4OrBuilder() {
-            return l4_ == null ? context.ContextOuterClass.ConnectionSettings_L4.getDefaultInstance() : l4_;
+            return getL4();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -46055,7 +47931,7 @@ public final class ContextOuterClass {
             if (l4_ != null) {
                 output.writeMessage(4, getL4());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -46076,7 +47952,7 @@ public final class ContextOuterClass {
             if (l4_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, getL4());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -46114,7 +47990,7 @@ public final class ContextOuterClass {
                 if (!getL4().equals(other.getL4()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -46142,7 +48018,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + L4_FIELD_NUMBER;
                 hash = (53 * hash) + getL4().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -46236,34 +48112,44 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionSettings.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                l0_ = null;
-                if (l0Builder_ != null) {
-                    l0Builder_.dispose();
+                if (l0Builder_ == null) {
+                    l0_ = null;
+                } else {
+                    l0_ = null;
                     l0Builder_ = null;
                 }
-                l2_ = null;
-                if (l2Builder_ != null) {
-                    l2Builder_.dispose();
+                if (l2Builder_ == null) {
+                    l2_ = null;
+                } else {
+                    l2_ = null;
                     l2Builder_ = null;
                 }
-                l3_ = null;
-                if (l3Builder_ != null) {
-                    l3Builder_.dispose();
+                if (l3Builder_ == null) {
+                    l3_ = null;
+                } else {
+                    l3_ = null;
                     l3Builder_ = null;
                 }
-                l4_ = null;
-                if (l4Builder_ != null) {
-                    l4Builder_.dispose();
+                if (l4Builder_ == null) {
+                    l4_ = null;
+                } else {
+                    l4_ = null;
                     l4Builder_ = null;
                 }
                 return this;
@@ -46291,27 +48177,58 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionSettings buildPartial() {
                 context.ContextOuterClass.ConnectionSettings result = new context.ContextOuterClass.ConnectionSettings(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (l0Builder_ == null) {
+                    result.l0_ = l0_;
+                } else {
+                    result.l0_ = l0Builder_.build();
+                }
+                if (l2Builder_ == null) {
+                    result.l2_ = l2_;
+                } else {
+                    result.l2_ = l2Builder_.build();
+                }
+                if (l3Builder_ == null) {
+                    result.l3_ = l3_;
+                } else {
+                    result.l3_ = l3Builder_.build();
+                }
+                if (l4Builder_ == null) {
+                    result.l4_ = l4_;
+                } else {
+                    result.l4_ = l4Builder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionSettings result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.l0_ = l0Builder_ == null ? l0_ : l0Builder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.l2_ = l2Builder_ == null ? l2_ : l2Builder_.build();
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.l3_ = l3Builder_ == null ? l3_ : l3Builder_.build();
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.l4_ = l4Builder_ == null ? l4_ : l4Builder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -46339,7 +48256,7 @@ public final class ContextOuterClass {
                 if (other.hasL4()) {
                     mergeL4(other.getL4());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -46351,68 +48268,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionSettings parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getL0FieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getL2FieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getL3FieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    input.readMessage(getL4FieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 34
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionSettings) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.ConnectionSettings_L0 l0_;
 
             private com.google.protobuf.SingleFieldBuilderV3 l0Builder_;
@@ -46422,7 +48291,7 @@ public final class ContextOuterClass {
              * @return Whether the l0 field is set.
              */
             public boolean hasL0() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return l0Builder_ != null || l0_ != null;
             }
 
             /**
@@ -46446,11 +48315,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     l0_ = value;
+                    onChanged();
                 } else {
                     l0Builder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -46460,11 +48328,10 @@ public final class ContextOuterClass {
             public Builder setL0(context.ContextOuterClass.ConnectionSettings_L0.Builder builderForValue) {
                 if (l0Builder_ == null) {
                     l0_ = builderForValue.build();
+                    onChanged();
                 } else {
                     l0Builder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -46473,16 +48340,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeL0(context.ContextOuterClass.ConnectionSettings_L0 value) {
                 if (l0Builder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && l0_ != null && l0_ != context.ContextOuterClass.ConnectionSettings_L0.getDefaultInstance()) {
-                        getL0Builder().mergeFrom(value);
+                    if (l0_ != null) {
+                        l0_ = context.ContextOuterClass.ConnectionSettings_L0.newBuilder(l0_).mergeFrom(value).buildPartial();
                     } else {
                         l0_ = value;
                     }
+                    onChanged();
                 } else {
                     l0Builder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -46490,13 +48356,13 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings_L0 l0 = 1;
              */
             public Builder clearL0() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                l0_ = null;
-                if (l0Builder_ != null) {
-                    l0Builder_.dispose();
+                if (l0Builder_ == null) {
+                    l0_ = null;
+                    onChanged();
+                } else {
+                    l0_ = null;
                     l0Builder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -46504,7 +48370,6 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings_L0 l0 = 1;
              */
             public context.ContextOuterClass.ConnectionSettings_L0.Builder getL0Builder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getL0FieldBuilder().getBuilder();
             }
@@ -46540,7 +48405,7 @@ public final class ContextOuterClass {
              * @return Whether the l2 field is set.
              */
             public boolean hasL2() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return l2Builder_ != null || l2_ != null;
             }
 
             /**
@@ -46564,11 +48429,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     l2_ = value;
+                    onChanged();
                 } else {
                     l2Builder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -46578,11 +48442,10 @@ public final class ContextOuterClass {
             public Builder setL2(context.ContextOuterClass.ConnectionSettings_L2.Builder builderForValue) {
                 if (l2Builder_ == null) {
                     l2_ = builderForValue.build();
+                    onChanged();
                 } else {
                     l2Builder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -46591,16 +48454,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeL2(context.ContextOuterClass.ConnectionSettings_L2 value) {
                 if (l2Builder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && l2_ != null && l2_ != context.ContextOuterClass.ConnectionSettings_L2.getDefaultInstance()) {
-                        getL2Builder().mergeFrom(value);
+                    if (l2_ != null) {
+                        l2_ = context.ContextOuterClass.ConnectionSettings_L2.newBuilder(l2_).mergeFrom(value).buildPartial();
                     } else {
                         l2_ = value;
                     }
+                    onChanged();
                 } else {
                     l2Builder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -46608,13 +48470,13 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings_L2 l2 = 2;
              */
             public Builder clearL2() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                l2_ = null;
-                if (l2Builder_ != null) {
-                    l2Builder_.dispose();
+                if (l2Builder_ == null) {
+                    l2_ = null;
+                    onChanged();
+                } else {
+                    l2_ = null;
                     l2Builder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -46622,7 +48484,6 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings_L2 l2 = 2;
              */
             public context.ContextOuterClass.ConnectionSettings_L2.Builder getL2Builder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getL2FieldBuilder().getBuilder();
             }
@@ -46658,7 +48519,7 @@ public final class ContextOuterClass {
              * @return Whether the l3 field is set.
              */
             public boolean hasL3() {
-                return ((bitField0_ & 0x00000004) != 0);
+                return l3Builder_ != null || l3_ != null;
             }
 
             /**
@@ -46682,11 +48543,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     l3_ = value;
+                    onChanged();
                 } else {
                     l3Builder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -46696,11 +48556,10 @@ public final class ContextOuterClass {
             public Builder setL3(context.ContextOuterClass.ConnectionSettings_L3.Builder builderForValue) {
                 if (l3Builder_ == null) {
                     l3_ = builderForValue.build();
+                    onChanged();
                 } else {
                     l3Builder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -46709,16 +48568,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeL3(context.ContextOuterClass.ConnectionSettings_L3 value) {
                 if (l3Builder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0) && l3_ != null && l3_ != context.ContextOuterClass.ConnectionSettings_L3.getDefaultInstance()) {
-                        getL3Builder().mergeFrom(value);
+                    if (l3_ != null) {
+                        l3_ = context.ContextOuterClass.ConnectionSettings_L3.newBuilder(l3_).mergeFrom(value).buildPartial();
                     } else {
                         l3_ = value;
                     }
+                    onChanged();
                 } else {
                     l3Builder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -46726,13 +48584,13 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings_L3 l3 = 3;
              */
             public Builder clearL3() {
-                bitField0_ = (bitField0_ & ~0x00000004);
-                l3_ = null;
-                if (l3Builder_ != null) {
-                    l3Builder_.dispose();
+                if (l3Builder_ == null) {
+                    l3_ = null;
+                    onChanged();
+                } else {
+                    l3_ = null;
                     l3Builder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -46740,7 +48598,6 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings_L3 l3 = 3;
              */
             public context.ContextOuterClass.ConnectionSettings_L3.Builder getL3Builder() {
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return getL3FieldBuilder().getBuilder();
             }
@@ -46776,7 +48633,7 @@ public final class ContextOuterClass {
              * @return Whether the l4 field is set.
              */
             public boolean hasL4() {
-                return ((bitField0_ & 0x00000008) != 0);
+                return l4Builder_ != null || l4_ != null;
             }
 
             /**
@@ -46800,11 +48657,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     l4_ = value;
+                    onChanged();
                 } else {
                     l4Builder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -46814,11 +48670,10 @@ public final class ContextOuterClass {
             public Builder setL4(context.ContextOuterClass.ConnectionSettings_L4.Builder builderForValue) {
                 if (l4Builder_ == null) {
                     l4_ = builderForValue.build();
+                    onChanged();
                 } else {
                     l4Builder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -46827,16 +48682,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeL4(context.ContextOuterClass.ConnectionSettings_L4 value) {
                 if (l4Builder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0) && l4_ != null && l4_ != context.ContextOuterClass.ConnectionSettings_L4.getDefaultInstance()) {
-                        getL4Builder().mergeFrom(value);
+                    if (l4_ != null) {
+                        l4_ = context.ContextOuterClass.ConnectionSettings_L4.newBuilder(l4_).mergeFrom(value).buildPartial();
                     } else {
                         l4_ = value;
                     }
+                    onChanged();
                 } else {
                     l4Builder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -46844,13 +48698,13 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings_L4 l4 = 4;
              */
             public Builder clearL4() {
-                bitField0_ = (bitField0_ & ~0x00000008);
-                l4_ = null;
-                if (l4Builder_ != null) {
-                    l4Builder_.dispose();
+                if (l4Builder_ == null) {
+                    l4_ = null;
+                    onChanged();
+                } else {
+                    l4_ = null;
                     l4Builder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -46858,7 +48712,6 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings_L4 l4 = 4;
              */
             public context.ContextOuterClass.ConnectionSettings_L4.Builder getL4Builder() {
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return getL4FieldBuilder().getBuilder();
             }
@@ -46912,17 +48765,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionSettings parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionSettings(input, extensionRegistry);
             }
         };
 
@@ -47070,6 +48913,108 @@ public final class ContextOuterClass {
             return new Connection();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Connection(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ConnectionId.Builder subBuilder = null;
+                                if (connectionId_ != null) {
+                                    subBuilder = connectionId_.toBuilder();
+                                }
+                                connectionId_ = input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(connectionId_);
+                                    connectionId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.ServiceId.Builder subBuilder = null;
+                                if (serviceId_ != null) {
+                                    subBuilder = serviceId_.toBuilder();
+                                }
+                                serviceId_ = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(serviceId_);
+                                    serviceId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 26:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    pathHopsEndpointIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                pathHopsEndpointIds_.add(input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 34:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                                    subServiceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                subServiceIds_.add(input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 42:
+                            {
+                                context.ContextOuterClass.ConnectionSettings.Builder subBuilder = null;
+                                if (settings_ != null) {
+                                    subBuilder = settings_.toBuilder();
+                                }
+                                settings_ = input.readMessage(context.ContextOuterClass.ConnectionSettings.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(settings_);
+                                    settings_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    pathHopsEndpointIds_ = java.util.Collections.unmodifiableList(pathHopsEndpointIds_);
+                }
+                if (((mutable_bitField0_ & 0x00000002) != 0)) {
+                    subServiceIds_ = java.util.Collections.unmodifiableList(subServiceIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Connection_descriptor;
         }
@@ -47106,7 +49051,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder() {
-            return connectionId_ == null ? context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
+            return getConnectionId();
         }
 
         public static final int SERVICE_ID_FIELD_NUMBER = 2;
@@ -47136,12 +49081,11 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
-            return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+            return getServiceId();
         }
 
         public static final int PATH_HOPS_ENDPOINT_IDS_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
         private java.util.List pathHopsEndpointIds_;
 
         /**
@@ -47186,7 +49130,6 @@ public final class ContextOuterClass {
 
         public static final int SUB_SERVICE_IDS_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
         private java.util.List subServiceIds_;
 
         /**
@@ -47256,7 +49199,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConnectionSettingsOrBuilder getSettingsOrBuilder() {
-            return settings_ == null ? context.ContextOuterClass.ConnectionSettings.getDefaultInstance() : settings_;
+            return getSettings();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -47289,7 +49232,7 @@ public final class ContextOuterClass {
             if (settings_ != null) {
                 output.writeMessage(5, getSettings());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -47313,7 +49256,7 @@ public final class ContextOuterClass {
             if (settings_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, getSettings());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -47349,7 +49292,7 @@ public final class ContextOuterClass {
                 if (!getSettings().equals(other.getSettings()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -47381,7 +49324,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + SETTINGS_FIELD_NUMBER;
                 hash = (53 * hash) + getSettings().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -47475,43 +49418,52 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Connection.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getPathHopsEndpointIdsFieldBuilder();
+                    getSubServiceIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                connectionId_ = null;
-                if (connectionIdBuilder_ != null) {
-                    connectionIdBuilder_.dispose();
+                if (connectionIdBuilder_ == null) {
+                    connectionId_ = null;
+                } else {
+                    connectionId_ = null;
                     connectionIdBuilder_ = null;
                 }
-                serviceId_ = null;
-                if (serviceIdBuilder_ != null) {
-                    serviceIdBuilder_.dispose();
+                if (serviceIdBuilder_ == null) {
+                    serviceId_ = null;
+                } else {
+                    serviceId_ = null;
                     serviceIdBuilder_ = null;
                 }
                 if (pathHopsEndpointIdsBuilder_ == null) {
                     pathHopsEndpointIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    pathHopsEndpointIds_ = null;
                     pathHopsEndpointIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000004);
                 if (subServiceIdsBuilder_ == null) {
                     subServiceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
                 } else {
-                    subServiceIds_ = null;
                     subServiceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000008);
-                settings_ = null;
-                if (settingsBuilder_ != null) {
-                    settingsBuilder_.dispose();
+                if (settingsBuilder_ == null) {
+                    settings_ = null;
+                } else {
+                    settings_ = null;
                     settingsBuilder_ = null;
                 }
                 return this;
@@ -47539,46 +49491,72 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Connection buildPartial() {
                 context.ContextOuterClass.Connection result = new context.ContextOuterClass.Connection(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (connectionIdBuilder_ == null) {
+                    result.connectionId_ = connectionId_;
+                } else {
+                    result.connectionId_ = connectionIdBuilder_.build();
+                }
+                if (serviceIdBuilder_ == null) {
+                    result.serviceId_ = serviceId_;
+                } else {
+                    result.serviceId_ = serviceIdBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Connection result) {
                 if (pathHopsEndpointIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         pathHopsEndpointIds_ = java.util.Collections.unmodifiableList(pathHopsEndpointIds_);
-                        bitField0_ = (bitField0_ & ~0x00000004);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.pathHopsEndpointIds_ = pathHopsEndpointIds_;
                 } else {
                     result.pathHopsEndpointIds_ = pathHopsEndpointIdsBuilder_.build();
                 }
                 if (subServiceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0)) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
                         subServiceIds_ = java.util.Collections.unmodifiableList(subServiceIds_);
-                        bitField0_ = (bitField0_ & ~0x00000008);
+                        bitField0_ = (bitField0_ & ~0x00000002);
                     }
                     result.subServiceIds_ = subServiceIds_;
                 } else {
                     result.subServiceIds_ = subServiceIdsBuilder_.build();
                 }
+                if (settingsBuilder_ == null) {
+                    result.settings_ = settings_;
+                } else {
+                    result.settings_ = settingsBuilder_.build();
+                }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Connection result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.connectionId_ = connectionIdBuilder_ == null ? connectionId_ : connectionIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.serviceId_ = serviceIdBuilder_ == null ? serviceId_ : serviceIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.settings_ = settingsBuilder_ == null ? settings_ : settingsBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -47604,7 +49582,7 @@ public final class ContextOuterClass {
                     if (!other.pathHopsEndpointIds_.isEmpty()) {
                         if (pathHopsEndpointIds_.isEmpty()) {
                             pathHopsEndpointIds_ = other.pathHopsEndpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensurePathHopsEndpointIdsIsMutable();
                             pathHopsEndpointIds_.addAll(other.pathHopsEndpointIds_);
@@ -47617,7 +49595,7 @@ public final class ContextOuterClass {
                             pathHopsEndpointIdsBuilder_.dispose();
                             pathHopsEndpointIdsBuilder_ = null;
                             pathHopsEndpointIds_ = other.pathHopsEndpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             pathHopsEndpointIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getPathHopsEndpointIdsFieldBuilder() : null;
                         } else {
                             pathHopsEndpointIdsBuilder_.addAllMessages(other.pathHopsEndpointIds_);
@@ -47628,7 +49606,7 @@ public final class ContextOuterClass {
                     if (!other.subServiceIds_.isEmpty()) {
                         if (subServiceIds_.isEmpty()) {
                             subServiceIds_ = other.subServiceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                         } else {
                             ensureSubServiceIdsIsMutable();
                             subServiceIds_.addAll(other.subServiceIds_);
@@ -47641,7 +49619,7 @@ public final class ContextOuterClass {
                             subServiceIdsBuilder_.dispose();
                             subServiceIdsBuilder_ = null;
                             subServiceIds_ = other.subServiceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                             subServiceIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getSubServiceIdsFieldBuilder() : null;
                         } else {
                             subServiceIdsBuilder_.addAllMessages(other.subServiceIds_);
@@ -47651,7 +49629,7 @@ public final class ContextOuterClass {
                 if (other.hasSettings()) {
                     mergeSettings(other.getSettings());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -47663,80 +49641,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Connection parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getConnectionIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getServiceIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    context.ContextOuterClass.EndPointId m = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-                                    if (pathHopsEndpointIdsBuilder_ == null) {
-                                        ensurePathHopsEndpointIdsIsMutable();
-                                        pathHopsEndpointIds_.add(m);
-                                    } else {
-                                        pathHopsEndpointIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    context.ContextOuterClass.ServiceId m = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
-                                    if (subServiceIdsBuilder_ == null) {
-                                        ensureSubServiceIdsIsMutable();
-                                        subServiceIds_.add(m);
-                                    } else {
-                                        subServiceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    input.readMessage(getSettingsFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 42
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Connection) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -47751,7 +49666,7 @@ public final class ContextOuterClass {
              * @return Whether the connectionId field is set.
              */
             public boolean hasConnectionId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return connectionIdBuilder_ != null || connectionId_ != null;
             }
 
             /**
@@ -47775,11 +49690,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     connectionId_ = value;
+                    onChanged();
                 } else {
                     connectionIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -47789,11 +49703,10 @@ public final class ContextOuterClass {
             public Builder setConnectionId(context.ContextOuterClass.ConnectionId.Builder builderForValue) {
                 if (connectionIdBuilder_ == null) {
                     connectionId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     connectionIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -47802,16 +49715,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeConnectionId(context.ContextOuterClass.ConnectionId value) {
                 if (connectionIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && connectionId_ != null && connectionId_ != context.ContextOuterClass.ConnectionId.getDefaultInstance()) {
-                        getConnectionIdBuilder().mergeFrom(value);
+                    if (connectionId_ != null) {
+                        connectionId_ = context.ContextOuterClass.ConnectionId.newBuilder(connectionId_).mergeFrom(value).buildPartial();
                     } else {
                         connectionId_ = value;
                     }
+                    onChanged();
                 } else {
                     connectionIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -47819,13 +49731,13 @@ public final class ContextOuterClass {
              * .context.ConnectionId connection_id = 1;
              */
             public Builder clearConnectionId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                connectionId_ = null;
-                if (connectionIdBuilder_ != null) {
-                    connectionIdBuilder_.dispose();
+                if (connectionIdBuilder_ == null) {
+                    connectionId_ = null;
+                    onChanged();
+                } else {
+                    connectionId_ = null;
                     connectionIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -47833,7 +49745,6 @@ public final class ContextOuterClass {
              * .context.ConnectionId connection_id = 1;
              */
             public context.ContextOuterClass.ConnectionId.Builder getConnectionIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getConnectionIdFieldBuilder().getBuilder();
             }
@@ -47869,7 +49780,7 @@ public final class ContextOuterClass {
              * @return Whether the serviceId field is set.
              */
             public boolean hasServiceId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return serviceIdBuilder_ != null || serviceId_ != null;
             }
 
             /**
@@ -47893,11 +49804,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     serviceId_ = value;
+                    onChanged();
                 } else {
                     serviceIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -47907,11 +49817,10 @@ public final class ContextOuterClass {
             public Builder setServiceId(context.ContextOuterClass.ServiceId.Builder builderForValue) {
                 if (serviceIdBuilder_ == null) {
                     serviceId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     serviceIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -47920,16 +49829,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) {
                 if (serviceIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && serviceId_ != null && serviceId_ != context.ContextOuterClass.ServiceId.getDefaultInstance()) {
-                        getServiceIdBuilder().mergeFrom(value);
+                    if (serviceId_ != null) {
+                        serviceId_ = context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial();
                     } else {
                         serviceId_ = value;
                     }
+                    onChanged();
                 } else {
                     serviceIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -47937,13 +49845,13 @@ public final class ContextOuterClass {
              * .context.ServiceId service_id = 2;
              */
             public Builder clearServiceId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                serviceId_ = null;
-                if (serviceIdBuilder_ != null) {
-                    serviceIdBuilder_.dispose();
+                if (serviceIdBuilder_ == null) {
+                    serviceId_ = null;
+                    onChanged();
+                } else {
+                    serviceId_ = null;
                     serviceIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -47951,7 +49859,6 @@ public final class ContextOuterClass {
              * .context.ServiceId service_id = 2;
              */
             public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getServiceIdFieldBuilder().getBuilder();
             }
@@ -47981,9 +49888,9 @@ public final class ContextOuterClass {
             private java.util.List pathHopsEndpointIds_ = java.util.Collections.emptyList();
 
             private void ensurePathHopsEndpointIdsIsMutable() {
-                if (!((bitField0_ & 0x00000004) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     pathHopsEndpointIds_ = new java.util.ArrayList(pathHopsEndpointIds_);
-                    bitField0_ |= 0x00000004;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -48135,7 +50042,7 @@ public final class ContextOuterClass {
             public Builder clearPathHopsEndpointIds() {
                 if (pathHopsEndpointIdsBuilder_ == null) {
                     pathHopsEndpointIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000004);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     pathHopsEndpointIdsBuilder_.clear();
@@ -48209,7 +50116,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getPathHopsEndpointIdsFieldBuilder() {
                 if (pathHopsEndpointIdsBuilder_ == null) {
-                    pathHopsEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(pathHopsEndpointIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
+                    pathHopsEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(pathHopsEndpointIds_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     pathHopsEndpointIds_ = null;
                 }
                 return pathHopsEndpointIdsBuilder_;
@@ -48218,9 +50125,9 @@ public final class ContextOuterClass {
             private java.util.List subServiceIds_ = java.util.Collections.emptyList();
 
             private void ensureSubServiceIdsIsMutable() {
-                if (!((bitField0_ & 0x00000008) != 0)) {
+                if (!((bitField0_ & 0x00000002) != 0)) {
                     subServiceIds_ = new java.util.ArrayList(subServiceIds_);
-                    bitField0_ |= 0x00000008;
+                    bitField0_ |= 0x00000002;
                 }
             }
 
@@ -48372,7 +50279,7 @@ public final class ContextOuterClass {
             public Builder clearSubServiceIds() {
                 if (subServiceIdsBuilder_ == null) {
                     subServiceIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000008);
+                    bitField0_ = (bitField0_ & ~0x00000002);
                     onChanged();
                 } else {
                     subServiceIdsBuilder_.clear();
@@ -48446,7 +50353,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getSubServiceIdsFieldBuilder() {
                 if (subServiceIdsBuilder_ == null) {
-                    subServiceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(subServiceIds_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean());
+                    subServiceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(subServiceIds_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
                     subServiceIds_ = null;
                 }
                 return subServiceIdsBuilder_;
@@ -48461,7 +50368,7 @@ public final class ContextOuterClass {
              * @return Whether the settings field is set.
              */
             public boolean hasSettings() {
-                return ((bitField0_ & 0x00000010) != 0);
+                return settingsBuilder_ != null || settings_ != null;
             }
 
             /**
@@ -48485,11 +50392,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     settings_ = value;
+                    onChanged();
                 } else {
                     settingsBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -48499,11 +50405,10 @@ public final class ContextOuterClass {
             public Builder setSettings(context.ContextOuterClass.ConnectionSettings.Builder builderForValue) {
                 if (settingsBuilder_ == null) {
                     settings_ = builderForValue.build();
+                    onChanged();
                 } else {
                     settingsBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -48512,16 +50417,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeSettings(context.ContextOuterClass.ConnectionSettings value) {
                 if (settingsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000010) != 0) && settings_ != null && settings_ != context.ContextOuterClass.ConnectionSettings.getDefaultInstance()) {
-                        getSettingsBuilder().mergeFrom(value);
+                    if (settings_ != null) {
+                        settings_ = context.ContextOuterClass.ConnectionSettings.newBuilder(settings_).mergeFrom(value).buildPartial();
                     } else {
                         settings_ = value;
                     }
+                    onChanged();
                 } else {
                     settingsBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -48529,13 +50433,13 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings settings = 5;
              */
             public Builder clearSettings() {
-                bitField0_ = (bitField0_ & ~0x00000010);
-                settings_ = null;
-                if (settingsBuilder_ != null) {
-                    settingsBuilder_.dispose();
+                if (settingsBuilder_ == null) {
+                    settings_ = null;
+                    onChanged();
+                } else {
+                    settings_ = null;
                     settingsBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -48543,7 +50447,6 @@ public final class ContextOuterClass {
              * .context.ConnectionSettings settings = 5;
              */
             public context.ContextOuterClass.ConnectionSettings.Builder getSettingsBuilder() {
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return getSettingsFieldBuilder().getBuilder();
             }
@@ -48597,17 +50500,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Connection parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Connection(input, extensionRegistry);
             }
         };
 
@@ -48678,6 +50571,57 @@ public final class ContextOuterClass {
             return new ConnectionIdList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    connectionIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                connectionIds_.add(input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    connectionIds_ = java.util.Collections.unmodifiableList(connectionIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionIdList_descriptor;
         }
@@ -48689,7 +50633,6 @@ public final class ContextOuterClass {
 
         public static final int CONNECTION_IDS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List connectionIds_;
 
         /**
@@ -48750,7 +50693,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < connectionIds_.size(); i++) {
                 output.writeMessage(1, connectionIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -48762,7 +50705,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < connectionIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, connectionIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -48778,7 +50721,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.ConnectionIdList other = (context.ContextOuterClass.ConnectionIdList) obj;
             if (!getConnectionIdsList().equals(other.getConnectionIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -48794,7 +50737,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONNECTION_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getConnectionIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -48888,23 +50831,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionIdList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getConnectionIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (connectionIdsBuilder_ == null) {
                     connectionIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    connectionIds_ = null;
                     connectionIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -48930,15 +50879,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionIdList buildPartial() {
                 context.ContextOuterClass.ConnectionIdList result = new context.ContextOuterClass.ConnectionIdList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.ConnectionIdList result) {
+                int from_bitField0_ = bitField0_;
                 if (connectionIdsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         connectionIds_ = java.util.Collections.unmodifiableList(connectionIds_);
@@ -48948,10 +50889,38 @@ public final class ContextOuterClass {
                 } else {
                     result.connectionIds_ = connectionIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionIdList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -48991,7 +50960,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -49003,47 +50972,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionIdList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.ConnectionId m = input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry);
-                                    if (connectionIdsBuilder_ == null) {
-                                        ensureConnectionIdsIsMutable();
-                                        connectionIds_.add(m);
-                                    } else {
-                                        connectionIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionIdList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -49313,17 +51252,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionIdList(input, extensionRegistry);
             }
         };
 
@@ -49394,6 +51323,57 @@ public final class ContextOuterClass {
             return new ConnectionList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    connections_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                connections_.add(input.readMessage(context.ContextOuterClass.Connection.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    connections_ = java.util.Collections.unmodifiableList(connections_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionList_descriptor;
         }
@@ -49405,7 +51385,6 @@ public final class ContextOuterClass {
 
         public static final int CONNECTIONS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List connections_;
 
         /**
@@ -49466,7 +51445,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < connections_.size(); i++) {
                 output.writeMessage(1, connections_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -49478,7 +51457,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < connections_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, connections_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -49494,7 +51473,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.ConnectionList other = (context.ContextOuterClass.ConnectionList) obj;
             if (!getConnectionsList().equals(other.getConnectionsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -49510,7 +51489,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONNECTIONS_FIELD_NUMBER;
                 hash = (53 * hash) + getConnectionsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -49604,23 +51583,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getConnectionsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (connectionsBuilder_ == null) {
                     connections_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    connections_ = null;
                     connectionsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -49646,15 +51631,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionList buildPartial() {
                 context.ContextOuterClass.ConnectionList result = new context.ContextOuterClass.ConnectionList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.ConnectionList result) {
+                int from_bitField0_ = bitField0_;
                 if (connectionsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         connections_ = java.util.Collections.unmodifiableList(connections_);
@@ -49664,10 +51641,38 @@ public final class ContextOuterClass {
                 } else {
                     result.connections_ = connectionsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -49707,7 +51712,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -49719,47 +51724,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.Connection m = input.readMessage(context.ContextOuterClass.Connection.parser(), extensionRegistry);
-                                    if (connectionsBuilder_ == null) {
-                                        ensureConnectionsIsMutable();
-                                        connections_.add(m);
-                                    } else {
-                                        connectionsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -50029,17 +52004,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionList(input, extensionRegistry);
             }
         };
 
@@ -50118,6 +52083,70 @@ public final class ContextOuterClass {
             return new ConnectionEvent();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConnectionEvent(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Event.Builder subBuilder = null;
+                                if (event_ != null) {
+                                    subBuilder = event_.toBuilder();
+                                }
+                                event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(event_);
+                                    event_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.ConnectionId.Builder subBuilder = null;
+                                if (connectionId_ != null) {
+                                    subBuilder = connectionId_.toBuilder();
+                                }
+                                connectionId_ = input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(connectionId_);
+                                    connectionId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConnectionEvent_descriptor;
         }
@@ -50154,7 +52183,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-            return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+            return getEvent();
         }
 
         public static final int CONNECTION_ID_FIELD_NUMBER = 2;
@@ -50184,7 +52213,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder() {
-            return connectionId_ == null ? context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
+            return getConnectionId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -50208,7 +52237,7 @@ public final class ContextOuterClass {
             if (connectionId_ != null) {
                 output.writeMessage(2, getConnectionId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -50223,7 +52252,7 @@ public final class ContextOuterClass {
             if (connectionId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getConnectionId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -50249,7 +52278,7 @@ public final class ContextOuterClass {
                 if (!getConnectionId().equals(other.getConnectionId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -50269,7 +52298,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + CONNECTION_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getConnectionId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -50363,24 +52392,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConnectionEvent.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                connectionId_ = null;
-                if (connectionIdBuilder_ != null) {
-                    connectionIdBuilder_.dispose();
+                if (connectionIdBuilder_ == null) {
+                    connectionId_ = null;
+                } else {
+                    connectionId_ = null;
                     connectionIdBuilder_ = null;
                 }
                 return this;
@@ -50408,21 +52445,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConnectionEvent buildPartial() {
                 context.ContextOuterClass.ConnectionEvent result = new context.ContextOuterClass.ConnectionEvent(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (eventBuilder_ == null) {
+                    result.event_ = event_;
+                } else {
+                    result.event_ = eventBuilder_.build();
+                }
+                if (connectionIdBuilder_ == null) {
+                    result.connectionId_ = connectionId_;
+                } else {
+                    result.connectionId_ = connectionIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConnectionEvent result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.event_ = eventBuilder_ == null ? event_ : eventBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.connectionId_ = connectionIdBuilder_ == null ? connectionId_ : connectionIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -50444,7 +52508,7 @@ public final class ContextOuterClass {
                 if (other.hasConnectionId()) {
                     mergeConnectionId(other.getConnectionId());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -50456,54 +52520,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConnectionEvent parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEventFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getConnectionIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConnectionEvent) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Event event_;
 
             private com.google.protobuf.SingleFieldBuilderV3 eventBuilder_;
@@ -50513,7 +52543,7 @@ public final class ContextOuterClass {
              * @return Whether the event field is set.
              */
             public boolean hasEvent() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return eventBuilder_ != null || event_ != null;
             }
 
             /**
@@ -50537,11 +52567,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     event_ = value;
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -50551,11 +52580,10 @@ public final class ContextOuterClass {
             public Builder setEvent(context.ContextOuterClass.Event.Builder builderForValue) {
                 if (eventBuilder_ == null) {
                     event_ = builderForValue.build();
+                    onChanged();
                 } else {
                     eventBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -50564,16 +52592,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEvent(context.ContextOuterClass.Event value) {
                 if (eventBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && event_ != null && event_ != context.ContextOuterClass.Event.getDefaultInstance()) {
-                        getEventBuilder().mergeFrom(value);
+                    if (event_ != null) {
+                        event_ = context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
                     } else {
                         event_ = value;
                     }
+                    onChanged();
                 } else {
                     eventBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -50581,13 +52608,13 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public Builder clearEvent() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                event_ = null;
-                if (eventBuilder_ != null) {
-                    eventBuilder_.dispose();
+                if (eventBuilder_ == null) {
+                    event_ = null;
+                    onChanged();
+                } else {
+                    event_ = null;
                     eventBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -50595,7 +52622,6 @@ public final class ContextOuterClass {
              * .context.Event event = 1;
              */
             public context.ContextOuterClass.Event.Builder getEventBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEventFieldBuilder().getBuilder();
             }
@@ -50631,7 +52657,7 @@ public final class ContextOuterClass {
              * @return Whether the connectionId field is set.
              */
             public boolean hasConnectionId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return connectionIdBuilder_ != null || connectionId_ != null;
             }
 
             /**
@@ -50655,11 +52681,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     connectionId_ = value;
+                    onChanged();
                 } else {
                     connectionIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -50669,11 +52694,10 @@ public final class ContextOuterClass {
             public Builder setConnectionId(context.ContextOuterClass.ConnectionId.Builder builderForValue) {
                 if (connectionIdBuilder_ == null) {
                     connectionId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     connectionIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -50682,16 +52706,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeConnectionId(context.ContextOuterClass.ConnectionId value) {
                 if (connectionIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && connectionId_ != null && connectionId_ != context.ContextOuterClass.ConnectionId.getDefaultInstance()) {
-                        getConnectionIdBuilder().mergeFrom(value);
+                    if (connectionId_ != null) {
+                        connectionId_ = context.ContextOuterClass.ConnectionId.newBuilder(connectionId_).mergeFrom(value).buildPartial();
                     } else {
                         connectionId_ = value;
                     }
+                    onChanged();
                 } else {
                     connectionIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -50699,13 +52722,13 @@ public final class ContextOuterClass {
              * .context.ConnectionId connection_id = 2;
              */
             public Builder clearConnectionId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                connectionId_ = null;
-                if (connectionIdBuilder_ != null) {
-                    connectionIdBuilder_.dispose();
+                if (connectionIdBuilder_ == null) {
+                    connectionId_ = null;
+                    onChanged();
+                } else {
+                    connectionId_ = null;
                     connectionIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -50713,7 +52736,6 @@ public final class ContextOuterClass {
              * .context.ConnectionId connection_id = 2;
              */
             public context.ContextOuterClass.ConnectionId.Builder getConnectionIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getConnectionIdFieldBuilder().getBuilder();
             }
@@ -50767,17 +52789,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConnectionEvent parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConnectionEvent(input, extensionRegistry);
             }
         };
 
@@ -50877,6 +52889,83 @@ public final class ContextOuterClass {
             return new EndPointId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private EndPointId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.TopologyId.Builder subBuilder = null;
+                                if (topologyId_ != null) {
+                                    subBuilder = topologyId_.toBuilder();
+                                }
+                                topologyId_ = input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(topologyId_);
+                                    topologyId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.DeviceId.Builder subBuilder = null;
+                                if (deviceId_ != null) {
+                                    subBuilder = deviceId_.toBuilder();
+                                }
+                                deviceId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(deviceId_);
+                                    deviceId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 26:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (endpointUuid_ != null) {
+                                    subBuilder = endpointUuid_.toBuilder();
+                                }
+                                endpointUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endpointUuid_);
+                                    endpointUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_EndPointId_descriptor;
         }
@@ -50913,7 +53002,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.TopologyIdOrBuilder getTopologyIdOrBuilder() {
-            return topologyId_ == null ? context.ContextOuterClass.TopologyId.getDefaultInstance() : topologyId_;
+            return getTopologyId();
         }
 
         public static final int DEVICE_ID_FIELD_NUMBER = 2;
@@ -50943,7 +53032,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() {
-            return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
+            return getDeviceId();
         }
 
         public static final int ENDPOINT_UUID_FIELD_NUMBER = 3;
@@ -50973,7 +53062,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getEndpointUuidOrBuilder() {
-            return endpointUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : endpointUuid_;
+            return getEndpointUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -51000,7 +53089,7 @@ public final class ContextOuterClass {
             if (endpointUuid_ != null) {
                 output.writeMessage(3, getEndpointUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -51018,7 +53107,7 @@ public final class ContextOuterClass {
             if (endpointUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getEndpointUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -51050,7 +53139,7 @@ public final class ContextOuterClass {
                 if (!getEndpointUuid().equals(other.getEndpointUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -51074,7 +53163,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + ENDPOINT_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getEndpointUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -51172,29 +53261,38 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.EndPointId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                topologyId_ = null;
-                if (topologyIdBuilder_ != null) {
-                    topologyIdBuilder_.dispose();
+                if (topologyIdBuilder_ == null) {
+                    topologyId_ = null;
+                } else {
+                    topologyId_ = null;
                     topologyIdBuilder_ = null;
                 }
-                deviceId_ = null;
-                if (deviceIdBuilder_ != null) {
-                    deviceIdBuilder_.dispose();
+                if (deviceIdBuilder_ == null) {
+                    deviceId_ = null;
+                } else {
+                    deviceId_ = null;
                     deviceIdBuilder_ = null;
                 }
-                endpointUuid_ = null;
-                if (endpointUuidBuilder_ != null) {
-                    endpointUuidBuilder_.dispose();
+                if (endpointUuidBuilder_ == null) {
+                    endpointUuid_ = null;
+                } else {
+                    endpointUuid_ = null;
                     endpointUuidBuilder_ = null;
                 }
                 return this;
@@ -51222,24 +53320,53 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.EndPointId buildPartial() {
                 context.ContextOuterClass.EndPointId result = new context.ContextOuterClass.EndPointId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (topologyIdBuilder_ == null) {
+                    result.topologyId_ = topologyId_;
+                } else {
+                    result.topologyId_ = topologyIdBuilder_.build();
+                }
+                if (deviceIdBuilder_ == null) {
+                    result.deviceId_ = deviceId_;
+                } else {
+                    result.deviceId_ = deviceIdBuilder_.build();
+                }
+                if (endpointUuidBuilder_ == null) {
+                    result.endpointUuid_ = endpointUuid_;
+                } else {
+                    result.endpointUuid_ = endpointUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.EndPointId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.topologyId_ = topologyIdBuilder_ == null ? topologyId_ : topologyIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.deviceId_ = deviceIdBuilder_ == null ? deviceId_ : deviceIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.endpointUuid_ = endpointUuidBuilder_ == null ? endpointUuid_ : endpointUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -51264,7 +53391,7 @@ public final class ContextOuterClass {
                 if (other.hasEndpointUuid()) {
                     mergeEndpointUuid(other.getEndpointUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -51276,61 +53403,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.EndPointId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getTopologyIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getDeviceIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getEndpointUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.EndPointId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.TopologyId topologyId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 topologyIdBuilder_;
@@ -51340,7 +53426,7 @@ public final class ContextOuterClass {
              * @return Whether the topologyId field is set.
              */
             public boolean hasTopologyId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return topologyIdBuilder_ != null || topologyId_ != null;
             }
 
             /**
@@ -51364,11 +53450,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     topologyId_ = value;
+                    onChanged();
                 } else {
                     topologyIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -51378,11 +53463,10 @@ public final class ContextOuterClass {
             public Builder setTopologyId(context.ContextOuterClass.TopologyId.Builder builderForValue) {
                 if (topologyIdBuilder_ == null) {
                     topologyId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     topologyIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -51391,16 +53475,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeTopologyId(context.ContextOuterClass.TopologyId value) {
                 if (topologyIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && topologyId_ != null && topologyId_ != context.ContextOuterClass.TopologyId.getDefaultInstance()) {
-                        getTopologyIdBuilder().mergeFrom(value);
+                    if (topologyId_ != null) {
+                        topologyId_ = context.ContextOuterClass.TopologyId.newBuilder(topologyId_).mergeFrom(value).buildPartial();
                     } else {
                         topologyId_ = value;
                     }
+                    onChanged();
                 } else {
                     topologyIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -51408,13 +53491,13 @@ public final class ContextOuterClass {
              * .context.TopologyId topology_id = 1;
              */
             public Builder clearTopologyId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                topologyId_ = null;
-                if (topologyIdBuilder_ != null) {
-                    topologyIdBuilder_.dispose();
+                if (topologyIdBuilder_ == null) {
+                    topologyId_ = null;
+                    onChanged();
+                } else {
+                    topologyId_ = null;
                     topologyIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -51422,7 +53505,6 @@ public final class ContextOuterClass {
              * .context.TopologyId topology_id = 1;
              */
             public context.ContextOuterClass.TopologyId.Builder getTopologyIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getTopologyIdFieldBuilder().getBuilder();
             }
@@ -51458,7 +53540,7 @@ public final class ContextOuterClass {
              * @return Whether the deviceId field is set.
              */
             public boolean hasDeviceId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return deviceIdBuilder_ != null || deviceId_ != null;
             }
 
             /**
@@ -51482,11 +53564,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     deviceId_ = value;
+                    onChanged();
                 } else {
                     deviceIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -51496,11 +53577,10 @@ public final class ContextOuterClass {
             public Builder setDeviceId(context.ContextOuterClass.DeviceId.Builder builderForValue) {
                 if (deviceIdBuilder_ == null) {
                     deviceId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     deviceIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -51509,16 +53589,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeDeviceId(context.ContextOuterClass.DeviceId value) {
                 if (deviceIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && deviceId_ != null && deviceId_ != context.ContextOuterClass.DeviceId.getDefaultInstance()) {
-                        getDeviceIdBuilder().mergeFrom(value);
+                    if (deviceId_ != null) {
+                        deviceId_ = context.ContextOuterClass.DeviceId.newBuilder(deviceId_).mergeFrom(value).buildPartial();
                     } else {
                         deviceId_ = value;
                     }
+                    onChanged();
                 } else {
                     deviceIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -51526,13 +53605,13 @@ public final class ContextOuterClass {
              * .context.DeviceId device_id = 2;
              */
             public Builder clearDeviceId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                deviceId_ = null;
-                if (deviceIdBuilder_ != null) {
-                    deviceIdBuilder_.dispose();
+                if (deviceIdBuilder_ == null) {
+                    deviceId_ = null;
+                    onChanged();
+                } else {
+                    deviceId_ = null;
                     deviceIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -51540,7 +53619,6 @@ public final class ContextOuterClass {
              * .context.DeviceId device_id = 2;
              */
             public context.ContextOuterClass.DeviceId.Builder getDeviceIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getDeviceIdFieldBuilder().getBuilder();
             }
@@ -51576,7 +53654,7 @@ public final class ContextOuterClass {
              * @return Whether the endpointUuid field is set.
              */
             public boolean hasEndpointUuid() {
-                return ((bitField0_ & 0x00000004) != 0);
+                return endpointUuidBuilder_ != null || endpointUuid_ != null;
             }
 
             /**
@@ -51600,11 +53678,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     endpointUuid_ = value;
+                    onChanged();
                 } else {
                     endpointUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -51614,11 +53691,10 @@ public final class ContextOuterClass {
             public Builder setEndpointUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (endpointUuidBuilder_ == null) {
                     endpointUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endpointUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -51627,16 +53703,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEndpointUuid(context.ContextOuterClass.Uuid value) {
                 if (endpointUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0) && endpointUuid_ != null && endpointUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getEndpointUuidBuilder().mergeFrom(value);
+                    if (endpointUuid_ != null) {
+                        endpointUuid_ = context.ContextOuterClass.Uuid.newBuilder(endpointUuid_).mergeFrom(value).buildPartial();
                     } else {
                         endpointUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     endpointUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -51644,13 +53719,13 @@ public final class ContextOuterClass {
              * .context.Uuid endpoint_uuid = 3;
              */
             public Builder clearEndpointUuid() {
-                bitField0_ = (bitField0_ & ~0x00000004);
-                endpointUuid_ = null;
-                if (endpointUuidBuilder_ != null) {
-                    endpointUuidBuilder_.dispose();
+                if (endpointUuidBuilder_ == null) {
+                    endpointUuid_ = null;
+                    onChanged();
+                } else {
+                    endpointUuid_ = null;
                     endpointUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -51658,7 +53733,6 @@ public final class ContextOuterClass {
              * .context.Uuid endpoint_uuid = 3;
              */
             public context.ContextOuterClass.Uuid.Builder getEndpointUuidBuilder() {
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return getEndpointUuidFieldBuilder().getBuilder();
             }
@@ -51712,17 +53786,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public EndPointId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new EndPointId(input, extensionRegistry);
             }
         };
 
@@ -51860,6 +53924,111 @@ public final class ContextOuterClass {
             return new EndPoint();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private EndPoint(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.EndPointId.Builder subBuilder = null;
+                                if (endpointId_ != null) {
+                                    subBuilder = endpointId_.toBuilder();
+                                }
+                                endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endpointId_);
+                                    endpointId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                endpointType_ = s;
+                                break;
+                            }
+                        case 32:
+                            {
+                                int rawValue = input.readEnum();
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    kpiSampleTypes_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                kpiSampleTypes_.add(rawValue);
+                                break;
+                            }
+                        case 34:
+                            {
+                                int length = input.readRawVarint32();
+                                int oldLimit = input.pushLimit(length);
+                                while (input.getBytesUntilLimit() > 0) {
+                                    int rawValue = input.readEnum();
+                                    if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                        kpiSampleTypes_ = new java.util.ArrayList();
+                                        mutable_bitField0_ |= 0x00000001;
+                                    }
+                                    kpiSampleTypes_.add(rawValue);
+                                }
+                                input.popLimit(oldLimit);
+                                break;
+                            }
+                        case 42:
+                            {
+                                context.ContextOuterClass.Location.Builder subBuilder = null;
+                                if (endpointLocation_ != null) {
+                                    subBuilder = endpointLocation_.toBuilder();
+                                }
+                                endpointLocation_ = input.readMessage(context.ContextOuterClass.Location.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endpointLocation_);
+                                    endpointLocation_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    kpiSampleTypes_ = java.util.Collections.unmodifiableList(kpiSampleTypes_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_EndPoint_descriptor;
         }
@@ -51896,13 +54065,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+            return getEndpointId();
         }
 
         public static final int NAME_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 2;
@@ -51939,8 +54107,7 @@ public final class ContextOuterClass {
 
         public static final int ENDPOINT_TYPE_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object endpointType_ = "";
+        private volatile java.lang.Object endpointType_;
 
         /**
          * string endpoint_type = 3;
@@ -51977,13 +54144,13 @@ public final class ContextOuterClass {
 
         public static final int KPI_SAMPLE_TYPES_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
         private java.util.List kpiSampleTypes_;
 
         private static final com.google.protobuf.Internal.ListAdapter.Converter kpiSampleTypes_converter_ = new com.google.protobuf.Internal.ListAdapter.Converter() {
 
             public kpi_sample_types.KpiSampleTypes.KpiSampleType convert(java.lang.Integer from) {
-                kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.forNumber(from);
+                @SuppressWarnings("deprecation")
+                kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.valueOf(from);
                 return result == null ? kpi_sample_types.KpiSampleTypes.KpiSampleType.UNRECOGNIZED : result;
             }
         };
@@ -52064,7 +54231,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.LocationOrBuilder getEndpointLocationOrBuilder() {
-            return endpointLocation_ == null ? context.ContextOuterClass.Location.getDefaultInstance() : endpointLocation_;
+            return getEndpointLocation();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -52086,10 +54253,10 @@ public final class ContextOuterClass {
             if (endpointId_ != null) {
                 output.writeMessage(1, getEndpointId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(endpointType_)) {
+            if (!getEndpointTypeBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 3, endpointType_);
             }
             if (getKpiSampleTypesList().size() > 0) {
@@ -52102,7 +54269,7 @@ public final class ContextOuterClass {
             if (endpointLocation_ != null) {
                 output.writeMessage(5, getEndpointLocation());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -52114,10 +54281,10 @@ public final class ContextOuterClass {
             if (endpointId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getEndpointId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(endpointType_)) {
+            if (!getEndpointTypeBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, endpointType_);
             }
             {
@@ -52135,7 +54302,7 @@ public final class ContextOuterClass {
             if (endpointLocation_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, getEndpointLocation());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -52167,7 +54334,7 @@ public final class ContextOuterClass {
                 if (!getEndpointLocation().equals(other.getEndpointLocation()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -52195,7 +54362,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + ENDPOINT_LOCATION_FIELD_NUMBER;
                 hash = (53 * hash) + getEndpointLocation().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -52289,28 +54456,36 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.EndPoint.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
                 name_ = "";
                 endpointType_ = "";
                 kpiSampleTypes_ = java.util.Collections.emptyList();
-                bitField0_ = (bitField0_ & ~0x00000008);
-                endpointLocation_ = null;
-                if (endpointLocationBuilder_ != null) {
-                    endpointLocationBuilder_.dispose();
+                bitField0_ = (bitField0_ & ~0x00000001);
+                if (endpointLocationBuilder_ == null) {
+                    endpointLocation_ = null;
+                } else {
+                    endpointLocation_ = null;
                     endpointLocationBuilder_ = null;
                 }
                 return this;
@@ -52338,36 +54513,56 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.EndPoint buildPartial() {
                 context.ContextOuterClass.EndPoint result = new context.ContextOuterClass.EndPoint(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (endpointIdBuilder_ == null) {
+                    result.endpointId_ = endpointId_;
+                } else {
+                    result.endpointId_ = endpointIdBuilder_.build();
+                }
+                result.name_ = name_;
+                result.endpointType_ = endpointType_;
+                if (((bitField0_ & 0x00000001) != 0)) {
+                    kpiSampleTypes_ = java.util.Collections.unmodifiableList(kpiSampleTypes_);
+                    bitField0_ = (bitField0_ & ~0x00000001);
+                }
+                result.kpiSampleTypes_ = kpiSampleTypes_;
+                if (endpointLocationBuilder_ == null) {
+                    result.endpointLocation_ = endpointLocation_;
+                } else {
+                    result.endpointLocation_ = endpointLocationBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartialRepeatedFields(context.ContextOuterClass.EndPoint result) {
-                if (((bitField0_ & 0x00000008) != 0)) {
-                    kpiSampleTypes_ = java.util.Collections.unmodifiableList(kpiSampleTypes_);
-                    bitField0_ = (bitField0_ & ~0x00000008);
-                }
-                result.kpiSampleTypes_ = kpiSampleTypes_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
             }
 
-            private void buildPartial0(context.ContextOuterClass.EndPoint result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.endpointId_ = endpointIdBuilder_ == null ? endpointId_ : endpointIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.endpointType_ = endpointType_;
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.endpointLocation_ = endpointLocationBuilder_ == null ? endpointLocation_ : endpointLocationBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -52388,18 +54583,16 @@ public final class ContextOuterClass {
                 }
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (!other.getEndpointType().isEmpty()) {
                     endpointType_ = other.endpointType_;
-                    bitField0_ |= 0x00000004;
                     onChanged();
                 }
                 if (!other.kpiSampleTypes_.isEmpty()) {
                     if (kpiSampleTypes_.isEmpty()) {
                         kpiSampleTypes_ = other.kpiSampleTypes_;
-                        bitField0_ = (bitField0_ & ~0x00000008);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     } else {
                         ensureKpiSampleTypesIsMutable();
                         kpiSampleTypes_.addAll(other.kpiSampleTypes_);
@@ -52409,7 +54602,7 @@ public final class ContextOuterClass {
                 if (other.hasEndpointLocation()) {
                     mergeEndpointLocation(other.getEndpointLocation());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -52421,84 +54614,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.EndPoint parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEndpointIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    endpointType_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            case 32:
-                                {
-                                    int tmpRaw = input.readEnum();
-                                    ensureKpiSampleTypesIsMutable();
-                                    kpiSampleTypes_.add(tmpRaw);
-                                    break;
-                                }
-                            // case 32
-                            case 34:
-                                {
-                                    int length = input.readRawVarint32();
-                                    int oldLimit = input.pushLimit(length);
-                                    while (input.getBytesUntilLimit() > 0) {
-                                        int tmpRaw = input.readEnum();
-                                        ensureKpiSampleTypesIsMutable();
-                                        kpiSampleTypes_.add(tmpRaw);
-                                    }
-                                    input.popLimit(oldLimit);
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    input.readMessage(getEndpointLocationFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 42
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.EndPoint) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -52513,7 +54639,7 @@ public final class ContextOuterClass {
              * @return Whether the endpointId field is set.
              */
             public boolean hasEndpointId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return endpointIdBuilder_ != null || endpointId_ != null;
             }
 
             /**
@@ -52537,11 +54663,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     endpointId_ = value;
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -52551,11 +54676,10 @@ public final class ContextOuterClass {
             public Builder setEndpointId(context.ContextOuterClass.EndPointId.Builder builderForValue) {
                 if (endpointIdBuilder_ == null) {
                     endpointId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -52564,16 +54688,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
                 if (endpointIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && endpointId_ != null && endpointId_ != context.ContextOuterClass.EndPointId.getDefaultInstance()) {
-                        getEndpointIdBuilder().mergeFrom(value);
+                    if (endpointId_ != null) {
+                        endpointId_ = context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
                     } else {
                         endpointId_ = value;
                     }
+                    onChanged();
                 } else {
                     endpointIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -52581,13 +54704,13 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public Builder clearEndpointId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                    onChanged();
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -52595,7 +54718,6 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEndpointIdFieldBuilder().getBuilder();
             }
@@ -52665,7 +54787,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -52676,7 +54797,6 @@ public final class ContextOuterClass {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -52692,7 +54812,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -52740,7 +54859,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 endpointType_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -52751,7 +54869,6 @@ public final class ContextOuterClass {
              */
             public Builder clearEndpointType() {
                 endpointType_ = getDefaultInstance().getEndpointType();
-                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -52767,7 +54884,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 endpointType_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -52775,9 +54891,9 @@ public final class ContextOuterClass {
             private java.util.List kpiSampleTypes_ = java.util.Collections.emptyList();
 
             private void ensureKpiSampleTypesIsMutable() {
-                if (!((bitField0_ & 0x00000008) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     kpiSampleTypes_ = new java.util.ArrayList(kpiSampleTypes_);
-                    bitField0_ |= 0x00000008;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -52857,7 +54973,7 @@ public final class ContextOuterClass {
              */
             public Builder clearKpiSampleTypes() {
                 kpiSampleTypes_ = java.util.Collections.emptyList();
-                bitField0_ = (bitField0_ & ~0x00000008);
+                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -52881,8 +54997,8 @@ public final class ContextOuterClass {
 
             /**
              * repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;
-             * @param index The index to set the value at.
-             * @param value The enum numeric value on the wire for kpiSampleTypes to set.
+             * @param index The index of the value to return.
+             * @return The enum numeric value on the wire of kpiSampleTypes at the given index.
              * @return This builder for chaining.
              */
             public Builder setKpiSampleTypesValue(int index, int value) {
@@ -52927,7 +55043,7 @@ public final class ContextOuterClass {
              * @return Whether the endpointLocation field is set.
              */
             public boolean hasEndpointLocation() {
-                return ((bitField0_ & 0x00000010) != 0);
+                return endpointLocationBuilder_ != null || endpointLocation_ != null;
             }
 
             /**
@@ -52951,11 +55067,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     endpointLocation_ = value;
+                    onChanged();
                 } else {
                     endpointLocationBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -52965,11 +55080,10 @@ public final class ContextOuterClass {
             public Builder setEndpointLocation(context.ContextOuterClass.Location.Builder builderForValue) {
                 if (endpointLocationBuilder_ == null) {
                     endpointLocation_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endpointLocationBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -52978,16 +55092,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEndpointLocation(context.ContextOuterClass.Location value) {
                 if (endpointLocationBuilder_ == null) {
-                    if (((bitField0_ & 0x00000010) != 0) && endpointLocation_ != null && endpointLocation_ != context.ContextOuterClass.Location.getDefaultInstance()) {
-                        getEndpointLocationBuilder().mergeFrom(value);
+                    if (endpointLocation_ != null) {
+                        endpointLocation_ = context.ContextOuterClass.Location.newBuilder(endpointLocation_).mergeFrom(value).buildPartial();
                     } else {
                         endpointLocation_ = value;
                     }
+                    onChanged();
                 } else {
                     endpointLocationBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -52995,13 +55108,13 @@ public final class ContextOuterClass {
              * .context.Location endpoint_location = 5;
              */
             public Builder clearEndpointLocation() {
-                bitField0_ = (bitField0_ & ~0x00000010);
-                endpointLocation_ = null;
-                if (endpointLocationBuilder_ != null) {
-                    endpointLocationBuilder_.dispose();
+                if (endpointLocationBuilder_ == null) {
+                    endpointLocation_ = null;
+                    onChanged();
+                } else {
+                    endpointLocation_ = null;
                     endpointLocationBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -53009,7 +55122,6 @@ public final class ContextOuterClass {
              * .context.Location endpoint_location = 5;
              */
             public context.ContextOuterClass.Location.Builder getEndpointLocationBuilder() {
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return getEndpointLocationFieldBuilder().getBuilder();
             }
@@ -53063,17 +55175,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public EndPoint parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new EndPoint(input, extensionRegistry);
             }
         };
 
@@ -53174,6 +55276,75 @@ public final class ContextOuterClass {
             return new EndPointName();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private EndPointName(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.EndPointId.Builder subBuilder = null;
+                                if (endpointId_ != null) {
+                                    subBuilder = endpointId_.toBuilder();
+                                }
+                                endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endpointId_);
+                                    endpointId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                deviceName_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                endpointName_ = s;
+                                break;
+                            }
+                        case 34:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                endpointType_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_EndPointName_descriptor;
         }
@@ -53210,13 +55381,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+            return getEndpointId();
         }
 
         public static final int DEVICE_NAME_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object deviceName_ = "";
+        private volatile java.lang.Object deviceName_;
 
         /**
          * string device_name = 2;
@@ -53253,8 +55423,7 @@ public final class ContextOuterClass {
 
         public static final int ENDPOINT_NAME_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object endpointName_ = "";
+        private volatile java.lang.Object endpointName_;
 
         /**
          * string endpoint_name = 3;
@@ -53291,8 +55460,7 @@ public final class ContextOuterClass {
 
         public static final int ENDPOINT_TYPE_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object endpointType_ = "";
+        private volatile java.lang.Object endpointType_;
 
         /**
          * string endpoint_type = 4;
@@ -53345,16 +55513,16 @@ public final class ContextOuterClass {
             if (endpointId_ != null) {
                 output.writeMessage(1, getEndpointId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(deviceName_)) {
+            if (!getDeviceNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, deviceName_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(endpointName_)) {
+            if (!getEndpointNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 3, endpointName_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(endpointType_)) {
+            if (!getEndpointTypeBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 4, endpointType_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -53366,16 +55534,16 @@ public final class ContextOuterClass {
             if (endpointId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getEndpointId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(deviceName_)) {
+            if (!getDeviceNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, deviceName_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(endpointName_)) {
+            if (!getEndpointNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, endpointName_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(endpointType_)) {
+            if (!getEndpointTypeBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, endpointType_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -53401,7 +55569,7 @@ public final class ContextOuterClass {
                 return false;
             if (!getEndpointType().equals(other.getEndpointType()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -53423,7 +55591,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + getEndpointName().hashCode();
             hash = (37 * hash) + ENDPOINT_TYPE_FIELD_NUMBER;
             hash = (53 * hash) + getEndpointType().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -53517,19 +55685,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.EndPointName.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
                 deviceName_ = "";
@@ -53560,27 +55735,46 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.EndPointName buildPartial() {
                 context.ContextOuterClass.EndPointName result = new context.ContextOuterClass.EndPointName(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (endpointIdBuilder_ == null) {
+                    result.endpointId_ = endpointId_;
+                } else {
+                    result.endpointId_ = endpointIdBuilder_.build();
                 }
+                result.deviceName_ = deviceName_;
+                result.endpointName_ = endpointName_;
+                result.endpointType_ = endpointType_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.EndPointName result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.endpointId_ = endpointIdBuilder_ == null ? endpointId_ : endpointIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.deviceName_ = deviceName_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.endpointName_ = endpointName_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.endpointType_ = endpointType_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -53601,20 +55795,17 @@ public final class ContextOuterClass {
                 }
                 if (!other.getDeviceName().isEmpty()) {
                     deviceName_ = other.deviceName_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (!other.getEndpointName().isEmpty()) {
                     endpointName_ = other.endpointName_;
-                    bitField0_ |= 0x00000004;
                     onChanged();
                 }
                 if (!other.getEndpointType().isEmpty()) {
                     endpointType_ = other.endpointType_;
-                    bitField0_ |= 0x00000008;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -53626,68 +55817,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.EndPointName parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEndpointIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    deviceName_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    endpointName_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    endpointType_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 34
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.EndPointName) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.EndPointId endpointId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 endpointIdBuilder_;
@@ -53697,7 +55840,7 @@ public final class ContextOuterClass {
              * @return Whether the endpointId field is set.
              */
             public boolean hasEndpointId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return endpointIdBuilder_ != null || endpointId_ != null;
             }
 
             /**
@@ -53721,11 +55864,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     endpointId_ = value;
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -53735,11 +55877,10 @@ public final class ContextOuterClass {
             public Builder setEndpointId(context.ContextOuterClass.EndPointId.Builder builderForValue) {
                 if (endpointIdBuilder_ == null) {
                     endpointId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -53748,16 +55889,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
                 if (endpointIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && endpointId_ != null && endpointId_ != context.ContextOuterClass.EndPointId.getDefaultInstance()) {
-                        getEndpointIdBuilder().mergeFrom(value);
+                    if (endpointId_ != null) {
+                        endpointId_ = context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
                     } else {
                         endpointId_ = value;
                     }
+                    onChanged();
                 } else {
                     endpointIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -53765,13 +55905,13 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public Builder clearEndpointId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                    onChanged();
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -53779,7 +55919,6 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEndpointIdFieldBuilder().getBuilder();
             }
@@ -53849,7 +55988,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 deviceName_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -53860,7 +55998,6 @@ public final class ContextOuterClass {
              */
             public Builder clearDeviceName() {
                 deviceName_ = getDefaultInstance().getDeviceName();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -53876,7 +56013,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 deviceName_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -53924,7 +56060,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 endpointName_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -53935,7 +56070,6 @@ public final class ContextOuterClass {
              */
             public Builder clearEndpointName() {
                 endpointName_ = getDefaultInstance().getEndpointName();
-                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -53951,7 +56085,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 endpointName_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -53999,7 +56132,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 endpointType_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -54010,7 +56142,6 @@ public final class ContextOuterClass {
              */
             public Builder clearEndpointType() {
                 endpointType_ = getDefaultInstance().getEndpointType();
-                bitField0_ = (bitField0_ & ~0x00000008);
                 onChanged();
                 return this;
             }
@@ -54026,7 +56157,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 endpointType_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -54058,17 +56188,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public EndPointName parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new EndPointName(input, extensionRegistry);
             }
         };
 
@@ -54139,6 +56259,57 @@ public final class ContextOuterClass {
             return new EndPointIdList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private EndPointIdList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    endpointIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                endpointIds_.add(input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    endpointIds_ = java.util.Collections.unmodifiableList(endpointIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_EndPointIdList_descriptor;
         }
@@ -54150,7 +56321,6 @@ public final class ContextOuterClass {
 
         public static final int ENDPOINT_IDS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List endpointIds_;
 
         /**
@@ -54211,7 +56381,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < endpointIds_.size(); i++) {
                 output.writeMessage(1, endpointIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -54223,7 +56393,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < endpointIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, endpointIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -54239,7 +56409,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.EndPointIdList other = (context.ContextOuterClass.EndPointIdList) obj;
             if (!getEndpointIdsList().equals(other.getEndpointIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -54255,7 +56425,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + ENDPOINT_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getEndpointIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -54349,23 +56519,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.EndPointIdList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getEndpointIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (endpointIdsBuilder_ == null) {
                     endpointIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    endpointIds_ = null;
                     endpointIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -54391,15 +56567,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.EndPointIdList buildPartial() {
                 context.ContextOuterClass.EndPointIdList result = new context.ContextOuterClass.EndPointIdList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.EndPointIdList result) {
+                int from_bitField0_ = bitField0_;
                 if (endpointIdsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         endpointIds_ = java.util.Collections.unmodifiableList(endpointIds_);
@@ -54409,10 +56577,38 @@ public final class ContextOuterClass {
                 } else {
                     result.endpointIds_ = endpointIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.EndPointIdList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -54452,7 +56648,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -54464,47 +56660,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.EndPointIdList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.EndPointId m = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-                                    if (endpointIdsBuilder_ == null) {
-                                        ensureEndpointIdsIsMutable();
-                                        endpointIds_.add(m);
-                                    } else {
-                                        endpointIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.EndPointIdList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -54774,17 +56940,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public EndPointIdList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new EndPointIdList(input, extensionRegistry);
             }
         };
 
@@ -54855,6 +57011,57 @@ public final class ContextOuterClass {
             return new EndPointNameList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private EndPointNameList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    endpointNames_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                endpointNames_.add(input.readMessage(context.ContextOuterClass.EndPointName.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    endpointNames_ = java.util.Collections.unmodifiableList(endpointNames_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_EndPointNameList_descriptor;
         }
@@ -54866,7 +57073,6 @@ public final class ContextOuterClass {
 
         public static final int ENDPOINT_NAMES_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List endpointNames_;
 
         /**
@@ -54927,7 +57133,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < endpointNames_.size(); i++) {
                 output.writeMessage(1, endpointNames_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -54939,7 +57145,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < endpointNames_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, endpointNames_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -54955,7 +57161,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.EndPointNameList other = (context.ContextOuterClass.EndPointNameList) obj;
             if (!getEndpointNamesList().equals(other.getEndpointNamesList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -54971,7 +57177,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + ENDPOINT_NAMES_FIELD_NUMBER;
                 hash = (53 * hash) + getEndpointNamesList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -55065,23 +57271,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.EndPointNameList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getEndpointNamesFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (endpointNamesBuilder_ == null) {
                     endpointNames_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    endpointNames_ = null;
                     endpointNamesBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -55107,15 +57319,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.EndPointNameList buildPartial() {
                 context.ContextOuterClass.EndPointNameList result = new context.ContextOuterClass.EndPointNameList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.EndPointNameList result) {
+                int from_bitField0_ = bitField0_;
                 if (endpointNamesBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         endpointNames_ = java.util.Collections.unmodifiableList(endpointNames_);
@@ -55125,10 +57329,38 @@ public final class ContextOuterClass {
                 } else {
                     result.endpointNames_ = endpointNamesBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.EndPointNameList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -55168,7 +57400,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -55180,47 +57412,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.EndPointNameList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.EndPointName m = input.readMessage(context.ContextOuterClass.EndPointName.parser(), extensionRegistry);
-                                    if (endpointNamesBuilder_ == null) {
-                                        ensureEndpointNamesIsMutable();
-                                        endpointNames_.add(m);
-                                    } else {
-                                        endpointNamesBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.EndPointNameList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -55490,17 +57692,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public EndPointNameList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new EndPointNameList(input, extensionRegistry);
             }
         };
 
@@ -55571,6 +57763,56 @@ public final class ContextOuterClass {
             return new ConfigRule_Custom();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConfigRule_Custom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                resourceKey_ = s;
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                resourceValue_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConfigRule_Custom_descriptor;
         }
@@ -55582,8 +57824,7 @@ public final class ContextOuterClass {
 
         public static final int RESOURCE_KEY_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object resourceKey_ = "";
+        private volatile java.lang.Object resourceKey_;
 
         /**
          * string resource_key = 1;
@@ -55620,8 +57861,7 @@ public final class ContextOuterClass {
 
         public static final int RESOURCE_VALUE_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object resourceValue_ = "";
+        private volatile java.lang.Object resourceValue_;
 
         /**
          * string resource_value = 2;
@@ -55671,13 +57911,13 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(resourceKey_)) {
+            if (!getResourceKeyBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, resourceKey_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(resourceValue_)) {
+            if (!getResourceValueBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, resourceValue_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -55686,13 +57926,13 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(resourceKey_)) {
+            if (!getResourceKeyBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, resourceKey_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(resourceValue_)) {
+            if (!getResourceValueBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, resourceValue_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -55710,7 +57950,7 @@ public final class ContextOuterClass {
                 return false;
             if (!getResourceValue().equals(other.getResourceValue()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -55726,7 +57966,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + getResourceKey().hashCode();
             hash = (37 * hash) + RESOURCE_VALUE_FIELD_NUMBER;
             hash = (53 * hash) + getResourceValue().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -55820,16 +58060,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConfigRule_Custom.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 resourceKey_ = "";
                 resourceValue_ = "";
                 return this;
@@ -55857,21 +58103,40 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConfigRule_Custom buildPartial() {
                 context.ContextOuterClass.ConfigRule_Custom result = new context.ContextOuterClass.ConfigRule_Custom(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.resourceKey_ = resourceKey_;
+                result.resourceValue_ = resourceValue_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConfigRule_Custom result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.resourceKey_ = resourceKey_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.resourceValue_ = resourceValue_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -55889,15 +58154,13 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getResourceKey().isEmpty()) {
                     resourceKey_ = other.resourceKey_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
                 if (!other.getResourceValue().isEmpty()) {
                     resourceValue_ = other.resourceValue_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -55909,54 +58172,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConfigRule_Custom parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    resourceKey_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    resourceValue_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConfigRule_Custom) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private java.lang.Object resourceKey_ = "";
 
             /**
@@ -56000,7 +58229,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 resourceKey_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -56011,7 +58239,6 @@ public final class ContextOuterClass {
              */
             public Builder clearResourceKey() {
                 resourceKey_ = getDefaultInstance().getResourceKey();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -56027,7 +58254,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 resourceKey_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -56075,7 +58301,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 resourceValue_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -56086,7 +58311,6 @@ public final class ContextOuterClass {
              */
             public Builder clearResourceValue() {
                 resourceValue_ = getDefaultInstance().getResourceValue();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -56102,7 +58326,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 resourceValue_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -56134,17 +58357,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConfigRule_Custom parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConfigRule_Custom(input, extensionRegistry);
             }
         };
 
@@ -56223,6 +58436,70 @@ public final class ContextOuterClass {
             return new ConfigRule_ACL();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConfigRule_ACL(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.EndPointId.Builder subBuilder = null;
+                                if (endpointId_ != null) {
+                                    subBuilder = endpointId_.toBuilder();
+                                }
+                                endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endpointId_);
+                                    endpointId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                acl.Acl.AclRuleSet.Builder subBuilder = null;
+                                if (ruleSet_ != null) {
+                                    subBuilder = ruleSet_.toBuilder();
+                                }
+                                ruleSet_ = input.readMessage(acl.Acl.AclRuleSet.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(ruleSet_);
+                                    ruleSet_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConfigRule_ACL_descriptor;
         }
@@ -56259,7 +58536,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+            return getEndpointId();
         }
 
         public static final int RULE_SET_FIELD_NUMBER = 2;
@@ -56289,7 +58566,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public acl.Acl.AclRuleSetOrBuilder getRuleSetOrBuilder() {
-            return ruleSet_ == null ? acl.Acl.AclRuleSet.getDefaultInstance() : ruleSet_;
+            return getRuleSet();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -56313,7 +58590,7 @@ public final class ContextOuterClass {
             if (ruleSet_ != null) {
                 output.writeMessage(2, getRuleSet());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -56328,7 +58605,7 @@ public final class ContextOuterClass {
             if (ruleSet_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getRuleSet());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -56354,7 +58631,7 @@ public final class ContextOuterClass {
                 if (!getRuleSet().equals(other.getRuleSet()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -56374,7 +58651,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + RULE_SET_FIELD_NUMBER;
                 hash = (53 * hash) + getRuleSet().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -56468,24 +58745,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConfigRule_ACL.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
-                ruleSet_ = null;
-                if (ruleSetBuilder_ != null) {
-                    ruleSetBuilder_.dispose();
+                if (ruleSetBuilder_ == null) {
+                    ruleSet_ = null;
+                } else {
+                    ruleSet_ = null;
                     ruleSetBuilder_ = null;
                 }
                 return this;
@@ -56513,21 +58798,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConfigRule_ACL buildPartial() {
                 context.ContextOuterClass.ConfigRule_ACL result = new context.ContextOuterClass.ConfigRule_ACL(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (endpointIdBuilder_ == null) {
+                    result.endpointId_ = endpointId_;
+                } else {
+                    result.endpointId_ = endpointIdBuilder_.build();
+                }
+                if (ruleSetBuilder_ == null) {
+                    result.ruleSet_ = ruleSet_;
+                } else {
+                    result.ruleSet_ = ruleSetBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConfigRule_ACL result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.endpointId_ = endpointIdBuilder_ == null ? endpointId_ : endpointIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.ruleSet_ = ruleSetBuilder_ == null ? ruleSet_ : ruleSetBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -56549,7 +58861,7 @@ public final class ContextOuterClass {
                 if (other.hasRuleSet()) {
                     mergeRuleSet(other.getRuleSet());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -56561,54 +58873,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConfigRule_ACL parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEndpointIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getRuleSetFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConfigRule_ACL) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.EndPointId endpointId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 endpointIdBuilder_;
@@ -56618,7 +58896,7 @@ public final class ContextOuterClass {
              * @return Whether the endpointId field is set.
              */
             public boolean hasEndpointId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return endpointIdBuilder_ != null || endpointId_ != null;
             }
 
             /**
@@ -56642,11 +58920,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     endpointId_ = value;
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -56656,11 +58933,10 @@ public final class ContextOuterClass {
             public Builder setEndpointId(context.ContextOuterClass.EndPointId.Builder builderForValue) {
                 if (endpointIdBuilder_ == null) {
                     endpointId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -56669,16 +58945,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
                 if (endpointIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && endpointId_ != null && endpointId_ != context.ContextOuterClass.EndPointId.getDefaultInstance()) {
-                        getEndpointIdBuilder().mergeFrom(value);
+                    if (endpointId_ != null) {
+                        endpointId_ = context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
                     } else {
                         endpointId_ = value;
                     }
+                    onChanged();
                 } else {
                     endpointIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -56686,13 +58961,13 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public Builder clearEndpointId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                    onChanged();
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -56700,7 +58975,6 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEndpointIdFieldBuilder().getBuilder();
             }
@@ -56736,7 +59010,7 @@ public final class ContextOuterClass {
              * @return Whether the ruleSet field is set.
              */
             public boolean hasRuleSet() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return ruleSetBuilder_ != null || ruleSet_ != null;
             }
 
             /**
@@ -56760,11 +59034,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     ruleSet_ = value;
+                    onChanged();
                 } else {
                     ruleSetBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -56774,11 +59047,10 @@ public final class ContextOuterClass {
             public Builder setRuleSet(acl.Acl.AclRuleSet.Builder builderForValue) {
                 if (ruleSetBuilder_ == null) {
                     ruleSet_ = builderForValue.build();
+                    onChanged();
                 } else {
                     ruleSetBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -56787,16 +59059,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeRuleSet(acl.Acl.AclRuleSet value) {
                 if (ruleSetBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && ruleSet_ != null && ruleSet_ != acl.Acl.AclRuleSet.getDefaultInstance()) {
-                        getRuleSetBuilder().mergeFrom(value);
+                    if (ruleSet_ != null) {
+                        ruleSet_ = acl.Acl.AclRuleSet.newBuilder(ruleSet_).mergeFrom(value).buildPartial();
                     } else {
                         ruleSet_ = value;
                     }
+                    onChanged();
                 } else {
                     ruleSetBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -56804,13 +59075,13 @@ public final class ContextOuterClass {
              * .acl.AclRuleSet rule_set = 2;
              */
             public Builder clearRuleSet() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                ruleSet_ = null;
-                if (ruleSetBuilder_ != null) {
-                    ruleSetBuilder_.dispose();
+                if (ruleSetBuilder_ == null) {
+                    ruleSet_ = null;
+                    onChanged();
+                } else {
+                    ruleSet_ = null;
                     ruleSetBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -56818,7 +59089,6 @@ public final class ContextOuterClass {
              * .acl.AclRuleSet rule_set = 2;
              */
             public acl.Acl.AclRuleSet.Builder getRuleSetBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getRuleSetFieldBuilder().getBuilder();
             }
@@ -56872,17 +59142,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConfigRule_ACL parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConfigRule_ACL(input, extensionRegistry);
             }
         };
 
@@ -56950,7 +59210,7 @@ public final class ContextOuterClass {
          */
         context.ContextOuterClass.ConfigRule_ACLOrBuilder getAclOrBuilder();
 
-        context.ContextOuterClass.ConfigRule.ConfigRuleCase getConfigRuleCase();
+        public context.ContextOuterClass.ConfigRule.ConfigRuleCase getConfigRuleCase();
     }
 
     /**
@@ -56976,6 +59236,78 @@ public final class ContextOuterClass {
             return new ConfigRule();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private ConfigRule(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                int rawValue = input.readEnum();
+                                action_ = rawValue;
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.ConfigRule_Custom.Builder subBuilder = null;
+                                if (configRuleCase_ == 2) {
+                                    subBuilder = ((context.ContextOuterClass.ConfigRule_Custom) configRule_).toBuilder();
+                                }
+                                configRule_ = input.readMessage(context.ContextOuterClass.ConfigRule_Custom.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.ConfigRule_Custom) configRule_);
+                                    configRule_ = subBuilder.buildPartial();
+                                }
+                                configRuleCase_ = 2;
+                                break;
+                            }
+                        case 26:
+                            {
+                                context.ContextOuterClass.ConfigRule_ACL.Builder subBuilder = null;
+                                if (configRuleCase_ == 3) {
+                                    subBuilder = ((context.ContextOuterClass.ConfigRule_ACL) configRule_).toBuilder();
+                                }
+                                configRule_ = input.readMessage(context.ContextOuterClass.ConfigRule_ACL.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.ConfigRule_ACL) configRule_);
+                                    configRule_ = subBuilder.buildPartial();
+                                }
+                                configRuleCase_ = 3;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_ConfigRule_descriptor;
         }
@@ -56987,7 +59319,6 @@ public final class ContextOuterClass {
 
         private int configRuleCase_ = 0;
 
-        @SuppressWarnings("serial")
         private java.lang.Object configRule_;
 
         public enum ConfigRuleCase implements com.google.protobuf.Internal.EnumLite, com.google.protobuf.AbstractMessage.InternalOneOfEnum {
@@ -57034,7 +59365,7 @@ public final class ContextOuterClass {
 
         public static final int ACTION_FIELD_NUMBER = 1;
 
-        private int action_ = 0;
+        private int action_;
 
         /**
          * .context.ConfigActionEnum action = 1;
@@ -57051,7 +59382,8 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConfigActionEnum getAction() {
-            context.ContextOuterClass.ConfigActionEnum result = context.ContextOuterClass.ConfigActionEnum.forNumber(action_);
+            @SuppressWarnings("deprecation")
+            context.ContextOuterClass.ConfigActionEnum result = context.ContextOuterClass.ConfigActionEnum.valueOf(action_);
             return result == null ? context.ContextOuterClass.ConfigActionEnum.UNRECOGNIZED : result;
         }
 
@@ -57147,7 +59479,7 @@ public final class ContextOuterClass {
             if (configRuleCase_ == 3) {
                 output.writeMessage(3, (context.ContextOuterClass.ConfigRule_ACL) configRule_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -57165,7 +59497,7 @@ public final class ContextOuterClass {
             if (configRuleCase_ == 3) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, (context.ContextOuterClass.ConfigRule_ACL) configRule_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -57195,7 +59527,7 @@ public final class ContextOuterClass {
                 case 0:
                 default:
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -57221,7 +59553,7 @@ public final class ContextOuterClass {
                 case 0:
                 default:
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -57315,23 +59647,23 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.ConfigRule.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 action_ = 0;
-                if (customBuilder_ != null) {
-                    customBuilder_.clear();
-                }
-                if (aclBuilder_ != null) {
-                    aclBuilder_.clear();
-                }
                 configRuleCase_ = 0;
                 configRule_ = null;
                 return this;
@@ -57359,30 +59691,54 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.ConfigRule buildPartial() {
                 context.ContextOuterClass.ConfigRule result = new context.ContextOuterClass.ConfigRule(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                result.action_ = action_;
+                if (configRuleCase_ == 2) {
+                    if (customBuilder_ == null) {
+                        result.configRule_ = configRule_;
+                    } else {
+                        result.configRule_ = customBuilder_.build();
+                    }
                 }
-                buildPartialOneofs(result);
+                if (configRuleCase_ == 3) {
+                    if (aclBuilder_ == null) {
+                        result.configRule_ = configRule_;
+                    } else {
+                        result.configRule_ = aclBuilder_.build();
+                    }
+                }
+                result.configRuleCase_ = configRuleCase_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.ConfigRule result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.action_ = action_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
             }
 
-            private void buildPartialOneofs(context.ContextOuterClass.ConfigRule result) {
-                result.configRuleCase_ = configRuleCase_;
-                result.configRule_ = this.configRule_;
-                if (configRuleCase_ == 2 && customBuilder_ != null) {
-                    result.configRule_ = customBuilder_.build();
-                }
-                if (configRuleCase_ == 3 && aclBuilder_ != null) {
-                    result.configRule_ = aclBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -57417,7 +59773,7 @@ public final class ContextOuterClass {
                             break;
                         }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -57429,56 +59785,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.ConfigRule parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    action_ = input.readEnum();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            case 18:
-                                {
-                                    input.readMessage(getCustomFieldBuilder().getBuilder(), extensionRegistry);
-                                    configRuleCase_ = 2;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getAclFieldBuilder().getBuilder(), extensionRegistry);
-                                    configRuleCase_ = 3;
-                                    break;
-                                }
-                            // case 26
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.ConfigRule) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -57497,8 +59814,6 @@ public final class ContextOuterClass {
                 return this;
             }
 
-            private int bitField0_;
-
             private int action_ = 0;
 
             /**
@@ -57517,7 +59832,6 @@ public final class ContextOuterClass {
              */
             public Builder setActionValue(int value) {
                 action_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -57528,7 +59842,8 @@ public final class ContextOuterClass {
              */
             @java.lang.Override
             public context.ContextOuterClass.ConfigActionEnum getAction() {
-                context.ContextOuterClass.ConfigActionEnum result = context.ContextOuterClass.ConfigActionEnum.forNumber(action_);
+                @SuppressWarnings("deprecation")
+                context.ContextOuterClass.ConfigActionEnum result = context.ContextOuterClass.ConfigActionEnum.valueOf(action_);
                 return result == null ? context.ContextOuterClass.ConfigActionEnum.UNRECOGNIZED : result;
             }
 
@@ -57541,7 +59856,6 @@ public final class ContextOuterClass {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000001;
                 action_ = value.getNumber();
                 onChanged();
                 return this;
@@ -57552,7 +59866,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearAction() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 action_ = 0;
                 onChanged();
                 return this;
@@ -57633,9 +59946,8 @@ public final class ContextOuterClass {
                 } else {
                     if (configRuleCase_ == 2) {
                         customBuilder_.mergeFrom(value);
-                    } else {
-                        customBuilder_.setMessage(value);
                     }
+                    customBuilder_.setMessage(value);
                 }
                 configRuleCase_ = 2;
                 return this;
@@ -57696,6 +60008,7 @@ public final class ContextOuterClass {
                 }
                 configRuleCase_ = 2;
                 onChanged();
+                ;
                 return customBuilder_;
             }
 
@@ -57774,9 +60087,8 @@ public final class ContextOuterClass {
                 } else {
                     if (configRuleCase_ == 3) {
                         aclBuilder_.mergeFrom(value);
-                    } else {
-                        aclBuilder_.setMessage(value);
                     }
+                    aclBuilder_.setMessage(value);
                 }
                 configRuleCase_ = 3;
                 return this;
@@ -57837,6 +60149,7 @@ public final class ContextOuterClass {
                 }
                 configRuleCase_ = 3;
                 onChanged();
+                ;
                 return aclBuilder_;
             }
 
@@ -57867,17 +60180,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public ConfigRule parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new ConfigRule(input, extensionRegistry);
             }
         };
 
@@ -57948,6 +60251,56 @@ public final class ContextOuterClass {
             return new Constraint_Custom();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_Custom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                constraintType_ = s;
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                constraintValue_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_Custom_descriptor;
         }
@@ -57959,8 +60312,7 @@ public final class ContextOuterClass {
 
         public static final int CONSTRAINT_TYPE_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object constraintType_ = "";
+        private volatile java.lang.Object constraintType_;
 
         /**
          * string constraint_type = 1;
@@ -57997,8 +60349,7 @@ public final class ContextOuterClass {
 
         public static final int CONSTRAINT_VALUE_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object constraintValue_ = "";
+        private volatile java.lang.Object constraintValue_;
 
         /**
          * string constraint_value = 2;
@@ -58048,13 +60399,13 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(constraintType_)) {
+            if (!getConstraintTypeBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, constraintType_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(constraintValue_)) {
+            if (!getConstraintValueBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, constraintValue_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -58063,13 +60414,13 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(constraintType_)) {
+            if (!getConstraintTypeBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, constraintType_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(constraintValue_)) {
+            if (!getConstraintValueBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, constraintValue_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -58087,7 +60438,7 @@ public final class ContextOuterClass {
                 return false;
             if (!getConstraintValue().equals(other.getConstraintValue()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -58103,7 +60454,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + getConstraintType().hashCode();
             hash = (37 * hash) + CONSTRAINT_VALUE_FIELD_NUMBER;
             hash = (53 * hash) + getConstraintValue().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -58197,16 +60548,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_Custom.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 constraintType_ = "";
                 constraintValue_ = "";
                 return this;
@@ -58234,21 +60591,40 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_Custom buildPartial() {
                 context.ContextOuterClass.Constraint_Custom result = new context.ContextOuterClass.Constraint_Custom(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.constraintType_ = constraintType_;
+                result.constraintValue_ = constraintValue_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_Custom result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.constraintType_ = constraintType_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.constraintValue_ = constraintValue_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -58266,15 +60642,13 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getConstraintType().isEmpty()) {
                     constraintType_ = other.constraintType_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
                 if (!other.getConstraintValue().isEmpty()) {
                     constraintValue_ = other.constraintValue_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -58286,54 +60660,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_Custom parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    constraintType_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    constraintValue_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_Custom) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private java.lang.Object constraintType_ = "";
 
             /**
@@ -58377,7 +60717,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 constraintType_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -58388,7 +60727,6 @@ public final class ContextOuterClass {
              */
             public Builder clearConstraintType() {
                 constraintType_ = getDefaultInstance().getConstraintType();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -58404,7 +60742,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 constraintType_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -58452,7 +60789,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 constraintValue_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -58463,7 +60799,6 @@ public final class ContextOuterClass {
              */
             public Builder clearConstraintValue() {
                 constraintValue_ = getDefaultInstance().getConstraintValue();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -58479,7 +60814,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 constraintValue_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -58511,17 +60845,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_Custom parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_Custom(input, extensionRegistry);
             }
         };
 
@@ -58578,6 +60902,54 @@ public final class ContextOuterClass {
             return new Constraint_Schedule();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_Schedule(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 13:
+                            {
+                                startTimestamp_ = input.readFloat();
+                                break;
+                            }
+                        case 21:
+                            {
+                                durationDays_ = input.readFloat();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_Schedule_descriptor;
         }
@@ -58589,7 +60961,7 @@ public final class ContextOuterClass {
 
         public static final int START_TIMESTAMP_FIELD_NUMBER = 1;
 
-        private float startTimestamp_ = 0F;
+        private float startTimestamp_;
 
         /**
          * float start_timestamp = 1;
@@ -58602,7 +60974,7 @@ public final class ContextOuterClass {
 
         public static final int DURATION_DAYS_FIELD_NUMBER = 2;
 
-        private float durationDays_ = 0F;
+        private float durationDays_;
 
         /**
          * float duration_days = 2;
@@ -58628,13 +61000,13 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (java.lang.Float.floatToRawIntBits(startTimestamp_) != 0) {
+            if (startTimestamp_ != 0F) {
                 output.writeFloat(1, startTimestamp_);
             }
-            if (java.lang.Float.floatToRawIntBits(durationDays_) != 0) {
+            if (durationDays_ != 0F) {
                 output.writeFloat(2, durationDays_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -58643,13 +61015,13 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (java.lang.Float.floatToRawIntBits(startTimestamp_) != 0) {
+            if (startTimestamp_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, startTimestamp_);
             }
-            if (java.lang.Float.floatToRawIntBits(durationDays_) != 0) {
+            if (durationDays_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(2, durationDays_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -58667,7 +61039,7 @@ public final class ContextOuterClass {
                 return false;
             if (java.lang.Float.floatToIntBits(getDurationDays()) != java.lang.Float.floatToIntBits(other.getDurationDays()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -58683,7 +61055,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getStartTimestamp());
             hash = (37 * hash) + DURATION_DAYS_FIELD_NUMBER;
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getDurationDays());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -58777,16 +61149,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_Schedule.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 startTimestamp_ = 0F;
                 durationDays_ = 0F;
                 return this;
@@ -58814,21 +61192,40 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_Schedule buildPartial() {
                 context.ContextOuterClass.Constraint_Schedule result = new context.ContextOuterClass.Constraint_Schedule(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.startTimestamp_ = startTimestamp_;
+                result.durationDays_ = durationDays_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_Schedule result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.startTimestamp_ = startTimestamp_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.durationDays_ = durationDays_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -58850,7 +61247,7 @@ public final class ContextOuterClass {
                 if (other.getDurationDays() != 0F) {
                     setDurationDays(other.getDurationDays());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -58862,54 +61259,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_Schedule parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 13:
-                                {
-                                    startTimestamp_ = input.readFloat();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 13
-                            case 21:
-                                {
-                                    durationDays_ = input.readFloat();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 21
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_Schedule) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private float startTimestamp_;
 
             /**
@@ -58928,7 +61291,6 @@ public final class ContextOuterClass {
              */
             public Builder setStartTimestamp(float value) {
                 startTimestamp_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -58938,7 +61300,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearStartTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 startTimestamp_ = 0F;
                 onChanged();
                 return this;
@@ -58962,7 +61323,6 @@ public final class ContextOuterClass {
              */
             public Builder setDurationDays(float value) {
                 durationDays_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -58972,7 +61332,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearDurationDays() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 durationDays_ = 0F;
                 onChanged();
                 return this;
@@ -59005,17 +61364,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_Schedule parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_Schedule(input, extensionRegistry);
             }
         };
 
@@ -59072,6 +61421,54 @@ public final class ContextOuterClass {
             return new GPS_Position();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private GPS_Position(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 13:
+                            {
+                                latitude_ = input.readFloat();
+                                break;
+                            }
+                        case 21:
+                            {
+                                longitude_ = input.readFloat();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_GPS_Position_descriptor;
         }
@@ -59083,7 +61480,7 @@ public final class ContextOuterClass {
 
         public static final int LATITUDE_FIELD_NUMBER = 1;
 
-        private float latitude_ = 0F;
+        private float latitude_;
 
         /**
          * float latitude = 1;
@@ -59096,7 +61493,7 @@ public final class ContextOuterClass {
 
         public static final int LONGITUDE_FIELD_NUMBER = 2;
 
-        private float longitude_ = 0F;
+        private float longitude_;
 
         /**
          * float longitude = 2;
@@ -59122,13 +61519,13 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (java.lang.Float.floatToRawIntBits(latitude_) != 0) {
+            if (latitude_ != 0F) {
                 output.writeFloat(1, latitude_);
             }
-            if (java.lang.Float.floatToRawIntBits(longitude_) != 0) {
+            if (longitude_ != 0F) {
                 output.writeFloat(2, longitude_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -59137,13 +61534,13 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (java.lang.Float.floatToRawIntBits(latitude_) != 0) {
+            if (latitude_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, latitude_);
             }
-            if (java.lang.Float.floatToRawIntBits(longitude_) != 0) {
+            if (longitude_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(2, longitude_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -59161,7 +61558,7 @@ public final class ContextOuterClass {
                 return false;
             if (java.lang.Float.floatToIntBits(getLongitude()) != java.lang.Float.floatToIntBits(other.getLongitude()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -59177,7 +61574,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getLatitude());
             hash = (37 * hash) + LONGITUDE_FIELD_NUMBER;
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getLongitude());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -59271,16 +61668,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.GPS_Position.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 latitude_ = 0F;
                 longitude_ = 0F;
                 return this;
@@ -59308,21 +61711,40 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.GPS_Position buildPartial() {
                 context.ContextOuterClass.GPS_Position result = new context.ContextOuterClass.GPS_Position(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.latitude_ = latitude_;
+                result.longitude_ = longitude_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.GPS_Position result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.latitude_ = latitude_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.longitude_ = longitude_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -59344,7 +61766,7 @@ public final class ContextOuterClass {
                 if (other.getLongitude() != 0F) {
                     setLongitude(other.getLongitude());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -59356,54 +61778,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.GPS_Position parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 13:
-                                {
-                                    latitude_ = input.readFloat();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 13
-                            case 21:
-                                {
-                                    longitude_ = input.readFloat();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 21
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.GPS_Position) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private float latitude_;
 
             /**
@@ -59422,7 +61810,6 @@ public final class ContextOuterClass {
              */
             public Builder setLatitude(float value) {
                 latitude_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -59432,7 +61819,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearLatitude() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 latitude_ = 0F;
                 onChanged();
                 return this;
@@ -59456,7 +61842,6 @@ public final class ContextOuterClass {
              */
             public Builder setLongitude(float value) {
                 longitude_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -59466,7 +61851,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearLongitude() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 longitude_ = 0F;
                 onChanged();
                 return this;
@@ -59499,17 +61883,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public GPS_Position parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new GPS_Position(input, extensionRegistry);
             }
         };
 
@@ -59566,7 +61940,7 @@ public final class ContextOuterClass {
          */
         context.ContextOuterClass.GPS_PositionOrBuilder getGpsPositionOrBuilder();
 
-        context.ContextOuterClass.Location.LocationCase getLocationCase();
+        public context.ContextOuterClass.Location.LocationCase getLocationCase();
     }
 
     /**
@@ -59591,6 +61965,65 @@ public final class ContextOuterClass {
             return new Location();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Location(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                locationCase_ = 1;
+                                location_ = s;
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.GPS_Position.Builder subBuilder = null;
+                                if (locationCase_ == 2) {
+                                    subBuilder = ((context.ContextOuterClass.GPS_Position) location_).toBuilder();
+                                }
+                                location_ = input.readMessage(context.ContextOuterClass.GPS_Position.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.GPS_Position) location_);
+                                    location_ = subBuilder.buildPartial();
+                                }
+                                locationCase_ = 2;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Location_descriptor;
         }
@@ -59602,7 +62035,6 @@ public final class ContextOuterClass {
 
         private int locationCase_ = 0;
 
-        @SuppressWarnings("serial")
         private java.lang.Object location_;
 
         public enum LocationCase implements com.google.protobuf.Internal.EnumLite, com.google.protobuf.AbstractMessage.InternalOneOfEnum {
@@ -59753,7 +62185,7 @@ public final class ContextOuterClass {
             if (locationCase_ == 2) {
                 output.writeMessage(2, (context.ContextOuterClass.GPS_Position) location_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -59768,7 +62200,7 @@ public final class ContextOuterClass {
             if (locationCase_ == 2) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, (context.ContextOuterClass.GPS_Position) location_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -59796,7 +62228,7 @@ public final class ContextOuterClass {
                 case 0:
                 default:
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -59820,7 +62252,7 @@ public final class ContextOuterClass {
                 case 0:
                 default:
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -59914,19 +62346,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Location.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                if (gpsPositionBuilder_ != null) {
-                    gpsPositionBuilder_.clear();
-                }
                 locationCase_ = 0;
                 location_ = null;
                 return this;
@@ -59954,24 +62389,49 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Location buildPartial() {
                 context.ContextOuterClass.Location result = new context.ContextOuterClass.Location(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (locationCase_ == 1) {
+                    result.location_ = location_;
+                }
+                if (locationCase_ == 2) {
+                    if (gpsPositionBuilder_ == null) {
+                        result.location_ = location_;
+                    } else {
+                        result.location_ = gpsPositionBuilder_.build();
+                    }
                 }
-                buildPartialOneofs(result);
+                result.locationCase_ = locationCase_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Location result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
             }
 
-            private void buildPartialOneofs(context.ContextOuterClass.Location result) {
-                result.locationCase_ = locationCase_;
-                result.location_ = this.location_;
-                if (locationCase_ == 2 && gpsPositionBuilder_ != null) {
-                    result.location_ = gpsPositionBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -60005,7 +62465,7 @@ public final class ContextOuterClass {
                             break;
                         }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -60017,50 +62477,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Location parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    java.lang.String s = input.readStringRequireUtf8();
-                                    locationCase_ = 1;
-                                    location_ = s;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getGpsPositionFieldBuilder().getBuilder(), extensionRegistry);
-                                    locationCase_ = 2;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Location) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -60079,8 +62506,6 @@ public final class ContextOuterClass {
                 return this;
             }
 
-            private int bitField0_;
-
             /**
              * string region = 1;
              * @return Whether the region field is set.
@@ -60252,9 +62677,8 @@ public final class ContextOuterClass {
                 } else {
                     if (locationCase_ == 2) {
                         gpsPositionBuilder_.mergeFrom(value);
-                    } else {
-                        gpsPositionBuilder_.setMessage(value);
                     }
+                    gpsPositionBuilder_.setMessage(value);
                 }
                 locationCase_ = 2;
                 return this;
@@ -60315,6 +62739,7 @@ public final class ContextOuterClass {
                 }
                 locationCase_ = 2;
                 onChanged();
+                ;
                 return gpsPositionBuilder_;
             }
 
@@ -60345,17 +62770,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Location parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Location(input, extensionRegistry);
             }
         };
 
@@ -60434,6 +62849,70 @@ public final class ContextOuterClass {
             return new Constraint_EndPointLocation();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_EndPointLocation(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.EndPointId.Builder subBuilder = null;
+                                if (endpointId_ != null) {
+                                    subBuilder = endpointId_.toBuilder();
+                                }
+                                endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endpointId_);
+                                    endpointId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.Location.Builder subBuilder = null;
+                                if (location_ != null) {
+                                    subBuilder = location_.toBuilder();
+                                }
+                                location_ = input.readMessage(context.ContextOuterClass.Location.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(location_);
+                                    location_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_EndPointLocation_descriptor;
         }
@@ -60470,7 +62949,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+            return getEndpointId();
         }
 
         public static final int LOCATION_FIELD_NUMBER = 2;
@@ -60500,7 +62979,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.LocationOrBuilder getLocationOrBuilder() {
-            return location_ == null ? context.ContextOuterClass.Location.getDefaultInstance() : location_;
+            return getLocation();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -60524,7 +63003,7 @@ public final class ContextOuterClass {
             if (location_ != null) {
                 output.writeMessage(2, getLocation());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -60539,7 +63018,7 @@ public final class ContextOuterClass {
             if (location_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getLocation());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -60565,7 +63044,7 @@ public final class ContextOuterClass {
                 if (!getLocation().equals(other.getLocation()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -60585,7 +63064,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + LOCATION_FIELD_NUMBER;
                 hash = (53 * hash) + getLocation().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -60679,24 +63158,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_EndPointLocation.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
-                location_ = null;
-                if (locationBuilder_ != null) {
-                    locationBuilder_.dispose();
+                if (locationBuilder_ == null) {
+                    location_ = null;
+                } else {
+                    location_ = null;
                     locationBuilder_ = null;
                 }
                 return this;
@@ -60724,21 +63211,48 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_EndPointLocation buildPartial() {
                 context.ContextOuterClass.Constraint_EndPointLocation result = new context.ContextOuterClass.Constraint_EndPointLocation(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (endpointIdBuilder_ == null) {
+                    result.endpointId_ = endpointId_;
+                } else {
+                    result.endpointId_ = endpointIdBuilder_.build();
+                }
+                if (locationBuilder_ == null) {
+                    result.location_ = location_;
+                } else {
+                    result.location_ = locationBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_EndPointLocation result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.endpointId_ = endpointIdBuilder_ == null ? endpointId_ : endpointIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.location_ = locationBuilder_ == null ? location_ : locationBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -60760,7 +63274,7 @@ public final class ContextOuterClass {
                 if (other.hasLocation()) {
                     mergeLocation(other.getLocation());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -60772,54 +63286,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_EndPointLocation parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEndpointIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getLocationFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_EndPointLocation) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.EndPointId endpointId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 endpointIdBuilder_;
@@ -60829,7 +63309,7 @@ public final class ContextOuterClass {
              * @return Whether the endpointId field is set.
              */
             public boolean hasEndpointId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return endpointIdBuilder_ != null || endpointId_ != null;
             }
 
             /**
@@ -60853,11 +63333,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     endpointId_ = value;
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -60867,11 +63346,10 @@ public final class ContextOuterClass {
             public Builder setEndpointId(context.ContextOuterClass.EndPointId.Builder builderForValue) {
                 if (endpointIdBuilder_ == null) {
                     endpointId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -60880,16 +63358,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
                 if (endpointIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && endpointId_ != null && endpointId_ != context.ContextOuterClass.EndPointId.getDefaultInstance()) {
-                        getEndpointIdBuilder().mergeFrom(value);
+                    if (endpointId_ != null) {
+                        endpointId_ = context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
                     } else {
                         endpointId_ = value;
                     }
+                    onChanged();
                 } else {
                     endpointIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -60897,13 +63374,13 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public Builder clearEndpointId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                    onChanged();
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -60911,7 +63388,6 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEndpointIdFieldBuilder().getBuilder();
             }
@@ -60947,7 +63423,7 @@ public final class ContextOuterClass {
              * @return Whether the location field is set.
              */
             public boolean hasLocation() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return locationBuilder_ != null || location_ != null;
             }
 
             /**
@@ -60971,11 +63447,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     location_ = value;
+                    onChanged();
                 } else {
                     locationBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -60985,11 +63460,10 @@ public final class ContextOuterClass {
             public Builder setLocation(context.ContextOuterClass.Location.Builder builderForValue) {
                 if (locationBuilder_ == null) {
                     location_ = builderForValue.build();
+                    onChanged();
                 } else {
                     locationBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -60998,16 +63472,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeLocation(context.ContextOuterClass.Location value) {
                 if (locationBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && location_ != null && location_ != context.ContextOuterClass.Location.getDefaultInstance()) {
-                        getLocationBuilder().mergeFrom(value);
+                    if (location_ != null) {
+                        location_ = context.ContextOuterClass.Location.newBuilder(location_).mergeFrom(value).buildPartial();
                     } else {
                         location_ = value;
                     }
+                    onChanged();
                 } else {
                     locationBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -61015,13 +63488,13 @@ public final class ContextOuterClass {
              * .context.Location location = 2;
              */
             public Builder clearLocation() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                location_ = null;
-                if (locationBuilder_ != null) {
-                    locationBuilder_.dispose();
+                if (locationBuilder_ == null) {
+                    location_ = null;
+                    onChanged();
+                } else {
+                    location_ = null;
                     locationBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -61029,7 +63502,6 @@ public final class ContextOuterClass {
              * .context.Location location = 2;
              */
             public context.ContextOuterClass.Location.Builder getLocationBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getLocationFieldBuilder().getBuilder();
             }
@@ -61083,17 +63555,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_EndPointLocation parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_EndPointLocation(input, extensionRegistry);
             }
         };
 
@@ -61161,6 +63623,62 @@ public final class ContextOuterClass {
             return new Constraint_EndPointPriority();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_EndPointPriority(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.EndPointId.Builder subBuilder = null;
+                                if (endpointId_ != null) {
+                                    subBuilder = endpointId_.toBuilder();
+                                }
+                                endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endpointId_);
+                                    endpointId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 16:
+                            {
+                                priority_ = input.readUInt32();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_EndPointPriority_descriptor;
         }
@@ -61197,12 +63715,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+            return getEndpointId();
         }
 
         public static final int PRIORITY_FIELD_NUMBER = 2;
 
-        private int priority_ = 0;
+        private int priority_;
 
         /**
          * uint32 priority = 2;
@@ -61234,7 +63752,7 @@ public final class ContextOuterClass {
             if (priority_ != 0) {
                 output.writeUInt32(2, priority_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -61249,7 +63767,7 @@ public final class ContextOuterClass {
             if (priority_ != 0) {
                 size += com.google.protobuf.CodedOutputStream.computeUInt32Size(2, priority_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -61271,7 +63789,7 @@ public final class ContextOuterClass {
             }
             if (getPriority() != other.getPriority())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -61289,7 +63807,7 @@ public final class ContextOuterClass {
             }
             hash = (37 * hash) + PRIORITY_FIELD_NUMBER;
             hash = (53 * hash) + getPriority();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -61383,19 +63901,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_EndPointPriority.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
                 priority_ = 0;
@@ -61424,21 +63949,44 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_EndPointPriority buildPartial() {
                 context.ContextOuterClass.Constraint_EndPointPriority result = new context.ContextOuterClass.Constraint_EndPointPriority(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (endpointIdBuilder_ == null) {
+                    result.endpointId_ = endpointId_;
+                } else {
+                    result.endpointId_ = endpointIdBuilder_.build();
                 }
+                result.priority_ = priority_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_EndPointPriority result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.endpointId_ = endpointIdBuilder_ == null ? endpointId_ : endpointIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.priority_ = priority_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -61460,7 +64008,7 @@ public final class ContextOuterClass {
                 if (other.getPriority() != 0) {
                     setPriority(other.getPriority());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -61472,54 +64020,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_EndPointPriority parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getEndpointIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 16:
-                                {
-                                    priority_ = input.readUInt32();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_EndPointPriority) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.EndPointId endpointId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 endpointIdBuilder_;
@@ -61529,7 +64043,7 @@ public final class ContextOuterClass {
              * @return Whether the endpointId field is set.
              */
             public boolean hasEndpointId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return endpointIdBuilder_ != null || endpointId_ != null;
             }
 
             /**
@@ -61553,11 +64067,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     endpointId_ = value;
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -61567,11 +64080,10 @@ public final class ContextOuterClass {
             public Builder setEndpointId(context.ContextOuterClass.EndPointId.Builder builderForValue) {
                 if (endpointIdBuilder_ == null) {
                     endpointId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endpointIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -61580,16 +64092,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
                 if (endpointIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && endpointId_ != null && endpointId_ != context.ContextOuterClass.EndPointId.getDefaultInstance()) {
-                        getEndpointIdBuilder().mergeFrom(value);
+                    if (endpointId_ != null) {
+                        endpointId_ = context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
                     } else {
                         endpointId_ = value;
                     }
+                    onChanged();
                 } else {
                     endpointIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -61597,13 +64108,13 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public Builder clearEndpointId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                endpointId_ = null;
-                if (endpointIdBuilder_ != null) {
-                    endpointIdBuilder_.dispose();
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = null;
+                    onChanged();
+                } else {
+                    endpointId_ = null;
                     endpointIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -61611,7 +64122,6 @@ public final class ContextOuterClass {
              * .context.EndPointId endpoint_id = 1;
              */
             public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getEndpointIdFieldBuilder().getBuilder();
             }
@@ -61656,7 +64166,6 @@ public final class ContextOuterClass {
              */
             public Builder setPriority(int value) {
                 priority_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -61666,7 +64175,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearPriority() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 priority_ = 0;
                 onChanged();
                 return this;
@@ -61699,17 +64207,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_EndPointPriority parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_EndPointPriority(input, extensionRegistry);
             }
         };
 
@@ -61760,6 +64258,49 @@ public final class ContextOuterClass {
             return new Constraint_SLA_Latency();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_SLA_Latency(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 13:
+                            {
+                                e2ELatencyMs_ = input.readFloat();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_SLA_Latency_descriptor;
         }
@@ -61771,7 +64312,7 @@ public final class ContextOuterClass {
 
         public static final int E2E_LATENCY_MS_FIELD_NUMBER = 1;
 
-        private float e2ELatencyMs_ = 0F;
+        private float e2ELatencyMs_;
 
         /**
          * float e2e_latency_ms = 1;
@@ -61797,10 +64338,10 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (java.lang.Float.floatToRawIntBits(e2ELatencyMs_) != 0) {
+            if (e2ELatencyMs_ != 0F) {
                 output.writeFloat(1, e2ELatencyMs_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -61809,10 +64350,10 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (java.lang.Float.floatToRawIntBits(e2ELatencyMs_) != 0) {
+            if (e2ELatencyMs_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, e2ELatencyMs_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -61828,7 +64369,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.Constraint_SLA_Latency other = (context.ContextOuterClass.Constraint_SLA_Latency) obj;
             if (java.lang.Float.floatToIntBits(getE2ELatencyMs()) != java.lang.Float.floatToIntBits(other.getE2ELatencyMs()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -61842,7 +64383,7 @@ public final class ContextOuterClass {
             hash = (19 * hash) + getDescriptor().hashCode();
             hash = (37 * hash) + E2E_LATENCY_MS_FIELD_NUMBER;
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getE2ELatencyMs());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -61936,16 +64477,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_SLA_Latency.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 e2ELatencyMs_ = 0F;
                 return this;
             }
@@ -61972,18 +64519,39 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_SLA_Latency buildPartial() {
                 context.ContextOuterClass.Constraint_SLA_Latency result = new context.ContextOuterClass.Constraint_SLA_Latency(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.e2ELatencyMs_ = e2ELatencyMs_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_SLA_Latency result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.e2ELatencyMs_ = e2ELatencyMs_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -62002,7 +64570,7 @@ public final class ContextOuterClass {
                 if (other.getE2ELatencyMs() != 0F) {
                     setE2ELatencyMs(other.getE2ELatencyMs());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -62014,47 +64582,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_SLA_Latency parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 13:
-                                {
-                                    e2ELatencyMs_ = input.readFloat();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 13
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_SLA_Latency) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private float e2ELatencyMs_;
 
             /**
@@ -62073,7 +64614,6 @@ public final class ContextOuterClass {
              */
             public Builder setE2ELatencyMs(float value) {
                 e2ELatencyMs_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -62083,7 +64623,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearE2ELatencyMs() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 e2ELatencyMs_ = 0F;
                 onChanged();
                 return this;
@@ -62116,17 +64655,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_SLA_Latency parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_SLA_Latency(input, extensionRegistry);
             }
         };
 
@@ -62177,6 +64706,49 @@ public final class ContextOuterClass {
             return new Constraint_SLA_Capacity();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_SLA_Capacity(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 13:
+                            {
+                                capacityGbps_ = input.readFloat();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_SLA_Capacity_descriptor;
         }
@@ -62188,7 +64760,7 @@ public final class ContextOuterClass {
 
         public static final int CAPACITY_GBPS_FIELD_NUMBER = 1;
 
-        private float capacityGbps_ = 0F;
+        private float capacityGbps_;
 
         /**
          * float capacity_gbps = 1;
@@ -62214,10 +64786,10 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (java.lang.Float.floatToRawIntBits(capacityGbps_) != 0) {
+            if (capacityGbps_ != 0F) {
                 output.writeFloat(1, capacityGbps_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -62226,10 +64798,10 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (java.lang.Float.floatToRawIntBits(capacityGbps_) != 0) {
+            if (capacityGbps_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, capacityGbps_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -62245,7 +64817,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.Constraint_SLA_Capacity other = (context.ContextOuterClass.Constraint_SLA_Capacity) obj;
             if (java.lang.Float.floatToIntBits(getCapacityGbps()) != java.lang.Float.floatToIntBits(other.getCapacityGbps()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -62259,7 +64831,7 @@ public final class ContextOuterClass {
             hash = (19 * hash) + getDescriptor().hashCode();
             hash = (37 * hash) + CAPACITY_GBPS_FIELD_NUMBER;
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getCapacityGbps());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -62353,16 +64925,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_SLA_Capacity.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 capacityGbps_ = 0F;
                 return this;
             }
@@ -62389,18 +64967,39 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_SLA_Capacity buildPartial() {
                 context.ContextOuterClass.Constraint_SLA_Capacity result = new context.ContextOuterClass.Constraint_SLA_Capacity(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.capacityGbps_ = capacityGbps_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_SLA_Capacity result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.capacityGbps_ = capacityGbps_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -62419,7 +65018,7 @@ public final class ContextOuterClass {
                 if (other.getCapacityGbps() != 0F) {
                     setCapacityGbps(other.getCapacityGbps());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -62431,47 +65030,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_SLA_Capacity parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 13:
-                                {
-                                    capacityGbps_ = input.readFloat();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 13
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_SLA_Capacity) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private float capacityGbps_;
 
             /**
@@ -62490,7 +65062,6 @@ public final class ContextOuterClass {
              */
             public Builder setCapacityGbps(float value) {
                 capacityGbps_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -62500,7 +65071,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearCapacityGbps() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 capacityGbps_ = 0F;
                 onChanged();
                 return this;
@@ -62533,17 +65103,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_SLA_Capacity parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_SLA_Capacity(input, extensionRegistry);
             }
         };
 
@@ -62610,6 +65170,59 @@ public final class ContextOuterClass {
             return new Constraint_SLA_Availability();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_SLA_Availability(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                numDisjointPaths_ = input.readUInt32();
+                                break;
+                            }
+                        case 16:
+                            {
+                                allActive_ = input.readBool();
+                                break;
+                            }
+                        case 29:
+                            {
+                                availability_ = input.readFloat();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_SLA_Availability_descriptor;
         }
@@ -62621,7 +65234,7 @@ public final class ContextOuterClass {
 
         public static final int NUM_DISJOINT_PATHS_FIELD_NUMBER = 1;
 
-        private int numDisjointPaths_ = 0;
+        private int numDisjointPaths_;
 
         /**
          * uint32 num_disjoint_paths = 1;
@@ -62634,7 +65247,7 @@ public final class ContextOuterClass {
 
         public static final int ALL_ACTIVE_FIELD_NUMBER = 2;
 
-        private boolean allActive_ = false;
+        private boolean allActive_;
 
         /**
          * bool all_active = 2;
@@ -62647,7 +65260,7 @@ public final class ContextOuterClass {
 
         public static final int AVAILABILITY_FIELD_NUMBER = 3;
 
-        private float availability_ = 0F;
+        private float availability_;
 
         /**
          * 
@@ -62683,10 +65296,10 @@ public final class ContextOuterClass {
             if (allActive_ != false) {
                 output.writeBool(2, allActive_);
             }
-            if (java.lang.Float.floatToRawIntBits(availability_) != 0) {
+            if (availability_ != 0F) {
                 output.writeFloat(3, availability_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -62701,10 +65314,10 @@ public final class ContextOuterClass {
             if (allActive_ != false) {
                 size += com.google.protobuf.CodedOutputStream.computeBoolSize(2, allActive_);
             }
-            if (java.lang.Float.floatToRawIntBits(availability_) != 0) {
+            if (availability_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(3, availability_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -62724,7 +65337,7 @@ public final class ContextOuterClass {
                 return false;
             if (java.lang.Float.floatToIntBits(getAvailability()) != java.lang.Float.floatToIntBits(other.getAvailability()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -62742,7 +65355,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getAllActive());
             hash = (37 * hash) + AVAILABILITY_FIELD_NUMBER;
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getAvailability());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -62836,16 +65449,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_SLA_Availability.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 numDisjointPaths_ = 0;
                 allActive_ = false;
                 availability_ = 0F;
@@ -62874,24 +65493,41 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_SLA_Availability buildPartial() {
                 context.ContextOuterClass.Constraint_SLA_Availability result = new context.ContextOuterClass.Constraint_SLA_Availability(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.numDisjointPaths_ = numDisjointPaths_;
+                result.allActive_ = allActive_;
+                result.availability_ = availability_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_SLA_Availability result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.numDisjointPaths_ = numDisjointPaths_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.allActive_ = allActive_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.availability_ = availability_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -62916,7 +65552,7 @@ public final class ContextOuterClass {
                 if (other.getAvailability() != 0F) {
                     setAvailability(other.getAvailability());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -62928,61 +65564,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_SLA_Availability parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    numDisjointPaths_ = input.readUInt32();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            case 16:
-                                {
-                                    allActive_ = input.readBool();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            case 29:
-                                {
-                                    availability_ = input.readFloat();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 29
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_SLA_Availability) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private int numDisjointPaths_;
 
             /**
@@ -63001,7 +65596,6 @@ public final class ContextOuterClass {
              */
             public Builder setNumDisjointPaths(int value) {
                 numDisjointPaths_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -63011,7 +65605,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearNumDisjointPaths() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 numDisjointPaths_ = 0;
                 onChanged();
                 return this;
@@ -63035,7 +65628,6 @@ public final class ContextOuterClass {
              */
             public Builder setAllActive(boolean value) {
                 allActive_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -63045,7 +65637,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearAllActive() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 allActive_ = false;
                 onChanged();
                 return this;
@@ -63077,7 +65668,6 @@ public final class ContextOuterClass {
              */
             public Builder setAvailability(float value) {
                 availability_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -63091,7 +65681,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearAvailability() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 availability_ = 0F;
                 onChanged();
                 return this;
@@ -63124,17 +65713,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_SLA_Availability parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_SLA_Availability(input, extensionRegistry);
             }
         };
 
@@ -63212,6 +65791,73 @@ public final class ContextOuterClass {
             return new Constraint_SLA_Isolation_level();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_SLA_Isolation_level(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                int rawValue = input.readEnum();
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    isolationLevel_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                isolationLevel_.add(rawValue);
+                                break;
+                            }
+                        case 10:
+                            {
+                                int length = input.readRawVarint32();
+                                int oldLimit = input.pushLimit(length);
+                                while (input.getBytesUntilLimit() > 0) {
+                                    int rawValue = input.readEnum();
+                                    if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                        isolationLevel_ = new java.util.ArrayList();
+                                        mutable_bitField0_ |= 0x00000001;
+                                    }
+                                    isolationLevel_.add(rawValue);
+                                }
+                                input.popLimit(oldLimit);
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    isolationLevel_ = java.util.Collections.unmodifiableList(isolationLevel_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_SLA_Isolation_level_descriptor;
         }
@@ -63223,13 +65869,13 @@ public final class ContextOuterClass {
 
         public static final int ISOLATION_LEVEL_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List isolationLevel_;
 
         private static final com.google.protobuf.Internal.ListAdapter.Converter isolationLevel_converter_ = new com.google.protobuf.Internal.ListAdapter.Converter() {
 
             public context.ContextOuterClass.IsolationLevelEnum convert(java.lang.Integer from) {
-                context.ContextOuterClass.IsolationLevelEnum result = context.ContextOuterClass.IsolationLevelEnum.forNumber(from);
+                @SuppressWarnings("deprecation")
+                context.ContextOuterClass.IsolationLevelEnum result = context.ContextOuterClass.IsolationLevelEnum.valueOf(from);
                 return result == null ? context.ContextOuterClass.IsolationLevelEnum.UNRECOGNIZED : result;
             }
         };
@@ -63306,7 +65952,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < isolationLevel_.size(); i++) {
                 output.writeEnumNoTag(isolationLevel_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -63327,7 +65973,7 @@ public final class ContextOuterClass {
                 }
                 isolationLevelMemoizedSerializedSize = dataSize;
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -63343,7 +65989,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.Constraint_SLA_Isolation_level other = (context.ContextOuterClass.Constraint_SLA_Isolation_level) obj;
             if (!isolationLevel_.equals(other.isolationLevel_))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -63359,7 +66005,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + ISOLATION_LEVEL_FIELD_NUMBER;
                 hash = (53 * hash) + isolationLevel_.hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -63453,16 +66099,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_SLA_Isolation_level.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 isolationLevel_ = java.util.Collections.emptyList();
                 bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
@@ -63490,24 +66142,44 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_SLA_Isolation_level buildPartial() {
                 context.ContextOuterClass.Constraint_SLA_Isolation_level result = new context.ContextOuterClass.Constraint_SLA_Isolation_level(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Constraint_SLA_Isolation_level result) {
+                int from_bitField0_ = bitField0_;
                 if (((bitField0_ & 0x00000001) != 0)) {
                     isolationLevel_ = java.util.Collections.unmodifiableList(isolationLevel_);
                     bitField0_ = (bitField0_ & ~0x00000001);
                 }
                 result.isolationLevel_ = isolationLevel_;
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_SLA_Isolation_level result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -63533,7 +66205,7 @@ public final class ContextOuterClass {
                     }
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -63545,56 +66217,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_SLA_Isolation_level parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    int tmpRaw = input.readEnum();
-                                    ensureIsolationLevelIsMutable();
-                                    isolationLevel_.add(tmpRaw);
-                                    break;
-                                }
-                            // case 8
-                            case 10:
-                                {
-                                    int length = input.readRawVarint32();
-                                    int oldLimit = input.pushLimit(length);
-                                    while (input.getBytesUntilLimit() > 0) {
-                                        int tmpRaw = input.readEnum();
-                                        ensureIsolationLevelIsMutable();
-                                        isolationLevel_.add(tmpRaw);
-                                    }
-                                    input.popLimit(oldLimit);
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_SLA_Isolation_level) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -63709,8 +66342,8 @@ public final class ContextOuterClass {
 
             /**
              * repeated .context.IsolationLevelEnum isolation_level = 1;
-             * @param index The index to set the value at.
-             * @param value The enum numeric value on the wire for isolationLevel to set.
+             * @param index The index of the value to return.
+             * @return The enum numeric value on the wire of isolationLevel at the given index.
              * @return This builder for chaining.
              */
             public Builder setIsolationLevelValue(int index, int value) {
@@ -63773,17 +66406,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_SLA_Isolation_level parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_SLA_Isolation_level(input, extensionRegistry);
             }
         };
 
@@ -63912,6 +66535,86 @@ public final class ContextOuterClass {
             return new Constraint_Exclusions();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint_Exclusions(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                isPermanent_ = input.readBool();
+                                break;
+                            }
+                        case 18:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    deviceIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                deviceIds_.add(input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 26:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                                    endpointIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                endpointIds_.add(input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 34:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000004) != 0)) {
+                                    linkIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000004;
+                                }
+                                linkIds_.add(input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    deviceIds_ = java.util.Collections.unmodifiableList(deviceIds_);
+                }
+                if (((mutable_bitField0_ & 0x00000002) != 0)) {
+                    endpointIds_ = java.util.Collections.unmodifiableList(endpointIds_);
+                }
+                if (((mutable_bitField0_ & 0x00000004) != 0)) {
+                    linkIds_ = java.util.Collections.unmodifiableList(linkIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_Exclusions_descriptor;
         }
@@ -63923,7 +66626,7 @@ public final class ContextOuterClass {
 
         public static final int IS_PERMANENT_FIELD_NUMBER = 1;
 
-        private boolean isPermanent_ = false;
+        private boolean isPermanent_;
 
         /**
          * bool is_permanent = 1;
@@ -63936,7 +66639,6 @@ public final class ContextOuterClass {
 
         public static final int DEVICE_IDS_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
         private java.util.List deviceIds_;
 
         /**
@@ -63981,7 +66683,6 @@ public final class ContextOuterClass {
 
         public static final int ENDPOINT_IDS_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
         private java.util.List endpointIds_;
 
         /**
@@ -64026,7 +66727,6 @@ public final class ContextOuterClass {
 
         public static final int LINK_IDS_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
         private java.util.List linkIds_;
 
         /**
@@ -64096,7 +66796,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < linkIds_.size(); i++) {
                 output.writeMessage(4, linkIds_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -64117,7 +66817,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < linkIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, linkIds_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -64139,7 +66839,7 @@ public final class ContextOuterClass {
                 return false;
             if (!getLinkIdsList().equals(other.getLinkIdsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -64165,7 +66865,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + LINK_IDS_FIELD_NUMBER;
                 hash = (53 * hash) + getLinkIdsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -64259,38 +66959,44 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint_Exclusions.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getDeviceIdsFieldBuilder();
+                    getEndpointIdsFieldBuilder();
+                    getLinkIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 isPermanent_ = false;
                 if (deviceIdsBuilder_ == null) {
                     deviceIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    deviceIds_ = null;
                     deviceIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000002);
                 if (endpointIdsBuilder_ == null) {
                     endpointIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
                 } else {
-                    endpointIds_ = null;
                     endpointIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000004);
                 if (linkIdsBuilder_ == null) {
                     linkIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000004);
                 } else {
-                    linkIds_ = null;
                     linkIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000008);
                 return this;
             }
 
@@ -64316,49 +67022,67 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint_Exclusions buildPartial() {
                 context.ContextOuterClass.Constraint_Exclusions result = new context.ContextOuterClass.Constraint_Exclusions(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Constraint_Exclusions result) {
+                int from_bitField0_ = bitField0_;
+                result.isPermanent_ = isPermanent_;
                 if (deviceIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         deviceIds_ = java.util.Collections.unmodifiableList(deviceIds_);
-                        bitField0_ = (bitField0_ & ~0x00000002);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.deviceIds_ = deviceIds_;
                 } else {
                     result.deviceIds_ = deviceIdsBuilder_.build();
                 }
                 if (endpointIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0)) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
                         endpointIds_ = java.util.Collections.unmodifiableList(endpointIds_);
-                        bitField0_ = (bitField0_ & ~0x00000004);
+                        bitField0_ = (bitField0_ & ~0x00000002);
                     }
                     result.endpointIds_ = endpointIds_;
                 } else {
                     result.endpointIds_ = endpointIdsBuilder_.build();
                 }
                 if (linkIdsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0)) {
+                    if (((bitField0_ & 0x00000004) != 0)) {
                         linkIds_ = java.util.Collections.unmodifiableList(linkIds_);
-                        bitField0_ = (bitField0_ & ~0x00000008);
+                        bitField0_ = (bitField0_ & ~0x00000004);
                     }
                     result.linkIds_ = linkIds_;
                 } else {
                     result.linkIds_ = linkIdsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Constraint_Exclusions result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.isPermanent_ = isPermanent_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -64381,7 +67105,7 @@ public final class ContextOuterClass {
                     if (!other.deviceIds_.isEmpty()) {
                         if (deviceIds_.isEmpty()) {
                             deviceIds_ = other.deviceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000002);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureDeviceIdsIsMutable();
                             deviceIds_.addAll(other.deviceIds_);
@@ -64394,7 +67118,7 @@ public final class ContextOuterClass {
                             deviceIdsBuilder_.dispose();
                             deviceIdsBuilder_ = null;
                             deviceIds_ = other.deviceIds_;
-                            bitField0_ = (bitField0_ & ~0x00000002);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             deviceIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getDeviceIdsFieldBuilder() : null;
                         } else {
                             deviceIdsBuilder_.addAllMessages(other.deviceIds_);
@@ -64405,7 +67129,7 @@ public final class ContextOuterClass {
                     if (!other.endpointIds_.isEmpty()) {
                         if (endpointIds_.isEmpty()) {
                             endpointIds_ = other.endpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                         } else {
                             ensureEndpointIdsIsMutable();
                             endpointIds_.addAll(other.endpointIds_);
@@ -64418,7 +67142,7 @@ public final class ContextOuterClass {
                             endpointIdsBuilder_.dispose();
                             endpointIdsBuilder_ = null;
                             endpointIds_ = other.endpointIds_;
-                            bitField0_ = (bitField0_ & ~0x00000004);
+                            bitField0_ = (bitField0_ & ~0x00000002);
                             endpointIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getEndpointIdsFieldBuilder() : null;
                         } else {
                             endpointIdsBuilder_.addAllMessages(other.endpointIds_);
@@ -64429,7 +67153,7 @@ public final class ContextOuterClass {
                     if (!other.linkIds_.isEmpty()) {
                         if (linkIds_.isEmpty()) {
                             linkIds_ = other.linkIds_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000004);
                         } else {
                             ensureLinkIdsIsMutable();
                             linkIds_.addAll(other.linkIds_);
@@ -64442,14 +67166,14 @@ public final class ContextOuterClass {
                             linkIdsBuilder_.dispose();
                             linkIdsBuilder_ = null;
                             linkIds_ = other.linkIds_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000004);
                             linkIdsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getLinkIdsFieldBuilder() : null;
                         } else {
                             linkIdsBuilder_.addAllMessages(other.linkIds_);
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -64461,78 +67185,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint_Exclusions parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    isPermanent_ = input.readBool();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            case 18:
-                                {
-                                    context.ContextOuterClass.DeviceId m = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
-                                    if (deviceIdsBuilder_ == null) {
-                                        ensureDeviceIdsIsMutable();
-                                        deviceIds_.add(m);
-                                    } else {
-                                        deviceIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    context.ContextOuterClass.EndPointId m = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-                                    if (endpointIdsBuilder_ == null) {
-                                        ensureEndpointIdsIsMutable();
-                                        endpointIds_.add(m);
-                                    } else {
-                                        endpointIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    context.ContextOuterClass.LinkId m = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry);
-                                    if (linkIdsBuilder_ == null) {
-                                        ensureLinkIdsIsMutable();
-                                        linkIds_.add(m);
-                                    } else {
-                                        linkIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 34
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint_Exclusions) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -64556,7 +67219,6 @@ public final class ContextOuterClass {
              */
             public Builder setIsPermanent(boolean value) {
                 isPermanent_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -64566,7 +67228,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearIsPermanent() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 isPermanent_ = false;
                 onChanged();
                 return this;
@@ -64575,9 +67236,9 @@ public final class ContextOuterClass {
             private java.util.List deviceIds_ = java.util.Collections.emptyList();
 
             private void ensureDeviceIdsIsMutable() {
-                if (!((bitField0_ & 0x00000002) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     deviceIds_ = new java.util.ArrayList(deviceIds_);
-                    bitField0_ |= 0x00000002;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -64729,7 +67390,7 @@ public final class ContextOuterClass {
             public Builder clearDeviceIds() {
                 if (deviceIdsBuilder_ == null) {
                     deviceIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000002);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     deviceIdsBuilder_.clear();
@@ -64803,7 +67464,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getDeviceIdsFieldBuilder() {
                 if (deviceIdsBuilder_ == null) {
-                    deviceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(deviceIds_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
+                    deviceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(deviceIds_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     deviceIds_ = null;
                 }
                 return deviceIdsBuilder_;
@@ -64812,9 +67473,9 @@ public final class ContextOuterClass {
             private java.util.List endpointIds_ = java.util.Collections.emptyList();
 
             private void ensureEndpointIdsIsMutable() {
-                if (!((bitField0_ & 0x00000004) != 0)) {
+                if (!((bitField0_ & 0x00000002) != 0)) {
                     endpointIds_ = new java.util.ArrayList(endpointIds_);
-                    bitField0_ |= 0x00000004;
+                    bitField0_ |= 0x00000002;
                 }
             }
 
@@ -64966,7 +67627,7 @@ public final class ContextOuterClass {
             public Builder clearEndpointIds() {
                 if (endpointIdsBuilder_ == null) {
                     endpointIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000004);
+                    bitField0_ = (bitField0_ & ~0x00000002);
                     onChanged();
                 } else {
                     endpointIdsBuilder_.clear();
@@ -65040,7 +67701,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getEndpointIdsFieldBuilder() {
                 if (endpointIdsBuilder_ == null) {
-                    endpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(endpointIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
+                    endpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(endpointIds_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
                     endpointIds_ = null;
                 }
                 return endpointIdsBuilder_;
@@ -65049,9 +67710,9 @@ public final class ContextOuterClass {
             private java.util.List linkIds_ = java.util.Collections.emptyList();
 
             private void ensureLinkIdsIsMutable() {
-                if (!((bitField0_ & 0x00000008) != 0)) {
+                if (!((bitField0_ & 0x00000004) != 0)) {
                     linkIds_ = new java.util.ArrayList(linkIds_);
-                    bitField0_ |= 0x00000008;
+                    bitField0_ |= 0x00000004;
                 }
             }
 
@@ -65203,7 +67864,7 @@ public final class ContextOuterClass {
             public Builder clearLinkIds() {
                 if (linkIdsBuilder_ == null) {
                     linkIds_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000008);
+                    bitField0_ = (bitField0_ & ~0x00000004);
                     onChanged();
                 } else {
                     linkIdsBuilder_.clear();
@@ -65277,7 +67938,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getLinkIdsFieldBuilder() {
                 if (linkIdsBuilder_ == null) {
-                    linkIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(linkIds_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean());
+                    linkIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(linkIds_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean());
                     linkIds_ = null;
                 }
                 return linkIdsBuilder_;
@@ -65310,17 +67971,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint_Exclusions parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint_Exclusions(input, extensionRegistry);
             }
         };
 
@@ -65507,7 +68158,7 @@ public final class ContextOuterClass {
          */
         context.ContextOuterClass.Constraint_ExclusionsOrBuilder getExclusionsOrBuilder();
 
-        context.ContextOuterClass.Constraint.ConstraintCase getConstraintCase();
+        public context.ContextOuterClass.Constraint.ConstraintCase getConstraintCase();
     }
 
     /**
@@ -65533,6 +68184,176 @@ public final class ContextOuterClass {
             return new Constraint();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Constraint(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                int rawValue = input.readEnum();
+                                action_ = rawValue;
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.Constraint_Custom.Builder subBuilder = null;
+                                if (constraintCase_ == 2) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_Custom) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_Custom.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_Custom) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 2;
+                                break;
+                            }
+                        case 26:
+                            {
+                                context.ContextOuterClass.Constraint_Schedule.Builder subBuilder = null;
+                                if (constraintCase_ == 3) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_Schedule) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_Schedule.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_Schedule) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 3;
+                                break;
+                            }
+                        case 34:
+                            {
+                                context.ContextOuterClass.Constraint_EndPointLocation.Builder subBuilder = null;
+                                if (constraintCase_ == 4) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_EndPointLocation) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_EndPointLocation.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_EndPointLocation) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 4;
+                                break;
+                            }
+                        case 42:
+                            {
+                                context.ContextOuterClass.Constraint_EndPointPriority.Builder subBuilder = null;
+                                if (constraintCase_ == 5) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_EndPointPriority) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_EndPointPriority.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_EndPointPriority) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 5;
+                                break;
+                            }
+                        case 50:
+                            {
+                                context.ContextOuterClass.Constraint_SLA_Capacity.Builder subBuilder = null;
+                                if (constraintCase_ == 6) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_SLA_Capacity) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_SLA_Capacity.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_SLA_Capacity) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 6;
+                                break;
+                            }
+                        case 58:
+                            {
+                                context.ContextOuterClass.Constraint_SLA_Latency.Builder subBuilder = null;
+                                if (constraintCase_ == 7) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_SLA_Latency) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_SLA_Latency.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_SLA_Latency) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 7;
+                                break;
+                            }
+                        case 66:
+                            {
+                                context.ContextOuterClass.Constraint_SLA_Availability.Builder subBuilder = null;
+                                if (constraintCase_ == 8) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_SLA_Availability) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_SLA_Availability.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_SLA_Availability) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 8;
+                                break;
+                            }
+                        case 74:
+                            {
+                                context.ContextOuterClass.Constraint_SLA_Isolation_level.Builder subBuilder = null;
+                                if (constraintCase_ == 9) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_SLA_Isolation_level.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 9;
+                                break;
+                            }
+                        case 82:
+                            {
+                                context.ContextOuterClass.Constraint_Exclusions.Builder subBuilder = null;
+                                if (constraintCase_ == 10) {
+                                    subBuilder = ((context.ContextOuterClass.Constraint_Exclusions) constraint_).toBuilder();
+                                }
+                                constraint_ = input.readMessage(context.ContextOuterClass.Constraint_Exclusions.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom((context.ContextOuterClass.Constraint_Exclusions) constraint_);
+                                    constraint_ = subBuilder.buildPartial();
+                                }
+                                constraintCase_ = 10;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Constraint_descriptor;
         }
@@ -65544,7 +68365,6 @@ public final class ContextOuterClass {
 
         private int constraintCase_ = 0;
 
-        @SuppressWarnings("serial")
         private java.lang.Object constraint_;
 
         public enum ConstraintCase implements com.google.protobuf.Internal.EnumLite, com.google.protobuf.AbstractMessage.InternalOneOfEnum {
@@ -65614,7 +68434,7 @@ public final class ContextOuterClass {
 
         public static final int ACTION_FIELD_NUMBER = 1;
 
-        private int action_ = 0;
+        private int action_;
 
         /**
          * .context.ConstraintActionEnum action = 1;
@@ -65631,7 +68451,8 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ConstraintActionEnum getAction() {
-            context.ContextOuterClass.ConstraintActionEnum result = context.ContextOuterClass.ConstraintActionEnum.forNumber(action_);
+            @SuppressWarnings("deprecation")
+            context.ContextOuterClass.ConstraintActionEnum result = context.ContextOuterClass.ConstraintActionEnum.valueOf(action_);
             return result == null ? context.ContextOuterClass.ConstraintActionEnum.UNRECOGNIZED : result;
         }
 
@@ -65986,7 +68807,7 @@ public final class ContextOuterClass {
             if (constraintCase_ == 10) {
                 output.writeMessage(10, (context.ContextOuterClass.Constraint_Exclusions) constraint_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -66025,7 +68846,7 @@ public final class ContextOuterClass {
             if (constraintCase_ == 10) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(10, (context.ContextOuterClass.Constraint_Exclusions) constraint_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -66083,7 +68904,7 @@ public final class ContextOuterClass {
                 case 0:
                 default:
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -66137,7 +68958,7 @@ public final class ContextOuterClass {
                 case 0:
                 default:
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -66231,44 +69052,23 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Constraint.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 action_ = 0;
-                if (customBuilder_ != null) {
-                    customBuilder_.clear();
-                }
-                if (scheduleBuilder_ != null) {
-                    scheduleBuilder_.clear();
-                }
-                if (endpointLocationBuilder_ != null) {
-                    endpointLocationBuilder_.clear();
-                }
-                if (endpointPriorityBuilder_ != null) {
-                    endpointPriorityBuilder_.clear();
-                }
-                if (slaCapacityBuilder_ != null) {
-                    slaCapacityBuilder_.clear();
-                }
-                if (slaLatencyBuilder_ != null) {
-                    slaLatencyBuilder_.clear();
-                }
-                if (slaAvailabilityBuilder_ != null) {
-                    slaAvailabilityBuilder_.clear();
-                }
-                if (slaIsolationBuilder_ != null) {
-                    slaIsolationBuilder_.clear();
-                }
-                if (exclusionsBuilder_ != null) {
-                    exclusionsBuilder_.clear();
-                }
                 constraintCase_ = 0;
                 constraint_ = null;
                 return this;
@@ -66296,51 +69096,103 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Constraint buildPartial() {
                 context.ContextOuterClass.Constraint result = new context.ContextOuterClass.Constraint(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                buildPartialOneofs(result);
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartial0(context.ContextOuterClass.Constraint result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.action_ = action_;
-                }
-            }
-
-            private void buildPartialOneofs(context.ContextOuterClass.Constraint result) {
-                result.constraintCase_ = constraintCase_;
-                result.constraint_ = this.constraint_;
-                if (constraintCase_ == 2 && customBuilder_ != null) {
-                    result.constraint_ = customBuilder_.build();
+                result.action_ = action_;
+                if (constraintCase_ == 2) {
+                    if (customBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = customBuilder_.build();
+                    }
                 }
-                if (constraintCase_ == 3 && scheduleBuilder_ != null) {
-                    result.constraint_ = scheduleBuilder_.build();
+                if (constraintCase_ == 3) {
+                    if (scheduleBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = scheduleBuilder_.build();
+                    }
                 }
-                if (constraintCase_ == 4 && endpointLocationBuilder_ != null) {
-                    result.constraint_ = endpointLocationBuilder_.build();
+                if (constraintCase_ == 4) {
+                    if (endpointLocationBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = endpointLocationBuilder_.build();
+                    }
                 }
-                if (constraintCase_ == 5 && endpointPriorityBuilder_ != null) {
-                    result.constraint_ = endpointPriorityBuilder_.build();
+                if (constraintCase_ == 5) {
+                    if (endpointPriorityBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = endpointPriorityBuilder_.build();
+                    }
                 }
-                if (constraintCase_ == 6 && slaCapacityBuilder_ != null) {
-                    result.constraint_ = slaCapacityBuilder_.build();
+                if (constraintCase_ == 6) {
+                    if (slaCapacityBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = slaCapacityBuilder_.build();
+                    }
                 }
-                if (constraintCase_ == 7 && slaLatencyBuilder_ != null) {
-                    result.constraint_ = slaLatencyBuilder_.build();
+                if (constraintCase_ == 7) {
+                    if (slaLatencyBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = slaLatencyBuilder_.build();
+                    }
                 }
-                if (constraintCase_ == 8 && slaAvailabilityBuilder_ != null) {
-                    result.constraint_ = slaAvailabilityBuilder_.build();
+                if (constraintCase_ == 8) {
+                    if (slaAvailabilityBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = slaAvailabilityBuilder_.build();
+                    }
                 }
-                if (constraintCase_ == 9 && slaIsolationBuilder_ != null) {
-                    result.constraint_ = slaIsolationBuilder_.build();
+                if (constraintCase_ == 9) {
+                    if (slaIsolationBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = slaIsolationBuilder_.build();
+                    }
                 }
-                if (constraintCase_ == 10 && exclusionsBuilder_ != null) {
-                    result.constraint_ = exclusionsBuilder_.build();
+                if (constraintCase_ == 10) {
+                    if (exclusionsBuilder_ == null) {
+                        result.constraint_ = constraint_;
+                    } else {
+                        result.constraint_ = exclusionsBuilder_.build();
+                    }
                 }
+                result.constraintCase_ = constraintCase_;
+                onBuilt();
+                return result;
+            }
+
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -66410,7 +69262,7 @@ public final class ContextOuterClass {
                             break;
                         }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -66422,105 +69274,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Constraint parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    action_ = input.readEnum();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 8
-                            case 18:
-                                {
-                                    input.readMessage(getCustomFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 2;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getScheduleFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 3;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    input.readMessage(getEndpointLocationFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 4;
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    input.readMessage(getEndpointPriorityFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 5;
-                                    break;
-                                }
-                            // case 42
-                            case 50:
-                                {
-                                    input.readMessage(getSlaCapacityFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 6;
-                                    break;
-                                }
-                            // case 50
-                            case 58:
-                                {
-                                    input.readMessage(getSlaLatencyFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 7;
-                                    break;
-                                }
-                            // case 58
-                            case 66:
-                                {
-                                    input.readMessage(getSlaAvailabilityFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 8;
-                                    break;
-                                }
-                            // case 66
-                            case 74:
-                                {
-                                    input.readMessage(getSlaIsolationFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 9;
-                                    break;
-                                }
-                            // case 74
-                            case 82:
-                                {
-                                    input.readMessage(getExclusionsFieldBuilder().getBuilder(), extensionRegistry);
-                                    constraintCase_ = 10;
-                                    break;
-                                }
-                            // case 82
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Constraint) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -66539,8 +69303,6 @@ public final class ContextOuterClass {
                 return this;
             }
 
-            private int bitField0_;
-
             private int action_ = 0;
 
             /**
@@ -66559,7 +69321,6 @@ public final class ContextOuterClass {
              */
             public Builder setActionValue(int value) {
                 action_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -66570,7 +69331,8 @@ public final class ContextOuterClass {
              */
             @java.lang.Override
             public context.ContextOuterClass.ConstraintActionEnum getAction() {
-                context.ContextOuterClass.ConstraintActionEnum result = context.ContextOuterClass.ConstraintActionEnum.forNumber(action_);
+                @SuppressWarnings("deprecation")
+                context.ContextOuterClass.ConstraintActionEnum result = context.ContextOuterClass.ConstraintActionEnum.valueOf(action_);
                 return result == null ? context.ContextOuterClass.ConstraintActionEnum.UNRECOGNIZED : result;
             }
 
@@ -66583,7 +69345,6 @@ public final class ContextOuterClass {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000001;
                 action_ = value.getNumber();
                 onChanged();
                 return this;
@@ -66594,7 +69355,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearAction() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 action_ = 0;
                 onChanged();
                 return this;
@@ -66675,9 +69435,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 2) {
                         customBuilder_.mergeFrom(value);
-                    } else {
-                        customBuilder_.setMessage(value);
                     }
+                    customBuilder_.setMessage(value);
                 }
                 constraintCase_ = 2;
                 return this;
@@ -66738,6 +69497,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 2;
                 onChanged();
+                ;
                 return customBuilder_;
             }
 
@@ -66816,9 +69576,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 3) {
                         scheduleBuilder_.mergeFrom(value);
-                    } else {
-                        scheduleBuilder_.setMessage(value);
                     }
+                    scheduleBuilder_.setMessage(value);
                 }
                 constraintCase_ = 3;
                 return this;
@@ -66879,6 +69638,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 3;
                 onChanged();
+                ;
                 return scheduleBuilder_;
             }
 
@@ -66957,9 +69717,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 4) {
                         endpointLocationBuilder_.mergeFrom(value);
-                    } else {
-                        endpointLocationBuilder_.setMessage(value);
                     }
+                    endpointLocationBuilder_.setMessage(value);
                 }
                 constraintCase_ = 4;
                 return this;
@@ -67020,6 +69779,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 4;
                 onChanged();
+                ;
                 return endpointLocationBuilder_;
             }
 
@@ -67098,9 +69858,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 5) {
                         endpointPriorityBuilder_.mergeFrom(value);
-                    } else {
-                        endpointPriorityBuilder_.setMessage(value);
                     }
+                    endpointPriorityBuilder_.setMessage(value);
                 }
                 constraintCase_ = 5;
                 return this;
@@ -67161,6 +69920,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 5;
                 onChanged();
+                ;
                 return endpointPriorityBuilder_;
             }
 
@@ -67239,9 +69999,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 6) {
                         slaCapacityBuilder_.mergeFrom(value);
-                    } else {
-                        slaCapacityBuilder_.setMessage(value);
                     }
+                    slaCapacityBuilder_.setMessage(value);
                 }
                 constraintCase_ = 6;
                 return this;
@@ -67302,6 +70061,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 6;
                 onChanged();
+                ;
                 return slaCapacityBuilder_;
             }
 
@@ -67380,9 +70140,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 7) {
                         slaLatencyBuilder_.mergeFrom(value);
-                    } else {
-                        slaLatencyBuilder_.setMessage(value);
                     }
+                    slaLatencyBuilder_.setMessage(value);
                 }
                 constraintCase_ = 7;
                 return this;
@@ -67443,6 +70202,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 7;
                 onChanged();
+                ;
                 return slaLatencyBuilder_;
             }
 
@@ -67521,9 +70281,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 8) {
                         slaAvailabilityBuilder_.mergeFrom(value);
-                    } else {
-                        slaAvailabilityBuilder_.setMessage(value);
                     }
+                    slaAvailabilityBuilder_.setMessage(value);
                 }
                 constraintCase_ = 8;
                 return this;
@@ -67584,6 +70343,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 8;
                 onChanged();
+                ;
                 return slaAvailabilityBuilder_;
             }
 
@@ -67662,9 +70422,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 9) {
                         slaIsolationBuilder_.mergeFrom(value);
-                    } else {
-                        slaIsolationBuilder_.setMessage(value);
                     }
+                    slaIsolationBuilder_.setMessage(value);
                 }
                 constraintCase_ = 9;
                 return this;
@@ -67725,6 +70484,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 9;
                 onChanged();
+                ;
                 return slaIsolationBuilder_;
             }
 
@@ -67803,9 +70563,8 @@ public final class ContextOuterClass {
                 } else {
                     if (constraintCase_ == 10) {
                         exclusionsBuilder_.mergeFrom(value);
-                    } else {
-                        exclusionsBuilder_.setMessage(value);
                     }
+                    exclusionsBuilder_.setMessage(value);
                 }
                 constraintCase_ = 10;
                 return this;
@@ -67866,6 +70625,7 @@ public final class ContextOuterClass {
                 }
                 constraintCase_ = 10;
                 onChanged();
+                ;
                 return exclusionsBuilder_;
             }
 
@@ -67896,17 +70656,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Constraint parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Constraint(input, extensionRegistry);
             }
         };
 
@@ -67991,6 +70741,68 @@ public final class ContextOuterClass {
             return new TeraFlowController();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private TeraFlowController(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ContextId.Builder subBuilder = null;
+                                if (contextId_ != null) {
+                                    subBuilder = contextId_.toBuilder();
+                                }
+                                contextId_ = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(contextId_);
+                                    contextId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                ipAddress_ = s;
+                                break;
+                            }
+                        case 24:
+                            {
+                                port_ = input.readUInt32();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_TeraFlowController_descriptor;
         }
@@ -68027,13 +70839,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() {
-            return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
+            return getContextId();
         }
 
         public static final int IP_ADDRESS_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object ipAddress_ = "";
+        private volatile java.lang.Object ipAddress_;
 
         /**
          * string ip_address = 2;
@@ -68070,7 +70881,7 @@ public final class ContextOuterClass {
 
         public static final int PORT_FIELD_NUMBER = 3;
 
-        private int port_ = 0;
+        private int port_;
 
         /**
          * uint32 port = 3;
@@ -68099,13 +70910,13 @@ public final class ContextOuterClass {
             if (contextId_ != null) {
                 output.writeMessage(1, getContextId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(ipAddress_)) {
+            if (!getIpAddressBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, ipAddress_);
             }
             if (port_ != 0) {
                 output.writeUInt32(3, port_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -68117,13 +70928,13 @@ public final class ContextOuterClass {
             if (contextId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getContextId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(ipAddress_)) {
+            if (!getIpAddressBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, ipAddress_);
             }
             if (port_ != 0) {
                 size += com.google.protobuf.CodedOutputStream.computeUInt32Size(3, port_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -68147,7 +70958,7 @@ public final class ContextOuterClass {
                 return false;
             if (getPort() != other.getPort())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -68167,7 +70978,7 @@ public final class ContextOuterClass {
             hash = (53 * hash) + getIpAddress().hashCode();
             hash = (37 * hash) + PORT_FIELD_NUMBER;
             hash = (53 * hash) + getPort();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -68265,19 +71076,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.TeraFlowController.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
                 ipAddress_ = "";
@@ -68307,24 +71125,45 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.TeraFlowController buildPartial() {
                 context.ContextOuterClass.TeraFlowController result = new context.ContextOuterClass.TeraFlowController(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (contextIdBuilder_ == null) {
+                    result.contextId_ = contextId_;
+                } else {
+                    result.contextId_ = contextIdBuilder_.build();
                 }
+                result.ipAddress_ = ipAddress_;
+                result.port_ = port_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.TeraFlowController result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.contextId_ = contextIdBuilder_ == null ? contextId_ : contextIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.ipAddress_ = ipAddress_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.port_ = port_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -68345,13 +71184,12 @@ public final class ContextOuterClass {
                 }
                 if (!other.getIpAddress().isEmpty()) {
                     ipAddress_ = other.ipAddress_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (other.getPort() != 0) {
                     setPort(other.getPort());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -68363,61 +71201,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.TeraFlowController parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getContextIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    ipAddress_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 24:
-                                {
-                                    port_ = input.readUInt32();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.TeraFlowController) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.ContextId contextId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 contextIdBuilder_;
@@ -68427,7 +71224,7 @@ public final class ContextOuterClass {
              * @return Whether the contextId field is set.
              */
             public boolean hasContextId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return contextIdBuilder_ != null || contextId_ != null;
             }
 
             /**
@@ -68451,11 +71248,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     contextId_ = value;
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -68465,11 +71261,10 @@ public final class ContextOuterClass {
             public Builder setContextId(context.ContextOuterClass.ContextId.Builder builderForValue) {
                 if (contextIdBuilder_ == null) {
                     contextId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -68478,16 +71273,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeContextId(context.ContextOuterClass.ContextId value) {
                 if (contextIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && contextId_ != null && contextId_ != context.ContextOuterClass.ContextId.getDefaultInstance()) {
-                        getContextIdBuilder().mergeFrom(value);
+                    if (contextId_ != null) {
+                        contextId_ = context.ContextOuterClass.ContextId.newBuilder(contextId_).mergeFrom(value).buildPartial();
                     } else {
                         contextId_ = value;
                     }
+                    onChanged();
                 } else {
                     contextIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -68495,13 +71289,13 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public Builder clearContextId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                    onChanged();
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -68509,7 +71303,6 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public context.ContextOuterClass.ContextId.Builder getContextIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getContextIdFieldBuilder().getBuilder();
             }
@@ -68579,7 +71372,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 ipAddress_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -68590,7 +71382,6 @@ public final class ContextOuterClass {
              */
             public Builder clearIpAddress() {
                 ipAddress_ = getDefaultInstance().getIpAddress();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -68606,7 +71397,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 ipAddress_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -68629,7 +71419,6 @@ public final class ContextOuterClass {
              */
             public Builder setPort(int value) {
                 port_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -68639,7 +71428,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearPort() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 port_ = 0;
                 onChanged();
                 return this;
@@ -68672,17 +71460,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public TeraFlowController parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new TeraFlowController(input, extensionRegistry);
             }
         };
 
@@ -68750,6 +71528,62 @@ public final class ContextOuterClass {
             return new AuthenticationResult();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private AuthenticationResult(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.ContextId.Builder subBuilder = null;
+                                if (contextId_ != null) {
+                                    subBuilder = contextId_.toBuilder();
+                                }
+                                contextId_ = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(contextId_);
+                                    contextId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 16:
+                            {
+                                authenticated_ = input.readBool();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_AuthenticationResult_descriptor;
         }
@@ -68786,12 +71620,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() {
-            return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
+            return getContextId();
         }
 
         public static final int AUTHENTICATED_FIELD_NUMBER = 2;
 
-        private boolean authenticated_ = false;
+        private boolean authenticated_;
 
         /**
          * bool authenticated = 2;
@@ -68823,7 +71657,7 @@ public final class ContextOuterClass {
             if (authenticated_ != false) {
                 output.writeBool(2, authenticated_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -68838,7 +71672,7 @@ public final class ContextOuterClass {
             if (authenticated_ != false) {
                 size += com.google.protobuf.CodedOutputStream.computeBoolSize(2, authenticated_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -68860,7 +71694,7 @@ public final class ContextOuterClass {
             }
             if (getAuthenticated() != other.getAuthenticated())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -68878,7 +71712,7 @@ public final class ContextOuterClass {
             }
             hash = (37 * hash) + AUTHENTICATED_FIELD_NUMBER;
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getAuthenticated());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -68972,19 +71806,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.AuthenticationResult.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
                 authenticated_ = false;
@@ -69013,21 +71854,44 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.AuthenticationResult buildPartial() {
                 context.ContextOuterClass.AuthenticationResult result = new context.ContextOuterClass.AuthenticationResult(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (contextIdBuilder_ == null) {
+                    result.contextId_ = contextId_;
+                } else {
+                    result.contextId_ = contextIdBuilder_.build();
                 }
+                result.authenticated_ = authenticated_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.AuthenticationResult result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.contextId_ = contextIdBuilder_ == null ? contextId_ : contextIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.authenticated_ = authenticated_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -69049,7 +71913,7 @@ public final class ContextOuterClass {
                 if (other.getAuthenticated() != false) {
                     setAuthenticated(other.getAuthenticated());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -69061,54 +71925,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.AuthenticationResult parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getContextIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 16:
-                                {
-                                    authenticated_ = input.readBool();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.AuthenticationResult) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.ContextId contextId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 contextIdBuilder_;
@@ -69118,7 +71948,7 @@ public final class ContextOuterClass {
              * @return Whether the contextId field is set.
              */
             public boolean hasContextId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return contextIdBuilder_ != null || contextId_ != null;
             }
 
             /**
@@ -69142,11 +71972,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     contextId_ = value;
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -69156,11 +71985,10 @@ public final class ContextOuterClass {
             public Builder setContextId(context.ContextOuterClass.ContextId.Builder builderForValue) {
                 if (contextIdBuilder_ == null) {
                     contextId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     contextIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -69169,16 +71997,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeContextId(context.ContextOuterClass.ContextId value) {
                 if (contextIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && contextId_ != null && contextId_ != context.ContextOuterClass.ContextId.getDefaultInstance()) {
-                        getContextIdBuilder().mergeFrom(value);
+                    if (contextId_ != null) {
+                        contextId_ = context.ContextOuterClass.ContextId.newBuilder(contextId_).mergeFrom(value).buildPartial();
                     } else {
                         contextId_ = value;
                     }
+                    onChanged();
                 } else {
                     contextIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -69186,13 +72013,13 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public Builder clearContextId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                contextId_ = null;
-                if (contextIdBuilder_ != null) {
-                    contextIdBuilder_.dispose();
+                if (contextIdBuilder_ == null) {
+                    contextId_ = null;
+                    onChanged();
+                } else {
+                    contextId_ = null;
                     contextIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -69200,7 +72027,6 @@ public final class ContextOuterClass {
              * .context.ContextId context_id = 1;
              */
             public context.ContextOuterClass.ContextId.Builder getContextIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getContextIdFieldBuilder().getBuilder();
             }
@@ -69245,7 +72071,6 @@ public final class ContextOuterClass {
              */
             public Builder setAuthenticated(boolean value) {
                 authenticated_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -69255,7 +72080,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearAuthenticated() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 authenticated_ = false;
                 onChanged();
                 return this;
@@ -69288,17 +72112,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public AuthenticationResult parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new AuthenticationResult(input, extensionRegistry);
             }
         };
 
@@ -69360,6 +72174,50 @@ public final class ContextOuterClass {
             return new OpticalConfigId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private OpticalConfigId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                opticalconfigUuid_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_OpticalConfigId_descriptor;
         }
@@ -69371,8 +72229,7 @@ public final class ContextOuterClass {
 
         public static final int OPTICALCONFIG_UUID_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object opticalconfigUuid_ = "";
+        private volatile java.lang.Object opticalconfigUuid_;
 
         /**
          * string opticalconfig_uuid = 1;
@@ -69422,10 +72279,10 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(opticalconfigUuid_)) {
+            if (!getOpticalconfigUuidBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, opticalconfigUuid_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -69434,10 +72291,10 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(opticalconfigUuid_)) {
+            if (!getOpticalconfigUuidBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, opticalconfigUuid_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -69453,7 +72310,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.OpticalConfigId other = (context.ContextOuterClass.OpticalConfigId) obj;
             if (!getOpticalconfigUuid().equals(other.getOpticalconfigUuid()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -69467,7 +72324,7 @@ public final class ContextOuterClass {
             hash = (19 * hash) + getDescriptor().hashCode();
             hash = (37 * hash) + OPTICALCONFIG_UUID_FIELD_NUMBER;
             hash = (53 * hash) + getOpticalconfigUuid().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -69565,16 +72422,22 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.OpticalConfigId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 opticalconfigUuid_ = "";
                 return this;
             }
@@ -69601,18 +72464,39 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.OpticalConfigId buildPartial() {
                 context.ContextOuterClass.OpticalConfigId result = new context.ContextOuterClass.OpticalConfigId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
+                result.opticalconfigUuid_ = opticalconfigUuid_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.OpticalConfigId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.opticalconfigUuid_ = opticalconfigUuid_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -69630,10 +72514,9 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getOpticalconfigUuid().isEmpty()) {
                     opticalconfigUuid_ = other.opticalconfigUuid_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -69645,47 +72528,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.OpticalConfigId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    opticalconfigUuid_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.OpticalConfigId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private java.lang.Object opticalconfigUuid_ = "";
 
             /**
@@ -69729,7 +72585,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 opticalconfigUuid_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -69740,7 +72595,6 @@ public final class ContextOuterClass {
              */
             public Builder clearOpticalconfigUuid() {
                 opticalconfigUuid_ = getDefaultInstance().getOpticalconfigUuid();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -69756,7 +72610,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 opticalconfigUuid_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -69788,17 +72641,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public OpticalConfigId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new OpticalConfigId(input, extensionRegistry);
             }
         };
 
@@ -69873,6 +72716,63 @@ public final class ContextOuterClass {
             return new OpticalConfig();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private OpticalConfig(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.OpticalConfigId.Builder subBuilder = null;
+                                if (opticalconfigId_ != null) {
+                                    subBuilder = opticalconfigId_.toBuilder();
+                                }
+                                opticalconfigId_ = input.readMessage(context.ContextOuterClass.OpticalConfigId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(opticalconfigId_);
+                                    opticalconfigId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                config_ = s;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_OpticalConfig_descriptor;
         }
@@ -69909,13 +72809,12 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.OpticalConfigIdOrBuilder getOpticalconfigIdOrBuilder() {
-            return opticalconfigId_ == null ? context.ContextOuterClass.OpticalConfigId.getDefaultInstance() : opticalconfigId_;
+            return getOpticalconfigId();
         }
 
         public static final int CONFIG_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object config_ = "";
+        private volatile java.lang.Object config_;
 
         /**
          * string config = 2;
@@ -69968,10 +72867,10 @@ public final class ContextOuterClass {
             if (opticalconfigId_ != null) {
                 output.writeMessage(1, getOpticalconfigId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(config_)) {
+            if (!getConfigBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, config_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -69983,10 +72882,10 @@ public final class ContextOuterClass {
             if (opticalconfigId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getOpticalconfigId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(config_)) {
+            if (!getConfigBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, config_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -70008,7 +72907,7 @@ public final class ContextOuterClass {
             }
             if (!getConfig().equals(other.getConfig()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -70026,7 +72925,7 @@ public final class ContextOuterClass {
             }
             hash = (37 * hash) + CONFIG_FIELD_NUMBER;
             hash = (53 * hash) + getConfig().hashCode();
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -70120,19 +73019,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.OpticalConfig.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                opticalconfigId_ = null;
-                if (opticalconfigIdBuilder_ != null) {
-                    opticalconfigIdBuilder_.dispose();
+                if (opticalconfigIdBuilder_ == null) {
+                    opticalconfigId_ = null;
+                } else {
+                    opticalconfigId_ = null;
                     opticalconfigIdBuilder_ = null;
                 }
                 config_ = "";
@@ -70161,21 +73067,44 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.OpticalConfig buildPartial() {
                 context.ContextOuterClass.OpticalConfig result = new context.ContextOuterClass.OpticalConfig(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (opticalconfigIdBuilder_ == null) {
+                    result.opticalconfigId_ = opticalconfigId_;
+                } else {
+                    result.opticalconfigId_ = opticalconfigIdBuilder_.build();
                 }
+                result.config_ = config_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.OpticalConfig result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.opticalconfigId_ = opticalconfigIdBuilder_ == null ? opticalconfigId_ : opticalconfigIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.config_ = config_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -70196,10 +73125,9 @@ public final class ContextOuterClass {
                 }
                 if (!other.getConfig().isEmpty()) {
                     config_ = other.config_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -70211,54 +73139,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.OpticalConfig parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getOpticalconfigIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    config_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.OpticalConfig) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.OpticalConfigId opticalconfigId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 opticalconfigIdBuilder_;
@@ -70268,7 +73162,7 @@ public final class ContextOuterClass {
              * @return Whether the opticalconfigId field is set.
              */
             public boolean hasOpticalconfigId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return opticalconfigIdBuilder_ != null || opticalconfigId_ != null;
             }
 
             /**
@@ -70292,11 +73186,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     opticalconfigId_ = value;
+                    onChanged();
                 } else {
                     opticalconfigIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -70306,11 +73199,10 @@ public final class ContextOuterClass {
             public Builder setOpticalconfigId(context.ContextOuterClass.OpticalConfigId.Builder builderForValue) {
                 if (opticalconfigIdBuilder_ == null) {
                     opticalconfigId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     opticalconfigIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -70319,16 +73211,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeOpticalconfigId(context.ContextOuterClass.OpticalConfigId value) {
                 if (opticalconfigIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && opticalconfigId_ != null && opticalconfigId_ != context.ContextOuterClass.OpticalConfigId.getDefaultInstance()) {
-                        getOpticalconfigIdBuilder().mergeFrom(value);
+                    if (opticalconfigId_ != null) {
+                        opticalconfigId_ = context.ContextOuterClass.OpticalConfigId.newBuilder(opticalconfigId_).mergeFrom(value).buildPartial();
                     } else {
                         opticalconfigId_ = value;
                     }
+                    onChanged();
                 } else {
                     opticalconfigIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -70336,13 +73227,13 @@ public final class ContextOuterClass {
              * .context.OpticalConfigId opticalconfig_id = 1;
              */
             public Builder clearOpticalconfigId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                opticalconfigId_ = null;
-                if (opticalconfigIdBuilder_ != null) {
-                    opticalconfigIdBuilder_.dispose();
+                if (opticalconfigIdBuilder_ == null) {
+                    opticalconfigId_ = null;
+                    onChanged();
+                } else {
+                    opticalconfigId_ = null;
                     opticalconfigIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -70350,7 +73241,6 @@ public final class ContextOuterClass {
              * .context.OpticalConfigId opticalconfig_id = 1;
              */
             public context.ContextOuterClass.OpticalConfigId.Builder getOpticalconfigIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getOpticalconfigIdFieldBuilder().getBuilder();
             }
@@ -70420,7 +73310,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 config_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -70431,7 +73320,6 @@ public final class ContextOuterClass {
              */
             public Builder clearConfig() {
                 config_ = getDefaultInstance().getConfig();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -70447,7 +73335,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 config_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -70479,17 +73366,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public OpticalConfig parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new OpticalConfig(input, extensionRegistry);
             }
         };
 
@@ -70560,6 +73437,57 @@ public final class ContextOuterClass {
             return new OpticalConfigList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private OpticalConfigList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    opticalconfigs_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                opticalconfigs_.add(input.readMessage(context.ContextOuterClass.OpticalConfig.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    opticalconfigs_ = java.util.Collections.unmodifiableList(opticalconfigs_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_OpticalConfigList_descriptor;
         }
@@ -70571,7 +73499,6 @@ public final class ContextOuterClass {
 
         public static final int OPTICALCONFIGS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List opticalconfigs_;
 
         /**
@@ -70632,7 +73559,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < opticalconfigs_.size(); i++) {
                 output.writeMessage(1, opticalconfigs_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -70644,7 +73571,7 @@ public final class ContextOuterClass {
             for (int i = 0; i < opticalconfigs_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, opticalconfigs_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -70660,7 +73587,7 @@ public final class ContextOuterClass {
             context.ContextOuterClass.OpticalConfigList other = (context.ContextOuterClass.OpticalConfigList) obj;
             if (!getOpticalconfigsList().equals(other.getOpticalconfigsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -70676,7 +73603,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + OPTICALCONFIGS_FIELD_NUMBER;
                 hash = (53 * hash) + getOpticalconfigsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -70770,23 +73697,29 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.OpticalConfigList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getOpticalconfigsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (opticalconfigsBuilder_ == null) {
                     opticalconfigs_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    opticalconfigs_ = null;
                     opticalconfigsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -70812,15 +73745,7 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.OpticalConfigList buildPartial() {
                 context.ContextOuterClass.OpticalConfigList result = new context.ContextOuterClass.OpticalConfigList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.OpticalConfigList result) {
+                int from_bitField0_ = bitField0_;
                 if (opticalconfigsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         opticalconfigs_ = java.util.Collections.unmodifiableList(opticalconfigs_);
@@ -70830,10 +73755,38 @@ public final class ContextOuterClass {
                 } else {
                     result.opticalconfigs_ = opticalconfigsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.OpticalConfigList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -70873,7 +73826,7 @@ public final class ContextOuterClass {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -70885,47 +73838,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.OpticalConfigList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    context.ContextOuterClass.OpticalConfig m = input.readMessage(context.ContextOuterClass.OpticalConfig.parser(), extensionRegistry);
-                                    if (opticalconfigsBuilder_ == null) {
-                                        ensureOpticalconfigsIsMutable();
-                                        opticalconfigs_.add(m);
-                                    } else {
-                                        opticalconfigsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.OpticalConfigList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -71195,17 +74118,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public OpticalConfigList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new OpticalConfigList(input, extensionRegistry);
             }
         };
 
@@ -71267,6 +74180,57 @@ public final class ContextOuterClass {
             return new OpticalLinkId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private OpticalLinkId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (opticalLinkUuid_ != null) {
+                                    subBuilder = opticalLinkUuid_.toBuilder();
+                                }
+                                opticalLinkUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(opticalLinkUuid_);
+                                    opticalLinkUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_OpticalLinkId_descriptor;
         }
@@ -71303,7 +74267,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getOpticalLinkUuidOrBuilder() {
-            return opticalLinkUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : opticalLinkUuid_;
+            return getOpticalLinkUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -71324,7 +74288,7 @@ public final class ContextOuterClass {
             if (opticalLinkUuid_ != null) {
                 output.writeMessage(1, getOpticalLinkUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -71336,7 +74300,7 @@ public final class ContextOuterClass {
             if (opticalLinkUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getOpticalLinkUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -71356,7 +74320,7 @@ public final class ContextOuterClass {
                 if (!getOpticalLinkUuid().equals(other.getOpticalLinkUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -71372,7 +74336,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + OPTICAL_LINK_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getOpticalLinkUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -71466,19 +74430,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.OpticalLinkId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                opticalLinkUuid_ = null;
-                if (opticalLinkUuidBuilder_ != null) {
-                    opticalLinkUuidBuilder_.dispose();
+                if (opticalLinkUuidBuilder_ == null) {
+                    opticalLinkUuid_ = null;
+                } else {
+                    opticalLinkUuid_ = null;
                     opticalLinkUuidBuilder_ = null;
                 }
                 return this;
@@ -71506,18 +74477,43 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.OpticalLinkId buildPartial() {
                 context.ContextOuterClass.OpticalLinkId result = new context.ContextOuterClass.OpticalLinkId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (opticalLinkUuidBuilder_ == null) {
+                    result.opticalLinkUuid_ = opticalLinkUuid_;
+                } else {
+                    result.opticalLinkUuid_ = opticalLinkUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.OpticalLinkId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.opticalLinkUuid_ = opticalLinkUuidBuilder_ == null ? opticalLinkUuid_ : opticalLinkUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -71536,7 +74532,7 @@ public final class ContextOuterClass {
                 if (other.hasOpticalLinkUuid()) {
                     mergeOpticalLinkUuid(other.getOpticalLinkUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -71548,47 +74544,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.OpticalLinkId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getOpticalLinkUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.OpticalLinkId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid opticalLinkUuid_;
 
             private com.google.protobuf.SingleFieldBuilderV3 opticalLinkUuidBuilder_;
@@ -71598,7 +74567,7 @@ public final class ContextOuterClass {
              * @return Whether the opticalLinkUuid field is set.
              */
             public boolean hasOpticalLinkUuid() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return opticalLinkUuidBuilder_ != null || opticalLinkUuid_ != null;
             }
 
             /**
@@ -71622,11 +74591,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     opticalLinkUuid_ = value;
+                    onChanged();
                 } else {
                     opticalLinkUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -71636,11 +74604,10 @@ public final class ContextOuterClass {
             public Builder setOpticalLinkUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (opticalLinkUuidBuilder_ == null) {
                     opticalLinkUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     opticalLinkUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -71649,16 +74616,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeOpticalLinkUuid(context.ContextOuterClass.Uuid value) {
                 if (opticalLinkUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && opticalLinkUuid_ != null && opticalLinkUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getOpticalLinkUuidBuilder().mergeFrom(value);
+                    if (opticalLinkUuid_ != null) {
+                        opticalLinkUuid_ = context.ContextOuterClass.Uuid.newBuilder(opticalLinkUuid_).mergeFrom(value).buildPartial();
                     } else {
                         opticalLinkUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     opticalLinkUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -71666,13 +74632,13 @@ public final class ContextOuterClass {
              * .context.Uuid optical_link_uuid = 1;
              */
             public Builder clearOpticalLinkUuid() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                opticalLinkUuid_ = null;
-                if (opticalLinkUuidBuilder_ != null) {
-                    opticalLinkUuidBuilder_.dispose();
+                if (opticalLinkUuidBuilder_ == null) {
+                    opticalLinkUuid_ = null;
+                    onChanged();
+                } else {
+                    opticalLinkUuid_ = null;
                     opticalLinkUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -71680,7 +74646,6 @@ public final class ContextOuterClass {
              * .context.Uuid optical_link_uuid = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getOpticalLinkUuidBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getOpticalLinkUuidFieldBuilder().getBuilder();
             }
@@ -71734,17 +74699,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public OpticalLinkId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new OpticalLinkId(input, extensionRegistry);
             }
         };
 
@@ -71806,6 +74761,57 @@ public final class ContextOuterClass {
             return new FiberId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private FiberId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (fiberUuid_ != null) {
+                                    subBuilder = fiberUuid_.toBuilder();
+                                }
+                                fiberUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(fiberUuid_);
+                                    fiberUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_FiberId_descriptor;
         }
@@ -71842,7 +74848,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getFiberUuidOrBuilder() {
-            return fiberUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : fiberUuid_;
+            return getFiberUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -71863,7 +74869,7 @@ public final class ContextOuterClass {
             if (fiberUuid_ != null) {
                 output.writeMessage(1, getFiberUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -71875,7 +74881,7 @@ public final class ContextOuterClass {
             if (fiberUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getFiberUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -71895,7 +74901,7 @@ public final class ContextOuterClass {
                 if (!getFiberUuid().equals(other.getFiberUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -71911,7 +74917,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + FIBER_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getFiberUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -72005,19 +75011,26 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.FiberId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                fiberUuid_ = null;
-                if (fiberUuidBuilder_ != null) {
-                    fiberUuidBuilder_.dispose();
+                if (fiberUuidBuilder_ == null) {
+                    fiberUuid_ = null;
+                } else {
+                    fiberUuid_ = null;
                     fiberUuidBuilder_ = null;
                 }
                 return this;
@@ -72045,18 +75058,43 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.FiberId buildPartial() {
                 context.ContextOuterClass.FiberId result = new context.ContextOuterClass.FiberId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (fiberUuidBuilder_ == null) {
+                    result.fiberUuid_ = fiberUuid_;
+                } else {
+                    result.fiberUuid_ = fiberUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.FiberId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.fiberUuid_ = fiberUuidBuilder_ == null ? fiberUuid_ : fiberUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -72075,7 +75113,7 @@ public final class ContextOuterClass {
                 if (other.hasFiberUuid()) {
                     mergeFiberUuid(other.getFiberUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -72087,47 +75125,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.FiberId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getFiberUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.FiberId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid fiberUuid_;
 
             private com.google.protobuf.SingleFieldBuilderV3 fiberUuidBuilder_;
@@ -72137,7 +75148,7 @@ public final class ContextOuterClass {
              * @return Whether the fiberUuid field is set.
              */
             public boolean hasFiberUuid() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return fiberUuidBuilder_ != null || fiberUuid_ != null;
             }
 
             /**
@@ -72161,11 +75172,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     fiberUuid_ = value;
+                    onChanged();
                 } else {
                     fiberUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -72175,11 +75185,10 @@ public final class ContextOuterClass {
             public Builder setFiberUuid(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (fiberUuidBuilder_ == null) {
                     fiberUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     fiberUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -72188,16 +75197,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeFiberUuid(context.ContextOuterClass.Uuid value) {
                 if (fiberUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && fiberUuid_ != null && fiberUuid_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getFiberUuidBuilder().mergeFrom(value);
+                    if (fiberUuid_ != null) {
+                        fiberUuid_ = context.ContextOuterClass.Uuid.newBuilder(fiberUuid_).mergeFrom(value).buildPartial();
                     } else {
                         fiberUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     fiberUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -72205,13 +75213,13 @@ public final class ContextOuterClass {
              * .context.Uuid fiber_uuid = 1;
              */
             public Builder clearFiberUuid() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                fiberUuid_ = null;
-                if (fiberUuidBuilder_ != null) {
-                    fiberUuidBuilder_.dispose();
+                if (fiberUuidBuilder_ == null) {
+                    fiberUuid_ = null;
+                    onChanged();
+                } else {
+                    fiberUuid_ = null;
                     fiberUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -72219,7 +75227,6 @@ public final class ContextOuterClass {
              * .context.Uuid fiber_uuid = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getFiberUuidBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getFiberUuidFieldBuilder().getBuilder();
             }
@@ -72273,17 +75280,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public FiberId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new FiberId(input, extensionRegistry);
             }
         };
 
@@ -72482,6 +75479,179 @@ public final class ContextOuterClass {
             return new Fiber();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Fiber(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                srcPort_ = s;
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                dstPort_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                localPeerPort_ = s;
+                                break;
+                            }
+                        case 34:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                remotePeerPort_ = s;
+                                break;
+                            }
+                        case 40:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    cSlots_ = newIntList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                cSlots_.addInt(input.readInt32());
+                                break;
+                            }
+                        case 42:
+                            {
+                                int length = input.readRawVarint32();
+                                int limit = input.pushLimit(length);
+                                if (!((mutable_bitField0_ & 0x00000001) != 0) && input.getBytesUntilLimit() > 0) {
+                                    cSlots_ = newIntList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                while (input.getBytesUntilLimit() > 0) {
+                                    cSlots_.addInt(input.readInt32());
+                                }
+                                input.popLimit(limit);
+                                break;
+                            }
+                        case 48:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                                    lSlots_ = newIntList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                lSlots_.addInt(input.readInt32());
+                                break;
+                            }
+                        case 50:
+                            {
+                                int length = input.readRawVarint32();
+                                int limit = input.pushLimit(length);
+                                if (!((mutable_bitField0_ & 0x00000002) != 0) && input.getBytesUntilLimit() > 0) {
+                                    lSlots_ = newIntList();
+                                    mutable_bitField0_ |= 0x00000002;
+                                }
+                                while (input.getBytesUntilLimit() > 0) {
+                                    lSlots_.addInt(input.readInt32());
+                                }
+                                input.popLimit(limit);
+                                break;
+                            }
+                        case 56:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000004) != 0)) {
+                                    sSlots_ = newIntList();
+                                    mutable_bitField0_ |= 0x00000004;
+                                }
+                                sSlots_.addInt(input.readInt32());
+                                break;
+                            }
+                        case 58:
+                            {
+                                int length = input.readRawVarint32();
+                                int limit = input.pushLimit(length);
+                                if (!((mutable_bitField0_ & 0x00000004) != 0) && input.getBytesUntilLimit() > 0) {
+                                    sSlots_ = newIntList();
+                                    mutable_bitField0_ |= 0x00000004;
+                                }
+                                while (input.getBytesUntilLimit() > 0) {
+                                    sSlots_.addInt(input.readInt32());
+                                }
+                                input.popLimit(limit);
+                                break;
+                            }
+                        case 69:
+                            {
+                                length_ = input.readFloat();
+                                break;
+                            }
+                        case 72:
+                            {
+                                used_ = input.readBool();
+                                break;
+                            }
+                        case 82:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                iD_ = s;
+                                break;
+                            }
+                        case 90:
+                            {
+                                context.ContextOuterClass.FiberId.Builder subBuilder = null;
+                                if (fiberUuid_ != null) {
+                                    subBuilder = fiberUuid_.toBuilder();
+                                }
+                                fiberUuid_ = input.readMessage(context.ContextOuterClass.FiberId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(fiberUuid_);
+                                    fiberUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    // C
+                    cSlots_.makeImmutable();
+                }
+                if (((mutable_bitField0_ & 0x00000002) != 0)) {
+                    // C
+                    lSlots_.makeImmutable();
+                }
+                if (((mutable_bitField0_ & 0x00000004) != 0)) {
+                    // C
+                    sSlots_.makeImmutable();
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_Fiber_descriptor;
         }
@@ -72493,8 +75663,7 @@ public final class ContextOuterClass {
 
         public static final int ID_FIELD_NUMBER = 10;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object iD_ = "";
+        private volatile java.lang.Object iD_;
 
         /**
          * string ID = 10;
@@ -72531,8 +75700,7 @@ public final class ContextOuterClass {
 
         public static final int SRC_PORT_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object srcPort_ = "";
+        private volatile java.lang.Object srcPort_;
 
         /**
          * string src_port = 1;
@@ -72569,8 +75737,7 @@ public final class ContextOuterClass {
 
         public static final int DST_PORT_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object dstPort_ = "";
+        private volatile java.lang.Object dstPort_;
 
         /**
          * string dst_port = 2;
@@ -72607,8 +75774,7 @@ public final class ContextOuterClass {
 
         public static final int LOCAL_PEER_PORT_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object localPeerPort_ = "";
+        private volatile java.lang.Object localPeerPort_;
 
         /**
          * string local_peer_port = 3;
@@ -72645,8 +75811,7 @@ public final class ContextOuterClass {
 
         public static final int REMOTE_PEER_PORT_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object remotePeerPort_ = "";
+        private volatile java.lang.Object remotePeerPort_;
 
         /**
          * string remote_peer_port = 4;
@@ -72683,7 +75848,6 @@ public final class ContextOuterClass {
 
         public static final int C_SLOTS_FIELD_NUMBER = 5;
 
-        @SuppressWarnings("serial")
         private com.google.protobuf.Internal.IntList cSlots_;
 
         /**
@@ -72716,7 +75880,6 @@ public final class ContextOuterClass {
 
         public static final int L_SLOTS_FIELD_NUMBER = 6;
 
-        @SuppressWarnings("serial")
         private com.google.protobuf.Internal.IntList lSlots_;
 
         /**
@@ -72749,7 +75912,6 @@ public final class ContextOuterClass {
 
         public static final int S_SLOTS_FIELD_NUMBER = 7;
 
-        @SuppressWarnings("serial")
         private com.google.protobuf.Internal.IntList sSlots_;
 
         /**
@@ -72782,7 +75944,7 @@ public final class ContextOuterClass {
 
         public static final int LENGTH_FIELD_NUMBER = 8;
 
-        private float length_ = 0F;
+        private float length_;
 
         /**
          * float length = 8;
@@ -72795,7 +75957,7 @@ public final class ContextOuterClass {
 
         public static final int USED_FIELD_NUMBER = 9;
 
-        private boolean used_ = false;
+        private boolean used_;
 
         /**
          * bool used = 9;
@@ -72833,7 +75995,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.FiberIdOrBuilder getFiberUuidOrBuilder() {
-            return fiberUuid_ == null ? context.ContextOuterClass.FiberId.getDefaultInstance() : fiberUuid_;
+            return getFiberUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -72852,16 +76014,16 @@ public final class ContextOuterClass {
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
             getSerializedSize();
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcPort_)) {
+            if (!getSrcPortBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, srcPort_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstPort_)) {
+            if (!getDstPortBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, dstPort_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(localPeerPort_)) {
+            if (!getLocalPeerPortBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 3, localPeerPort_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(remotePeerPort_)) {
+            if (!getRemotePeerPortBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 4, remotePeerPort_);
             }
             if (getCSlotsList().size() > 0) {
@@ -72885,19 +76047,19 @@ public final class ContextOuterClass {
             for (int i = 0; i < sSlots_.size(); i++) {
                 output.writeInt32NoTag(sSlots_.getInt(i));
             }
-            if (java.lang.Float.floatToRawIntBits(length_) != 0) {
+            if (length_ != 0F) {
                 output.writeFloat(8, length_);
             }
             if (used_ != false) {
                 output.writeBool(9, used_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(iD_)) {
+            if (!getIDBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 10, iD_);
             }
             if (fiberUuid_ != null) {
                 output.writeMessage(11, getFiberUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -72906,16 +76068,16 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(srcPort_)) {
+            if (!getSrcPortBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, srcPort_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(dstPort_)) {
+            if (!getDstPortBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, dstPort_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(localPeerPort_)) {
+            if (!getLocalPeerPortBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, localPeerPort_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(remotePeerPort_)) {
+            if (!getRemotePeerPortBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, remotePeerPort_);
             }
             {
@@ -72954,19 +76116,19 @@ public final class ContextOuterClass {
                 }
                 sSlotsMemoizedSerializedSize = dataSize;
             }
-            if (java.lang.Float.floatToRawIntBits(length_) != 0) {
+            if (length_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(8, length_);
             }
             if (used_ != false) {
                 size += com.google.protobuf.CodedOutputStream.computeBoolSize(9, used_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(iD_)) {
+            if (!getIDBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(10, iD_);
             }
             if (fiberUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(11, getFiberUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -73006,7 +76168,7 @@ public final class ContextOuterClass {
                 if (!getFiberUuid().equals(other.getFiberUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -73048,7 +76210,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + FIBER_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getFiberUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -73142,29 +76304,39 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.Fiber.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 iD_ = "";
                 srcPort_ = "";
                 dstPort_ = "";
                 localPeerPort_ = "";
                 remotePeerPort_ = "";
                 cSlots_ = emptyIntList();
+                bitField0_ = (bitField0_ & ~0x00000001);
                 lSlots_ = emptyIntList();
+                bitField0_ = (bitField0_ & ~0x00000002);
                 sSlots_ = emptyIntList();
+                bitField0_ = (bitField0_ & ~0x00000004);
                 length_ = 0F;
                 used_ = false;
-                fiberUuid_ = null;
-                if (fiberUuidBuilder_ != null) {
-                    fiberUuidBuilder_.dispose();
+                if (fiberUuidBuilder_ == null) {
+                    fiberUuid_ = null;
+                } else {
+                    fiberUuid_ = null;
                     fiberUuidBuilder_ = null;
                 }
                 return this;
@@ -73192,58 +76364,66 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.Fiber buildPartial() {
                 context.ContextOuterClass.Fiber result = new context.ContextOuterClass.Fiber(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.Fiber result) {
-                if (((bitField0_ & 0x00000020) != 0)) {
+                int from_bitField0_ = bitField0_;
+                result.iD_ = iD_;
+                result.srcPort_ = srcPort_;
+                result.dstPort_ = dstPort_;
+                result.localPeerPort_ = localPeerPort_;
+                result.remotePeerPort_ = remotePeerPort_;
+                if (((bitField0_ & 0x00000001) != 0)) {
                     cSlots_.makeImmutable();
-                    bitField0_ = (bitField0_ & ~0x00000020);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 }
                 result.cSlots_ = cSlots_;
-                if (((bitField0_ & 0x00000040) != 0)) {
+                if (((bitField0_ & 0x00000002) != 0)) {
                     lSlots_.makeImmutable();
-                    bitField0_ = (bitField0_ & ~0x00000040);
+                    bitField0_ = (bitField0_ & ~0x00000002);
                 }
                 result.lSlots_ = lSlots_;
-                if (((bitField0_ & 0x00000080) != 0)) {
+                if (((bitField0_ & 0x00000004) != 0)) {
                     sSlots_.makeImmutable();
-                    bitField0_ = (bitField0_ & ~0x00000080);
+                    bitField0_ = (bitField0_ & ~0x00000004);
                 }
                 result.sSlots_ = sSlots_;
+                result.length_ = length_;
+                result.used_ = used_;
+                if (fiberUuidBuilder_ == null) {
+                    result.fiberUuid_ = fiberUuid_;
+                } else {
+                    result.fiberUuid_ = fiberUuidBuilder_.build();
+                }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.Fiber result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.iD_ = iD_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.srcPort_ = srcPort_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.dstPort_ = dstPort_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.localPeerPort_ = localPeerPort_;
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.remotePeerPort_ = remotePeerPort_;
-                }
-                if (((from_bitField0_ & 0x00000100) != 0)) {
-                    result.length_ = length_;
-                }
-                if (((from_bitField0_ & 0x00000200) != 0)) {
-                    result.used_ = used_;
-                }
-                if (((from_bitField0_ & 0x00000400) != 0)) {
-                    result.fiberUuid_ = fiberUuidBuilder_ == null ? fiberUuid_ : fiberUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -73261,33 +76441,28 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getID().isEmpty()) {
                     iD_ = other.iD_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
                 if (!other.getSrcPort().isEmpty()) {
                     srcPort_ = other.srcPort_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (!other.getDstPort().isEmpty()) {
                     dstPort_ = other.dstPort_;
-                    bitField0_ |= 0x00000004;
                     onChanged();
                 }
                 if (!other.getLocalPeerPort().isEmpty()) {
                     localPeerPort_ = other.localPeerPort_;
-                    bitField0_ |= 0x00000008;
                     onChanged();
                 }
                 if (!other.getRemotePeerPort().isEmpty()) {
                     remotePeerPort_ = other.remotePeerPort_;
-                    bitField0_ |= 0x00000010;
                     onChanged();
                 }
                 if (!other.cSlots_.isEmpty()) {
                     if (cSlots_.isEmpty()) {
                         cSlots_ = other.cSlots_;
-                        bitField0_ = (bitField0_ & ~0x00000020);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     } else {
                         ensureCSlotsIsMutable();
                         cSlots_.addAll(other.cSlots_);
@@ -73297,7 +76472,7 @@ public final class ContextOuterClass {
                 if (!other.lSlots_.isEmpty()) {
                     if (lSlots_.isEmpty()) {
                         lSlots_ = other.lSlots_;
-                        bitField0_ = (bitField0_ & ~0x00000040);
+                        bitField0_ = (bitField0_ & ~0x00000002);
                     } else {
                         ensureLSlotsIsMutable();
                         lSlots_.addAll(other.lSlots_);
@@ -73307,7 +76482,7 @@ public final class ContextOuterClass {
                 if (!other.sSlots_.isEmpty()) {
                     if (sSlots_.isEmpty()) {
                         sSlots_ = other.sSlots_;
-                        bitField0_ = (bitField0_ & ~0x00000080);
+                        bitField0_ = (bitField0_ & ~0x00000004);
                     } else {
                         ensureSSlotsIsMutable();
                         sSlots_.addAll(other.sSlots_);
@@ -73323,7 +76498,7 @@ public final class ContextOuterClass {
                 if (other.hasFiberUuid()) {
                     mergeFiberUuid(other.getFiberUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -73335,151 +76510,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.Fiber parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    srcPort_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    dstPort_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    localPeerPort_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    remotePeerPort_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 34
-                            case 40:
-                                {
-                                    int v = input.readInt32();
-                                    ensureCSlotsIsMutable();
-                                    cSlots_.addInt(v);
-                                    break;
-                                }
-                            // case 40
-                            case 42:
-                                {
-                                    int length = input.readRawVarint32();
-                                    int limit = input.pushLimit(length);
-                                    ensureCSlotsIsMutable();
-                                    while (input.getBytesUntilLimit() > 0) {
-                                        cSlots_.addInt(input.readInt32());
-                                    }
-                                    input.popLimit(limit);
-                                    break;
-                                }
-                            // case 42
-                            case 48:
-                                {
-                                    int v = input.readInt32();
-                                    ensureLSlotsIsMutable();
-                                    lSlots_.addInt(v);
-                                    break;
-                                }
-                            // case 48
-                            case 50:
-                                {
-                                    int length = input.readRawVarint32();
-                                    int limit = input.pushLimit(length);
-                                    ensureLSlotsIsMutable();
-                                    while (input.getBytesUntilLimit() > 0) {
-                                        lSlots_.addInt(input.readInt32());
-                                    }
-                                    input.popLimit(limit);
-                                    break;
-                                }
-                            // case 50
-                            case 56:
-                                {
-                                    int v = input.readInt32();
-                                    ensureSSlotsIsMutable();
-                                    sSlots_.addInt(v);
-                                    break;
-                                }
-                            // case 56
-                            case 58:
-                                {
-                                    int length = input.readRawVarint32();
-                                    int limit = input.pushLimit(length);
-                                    ensureSSlotsIsMutable();
-                                    while (input.getBytesUntilLimit() > 0) {
-                                        sSlots_.addInt(input.readInt32());
-                                    }
-                                    input.popLimit(limit);
-                                    break;
-                                }
-                            // case 58
-                            case 69:
-                                {
-                                    length_ = input.readFloat();
-                                    bitField0_ |= 0x00000100;
-                                    break;
-                                }
-                            // case 69
-                            case 72:
-                                {
-                                    used_ = input.readBool();
-                                    bitField0_ |= 0x00000200;
-                                    break;
-                                }
-                            // case 72
-                            case 82:
-                                {
-                                    iD_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 82
-                            case 90:
-                                {
-                                    input.readMessage(getFiberUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000400;
-                                    break;
-                                }
-                            // case 90
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.Fiber) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -73528,7 +76569,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 iD_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -73539,7 +76579,6 @@ public final class ContextOuterClass {
              */
             public Builder clearID() {
                 iD_ = getDefaultInstance().getID();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -73555,7 +76594,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 iD_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -73603,7 +76641,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 srcPort_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -73614,7 +76651,6 @@ public final class ContextOuterClass {
              */
             public Builder clearSrcPort() {
                 srcPort_ = getDefaultInstance().getSrcPort();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -73630,7 +76666,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 srcPort_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -73678,7 +76713,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 dstPort_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -73689,7 +76723,6 @@ public final class ContextOuterClass {
              */
             public Builder clearDstPort() {
                 dstPort_ = getDefaultInstance().getDstPort();
-                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -73705,7 +76738,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 dstPort_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -73753,7 +76785,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 localPeerPort_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -73764,7 +76795,6 @@ public final class ContextOuterClass {
              */
             public Builder clearLocalPeerPort() {
                 localPeerPort_ = getDefaultInstance().getLocalPeerPort();
-                bitField0_ = (bitField0_ & ~0x00000008);
                 onChanged();
                 return this;
             }
@@ -73780,7 +76810,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 localPeerPort_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -73828,7 +76857,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 remotePeerPort_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -73839,7 +76867,6 @@ public final class ContextOuterClass {
              */
             public Builder clearRemotePeerPort() {
                 remotePeerPort_ = getDefaultInstance().getRemotePeerPort();
-                bitField0_ = (bitField0_ & ~0x00000010);
                 onChanged();
                 return this;
             }
@@ -73855,7 +76882,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 remotePeerPort_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -73863,9 +76889,9 @@ public final class ContextOuterClass {
             private com.google.protobuf.Internal.IntList cSlots_ = emptyIntList();
 
             private void ensureCSlotsIsMutable() {
-                if (!((bitField0_ & 0x00000020) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     cSlots_ = mutableCopy(cSlots_);
-                    bitField0_ |= 0x00000020;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -73874,7 +76900,7 @@ public final class ContextOuterClass {
              * @return A list containing the cSlots.
              */
             public java.util.List getCSlotsList() {
-                return ((bitField0_ & 0x00000020) != 0) ? java.util.Collections.unmodifiableList(cSlots_) : cSlots_;
+                return ((bitField0_ & 0x00000001) != 0) ? java.util.Collections.unmodifiableList(cSlots_) : cSlots_;
             }
 
             /**
@@ -73937,7 +76963,7 @@ public final class ContextOuterClass {
              */
             public Builder clearCSlots() {
                 cSlots_ = emptyIntList();
-                bitField0_ = (bitField0_ & ~0x00000020);
+                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -73945,9 +76971,9 @@ public final class ContextOuterClass {
             private com.google.protobuf.Internal.IntList lSlots_ = emptyIntList();
 
             private void ensureLSlotsIsMutable() {
-                if (!((bitField0_ & 0x00000040) != 0)) {
+                if (!((bitField0_ & 0x00000002) != 0)) {
                     lSlots_ = mutableCopy(lSlots_);
-                    bitField0_ |= 0x00000040;
+                    bitField0_ |= 0x00000002;
                 }
             }
 
@@ -73956,7 +76982,7 @@ public final class ContextOuterClass {
              * @return A list containing the lSlots.
              */
             public java.util.List getLSlotsList() {
-                return ((bitField0_ & 0x00000040) != 0) ? java.util.Collections.unmodifiableList(lSlots_) : lSlots_;
+                return ((bitField0_ & 0x00000002) != 0) ? java.util.Collections.unmodifiableList(lSlots_) : lSlots_;
             }
 
             /**
@@ -74019,7 +77045,7 @@ public final class ContextOuterClass {
              */
             public Builder clearLSlots() {
                 lSlots_ = emptyIntList();
-                bitField0_ = (bitField0_ & ~0x00000040);
+                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -74027,9 +77053,9 @@ public final class ContextOuterClass {
             private com.google.protobuf.Internal.IntList sSlots_ = emptyIntList();
 
             private void ensureSSlotsIsMutable() {
-                if (!((bitField0_ & 0x00000080) != 0)) {
+                if (!((bitField0_ & 0x00000004) != 0)) {
                     sSlots_ = mutableCopy(sSlots_);
-                    bitField0_ |= 0x00000080;
+                    bitField0_ |= 0x00000004;
                 }
             }
 
@@ -74038,7 +77064,7 @@ public final class ContextOuterClass {
              * @return A list containing the sSlots.
              */
             public java.util.List getSSlotsList() {
-                return ((bitField0_ & 0x00000080) != 0) ? java.util.Collections.unmodifiableList(sSlots_) : sSlots_;
+                return ((bitField0_ & 0x00000004) != 0) ? java.util.Collections.unmodifiableList(sSlots_) : sSlots_;
             }
 
             /**
@@ -74101,7 +77127,7 @@ public final class ContextOuterClass {
              */
             public Builder clearSSlots() {
                 sSlots_ = emptyIntList();
-                bitField0_ = (bitField0_ & ~0x00000080);
+                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -74124,7 +77150,6 @@ public final class ContextOuterClass {
              */
             public Builder setLength(float value) {
                 length_ = value;
-                bitField0_ |= 0x00000100;
                 onChanged();
                 return this;
             }
@@ -74134,7 +77159,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearLength() {
-                bitField0_ = (bitField0_ & ~0x00000100);
                 length_ = 0F;
                 onChanged();
                 return this;
@@ -74158,7 +77182,6 @@ public final class ContextOuterClass {
              */
             public Builder setUsed(boolean value) {
                 used_ = value;
-                bitField0_ |= 0x00000200;
                 onChanged();
                 return this;
             }
@@ -74168,7 +77191,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearUsed() {
-                bitField0_ = (bitField0_ & ~0x00000200);
                 used_ = false;
                 onChanged();
                 return this;
@@ -74183,7 +77205,7 @@ public final class ContextOuterClass {
              * @return Whether the fiberUuid field is set.
              */
             public boolean hasFiberUuid() {
-                return ((bitField0_ & 0x00000400) != 0);
+                return fiberUuidBuilder_ != null || fiberUuid_ != null;
             }
 
             /**
@@ -74207,11 +77229,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     fiberUuid_ = value;
+                    onChanged();
                 } else {
                     fiberUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000400;
-                onChanged();
                 return this;
             }
 
@@ -74221,11 +77242,10 @@ public final class ContextOuterClass {
             public Builder setFiberUuid(context.ContextOuterClass.FiberId.Builder builderForValue) {
                 if (fiberUuidBuilder_ == null) {
                     fiberUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     fiberUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000400;
-                onChanged();
                 return this;
             }
 
@@ -74234,16 +77254,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeFiberUuid(context.ContextOuterClass.FiberId value) {
                 if (fiberUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000400) != 0) && fiberUuid_ != null && fiberUuid_ != context.ContextOuterClass.FiberId.getDefaultInstance()) {
-                        getFiberUuidBuilder().mergeFrom(value);
+                    if (fiberUuid_ != null) {
+                        fiberUuid_ = context.ContextOuterClass.FiberId.newBuilder(fiberUuid_).mergeFrom(value).buildPartial();
                     } else {
                         fiberUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     fiberUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000400;
-                onChanged();
                 return this;
             }
 
@@ -74251,13 +77270,13 @@ public final class ContextOuterClass {
              * .context.FiberId fiber_uuid = 11;
              */
             public Builder clearFiberUuid() {
-                bitField0_ = (bitField0_ & ~0x00000400);
-                fiberUuid_ = null;
-                if (fiberUuidBuilder_ != null) {
-                    fiberUuidBuilder_.dispose();
+                if (fiberUuidBuilder_ == null) {
+                    fiberUuid_ = null;
+                    onChanged();
+                } else {
+                    fiberUuid_ = null;
                     fiberUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -74265,7 +77284,6 @@ public final class ContextOuterClass {
              * .context.FiberId fiber_uuid = 11;
              */
             public context.ContextOuterClass.FiberId.Builder getFiberUuidBuilder() {
-                bitField0_ |= 0x00000400;
                 onChanged();
                 return getFiberUuidFieldBuilder().getBuilder();
             }
@@ -74319,17 +77337,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Fiber parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Fiber(input, extensionRegistry);
             }
         };
 
@@ -74432,6 +77440,74 @@ public final class ContextOuterClass {
             return new OpticalLinkDetails();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private OpticalLinkDetails(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 13:
+                            {
+                                length_ = input.readFloat();
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                source_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                target_ = s;
+                                break;
+                            }
+                        case 34:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    fibers_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                fibers_.add(input.readMessage(context.ContextOuterClass.Fiber.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    fibers_ = java.util.Collections.unmodifiableList(fibers_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_OpticalLinkDetails_descriptor;
         }
@@ -74443,7 +77519,7 @@ public final class ContextOuterClass {
 
         public static final int LENGTH_FIELD_NUMBER = 1;
 
-        private float length_ = 0F;
+        private float length_;
 
         /**
          * float length = 1;
@@ -74456,8 +77532,7 @@ public final class ContextOuterClass {
 
         public static final int SOURCE_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object source_ = "";
+        private volatile java.lang.Object source_;
 
         /**
          * string source = 2;
@@ -74494,8 +77569,7 @@ public final class ContextOuterClass {
 
         public static final int TARGET_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object target_ = "";
+        private volatile java.lang.Object target_;
 
         /**
          * string target = 3;
@@ -74532,7 +77606,6 @@ public final class ContextOuterClass {
 
         public static final int FIBERS_FIELD_NUMBER = 4;
 
-        @SuppressWarnings("serial")
         private java.util.List fibers_;
 
         /**
@@ -74590,19 +77663,19 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (java.lang.Float.floatToRawIntBits(length_) != 0) {
+            if (length_ != 0F) {
                 output.writeFloat(1, length_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(source_)) {
+            if (!getSourceBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, source_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(target_)) {
+            if (!getTargetBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 3, target_);
             }
             for (int i = 0; i < fibers_.size(); i++) {
                 output.writeMessage(4, fibers_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -74611,19 +77684,19 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (java.lang.Float.floatToRawIntBits(length_) != 0) {
+            if (length_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, length_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(source_)) {
+            if (!getSourceBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, source_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(target_)) {
+            if (!getTargetBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, target_);
             }
             for (int i = 0; i < fibers_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, fibers_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -74645,7 +77718,7 @@ public final class ContextOuterClass {
                 return false;
             if (!getFibersList().equals(other.getFibersList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -74667,7 +77740,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + FIBERS_FIELD_NUMBER;
                 hash = (53 * hash) + getFibersList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -74761,26 +77834,32 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.OpticalLinkDetails.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getFibersFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 length_ = 0F;
                 source_ = "";
                 target_ = "";
                 if (fibersBuilder_ == null) {
                     fibers_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    fibers_ = null;
                     fibersBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000008);
                 return this;
             }
 
@@ -74806,37 +77885,51 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.OpticalLinkDetails buildPartial() {
                 context.ContextOuterClass.OpticalLinkDetails result = new context.ContextOuterClass.OpticalLinkDetails(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(context.ContextOuterClass.OpticalLinkDetails result) {
+                int from_bitField0_ = bitField0_;
+                result.length_ = length_;
+                result.source_ = source_;
+                result.target_ = target_;
                 if (fibersBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         fibers_ = java.util.Collections.unmodifiableList(fibers_);
-                        bitField0_ = (bitField0_ & ~0x00000008);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.fibers_ = fibers_;
                 } else {
                     result.fibers_ = fibersBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.OpticalLinkDetails result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.length_ = length_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.source_ = source_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.target_ = target_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -74857,19 +77950,17 @@ public final class ContextOuterClass {
                 }
                 if (!other.getSource().isEmpty()) {
                     source_ = other.source_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (!other.getTarget().isEmpty()) {
                     target_ = other.target_;
-                    bitField0_ |= 0x00000004;
                     onChanged();
                 }
                 if (fibersBuilder_ == null) {
                     if (!other.fibers_.isEmpty()) {
                         if (fibers_.isEmpty()) {
                             fibers_ = other.fibers_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureFibersIsMutable();
                             fibers_.addAll(other.fibers_);
@@ -74882,14 +77973,14 @@ public final class ContextOuterClass {
                             fibersBuilder_.dispose();
                             fibersBuilder_ = null;
                             fibers_ = other.fibers_;
-                            bitField0_ = (bitField0_ & ~0x00000008);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             fibersBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getFibersFieldBuilder() : null;
                         } else {
                             fibersBuilder_.addAllMessages(other.fibers_);
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -74901,68 +77992,17 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.OpticalLinkDetails parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 13:
-                                {
-                                    length_ = input.readFloat();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 13
-                            case 18:
-                                {
-                                    source_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    target_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    context.ContextOuterClass.Fiber m = input.readMessage(context.ContextOuterClass.Fiber.parser(), extensionRegistry);
-                                    if (fibersBuilder_ == null) {
-                                        ensureFibersIsMutable();
-                                        fibers_.add(m);
-                                    } else {
-                                        fibersBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 34
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.OpticalLinkDetails) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -74986,7 +78026,6 @@ public final class ContextOuterClass {
              */
             public Builder setLength(float value) {
                 length_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -74996,7 +78035,6 @@ public final class ContextOuterClass {
              * @return This builder for chaining.
              */
             public Builder clearLength() {
-                bitField0_ = (bitField0_ & ~0x00000001);
                 length_ = 0F;
                 onChanged();
                 return this;
@@ -75045,7 +78083,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 source_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -75056,7 +78093,6 @@ public final class ContextOuterClass {
              */
             public Builder clearSource() {
                 source_ = getDefaultInstance().getSource();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -75072,7 +78108,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 source_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -75120,7 +78155,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 target_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -75131,7 +78165,6 @@ public final class ContextOuterClass {
              */
             public Builder clearTarget() {
                 target_ = getDefaultInstance().getTarget();
-                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -75147,7 +78180,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 target_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -75155,9 +78187,9 @@ public final class ContextOuterClass {
             private java.util.List fibers_ = java.util.Collections.emptyList();
 
             private void ensureFibersIsMutable() {
-                if (!((bitField0_ & 0x00000008) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     fibers_ = new java.util.ArrayList(fibers_);
-                    bitField0_ |= 0x00000008;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -75309,7 +78341,7 @@ public final class ContextOuterClass {
             public Builder clearFibers() {
                 if (fibersBuilder_ == null) {
                     fibers_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000008);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     fibersBuilder_.clear();
@@ -75383,7 +78415,7 @@ public final class ContextOuterClass {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getFibersFieldBuilder() {
                 if (fibersBuilder_ == null) {
-                    fibersBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(fibers_, ((bitField0_ & 0x00000008) != 0), getParentForChildren(), isClean());
+                    fibersBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(fibers_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     fibers_ = null;
                 }
                 return fibersBuilder_;
@@ -75416,17 +78448,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public OpticalLinkDetails parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new OpticalLinkDetails(input, extensionRegistry);
             }
         };
 
@@ -75518,6 +78540,76 @@ public final class ContextOuterClass {
             return new OpticalLink();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private OpticalLink(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.OpticalLinkDetails.Builder subBuilder = null;
+                                if (details_ != null) {
+                                    subBuilder = details_.toBuilder();
+                                }
+                                details_ = input.readMessage(context.ContextOuterClass.OpticalLinkDetails.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(details_);
+                                    details_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 26:
+                            {
+                                context.ContextOuterClass.OpticalLinkId.Builder subBuilder = null;
+                                if (opticalLinkUuid_ != null) {
+                                    subBuilder = opticalLinkUuid_.toBuilder();
+                                }
+                                opticalLinkUuid_ = input.readMessage(context.ContextOuterClass.OpticalLinkId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(opticalLinkUuid_);
+                                    opticalLinkUuid_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return context.ContextOuterClass.internal_static_context_OpticalLink_descriptor;
         }
@@ -75529,8 +78621,7 @@ public final class ContextOuterClass {
 
         public static final int NAME_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 1;
@@ -75592,7 +78683,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.OpticalLinkDetailsOrBuilder getDetailsOrBuilder() {
-            return details_ == null ? context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance() : details_;
+            return getDetails();
         }
 
         public static final int OPTICAL_LINK_UUID_FIELD_NUMBER = 3;
@@ -75622,7 +78713,7 @@ public final class ContextOuterClass {
          */
         @java.lang.Override
         public context.ContextOuterClass.OpticalLinkIdOrBuilder getOpticalLinkUuidOrBuilder() {
-            return opticalLinkUuid_ == null ? context.ContextOuterClass.OpticalLinkId.getDefaultInstance() : opticalLinkUuid_;
+            return getOpticalLinkUuid();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -75640,7 +78731,7 @@ public final class ContextOuterClass {
 
         @java.lang.Override
         public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
             }
             if (details_ != null) {
@@ -75649,7 +78740,7 @@ public final class ContextOuterClass {
             if (opticalLinkUuid_ != null) {
                 output.writeMessage(3, getOpticalLinkUuid());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -75658,7 +78749,7 @@ public final class ContextOuterClass {
             if (size != -1)
                 return size;
             size = 0;
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
             }
             if (details_ != null) {
@@ -75667,7 +78758,7 @@ public final class ContextOuterClass {
             if (opticalLinkUuid_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getOpticalLinkUuid());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -75695,7 +78786,7 @@ public final class ContextOuterClass {
                 if (!getOpticalLinkUuid().equals(other.getOpticalLinkUuid()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -75717,7 +78808,7 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + OPTICAL_LINK_UUID_FIELD_NUMBER;
                 hash = (53 * hash) + getOpticalLinkUuid().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -75811,25 +78902,33 @@ public final class ContextOuterClass {
 
             // Construct using context.ContextOuterClass.OpticalLink.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 name_ = "";
-                details_ = null;
-                if (detailsBuilder_ != null) {
-                    detailsBuilder_.dispose();
+                if (detailsBuilder_ == null) {
+                    details_ = null;
+                } else {
+                    details_ = null;
                     detailsBuilder_ = null;
                 }
-                opticalLinkUuid_ = null;
-                if (opticalLinkUuidBuilder_ != null) {
-                    opticalLinkUuidBuilder_.dispose();
+                if (opticalLinkUuidBuilder_ == null) {
+                    opticalLinkUuid_ = null;
+                } else {
+                    opticalLinkUuid_ = null;
                     opticalLinkUuidBuilder_ = null;
                 }
                 return this;
@@ -75857,24 +78956,49 @@ public final class ContextOuterClass {
             @java.lang.Override
             public context.ContextOuterClass.OpticalLink buildPartial() {
                 context.ContextOuterClass.OpticalLink result = new context.ContextOuterClass.OpticalLink(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                result.name_ = name_;
+                if (detailsBuilder_ == null) {
+                    result.details_ = details_;
+                } else {
+                    result.details_ = detailsBuilder_.build();
+                }
+                if (opticalLinkUuidBuilder_ == null) {
+                    result.opticalLinkUuid_ = opticalLinkUuid_;
+                } else {
+                    result.opticalLinkUuid_ = opticalLinkUuidBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(context.ContextOuterClass.OpticalLink result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.details_ = detailsBuilder_ == null ? details_ : detailsBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.opticalLinkUuid_ = opticalLinkUuidBuilder_ == null ? opticalLinkUuid_ : opticalLinkUuidBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -75892,7 +79016,6 @@ public final class ContextOuterClass {
                     return this;
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000001;
                     onChanged();
                 }
                 if (other.hasDetails()) {
@@ -75901,7 +79024,7 @@ public final class ContextOuterClass {
                 if (other.hasOpticalLinkUuid()) {
                     mergeOpticalLinkUuid(other.getOpticalLinkUuid());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -75913,61 +79036,20 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                context.ContextOuterClass.OpticalLink parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getDetailsFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getOpticalLinkUuidFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (context.ContextOuterClass.OpticalLink) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private java.lang.Object name_ = "";
 
             /**
@@ -76011,7 +79093,6 @@ public final class ContextOuterClass {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -76022,7 +79103,6 @@ public final class ContextOuterClass {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000001);
                 onChanged();
                 return this;
             }
@@ -76038,7 +79118,6 @@ public final class ContextOuterClass {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -76052,7 +79131,7 @@ public final class ContextOuterClass {
              * @return Whether the details field is set.
              */
             public boolean hasDetails() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return detailsBuilder_ != null || details_ != null;
             }
 
             /**
@@ -76076,11 +79155,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     details_ = value;
+                    onChanged();
                 } else {
                     detailsBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -76090,11 +79168,10 @@ public final class ContextOuterClass {
             public Builder setDetails(context.ContextOuterClass.OpticalLinkDetails.Builder builderForValue) {
                 if (detailsBuilder_ == null) {
                     details_ = builderForValue.build();
+                    onChanged();
                 } else {
                     detailsBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -76103,16 +79180,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeDetails(context.ContextOuterClass.OpticalLinkDetails value) {
                 if (detailsBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && details_ != null && details_ != context.ContextOuterClass.OpticalLinkDetails.getDefaultInstance()) {
-                        getDetailsBuilder().mergeFrom(value);
+                    if (details_ != null) {
+                        details_ = context.ContextOuterClass.OpticalLinkDetails.newBuilder(details_).mergeFrom(value).buildPartial();
                     } else {
                         details_ = value;
                     }
+                    onChanged();
                 } else {
                     detailsBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -76120,13 +79196,13 @@ public final class ContextOuterClass {
              * .context.OpticalLinkDetails details = 2;
              */
             public Builder clearDetails() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                details_ = null;
-                if (detailsBuilder_ != null) {
-                    detailsBuilder_.dispose();
+                if (detailsBuilder_ == null) {
+                    details_ = null;
+                    onChanged();
+                } else {
+                    details_ = null;
                     detailsBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -76134,7 +79210,6 @@ public final class ContextOuterClass {
              * .context.OpticalLinkDetails details = 2;
              */
             public context.ContextOuterClass.OpticalLinkDetails.Builder getDetailsBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getDetailsFieldBuilder().getBuilder();
             }
@@ -76170,7 +79245,7 @@ public final class ContextOuterClass {
              * @return Whether the opticalLinkUuid field is set.
              */
             public boolean hasOpticalLinkUuid() {
-                return ((bitField0_ & 0x00000004) != 0);
+                return opticalLinkUuidBuilder_ != null || opticalLinkUuid_ != null;
             }
 
             /**
@@ -76194,11 +79269,10 @@ public final class ContextOuterClass {
                         throw new NullPointerException();
                     }
                     opticalLinkUuid_ = value;
+                    onChanged();
                 } else {
                     opticalLinkUuidBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -76208,11 +79282,10 @@ public final class ContextOuterClass {
             public Builder setOpticalLinkUuid(context.ContextOuterClass.OpticalLinkId.Builder builderForValue) {
                 if (opticalLinkUuidBuilder_ == null) {
                     opticalLinkUuid_ = builderForValue.build();
+                    onChanged();
                 } else {
                     opticalLinkUuidBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -76221,16 +79294,15 @@ public final class ContextOuterClass {
              */
             public Builder mergeOpticalLinkUuid(context.ContextOuterClass.OpticalLinkId value) {
                 if (opticalLinkUuidBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0) && opticalLinkUuid_ != null && opticalLinkUuid_ != context.ContextOuterClass.OpticalLinkId.getDefaultInstance()) {
-                        getOpticalLinkUuidBuilder().mergeFrom(value);
+                    if (opticalLinkUuid_ != null) {
+                        opticalLinkUuid_ = context.ContextOuterClass.OpticalLinkId.newBuilder(opticalLinkUuid_).mergeFrom(value).buildPartial();
                     } else {
                         opticalLinkUuid_ = value;
                     }
+                    onChanged();
                 } else {
                     opticalLinkUuidBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -76238,13 +79310,13 @@ public final class ContextOuterClass {
              * .context.OpticalLinkId optical_link_uuid = 3;
              */
             public Builder clearOpticalLinkUuid() {
-                bitField0_ = (bitField0_ & ~0x00000004);
-                opticalLinkUuid_ = null;
-                if (opticalLinkUuidBuilder_ != null) {
-                    opticalLinkUuidBuilder_.dispose();
+                if (opticalLinkUuidBuilder_ == null) {
+                    opticalLinkUuid_ = null;
+                    onChanged();
+                } else {
+                    opticalLinkUuid_ = null;
                     opticalLinkUuidBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -76252,7 +79324,6 @@ public final class ContextOuterClass {
              * .context.OpticalLinkId optical_link_uuid = 3;
              */
             public context.ContextOuterClass.OpticalLinkId.Builder getOpticalLinkUuidBuilder() {
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return getOpticalLinkUuidFieldBuilder().getBuilder();
             }
@@ -76306,17 +79377,7 @@ public final class ContextOuterClass {
 
             @java.lang.Override
             public OpticalLink parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new OpticalLink(input, extensionRegistry);
             }
         };
 
@@ -76690,7 +79751,7 @@ public final class ContextOuterClass {
     private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
 
     static {
-        java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\tacl.proto\032\026kpi" + "_sample_types.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004" + "uuid\030\001 \001(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001" + "(\001\"Z\n\005Event\022%\n\ttimestamp\030\001 \001(\0132\022.context" + ".Timestamp\022*\n\nevent_type\030\002 \001(\0162\026.context" + ".EventTypeEnum\"0\n\tContextId\022#\n\014context_u" + "uid\030\001 \001(\0132\r.context.Uuid\"\351\001\n\007Context\022&\n\n" + "context_id\030\001 \001(\0132\022.context.ContextId\022\014\n\004" + "name\030\002 \001(\t\022)\n\014topology_ids\030\003 \003(\0132\023.conte" + "xt.TopologyId\022\'\n\013service_ids\030\004 \003(\0132\022.con" + "text.ServiceId\022#\n\tslice_ids\030\005 \003(\0132\020.cont" + "ext.SliceId\022/\n\ncontroller\030\006 \001(\0132\033.contex" + "t.TeraFlowController\"8\n\rContextIdList\022\'\n" + "\013context_ids\030\001 \003(\0132\022.context.ContextId\"1" + "\n\013ContextList\022\"\n\010contexts\030\001 \003(\0132\020.contex" + "t.Context\"U\n\014ContextEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022&\n\ncontext_id\030\002 \001(\0132\022.c" + "ontext.ContextId\"Z\n\nTopologyId\022&\n\ncontex" + "t_id\030\001 \001(\0132\022.context.ContextId\022$\n\rtopolo" + "gy_uuid\030\002 \001(\0132\r.context.Uuid\"\214\001\n\010Topolog" + "y\022(\n\013topology_id\030\001 \001(\0132\023.context.Topolog" + "yId\022\014\n\004name\030\002 \001(\t\022%\n\ndevice_ids\030\003 \003(\0132\021." + "context.DeviceId\022!\n\010link_ids\030\004 \003(\0132\017.con" + "text.LinkId\"\211\001\n\017TopologyDetails\022(\n\013topol" + "ogy_id\030\001 \001(\0132\023.context.TopologyId\022\014\n\004nam" + "e\030\002 \001(\t\022 \n\007devices\030\003 \003(\0132\017.context.Devic" + "e\022\034\n\005links\030\004 \003(\0132\r.context.Link\";\n\016Topol" + "ogyIdList\022)\n\014topology_ids\030\001 \003(\0132\023.contex" + "t.TopologyId\"5\n\014TopologyList\022%\n\ntopologi" + "es\030\001 \003(\0132\021.context.Topology\"X\n\rTopologyE" + "vent\022\035\n\005event\030\001 \001(\0132\016.context.Event\022(\n\013t" + "opology_id\030\002 \001(\0132\023.context.TopologyId\".\n" + "\010DeviceId\022\"\n\013device_uuid\030\001 \001(\0132\r.context" + ".Uuid\"\372\002\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.co" + "ntext.DeviceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_t" + "ype\030\003 \001(\t\022,\n\rdevice_config\030\004 \001(\0132\025.conte" + "xt.DeviceConfig\022G\n\031device_operational_st" + "atus\030\005 \001(\0162$.context.DeviceOperationalSt" + "atusEnum\0221\n\016device_drivers\030\006 \003(\0162\031.conte" + "xt.DeviceDriverEnum\022+\n\020device_endpoints\030" + "\007 \003(\0132\021.context.EndPoint\022&\n\ncomponents\030\010" + " \003(\0132\022.context.Component\022(\n\rcontroller_i" + "d\030\t \001(\0132\021.context.DeviceId\"\311\001\n\tComponent" + "\022%\n\016component_uuid\030\001 \001(\0132\r.context.Uuid\022" + "\014\n\004name\030\002 \001(\t\022\014\n\004type\030\003 \001(\t\0226\n\nattribute" + "s\030\004 \003(\0132\".context.Component.AttributesEn" + "try\022\016\n\006parent\030\005 \001(\t\0321\n\017AttributesEntry\022\013" + "\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"9\n\014Device" + "Config\022)\n\014config_rules\030\001 \003(\0132\023.context.C" + "onfigRule\"5\n\014DeviceIdList\022%\n\ndevice_ids\030" + "\001 \003(\0132\021.context.DeviceId\".\n\nDeviceList\022 " + "\n\007devices\030\001 \003(\0132\017.context.Device\"\216\001\n\014Dev" + "iceFilter\022)\n\ndevice_ids\030\001 \001(\0132\025.context." + "DeviceIdList\022\031\n\021include_endpoints\030\002 \001(\010\022" + "\034\n\024include_config_rules\030\003 \001(\010\022\032\n\022include" + "_components\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005eve" + "nt\030\001 \001(\0132\016.context.Event\022$\n\tdevice_id\030\002 " + "\001(\0132\021.context.DeviceId\022,\n\rdevice_config\030" + "\003 \001(\0132\025.context.DeviceConfig\"*\n\006LinkId\022 " + "\n\tlink_uuid\030\001 \001(\0132\r.context.Uuid\"I\n\016Link" + "Attributes\022\033\n\023total_capacity_gbps\030\001 \001(\002\022" + "\032\n\022used_capacity_gbps\030\002 \001(\002\"\223\001\n\004Link\022 \n\007" + "link_id\030\001 \001(\0132\017.context.LinkId\022\014\n\004name\030\002" + " \001(\t\022.\n\021link_endpoint_ids\030\003 \003(\0132\023.contex" + "t.EndPointId\022+\n\nattributes\030\004 \001(\0132\027.conte" + "xt.LinkAttributes\"/\n\nLinkIdList\022!\n\010link_" + "ids\030\001 \003(\0132\017.context.LinkId\"(\n\010LinkList\022\034" + "\n\005links\030\001 \003(\0132\r.context.Link\"L\n\tLinkEven" + "t\022\035\n\005event\030\001 \001(\0132\016.context.Event\022 \n\007link" + "_id\030\002 \001(\0132\017.context.LinkId\"X\n\tServiceId\022" + "&\n\ncontext_id\030\001 \001(\0132\022.context.ContextId\022" + "#\n\014service_uuid\030\002 \001(\0132\r.context.Uuid\"\333\002\n" + "\007Service\022&\n\nservice_id\030\001 \001(\0132\022.context.S" + "erviceId\022\014\n\004name\030\002 \001(\t\022.\n\014service_type\030\003" + " \001(\0162\030.context.ServiceTypeEnum\0221\n\024servic" + "e_endpoint_ids\030\004 \003(\0132\023.context.EndPointI" + "d\0220\n\023service_constraints\030\005 \003(\0132\023.context" + ".Constraint\022.\n\016service_status\030\006 \001(\0132\026.co" + "ntext.ServiceStatus\022.\n\016service_config\030\007 " + "\001(\0132\026.context.ServiceConfig\022%\n\ttimestamp" + "\030\010 \001(\0132\022.context.Timestamp\"C\n\rServiceSta" + "tus\0222\n\016service_status\030\001 \001(\0162\032.context.Se" + "rviceStatusEnum\":\n\rServiceConfig\022)\n\014conf" + "ig_rules\030\001 \003(\0132\023.context.ConfigRule\"8\n\rS" + "erviceIdList\022\'\n\013service_ids\030\001 \003(\0132\022.cont" + "ext.ServiceId\"1\n\013ServiceList\022\"\n\010services" + "\030\001 \003(\0132\020.context.Service\"\225\001\n\rServiceFilt" + "er\022+\n\013service_ids\030\001 \001(\0132\026.context.Servic" + "eIdList\022\034\n\024include_endpoint_ids\030\002 \001(\010\022\033\n" + "\023include_constraints\030\003 \001(\010\022\034\n\024include_co" + "nfig_rules\030\004 \001(\010\"U\n\014ServiceEvent\022\035\n\005even" + "t\030\001 \001(\0132\016.context.Event\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\"T\n\007SliceId\022&\n\nco" + "ntext_id\030\001 \001(\0132\022.context.ContextId\022!\n\nsl" + "ice_uuid\030\002 \001(\0132\r.context.Uuid\"\240\003\n\005Slice\022" + "\"\n\010slice_id\030\001 \001(\0132\020.context.SliceId\022\014\n\004n" + "ame\030\002 \001(\t\022/\n\022slice_endpoint_ids\030\003 \003(\0132\023." + "context.EndPointId\022.\n\021slice_constraints\030" + "\004 \003(\0132\023.context.Constraint\022-\n\021slice_serv" + "ice_ids\030\005 \003(\0132\022.context.ServiceId\022,\n\022sli" + "ce_subslice_ids\030\006 \003(\0132\020.context.SliceId\022" + "*\n\014slice_status\030\007 \001(\0132\024.context.SliceSta" + "tus\022*\n\014slice_config\030\010 \001(\0132\024.context.Slic" + "eConfig\022(\n\013slice_owner\030\t \001(\0132\023.context.S" + "liceOwner\022%\n\ttimestamp\030\n \001(\0132\022.context.T" + "imestamp\"E\n\nSliceOwner\022!\n\nowner_uuid\030\001 \001" + "(\0132\r.context.Uuid\022\024\n\014owner_string\030\002 \001(\t\"" + "=\n\013SliceStatus\022.\n\014slice_status\030\001 \001(\0162\030.c" + "ontext.SliceStatusEnum\"8\n\013SliceConfig\022)\n" + "\014config_rules\030\001 \003(\0132\023.context.ConfigRule" + "\"2\n\013SliceIdList\022#\n\tslice_ids\030\001 \003(\0132\020.con" + "text.SliceId\"+\n\tSliceList\022\036\n\006slices\030\001 \003(" + "\0132\016.context.Slice\"\312\001\n\013SliceFilter\022\'\n\tsli" + "ce_ids\030\001 \001(\0132\024.context.SliceIdList\022\034\n\024in" + "clude_endpoint_ids\030\002 \001(\010\022\033\n\023include_cons" + "traints\030\003 \001(\010\022\033\n\023include_service_ids\030\004 \001" + "(\010\022\034\n\024include_subslice_ids\030\005 \001(\010\022\034\n\024incl" + "ude_config_rules\030\006 \001(\010\"O\n\nSliceEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022\"\n\010slice_id\030" + "\002 \001(\0132\020.context.SliceId\"6\n\014ConnectionId\022" + "&\n\017connection_uuid\030\001 \001(\0132\r.context.Uuid\"" + "2\n\025ConnectionSettings_L0\022\031\n\021lsp_symbolic" + "_name\030\001 \001(\t\"\236\001\n\025ConnectionSettings_L2\022\027\n" + "\017src_mac_address\030\001 \001(\t\022\027\n\017dst_mac_addres" + "s\030\002 \001(\t\022\022\n\nether_type\030\003 \001(\r\022\017\n\007vlan_id\030\004" + " \001(\r\022\022\n\nmpls_label\030\005 \001(\r\022\032\n\022mpls_traffic" + "_class\030\006 \001(\r\"t\n\025ConnectionSettings_L3\022\026\n" + "\016src_ip_address\030\001 \001(\t\022\026\n\016dst_ip_address\030" + "\002 \001(\t\022\014\n\004dscp\030\003 \001(\r\022\020\n\010protocol\030\004 \001(\r\022\013\n" + "\003ttl\030\005 \001(\r\"[\n\025ConnectionSettings_L4\022\020\n\010s" + "rc_port\030\001 \001(\r\022\020\n\010dst_port\030\002 \001(\r\022\021\n\ttcp_f" + "lags\030\003 \001(\r\022\013\n\003ttl\030\004 \001(\r\"\304\001\n\022ConnectionSe" + "ttings\022*\n\002l0\030\001 \001(\0132\036.context.ConnectionS" + "ettings_L0\022*\n\002l2\030\002 \001(\0132\036.context.Connect" + "ionSettings_L2\022*\n\002l3\030\003 \001(\0132\036.context.Con" + "nectionSettings_L3\022*\n\002l4\030\004 \001(\0132\036.context" + ".ConnectionSettings_L4\"\363\001\n\nConnection\022,\n" + "\rconnection_id\030\001 \001(\0132\025.context.Connectio" + "nId\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\0223\n\026path_hops_endpoint_ids\030\003 \003(\0132\023.co" + "ntext.EndPointId\022+\n\017sub_service_ids\030\004 \003(" + "\0132\022.context.ServiceId\022-\n\010settings\030\005 \001(\0132" + "\033.context.ConnectionSettings\"A\n\020Connecti" + "onIdList\022-\n\016connection_ids\030\001 \003(\0132\025.conte" + "xt.ConnectionId\":\n\016ConnectionList\022(\n\013con" + "nections\030\001 \003(\0132\023.context.Connection\"^\n\017C" + "onnectionEvent\022\035\n\005event\030\001 \001(\0132\016.context." + "Event\022,\n\rconnection_id\030\002 \001(\0132\025.context.C" + "onnectionId\"\202\001\n\nEndPointId\022(\n\013topology_i" + "d\030\001 \001(\0132\023.context.TopologyId\022$\n\tdevice_i" + "d\030\002 \001(\0132\021.context.DeviceId\022$\n\rendpoint_u" + "uid\030\003 \001(\0132\r.context.Uuid\"\302\001\n\010EndPoint\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "\014\n\004name\030\002 \001(\t\022\025\n\rendpoint_type\030\003 \001(\t\0229\n\020" + "kpi_sample_types\030\004 \003(\0162\037.kpi_sample_type" + "s.KpiSampleType\022,\n\021endpoint_location\030\005 \001" + "(\0132\021.context.Location\"{\n\014EndPointName\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "\023\n\013device_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 " + "\001(\t\022\025\n\rendpoint_type\030\004 \001(\t\";\n\016EndPointId" + "List\022)\n\014endpoint_ids\030\001 \003(\0132\023.context.End" + "PointId\"A\n\020EndPointNameList\022-\n\016endpoint_" + "names\030\001 \003(\0132\025.context.EndPointName\"A\n\021Co" + "nfigRule_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n" + "\016resource_value\030\002 \001(\t\"]\n\016ConfigRule_ACL\022" + "(\n\013endpoint_id\030\001 \001(\0132\023.context.EndPointI" + "d\022!\n\010rule_set\030\002 \001(\0132\017.acl.AclRuleSet\"\234\001\n" + "\nConfigRule\022)\n\006action\030\001 \001(\0162\031.context.Co" + "nfigActionEnum\022,\n\006custom\030\002 \001(\0132\032.context" + ".ConfigRule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.cont" + "ext.ConfigRule_ACLH\000B\r\n\013config_rule\"F\n\021C" + "onstraint_Custom\022\027\n\017constraint_type\030\001 \001(" + "\t\022\030\n\020constraint_value\030\002 \001(\t\"E\n\023Constrain" + "t_Schedule\022\027\n\017start_timestamp\030\001 \001(\002\022\025\n\rd" + "uration_days\030\002 \001(\002\"3\n\014GPS_Position\022\020\n\010la" + "titude\030\001 \001(\002\022\021\n\tlongitude\030\002 \001(\002\"W\n\010Locat" + "ion\022\020\n\006region\030\001 \001(\tH\000\022-\n\014gps_position\030\002 " + "\001(\0132\025.context.GPS_PositionH\000B\n\n\010location" + "\"l\n\033Constraint_EndPointLocation\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022#\n\010loc" + "ation\030\002 \001(\0132\021.context.Location\"Y\n\033Constr" + "aint_EndPointPriority\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022\020\n\010priority\030\002 \001(" + "\r\"0\n\026Constraint_SLA_Latency\022\026\n\016e2e_laten" + "cy_ms\030\001 \001(\002\"0\n\027Constraint_SLA_Capacity\022\025" + "\n\rcapacity_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_" + "Availability\022\032\n\022num_disjoint_paths\030\001 \001(\r" + "\022\022\n\nall_active\030\002 \001(\010\022\024\n\014availability\030\003 \001" + "(\002\"V\n\036Constraint_SLA_Isolation_level\0224\n\017" + "isolation_level\030\001 \003(\0162\033.context.Isolatio" + "nLevelEnum\"\242\001\n\025Constraint_Exclusions\022\024\n\014" + "is_permanent\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021" + ".context.DeviceId\022)\n\014endpoint_ids\030\003 \003(\0132" + "\023.context.EndPointId\022!\n\010link_ids\030\004 \003(\0132\017" + ".context.LinkId\"\333\004\n\nConstraint\022-\n\006action" + "\030\001 \001(\0162\035.context.ConstraintActionEnum\022,\n" + "\006custom\030\002 \001(\0132\032.context.Constraint_Custo" + "mH\000\0220\n\010schedule\030\003 \001(\0132\034.context.Constrai" + "nt_ScheduleH\000\022A\n\021endpoint_location\030\004 \001(\013" + "2$.context.Constraint_EndPointLocationH\000" + "\022A\n\021endpoint_priority\030\005 \001(\0132$.context.Co" + "nstraint_EndPointPriorityH\000\0228\n\014sla_capac" + "ity\030\006 \001(\0132 .context.Constraint_SLA_Capac" + "ityH\000\0226\n\013sla_latency\030\007 \001(\0132\037.context.Con" + "straint_SLA_LatencyH\000\022@\n\020sla_availabilit" + "y\030\010 \001(\0132$.context.Constraint_SLA_Availab" + "ilityH\000\022@\n\rsla_isolation\030\t \001(\0132\'.context" + ".Constraint_SLA_Isolation_levelH\000\0224\n\nexc" + "lusions\030\n \001(\0132\036.context.Constraint_Exclu" + "sionsH\000B\014\n\nconstraint\"^\n\022TeraFlowControl" + "ler\022&\n\ncontext_id\030\001 \001(\0132\022.context.Contex" + "tId\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n" + "\024AuthenticationResult\022&\n\ncontext_id\030\001 \001(" + "\0132\022.context.ContextId\022\025\n\rauthenticated\030\002" + " \001(\010\"-\n\017OpticalConfigId\022\032\n\022opticalconfig" + "_uuid\030\001 \001(\t\"S\n\rOpticalConfig\0222\n\020opticalc" + "onfig_id\030\001 \001(\0132\030.context.OpticalConfigId" + "\022\016\n\006config\030\002 \001(\t\"C\n\021OpticalConfigList\022.\n" + "\016opticalconfigs\030\001 \003(\0132\026.context.OpticalC" + "onfig\"9\n\rOpticalLinkId\022(\n\021optical_link_u" + "uid\030\001 \001(\0132\r.context.Uuid\",\n\007FiberId\022!\n\nf" + "iber_uuid\030\001 \001(\0132\r.context.Uuid\"\341\001\n\005Fiber" + "\022\n\n\002ID\030\n \001(\t\022\020\n\010src_port\030\001 \001(\t\022\020\n\010dst_po" + "rt\030\002 \001(\t\022\027\n\017local_peer_port\030\003 \001(\t\022\030\n\020rem" + "ote_peer_port\030\004 \001(\t\022\017\n\007c_slots\030\005 \003(\005\022\017\n\007" + "l_slots\030\006 \003(\005\022\017\n\007s_slots\030\007 \003(\005\022\016\n\006length" + "\030\010 \001(\002\022\014\n\004used\030\t \001(\010\022$\n\nfiber_uuid\030\013 \001(\013" + "2\020.context.FiberId\"d\n\022OpticalLinkDetails" + "\022\016\n\006length\030\001 \001(\002\022\016\n\006source\030\002 \001(\t\022\016\n\006targ" + "et\030\003 \001(\t\022\036\n\006fibers\030\004 \003(\0132\016.context.Fiber" + "\"|\n\013OpticalLink\022\014\n\004name\030\001 \001(\t\022,\n\007details" + "\030\002 \001(\0132\033.context.OpticalLinkDetails\0221\n\021o" + "ptical_link_uuid\030\003 \001(\0132\026.context.Optical" + "LinkId*j\n\rEventTypeEnum\022\027\n\023EVENTTYPE_UND" + "EFINED\020\000\022\024\n\020EVENTTYPE_CREATE\020\001\022\024\n\020EVENTT" + "YPE_UPDATE\020\002\022\024\n\020EVENTTYPE_REMOVE\020\003*\346\002\n\020D" + "eviceDriverEnum\022\032\n\026DEVICEDRIVER_UNDEFINE" + "D\020\000\022\033\n\027DEVICEDRIVER_OPENCONFIG\020\001\022\036\n\032DEVI" + "CEDRIVER_TRANSPORT_API\020\002\022\023\n\017DEVICEDRIVER" + "_P4\020\003\022&\n\"DEVICEDRIVER_IETF_NETWORK_TOPOL" + "OGY\020\004\022\033\n\027DEVICEDRIVER_ONF_TR_532\020\005\022\023\n\017DE" + "VICEDRIVER_XR\020\006\022\033\n\027DEVICEDRIVER_IETF_L2V" + "PN\020\007\022 \n\034DEVICEDRIVER_GNMI_OPENCONFIG\020\010\022\032" + "\n\026DEVICEDRIVER_FLEXSCALE\020\t\022\032\n\026DEVICEDRIV" + "ER_IETF_ACTN\020\n\022\023\n\017DEVICEDRIVER_OC\020\013*\217\001\n\033" + "DeviceOperationalStatusEnum\022%\n!DEVICEOPE" + "RATIONALSTATUS_UNDEFINED\020\000\022$\n DEVICEOPER" + "ATIONALSTATUS_DISABLED\020\001\022#\n\037DEVICEOPERAT" + "IONALSTATUS_ENABLED\020\002*\320\001\n\017ServiceTypeEnu" + "m\022\027\n\023SERVICETYPE_UNKNOWN\020\000\022\024\n\020SERVICETYP" + "E_L3NM\020\001\022\024\n\020SERVICETYPE_L2NM\020\002\022)\n%SERVIC" + "ETYPE_TAPI_CONNECTIVITY_SERVICE\020\003\022\022\n\016SER" + "VICETYPE_TE\020\004\022\023\n\017SERVICETYPE_E2E\020\005\022$\n SE" + "RVICETYPE_OPTICAL_CONNECTIVITY\020\006*\304\001\n\021Ser" + "viceStatusEnum\022\033\n\027SERVICESTATUS_UNDEFINE" + "D\020\000\022\031\n\025SERVICESTATUS_PLANNED\020\001\022\030\n\024SERVIC" + "ESTATUS_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UPDATI" + "NG\020\003\022!\n\035SERVICESTATUS_PENDING_REMOVAL\020\004\022" + "\036\n\032SERVICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017Slic" + "eStatusEnum\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027" + "\n\023SLICESTATUS_PLANNED\020\001\022\024\n\020SLICESTATUS_I" + "NIT\020\002\022\026\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLICEST" + "ATUS_DEINIT\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATE" + "D\020\005*]\n\020ConfigActionEnum\022\032\n\026CONFIGACTION_" + "UNDEFINED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CON" + "FIGACTION_DELETE\020\002*m\n\024ConstraintActionEn" + "um\022\036\n\032CONSTRAINTACTION_UNDEFINED\020\000\022\030\n\024CO" + "NSTRAINTACTION_SET\020\001\022\033\n\027CONSTRAINTACTION" + "_DELETE\020\002*\203\002\n\022IsolationLevelEnum\022\020\n\014NO_I" + "SOLATION\020\000\022\026\n\022PHYSICAL_ISOLATION\020\001\022\025\n\021LO" + "GICAL_ISOLATION\020\002\022\025\n\021PROCESS_ISOLATION\020\003" + "\022\035\n\031PHYSICAL_MEMORY_ISOLATION\020\004\022\036\n\032PHYSI" + "CAL_NETWORK_ISOLATION\020\005\022\036\n\032VIRTUAL_RESOU" + "RCE_ISOLATION\020\006\022\037\n\033NETWORK_FUNCTIONS_ISO" + "LATION\020\007\022\025\n\021SERVICE_ISOLATION\020\0102\246\031\n\016Cont" + "extService\022:\n\016ListContextIds\022\016.context.E" + "mpty\032\026.context.ContextIdList\"\000\0226\n\014ListCo" + "ntexts\022\016.context.Empty\032\024.context.Context" + "List\"\000\0224\n\nGetContext\022\022.context.ContextId" + "\032\020.context.Context\"\000\0224\n\nSetContext\022\020.con" + "text.Context\032\022.context.ContextId\"\000\0225\n\rRe" + "moveContext\022\022.context.ContextId\032\016.contex" + "t.Empty\"\000\022=\n\020GetContextEvents\022\016.context." + "Empty\032\025.context.ContextEvent\"\0000\001\022@\n\017List" + "TopologyIds\022\022.context.ContextId\032\027.contex" + "t.TopologyIdList\"\000\022=\n\016ListTopologies\022\022.c" + "ontext.ContextId\032\025.context.TopologyList\"" + "\000\0227\n\013GetTopology\022\023.context.TopologyId\032\021." + "context.Topology\"\000\022E\n\022GetTopologyDetails" + "\022\023.context.TopologyId\032\030.context.Topology" + "Details\"\000\0227\n\013SetTopology\022\021.context.Topol" + "ogy\032\023.context.TopologyId\"\000\0227\n\016RemoveTopo" + "logy\022\023.context.TopologyId\032\016.context.Empt" + "y\"\000\022?\n\021GetTopologyEvents\022\016.context.Empty" + "\032\026.context.TopologyEvent\"\0000\001\0228\n\rListDevi" + "ceIds\022\016.context.Empty\032\025.context.DeviceId" + "List\"\000\0224\n\013ListDevices\022\016.context.Empty\032\023." + "context.DeviceList\"\000\0221\n\tGetDevice\022\021.cont" + "ext.DeviceId\032\017.context.Device\"\000\0221\n\tSetDe" + "vice\022\017.context.Device\032\021.context.DeviceId" + "\"\000\0223\n\014RemoveDevice\022\021.context.DeviceId\032\016." + "context.Empty\"\000\022;\n\017GetDeviceEvents\022\016.con" + "text.Empty\032\024.context.DeviceEvent\"\0000\001\022<\n\014" + "SelectDevice\022\025.context.DeviceFilter\032\023.co" + "ntext.DeviceList\"\000\022I\n\021ListEndPointNames\022" + "\027.context.EndPointIdList\032\031.context.EndPo" + "intNameList\"\000\0224\n\013ListLinkIds\022\016.context.E" + "mpty\032\023.context.LinkIdList\"\000\0220\n\tListLinks" + "\022\016.context.Empty\032\021.context.LinkList\"\000\022+\n" + "\007GetLink\022\017.context.LinkId\032\r.context.Link" + "\"\000\022+\n\007SetLink\022\r.context.Link\032\017.context.L" + "inkId\"\000\022/\n\nRemoveLink\022\017.context.LinkId\032\016" + ".context.Empty\"\000\0227\n\rGetLinkEvents\022\016.cont" + "ext.Empty\032\022.context.LinkEvent\"\0000\001\022>\n\016Lis" + "tServiceIds\022\022.context.ContextId\032\026.contex" + "t.ServiceIdList\"\000\022:\n\014ListServices\022\022.cont" + "ext.ContextId\032\024.context.ServiceList\"\000\0224\n" + "\nGetService\022\022.context.ServiceId\032\020.contex" + "t.Service\"\000\0224\n\nSetService\022\020.context.Serv" + "ice\032\022.context.ServiceId\"\000\0226\n\014UnsetServic" + "e\022\020.context.Service\032\022.context.ServiceId\"" + "\000\0225\n\rRemoveService\022\022.context.ServiceId\032\016" + ".context.Empty\"\000\022=\n\020GetServiceEvents\022\016.c" + "ontext.Empty\032\025.context.ServiceEvent\"\0000\001\022" + "?\n\rSelectService\022\026.context.ServiceFilter" + "\032\024.context.ServiceList\"\000\022:\n\014ListSliceIds" + "\022\022.context.ContextId\032\024.context.SliceIdLi" + "st\"\000\0226\n\nListSlices\022\022.context.ContextId\032\022" + ".context.SliceList\"\000\022.\n\010GetSlice\022\020.conte" + "xt.SliceId\032\016.context.Slice\"\000\022.\n\010SetSlice" + "\022\016.context.Slice\032\020.context.SliceId\"\000\0220\n\n" + "UnsetSlice\022\016.context.Slice\032\020.context.Sli" + "ceId\"\000\0221\n\013RemoveSlice\022\020.context.SliceId\032" + "\016.context.Empty\"\000\0229\n\016GetSliceEvents\022\016.co" + "ntext.Empty\032\023.context.SliceEvent\"\0000\001\0229\n\013" + "SelectSlice\022\024.context.SliceFilter\032\022.cont" + "ext.SliceList\"\000\022D\n\021ListConnectionIds\022\022.c" + "ontext.ServiceId\032\031.context.ConnectionIdL" + "ist\"\000\022@\n\017ListConnections\022\022.context.Servi" + "ceId\032\027.context.ConnectionList\"\000\022=\n\rGetCo" + "nnection\022\025.context.ConnectionId\032\023.contex" + "t.Connection\"\000\022=\n\rSetConnection\022\023.contex" + "t.Connection\032\025.context.ConnectionId\"\000\022;\n" + "\020RemoveConnection\022\025.context.ConnectionId" + "\032\016.context.Empty\"\000\022C\n\023GetConnectionEvent" + "s\022\016.context.Empty\032\030.context.ConnectionEv" + "ent\"\0000\001\022@\n\020GetOpticalConfig\022\016.context.Em" + "pty\032\032.context.OpticalConfigList\"\000\022F\n\020Set" + "OpticalConfig\022\026.context.OpticalConfig\032\030." + "context.OpticalConfigId\"\000\022I\n\023SelectOptic" + "alConfig\022\030.context.OpticalConfigId\032\026.con" + "text.OpticalConfig\"\000\0228\n\016SetOpticalLink\022\024" + ".context.OpticalLink\032\016.context.Empty\"\000\022@" + "\n\016GetOpticalLink\022\026.context.OpticalLinkId" + "\032\024.context.OpticalLink\"\000\022.\n\010GetFiber\022\020.c" + "ontext.FiberId\032\016.context.Fiber\"\000b\006proto3" };
+        java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\tacl.proto\032\026kpi" + "_sample_types.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004" + "uuid\030\001 \001(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001" + "(\001\"Z\n\005Event\022%\n\ttimestamp\030\001 \001(\0132\022.context" + ".Timestamp\022*\n\nevent_type\030\002 \001(\0162\026.context" + ".EventTypeEnum\"0\n\tContextId\022#\n\014context_u" + "uid\030\001 \001(\0132\r.context.Uuid\"\351\001\n\007Context\022&\n\n" + "context_id\030\001 \001(\0132\022.context.ContextId\022\014\n\004" + "name\030\002 \001(\t\022)\n\014topology_ids\030\003 \003(\0132\023.conte" + "xt.TopologyId\022\'\n\013service_ids\030\004 \003(\0132\022.con" + "text.ServiceId\022#\n\tslice_ids\030\005 \003(\0132\020.cont" + "ext.SliceId\022/\n\ncontroller\030\006 \001(\0132\033.contex" + "t.TeraFlowController\"8\n\rContextIdList\022\'\n" + "\013context_ids\030\001 \003(\0132\022.context.ContextId\"1" + "\n\013ContextList\022\"\n\010contexts\030\001 \003(\0132\020.contex" + "t.Context\"U\n\014ContextEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022&\n\ncontext_id\030\002 \001(\0132\022.c" + "ontext.ContextId\"Z\n\nTopologyId\022&\n\ncontex" + "t_id\030\001 \001(\0132\022.context.ContextId\022$\n\rtopolo" + "gy_uuid\030\002 \001(\0132\r.context.Uuid\"\214\001\n\010Topolog" + "y\022(\n\013topology_id\030\001 \001(\0132\023.context.Topolog" + "yId\022\014\n\004name\030\002 \001(\t\022%\n\ndevice_ids\030\003 \003(\0132\021." + "context.DeviceId\022!\n\010link_ids\030\004 \003(\0132\017.con" + "text.LinkId\"\211\001\n\017TopologyDetails\022(\n\013topol" + "ogy_id\030\001 \001(\0132\023.context.TopologyId\022\014\n\004nam" + "e\030\002 \001(\t\022 \n\007devices\030\003 \003(\0132\017.context.Devic" + "e\022\034\n\005links\030\004 \003(\0132\r.context.Link\";\n\016Topol" + "ogyIdList\022)\n\014topology_ids\030\001 \003(\0132\023.contex" + "t.TopologyId\"5\n\014TopologyList\022%\n\ntopologi" + "es\030\001 \003(\0132\021.context.Topology\"X\n\rTopologyE" + "vent\022\035\n\005event\030\001 \001(\0132\016.context.Event\022(\n\013t" + "opology_id\030\002 \001(\0132\023.context.TopologyId\".\n" + "\010DeviceId\022\"\n\013device_uuid\030\001 \001(\0132\r.context" + ".Uuid\"\372\002\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.co" + "ntext.DeviceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_t" + "ype\030\003 \001(\t\022,\n\rdevice_config\030\004 \001(\0132\025.conte" + "xt.DeviceConfig\022G\n\031device_operational_st" + "atus\030\005 \001(\0162$.context.DeviceOperationalSt" + "atusEnum\0221\n\016device_drivers\030\006 \003(\0162\031.conte" + "xt.DeviceDriverEnum\022+\n\020device_endpoints\030" + "\007 \003(\0132\021.context.EndPoint\022&\n\ncomponents\030\010" + " \003(\0132\022.context.Component\022(\n\rcontroller_i" + "d\030\t \001(\0132\021.context.DeviceId\"\311\001\n\tComponent" + "\022%\n\016component_uuid\030\001 \001(\0132\r.context.Uuid\022" + "\014\n\004name\030\002 \001(\t\022\014\n\004type\030\003 \001(\t\0226\n\nattribute" + "s\030\004 \003(\0132\".context.Component.AttributesEn" + "try\022\016\n\006parent\030\005 \001(\t\0321\n\017AttributesEntry\022\013" + "\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"9\n\014Device" + "Config\022)\n\014config_rules\030\001 \003(\0132\023.context.C" + "onfigRule\"5\n\014DeviceIdList\022%\n\ndevice_ids\030" + "\001 \003(\0132\021.context.DeviceId\".\n\nDeviceList\022 " + "\n\007devices\030\001 \003(\0132\017.context.Device\"\216\001\n\014Dev" + "iceFilter\022)\n\ndevice_ids\030\001 \001(\0132\025.context." + "DeviceIdList\022\031\n\021include_endpoints\030\002 \001(\010\022" + "\034\n\024include_config_rules\030\003 \001(\010\022\032\n\022include" + "_components\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005eve" + "nt\030\001 \001(\0132\016.context.Event\022$\n\tdevice_id\030\002 " + "\001(\0132\021.context.DeviceId\022,\n\rdevice_config\030" + "\003 \001(\0132\025.context.DeviceConfig\"*\n\006LinkId\022 " + "\n\tlink_uuid\030\001 \001(\0132\r.context.Uuid\"I\n\016Link" + "Attributes\022\033\n\023total_capacity_gbps\030\001 \001(\002\022" + "\032\n\022used_capacity_gbps\030\002 \001(\002\"\223\001\n\004Link\022 \n\007" + "link_id\030\001 \001(\0132\017.context.LinkId\022\014\n\004name\030\002" + " \001(\t\022.\n\021link_endpoint_ids\030\003 \003(\0132\023.contex" + "t.EndPointId\022+\n\nattributes\030\004 \001(\0132\027.conte" + "xt.LinkAttributes\"/\n\nLinkIdList\022!\n\010link_" + "ids\030\001 \003(\0132\017.context.LinkId\"(\n\010LinkList\022\034" + "\n\005links\030\001 \003(\0132\r.context.Link\"L\n\tLinkEven" + "t\022\035\n\005event\030\001 \001(\0132\016.context.Event\022 \n\007link" + "_id\030\002 \001(\0132\017.context.LinkId\"X\n\tServiceId\022" + "&\n\ncontext_id\030\001 \001(\0132\022.context.ContextId\022" + "#\n\014service_uuid\030\002 \001(\0132\r.context.Uuid\"\333\002\n" + "\007Service\022&\n\nservice_id\030\001 \001(\0132\022.context.S" + "erviceId\022\014\n\004name\030\002 \001(\t\022.\n\014service_type\030\003" + " \001(\0162\030.context.ServiceTypeEnum\0221\n\024servic" + "e_endpoint_ids\030\004 \003(\0132\023.context.EndPointI" + "d\0220\n\023service_constraints\030\005 \003(\0132\023.context" + ".Constraint\022.\n\016service_status\030\006 \001(\0132\026.co" + "ntext.ServiceStatus\022.\n\016service_config\030\007 " + "\001(\0132\026.context.ServiceConfig\022%\n\ttimestamp" + "\030\010 \001(\0132\022.context.Timestamp\"C\n\rServiceSta" + "tus\0222\n\016service_status\030\001 \001(\0162\032.context.Se" + "rviceStatusEnum\":\n\rServiceConfig\022)\n\014conf" + "ig_rules\030\001 \003(\0132\023.context.ConfigRule\"8\n\rS" + "erviceIdList\022\'\n\013service_ids\030\001 \003(\0132\022.cont" + "ext.ServiceId\"1\n\013ServiceList\022\"\n\010services" + "\030\001 \003(\0132\020.context.Service\"\225\001\n\rServiceFilt" + "er\022+\n\013service_ids\030\001 \001(\0132\026.context.Servic" + "eIdList\022\034\n\024include_endpoint_ids\030\002 \001(\010\022\033\n" + "\023include_constraints\030\003 \001(\010\022\034\n\024include_co" + "nfig_rules\030\004 \001(\010\"U\n\014ServiceEvent\022\035\n\005even" + "t\030\001 \001(\0132\016.context.Event\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\"T\n\007SliceId\022&\n\nco" + "ntext_id\030\001 \001(\0132\022.context.ContextId\022!\n\nsl" + "ice_uuid\030\002 \001(\0132\r.context.Uuid\"\240\003\n\005Slice\022" + "\"\n\010slice_id\030\001 \001(\0132\020.context.SliceId\022\014\n\004n" + "ame\030\002 \001(\t\022/\n\022slice_endpoint_ids\030\003 \003(\0132\023." + "context.EndPointId\022.\n\021slice_constraints\030" + "\004 \003(\0132\023.context.Constraint\022-\n\021slice_serv" + "ice_ids\030\005 \003(\0132\022.context.ServiceId\022,\n\022sli" + "ce_subslice_ids\030\006 \003(\0132\020.context.SliceId\022" + "*\n\014slice_status\030\007 \001(\0132\024.context.SliceSta" + "tus\022*\n\014slice_config\030\010 \001(\0132\024.context.Slic" + "eConfig\022(\n\013slice_owner\030\t \001(\0132\023.context.S" + "liceOwner\022%\n\ttimestamp\030\n \001(\0132\022.context.T" + "imestamp\"E\n\nSliceOwner\022!\n\nowner_uuid\030\001 \001" + "(\0132\r.context.Uuid\022\024\n\014owner_string\030\002 \001(\t\"" + "=\n\013SliceStatus\022.\n\014slice_status\030\001 \001(\0162\030.c" + "ontext.SliceStatusEnum\"8\n\013SliceConfig\022)\n" + "\014config_rules\030\001 \003(\0132\023.context.ConfigRule" + "\"2\n\013SliceIdList\022#\n\tslice_ids\030\001 \003(\0132\020.con" + "text.SliceId\"+\n\tSliceList\022\036\n\006slices\030\001 \003(" + "\0132\016.context.Slice\"\312\001\n\013SliceFilter\022\'\n\tsli" + "ce_ids\030\001 \001(\0132\024.context.SliceIdList\022\034\n\024in" + "clude_endpoint_ids\030\002 \001(\010\022\033\n\023include_cons" + "traints\030\003 \001(\010\022\033\n\023include_service_ids\030\004 \001" + "(\010\022\034\n\024include_subslice_ids\030\005 \001(\010\022\034\n\024incl" + "ude_config_rules\030\006 \001(\010\"O\n\nSliceEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022\"\n\010slice_id\030" + "\002 \001(\0132\020.context.SliceId\"6\n\014ConnectionId\022" + "&\n\017connection_uuid\030\001 \001(\0132\r.context.Uuid\"" + "2\n\025ConnectionSettings_L0\022\031\n\021lsp_symbolic" + "_name\030\001 \001(\t\"\236\001\n\025ConnectionSettings_L2\022\027\n" + "\017src_mac_address\030\001 \001(\t\022\027\n\017dst_mac_addres" + "s\030\002 \001(\t\022\022\n\nether_type\030\003 \001(\r\022\017\n\007vlan_id\030\004" + " \001(\r\022\022\n\nmpls_label\030\005 \001(\r\022\032\n\022mpls_traffic" + "_class\030\006 \001(\r\"t\n\025ConnectionSettings_L3\022\026\n" + "\016src_ip_address\030\001 \001(\t\022\026\n\016dst_ip_address\030" + "\002 \001(\t\022\014\n\004dscp\030\003 \001(\r\022\020\n\010protocol\030\004 \001(\r\022\013\n" + "\003ttl\030\005 \001(\r\"[\n\025ConnectionSettings_L4\022\020\n\010s" + "rc_port\030\001 \001(\r\022\020\n\010dst_port\030\002 \001(\r\022\021\n\ttcp_f" + "lags\030\003 \001(\r\022\013\n\003ttl\030\004 \001(\r\"\304\001\n\022ConnectionSe" + "ttings\022*\n\002l0\030\001 \001(\0132\036.context.ConnectionS" + "ettings_L0\022*\n\002l2\030\002 \001(\0132\036.context.Connect" + "ionSettings_L2\022*\n\002l3\030\003 \001(\0132\036.context.Con" + "nectionSettings_L3\022*\n\002l4\030\004 \001(\0132\036.context" + ".ConnectionSettings_L4\"\363\001\n\nConnection\022,\n" + "\rconnection_id\030\001 \001(\0132\025.context.Connectio" + "nId\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\0223\n\026path_hops_endpoint_ids\030\003 \003(\0132\023.co" + "ntext.EndPointId\022+\n\017sub_service_ids\030\004 \003(" + "\0132\022.context.ServiceId\022-\n\010settings\030\005 \001(\0132" + "\033.context.ConnectionSettings\"A\n\020Connecti" + "onIdList\022-\n\016connection_ids\030\001 \003(\0132\025.conte" + "xt.ConnectionId\":\n\016ConnectionList\022(\n\013con" + "nections\030\001 \003(\0132\023.context.Connection\"^\n\017C" + "onnectionEvent\022\035\n\005event\030\001 \001(\0132\016.context." + "Event\022,\n\rconnection_id\030\002 \001(\0132\025.context.C" + "onnectionId\"\202\001\n\nEndPointId\022(\n\013topology_i" + "d\030\001 \001(\0132\023.context.TopologyId\022$\n\tdevice_i" + "d\030\002 \001(\0132\021.context.DeviceId\022$\n\rendpoint_u" + "uid\030\003 \001(\0132\r.context.Uuid\"\302\001\n\010EndPoint\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "\014\n\004name\030\002 \001(\t\022\025\n\rendpoint_type\030\003 \001(\t\0229\n\020" + "kpi_sample_types\030\004 \003(\0162\037.kpi_sample_type" + "s.KpiSampleType\022,\n\021endpoint_location\030\005 \001" + "(\0132\021.context.Location\"{\n\014EndPointName\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "\023\n\013device_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 " + "\001(\t\022\025\n\rendpoint_type\030\004 \001(\t\";\n\016EndPointId" + "List\022)\n\014endpoint_ids\030\001 \003(\0132\023.context.End" + "PointId\"A\n\020EndPointNameList\022-\n\016endpoint_" + "names\030\001 \003(\0132\025.context.EndPointName\"A\n\021Co" + "nfigRule_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n" + "\016resource_value\030\002 \001(\t\"]\n\016ConfigRule_ACL\022" + "(\n\013endpoint_id\030\001 \001(\0132\023.context.EndPointI" + "d\022!\n\010rule_set\030\002 \001(\0132\017.acl.AclRuleSet\"\234\001\n" + "\nConfigRule\022)\n\006action\030\001 \001(\0162\031.context.Co" + "nfigActionEnum\022,\n\006custom\030\002 \001(\0132\032.context" + ".ConfigRule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.cont" + "ext.ConfigRule_ACLH\000B\r\n\013config_rule\"F\n\021C" + "onstraint_Custom\022\027\n\017constraint_type\030\001 \001(" + "\t\022\030\n\020constraint_value\030\002 \001(\t\"E\n\023Constrain" + "t_Schedule\022\027\n\017start_timestamp\030\001 \001(\002\022\025\n\rd" + "uration_days\030\002 \001(\002\"3\n\014GPS_Position\022\020\n\010la" + "titude\030\001 \001(\002\022\021\n\tlongitude\030\002 \001(\002\"W\n\010Locat" + "ion\022\020\n\006region\030\001 \001(\tH\000\022-\n\014gps_position\030\002 " + "\001(\0132\025.context.GPS_PositionH\000B\n\n\010location" + "\"l\n\033Constraint_EndPointLocation\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022#\n\010loc" + "ation\030\002 \001(\0132\021.context.Location\"Y\n\033Constr" + "aint_EndPointPriority\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022\020\n\010priority\030\002 \001(" + "\r\"0\n\026Constraint_SLA_Latency\022\026\n\016e2e_laten" + "cy_ms\030\001 \001(\002\"0\n\027Constraint_SLA_Capacity\022\025" + "\n\rcapacity_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_" + "Availability\022\032\n\022num_disjoint_paths\030\001 \001(\r" + "\022\022\n\nall_active\030\002 \001(\010\022\024\n\014availability\030\003 \001" + "(\002\"V\n\036Constraint_SLA_Isolation_level\0224\n\017" + "isolation_level\030\001 \003(\0162\033.context.Isolatio" + "nLevelEnum\"\242\001\n\025Constraint_Exclusions\022\024\n\014" + "is_permanent\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021" + ".context.DeviceId\022)\n\014endpoint_ids\030\003 \003(\0132" + "\023.context.EndPointId\022!\n\010link_ids\030\004 \003(\0132\017" + ".context.LinkId\"\333\004\n\nConstraint\022-\n\006action" + "\030\001 \001(\0162\035.context.ConstraintActionEnum\022,\n" + "\006custom\030\002 \001(\0132\032.context.Constraint_Custo" + "mH\000\0220\n\010schedule\030\003 \001(\0132\034.context.Constrai" + "nt_ScheduleH\000\022A\n\021endpoint_location\030\004 \001(\013" + "2$.context.Constraint_EndPointLocationH\000" + "\022A\n\021endpoint_priority\030\005 \001(\0132$.context.Co" + "nstraint_EndPointPriorityH\000\0228\n\014sla_capac" + "ity\030\006 \001(\0132 .context.Constraint_SLA_Capac" + "ityH\000\0226\n\013sla_latency\030\007 \001(\0132\037.context.Con" + "straint_SLA_LatencyH\000\022@\n\020sla_availabilit" + "y\030\010 \001(\0132$.context.Constraint_SLA_Availab" + "ilityH\000\022@\n\rsla_isolation\030\t \001(\0132\'.context" + ".Constraint_SLA_Isolation_levelH\000\0224\n\nexc" + "lusions\030\n \001(\0132\036.context.Constraint_Exclu" + "sionsH\000B\014\n\nconstraint\"^\n\022TeraFlowControl" + "ler\022&\n\ncontext_id\030\001 \001(\0132\022.context.Contex" + "tId\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n" + "\024AuthenticationResult\022&\n\ncontext_id\030\001 \001(" + "\0132\022.context.ContextId\022\025\n\rauthenticated\030\002" + " \001(\010\"-\n\017OpticalConfigId\022\032\n\022opticalconfig" + "_uuid\030\001 \001(\t\"S\n\rOpticalConfig\0222\n\020opticalc" + "onfig_id\030\001 \001(\0132\030.context.OpticalConfigId" + "\022\016\n\006config\030\002 \001(\t\"C\n\021OpticalConfigList\022.\n" + "\016opticalconfigs\030\001 \003(\0132\026.context.OpticalC" + "onfig\"9\n\rOpticalLinkId\022(\n\021optical_link_u" + "uid\030\001 \001(\0132\r.context.Uuid\",\n\007FiberId\022!\n\nf" + "iber_uuid\030\001 \001(\0132\r.context.Uuid\"\341\001\n\005Fiber" + "\022\n\n\002ID\030\n \001(\t\022\020\n\010src_port\030\001 \001(\t\022\020\n\010dst_po" + "rt\030\002 \001(\t\022\027\n\017local_peer_port\030\003 \001(\t\022\030\n\020rem" + "ote_peer_port\030\004 \001(\t\022\017\n\007c_slots\030\005 \003(\005\022\017\n\007" + "l_slots\030\006 \003(\005\022\017\n\007s_slots\030\007 \003(\005\022\016\n\006length" + "\030\010 \001(\002\022\014\n\004used\030\t \001(\010\022$\n\nfiber_uuid\030\013 \001(\013" + "2\020.context.FiberId\"d\n\022OpticalLinkDetails" + "\022\016\n\006length\030\001 \001(\002\022\016\n\006source\030\002 \001(\t\022\016\n\006targ" + "et\030\003 \001(\t\022\036\n\006fibers\030\004 \003(\0132\016.context.Fiber" + "\"|\n\013OpticalLink\022\014\n\004name\030\001 \001(\t\022,\n\007details" + "\030\002 \001(\0132\033.context.OpticalLinkDetails\0221\n\021o" + "ptical_link_uuid\030\003 \001(\0132\026.context.Optical" + "LinkId*j\n\rEventTypeEnum\022\027\n\023EVENTTYPE_UND" + "EFINED\020\000\022\024\n\020EVENTTYPE_CREATE\020\001\022\024\n\020EVENTT" + "YPE_UPDATE\020\002\022\024\n\020EVENTTYPE_REMOVE\020\003*\350\002\n\020D" + "eviceDriverEnum\022\032\n\026DEVICEDRIVER_UNDEFINE" + "D\020\000\022\033\n\027DEVICEDRIVER_OPENCONFIG\020\001\022\036\n\032DEVI" + "CEDRIVER_TRANSPORT_API\020\002\022\023\n\017DEVICEDRIVER" + "_P4\020\003\022&\n\"DEVICEDRIVER_IETF_NETWORK_TOPOL" + "OGY\020\004\022\033\n\027DEVICEDRIVER_ONF_TR_532\020\005\022\023\n\017DE" + "VICEDRIVER_XR\020\006\022\033\n\027DEVICEDRIVER_IETF_L2V" + "PN\020\007\022 \n\034DEVICEDRIVER_GNMI_OPENCONFIG\020\010\022\034" + "\n\030DEVICEDRIVER_OPTICAL_TFS\020\t\022\032\n\026DEVICEDR" + "IVER_IETF_ACTN\020\n\022\023\n\017DEVICEDRIVER_OC\020\013*\217\001" + "\n\033DeviceOperationalStatusEnum\022%\n!DEVICEO" + "PERATIONALSTATUS_UNDEFINED\020\000\022$\n DEVICEOP" + "ERATIONALSTATUS_DISABLED\020\001\022#\n\037DEVICEOPER" + "ATIONALSTATUS_ENABLED\020\002*\320\001\n\017ServiceTypeE" + "num\022\027\n\023SERVICETYPE_UNKNOWN\020\000\022\024\n\020SERVICET" + "YPE_L3NM\020\001\022\024\n\020SERVICETYPE_L2NM\020\002\022)\n%SERV" + "ICETYPE_TAPI_CONNECTIVITY_SERVICE\020\003\022\022\n\016S" + "ERVICETYPE_TE\020\004\022\023\n\017SERVICETYPE_E2E\020\005\022$\n " + "SERVICETYPE_OPTICAL_CONNECTIVITY\020\006*\304\001\n\021S" + "erviceStatusEnum\022\033\n\027SERVICESTATUS_UNDEFI" + "NED\020\000\022\031\n\025SERVICESTATUS_PLANNED\020\001\022\030\n\024SERV" + "ICESTATUS_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UPDA" + "TING\020\003\022!\n\035SERVICESTATUS_PENDING_REMOVAL\020" + "\004\022\036\n\032SERVICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017Sl" + "iceStatusEnum\022\031\n\025SLICESTATUS_UNDEFINED\020\000" + "\022\027\n\023SLICESTATUS_PLANNED\020\001\022\024\n\020SLICESTATUS" + "_INIT\020\002\022\026\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLICE" + "STATUS_DEINIT\020\004\022\034\n\030SLICESTATUS_SLA_VIOLA" + "TED\020\005*]\n\020ConfigActionEnum\022\032\n\026CONFIGACTIO" + "N_UNDEFINED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023C" + "ONFIGACTION_DELETE\020\002*m\n\024ConstraintAction" + "Enum\022\036\n\032CONSTRAINTACTION_UNDEFINED\020\000\022\030\n\024" + "CONSTRAINTACTION_SET\020\001\022\033\n\027CONSTRAINTACTI" + "ON_DELETE\020\002*\203\002\n\022IsolationLevelEnum\022\020\n\014NO" + "_ISOLATION\020\000\022\026\n\022PHYSICAL_ISOLATION\020\001\022\025\n\021" + "LOGICAL_ISOLATION\020\002\022\025\n\021PROCESS_ISOLATION" + "\020\003\022\035\n\031PHYSICAL_MEMORY_ISOLATION\020\004\022\036\n\032PHY" + "SICAL_NETWORK_ISOLATION\020\005\022\036\n\032VIRTUAL_RES" + "OURCE_ISOLATION\020\006\022\037\n\033NETWORK_FUNCTIONS_I" + "SOLATION\020\007\022\025\n\021SERVICE_ISOLATION\020\0102\246\031\n\016Co" + "ntextService\022:\n\016ListContextIds\022\016.context" + ".Empty\032\026.context.ContextIdList\"\000\0226\n\014List" + "Contexts\022\016.context.Empty\032\024.context.Conte" + "xtList\"\000\0224\n\nGetContext\022\022.context.Context" + "Id\032\020.context.Context\"\000\0224\n\nSetContext\022\020.c" + "ontext.Context\032\022.context.ContextId\"\000\0225\n\r" + "RemoveContext\022\022.context.ContextId\032\016.cont" + "ext.Empty\"\000\022=\n\020GetContextEvents\022\016.contex" + "t.Empty\032\025.context.ContextEvent\"\0000\001\022@\n\017Li" + "stTopologyIds\022\022.context.ContextId\032\027.cont" + "ext.TopologyIdList\"\000\022=\n\016ListTopologies\022\022" + ".context.ContextId\032\025.context.TopologyLis" + "t\"\000\0227\n\013GetTopology\022\023.context.TopologyId\032" + "\021.context.Topology\"\000\022E\n\022GetTopologyDetai" + "ls\022\023.context.TopologyId\032\030.context.Topolo" + "gyDetails\"\000\0227\n\013SetTopology\022\021.context.Top" + "ology\032\023.context.TopologyId\"\000\0227\n\016RemoveTo" + "pology\022\023.context.TopologyId\032\016.context.Em" + "pty\"\000\022?\n\021GetTopologyEvents\022\016.context.Emp" + "ty\032\026.context.TopologyEvent\"\0000\001\0228\n\rListDe" + "viceIds\022\016.context.Empty\032\025.context.Device" + "IdList\"\000\0224\n\013ListDevices\022\016.context.Empty\032" + "\023.context.DeviceList\"\000\0221\n\tGetDevice\022\021.co" + "ntext.DeviceId\032\017.context.Device\"\000\0221\n\tSet" + "Device\022\017.context.Device\032\021.context.Device" + "Id\"\000\0223\n\014RemoveDevice\022\021.context.DeviceId\032" + "\016.context.Empty\"\000\022;\n\017GetDeviceEvents\022\016.c" + "ontext.Empty\032\024.context.DeviceEvent\"\0000\001\022<" + "\n\014SelectDevice\022\025.context.DeviceFilter\032\023." + "context.DeviceList\"\000\022I\n\021ListEndPointName" + "s\022\027.context.EndPointIdList\032\031.context.End" + "PointNameList\"\000\0224\n\013ListLinkIds\022\016.context" + ".Empty\032\023.context.LinkIdList\"\000\0220\n\tListLin" + "ks\022\016.context.Empty\032\021.context.LinkList\"\000\022" + "+\n\007GetLink\022\017.context.LinkId\032\r.context.Li" + "nk\"\000\022+\n\007SetLink\022\r.context.Link\032\017.context" + ".LinkId\"\000\022/\n\nRemoveLink\022\017.context.LinkId" + "\032\016.context.Empty\"\000\0227\n\rGetLinkEvents\022\016.co" + "ntext.Empty\032\022.context.LinkEvent\"\0000\001\022>\n\016L" + "istServiceIds\022\022.context.ContextId\032\026.cont" + "ext.ServiceIdList\"\000\022:\n\014ListServices\022\022.co" + "ntext.ContextId\032\024.context.ServiceList\"\000\022" + "4\n\nGetService\022\022.context.ServiceId\032\020.cont" + "ext.Service\"\000\0224\n\nSetService\022\020.context.Se" + "rvice\032\022.context.ServiceId\"\000\0226\n\014UnsetServ" + "ice\022\020.context.Service\032\022.context.ServiceI" + "d\"\000\0225\n\rRemoveService\022\022.context.ServiceId" + "\032\016.context.Empty\"\000\022=\n\020GetServiceEvents\022\016" + ".context.Empty\032\025.context.ServiceEvent\"\0000" + "\001\022?\n\rSelectService\022\026.context.ServiceFilt" + "er\032\024.context.ServiceList\"\000\022:\n\014ListSliceI" + "ds\022\022.context.ContextId\032\024.context.SliceId" + "List\"\000\0226\n\nListSlices\022\022.context.ContextId" + "\032\022.context.SliceList\"\000\022.\n\010GetSlice\022\020.con" + "text.SliceId\032\016.context.Slice\"\000\022.\n\010SetSli" + "ce\022\016.context.Slice\032\020.context.SliceId\"\000\0220" + "\n\nUnsetSlice\022\016.context.Slice\032\020.context.S" + "liceId\"\000\0221\n\013RemoveSlice\022\020.context.SliceI" + "d\032\016.context.Empty\"\000\0229\n\016GetSliceEvents\022\016." + "context.Empty\032\023.context.SliceEvent\"\0000\001\0229" + "\n\013SelectSlice\022\024.context.SliceFilter\032\022.co" + "ntext.SliceList\"\000\022D\n\021ListConnectionIds\022\022" + ".context.ServiceId\032\031.context.ConnectionI" + "dList\"\000\022@\n\017ListConnections\022\022.context.Ser" + "viceId\032\027.context.ConnectionList\"\000\022=\n\rGet" + "Connection\022\025.context.ConnectionId\032\023.cont" + "ext.Connection\"\000\022=\n\rSetConnection\022\023.cont" + "ext.Connection\032\025.context.ConnectionId\"\000\022" + ";\n\020RemoveConnection\022\025.context.Connection" + "Id\032\016.context.Empty\"\000\022C\n\023GetConnectionEve" + "nts\022\016.context.Empty\032\030.context.Connection" + "Event\"\0000\001\022@\n\020GetOpticalConfig\022\016.context." + "Empty\032\032.context.OpticalConfigList\"\000\022F\n\020S" + "etOpticalConfig\022\026.context.OpticalConfig\032" + "\030.context.OpticalConfigId\"\000\022I\n\023SelectOpt" + "icalConfig\022\030.context.OpticalConfigId\032\026.c" + "ontext.OpticalConfig\"\000\0228\n\016SetOpticalLink" + "\022\024.context.OpticalLink\032\016.context.Empty\"\000" + "\022@\n\016GetOpticalLink\022\026.context.OpticalLink" + "Id\032\024.context.OpticalLink\"\000\022.\n\010GetFiber\022\020" + ".context.FiberId\032\016.context.Fiber\"\000b\006prot" + "o3" };
         descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { acl.Acl.getDescriptor(), kpi_sample_types.KpiSampleTypes.getDescriptor() });
         internal_static_context_Empty_descriptor = getDescriptor().getMessageTypes().get(0);
         internal_static_context_Empty_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Empty_descriptor, new java.lang.String[] {});
diff --git a/src/ztp/target/generated-sources/grpc/context/ContextServiceGrpc.java b/src/ztp/target/generated-sources/grpc/context/ContextServiceGrpc.java
index 233312dd7..a03f7e949 100644
--- a/src/ztp/target/generated-sources/grpc/context/ContextServiceGrpc.java
+++ b/src/ztp/target/generated-sources/grpc/context/ContextServiceGrpc.java
@@ -4,8 +4,7 @@ import static io.grpc.MethodDescriptor.generateFullMethodName;
 
 /**
  */
-@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.55.1)", comments = "Source: context.proto")
-@io.grpc.stub.annotations.GrpcGenerated
+@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.38.1)", comments = "Source: context.proto")
 public final class ContextServiceGrpc {
 
     private ContextServiceGrpc() {
@@ -883,299 +882,299 @@ public final class ContextServiceGrpc {
 
     /**
      */
-    public interface AsyncService {
+    public static abstract class ContextServiceImplBase implements io.grpc.BindableService {
 
         /**
          */
-        default void listContextIds(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listContextIds(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListContextIdsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listContexts(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listContexts(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListContextsMethod(), responseObserver);
         }
 
         /**
          */
-        default void getContext(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getContext(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetContextMethod(), responseObserver);
         }
 
         /**
          */
-        default void setContext(context.ContextOuterClass.Context request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setContext(context.ContextOuterClass.Context request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetContextMethod(), responseObserver);
         }
 
         /**
          */
-        default void removeContext(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void removeContext(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRemoveContextMethod(), responseObserver);
         }
 
         /**
          */
-        default void getContextEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getContextEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetContextEventsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listTopologyIds(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listTopologyIds(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListTopologyIdsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listTopologies(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listTopologies(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListTopologiesMethod(), responseObserver);
         }
 
         /**
          */
-        default void getTopology(context.ContextOuterClass.TopologyId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getTopology(context.ContextOuterClass.TopologyId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetTopologyMethod(), responseObserver);
         }
 
         /**
          */
-        default void getTopologyDetails(context.ContextOuterClass.TopologyId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getTopologyDetails(context.ContextOuterClass.TopologyId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetTopologyDetailsMethod(), responseObserver);
         }
 
         /**
          */
-        default void setTopology(context.ContextOuterClass.Topology request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setTopology(context.ContextOuterClass.Topology request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetTopologyMethod(), responseObserver);
         }
 
         /**
          */
-        default void removeTopology(context.ContextOuterClass.TopologyId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void removeTopology(context.ContextOuterClass.TopologyId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRemoveTopologyMethod(), responseObserver);
         }
 
         /**
          */
-        default void getTopologyEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getTopologyEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetTopologyEventsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listDeviceIds(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listDeviceIds(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListDeviceIdsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listDevices(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listDevices(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListDevicesMethod(), responseObserver);
         }
 
         /**
          */
-        default void getDevice(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getDevice(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetDeviceMethod(), responseObserver);
         }
 
         /**
          */
-        default void setDevice(context.ContextOuterClass.Device request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setDevice(context.ContextOuterClass.Device request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetDeviceMethod(), responseObserver);
         }
 
         /**
          */
-        default void removeDevice(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void removeDevice(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRemoveDeviceMethod(), responseObserver);
         }
 
         /**
          */
-        default void getDeviceEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getDeviceEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetDeviceEventsMethod(), responseObserver);
         }
 
         /**
          */
-        default void selectDevice(context.ContextOuterClass.DeviceFilter request, io.grpc.stub.StreamObserver responseObserver) {
+        public void selectDevice(context.ContextOuterClass.DeviceFilter request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSelectDeviceMethod(), responseObserver);
         }
 
         /**
          */
-        default void listEndPointNames(context.ContextOuterClass.EndPointIdList request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listEndPointNames(context.ContextOuterClass.EndPointIdList request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListEndPointNamesMethod(), responseObserver);
         }
 
         /**
          */
-        default void listLinkIds(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listLinkIds(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListLinkIdsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listLinks(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listLinks(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListLinksMethod(), responseObserver);
         }
 
         /**
          */
-        default void getLink(context.ContextOuterClass.LinkId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getLink(context.ContextOuterClass.LinkId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetLinkMethod(), responseObserver);
         }
 
         /**
          */
-        default void setLink(context.ContextOuterClass.Link request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setLink(context.ContextOuterClass.Link request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetLinkMethod(), responseObserver);
         }
 
         /**
          */
-        default void removeLink(context.ContextOuterClass.LinkId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void removeLink(context.ContextOuterClass.LinkId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRemoveLinkMethod(), responseObserver);
         }
 
         /**
          */
-        default void getLinkEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getLinkEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetLinkEventsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listServiceIds(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listServiceIds(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListServiceIdsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listServices(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listServices(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListServicesMethod(), responseObserver);
         }
 
         /**
          */
-        default void getService(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getService(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetServiceMethod(), responseObserver);
         }
 
         /**
          */
-        default void setService(context.ContextOuterClass.Service request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setService(context.ContextOuterClass.Service request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetServiceMethod(), responseObserver);
         }
 
         /**
          */
-        default void unsetService(context.ContextOuterClass.Service request, io.grpc.stub.StreamObserver responseObserver) {
+        public void unsetService(context.ContextOuterClass.Service request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getUnsetServiceMethod(), responseObserver);
         }
 
         /**
          */
-        default void removeService(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void removeService(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRemoveServiceMethod(), responseObserver);
         }
 
         /**
          */
-        default void getServiceEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getServiceEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetServiceEventsMethod(), responseObserver);
         }
 
         /**
          */
-        default void selectService(context.ContextOuterClass.ServiceFilter request, io.grpc.stub.StreamObserver responseObserver) {
+        public void selectService(context.ContextOuterClass.ServiceFilter request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSelectServiceMethod(), responseObserver);
         }
 
         /**
          */
-        default void listSliceIds(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listSliceIds(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListSliceIdsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listSlices(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listSlices(context.ContextOuterClass.ContextId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListSlicesMethod(), responseObserver);
         }
 
         /**
          */
-        default void getSlice(context.ContextOuterClass.SliceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getSlice(context.ContextOuterClass.SliceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetSliceMethod(), responseObserver);
         }
 
         /**
          */
-        default void setSlice(context.ContextOuterClass.Slice request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setSlice(context.ContextOuterClass.Slice request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetSliceMethod(), responseObserver);
         }
 
         /**
          */
-        default void unsetSlice(context.ContextOuterClass.Slice request, io.grpc.stub.StreamObserver responseObserver) {
+        public void unsetSlice(context.ContextOuterClass.Slice request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getUnsetSliceMethod(), responseObserver);
         }
 
         /**
          */
-        default void removeSlice(context.ContextOuterClass.SliceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void removeSlice(context.ContextOuterClass.SliceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRemoveSliceMethod(), responseObserver);
         }
 
         /**
          */
-        default void getSliceEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getSliceEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetSliceEventsMethod(), responseObserver);
         }
 
         /**
          */
-        default void selectSlice(context.ContextOuterClass.SliceFilter request, io.grpc.stub.StreamObserver responseObserver) {
+        public void selectSlice(context.ContextOuterClass.SliceFilter request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSelectSliceMethod(), responseObserver);
         }
 
         /**
          */
-        default void listConnectionIds(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listConnectionIds(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListConnectionIdsMethod(), responseObserver);
         }
 
         /**
          */
-        default void listConnections(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void listConnections(context.ContextOuterClass.ServiceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getListConnectionsMethod(), responseObserver);
         }
 
         /**
          */
-        default void getConnection(context.ContextOuterClass.ConnectionId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getConnection(context.ContextOuterClass.ConnectionId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetConnectionMethod(), responseObserver);
         }
 
         /**
          */
-        default void setConnection(context.ContextOuterClass.Connection request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setConnection(context.ContextOuterClass.Connection request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetConnectionMethod(), responseObserver);
         }
 
         /**
          */
-        default void removeConnection(context.ContextOuterClass.ConnectionId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void removeConnection(context.ContextOuterClass.ConnectionId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRemoveConnectionMethod(), responseObserver);
         }
 
         /**
          */
-        default void getConnectionEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getConnectionEvents(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetConnectionEventsMethod(), responseObserver);
         }
 
@@ -1184,54 +1183,47 @@ public final class ContextServiceGrpc {
          * ------------------------------ Experimental -----------------------------
          * 
*/ - default void getOpticalConfig(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) { + public void getOpticalConfig(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetOpticalConfigMethod(), responseObserver); } /** */ - default void setOpticalConfig(context.ContextOuterClass.OpticalConfig request, io.grpc.stub.StreamObserver responseObserver) { + public void setOpticalConfig(context.ContextOuterClass.OpticalConfig request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetOpticalConfigMethod(), responseObserver); } /** */ - default void selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request, io.grpc.stub.StreamObserver responseObserver) { + public void selectOpticalConfig(context.ContextOuterClass.OpticalConfigId request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSelectOpticalConfigMethod(), responseObserver); } /** */ - default void setOpticalLink(context.ContextOuterClass.OpticalLink request, io.grpc.stub.StreamObserver responseObserver) { + public void setOpticalLink(context.ContextOuterClass.OpticalLink request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetOpticalLinkMethod(), responseObserver); } /** */ - default void getOpticalLink(context.ContextOuterClass.OpticalLinkId request, io.grpc.stub.StreamObserver responseObserver) { + public void getOpticalLink(context.ContextOuterClass.OpticalLinkId request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetOpticalLinkMethod(), responseObserver); } /** */ - default void getFiber(context.ContextOuterClass.FiberId request, io.grpc.stub.StreamObserver responseObserver) { + public void getFiber(context.ContextOuterClass.FiberId request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetFiberMethod(), responseObserver); } - } - - /** - * Base class for the server implementation of the service ContextService. - */ - public static abstract class ContextServiceImplBase implements io.grpc.BindableService, AsyncService { @java.lang.Override public io.grpc.ServerServiceDefinition bindService() { - return ContextServiceGrpc.bindService(this); + return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getListContextIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONTEXT_IDS))).addMethod(getListContextsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONTEXTS))).addMethod(getGetContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_CONTEXT))).addMethod(getSetContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_CONTEXT))).addMethod(getRemoveContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_CONTEXT))).addMethod(getGetContextEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_CONTEXT_EVENTS))).addMethod(getListTopologyIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_TOPOLOGY_IDS))).addMethod(getListTopologiesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_TOPOLOGIES))).addMethod(getGetTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY))).addMethod(getGetTopologyDetailsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY_DETAILS))).addMethod(getSetTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_TOPOLOGY))).addMethod(getRemoveTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_TOPOLOGY))).addMethod(getGetTopologyEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_TOPOLOGY_EVENTS))).addMethod(getListDeviceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_DEVICE_IDS))).addMethod(getListDevicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_DEVICES))).addMethod(getGetDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_DEVICE))).addMethod(getSetDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_DEVICE))).addMethod(getRemoveDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_DEVICE))).addMethod(getGetDeviceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_DEVICE_EVENTS))).addMethod(getSelectDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_DEVICE))).addMethod(getListEndPointNamesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_END_POINT_NAMES))).addMethod(getListLinkIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_LINK_IDS))).addMethod(getListLinksMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_LINKS))).addMethod(getGetLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_LINK))).addMethod(getSetLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_LINK))).addMethod(getRemoveLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_LINK))).addMethod(getGetLinkEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_LINK_EVENTS))).addMethod(getListServiceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SERVICE_IDS))).addMethod(getListServicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SERVICES))).addMethod(getGetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_SERVICE))).addMethod(getSetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_SERVICE))).addMethod(getUnsetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_UNSET_SERVICE))).addMethod(getRemoveServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_SERVICE))).addMethod(getGetServiceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_SERVICE_EVENTS))).addMethod(getSelectServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_SERVICE))).addMethod(getListSliceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SLICE_IDS))).addMethod(getListSlicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_SLICES))).addMethod(getGetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_SLICE))).addMethod(getSetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_SLICE))).addMethod(getUnsetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_UNSET_SLICE))).addMethod(getRemoveSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_SLICE))).addMethod(getGetSliceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_SLICE_EVENTS))).addMethod(getSelectSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_SLICE))).addMethod(getListConnectionIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONNECTION_IDS))).addMethod(getListConnectionsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_LIST_CONNECTIONS))).addMethod(getGetConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_CONNECTION))).addMethod(getSetConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_CONNECTION))).addMethod(getRemoveConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_REMOVE_CONNECTION))).addMethod(getGetConnectionEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_CONNECTION_EVENTS))).addMethod(getGetOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_OPTICAL_CONFIG))).addMethod(getSetOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_OPTICAL_CONFIG))).addMethod(getSelectOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SELECT_OPTICAL_CONFIG))).addMethod(getSetOpticalLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_OPTICAL_LINK))).addMethod(getGetOpticalLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_OPTICAL_LINK))).addMethod(getGetFiberMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_FIBER))).build(); } } /** - * A stub to allow clients to do asynchronous rpc calls to service ContextService. */ public static class ContextServiceStub extends io.grpc.stub.AbstractAsyncStub { @@ -1579,7 +1571,6 @@ public final class ContextServiceGrpc { } /** - * A stub to allow clients to do synchronous rpc calls to service ContextService. */ public static class ContextServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub { @@ -1927,7 +1918,6 @@ public final class ContextServiceGrpc { } /** - * A stub to allow clients to do ListenableFuture-style rpc calls to service ContextService. */ public static class ContextServiceFutureStub extends io.grpc.stub.AbstractFutureStub { @@ -2344,11 +2334,11 @@ public final class ContextServiceGrpc { private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, io.grpc.stub.ServerCalls.ServerStreamingMethod, io.grpc.stub.ServerCalls.ClientStreamingMethod, io.grpc.stub.ServerCalls.BidiStreamingMethod { - private final AsyncService serviceImpl; + private final ContextServiceImplBase serviceImpl; private final int methodId; - MethodHandlers(AsyncService serviceImpl, int methodId) { + MethodHandlers(ContextServiceImplBase serviceImpl, int methodId) { this.serviceImpl = serviceImpl; this.methodId = methodId; } @@ -2537,10 +2527,6 @@ public final class ContextServiceGrpc { } } - public static io.grpc.ServerServiceDefinition bindService(AsyncService service) { - return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getListContextIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONTEXT_IDS))).addMethod(getListContextsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONTEXTS))).addMethod(getGetContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_CONTEXT))).addMethod(getSetContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_CONTEXT))).addMethod(getRemoveContextMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_CONTEXT))).addMethod(getGetContextEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_CONTEXT_EVENTS))).addMethod(getListTopologyIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_TOPOLOGY_IDS))).addMethod(getListTopologiesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_TOPOLOGIES))).addMethod(getGetTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY))).addMethod(getGetTopologyDetailsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY_DETAILS))).addMethod(getSetTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_TOPOLOGY))).addMethod(getRemoveTopologyMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_TOPOLOGY))).addMethod(getGetTopologyEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_TOPOLOGY_EVENTS))).addMethod(getListDeviceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_DEVICE_IDS))).addMethod(getListDevicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_DEVICES))).addMethod(getGetDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_DEVICE))).addMethod(getSetDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_DEVICE))).addMethod(getRemoveDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_DEVICE))).addMethod(getGetDeviceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_DEVICE_EVENTS))).addMethod(getSelectDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_DEVICE))).addMethod(getListEndPointNamesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_END_POINT_NAMES))).addMethod(getListLinkIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_LINK_IDS))).addMethod(getListLinksMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_LINKS))).addMethod(getGetLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_LINK))).addMethod(getSetLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_LINK))).addMethod(getRemoveLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_LINK))).addMethod(getGetLinkEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_LINK_EVENTS))).addMethod(getListServiceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SERVICE_IDS))).addMethod(getListServicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SERVICES))).addMethod(getGetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_SERVICE))).addMethod(getSetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_SERVICE))).addMethod(getUnsetServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_UNSET_SERVICE))).addMethod(getRemoveServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_SERVICE))).addMethod(getGetServiceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_SERVICE_EVENTS))).addMethod(getSelectServiceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_SERVICE))).addMethod(getListSliceIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SLICE_IDS))).addMethod(getListSlicesMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_SLICES))).addMethod(getGetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_SLICE))).addMethod(getSetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_SLICE))).addMethod(getUnsetSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_UNSET_SLICE))).addMethod(getRemoveSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_SLICE))).addMethod(getGetSliceEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_SLICE_EVENTS))).addMethod(getSelectSliceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_SLICE))).addMethod(getListConnectionIdsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONNECTION_IDS))).addMethod(getListConnectionsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_LIST_CONNECTIONS))).addMethod(getGetConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_CONNECTION))).addMethod(getSetConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_CONNECTION))).addMethod(getRemoveConnectionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_REMOVE_CONNECTION))).addMethod(getGetConnectionEventsMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_CONNECTION_EVENTS))).addMethod(getGetOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_OPTICAL_CONFIG))).addMethod(getSetOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_OPTICAL_CONFIG))).addMethod(getSelectOpticalConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SELECT_OPTICAL_CONFIG))).addMethod(getSetOpticalLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_OPTICAL_LINK))).addMethod(getGetOpticalLinkMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_OPTICAL_LINK))).addMethod(getGetFiberMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_FIBER))).build(); - } - private static abstract class ContextServiceBaseDescriptorSupplier implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier { ContextServiceBaseDescriptorSupplier() { diff --git a/src/ztp/target/generated-sources/grpc/device/Device.java b/src/ztp/target/generated-sources/grpc/device/Device.java index a127e8f1c..93bd49040 100644 --- a/src/ztp/target/generated-sources/grpc/device/Device.java +++ b/src/ztp/target/generated-sources/grpc/device/Device.java @@ -86,6 +86,80 @@ public final class Device { return new MonitoringSettings(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private MonitoringSettings(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + monitoring.Monitoring.KpiId.Builder subBuilder = null; + if (kpiId_ != null) { + subBuilder = kpiId_.toBuilder(); + } + kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(kpiId_); + kpiId_ = subBuilder.buildPartial(); + } + break; + } + case 18: + { + monitoring.Monitoring.KpiDescriptor.Builder subBuilder = null; + if (kpiDescriptor_ != null) { + subBuilder = kpiDescriptor_.toBuilder(); + } + kpiDescriptor_ = input.readMessage(monitoring.Monitoring.KpiDescriptor.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(kpiDescriptor_); + kpiDescriptor_ = subBuilder.buildPartial(); + } + break; + } + case 29: + { + samplingDurationS_ = input.readFloat(); + break; + } + case 37: + { + samplingIntervalS_ = input.readFloat(); + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return device.Device.internal_static_device_MonitoringSettings_descriptor; } @@ -122,7 +196,7 @@ public final class Device { */ @java.lang.Override public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() { - return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_; + return getKpiId(); } public static final int KPI_DESCRIPTOR_FIELD_NUMBER = 2; @@ -152,12 +226,12 @@ public final class Device { */ @java.lang.Override public monitoring.Monitoring.KpiDescriptorOrBuilder getKpiDescriptorOrBuilder() { - return kpiDescriptor_ == null ? monitoring.Monitoring.KpiDescriptor.getDefaultInstance() : kpiDescriptor_; + return getKpiDescriptor(); } public static final int SAMPLING_DURATION_S_FIELD_NUMBER = 3; - private float samplingDurationS_ = 0F; + private float samplingDurationS_; /** * float sampling_duration_s = 3; @@ -170,7 +244,7 @@ public final class Device { public static final int SAMPLING_INTERVAL_S_FIELD_NUMBER = 4; - private float samplingIntervalS_ = 0F; + private float samplingIntervalS_; /** * float sampling_interval_s = 4; @@ -202,13 +276,13 @@ public final class Device { if (kpiDescriptor_ != null) { output.writeMessage(2, getKpiDescriptor()); } - if (java.lang.Float.floatToRawIntBits(samplingDurationS_) != 0) { + if (samplingDurationS_ != 0F) { output.writeFloat(3, samplingDurationS_); } - if (java.lang.Float.floatToRawIntBits(samplingIntervalS_) != 0) { + if (samplingIntervalS_ != 0F) { output.writeFloat(4, samplingIntervalS_); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -223,13 +297,13 @@ public final class Device { if (kpiDescriptor_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getKpiDescriptor()); } - if (java.lang.Float.floatToRawIntBits(samplingDurationS_) != 0) { + if (samplingDurationS_ != 0F) { size += com.google.protobuf.CodedOutputStream.computeFloatSize(3, samplingDurationS_); } - if (java.lang.Float.floatToRawIntBits(samplingIntervalS_) != 0) { + if (samplingIntervalS_ != 0F) { size += com.google.protobuf.CodedOutputStream.computeFloatSize(4, samplingIntervalS_); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -259,7 +333,7 @@ public final class Device { return false; if (java.lang.Float.floatToIntBits(getSamplingIntervalS()) != java.lang.Float.floatToIntBits(other.getSamplingIntervalS())) return false; - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -283,7 +357,7 @@ public final class Device { hash = (53 * hash) + java.lang.Float.floatToIntBits(getSamplingDurationS()); hash = (37 * hash) + SAMPLING_INTERVAL_S_FIELD_NUMBER; hash = (53 * hash) + java.lang.Float.floatToIntBits(getSamplingIntervalS()); - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -377,24 +451,32 @@ public final class Device { // Construct using device.Device.MonitoringSettings.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; - kpiId_ = null; - if (kpiIdBuilder_ != null) { - kpiIdBuilder_.dispose(); + if (kpiIdBuilder_ == null) { + kpiId_ = null; + } else { + kpiId_ = null; kpiIdBuilder_ = null; } - kpiDescriptor_ = null; - if (kpiDescriptorBuilder_ != null) { - kpiDescriptorBuilder_.dispose(); + if (kpiDescriptorBuilder_ == null) { + kpiDescriptor_ = null; + } else { + kpiDescriptor_ = null; kpiDescriptorBuilder_ = null; } samplingDurationS_ = 0F; @@ -424,27 +506,50 @@ public final class Device { @java.lang.Override public device.Device.MonitoringSettings buildPartial() { device.Device.MonitoringSettings result = new device.Device.MonitoringSettings(this); - if (bitField0_ != 0) { - buildPartial0(result); + if (kpiIdBuilder_ == null) { + result.kpiId_ = kpiId_; + } else { + result.kpiId_ = kpiIdBuilder_.build(); + } + if (kpiDescriptorBuilder_ == null) { + result.kpiDescriptor_ = kpiDescriptor_; + } else { + result.kpiDescriptor_ = kpiDescriptorBuilder_.build(); } + result.samplingDurationS_ = samplingDurationS_; + result.samplingIntervalS_ = samplingIntervalS_; onBuilt(); return result; } - private void buildPartial0(device.Device.MonitoringSettings result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build(); - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.kpiDescriptor_ = kpiDescriptorBuilder_ == null ? kpiDescriptor_ : kpiDescriptorBuilder_.build(); - } - if (((from_bitField0_ & 0x00000004) != 0)) { - result.samplingDurationS_ = samplingDurationS_; - } - if (((from_bitField0_ & 0x00000008) != 0)) { - result.samplingIntervalS_ = samplingIntervalS_; - } + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -472,7 +577,7 @@ public final class Device { if (other.getSamplingIntervalS() != 0F) { setSamplingIntervalS(other.getSamplingIntervalS()); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -484,68 +589,20 @@ public final class Device { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + device.Device.MonitoringSettings parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000001; - break; - } - // case 10 - case 18: - { - input.readMessage(getKpiDescriptorFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000002; - break; - } - // case 18 - case 29: - { - samplingDurationS_ = input.readFloat(); - bitField0_ |= 0x00000004; - break; - } - // case 29 - case 37: - { - samplingIntervalS_ = input.readFloat(); - bitField0_ |= 0x00000008; - break; - } - // case 37 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (device.Device.MonitoringSettings) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } - private int bitField0_; - private monitoring.Monitoring.KpiId kpiId_; private com.google.protobuf.SingleFieldBuilderV3 kpiIdBuilder_; @@ -555,7 +612,7 @@ public final class Device { * @return Whether the kpiId field is set. */ public boolean hasKpiId() { - return ((bitField0_ & 0x00000001) != 0); + return kpiIdBuilder_ != null || kpiId_ != null; } /** @@ -579,11 +636,10 @@ public final class Device { throw new NullPointerException(); } kpiId_ = value; + onChanged(); } else { kpiIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -593,11 +649,10 @@ public final class Device { public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) { if (kpiIdBuilder_ == null) { kpiId_ = builderForValue.build(); + onChanged(); } else { kpiIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -606,16 +661,15 @@ public final class Device { */ public Builder mergeKpiId(monitoring.Monitoring.KpiId value) { if (kpiIdBuilder_ == null) { - if (((bitField0_ & 0x00000001) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) { - getKpiIdBuilder().mergeFrom(value); + if (kpiId_ != null) { + kpiId_ = monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial(); } else { kpiId_ = value; } + onChanged(); } else { kpiIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -623,13 +677,13 @@ public final class Device { * .monitoring.KpiId kpi_id = 1; */ public Builder clearKpiId() { - bitField0_ = (bitField0_ & ~0x00000001); - kpiId_ = null; - if (kpiIdBuilder_ != null) { - kpiIdBuilder_.dispose(); + if (kpiIdBuilder_ == null) { + kpiId_ = null; + onChanged(); + } else { + kpiId_ = null; kpiIdBuilder_ = null; } - onChanged(); return this; } @@ -637,7 +691,6 @@ public final class Device { * .monitoring.KpiId kpi_id = 1; */ public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() { - bitField0_ |= 0x00000001; onChanged(); return getKpiIdFieldBuilder().getBuilder(); } @@ -673,7 +726,7 @@ public final class Device { * @return Whether the kpiDescriptor field is set. */ public boolean hasKpiDescriptor() { - return ((bitField0_ & 0x00000002) != 0); + return kpiDescriptorBuilder_ != null || kpiDescriptor_ != null; } /** @@ -697,11 +750,10 @@ public final class Device { throw new NullPointerException(); } kpiDescriptor_ = value; + onChanged(); } else { kpiDescriptorBuilder_.setMessage(value); } - bitField0_ |= 0x00000002; - onChanged(); return this; } @@ -711,11 +763,10 @@ public final class Device { public Builder setKpiDescriptor(monitoring.Monitoring.KpiDescriptor.Builder builderForValue) { if (kpiDescriptorBuilder_ == null) { kpiDescriptor_ = builderForValue.build(); + onChanged(); } else { kpiDescriptorBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000002; - onChanged(); return this; } @@ -724,16 +775,15 @@ public final class Device { */ public Builder mergeKpiDescriptor(monitoring.Monitoring.KpiDescriptor value) { if (kpiDescriptorBuilder_ == null) { - if (((bitField0_ & 0x00000002) != 0) && kpiDescriptor_ != null && kpiDescriptor_ != monitoring.Monitoring.KpiDescriptor.getDefaultInstance()) { - getKpiDescriptorBuilder().mergeFrom(value); + if (kpiDescriptor_ != null) { + kpiDescriptor_ = monitoring.Monitoring.KpiDescriptor.newBuilder(kpiDescriptor_).mergeFrom(value).buildPartial(); } else { kpiDescriptor_ = value; } + onChanged(); } else { kpiDescriptorBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000002; - onChanged(); return this; } @@ -741,13 +791,13 @@ public final class Device { * .monitoring.KpiDescriptor kpi_descriptor = 2; */ public Builder clearKpiDescriptor() { - bitField0_ = (bitField0_ & ~0x00000002); - kpiDescriptor_ = null; - if (kpiDescriptorBuilder_ != null) { - kpiDescriptorBuilder_.dispose(); + if (kpiDescriptorBuilder_ == null) { + kpiDescriptor_ = null; + onChanged(); + } else { + kpiDescriptor_ = null; kpiDescriptorBuilder_ = null; } - onChanged(); return this; } @@ -755,7 +805,6 @@ public final class Device { * .monitoring.KpiDescriptor kpi_descriptor = 2; */ public monitoring.Monitoring.KpiDescriptor.Builder getKpiDescriptorBuilder() { - bitField0_ |= 0x00000002; onChanged(); return getKpiDescriptorFieldBuilder().getBuilder(); } @@ -800,7 +849,6 @@ public final class Device { */ public Builder setSamplingDurationS(float value) { samplingDurationS_ = value; - bitField0_ |= 0x00000004; onChanged(); return this; } @@ -810,7 +858,6 @@ public final class Device { * @return This builder for chaining. */ public Builder clearSamplingDurationS() { - bitField0_ = (bitField0_ & ~0x00000004); samplingDurationS_ = 0F; onChanged(); return this; @@ -834,7 +881,6 @@ public final class Device { */ public Builder setSamplingIntervalS(float value) { samplingIntervalS_ = value; - bitField0_ |= 0x00000008; onChanged(); return this; } @@ -844,7 +890,6 @@ public final class Device { * @return This builder for chaining. */ public Builder clearSamplingIntervalS() { - bitField0_ = (bitField0_ & ~0x00000008); samplingIntervalS_ = 0F; onChanged(); return this; @@ -877,17 +922,7 @@ public final class Device { @java.lang.Override public MonitoringSettings parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new MonitoringSettings(input, extensionRegistry); } }; diff --git a/src/ztp/target/generated-sources/grpc/device/DeviceServiceGrpc.java b/src/ztp/target/generated-sources/grpc/device/DeviceServiceGrpc.java index 7e0cf9a8b..a6886d8d6 100644 --- a/src/ztp/target/generated-sources/grpc/device/DeviceServiceGrpc.java +++ b/src/ztp/target/generated-sources/grpc/device/DeviceServiceGrpc.java @@ -4,8 +4,7 @@ import static io.grpc.MethodDescriptor.generateFullMethodName; /** */ -@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.55.1)", comments = "Source: device.proto") -@io.grpc.stub.annotations.GrpcGenerated +@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.38.1)", comments = "Source: device.proto") public final class DeviceServiceGrpc { private DeviceServiceGrpc() { @@ -133,52 +132,45 @@ public final class DeviceServiceGrpc { /** */ - public interface AsyncService { + public static abstract class DeviceServiceImplBase implements io.grpc.BindableService { /** */ - default void addDevice(context.ContextOuterClass.Device request, io.grpc.stub.StreamObserver responseObserver) { + public void addDevice(context.ContextOuterClass.Device request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getAddDeviceMethod(), responseObserver); } /** */ - default void configureDevice(context.ContextOuterClass.Device request, io.grpc.stub.StreamObserver responseObserver) { + public void configureDevice(context.ContextOuterClass.Device request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getConfigureDeviceMethod(), responseObserver); } /** */ - default void deleteDevice(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) { + public void deleteDevice(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getDeleteDeviceMethod(), responseObserver); } /** */ - default void getInitialConfig(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) { + public void getInitialConfig(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetInitialConfigMethod(), responseObserver); } /** */ - default void monitorDeviceKpi(device.Device.MonitoringSettings request, io.grpc.stub.StreamObserver responseObserver) { + public void monitorDeviceKpi(device.Device.MonitoringSettings request, io.grpc.stub.StreamObserver responseObserver) { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getMonitorDeviceKpiMethod(), responseObserver); } - } - - /** - * Base class for the server implementation of the service DeviceService. - */ - public static abstract class DeviceServiceImplBase implements io.grpc.BindableService, AsyncService { @java.lang.Override public io.grpc.ServerServiceDefinition bindService() { - return DeviceServiceGrpc.bindService(this); + return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getAddDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_ADD_DEVICE))).addMethod(getConfigureDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_CONFIGURE_DEVICE))).addMethod(getDeleteDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_DELETE_DEVICE))).addMethod(getGetInitialConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_INITIAL_CONFIG))).addMethod(getMonitorDeviceKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_MONITOR_DEVICE_KPI))).build(); } } /** - * A stub to allow clients to do asynchronous rpc calls to service DeviceService. */ public static class DeviceServiceStub extends io.grpc.stub.AbstractAsyncStub { @@ -223,7 +215,6 @@ public final class DeviceServiceGrpc { } /** - * A stub to allow clients to do synchronous rpc calls to service DeviceService. */ public static class DeviceServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub { @@ -268,7 +259,6 @@ public final class DeviceServiceGrpc { } /** - * A stub to allow clients to do ListenableFuture-style rpc calls to service DeviceService. */ public static class DeviceServiceFutureStub extends io.grpc.stub.AbstractFutureStub { @@ -324,11 +314,11 @@ public final class DeviceServiceGrpc { private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, io.grpc.stub.ServerCalls.ServerStreamingMethod, io.grpc.stub.ServerCalls.ClientStreamingMethod, io.grpc.stub.ServerCalls.BidiStreamingMethod { - private final AsyncService serviceImpl; + private final DeviceServiceImplBase serviceImpl; private final int methodId; - MethodHandlers(AsyncService serviceImpl, int methodId) { + MethodHandlers(DeviceServiceImplBase serviceImpl, int methodId) { this.serviceImpl = serviceImpl; this.methodId = methodId; } @@ -367,10 +357,6 @@ public final class DeviceServiceGrpc { } } - public static io.grpc.ServerServiceDefinition bindService(AsyncService service) { - return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getAddDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_ADD_DEVICE))).addMethod(getConfigureDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_CONFIGURE_DEVICE))).addMethod(getDeleteDeviceMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_DELETE_DEVICE))).addMethod(getGetInitialConfigMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_INITIAL_CONFIG))).addMethod(getMonitorDeviceKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_MONITOR_DEVICE_KPI))).build(); - } - private static abstract class DeviceServiceBaseDescriptorSupplier implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier { DeviceServiceBaseDescriptorSupplier() { diff --git a/src/ztp/target/generated-sources/grpc/monitoring/Monitoring.java b/src/ztp/target/generated-sources/grpc/monitoring/Monitoring.java index 2f98ce3eb..4c80f4a06 100644 --- a/src/ztp/target/generated-sources/grpc/monitoring/Monitoring.java +++ b/src/ztp/target/generated-sources/grpc/monitoring/Monitoring.java @@ -211,6 +211,160 @@ public final class Monitoring { return new KpiDescriptor(); } + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + private KpiDescriptor(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + monitoring.Monitoring.KpiId.Builder subBuilder = null; + if (kpiId_ != null) { + subBuilder = kpiId_.toBuilder(); + } + kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(kpiId_); + kpiId_ = subBuilder.buildPartial(); + } + break; + } + case 18: + { + java.lang.String s = input.readStringRequireUtf8(); + kpiDescription_ = s; + break; + } + case 26: + { + if (!((mutable_bitField0_ & 0x00000001) != 0)) { + kpiIdList_ = new java.util.ArrayList(); + mutable_bitField0_ |= 0x00000001; + } + kpiIdList_.add(input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry)); + break; + } + case 32: + { + int rawValue = input.readEnum(); + kpiSampleType_ = rawValue; + break; + } + case 42: + { + context.ContextOuterClass.DeviceId.Builder subBuilder = null; + if (deviceId_ != null) { + subBuilder = deviceId_.toBuilder(); + } + deviceId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(deviceId_); + deviceId_ = subBuilder.buildPartial(); + } + break; + } + case 50: + { + context.ContextOuterClass.EndPointId.Builder subBuilder = null; + if (endpointId_ != null) { + subBuilder = endpointId_.toBuilder(); + } + endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(endpointId_); + endpointId_ = subBuilder.buildPartial(); + } + break; + } + case 58: + { + context.ContextOuterClass.ServiceId.Builder subBuilder = null; + if (serviceId_ != null) { + subBuilder = serviceId_.toBuilder(); + } + serviceId_ = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(serviceId_); + serviceId_ = subBuilder.buildPartial(); + } + break; + } + case 66: + { + context.ContextOuterClass.SliceId.Builder subBuilder = null; + if (sliceId_ != null) { + subBuilder = sliceId_.toBuilder(); + } + sliceId_ = input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(sliceId_); + sliceId_ = subBuilder.buildPartial(); + } + break; + } + case 74: + { + context.ContextOuterClass.ConnectionId.Builder subBuilder = null; + if (connectionId_ != null) { + subBuilder = connectionId_.toBuilder(); + } + connectionId_ = input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(connectionId_); + connectionId_ = subBuilder.buildPartial(); + } + break; + } + case 82: + { + context.ContextOuterClass.LinkId.Builder subBuilder = null; + if (linkId_ != null) { + subBuilder = linkId_.toBuilder(); + } + linkId_ = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(linkId_); + linkId_ = subBuilder.buildPartial(); + } + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + if (((mutable_bitField0_ & 0x00000001) != 0)) { + kpiIdList_ = java.util.Collections.unmodifiableList(kpiIdList_); + } + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return monitoring.Monitoring.internal_static_monitoring_KpiDescriptor_descriptor; } @@ -247,13 +401,12 @@ public final class Monitoring { */ @java.lang.Override public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() { - return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_; + return getKpiId(); } public static final int KPI_DESCRIPTION_FIELD_NUMBER = 2; - @SuppressWarnings("serial") - private volatile java.lang.Object kpiDescription_ = ""; + private volatile java.lang.Object kpiDescription_; /** * string kpi_description = 2; @@ -290,7 +443,6 @@ public final class Monitoring { public static final int KPI_ID_LIST_FIELD_NUMBER = 3; - @SuppressWarnings("serial") private java.util.List kpiIdList_; /** @@ -335,7 +487,7 @@ public final class Monitoring { public static final int KPI_SAMPLE_TYPE_FIELD_NUMBER = 4; - private int kpiSampleType_ = 0; + private int kpiSampleType_; /** * .kpi_sample_types.KpiSampleType kpi_sample_type = 4; @@ -352,7 +504,8 @@ public final class Monitoring { */ @java.lang.Override public kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleType() { - kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.forNumber(kpiSampleType_); + @SuppressWarnings("deprecation") + kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.valueOf(kpiSampleType_); return result == null ? kpi_sample_types.KpiSampleTypes.KpiSampleType.UNRECOGNIZED : result; } @@ -383,7 +536,7 @@ public final class Monitoring { */ @java.lang.Override public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() { - return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_; + return getDeviceId(); } public static final int ENDPOINT_ID_FIELD_NUMBER = 6; @@ -413,7 +566,7 @@ public final class Monitoring { */ @java.lang.Override public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() { - return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_; + return getEndpointId(); } public static final int SERVICE_ID_FIELD_NUMBER = 7; @@ -443,7 +596,7 @@ public final class Monitoring { */ @java.lang.Override public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() { - return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_; + return getServiceId(); } public static final int SLICE_ID_FIELD_NUMBER = 8; @@ -473,7 +626,7 @@ public final class Monitoring { */ @java.lang.Override public context.ContextOuterClass.SliceIdOrBuilder getSliceIdOrBuilder() { - return sliceId_ == null ? context.ContextOuterClass.SliceId.getDefaultInstance() : sliceId_; + return getSliceId(); } public static final int CONNECTION_ID_FIELD_NUMBER = 9; @@ -503,7 +656,7 @@ public final class Monitoring { */ @java.lang.Override public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder() { - return connectionId_ == null ? context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_; + return getConnectionId(); } public static final int LINK_ID_FIELD_NUMBER = 10; @@ -533,7 +686,7 @@ public final class Monitoring { */ @java.lang.Override public context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder() { - return linkId_ == null ? context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_; + return getLinkId(); } private byte memoizedIsInitialized = -1; @@ -554,7 +707,7 @@ public final class Monitoring { if (kpiId_ != null) { output.writeMessage(1, getKpiId()); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(kpiDescription_)) { + if (!getKpiDescriptionBytes().isEmpty()) { com.google.protobuf.GeneratedMessageV3.writeString(output, 2, kpiDescription_); } for (int i = 0; i < kpiIdList_.size(); i++) { @@ -581,7 +734,7 @@ public final class Monitoring { if (linkId_ != null) { output.writeMessage(10, getLinkId()); } - getUnknownFields().writeTo(output); + unknownFields.writeTo(output); } @java.lang.Override @@ -593,7 +746,7 @@ public final class Monitoring { if (kpiId_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getKpiId()); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(kpiDescription_)) { + if (!getKpiDescriptionBytes().isEmpty()) { size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, kpiDescription_); } for (int i = 0; i < kpiIdList_.size(); i++) { @@ -620,7 +773,7 @@ public final class Monitoring { if (linkId_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(10, getLinkId()); } - size += getUnknownFields().getSerializedSize(); + size += unknownFields.getSerializedSize(); memoizedSize = size; return size; } @@ -682,7 +835,7 @@ public final class Monitoring { if (!getLinkId().equals(other.getLinkId())) return false; } - if (!getUnknownFields().equals(other.getUnknownFields())) + if (!unknownFields.equals(other.unknownFields)) return false; return true; } @@ -730,7 +883,7 @@ public final class Monitoring { hash = (37 * hash) + LINK_ID_FIELD_NUMBER; hash = (53 * hash) + getLinkId().hashCode(); } - hash = (29 * hash) + getUnknownFields().hashCode(); + hash = (29 * hash) + unknownFields.hashCode(); memoizedHashCode = hash; return hash; } @@ -824,58 +977,71 @@ public final class Monitoring { // Construct using monitoring.Monitoring.KpiDescriptor.newBuilder() private Builder() { + maybeForceBuilderInitialization(); } private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + getKpiIdListFieldBuilder(); + } } @java.lang.Override public Builder clear() { super.clear(); - bitField0_ = 0; - kpiId_ = null; - if (kpiIdBuilder_ != null) { - kpiIdBuilder_.dispose(); + if (kpiIdBuilder_ == null) { + kpiId_ = null; + } else { + kpiId_ = null; kpiIdBuilder_ = null; } kpiDescription_ = ""; if (kpiIdListBuilder_ == null) { kpiIdList_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); } else { - kpiIdList_ = null; kpiIdListBuilder_.clear(); } - bitField0_ = (bitField0_ & ~0x00000004); kpiSampleType_ = 0; - deviceId_ = null; - if (deviceIdBuilder_ != null) { - deviceIdBuilder_.dispose(); + if (deviceIdBuilder_ == null) { + deviceId_ = null; + } else { + deviceId_ = null; deviceIdBuilder_ = null; } - endpointId_ = null; - if (endpointIdBuilder_ != null) { - endpointIdBuilder_.dispose(); + if (endpointIdBuilder_ == null) { + endpointId_ = null; + } else { + endpointId_ = null; endpointIdBuilder_ = null; } - serviceId_ = null; - if (serviceIdBuilder_ != null) { - serviceIdBuilder_.dispose(); + if (serviceIdBuilder_ == null) { + serviceId_ = null; + } else { + serviceId_ = null; serviceIdBuilder_ = null; } - sliceId_ = null; - if (sliceIdBuilder_ != null) { - sliceIdBuilder_.dispose(); + if (sliceIdBuilder_ == null) { + sliceId_ = null; + } else { + sliceId_ = null; sliceIdBuilder_ = null; } - connectionId_ = null; - if (connectionIdBuilder_ != null) { - connectionIdBuilder_.dispose(); + if (connectionIdBuilder_ == null) { + connectionId_ = null; + } else { + connectionId_ = null; connectionIdBuilder_ = null; } - linkId_ = null; - if (linkIdBuilder_ != null) { - linkIdBuilder_.dispose(); + if (linkIdBuilder_ == null) { + linkId_ = null; + } else { + linkId_ = null; linkIdBuilder_ = null; } return this; @@ -903,55 +1069,85 @@ public final class Monitoring { @java.lang.Override public monitoring.Monitoring.KpiDescriptor buildPartial() { monitoring.Monitoring.KpiDescriptor result = new monitoring.Monitoring.KpiDescriptor(this); - buildPartialRepeatedFields(result); - if (bitField0_ != 0) { - buildPartial0(result); + int from_bitField0_ = bitField0_; + if (kpiIdBuilder_ == null) { + result.kpiId_ = kpiId_; + } else { + result.kpiId_ = kpiIdBuilder_.build(); } - onBuilt(); - return result; - } - - private void buildPartialRepeatedFields(monitoring.Monitoring.KpiDescriptor result) { + result.kpiDescription_ = kpiDescription_; if (kpiIdListBuilder_ == null) { - if (((bitField0_ & 0x00000004) != 0)) { + if (((bitField0_ & 0x00000001) != 0)) { kpiIdList_ = java.util.Collections.unmodifiableList(kpiIdList_); - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); } result.kpiIdList_ = kpiIdList_; } else { result.kpiIdList_ = kpiIdListBuilder_.build(); } - } - - private void buildPartial0(monitoring.Monitoring.KpiDescriptor result) { - int from_bitField0_ = bitField0_; - if (((from_bitField0_ & 0x00000001) != 0)) { - result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build(); - } - if (((from_bitField0_ & 0x00000002) != 0)) { - result.kpiDescription_ = kpiDescription_; - } - if (((from_bitField0_ & 0x00000008) != 0)) { - result.kpiSampleType_ = kpiSampleType_; - } - if (((from_bitField0_ & 0x00000010) != 0)) { - result.deviceId_ = deviceIdBuilder_ == null ? deviceId_ : deviceIdBuilder_.build(); + result.kpiSampleType_ = kpiSampleType_; + if (deviceIdBuilder_ == null) { + result.deviceId_ = deviceId_; + } else { + result.deviceId_ = deviceIdBuilder_.build(); } - if (((from_bitField0_ & 0x00000020) != 0)) { - result.endpointId_ = endpointIdBuilder_ == null ? endpointId_ : endpointIdBuilder_.build(); + if (endpointIdBuilder_ == null) { + result.endpointId_ = endpointId_; + } else { + result.endpointId_ = endpointIdBuilder_.build(); } - if (((from_bitField0_ & 0x00000040) != 0)) { - result.serviceId_ = serviceIdBuilder_ == null ? serviceId_ : serviceIdBuilder_.build(); + if (serviceIdBuilder_ == null) { + result.serviceId_ = serviceId_; + } else { + result.serviceId_ = serviceIdBuilder_.build(); } - if (((from_bitField0_ & 0x00000080) != 0)) { - result.sliceId_ = sliceIdBuilder_ == null ? sliceId_ : sliceIdBuilder_.build(); + if (sliceIdBuilder_ == null) { + result.sliceId_ = sliceId_; + } else { + result.sliceId_ = sliceIdBuilder_.build(); } - if (((from_bitField0_ & 0x00000100) != 0)) { - result.connectionId_ = connectionIdBuilder_ == null ? connectionId_ : connectionIdBuilder_.build(); + if (connectionIdBuilder_ == null) { + result.connectionId_ = connectionId_; + } else { + result.connectionId_ = connectionIdBuilder_.build(); } - if (((from_bitField0_ & 0x00000200) != 0)) { - result.linkId_ = linkIdBuilder_ == null ? linkId_ : linkIdBuilder_.build(); + if (linkIdBuilder_ == null) { + result.linkId_ = linkId_; + } else { + result.linkId_ = linkIdBuilder_.build(); } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); } @java.lang.Override @@ -972,14 +1168,13 @@ public final class Monitoring { } if (!other.getKpiDescription().isEmpty()) { kpiDescription_ = other.kpiDescription_; - bitField0_ |= 0x00000002; onChanged(); } if (kpiIdListBuilder_ == null) { if (!other.kpiIdList_.isEmpty()) { if (kpiIdList_.isEmpty()) { kpiIdList_ = other.kpiIdList_; - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); } else { ensureKpiIdListIsMutable(); kpiIdList_.addAll(other.kpiIdList_); @@ -992,7 +1187,7 @@ public final class Monitoring { kpiIdListBuilder_.dispose(); kpiIdListBuilder_ = null; kpiIdList_ = other.kpiIdList_; - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); kpiIdListBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getKpiIdListFieldBuilder() : null; } else { kpiIdListBuilder_.addAllMessages(other.kpiIdList_); @@ -1020,7 +1215,7 @@ public final class Monitoring { if (other.hasLinkId()) { mergeLinkId(other.getLinkId()); } - this.mergeUnknownFields(other.getUnknownFields()); + this.mergeUnknownFields(other.unknownFields); onChanged(); return this; } @@ -1032,110 +1227,17 @@ public final class Monitoring { @java.lang.Override public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - if (extensionRegistry == null) { - throw new java.lang.NullPointerException(); - } + monitoring.Monitoring.KpiDescriptor parsedMessage = null; try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch(tag) { - case 0: - done = true; - break; - case 10: - { - input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000001; - break; - } - // case 10 - case 18: - { - kpiDescription_ = input.readStringRequireUtf8(); - bitField0_ |= 0x00000002; - break; - } - // case 18 - case 26: - { - monitoring.Monitoring.KpiId m = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry); - if (kpiIdListBuilder_ == null) { - ensureKpiIdListIsMutable(); - kpiIdList_.add(m); - } else { - kpiIdListBuilder_.addMessage(m); - } - break; - } - // case 26 - case 32: - { - kpiSampleType_ = input.readEnum(); - bitField0_ |= 0x00000008; - break; - } - // case 32 - case 42: - { - input.readMessage(getDeviceIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000010; - break; - } - // case 42 - case 50: - { - input.readMessage(getEndpointIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000020; - break; - } - // case 50 - case 58: - { - input.readMessage(getServiceIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000040; - break; - } - // case 58 - case 66: - { - input.readMessage(getSliceIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000080; - break; - } - // case 66 - case 74: - { - input.readMessage(getConnectionIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000100; - break; - } - // case 74 - case 82: - { - input.readMessage(getLinkIdFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000200; - break; - } - // case 82 - default: - { - if (!super.parseUnknownField(input, extensionRegistry, tag)) { - // was an endgroup tag - done = true; - } - break; - } - } - // switch (tag) - } - // while (!done) + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (monitoring.Monitoring.KpiDescriptor) e.getUnfinishedMessage(); throw e.unwrapIOException(); } finally { - onChanged(); + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } } - // finally return this; } @@ -1150,7 +1252,7 @@ public final class Monitoring { * @return Whether the kpiId field is set. */ public boolean hasKpiId() { - return ((bitField0_ & 0x00000001) != 0); + return kpiIdBuilder_ != null || kpiId_ != null; } /** @@ -1174,11 +1276,10 @@ public final class Monitoring { throw new NullPointerException(); } kpiId_ = value; + onChanged(); } else { kpiIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -1188,11 +1289,10 @@ public final class Monitoring { public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) { if (kpiIdBuilder_ == null) { kpiId_ = builderForValue.build(); + onChanged(); } else { kpiIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -1201,16 +1301,15 @@ public final class Monitoring { */ public Builder mergeKpiId(monitoring.Monitoring.KpiId value) { if (kpiIdBuilder_ == null) { - if (((bitField0_ & 0x00000001) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) { - getKpiIdBuilder().mergeFrom(value); + if (kpiId_ != null) { + kpiId_ = monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial(); } else { kpiId_ = value; } + onChanged(); } else { kpiIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000001; - onChanged(); return this; } @@ -1218,13 +1317,13 @@ public final class Monitoring { * .monitoring.KpiId kpi_id = 1; */ public Builder clearKpiId() { - bitField0_ = (bitField0_ & ~0x00000001); - kpiId_ = null; - if (kpiIdBuilder_ != null) { - kpiIdBuilder_.dispose(); + if (kpiIdBuilder_ == null) { + kpiId_ = null; + onChanged(); + } else { + kpiId_ = null; kpiIdBuilder_ = null; } - onChanged(); return this; } @@ -1232,7 +1331,6 @@ public final class Monitoring { * .monitoring.KpiId kpi_id = 1; */ public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() { - bitField0_ |= 0x00000001; onChanged(); return getKpiIdFieldBuilder().getBuilder(); } @@ -1302,7 +1400,6 @@ public final class Monitoring { throw new NullPointerException(); } kpiDescription_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -1313,7 +1410,6 @@ public final class Monitoring { */ public Builder clearKpiDescription() { kpiDescription_ = getDefaultInstance().getKpiDescription(); - bitField0_ = (bitField0_ & ~0x00000002); onChanged(); return this; } @@ -1329,7 +1425,6 @@ public final class Monitoring { } checkByteStringIsUtf8(value); kpiDescription_ = value; - bitField0_ |= 0x00000002; onChanged(); return this; } @@ -1337,9 +1432,9 @@ public final class Monitoring { private java.util.List kpiIdList_ = java.util.Collections.emptyList(); private void ensureKpiIdListIsMutable() { - if (!((bitField0_ & 0x00000004) != 0)) { + if (!((bitField0_ & 0x00000001) != 0)) { kpiIdList_ = new java.util.ArrayList(kpiIdList_); - bitField0_ |= 0x00000004; + bitField0_ |= 0x00000001; } } @@ -1491,7 +1586,7 @@ public final class Monitoring { public Builder clearKpiIdList() { if (kpiIdListBuilder_ == null) { kpiIdList_ = java.util.Collections.emptyList(); - bitField0_ = (bitField0_ & ~0x00000004); + bitField0_ = (bitField0_ & ~0x00000001); onChanged(); } else { kpiIdListBuilder_.clear(); @@ -1565,7 +1660,7 @@ public final class Monitoring { private com.google.protobuf.RepeatedFieldBuilderV3 getKpiIdListFieldBuilder() { if (kpiIdListBuilder_ == null) { - kpiIdListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(kpiIdList_, ((bitField0_ & 0x00000004) != 0), getParentForChildren(), isClean()); + kpiIdListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(kpiIdList_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean()); kpiIdList_ = null; } return kpiIdListBuilder_; @@ -1589,7 +1684,6 @@ public final class Monitoring { */ public Builder setKpiSampleTypeValue(int value) { kpiSampleType_ = value; - bitField0_ |= 0x00000008; onChanged(); return this; } @@ -1600,7 +1694,8 @@ public final class Monitoring { */ @java.lang.Override public kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleType() { - kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.forNumber(kpiSampleType_); + @SuppressWarnings("deprecation") + kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.valueOf(kpiSampleType_); return result == null ? kpi_sample_types.KpiSampleTypes.KpiSampleType.UNRECOGNIZED : result; } @@ -1613,7 +1708,6 @@ public final class Monitoring { if (value == null) { throw new NullPointerException(); } - bitField0_ |= 0x00000008; kpiSampleType_ = value.getNumber(); onChanged(); return this; @@ -1624,7 +1718,6 @@ public final class Monitoring { * @return This builder for chaining. */ public Builder clearKpiSampleType() { - bitField0_ = (bitField0_ & ~0x00000008); kpiSampleType_ = 0; onChanged(); return this; @@ -1639,7 +1732,7 @@ public final class Monitoring { * @return Whether the deviceId field is set. */ public boolean hasDeviceId() { - return ((bitField0_ & 0x00000010) != 0); + return deviceIdBuilder_ != null || deviceId_ != null; } /** @@ -1663,11 +1756,10 @@ public final class Monitoring { throw new NullPointerException(); } deviceId_ = value; + onChanged(); } else { deviceIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000010; - onChanged(); return this; } @@ -1677,11 +1769,10 @@ public final class Monitoring { public Builder setDeviceId(context.ContextOuterClass.DeviceId.Builder builderForValue) { if (deviceIdBuilder_ == null) { deviceId_ = builderForValue.build(); + onChanged(); } else { deviceIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000010; - onChanged(); return this; } @@ -1690,16 +1781,15 @@ public final class Monitoring { */ public Builder mergeDeviceId(context.ContextOuterClass.DeviceId value) { if (deviceIdBuilder_ == null) { - if (((bitField0_ & 0x00000010) != 0) && deviceId_ != null && deviceId_ != context.ContextOuterClass.DeviceId.getDefaultInstance()) { - getDeviceIdBuilder().mergeFrom(value); + if (deviceId_ != null) { + deviceId_ = context.ContextOuterClass.DeviceId.newBuilder(deviceId_).mergeFrom(value).buildPartial(); } else { deviceId_ = value; } + onChanged(); } else { deviceIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000010; - onChanged(); return this; } @@ -1707,13 +1797,13 @@ public final class Monitoring { * .context.DeviceId device_id = 5; */ public Builder clearDeviceId() { - bitField0_ = (bitField0_ & ~0x00000010); - deviceId_ = null; - if (deviceIdBuilder_ != null) { - deviceIdBuilder_.dispose(); + if (deviceIdBuilder_ == null) { + deviceId_ = null; + onChanged(); + } else { + deviceId_ = null; deviceIdBuilder_ = null; } - onChanged(); return this; } @@ -1721,7 +1811,6 @@ public final class Monitoring { * .context.DeviceId device_id = 5; */ public context.ContextOuterClass.DeviceId.Builder getDeviceIdBuilder() { - bitField0_ |= 0x00000010; onChanged(); return getDeviceIdFieldBuilder().getBuilder(); } @@ -1757,7 +1846,7 @@ public final class Monitoring { * @return Whether the endpointId field is set. */ public boolean hasEndpointId() { - return ((bitField0_ & 0x00000020) != 0); + return endpointIdBuilder_ != null || endpointId_ != null; } /** @@ -1781,11 +1870,10 @@ public final class Monitoring { throw new NullPointerException(); } endpointId_ = value; + onChanged(); } else { endpointIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000020; - onChanged(); return this; } @@ -1795,11 +1883,10 @@ public final class Monitoring { public Builder setEndpointId(context.ContextOuterClass.EndPointId.Builder builderForValue) { if (endpointIdBuilder_ == null) { endpointId_ = builderForValue.build(); + onChanged(); } else { endpointIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000020; - onChanged(); return this; } @@ -1808,16 +1895,15 @@ public final class Monitoring { */ public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) { if (endpointIdBuilder_ == null) { - if (((bitField0_ & 0x00000020) != 0) && endpointId_ != null && endpointId_ != context.ContextOuterClass.EndPointId.getDefaultInstance()) { - getEndpointIdBuilder().mergeFrom(value); + if (endpointId_ != null) { + endpointId_ = context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial(); } else { endpointId_ = value; } + onChanged(); } else { endpointIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000020; - onChanged(); return this; } @@ -1825,13 +1911,13 @@ public final class Monitoring { * .context.EndPointId endpoint_id = 6; */ public Builder clearEndpointId() { - bitField0_ = (bitField0_ & ~0x00000020); - endpointId_ = null; - if (endpointIdBuilder_ != null) { - endpointIdBuilder_.dispose(); + if (endpointIdBuilder_ == null) { + endpointId_ = null; + onChanged(); + } else { + endpointId_ = null; endpointIdBuilder_ = null; } - onChanged(); return this; } @@ -1839,7 +1925,6 @@ public final class Monitoring { * .context.EndPointId endpoint_id = 6; */ public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() { - bitField0_ |= 0x00000020; onChanged(); return getEndpointIdFieldBuilder().getBuilder(); } @@ -1875,7 +1960,7 @@ public final class Monitoring { * @return Whether the serviceId field is set. */ public boolean hasServiceId() { - return ((bitField0_ & 0x00000040) != 0); + return serviceIdBuilder_ != null || serviceId_ != null; } /** @@ -1899,11 +1984,10 @@ public final class Monitoring { throw new NullPointerException(); } serviceId_ = value; + onChanged(); } else { serviceIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000040; - onChanged(); return this; } @@ -1913,11 +1997,10 @@ public final class Monitoring { public Builder setServiceId(context.ContextOuterClass.ServiceId.Builder builderForValue) { if (serviceIdBuilder_ == null) { serviceId_ = builderForValue.build(); + onChanged(); } else { serviceIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000040; - onChanged(); return this; } @@ -1926,16 +2009,15 @@ public final class Monitoring { */ public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) { if (serviceIdBuilder_ == null) { - if (((bitField0_ & 0x00000040) != 0) && serviceId_ != null && serviceId_ != context.ContextOuterClass.ServiceId.getDefaultInstance()) { - getServiceIdBuilder().mergeFrom(value); + if (serviceId_ != null) { + serviceId_ = context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial(); } else { serviceId_ = value; } + onChanged(); } else { serviceIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000040; - onChanged(); return this; } @@ -1943,13 +2025,13 @@ public final class Monitoring { * .context.ServiceId service_id = 7; */ public Builder clearServiceId() { - bitField0_ = (bitField0_ & ~0x00000040); - serviceId_ = null; - if (serviceIdBuilder_ != null) { - serviceIdBuilder_.dispose(); + if (serviceIdBuilder_ == null) { + serviceId_ = null; + onChanged(); + } else { + serviceId_ = null; serviceIdBuilder_ = null; } - onChanged(); return this; } @@ -1957,7 +2039,6 @@ public final class Monitoring { * .context.ServiceId service_id = 7; */ public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() { - bitField0_ |= 0x00000040; onChanged(); return getServiceIdFieldBuilder().getBuilder(); } @@ -1993,7 +2074,7 @@ public final class Monitoring { * @return Whether the sliceId field is set. */ public boolean hasSliceId() { - return ((bitField0_ & 0x00000080) != 0); + return sliceIdBuilder_ != null || sliceId_ != null; } /** @@ -2017,11 +2098,10 @@ public final class Monitoring { throw new NullPointerException(); } sliceId_ = value; + onChanged(); } else { sliceIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000080; - onChanged(); return this; } @@ -2031,11 +2111,10 @@ public final class Monitoring { public Builder setSliceId(context.ContextOuterClass.SliceId.Builder builderForValue) { if (sliceIdBuilder_ == null) { sliceId_ = builderForValue.build(); + onChanged(); } else { sliceIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000080; - onChanged(); return this; } @@ -2044,16 +2123,15 @@ public final class Monitoring { */ public Builder mergeSliceId(context.ContextOuterClass.SliceId value) { if (sliceIdBuilder_ == null) { - if (((bitField0_ & 0x00000080) != 0) && sliceId_ != null && sliceId_ != context.ContextOuterClass.SliceId.getDefaultInstance()) { - getSliceIdBuilder().mergeFrom(value); + if (sliceId_ != null) { + sliceId_ = context.ContextOuterClass.SliceId.newBuilder(sliceId_).mergeFrom(value).buildPartial(); } else { sliceId_ = value; } + onChanged(); } else { sliceIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000080; - onChanged(); return this; } @@ -2061,13 +2139,13 @@ public final class Monitoring { * .context.SliceId slice_id = 8; */ public Builder clearSliceId() { - bitField0_ = (bitField0_ & ~0x00000080); - sliceId_ = null; - if (sliceIdBuilder_ != null) { - sliceIdBuilder_.dispose(); + if (sliceIdBuilder_ == null) { + sliceId_ = null; + onChanged(); + } else { + sliceId_ = null; sliceIdBuilder_ = null; } - onChanged(); return this; } @@ -2075,7 +2153,6 @@ public final class Monitoring { * .context.SliceId slice_id = 8; */ public context.ContextOuterClass.SliceId.Builder getSliceIdBuilder() { - bitField0_ |= 0x00000080; onChanged(); return getSliceIdFieldBuilder().getBuilder(); } @@ -2111,7 +2188,7 @@ public final class Monitoring { * @return Whether the connectionId field is set. */ public boolean hasConnectionId() { - return ((bitField0_ & 0x00000100) != 0); + return connectionIdBuilder_ != null || connectionId_ != null; } /** @@ -2135,11 +2212,10 @@ public final class Monitoring { throw new NullPointerException(); } connectionId_ = value; + onChanged(); } else { connectionIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000100; - onChanged(); return this; } @@ -2149,11 +2225,10 @@ public final class Monitoring { public Builder setConnectionId(context.ContextOuterClass.ConnectionId.Builder builderForValue) { if (connectionIdBuilder_ == null) { connectionId_ = builderForValue.build(); + onChanged(); } else { connectionIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000100; - onChanged(); return this; } @@ -2162,16 +2237,15 @@ public final class Monitoring { */ public Builder mergeConnectionId(context.ContextOuterClass.ConnectionId value) { if (connectionIdBuilder_ == null) { - if (((bitField0_ & 0x00000100) != 0) && connectionId_ != null && connectionId_ != context.ContextOuterClass.ConnectionId.getDefaultInstance()) { - getConnectionIdBuilder().mergeFrom(value); + if (connectionId_ != null) { + connectionId_ = context.ContextOuterClass.ConnectionId.newBuilder(connectionId_).mergeFrom(value).buildPartial(); } else { connectionId_ = value; } + onChanged(); } else { connectionIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000100; - onChanged(); return this; } @@ -2179,13 +2253,13 @@ public final class Monitoring { * .context.ConnectionId connection_id = 9; */ public Builder clearConnectionId() { - bitField0_ = (bitField0_ & ~0x00000100); - connectionId_ = null; - if (connectionIdBuilder_ != null) { - connectionIdBuilder_.dispose(); + if (connectionIdBuilder_ == null) { + connectionId_ = null; + onChanged(); + } else { + connectionId_ = null; connectionIdBuilder_ = null; } - onChanged(); return this; } @@ -2193,7 +2267,6 @@ public final class Monitoring { * .context.ConnectionId connection_id = 9; */ public context.ContextOuterClass.ConnectionId.Builder getConnectionIdBuilder() { - bitField0_ |= 0x00000100; onChanged(); return getConnectionIdFieldBuilder().getBuilder(); } @@ -2229,7 +2302,7 @@ public final class Monitoring { * @return Whether the linkId field is set. */ public boolean hasLinkId() { - return ((bitField0_ & 0x00000200) != 0); + return linkIdBuilder_ != null || linkId_ != null; } /** @@ -2253,11 +2326,10 @@ public final class Monitoring { throw new NullPointerException(); } linkId_ = value; + onChanged(); } else { linkIdBuilder_.setMessage(value); } - bitField0_ |= 0x00000200; - onChanged(); return this; } @@ -2267,11 +2339,10 @@ public final class Monitoring { public Builder setLinkId(context.ContextOuterClass.LinkId.Builder builderForValue) { if (linkIdBuilder_ == null) { linkId_ = builderForValue.build(); + onChanged(); } else { linkIdBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000200; - onChanged(); return this; } @@ -2280,16 +2351,15 @@ public final class Monitoring { */ public Builder mergeLinkId(context.ContextOuterClass.LinkId value) { if (linkIdBuilder_ == null) { - if (((bitField0_ & 0x00000200) != 0) && linkId_ != null && linkId_ != context.ContextOuterClass.LinkId.getDefaultInstance()) { - getLinkIdBuilder().mergeFrom(value); + if (linkId_ != null) { + linkId_ = context.ContextOuterClass.LinkId.newBuilder(linkId_).mergeFrom(value).buildPartial(); } else { linkId_ = value; } + onChanged(); } else { linkIdBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000200; - onChanged(); return this; } @@ -2297,13 +2367,13 @@ public final class Monitoring { * .context.LinkId link_id = 10; */ public Builder clearLinkId() { - bitField0_ = (bitField0_ & ~0x00000200); - linkId_ = null; - if (linkIdBuilder_ != null) { - linkIdBuilder_.dispose(); + if (linkIdBuilder_ == null) { + linkId_ = null; + onChanged(); + } else { + linkId_ = null; linkIdBuilder_ = null; } - onChanged(); return this; } @@ -2311,7 +2381,6 @@ public final class Monitoring { * .context.LinkId link_id = 10; */ public context.ContextOuterClass.LinkId.Builder getLinkIdBuilder() { - bitField0_ |= 0x00000200; onChanged(); return getLinkIdFieldBuilder().getBuilder(); } @@ -2365,17 +2434,7 @@ public final class Monitoring { @java.lang.Override public KpiDescriptor parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { - Builder builder = newBuilder(); - try { - builder.mergeFrom(input, extensionRegistry); - } catch (com.google.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(builder.buildPartial()); - } catch (com.google.protobuf.UninitializedMessageException e) { - throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); - } catch (java.io.IOException e) { - throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial()); - } - return builder.buildPartial(); + return new KpiDescriptor(input, extensionRegistry); } }; @@ -2453,17 +2512,78 @@ public final class Monitoring { return new MonitorKpiRequest(); } - public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { - return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_descriptor; - } - @java.lang.Override - protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { - return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_fieldAccessorTable.ensureFieldAccessorsInitialized(monitoring.Monitoring.MonitorKpiRequest.class, monitoring.Monitoring.MonitorKpiRequest.Builder.class); + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; } - public static final int KPI_ID_FIELD_NUMBER = 1; - + private MonitorKpiRequest(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { + this(); + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch(tag) { + case 0: + done = true; + break; + case 10: + { + monitoring.Monitoring.KpiId.Builder subBuilder = null; + if (kpiId_ != null) { + subBuilder = kpiId_.toBuilder(); + } + kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(kpiId_); + kpiId_ = subBuilder.buildPartial(); + } + break; + } + case 21: + { + monitoringWindowS_ = input.readFloat(); + break; + } + case 29: + { + samplingRateS_ = input.readFloat(); + break; + } + default: + { + if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { + done = true; + } + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() { + return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_fieldAccessorTable.ensureFieldAccessorsInitialized(monitoring.Monitoring.MonitorKpiRequest.class, monitoring.Monitoring.MonitorKpiRequest.Builder.class); + } + + public static final int KPI_ID_FIELD_NUMBER = 1; + private monitoring.Monitoring.KpiId kpiId_; /** @@ -2489,12 +2609,12 @@ public final class Monitoring { */ @java.lang.Override public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() { - return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_; + return getKpiId(); } public static final int MONITORING_WINDOW_S_FIELD_NUMBER = 2; - private float monitoringWindowS_ = 0F; + private float monitoringWindowS_; /** * float monitoring_window_s = 2; @@ -2507,7 +2627,7 @@ public final class Monitoring { public static final int SAMPLING_RATE_S_FIELD_NUMBER = 3; - private float samplingRateS_ = 0F; + private float samplingRateS_; /** *
@@ -2540,13 +2660,13 @@ public final class Monitoring {
             if (kpiId_ != null) {
                 output.writeMessage(1, getKpiId());
             }
-            if (java.lang.Float.floatToRawIntBits(monitoringWindowS_) != 0) {
+            if (monitoringWindowS_ != 0F) {
                 output.writeFloat(2, monitoringWindowS_);
             }
-            if (java.lang.Float.floatToRawIntBits(samplingRateS_) != 0) {
+            if (samplingRateS_ != 0F) {
                 output.writeFloat(3, samplingRateS_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -2558,13 +2678,13 @@ public final class Monitoring {
             if (kpiId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getKpiId());
             }
-            if (java.lang.Float.floatToRawIntBits(monitoringWindowS_) != 0) {
+            if (monitoringWindowS_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(2, monitoringWindowS_);
             }
-            if (java.lang.Float.floatToRawIntBits(samplingRateS_) != 0) {
+            if (samplingRateS_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(3, samplingRateS_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -2588,7 +2708,7 @@ public final class Monitoring {
                 return false;
             if (java.lang.Float.floatToIntBits(getSamplingRateS()) != java.lang.Float.floatToIntBits(other.getSamplingRateS()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -2608,7 +2728,7 @@ public final class Monitoring {
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getMonitoringWindowS());
             hash = (37 * hash) + SAMPLING_RATE_S_FIELD_NUMBER;
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getSamplingRateS());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -2702,19 +2822,26 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.MonitorKpiRequest.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
                 monitoringWindowS_ = 0F;
@@ -2744,24 +2871,45 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.MonitorKpiRequest buildPartial() {
                 monitoring.Monitoring.MonitorKpiRequest result = new monitoring.Monitoring.MonitorKpiRequest(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (kpiIdBuilder_ == null) {
+                    result.kpiId_ = kpiId_;
+                } else {
+                    result.kpiId_ = kpiIdBuilder_.build();
                 }
+                result.monitoringWindowS_ = monitoringWindowS_;
+                result.samplingRateS_ = samplingRateS_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.MonitorKpiRequest result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.monitoringWindowS_ = monitoringWindowS_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.samplingRateS_ = samplingRateS_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -2786,7 +2934,7 @@ public final class Monitoring {
                 if (other.getSamplingRateS() != 0F) {
                     setSamplingRateS(other.getSamplingRateS());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -2798,61 +2946,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.MonitorKpiRequest parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 21:
-                                {
-                                    monitoringWindowS_ = input.readFloat();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 21
-                            case 29:
-                                {
-                                    samplingRateS_ = input.readFloat();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 29
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.MonitorKpiRequest) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.KpiId kpiId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 kpiIdBuilder_;
@@ -2862,7 +2969,7 @@ public final class Monitoring {
              * @return Whether the kpiId field is set.
              */
             public boolean hasKpiId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return kpiIdBuilder_ != null || kpiId_ != null;
             }
 
             /**
@@ -2886,11 +2993,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiId_ = value;
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -2900,11 +3006,10 @@ public final class Monitoring {
             public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) {
                 if (kpiIdBuilder_ == null) {
                     kpiId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -2913,16 +3018,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiId(monitoring.Monitoring.KpiId value) {
                 if (kpiIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) {
-                        getKpiIdBuilder().mergeFrom(value);
+                    if (kpiId_ != null) {
+                        kpiId_ = monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial();
                     } else {
                         kpiId_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -2930,13 +3034,13 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 1;
              */
             public Builder clearKpiId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                    onChanged();
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -2944,7 +3048,6 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 1;
              */
             public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getKpiIdFieldBuilder().getBuilder();
             }
@@ -2989,7 +3092,6 @@ public final class Monitoring {
              */
             public Builder setMonitoringWindowS(float value) {
                 monitoringWindowS_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -2999,7 +3101,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearMonitoringWindowS() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 monitoringWindowS_ = 0F;
                 onChanged();
                 return this;
@@ -3031,7 +3132,6 @@ public final class Monitoring {
              */
             public Builder setSamplingRateS(float value) {
                 samplingRateS_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -3045,7 +3145,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearSamplingRateS() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 samplingRateS_ = 0F;
                 onChanged();
                 return this;
@@ -3078,17 +3177,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public MonitorKpiRequest parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new MonitorKpiRequest(input, extensionRegistry);
             }
         };
 
@@ -3233,6 +3322,93 @@ public final class Monitoring {
             return new KpiQuery();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private KpiQuery(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    kpiIds_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                kpiIds_.add(input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry));
+                                break;
+                            }
+                        case 21:
+                            {
+                                monitoringWindowS_ = input.readFloat();
+                                break;
+                            }
+                        case 24:
+                            {
+                                lastNSamples_ = input.readUInt32();
+                                break;
+                            }
+                        case 34:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (startTimestamp_ != null) {
+                                    subBuilder = startTimestamp_.toBuilder();
+                                }
+                                startTimestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(startTimestamp_);
+                                    startTimestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 42:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (endTimestamp_ != null) {
+                                    subBuilder = endTimestamp_.toBuilder();
+                                }
+                                endTimestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endTimestamp_);
+                                    endTimestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    kpiIds_ = java.util.Collections.unmodifiableList(kpiIds_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_KpiQuery_descriptor;
         }
@@ -3244,7 +3420,6 @@ public final class Monitoring {
 
         public static final int KPI_IDS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List kpiIds_;
 
         /**
@@ -3289,7 +3464,7 @@ public final class Monitoring {
 
         public static final int MONITORING_WINDOW_S_FIELD_NUMBER = 2;
 
-        private float monitoringWindowS_ = 0F;
+        private float monitoringWindowS_;
 
         /**
          * float monitoring_window_s = 2;
@@ -3302,7 +3477,7 @@ public final class Monitoring {
 
         public static final int LAST_N_SAMPLES_FIELD_NUMBER = 3;
 
-        private int lastNSamples_ = 0;
+        private int lastNSamples_;
 
         /**
          * 
@@ -3356,7 +3531,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getStartTimestampOrBuilder() {
-            return startTimestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : startTimestamp_;
+            return getStartTimestamp();
         }
 
         public static final int END_TIMESTAMP_FIELD_NUMBER = 5;
@@ -3398,7 +3573,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getEndTimestampOrBuilder() {
-            return endTimestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : endTimestamp_;
+            return getEndTimestamp();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -3419,7 +3594,7 @@ public final class Monitoring {
             for (int i = 0; i < kpiIds_.size(); i++) {
                 output.writeMessage(1, kpiIds_.get(i));
             }
-            if (java.lang.Float.floatToRawIntBits(monitoringWindowS_) != 0) {
+            if (monitoringWindowS_ != 0F) {
                 output.writeFloat(2, monitoringWindowS_);
             }
             if (lastNSamples_ != 0) {
@@ -3431,7 +3606,7 @@ public final class Monitoring {
             if (endTimestamp_ != null) {
                 output.writeMessage(5, getEndTimestamp());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -3443,7 +3618,7 @@ public final class Monitoring {
             for (int i = 0; i < kpiIds_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, kpiIds_.get(i));
             }
-            if (java.lang.Float.floatToRawIntBits(monitoringWindowS_) != 0) {
+            if (monitoringWindowS_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(2, monitoringWindowS_);
             }
             if (lastNSamples_ != 0) {
@@ -3455,7 +3630,7 @@ public final class Monitoring {
             if (endTimestamp_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, getEndTimestamp());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -3487,7 +3662,7 @@ public final class Monitoring {
                 if (!getEndTimestamp().equals(other.getEndTimestamp()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -3515,7 +3690,7 @@ public final class Monitoring {
                 hash = (37 * hash) + END_TIMESTAMP_FIELD_NUMBER;
                 hash = (53 * hash) + getEndTimestamp().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -3609,33 +3784,41 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.KpiQuery.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getKpiIdsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (kpiIdsBuilder_ == null) {
                     kpiIds_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    kpiIds_ = null;
                     kpiIdsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 monitoringWindowS_ = 0F;
                 lastNSamples_ = 0;
-                startTimestamp_ = null;
-                if (startTimestampBuilder_ != null) {
-                    startTimestampBuilder_.dispose();
+                if (startTimestampBuilder_ == null) {
+                    startTimestamp_ = null;
+                } else {
+                    startTimestamp_ = null;
                     startTimestampBuilder_ = null;
                 }
-                endTimestamp_ = null;
-                if (endTimestampBuilder_ != null) {
-                    endTimestampBuilder_.dispose();
+                if (endTimestampBuilder_ == null) {
+                    endTimestamp_ = null;
+                } else {
+                    endTimestamp_ = null;
                     endTimestampBuilder_ = null;
                 }
                 return this;
@@ -3663,15 +3846,7 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.KpiQuery buildPartial() {
                 monitoring.Monitoring.KpiQuery result = new monitoring.Monitoring.KpiQuery(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(monitoring.Monitoring.KpiQuery result) {
+                int from_bitField0_ = bitField0_;
                 if (kpiIdsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         kpiIds_ = java.util.Collections.unmodifiableList(kpiIds_);
@@ -3681,22 +3856,50 @@ public final class Monitoring {
                 } else {
                     result.kpiIds_ = kpiIdsBuilder_.build();
                 }
-            }
-
-            private void buildPartial0(monitoring.Monitoring.KpiQuery result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.monitoringWindowS_ = monitoringWindowS_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.lastNSamples_ = lastNSamples_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.startTimestamp_ = startTimestampBuilder_ == null ? startTimestamp_ : startTimestampBuilder_.build();
+                result.monitoringWindowS_ = monitoringWindowS_;
+                result.lastNSamples_ = lastNSamples_;
+                if (startTimestampBuilder_ == null) {
+                    result.startTimestamp_ = startTimestamp_;
+                } else {
+                    result.startTimestamp_ = startTimestampBuilder_.build();
                 }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.endTimestamp_ = endTimestampBuilder_ == null ? endTimestamp_ : endTimestampBuilder_.build();
+                if (endTimestampBuilder_ == null) {
+                    result.endTimestamp_ = endTimestamp_;
+                } else {
+                    result.endTimestamp_ = endTimestampBuilder_.build();
                 }
+                onBuilt();
+                return result;
+            }
+
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -3748,7 +3951,7 @@ public final class Monitoring {
                 if (other.hasEndTimestamp()) {
                     mergeEndTimestamp(other.getEndTimestamp());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -3760,75 +3963,17 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.KpiQuery parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    monitoring.Monitoring.KpiId m = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry);
-                                    if (kpiIdsBuilder_ == null) {
-                                        ensureKpiIdsIsMutable();
-                                        kpiIds_.add(m);
-                                    } else {
-                                        kpiIdsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            case 21:
-                                {
-                                    monitoringWindowS_ = input.readFloat();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 21
-                            case 24:
-                                {
-                                    lastNSamples_ = input.readUInt32();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 34:
-                                {
-                                    input.readMessage(getStartTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    input.readMessage(getEndTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 42
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.KpiQuery) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -4089,7 +4234,6 @@ public final class Monitoring {
              */
             public Builder setMonitoringWindowS(float value) {
                 monitoringWindowS_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -4099,7 +4243,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearMonitoringWindowS() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 monitoringWindowS_ = 0F;
                 onChanged();
                 return this;
@@ -4131,7 +4274,6 @@ public final class Monitoring {
              */
             public Builder setLastNSamples(int value) {
                 lastNSamples_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -4145,7 +4287,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearLastNSamples() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 lastNSamples_ = 0;
                 onChanged();
                 return this;
@@ -4164,7 +4305,7 @@ public final class Monitoring {
              * @return Whether the startTimestamp field is set.
              */
             public boolean hasStartTimestamp() {
-                return ((bitField0_ & 0x00000008) != 0);
+                return startTimestampBuilder_ != null || startTimestamp_ != null;
             }
 
             /**
@@ -4196,11 +4337,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     startTimestamp_ = value;
+                    onChanged();
                 } else {
                     startTimestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -4214,11 +4354,10 @@ public final class Monitoring {
             public Builder setStartTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (startTimestampBuilder_ == null) {
                     startTimestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     startTimestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -4231,16 +4370,15 @@ public final class Monitoring {
              */
             public Builder mergeStartTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (startTimestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0) && startTimestamp_ != null && startTimestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getStartTimestampBuilder().mergeFrom(value);
+                    if (startTimestamp_ != null) {
+                        startTimestamp_ = context.ContextOuterClass.Timestamp.newBuilder(startTimestamp_).mergeFrom(value).buildPartial();
                     } else {
                         startTimestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     startTimestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -4252,13 +4390,13 @@ public final class Monitoring {
              * .context.Timestamp start_timestamp = 4;
              */
             public Builder clearStartTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000008);
-                startTimestamp_ = null;
-                if (startTimestampBuilder_ != null) {
-                    startTimestampBuilder_.dispose();
+                if (startTimestampBuilder_ == null) {
+                    startTimestamp_ = null;
+                    onChanged();
+                } else {
+                    startTimestamp_ = null;
                     startTimestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -4270,7 +4408,6 @@ public final class Monitoring {
              * .context.Timestamp start_timestamp = 4;
              */
             public context.ContextOuterClass.Timestamp.Builder getStartTimestampBuilder() {
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return getStartTimestampFieldBuilder().getBuilder();
             }
@@ -4318,7 +4455,7 @@ public final class Monitoring {
              * @return Whether the endTimestamp field is set.
              */
             public boolean hasEndTimestamp() {
-                return ((bitField0_ & 0x00000010) != 0);
+                return endTimestampBuilder_ != null || endTimestamp_ != null;
             }
 
             /**
@@ -4350,11 +4487,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     endTimestamp_ = value;
+                    onChanged();
                 } else {
                     endTimestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -4368,11 +4504,10 @@ public final class Monitoring {
             public Builder setEndTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (endTimestampBuilder_ == null) {
                     endTimestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endTimestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -4385,16 +4520,15 @@ public final class Monitoring {
              */
             public Builder mergeEndTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (endTimestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000010) != 0) && endTimestamp_ != null && endTimestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getEndTimestampBuilder().mergeFrom(value);
+                    if (endTimestamp_ != null) {
+                        endTimestamp_ = context.ContextOuterClass.Timestamp.newBuilder(endTimestamp_).mergeFrom(value).buildPartial();
                     } else {
                         endTimestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     endTimestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -4406,13 +4540,13 @@ public final class Monitoring {
              * .context.Timestamp end_timestamp = 5;
              */
             public Builder clearEndTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000010);
-                endTimestamp_ = null;
-                if (endTimestampBuilder_ != null) {
-                    endTimestampBuilder_.dispose();
+                if (endTimestampBuilder_ == null) {
+                    endTimestamp_ = null;
+                    onChanged();
+                } else {
+                    endTimestamp_ = null;
                     endTimestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -4424,7 +4558,6 @@ public final class Monitoring {
              * .context.Timestamp end_timestamp = 5;
              */
             public context.ContextOuterClass.Timestamp.Builder getEndTimestampBuilder() {
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return getEndTimestampFieldBuilder().getBuilder();
             }
@@ -4486,17 +4619,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public KpiQuery parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new KpiQuery(input, extensionRegistry);
             }
         };
 
@@ -4579,6 +4702,70 @@ public final class Monitoring {
             return new RawKpi();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private RawKpi(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (timestamp_ != null) {
+                                    subBuilder = timestamp_.toBuilder();
+                                }
+                                timestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(timestamp_);
+                                    timestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                monitoring.Monitoring.KpiValue.Builder subBuilder = null;
+                                if (kpiValue_ != null) {
+                                    subBuilder = kpiValue_.toBuilder();
+                                }
+                                kpiValue_ = input.readMessage(monitoring.Monitoring.KpiValue.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiValue_);
+                                    kpiValue_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_RawKpi_descriptor;
         }
@@ -4615,7 +4802,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-            return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+            return getTimestamp();
         }
 
         public static final int KPI_VALUE_FIELD_NUMBER = 2;
@@ -4645,7 +4832,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder() {
-            return kpiValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_;
+            return getKpiValue();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -4669,7 +4856,7 @@ public final class Monitoring {
             if (kpiValue_ != null) {
                 output.writeMessage(2, getKpiValue());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -4684,7 +4871,7 @@ public final class Monitoring {
             if (kpiValue_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getKpiValue());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -4710,7 +4897,7 @@ public final class Monitoring {
                 if (!getKpiValue().equals(other.getKpiValue()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -4730,7 +4917,7 @@ public final class Monitoring {
                 hash = (37 * hash) + KPI_VALUE_FIELD_NUMBER;
                 hash = (53 * hash) + getKpiValue().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -4828,24 +5015,32 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.RawKpi.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
-                kpiValue_ = null;
-                if (kpiValueBuilder_ != null) {
-                    kpiValueBuilder_.dispose();
+                if (kpiValueBuilder_ == null) {
+                    kpiValue_ = null;
+                } else {
+                    kpiValue_ = null;
                     kpiValueBuilder_ = null;
                 }
                 return this;
@@ -4873,43 +5068,70 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.RawKpi buildPartial() {
                 monitoring.Monitoring.RawKpi result = new monitoring.Monitoring.RawKpi(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (timestampBuilder_ == null) {
+                    result.timestamp_ = timestamp_;
+                } else {
+                    result.timestamp_ = timestampBuilder_.build();
+                }
+                if (kpiValueBuilder_ == null) {
+                    result.kpiValue_ = kpiValue_;
+                } else {
+                    result.kpiValue_ = kpiValueBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.RawKpi result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.timestamp_ = timestampBuilder_ == null ? timestamp_ : timestampBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.kpiValue_ = kpiValueBuilder_ == null ? kpiValue_ : kpiValueBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
             }
 
             @java.lang.Override
-            public Builder mergeFrom(com.google.protobuf.Message other) {
-                if (other instanceof monitoring.Monitoring.RawKpi) {
-                    return mergeFrom((monitoring.Monitoring.RawKpi) other);
-                } else {
-                    super.mergeFrom(other);
-                    return this;
-                }
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
             }
 
-            public Builder mergeFrom(monitoring.Monitoring.RawKpi other) {
-                if (other == monitoring.Monitoring.RawKpi.getDefaultInstance())
-                    return this;
-                if (other.hasTimestamp()) {
-                    mergeTimestamp(other.getTimestamp());
-                }
-                if (other.hasKpiValue()) {
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof monitoring.Monitoring.RawKpi) {
+                    return mergeFrom((monitoring.Monitoring.RawKpi) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(monitoring.Monitoring.RawKpi other) {
+                if (other == monitoring.Monitoring.RawKpi.getDefaultInstance())
+                    return this;
+                if (other.hasTimestamp()) {
+                    mergeTimestamp(other.getTimestamp());
+                }
+                if (other.hasKpiValue()) {
                     mergeKpiValue(other.getKpiValue());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -4921,54 +5143,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.RawKpi parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getKpiValueFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.RawKpi) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Timestamp timestamp_;
 
             private com.google.protobuf.SingleFieldBuilderV3 timestampBuilder_;
@@ -4978,7 +5166,7 @@ public final class Monitoring {
              * @return Whether the timestamp field is set.
              */
             public boolean hasTimestamp() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return timestampBuilder_ != null || timestamp_ != null;
             }
 
             /**
@@ -5002,11 +5190,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     timestamp_ = value;
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -5016,11 +5203,10 @@ public final class Monitoring {
             public Builder setTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (timestampBuilder_ == null) {
                     timestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -5029,16 +5215,15 @@ public final class Monitoring {
              */
             public Builder mergeTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (timestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && timestamp_ != null && timestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getTimestampBuilder().mergeFrom(value);
+                    if (timestamp_ != null) {
+                        timestamp_ = context.ContextOuterClass.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial();
                     } else {
                         timestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     timestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -5046,13 +5231,13 @@ public final class Monitoring {
              * .context.Timestamp timestamp = 1;
              */
             public Builder clearTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                    onChanged();
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -5060,7 +5245,6 @@ public final class Monitoring {
              * .context.Timestamp timestamp = 1;
              */
             public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getTimestampFieldBuilder().getBuilder();
             }
@@ -5096,7 +5280,7 @@ public final class Monitoring {
              * @return Whether the kpiValue field is set.
              */
             public boolean hasKpiValue() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return kpiValueBuilder_ != null || kpiValue_ != null;
             }
 
             /**
@@ -5120,11 +5304,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiValue_ = value;
+                    onChanged();
                 } else {
                     kpiValueBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -5134,11 +5317,10 @@ public final class Monitoring {
             public Builder setKpiValue(monitoring.Monitoring.KpiValue.Builder builderForValue) {
                 if (kpiValueBuilder_ == null) {
                     kpiValue_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiValueBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -5147,16 +5329,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiValue(monitoring.Monitoring.KpiValue value) {
                 if (kpiValueBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && kpiValue_ != null && kpiValue_ != monitoring.Monitoring.KpiValue.getDefaultInstance()) {
-                        getKpiValueBuilder().mergeFrom(value);
+                    if (kpiValue_ != null) {
+                        kpiValue_ = monitoring.Monitoring.KpiValue.newBuilder(kpiValue_).mergeFrom(value).buildPartial();
                     } else {
                         kpiValue_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiValueBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -5164,13 +5345,13 @@ public final class Monitoring {
              * .monitoring.KpiValue kpi_value = 2;
              */
             public Builder clearKpiValue() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                kpiValue_ = null;
-                if (kpiValueBuilder_ != null) {
-                    kpiValueBuilder_.dispose();
+                if (kpiValueBuilder_ == null) {
+                    kpiValue_ = null;
+                    onChanged();
+                } else {
+                    kpiValue_ = null;
                     kpiValueBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -5178,7 +5359,6 @@ public final class Monitoring {
              * .monitoring.KpiValue kpi_value = 2;
              */
             public monitoring.Monitoring.KpiValue.Builder getKpiValueBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getKpiValueFieldBuilder().getBuilder();
             }
@@ -5232,17 +5412,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public RawKpi parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new RawKpi(input, extensionRegistry);
             }
         };
 
@@ -5334,6 +5504,70 @@ public final class Monitoring {
             return new RawKpiList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private RawKpiList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.KpiId.Builder subBuilder = null;
+                                if (kpiId_ != null) {
+                                    subBuilder = kpiId_.toBuilder();
+                                }
+                                kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiId_);
+                                    kpiId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    rawKpis_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                rawKpis_.add(input.readMessage(monitoring.Monitoring.RawKpi.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    rawKpis_ = java.util.Collections.unmodifiableList(rawKpis_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_RawKpiList_descriptor;
         }
@@ -5370,12 +5604,11 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
-            return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+            return getKpiId();
         }
 
         public static final int RAW_KPIS_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
         private java.util.List rawKpis_;
 
         /**
@@ -5439,7 +5672,7 @@ public final class Monitoring {
             for (int i = 0; i < rawKpis_.size(); i++) {
                 output.writeMessage(2, rawKpis_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -5454,7 +5687,7 @@ public final class Monitoring {
             for (int i = 0; i < rawKpis_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, rawKpis_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -5476,7 +5709,7 @@ public final class Monitoring {
             }
             if (!getRawKpisList().equals(other.getRawKpisList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -5496,7 +5729,7 @@ public final class Monitoring {
                 hash = (37 * hash) + RAW_KPIS_FIELD_NUMBER;
                 hash = (53 * hash) + getRawKpisList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -5594,28 +5827,35 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.RawKpiList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getRawKpisFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
                 if (rawKpisBuilder_ == null) {
                     rawKpis_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    rawKpis_ = null;
                     rawKpisBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000002);
                 return this;
             }
 
@@ -5641,31 +5881,53 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.RawKpiList buildPartial() {
                 monitoring.Monitoring.RawKpiList result = new monitoring.Monitoring.RawKpiList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (kpiIdBuilder_ == null) {
+                    result.kpiId_ = kpiId_;
+                } else {
+                    result.kpiId_ = kpiIdBuilder_.build();
                 }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(monitoring.Monitoring.RawKpiList result) {
                 if (rawKpisBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0)) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
                         rawKpis_ = java.util.Collections.unmodifiableList(rawKpis_);
-                        bitField0_ = (bitField0_ & ~0x00000002);
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     }
                     result.rawKpis_ = rawKpis_;
                 } else {
                     result.rawKpis_ = rawKpisBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.RawKpiList result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -5688,7 +5950,7 @@ public final class Monitoring {
                     if (!other.rawKpis_.isEmpty()) {
                         if (rawKpis_.isEmpty()) {
                             rawKpis_ = other.rawKpis_;
-                            bitField0_ = (bitField0_ & ~0x00000002);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                         } else {
                             ensureRawKpisIsMutable();
                             rawKpis_.addAll(other.rawKpis_);
@@ -5701,14 +5963,14 @@ public final class Monitoring {
                             rawKpisBuilder_.dispose();
                             rawKpisBuilder_ = null;
                             rawKpis_ = other.rawKpis_;
-                            bitField0_ = (bitField0_ & ~0x00000002);
+                            bitField0_ = (bitField0_ & ~0x00000001);
                             rawKpisBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getRawKpisFieldBuilder() : null;
                         } else {
                             rawKpisBuilder_.addAllMessages(other.rawKpis_);
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -5720,54 +5982,17 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.RawKpiList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    monitoring.Monitoring.RawKpi m = input.readMessage(monitoring.Monitoring.RawKpi.parser(), extensionRegistry);
-                                    if (rawKpisBuilder_ == null) {
-                                        ensureRawKpisIsMutable();
-                                        rawKpis_.add(m);
-                                    } else {
-                                        rawKpisBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.RawKpiList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -5782,7 +6007,7 @@ public final class Monitoring {
              * @return Whether the kpiId field is set.
              */
             public boolean hasKpiId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return kpiIdBuilder_ != null || kpiId_ != null;
             }
 
             /**
@@ -5806,11 +6031,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiId_ = value;
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -5820,11 +6044,10 @@ public final class Monitoring {
             public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) {
                 if (kpiIdBuilder_ == null) {
                     kpiId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -5833,16 +6056,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiId(monitoring.Monitoring.KpiId value) {
                 if (kpiIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) {
-                        getKpiIdBuilder().mergeFrom(value);
+                    if (kpiId_ != null) {
+                        kpiId_ = monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial();
                     } else {
                         kpiId_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -5850,13 +6072,13 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 1;
              */
             public Builder clearKpiId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                    onChanged();
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -5864,7 +6086,6 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 1;
              */
             public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getKpiIdFieldBuilder().getBuilder();
             }
@@ -5894,9 +6115,9 @@ public final class Monitoring {
             private java.util.List rawKpis_ = java.util.Collections.emptyList();
 
             private void ensureRawKpisIsMutable() {
-                if (!((bitField0_ & 0x00000002) != 0)) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     rawKpis_ = new java.util.ArrayList(rawKpis_);
-                    bitField0_ |= 0x00000002;
+                    bitField0_ |= 0x00000001;
                 }
             }
 
@@ -6048,7 +6269,7 @@ public final class Monitoring {
             public Builder clearRawKpis() {
                 if (rawKpisBuilder_ == null) {
                     rawKpis_ = java.util.Collections.emptyList();
-                    bitField0_ = (bitField0_ & ~0x00000002);
+                    bitField0_ = (bitField0_ & ~0x00000001);
                     onChanged();
                 } else {
                     rawKpisBuilder_.clear();
@@ -6122,7 +6343,7 @@ public final class Monitoring {
 
             private com.google.protobuf.RepeatedFieldBuilderV3 getRawKpisFieldBuilder() {
                 if (rawKpisBuilder_ == null) {
-                    rawKpisBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(rawKpis_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
+                    rawKpisBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(rawKpis_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
                     rawKpis_ = null;
                 }
                 return rawKpisBuilder_;
@@ -6155,17 +6376,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public RawKpiList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new RawKpiList(input, extensionRegistry);
             }
         };
 
@@ -6240,6 +6451,57 @@ public final class Monitoring {
             return new RawKpiTable();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private RawKpiTable(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    rawKpiLists_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                rawKpiLists_.add(input.readMessage(monitoring.Monitoring.RawKpiList.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    rawKpiLists_ = java.util.Collections.unmodifiableList(rawKpiLists_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_RawKpiTable_descriptor;
         }
@@ -6251,7 +6513,6 @@ public final class Monitoring {
 
         public static final int RAW_KPI_LISTS_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List rawKpiLists_;
 
         /**
@@ -6312,7 +6573,7 @@ public final class Monitoring {
             for (int i = 0; i < rawKpiLists_.size(); i++) {
                 output.writeMessage(1, rawKpiLists_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -6324,7 +6585,7 @@ public final class Monitoring {
             for (int i = 0; i < rawKpiLists_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, rawKpiLists_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -6340,7 +6601,7 @@ public final class Monitoring {
             monitoring.Monitoring.RawKpiTable other = (monitoring.Monitoring.RawKpiTable) obj;
             if (!getRawKpiListsList().equals(other.getRawKpiListsList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -6356,7 +6617,7 @@ public final class Monitoring {
                 hash = (37 * hash) + RAW_KPI_LISTS_FIELD_NUMBER;
                 hash = (53 * hash) + getRawKpiListsList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -6454,23 +6715,29 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.RawKpiTable.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getRawKpiListsFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (rawKpiListsBuilder_ == null) {
                     rawKpiLists_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    rawKpiLists_ = null;
                     rawKpiListsBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -6496,15 +6763,7 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.RawKpiTable buildPartial() {
                 monitoring.Monitoring.RawKpiTable result = new monitoring.Monitoring.RawKpiTable(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(monitoring.Monitoring.RawKpiTable result) {
+                int from_bitField0_ = bitField0_;
                 if (rawKpiListsBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         rawKpiLists_ = java.util.Collections.unmodifiableList(rawKpiLists_);
@@ -6514,10 +6773,38 @@ public final class Monitoring {
                 } else {
                     result.rawKpiLists_ = rawKpiListsBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.RawKpiTable result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -6557,7 +6844,7 @@ public final class Monitoring {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -6569,47 +6856,17 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.RawKpiTable parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    monitoring.Monitoring.RawKpiList m = input.readMessage(monitoring.Monitoring.RawKpiList.parser(), extensionRegistry);
-                                    if (rawKpiListsBuilder_ == null) {
-                                        ensureRawKpiListsIsMutable();
-                                        rawKpiLists_.add(m);
-                                    } else {
-                                        rawKpiListsBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.RawKpiTable) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -6879,17 +7136,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public RawKpiTable parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new RawKpiTable(input, extensionRegistry);
             }
         };
 
@@ -6951,6 +7198,57 @@ public final class Monitoring {
             return new KpiId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private KpiId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (kpiId_ != null) {
+                                    subBuilder = kpiId_.toBuilder();
+                                }
+                                kpiId_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiId_);
+                                    kpiId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_KpiId_descriptor;
         }
@@ -6987,7 +7285,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getKpiIdOrBuilder() {
-            return kpiId_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : kpiId_;
+            return getKpiId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -7008,7 +7306,7 @@ public final class Monitoring {
             if (kpiId_ != null) {
                 output.writeMessage(1, getKpiId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -7020,7 +7318,7 @@ public final class Monitoring {
             if (kpiId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getKpiId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -7040,7 +7338,7 @@ public final class Monitoring {
                 if (!getKpiId().equals(other.getKpiId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -7056,7 +7354,7 @@ public final class Monitoring {
                 hash = (37 * hash) + KPI_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getKpiId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -7150,19 +7448,26 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.KpiId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
                 return this;
@@ -7190,38 +7495,63 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.KpiId buildPartial() {
                 monitoring.Monitoring.KpiId result = new monitoring.Monitoring.KpiId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (kpiIdBuilder_ == null) {
+                    result.kpiId_ = kpiId_;
+                } else {
+                    result.kpiId_ = kpiIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.KpiId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
             }
 
             @java.lang.Override
-            public Builder mergeFrom(com.google.protobuf.Message other) {
-                if (other instanceof monitoring.Monitoring.KpiId) {
-                    return mergeFrom((monitoring.Monitoring.KpiId) other);
-                } else {
-                    super.mergeFrom(other);
-                    return this;
-                }
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
             }
 
-            public Builder mergeFrom(monitoring.Monitoring.KpiId other) {
-                if (other == monitoring.Monitoring.KpiId.getDefaultInstance())
-                    return this;
-                if (other.hasKpiId()) {
-                    mergeKpiId(other.getKpiId());
-                }
-                this.mergeUnknownFields(other.getUnknownFields());
-                onChanged();
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof monitoring.Monitoring.KpiId) {
+                    return mergeFrom((monitoring.Monitoring.KpiId) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(monitoring.Monitoring.KpiId other) {
+                if (other == monitoring.Monitoring.KpiId.getDefaultInstance())
+                    return this;
+                if (other.hasKpiId()) {
+                    mergeKpiId(other.getKpiId());
+                }
+                this.mergeUnknownFields(other.unknownFields);
+                onChanged();
                 return this;
             }
 
@@ -7232,47 +7562,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.KpiId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.KpiId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid kpiId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 kpiIdBuilder_;
@@ -7282,7 +7585,7 @@ public final class Monitoring {
              * @return Whether the kpiId field is set.
              */
             public boolean hasKpiId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return kpiIdBuilder_ != null || kpiId_ != null;
             }
 
             /**
@@ -7306,11 +7609,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiId_ = value;
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -7320,11 +7622,10 @@ public final class Monitoring {
             public Builder setKpiId(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (kpiIdBuilder_ == null) {
                     kpiId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -7333,16 +7634,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiId(context.ContextOuterClass.Uuid value) {
                 if (kpiIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && kpiId_ != null && kpiId_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getKpiIdBuilder().mergeFrom(value);
+                    if (kpiId_ != null) {
+                        kpiId_ = context.ContextOuterClass.Uuid.newBuilder(kpiId_).mergeFrom(value).buildPartial();
                     } else {
                         kpiId_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -7350,13 +7650,13 @@ public final class Monitoring {
              * .context.Uuid kpi_id = 1;
              */
             public Builder clearKpiId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                    onChanged();
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -7364,7 +7664,6 @@ public final class Monitoring {
              * .context.Uuid kpi_id = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getKpiIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getKpiIdFieldBuilder().getBuilder();
             }
@@ -7418,17 +7717,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public KpiId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new KpiId(input, extensionRegistry);
             }
         };
 
@@ -7524,6 +7813,83 @@ public final class Monitoring {
             return new Kpi();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private Kpi(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.KpiId.Builder subBuilder = null;
+                                if (kpiId_ != null) {
+                                    subBuilder = kpiId_.toBuilder();
+                                }
+                                kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiId_);
+                                    kpiId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (timestamp_ != null) {
+                                    subBuilder = timestamp_.toBuilder();
+                                }
+                                timestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(timestamp_);
+                                    timestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 26:
+                            {
+                                monitoring.Monitoring.KpiValue.Builder subBuilder = null;
+                                if (kpiValue_ != null) {
+                                    subBuilder = kpiValue_.toBuilder();
+                                }
+                                kpiValue_ = input.readMessage(monitoring.Monitoring.KpiValue.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiValue_);
+                                    kpiValue_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_Kpi_descriptor;
         }
@@ -7560,7 +7926,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
-            return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+            return getKpiId();
         }
 
         public static final int TIMESTAMP_FIELD_NUMBER = 2;
@@ -7590,7 +7956,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-            return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+            return getTimestamp();
         }
 
         public static final int KPI_VALUE_FIELD_NUMBER = 3;
@@ -7620,7 +7986,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder() {
-            return kpiValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_;
+            return getKpiValue();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -7647,7 +8013,7 @@ public final class Monitoring {
             if (kpiValue_ != null) {
                 output.writeMessage(3, getKpiValue());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -7665,7 +8031,7 @@ public final class Monitoring {
             if (kpiValue_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getKpiValue());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -7697,7 +8063,7 @@ public final class Monitoring {
                 if (!getKpiValue().equals(other.getKpiValue()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -7721,7 +8087,7 @@ public final class Monitoring {
                 hash = (37 * hash) + KPI_VALUE_FIELD_NUMBER;
                 hash = (53 * hash) + getKpiValue().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -7815,29 +8181,38 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.Kpi.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
-                kpiValue_ = null;
-                if (kpiValueBuilder_ != null) {
-                    kpiValueBuilder_.dispose();
+                if (kpiValueBuilder_ == null) {
+                    kpiValue_ = null;
+                } else {
+                    kpiValue_ = null;
                     kpiValueBuilder_ = null;
                 }
                 return this;
@@ -7865,24 +8240,53 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.Kpi buildPartial() {
                 monitoring.Monitoring.Kpi result = new monitoring.Monitoring.Kpi(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (kpiIdBuilder_ == null) {
+                    result.kpiId_ = kpiId_;
+                } else {
+                    result.kpiId_ = kpiIdBuilder_.build();
+                }
+                if (timestampBuilder_ == null) {
+                    result.timestamp_ = timestamp_;
+                } else {
+                    result.timestamp_ = timestampBuilder_.build();
+                }
+                if (kpiValueBuilder_ == null) {
+                    result.kpiValue_ = kpiValue_;
+                } else {
+                    result.kpiValue_ = kpiValueBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.Kpi result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.timestamp_ = timestampBuilder_ == null ? timestamp_ : timestampBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.kpiValue_ = kpiValueBuilder_ == null ? kpiValue_ : kpiValueBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -7907,7 +8311,7 @@ public final class Monitoring {
                 if (other.hasKpiValue()) {
                     mergeKpiValue(other.getKpiValue());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -7919,61 +8323,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.Kpi parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getKpiValueFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.Kpi) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.KpiId kpiId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 kpiIdBuilder_;
@@ -7983,7 +8346,7 @@ public final class Monitoring {
              * @return Whether the kpiId field is set.
              */
             public boolean hasKpiId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return kpiIdBuilder_ != null || kpiId_ != null;
             }
 
             /**
@@ -8007,11 +8370,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiId_ = value;
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -8021,11 +8383,10 @@ public final class Monitoring {
             public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) {
                 if (kpiIdBuilder_ == null) {
                     kpiId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -8034,16 +8395,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiId(monitoring.Monitoring.KpiId value) {
                 if (kpiIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) {
-                        getKpiIdBuilder().mergeFrom(value);
+                    if (kpiId_ != null) {
+                        kpiId_ = monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial();
                     } else {
                         kpiId_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -8051,13 +8411,13 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 1;
              */
             public Builder clearKpiId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                    onChanged();
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -8065,7 +8425,6 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 1;
              */
             public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getKpiIdFieldBuilder().getBuilder();
             }
@@ -8101,7 +8460,7 @@ public final class Monitoring {
              * @return Whether the timestamp field is set.
              */
             public boolean hasTimestamp() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return timestampBuilder_ != null || timestamp_ != null;
             }
 
             /**
@@ -8125,11 +8484,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     timestamp_ = value;
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -8139,11 +8497,10 @@ public final class Monitoring {
             public Builder setTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (timestampBuilder_ == null) {
                     timestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -8152,16 +8509,15 @@ public final class Monitoring {
              */
             public Builder mergeTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (timestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && timestamp_ != null && timestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getTimestampBuilder().mergeFrom(value);
+                    if (timestamp_ != null) {
+                        timestamp_ = context.ContextOuterClass.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial();
                     } else {
                         timestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     timestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -8169,13 +8525,13 @@ public final class Monitoring {
              * .context.Timestamp timestamp = 2;
              */
             public Builder clearTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                    onChanged();
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -8183,7 +8539,6 @@ public final class Monitoring {
              * .context.Timestamp timestamp = 2;
              */
             public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getTimestampFieldBuilder().getBuilder();
             }
@@ -8219,7 +8574,7 @@ public final class Monitoring {
              * @return Whether the kpiValue field is set.
              */
             public boolean hasKpiValue() {
-                return ((bitField0_ & 0x00000004) != 0);
+                return kpiValueBuilder_ != null || kpiValue_ != null;
             }
 
             /**
@@ -8243,11 +8598,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiValue_ = value;
+                    onChanged();
                 } else {
                     kpiValueBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -8257,11 +8611,10 @@ public final class Monitoring {
             public Builder setKpiValue(monitoring.Monitoring.KpiValue.Builder builderForValue) {
                 if (kpiValueBuilder_ == null) {
                     kpiValue_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiValueBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -8270,16 +8623,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiValue(monitoring.Monitoring.KpiValue value) {
                 if (kpiValueBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0) && kpiValue_ != null && kpiValue_ != monitoring.Monitoring.KpiValue.getDefaultInstance()) {
-                        getKpiValueBuilder().mergeFrom(value);
+                    if (kpiValue_ != null) {
+                        kpiValue_ = monitoring.Monitoring.KpiValue.newBuilder(kpiValue_).mergeFrom(value).buildPartial();
                     } else {
                         kpiValue_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiValueBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -8287,13 +8639,13 @@ public final class Monitoring {
              * .monitoring.KpiValue kpi_value = 3;
              */
             public Builder clearKpiValue() {
-                bitField0_ = (bitField0_ & ~0x00000004);
-                kpiValue_ = null;
-                if (kpiValueBuilder_ != null) {
-                    kpiValueBuilder_.dispose();
+                if (kpiValueBuilder_ == null) {
+                    kpiValue_ = null;
+                    onChanged();
+                } else {
+                    kpiValue_ = null;
                     kpiValueBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -8301,7 +8653,6 @@ public final class Monitoring {
              * .monitoring.KpiValue kpi_value = 3;
              */
             public monitoring.Monitoring.KpiValue.Builder getKpiValueBuilder() {
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return getKpiValueFieldBuilder().getBuilder();
             }
@@ -8355,17 +8706,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public Kpi parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new Kpi(input, extensionRegistry);
             }
         };
 
@@ -8474,6 +8815,85 @@ public final class Monitoring {
             return new KpiValueRange();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private KpiValueRange(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.KpiValue.Builder subBuilder = null;
+                                if (kpiMinValue_ != null) {
+                                    subBuilder = kpiMinValue_.toBuilder();
+                                }
+                                kpiMinValue_ = input.readMessage(monitoring.Monitoring.KpiValue.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiMinValue_);
+                                    kpiMinValue_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                monitoring.Monitoring.KpiValue.Builder subBuilder = null;
+                                if (kpiMaxValue_ != null) {
+                                    subBuilder = kpiMaxValue_.toBuilder();
+                                }
+                                kpiMaxValue_ = input.readMessage(monitoring.Monitoring.KpiValue.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiMaxValue_);
+                                    kpiMaxValue_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 24:
+                            {
+                                inRange_ = input.readBool();
+                                break;
+                            }
+                        case 32:
+                            {
+                                includeMinValue_ = input.readBool();
+                                break;
+                            }
+                        case 40:
+                            {
+                                includeMaxValue_ = input.readBool();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_KpiValueRange_descriptor;
         }
@@ -8510,7 +8930,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiValueOrBuilder getKpiMinValueOrBuilder() {
-            return kpiMinValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiMinValue_;
+            return getKpiMinValue();
         }
 
         public static final int KPIMAXVALUE_FIELD_NUMBER = 2;
@@ -8540,12 +8960,12 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiValueOrBuilder getKpiMaxValueOrBuilder() {
-            return kpiMaxValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiMaxValue_;
+            return getKpiMaxValue();
         }
 
         public static final int INRANGE_FIELD_NUMBER = 3;
 
-        private boolean inRange_ = false;
+        private boolean inRange_;
 
         /**
          * 
@@ -8562,7 +8982,7 @@ public final class Monitoring {
 
         public static final int INCLUDEMINVALUE_FIELD_NUMBER = 4;
 
-        private boolean includeMinValue_ = false;
+        private boolean includeMinValue_;
 
         /**
          * 
@@ -8579,7 +8999,7 @@ public final class Monitoring {
 
         public static final int INCLUDEMAXVALUE_FIELD_NUMBER = 5;
 
-        private boolean includeMaxValue_ = false;
+        private boolean includeMaxValue_;
 
         /**
          * 
@@ -8624,7 +9044,7 @@ public final class Monitoring {
             if (includeMaxValue_ != false) {
                 output.writeBool(5, includeMaxValue_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -8648,7 +9068,7 @@ public final class Monitoring {
             if (includeMaxValue_ != false) {
                 size += com.google.protobuf.CodedOutputStream.computeBoolSize(5, includeMaxValue_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -8680,7 +9100,7 @@ public final class Monitoring {
                 return false;
             if (getIncludeMaxValue() != other.getIncludeMaxValue())
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -8706,7 +9126,7 @@ public final class Monitoring {
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeMinValue());
             hash = (37 * hash) + INCLUDEMAXVALUE_FIELD_NUMBER;
             hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getIncludeMaxValue());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -8800,24 +9220,32 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.KpiValueRange.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                kpiMinValue_ = null;
-                if (kpiMinValueBuilder_ != null) {
-                    kpiMinValueBuilder_.dispose();
+                if (kpiMinValueBuilder_ == null) {
+                    kpiMinValue_ = null;
+                } else {
+                    kpiMinValue_ = null;
                     kpiMinValueBuilder_ = null;
                 }
-                kpiMaxValue_ = null;
-                if (kpiMaxValueBuilder_ != null) {
-                    kpiMaxValueBuilder_.dispose();
+                if (kpiMaxValueBuilder_ == null) {
+                    kpiMaxValue_ = null;
+                } else {
+                    kpiMaxValue_ = null;
                     kpiMaxValueBuilder_ = null;
                 }
                 inRange_ = false;
@@ -8848,30 +9276,51 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.KpiValueRange buildPartial() {
                 monitoring.Monitoring.KpiValueRange result = new monitoring.Monitoring.KpiValueRange(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (kpiMinValueBuilder_ == null) {
+                    result.kpiMinValue_ = kpiMinValue_;
+                } else {
+                    result.kpiMinValue_ = kpiMinValueBuilder_.build();
                 }
+                if (kpiMaxValueBuilder_ == null) {
+                    result.kpiMaxValue_ = kpiMaxValue_;
+                } else {
+                    result.kpiMaxValue_ = kpiMaxValueBuilder_.build();
+                }
+                result.inRange_ = inRange_;
+                result.includeMinValue_ = includeMinValue_;
+                result.includeMaxValue_ = includeMaxValue_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.KpiValueRange result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.kpiMinValue_ = kpiMinValueBuilder_ == null ? kpiMinValue_ : kpiMinValueBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.kpiMaxValue_ = kpiMaxValueBuilder_ == null ? kpiMaxValue_ : kpiMaxValueBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.inRange_ = inRange_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.includeMinValue_ = includeMinValue_;
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.includeMaxValue_ = includeMaxValue_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -8902,7 +9351,7 @@ public final class Monitoring {
                 if (other.getIncludeMaxValue() != false) {
                     setIncludeMaxValue(other.getIncludeMaxValue());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -8914,75 +9363,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.KpiValueRange parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getKpiMinValueFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getKpiMaxValueFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 24:
-                                {
-                                    inRange_ = input.readBool();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 24
-                            case 32:
-                                {
-                                    includeMinValue_ = input.readBool();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 32
-                            case 40:
-                                {
-                                    includeMaxValue_ = input.readBool();
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 40
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.KpiValueRange) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.KpiValue kpiMinValue_;
 
             private com.google.protobuf.SingleFieldBuilderV3 kpiMinValueBuilder_;
@@ -8992,7 +9386,7 @@ public final class Monitoring {
              * @return Whether the kpiMinValue field is set.
              */
             public boolean hasKpiMinValue() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return kpiMinValueBuilder_ != null || kpiMinValue_ != null;
             }
 
             /**
@@ -9016,11 +9410,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiMinValue_ = value;
+                    onChanged();
                 } else {
                     kpiMinValueBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -9030,11 +9423,10 @@ public final class Monitoring {
             public Builder setKpiMinValue(monitoring.Monitoring.KpiValue.Builder builderForValue) {
                 if (kpiMinValueBuilder_ == null) {
                     kpiMinValue_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiMinValueBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -9043,16 +9435,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiMinValue(monitoring.Monitoring.KpiValue value) {
                 if (kpiMinValueBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && kpiMinValue_ != null && kpiMinValue_ != monitoring.Monitoring.KpiValue.getDefaultInstance()) {
-                        getKpiMinValueBuilder().mergeFrom(value);
+                    if (kpiMinValue_ != null) {
+                        kpiMinValue_ = monitoring.Monitoring.KpiValue.newBuilder(kpiMinValue_).mergeFrom(value).buildPartial();
                     } else {
                         kpiMinValue_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiMinValueBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -9060,13 +9451,13 @@ public final class Monitoring {
              * .monitoring.KpiValue kpiMinValue = 1;
              */
             public Builder clearKpiMinValue() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                kpiMinValue_ = null;
-                if (kpiMinValueBuilder_ != null) {
-                    kpiMinValueBuilder_.dispose();
+                if (kpiMinValueBuilder_ == null) {
+                    kpiMinValue_ = null;
+                    onChanged();
+                } else {
+                    kpiMinValue_ = null;
                     kpiMinValueBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -9074,7 +9465,6 @@ public final class Monitoring {
              * .monitoring.KpiValue kpiMinValue = 1;
              */
             public monitoring.Monitoring.KpiValue.Builder getKpiMinValueBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getKpiMinValueFieldBuilder().getBuilder();
             }
@@ -9110,7 +9500,7 @@ public final class Monitoring {
              * @return Whether the kpiMaxValue field is set.
              */
             public boolean hasKpiMaxValue() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return kpiMaxValueBuilder_ != null || kpiMaxValue_ != null;
             }
 
             /**
@@ -9134,11 +9524,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiMaxValue_ = value;
+                    onChanged();
                 } else {
                     kpiMaxValueBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -9148,11 +9537,10 @@ public final class Monitoring {
             public Builder setKpiMaxValue(monitoring.Monitoring.KpiValue.Builder builderForValue) {
                 if (kpiMaxValueBuilder_ == null) {
                     kpiMaxValue_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiMaxValueBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -9161,16 +9549,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiMaxValue(monitoring.Monitoring.KpiValue value) {
                 if (kpiMaxValueBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && kpiMaxValue_ != null && kpiMaxValue_ != monitoring.Monitoring.KpiValue.getDefaultInstance()) {
-                        getKpiMaxValueBuilder().mergeFrom(value);
+                    if (kpiMaxValue_ != null) {
+                        kpiMaxValue_ = monitoring.Monitoring.KpiValue.newBuilder(kpiMaxValue_).mergeFrom(value).buildPartial();
                     } else {
                         kpiMaxValue_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiMaxValueBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -9178,13 +9565,13 @@ public final class Monitoring {
              * .monitoring.KpiValue kpiMaxValue = 2;
              */
             public Builder clearKpiMaxValue() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                kpiMaxValue_ = null;
-                if (kpiMaxValueBuilder_ != null) {
-                    kpiMaxValueBuilder_.dispose();
+                if (kpiMaxValueBuilder_ == null) {
+                    kpiMaxValue_ = null;
+                    onChanged();
+                } else {
+                    kpiMaxValue_ = null;
                     kpiMaxValueBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -9192,7 +9579,6 @@ public final class Monitoring {
              * .monitoring.KpiValue kpiMaxValue = 2;
              */
             public monitoring.Monitoring.KpiValue.Builder getKpiMaxValueBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getKpiMaxValueFieldBuilder().getBuilder();
             }
@@ -9245,7 +9631,6 @@ public final class Monitoring {
              */
             public Builder setInRange(boolean value) {
                 inRange_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -9259,7 +9644,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearInRange() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 inRange_ = false;
                 onChanged();
                 return this;
@@ -9291,7 +9675,6 @@ public final class Monitoring {
              */
             public Builder setIncludeMinValue(boolean value) {
                 includeMinValue_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -9305,7 +9688,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearIncludeMinValue() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 includeMinValue_ = false;
                 onChanged();
                 return this;
@@ -9337,7 +9719,6 @@ public final class Monitoring {
              */
             public Builder setIncludeMaxValue(boolean value) {
                 includeMaxValue_ = value;
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return this;
             }
@@ -9351,7 +9732,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearIncludeMaxValue() {
-                bitField0_ = (bitField0_ & ~0x00000010);
                 includeMaxValue_ = false;
                 onChanged();
                 return this;
@@ -9384,17 +9764,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public KpiValueRange parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new KpiValueRange(input, extensionRegistry);
             }
         };
 
@@ -9506,7 +9876,7 @@ public final class Monitoring {
          */
         boolean getBoolVal();
 
-        monitoring.Monitoring.KpiValue.ValueCase getValueCase();
+        public monitoring.Monitoring.KpiValue.ValueCase getValueCase();
     }
 
     /**
@@ -9531,6 +9901,87 @@ public final class Monitoring {
             return new KpiValue();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private KpiValue(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 8:
+                            {
+                                valueCase_ = 1;
+                                value_ = input.readInt32();
+                                break;
+                            }
+                        case 16:
+                            {
+                                valueCase_ = 2;
+                                value_ = input.readUInt32();
+                                break;
+                            }
+                        case 24:
+                            {
+                                valueCase_ = 3;
+                                value_ = input.readInt64();
+                                break;
+                            }
+                        case 32:
+                            {
+                                valueCase_ = 4;
+                                value_ = input.readUInt64();
+                                break;
+                            }
+                        case 45:
+                            {
+                                valueCase_ = 5;
+                                value_ = input.readFloat();
+                                break;
+                            }
+                        case 50:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                valueCase_ = 6;
+                                value_ = s;
+                                break;
+                            }
+                        case 56:
+                            {
+                                valueCase_ = 7;
+                                value_ = input.readBool();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_KpiValue_descriptor;
         }
@@ -9542,7 +9993,6 @@ public final class Monitoring {
 
         private int valueCase_ = 0;
 
-        @SuppressWarnings("serial")
         private java.lang.Object value_;
 
         public enum ValueCase implements com.google.protobuf.Internal.EnumLite, com.google.protobuf.AbstractMessage.InternalOneOfEnum {
@@ -9829,7 +10279,7 @@ public final class Monitoring {
             if (valueCase_ == 7) {
                 output.writeBool(7, (boolean) ((java.lang.Boolean) value_));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -9859,7 +10309,7 @@ public final class Monitoring {
             if (valueCase_ == 7) {
                 size += com.google.protobuf.CodedOutputStream.computeBoolSize(7, (boolean) ((java.lang.Boolean) value_));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -9907,7 +10357,7 @@ public final class Monitoring {
                 case 0:
                 default:
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -9951,7 +10401,7 @@ public final class Monitoring {
                 case 0:
                 default:
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -10045,16 +10495,22 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.KpiValue.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 valueCase_ = 0;
                 value_ = null;
                 return this;
@@ -10082,21 +10538,60 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.KpiValue buildPartial() {
                 monitoring.Monitoring.KpiValue result = new monitoring.Monitoring.KpiValue(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (valueCase_ == 1) {
+                    result.value_ = value_;
+                }
+                if (valueCase_ == 2) {
+                    result.value_ = value_;
+                }
+                if (valueCase_ == 3) {
+                    result.value_ = value_;
+                }
+                if (valueCase_ == 4) {
+                    result.value_ = value_;
+                }
+                if (valueCase_ == 5) {
+                    result.value_ = value_;
+                }
+                if (valueCase_ == 6) {
+                    result.value_ = value_;
+                }
+                if (valueCase_ == 7) {
+                    result.value_ = value_;
                 }
-                buildPartialOneofs(result);
+                result.valueCase_ = valueCase_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.KpiValue result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
             }
 
-            private void buildPartialOneofs(monitoring.Monitoring.KpiValue result) {
-                result.valueCase_ = valueCase_;
-                result.value_ = this.value_;
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -10155,7 +10650,7 @@ public final class Monitoring {
                             break;
                         }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -10167,85 +10662,17 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.KpiValue parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 8:
-                                {
-                                    value_ = input.readInt32();
-                                    valueCase_ = 1;
-                                    break;
-                                }
-                            // case 8
-                            case 16:
-                                {
-                                    value_ = input.readUInt32();
-                                    valueCase_ = 2;
-                                    break;
-                                }
-                            // case 16
-                            case 24:
-                                {
-                                    value_ = input.readInt64();
-                                    valueCase_ = 3;
-                                    break;
-                                }
-                            // case 24
-                            case 32:
-                                {
-                                    value_ = input.readUInt64();
-                                    valueCase_ = 4;
-                                    break;
-                                }
-                            // case 32
-                            case 45:
-                                {
-                                    value_ = input.readFloat();
-                                    valueCase_ = 5;
-                                    break;
-                                }
-                            // case 45
-                            case 50:
-                                {
-                                    java.lang.String s = input.readStringRequireUtf8();
-                                    valueCase_ = 6;
-                                    value_ = s;
-                                    break;
-                                }
-                            // case 50
-                            case 56:
-                                {
-                                    value_ = input.readBool();
-                                    valueCase_ = 7;
-                                    break;
-                                }
-                            // case 56
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.KpiValue) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -10264,8 +10691,6 @@ public final class Monitoring {
                 return this;
             }
 
-            private int bitField0_;
-
             /**
              * int32 int32Val = 1;
              * @return Whether the int32Val field is set.
@@ -10653,17 +11078,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public KpiValue parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new KpiValue(input, extensionRegistry);
             }
         };
 
@@ -10734,6 +11149,57 @@ public final class Monitoring {
             return new KpiList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private KpiList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    kpi_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                kpi_.add(input.readMessage(monitoring.Monitoring.Kpi.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    kpi_ = java.util.Collections.unmodifiableList(kpi_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_KpiList_descriptor;
         }
@@ -10745,7 +11211,6 @@ public final class Monitoring {
 
         public static final int KPI_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List kpi_;
 
         /**
@@ -10806,7 +11271,7 @@ public final class Monitoring {
             for (int i = 0; i < kpi_.size(); i++) {
                 output.writeMessage(1, kpi_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -10818,7 +11283,7 @@ public final class Monitoring {
             for (int i = 0; i < kpi_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, kpi_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -10834,7 +11299,7 @@ public final class Monitoring {
             monitoring.Monitoring.KpiList other = (monitoring.Monitoring.KpiList) obj;
             if (!getKpiList().equals(other.getKpiList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -10850,7 +11315,7 @@ public final class Monitoring {
                 hash = (37 * hash) + KPI_FIELD_NUMBER;
                 hash = (53 * hash) + getKpiList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -10944,23 +11409,29 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.KpiList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getKpiFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (kpiBuilder_ == null) {
                     kpi_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    kpi_ = null;
                     kpiBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -10986,15 +11457,7 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.KpiList buildPartial() {
                 monitoring.Monitoring.KpiList result = new monitoring.Monitoring.KpiList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(monitoring.Monitoring.KpiList result) {
+                int from_bitField0_ = bitField0_;
                 if (kpiBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         kpi_ = java.util.Collections.unmodifiableList(kpi_);
@@ -11004,10 +11467,38 @@ public final class Monitoring {
                 } else {
                     result.kpi_ = kpiBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.KpiList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -11047,7 +11538,7 @@ public final class Monitoring {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -11059,47 +11550,17 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.KpiList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    monitoring.Monitoring.Kpi m = input.readMessage(monitoring.Monitoring.Kpi.parser(), extensionRegistry);
-                                    if (kpiBuilder_ == null) {
-                                        ensureKpiIsMutable();
-                                        kpi_.add(m);
-                                    } else {
-                                        kpiBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.KpiList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -11369,17 +11830,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public KpiList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new KpiList(input, extensionRegistry);
             }
         };
 
@@ -11450,6 +11901,57 @@ public final class Monitoring {
             return new KpiDescriptorList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private KpiDescriptorList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    kpiDescriptorList_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                kpiDescriptorList_.add(input.readMessage(monitoring.Monitoring.KpiDescriptor.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    kpiDescriptorList_ = java.util.Collections.unmodifiableList(kpiDescriptorList_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_KpiDescriptorList_descriptor;
         }
@@ -11461,7 +11963,6 @@ public final class Monitoring {
 
         public static final int KPI_DESCRIPTOR_LIST_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List kpiDescriptorList_;
 
         /**
@@ -11522,7 +12023,7 @@ public final class Monitoring {
             for (int i = 0; i < kpiDescriptorList_.size(); i++) {
                 output.writeMessage(1, kpiDescriptorList_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -11534,7 +12035,7 @@ public final class Monitoring {
             for (int i = 0; i < kpiDescriptorList_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, kpiDescriptorList_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -11550,7 +12051,7 @@ public final class Monitoring {
             monitoring.Monitoring.KpiDescriptorList other = (monitoring.Monitoring.KpiDescriptorList) obj;
             if (!getKpiDescriptorListList().equals(other.getKpiDescriptorListList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -11566,7 +12067,7 @@ public final class Monitoring {
                 hash = (37 * hash) + KPI_DESCRIPTOR_LIST_FIELD_NUMBER;
                 hash = (53 * hash) + getKpiDescriptorListList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -11660,23 +12161,29 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.KpiDescriptorList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getKpiDescriptorListFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (kpiDescriptorListBuilder_ == null) {
                     kpiDescriptorList_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    kpiDescriptorList_ = null;
                     kpiDescriptorListBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -11702,15 +12209,7 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.KpiDescriptorList buildPartial() {
                 monitoring.Monitoring.KpiDescriptorList result = new monitoring.Monitoring.KpiDescriptorList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(monitoring.Monitoring.KpiDescriptorList result) {
+                int from_bitField0_ = bitField0_;
                 if (kpiDescriptorListBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         kpiDescriptorList_ = java.util.Collections.unmodifiableList(kpiDescriptorList_);
@@ -11720,10 +12219,38 @@ public final class Monitoring {
                 } else {
                     result.kpiDescriptorList_ = kpiDescriptorListBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.KpiDescriptorList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -11763,7 +12290,7 @@ public final class Monitoring {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -11775,47 +12302,17 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.KpiDescriptorList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    monitoring.Monitoring.KpiDescriptor m = input.readMessage(monitoring.Monitoring.KpiDescriptor.parser(), extensionRegistry);
-                                    if (kpiDescriptorListBuilder_ == null) {
-                                        ensureKpiDescriptorListIsMutable();
-                                        kpiDescriptorList_.add(m);
-                                    } else {
-                                        kpiDescriptorListBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.KpiDescriptorList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -12085,17 +12582,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public KpiDescriptorList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new KpiDescriptorList(input, extensionRegistry);
             }
         };
 
@@ -12244,6 +12731,106 @@ public final class Monitoring {
             return new SubsDescriptor();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SubsDescriptor(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.SubscriptionID.Builder subBuilder = null;
+                                if (subsId_ != null) {
+                                    subBuilder = subsId_.toBuilder();
+                                }
+                                subsId_ = input.readMessage(monitoring.Monitoring.SubscriptionID.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(subsId_);
+                                    subsId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                monitoring.Monitoring.KpiId.Builder subBuilder = null;
+                                if (kpiId_ != null) {
+                                    subBuilder = kpiId_.toBuilder();
+                                }
+                                kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiId_);
+                                    kpiId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 29:
+                            {
+                                samplingDurationS_ = input.readFloat();
+                                break;
+                            }
+                        case 37:
+                            {
+                                samplingIntervalS_ = input.readFloat();
+                                break;
+                            }
+                        case 42:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (startTimestamp_ != null) {
+                                    subBuilder = startTimestamp_.toBuilder();
+                                }
+                                startTimestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(startTimestamp_);
+                                    startTimestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 50:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (endTimestamp_ != null) {
+                                    subBuilder = endTimestamp_.toBuilder();
+                                }
+                                endTimestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(endTimestamp_);
+                                    endTimestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_SubsDescriptor_descriptor;
         }
@@ -12280,7 +12867,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.SubscriptionIDOrBuilder getSubsIdOrBuilder() {
-            return subsId_ == null ? monitoring.Monitoring.SubscriptionID.getDefaultInstance() : subsId_;
+            return getSubsId();
         }
 
         public static final int KPI_ID_FIELD_NUMBER = 2;
@@ -12310,12 +12897,12 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
-            return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+            return getKpiId();
         }
 
         public static final int SAMPLING_DURATION_S_FIELD_NUMBER = 3;
 
-        private float samplingDurationS_ = 0F;
+        private float samplingDurationS_;
 
         /**
          * float sampling_duration_s = 3;
@@ -12328,7 +12915,7 @@ public final class Monitoring {
 
         public static final int SAMPLING_INTERVAL_S_FIELD_NUMBER = 4;
 
-        private float samplingIntervalS_ = 0F;
+        private float samplingIntervalS_;
 
         /**
          * float sampling_interval_s = 4;
@@ -12378,7 +12965,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getStartTimestampOrBuilder() {
-            return startTimestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : startTimestamp_;
+            return getStartTimestamp();
         }
 
         public static final int END_TIMESTAMP_FIELD_NUMBER = 6;
@@ -12420,7 +13007,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getEndTimestampOrBuilder() {
-            return endTimestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : endTimestamp_;
+            return getEndTimestamp();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -12444,10 +13031,10 @@ public final class Monitoring {
             if (kpiId_ != null) {
                 output.writeMessage(2, getKpiId());
             }
-            if (java.lang.Float.floatToRawIntBits(samplingDurationS_) != 0) {
+            if (samplingDurationS_ != 0F) {
                 output.writeFloat(3, samplingDurationS_);
             }
-            if (java.lang.Float.floatToRawIntBits(samplingIntervalS_) != 0) {
+            if (samplingIntervalS_ != 0F) {
                 output.writeFloat(4, samplingIntervalS_);
             }
             if (startTimestamp_ != null) {
@@ -12456,7 +13043,7 @@ public final class Monitoring {
             if (endTimestamp_ != null) {
                 output.writeMessage(6, getEndTimestamp());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -12471,10 +13058,10 @@ public final class Monitoring {
             if (kpiId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getKpiId());
             }
-            if (java.lang.Float.floatToRawIntBits(samplingDurationS_) != 0) {
+            if (samplingDurationS_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(3, samplingDurationS_);
             }
-            if (java.lang.Float.floatToRawIntBits(samplingIntervalS_) != 0) {
+            if (samplingIntervalS_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(4, samplingIntervalS_);
             }
             if (startTimestamp_ != null) {
@@ -12483,7 +13070,7 @@ public final class Monitoring {
             if (endTimestamp_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(6, getEndTimestamp());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -12525,7 +13112,7 @@ public final class Monitoring {
                 if (!getEndTimestamp().equals(other.getEndTimestamp()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -12557,7 +13144,7 @@ public final class Monitoring {
                 hash = (37 * hash) + END_TIMESTAMP_FIELD_NUMBER;
                 hash = (53 * hash) + getEndTimestamp().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -12651,36 +13238,46 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.SubsDescriptor.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                subsId_ = null;
-                if (subsIdBuilder_ != null) {
-                    subsIdBuilder_.dispose();
+                if (subsIdBuilder_ == null) {
+                    subsId_ = null;
+                } else {
+                    subsId_ = null;
                     subsIdBuilder_ = null;
                 }
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
                 samplingDurationS_ = 0F;
                 samplingIntervalS_ = 0F;
-                startTimestamp_ = null;
-                if (startTimestampBuilder_ != null) {
-                    startTimestampBuilder_.dispose();
+                if (startTimestampBuilder_ == null) {
+                    startTimestamp_ = null;
+                } else {
+                    startTimestamp_ = null;
                     startTimestampBuilder_ = null;
                 }
-                endTimestamp_ = null;
-                if (endTimestampBuilder_ != null) {
-                    endTimestampBuilder_.dispose();
+                if (endTimestampBuilder_ == null) {
+                    endTimestamp_ = null;
+                } else {
+                    endTimestamp_ = null;
                     endTimestampBuilder_ = null;
                 }
                 return this;
@@ -12708,33 +13305,60 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.SubsDescriptor buildPartial() {
                 monitoring.Monitoring.SubsDescriptor result = new monitoring.Monitoring.SubsDescriptor(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (subsIdBuilder_ == null) {
+                    result.subsId_ = subsId_;
+                } else {
+                    result.subsId_ = subsIdBuilder_.build();
+                }
+                if (kpiIdBuilder_ == null) {
+                    result.kpiId_ = kpiId_;
+                } else {
+                    result.kpiId_ = kpiIdBuilder_.build();
+                }
+                result.samplingDurationS_ = samplingDurationS_;
+                result.samplingIntervalS_ = samplingIntervalS_;
+                if (startTimestampBuilder_ == null) {
+                    result.startTimestamp_ = startTimestamp_;
+                } else {
+                    result.startTimestamp_ = startTimestampBuilder_.build();
+                }
+                if (endTimestampBuilder_ == null) {
+                    result.endTimestamp_ = endTimestamp_;
+                } else {
+                    result.endTimestamp_ = endTimestampBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.SubsDescriptor result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.subsId_ = subsIdBuilder_ == null ? subsId_ : subsIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.samplingDurationS_ = samplingDurationS_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.samplingIntervalS_ = samplingIntervalS_;
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.startTimestamp_ = startTimestampBuilder_ == null ? startTimestamp_ : startTimestampBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000020) != 0)) {
-                    result.endTimestamp_ = endTimestampBuilder_ == null ? endTimestamp_ : endTimestampBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -12768,7 +13392,7 @@ public final class Monitoring {
                 if (other.hasEndTimestamp()) {
                     mergeEndTimestamp(other.getEndTimestamp());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -12780,82 +13404,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.SubsDescriptor parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getSubsIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 29:
-                                {
-                                    samplingDurationS_ = input.readFloat();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 29
-                            case 37:
-                                {
-                                    samplingIntervalS_ = input.readFloat();
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 37
-                            case 42:
-                                {
-                                    input.readMessage(getStartTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 42
-                            case 50:
-                                {
-                                    input.readMessage(getEndTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000020;
-                                    break;
-                                }
-                            // case 50
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.SubsDescriptor) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.SubscriptionID subsId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 subsIdBuilder_;
@@ -12865,7 +13427,7 @@ public final class Monitoring {
              * @return Whether the subsId field is set.
              */
             public boolean hasSubsId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return subsIdBuilder_ != null || subsId_ != null;
             }
 
             /**
@@ -12889,11 +13451,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     subsId_ = value;
+                    onChanged();
                 } else {
                     subsIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -12903,11 +13464,10 @@ public final class Monitoring {
             public Builder setSubsId(monitoring.Monitoring.SubscriptionID.Builder builderForValue) {
                 if (subsIdBuilder_ == null) {
                     subsId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     subsIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -12916,16 +13476,15 @@ public final class Monitoring {
              */
             public Builder mergeSubsId(monitoring.Monitoring.SubscriptionID value) {
                 if (subsIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && subsId_ != null && subsId_ != monitoring.Monitoring.SubscriptionID.getDefaultInstance()) {
-                        getSubsIdBuilder().mergeFrom(value);
+                    if (subsId_ != null) {
+                        subsId_ = monitoring.Monitoring.SubscriptionID.newBuilder(subsId_).mergeFrom(value).buildPartial();
                     } else {
                         subsId_ = value;
                     }
+                    onChanged();
                 } else {
                     subsIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -12933,13 +13492,13 @@ public final class Monitoring {
              * .monitoring.SubscriptionID subs_id = 1;
              */
             public Builder clearSubsId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                subsId_ = null;
-                if (subsIdBuilder_ != null) {
-                    subsIdBuilder_.dispose();
+                if (subsIdBuilder_ == null) {
+                    subsId_ = null;
+                    onChanged();
+                } else {
+                    subsId_ = null;
                     subsIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -12947,7 +13506,6 @@ public final class Monitoring {
              * .monitoring.SubscriptionID subs_id = 1;
              */
             public monitoring.Monitoring.SubscriptionID.Builder getSubsIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getSubsIdFieldBuilder().getBuilder();
             }
@@ -12983,7 +13541,7 @@ public final class Monitoring {
              * @return Whether the kpiId field is set.
              */
             public boolean hasKpiId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return kpiIdBuilder_ != null || kpiId_ != null;
             }
 
             /**
@@ -13007,11 +13565,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiId_ = value;
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -13021,11 +13578,10 @@ public final class Monitoring {
             public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) {
                 if (kpiIdBuilder_ == null) {
                     kpiId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -13034,16 +13590,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiId(monitoring.Monitoring.KpiId value) {
                 if (kpiIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) {
-                        getKpiIdBuilder().mergeFrom(value);
+                    if (kpiId_ != null) {
+                        kpiId_ = monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial();
                     } else {
                         kpiId_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -13051,13 +13606,13 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 2;
              */
             public Builder clearKpiId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                    onChanged();
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -13065,7 +13620,6 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 2;
              */
             public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getKpiIdFieldBuilder().getBuilder();
             }
@@ -13110,7 +13664,6 @@ public final class Monitoring {
              */
             public Builder setSamplingDurationS(float value) {
                 samplingDurationS_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -13120,7 +13673,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearSamplingDurationS() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 samplingDurationS_ = 0F;
                 onChanged();
                 return this;
@@ -13144,7 +13696,6 @@ public final class Monitoring {
              */
             public Builder setSamplingIntervalS(float value) {
                 samplingIntervalS_ = value;
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return this;
             }
@@ -13154,7 +13705,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearSamplingIntervalS() {
-                bitField0_ = (bitField0_ & ~0x00000008);
                 samplingIntervalS_ = 0F;
                 onChanged();
                 return this;
@@ -13173,7 +13723,7 @@ public final class Monitoring {
              * @return Whether the startTimestamp field is set.
              */
             public boolean hasStartTimestamp() {
-                return ((bitField0_ & 0x00000010) != 0);
+                return startTimestampBuilder_ != null || startTimestamp_ != null;
             }
 
             /**
@@ -13205,11 +13755,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     startTimestamp_ = value;
+                    onChanged();
                 } else {
                     startTimestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -13223,11 +13772,10 @@ public final class Monitoring {
             public Builder setStartTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (startTimestampBuilder_ == null) {
                     startTimestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     startTimestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -13240,16 +13788,15 @@ public final class Monitoring {
              */
             public Builder mergeStartTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (startTimestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000010) != 0) && startTimestamp_ != null && startTimestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getStartTimestampBuilder().mergeFrom(value);
+                    if (startTimestamp_ != null) {
+                        startTimestamp_ = context.ContextOuterClass.Timestamp.newBuilder(startTimestamp_).mergeFrom(value).buildPartial();
                     } else {
                         startTimestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     startTimestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -13261,13 +13808,13 @@ public final class Monitoring {
              * .context.Timestamp start_timestamp = 5;
              */
             public Builder clearStartTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000010);
-                startTimestamp_ = null;
-                if (startTimestampBuilder_ != null) {
-                    startTimestampBuilder_.dispose();
+                if (startTimestampBuilder_ == null) {
+                    startTimestamp_ = null;
+                    onChanged();
+                } else {
+                    startTimestamp_ = null;
                     startTimestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -13279,7 +13826,6 @@ public final class Monitoring {
              * .context.Timestamp start_timestamp = 5;
              */
             public context.ContextOuterClass.Timestamp.Builder getStartTimestampBuilder() {
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return getStartTimestampFieldBuilder().getBuilder();
             }
@@ -13327,7 +13873,7 @@ public final class Monitoring {
              * @return Whether the endTimestamp field is set.
              */
             public boolean hasEndTimestamp() {
-                return ((bitField0_ & 0x00000020) != 0);
+                return endTimestampBuilder_ != null || endTimestamp_ != null;
             }
 
             /**
@@ -13359,11 +13905,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     endTimestamp_ = value;
+                    onChanged();
                 } else {
                     endTimestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -13377,11 +13922,10 @@ public final class Monitoring {
             public Builder setEndTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (endTimestampBuilder_ == null) {
                     endTimestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     endTimestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -13394,16 +13938,15 @@ public final class Monitoring {
              */
             public Builder mergeEndTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (endTimestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000020) != 0) && endTimestamp_ != null && endTimestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getEndTimestampBuilder().mergeFrom(value);
+                    if (endTimestamp_ != null) {
+                        endTimestamp_ = context.ContextOuterClass.Timestamp.newBuilder(endTimestamp_).mergeFrom(value).buildPartial();
                     } else {
                         endTimestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     endTimestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -13415,13 +13958,13 @@ public final class Monitoring {
              * .context.Timestamp end_timestamp = 6;
              */
             public Builder clearEndTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000020);
-                endTimestamp_ = null;
-                if (endTimestampBuilder_ != null) {
-                    endTimestampBuilder_.dispose();
+                if (endTimestampBuilder_ == null) {
+                    endTimestamp_ = null;
+                    onChanged();
+                } else {
+                    endTimestamp_ = null;
                     endTimestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -13433,7 +13976,6 @@ public final class Monitoring {
              * .context.Timestamp end_timestamp = 6;
              */
             public context.ContextOuterClass.Timestamp.Builder getEndTimestampBuilder() {
-                bitField0_ |= 0x00000020;
                 onChanged();
                 return getEndTimestampFieldBuilder().getBuilder();
             }
@@ -13495,17 +14037,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public SubsDescriptor parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SubsDescriptor(input, extensionRegistry);
             }
         };
 
@@ -13567,6 +14099,57 @@ public final class Monitoring {
             return new SubscriptionID();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SubscriptionID(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (subsId_ != null) {
+                                    subBuilder = subsId_.toBuilder();
+                                }
+                                subsId_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(subsId_);
+                                    subsId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_SubscriptionID_descriptor;
         }
@@ -13603,7 +14186,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getSubsIdOrBuilder() {
-            return subsId_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : subsId_;
+            return getSubsId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -13624,7 +14207,7 @@ public final class Monitoring {
             if (subsId_ != null) {
                 output.writeMessage(1, getSubsId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -13636,7 +14219,7 @@ public final class Monitoring {
             if (subsId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getSubsId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -13656,7 +14239,7 @@ public final class Monitoring {
                 if (!getSubsId().equals(other.getSubsId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -13672,7 +14255,7 @@ public final class Monitoring {
                 hash = (37 * hash) + SUBS_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getSubsId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -13766,19 +14349,26 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.SubscriptionID.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                subsId_ = null;
-                if (subsIdBuilder_ != null) {
-                    subsIdBuilder_.dispose();
+                if (subsIdBuilder_ == null) {
+                    subsId_ = null;
+                } else {
+                    subsId_ = null;
                     subsIdBuilder_ = null;
                 }
                 return this;
@@ -13806,18 +14396,43 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.SubscriptionID buildPartial() {
                 monitoring.Monitoring.SubscriptionID result = new monitoring.Monitoring.SubscriptionID(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (subsIdBuilder_ == null) {
+                    result.subsId_ = subsId_;
+                } else {
+                    result.subsId_ = subsIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.SubscriptionID result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.subsId_ = subsIdBuilder_ == null ? subsId_ : subsIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -13836,7 +14451,7 @@ public final class Monitoring {
                 if (other.hasSubsId()) {
                     mergeSubsId(other.getSubsId());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -13848,47 +14463,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.SubscriptionID parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getSubsIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.SubscriptionID) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid subsId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 subsIdBuilder_;
@@ -13898,7 +14486,7 @@ public final class Monitoring {
              * @return Whether the subsId field is set.
              */
             public boolean hasSubsId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return subsIdBuilder_ != null || subsId_ != null;
             }
 
             /**
@@ -13922,11 +14510,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     subsId_ = value;
+                    onChanged();
                 } else {
                     subsIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -13936,11 +14523,10 @@ public final class Monitoring {
             public Builder setSubsId(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (subsIdBuilder_ == null) {
                     subsId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     subsIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -13949,16 +14535,15 @@ public final class Monitoring {
              */
             public Builder mergeSubsId(context.ContextOuterClass.Uuid value) {
                 if (subsIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && subsId_ != null && subsId_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getSubsIdBuilder().mergeFrom(value);
+                    if (subsId_ != null) {
+                        subsId_ = context.ContextOuterClass.Uuid.newBuilder(subsId_).mergeFrom(value).buildPartial();
                     } else {
                         subsId_ = value;
                     }
+                    onChanged();
                 } else {
                     subsIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -13966,13 +14551,13 @@ public final class Monitoring {
              * .context.Uuid subs_id = 1;
              */
             public Builder clearSubsId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                subsId_ = null;
-                if (subsIdBuilder_ != null) {
-                    subsIdBuilder_.dispose();
+                if (subsIdBuilder_ == null) {
+                    subsId_ = null;
+                    onChanged();
+                } else {
+                    subsId_ = null;
                     subsIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -13980,7 +14565,6 @@ public final class Monitoring {
              * .context.Uuid subs_id = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getSubsIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getSubsIdFieldBuilder().getBuilder();
             }
@@ -14034,17 +14618,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public SubscriptionID parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SubscriptionID(input, extensionRegistry);
             }
         };
 
@@ -14123,6 +14697,70 @@ public final class Monitoring {
             return new SubsResponse();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SubsResponse(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.SubscriptionID.Builder subBuilder = null;
+                                if (subsId_ != null) {
+                                    subBuilder = subsId_.toBuilder();
+                                }
+                                subsId_ = input.readMessage(monitoring.Monitoring.SubscriptionID.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(subsId_);
+                                    subsId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                monitoring.Monitoring.KpiList.Builder subBuilder = null;
+                                if (kpiList_ != null) {
+                                    subBuilder = kpiList_.toBuilder();
+                                }
+                                kpiList_ = input.readMessage(monitoring.Monitoring.KpiList.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiList_);
+                                    kpiList_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_SubsResponse_descriptor;
         }
@@ -14159,7 +14797,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.SubscriptionIDOrBuilder getSubsIdOrBuilder() {
-            return subsId_ == null ? monitoring.Monitoring.SubscriptionID.getDefaultInstance() : subsId_;
+            return getSubsId();
         }
 
         public static final int KPI_LIST_FIELD_NUMBER = 2;
@@ -14189,7 +14827,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiListOrBuilder getKpiListOrBuilder() {
-            return kpiList_ == null ? monitoring.Monitoring.KpiList.getDefaultInstance() : kpiList_;
+            return getKpiList();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -14213,7 +14851,7 @@ public final class Monitoring {
             if (kpiList_ != null) {
                 output.writeMessage(2, getKpiList());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -14228,7 +14866,7 @@ public final class Monitoring {
             if (kpiList_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getKpiList());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -14254,7 +14892,7 @@ public final class Monitoring {
                 if (!getKpiList().equals(other.getKpiList()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -14274,7 +14912,7 @@ public final class Monitoring {
                 hash = (37 * hash) + KPI_LIST_FIELD_NUMBER;
                 hash = (53 * hash) + getKpiList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -14368,24 +15006,32 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.SubsResponse.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                subsId_ = null;
-                if (subsIdBuilder_ != null) {
-                    subsIdBuilder_.dispose();
+                if (subsIdBuilder_ == null) {
+                    subsId_ = null;
+                } else {
+                    subsId_ = null;
                     subsIdBuilder_ = null;
                 }
-                kpiList_ = null;
-                if (kpiListBuilder_ != null) {
-                    kpiListBuilder_.dispose();
+                if (kpiListBuilder_ == null) {
+                    kpiList_ = null;
+                } else {
+                    kpiList_ = null;
                     kpiListBuilder_ = null;
                 }
                 return this;
@@ -14413,21 +15059,48 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.SubsResponse buildPartial() {
                 monitoring.Monitoring.SubsResponse result = new monitoring.Monitoring.SubsResponse(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (subsIdBuilder_ == null) {
+                    result.subsId_ = subsId_;
+                } else {
+                    result.subsId_ = subsIdBuilder_.build();
+                }
+                if (kpiListBuilder_ == null) {
+                    result.kpiList_ = kpiList_;
+                } else {
+                    result.kpiList_ = kpiListBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.SubsResponse result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.subsId_ = subsIdBuilder_ == null ? subsId_ : subsIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.kpiList_ = kpiListBuilder_ == null ? kpiList_ : kpiListBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -14449,7 +15122,7 @@ public final class Monitoring {
                 if (other.hasKpiList()) {
                     mergeKpiList(other.getKpiList());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -14461,54 +15134,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.SubsResponse parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getSubsIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getKpiListFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.SubsResponse) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.SubscriptionID subsId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 subsIdBuilder_;
@@ -14518,7 +15157,7 @@ public final class Monitoring {
              * @return Whether the subsId field is set.
              */
             public boolean hasSubsId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return subsIdBuilder_ != null || subsId_ != null;
             }
 
             /**
@@ -14542,11 +15181,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     subsId_ = value;
+                    onChanged();
                 } else {
                     subsIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -14556,11 +15194,10 @@ public final class Monitoring {
             public Builder setSubsId(monitoring.Monitoring.SubscriptionID.Builder builderForValue) {
                 if (subsIdBuilder_ == null) {
                     subsId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     subsIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -14569,16 +15206,15 @@ public final class Monitoring {
              */
             public Builder mergeSubsId(monitoring.Monitoring.SubscriptionID value) {
                 if (subsIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && subsId_ != null && subsId_ != monitoring.Monitoring.SubscriptionID.getDefaultInstance()) {
-                        getSubsIdBuilder().mergeFrom(value);
+                    if (subsId_ != null) {
+                        subsId_ = monitoring.Monitoring.SubscriptionID.newBuilder(subsId_).mergeFrom(value).buildPartial();
                     } else {
                         subsId_ = value;
                     }
+                    onChanged();
                 } else {
                     subsIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -14586,13 +15222,13 @@ public final class Monitoring {
              * .monitoring.SubscriptionID subs_id = 1;
              */
             public Builder clearSubsId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                subsId_ = null;
-                if (subsIdBuilder_ != null) {
-                    subsIdBuilder_.dispose();
+                if (subsIdBuilder_ == null) {
+                    subsId_ = null;
+                    onChanged();
+                } else {
+                    subsId_ = null;
                     subsIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -14600,7 +15236,6 @@ public final class Monitoring {
              * .monitoring.SubscriptionID subs_id = 1;
              */
             public monitoring.Monitoring.SubscriptionID.Builder getSubsIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getSubsIdFieldBuilder().getBuilder();
             }
@@ -14636,7 +15271,7 @@ public final class Monitoring {
              * @return Whether the kpiList field is set.
              */
             public boolean hasKpiList() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return kpiListBuilder_ != null || kpiList_ != null;
             }
 
             /**
@@ -14660,11 +15295,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiList_ = value;
+                    onChanged();
                 } else {
                     kpiListBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -14674,11 +15308,10 @@ public final class Monitoring {
             public Builder setKpiList(monitoring.Monitoring.KpiList.Builder builderForValue) {
                 if (kpiListBuilder_ == null) {
                     kpiList_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiListBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -14687,16 +15320,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiList(monitoring.Monitoring.KpiList value) {
                 if (kpiListBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && kpiList_ != null && kpiList_ != monitoring.Monitoring.KpiList.getDefaultInstance()) {
-                        getKpiListBuilder().mergeFrom(value);
+                    if (kpiList_ != null) {
+                        kpiList_ = monitoring.Monitoring.KpiList.newBuilder(kpiList_).mergeFrom(value).buildPartial();
                     } else {
                         kpiList_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiListBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -14704,13 +15336,13 @@ public final class Monitoring {
              * .monitoring.KpiList kpi_list = 2;
              */
             public Builder clearKpiList() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                kpiList_ = null;
-                if (kpiListBuilder_ != null) {
-                    kpiListBuilder_.dispose();
+                if (kpiListBuilder_ == null) {
+                    kpiList_ = null;
+                    onChanged();
+                } else {
+                    kpiList_ = null;
                     kpiListBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -14718,7 +15350,6 @@ public final class Monitoring {
              * .monitoring.KpiList kpi_list = 2;
              */
             public monitoring.Monitoring.KpiList.Builder getKpiListBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getKpiListFieldBuilder().getBuilder();
             }
@@ -14772,17 +15403,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public SubsResponse parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SubsResponse(input, extensionRegistry);
             }
         };
 
@@ -14853,6 +15474,57 @@ public final class Monitoring {
             return new SubsList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private SubsList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    subsDescriptor_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                subsDescriptor_.add(input.readMessage(monitoring.Monitoring.SubsDescriptor.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    subsDescriptor_ = java.util.Collections.unmodifiableList(subsDescriptor_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_SubsList_descriptor;
         }
@@ -14864,7 +15536,6 @@ public final class Monitoring {
 
         public static final int SUBS_DESCRIPTOR_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List subsDescriptor_;
 
         /**
@@ -14925,7 +15596,7 @@ public final class Monitoring {
             for (int i = 0; i < subsDescriptor_.size(); i++) {
                 output.writeMessage(1, subsDescriptor_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -14937,7 +15608,7 @@ public final class Monitoring {
             for (int i = 0; i < subsDescriptor_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, subsDescriptor_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -14953,7 +15624,7 @@ public final class Monitoring {
             monitoring.Monitoring.SubsList other = (monitoring.Monitoring.SubsList) obj;
             if (!getSubsDescriptorList().equals(other.getSubsDescriptorList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -14969,7 +15640,7 @@ public final class Monitoring {
                 hash = (37 * hash) + SUBS_DESCRIPTOR_FIELD_NUMBER;
                 hash = (53 * hash) + getSubsDescriptorList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -15063,23 +15734,29 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.SubsList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getSubsDescriptorFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (subsDescriptorBuilder_ == null) {
                     subsDescriptor_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    subsDescriptor_ = null;
                     subsDescriptorBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -15105,15 +15782,7 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.SubsList buildPartial() {
                 monitoring.Monitoring.SubsList result = new monitoring.Monitoring.SubsList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(monitoring.Monitoring.SubsList result) {
+                int from_bitField0_ = bitField0_;
                 if (subsDescriptorBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         subsDescriptor_ = java.util.Collections.unmodifiableList(subsDescriptor_);
@@ -15123,10 +15792,38 @@ public final class Monitoring {
                 } else {
                     result.subsDescriptor_ = subsDescriptorBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.SubsList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -15166,7 +15863,7 @@ public final class Monitoring {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -15178,47 +15875,17 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.SubsList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    monitoring.Monitoring.SubsDescriptor m = input.readMessage(monitoring.Monitoring.SubsDescriptor.parser(), extensionRegistry);
-                                    if (subsDescriptorBuilder_ == null) {
-                                        ensureSubsDescriptorIsMutable();
-                                        subsDescriptor_.add(m);
-                                    } else {
-                                        subsDescriptorBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.SubsList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -15488,17 +16155,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public SubsList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new SubsList(input, extensionRegistry);
             }
         };
 
@@ -15637,6 +16294,108 @@ public final class Monitoring {
             return new AlarmDescriptor();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private AlarmDescriptor(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.AlarmID.Builder subBuilder = null;
+                                if (alarmId_ != null) {
+                                    subBuilder = alarmId_.toBuilder();
+                                }
+                                alarmId_ = input.readMessage(monitoring.Monitoring.AlarmID.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(alarmId_);
+                                    alarmId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                alarmDescription_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                name_ = s;
+                                break;
+                            }
+                        case 34:
+                            {
+                                monitoring.Monitoring.KpiId.Builder subBuilder = null;
+                                if (kpiId_ != null) {
+                                    subBuilder = kpiId_.toBuilder();
+                                }
+                                kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiId_);
+                                    kpiId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 42:
+                            {
+                                monitoring.Monitoring.KpiValueRange.Builder subBuilder = null;
+                                if (kpiValueRange_ != null) {
+                                    subBuilder = kpiValueRange_.toBuilder();
+                                }
+                                kpiValueRange_ = input.readMessage(monitoring.Monitoring.KpiValueRange.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiValueRange_);
+                                    kpiValueRange_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 50:
+                            {
+                                context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+                                if (timestamp_ != null) {
+                                    subBuilder = timestamp_.toBuilder();
+                                }
+                                timestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(timestamp_);
+                                    timestamp_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_AlarmDescriptor_descriptor;
         }
@@ -15673,13 +16432,12 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.AlarmIDOrBuilder getAlarmIdOrBuilder() {
-            return alarmId_ == null ? monitoring.Monitoring.AlarmID.getDefaultInstance() : alarmId_;
+            return getAlarmId();
         }
 
         public static final int ALARM_DESCRIPTION_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object alarmDescription_ = "";
+        private volatile java.lang.Object alarmDescription_;
 
         /**
          * string alarm_description = 2;
@@ -15716,8 +16474,7 @@ public final class Monitoring {
 
         public static final int NAME_FIELD_NUMBER = 3;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object name_ = "";
+        private volatile java.lang.Object name_;
 
         /**
          * string name = 3;
@@ -15779,7 +16536,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
-            return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+            return getKpiId();
         }
 
         public static final int KPI_VALUE_RANGE_FIELD_NUMBER = 5;
@@ -15809,7 +16566,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiValueRangeOrBuilder getKpiValueRangeOrBuilder() {
-            return kpiValueRange_ == null ? monitoring.Monitoring.KpiValueRange.getDefaultInstance() : kpiValueRange_;
+            return getKpiValueRange();
         }
 
         public static final int TIMESTAMP_FIELD_NUMBER = 6;
@@ -15839,7 +16596,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-            return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+            return getTimestamp();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -15860,10 +16617,10 @@ public final class Monitoring {
             if (alarmId_ != null) {
                 output.writeMessage(1, getAlarmId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(alarmDescription_)) {
+            if (!getAlarmDescriptionBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, alarmDescription_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 3, name_);
             }
             if (kpiId_ != null) {
@@ -15875,7 +16632,7 @@ public final class Monitoring {
             if (timestamp_ != null) {
                 output.writeMessage(6, getTimestamp());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -15887,10 +16644,10 @@ public final class Monitoring {
             if (alarmId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getAlarmId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(alarmDescription_)) {
+            if (!getAlarmDescriptionBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, alarmDescription_);
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+            if (!getNameBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, name_);
             }
             if (kpiId_ != null) {
@@ -15902,7 +16659,7 @@ public final class Monitoring {
             if (timestamp_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(6, getTimestamp());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -15944,7 +16701,7 @@ public final class Monitoring {
                 if (!getTimestamp().equals(other.getTimestamp()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -15976,7 +16733,7 @@ public final class Monitoring {
                 hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
                 hash = (53 * hash) + getTimestamp().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -16070,36 +16827,46 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.AlarmDescriptor.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                alarmId_ = null;
-                if (alarmIdBuilder_ != null) {
-                    alarmIdBuilder_.dispose();
+                if (alarmIdBuilder_ == null) {
+                    alarmId_ = null;
+                } else {
+                    alarmId_ = null;
                     alarmIdBuilder_ = null;
                 }
                 alarmDescription_ = "";
                 name_ = "";
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                kpiValueRange_ = null;
-                if (kpiValueRangeBuilder_ != null) {
-                    kpiValueRangeBuilder_.dispose();
+                if (kpiValueRangeBuilder_ == null) {
+                    kpiValueRange_ = null;
+                } else {
+                    kpiValueRange_ = null;
                     kpiValueRangeBuilder_ = null;
                 }
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
                 return this;
@@ -16127,33 +16894,60 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.AlarmDescriptor buildPartial() {
                 monitoring.Monitoring.AlarmDescriptor result = new monitoring.Monitoring.AlarmDescriptor(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (alarmIdBuilder_ == null) {
+                    result.alarmId_ = alarmId_;
+                } else {
+                    result.alarmId_ = alarmIdBuilder_.build();
+                }
+                result.alarmDescription_ = alarmDescription_;
+                result.name_ = name_;
+                if (kpiIdBuilder_ == null) {
+                    result.kpiId_ = kpiId_;
+                } else {
+                    result.kpiId_ = kpiIdBuilder_.build();
+                }
+                if (kpiValueRangeBuilder_ == null) {
+                    result.kpiValueRange_ = kpiValueRange_;
+                } else {
+                    result.kpiValueRange_ = kpiValueRangeBuilder_.build();
+                }
+                if (timestampBuilder_ == null) {
+                    result.timestamp_ = timestamp_;
+                } else {
+                    result.timestamp_ = timestampBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.AlarmDescriptor result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.alarmId_ = alarmIdBuilder_ == null ? alarmId_ : alarmIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.alarmDescription_ = alarmDescription_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.name_ = name_;
-                }
-                if (((from_bitField0_ & 0x00000008) != 0)) {
-                    result.kpiId_ = kpiIdBuilder_ == null ? kpiId_ : kpiIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000010) != 0)) {
-                    result.kpiValueRange_ = kpiValueRangeBuilder_ == null ? kpiValueRange_ : kpiValueRangeBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000020) != 0)) {
-                    result.timestamp_ = timestampBuilder_ == null ? timestamp_ : timestampBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -16174,12 +16968,10 @@ public final class Monitoring {
                 }
                 if (!other.getAlarmDescription().isEmpty()) {
                     alarmDescription_ = other.alarmDescription_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (!other.getName().isEmpty()) {
                     name_ = other.name_;
-                    bitField0_ |= 0x00000004;
                     onChanged();
                 }
                 if (other.hasKpiId()) {
@@ -16191,7 +16983,7 @@ public final class Monitoring {
                 if (other.hasTimestamp()) {
                     mergeTimestamp(other.getTimestamp());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -16203,82 +16995,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.AlarmDescriptor parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getAlarmIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    alarmDescription_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    name_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            case 34:
-                                {
-                                    input.readMessage(getKpiIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000008;
-                                    break;
-                                }
-                            // case 34
-                            case 42:
-                                {
-                                    input.readMessage(getKpiValueRangeFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000010;
-                                    break;
-                                }
-                            // case 42
-                            case 50:
-                                {
-                                    input.readMessage(getTimestampFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000020;
-                                    break;
-                                }
-                            // case 50
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.AlarmDescriptor) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.AlarmID alarmId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 alarmIdBuilder_;
@@ -16288,7 +17018,7 @@ public final class Monitoring {
              * @return Whether the alarmId field is set.
              */
             public boolean hasAlarmId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return alarmIdBuilder_ != null || alarmId_ != null;
             }
 
             /**
@@ -16312,11 +17042,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     alarmId_ = value;
+                    onChanged();
                 } else {
                     alarmIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -16326,11 +17055,10 @@ public final class Monitoring {
             public Builder setAlarmId(monitoring.Monitoring.AlarmID.Builder builderForValue) {
                 if (alarmIdBuilder_ == null) {
                     alarmId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     alarmIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -16339,16 +17067,15 @@ public final class Monitoring {
              */
             public Builder mergeAlarmId(monitoring.Monitoring.AlarmID value) {
                 if (alarmIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && alarmId_ != null && alarmId_ != monitoring.Monitoring.AlarmID.getDefaultInstance()) {
-                        getAlarmIdBuilder().mergeFrom(value);
+                    if (alarmId_ != null) {
+                        alarmId_ = monitoring.Monitoring.AlarmID.newBuilder(alarmId_).mergeFrom(value).buildPartial();
                     } else {
                         alarmId_ = value;
                     }
+                    onChanged();
                 } else {
                     alarmIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -16356,13 +17083,13 @@ public final class Monitoring {
              * .monitoring.AlarmID alarm_id = 1;
              */
             public Builder clearAlarmId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                alarmId_ = null;
-                if (alarmIdBuilder_ != null) {
-                    alarmIdBuilder_.dispose();
+                if (alarmIdBuilder_ == null) {
+                    alarmId_ = null;
+                    onChanged();
+                } else {
+                    alarmId_ = null;
                     alarmIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -16370,7 +17097,6 @@ public final class Monitoring {
              * .monitoring.AlarmID alarm_id = 1;
              */
             public monitoring.Monitoring.AlarmID.Builder getAlarmIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getAlarmIdFieldBuilder().getBuilder();
             }
@@ -16440,7 +17166,6 @@ public final class Monitoring {
                     throw new NullPointerException();
                 }
                 alarmDescription_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -16451,7 +17176,6 @@ public final class Monitoring {
              */
             public Builder clearAlarmDescription() {
                 alarmDescription_ = getDefaultInstance().getAlarmDescription();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -16467,7 +17191,6 @@ public final class Monitoring {
                 }
                 checkByteStringIsUtf8(value);
                 alarmDescription_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -16515,7 +17238,6 @@ public final class Monitoring {
                     throw new NullPointerException();
                 }
                 name_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -16526,7 +17248,6 @@ public final class Monitoring {
              */
             public Builder clearName() {
                 name_ = getDefaultInstance().getName();
-                bitField0_ = (bitField0_ & ~0x00000004);
                 onChanged();
                 return this;
             }
@@ -16542,7 +17263,6 @@ public final class Monitoring {
                 }
                 checkByteStringIsUtf8(value);
                 name_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -16556,7 +17276,7 @@ public final class Monitoring {
              * @return Whether the kpiId field is set.
              */
             public boolean hasKpiId() {
-                return ((bitField0_ & 0x00000008) != 0);
+                return kpiIdBuilder_ != null || kpiId_ != null;
             }
 
             /**
@@ -16580,11 +17300,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiId_ = value;
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -16594,11 +17313,10 @@ public final class Monitoring {
             public Builder setKpiId(monitoring.Monitoring.KpiId.Builder builderForValue) {
                 if (kpiIdBuilder_ == null) {
                     kpiId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -16607,16 +17325,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiId(monitoring.Monitoring.KpiId value) {
                 if (kpiIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000008) != 0) && kpiId_ != null && kpiId_ != monitoring.Monitoring.KpiId.getDefaultInstance()) {
-                        getKpiIdBuilder().mergeFrom(value);
+                    if (kpiId_ != null) {
+                        kpiId_ = monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial();
                     } else {
                         kpiId_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000008;
-                onChanged();
                 return this;
             }
 
@@ -16624,13 +17341,13 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 4;
              */
             public Builder clearKpiId() {
-                bitField0_ = (bitField0_ & ~0x00000008);
-                kpiId_ = null;
-                if (kpiIdBuilder_ != null) {
-                    kpiIdBuilder_.dispose();
+                if (kpiIdBuilder_ == null) {
+                    kpiId_ = null;
+                    onChanged();
+                } else {
+                    kpiId_ = null;
                     kpiIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -16638,7 +17355,6 @@ public final class Monitoring {
              * .monitoring.KpiId kpi_id = 4;
              */
             public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() {
-                bitField0_ |= 0x00000008;
                 onChanged();
                 return getKpiIdFieldBuilder().getBuilder();
             }
@@ -16674,7 +17390,7 @@ public final class Monitoring {
              * @return Whether the kpiValueRange field is set.
              */
             public boolean hasKpiValueRange() {
-                return ((bitField0_ & 0x00000010) != 0);
+                return kpiValueRangeBuilder_ != null || kpiValueRange_ != null;
             }
 
             /**
@@ -16698,11 +17414,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiValueRange_ = value;
+                    onChanged();
                 } else {
                     kpiValueRangeBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -16712,11 +17427,10 @@ public final class Monitoring {
             public Builder setKpiValueRange(monitoring.Monitoring.KpiValueRange.Builder builderForValue) {
                 if (kpiValueRangeBuilder_ == null) {
                     kpiValueRange_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiValueRangeBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -16725,16 +17439,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiValueRange(monitoring.Monitoring.KpiValueRange value) {
                 if (kpiValueRangeBuilder_ == null) {
-                    if (((bitField0_ & 0x00000010) != 0) && kpiValueRange_ != null && kpiValueRange_ != monitoring.Monitoring.KpiValueRange.getDefaultInstance()) {
-                        getKpiValueRangeBuilder().mergeFrom(value);
+                    if (kpiValueRange_ != null) {
+                        kpiValueRange_ = monitoring.Monitoring.KpiValueRange.newBuilder(kpiValueRange_).mergeFrom(value).buildPartial();
                     } else {
                         kpiValueRange_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiValueRangeBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000010;
-                onChanged();
                 return this;
             }
 
@@ -16742,13 +17455,13 @@ public final class Monitoring {
              * .monitoring.KpiValueRange kpi_value_range = 5;
              */
             public Builder clearKpiValueRange() {
-                bitField0_ = (bitField0_ & ~0x00000010);
-                kpiValueRange_ = null;
-                if (kpiValueRangeBuilder_ != null) {
-                    kpiValueRangeBuilder_.dispose();
+                if (kpiValueRangeBuilder_ == null) {
+                    kpiValueRange_ = null;
+                    onChanged();
+                } else {
+                    kpiValueRange_ = null;
                     kpiValueRangeBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -16756,7 +17469,6 @@ public final class Monitoring {
              * .monitoring.KpiValueRange kpi_value_range = 5;
              */
             public monitoring.Monitoring.KpiValueRange.Builder getKpiValueRangeBuilder() {
-                bitField0_ |= 0x00000010;
                 onChanged();
                 return getKpiValueRangeFieldBuilder().getBuilder();
             }
@@ -16792,7 +17504,7 @@ public final class Monitoring {
              * @return Whether the timestamp field is set.
              */
             public boolean hasTimestamp() {
-                return ((bitField0_ & 0x00000020) != 0);
+                return timestampBuilder_ != null || timestamp_ != null;
             }
 
             /**
@@ -16816,11 +17528,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     timestamp_ = value;
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -16830,11 +17541,10 @@ public final class Monitoring {
             public Builder setTimestamp(context.ContextOuterClass.Timestamp.Builder builderForValue) {
                 if (timestampBuilder_ == null) {
                     timestamp_ = builderForValue.build();
+                    onChanged();
                 } else {
                     timestampBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -16843,16 +17553,15 @@ public final class Monitoring {
              */
             public Builder mergeTimestamp(context.ContextOuterClass.Timestamp value) {
                 if (timestampBuilder_ == null) {
-                    if (((bitField0_ & 0x00000020) != 0) && timestamp_ != null && timestamp_ != context.ContextOuterClass.Timestamp.getDefaultInstance()) {
-                        getTimestampBuilder().mergeFrom(value);
+                    if (timestamp_ != null) {
+                        timestamp_ = context.ContextOuterClass.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial();
                     } else {
                         timestamp_ = value;
                     }
+                    onChanged();
                 } else {
                     timestampBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000020;
-                onChanged();
                 return this;
             }
 
@@ -16860,13 +17569,13 @@ public final class Monitoring {
              * .context.Timestamp timestamp = 6;
              */
             public Builder clearTimestamp() {
-                bitField0_ = (bitField0_ & ~0x00000020);
-                timestamp_ = null;
-                if (timestampBuilder_ != null) {
-                    timestampBuilder_.dispose();
+                if (timestampBuilder_ == null) {
+                    timestamp_ = null;
+                    onChanged();
+                } else {
+                    timestamp_ = null;
                     timestampBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -16874,7 +17583,6 @@ public final class Monitoring {
              * .context.Timestamp timestamp = 6;
              */
             public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
-                bitField0_ |= 0x00000020;
                 onChanged();
                 return getTimestampFieldBuilder().getBuilder();
             }
@@ -16928,17 +17636,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public AlarmDescriptor parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new AlarmDescriptor(input, extensionRegistry);
             }
         };
 
@@ -17000,6 +17698,57 @@ public final class Monitoring {
             return new AlarmID();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private AlarmID(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (alarmId_ != null) {
+                                    subBuilder = alarmId_.toBuilder();
+                                }
+                                alarmId_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(alarmId_);
+                                    alarmId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_AlarmID_descriptor;
         }
@@ -17036,7 +17785,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getAlarmIdOrBuilder() {
-            return alarmId_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : alarmId_;
+            return getAlarmId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -17057,7 +17806,7 @@ public final class Monitoring {
             if (alarmId_ != null) {
                 output.writeMessage(1, getAlarmId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -17069,7 +17818,7 @@ public final class Monitoring {
             if (alarmId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getAlarmId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -17089,7 +17838,7 @@ public final class Monitoring {
                 if (!getAlarmId().equals(other.getAlarmId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -17105,7 +17854,7 @@ public final class Monitoring {
                 hash = (37 * hash) + ALARM_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getAlarmId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -17199,19 +17948,26 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.AlarmID.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                alarmId_ = null;
-                if (alarmIdBuilder_ != null) {
-                    alarmIdBuilder_.dispose();
+                if (alarmIdBuilder_ == null) {
+                    alarmId_ = null;
+                } else {
+                    alarmId_ = null;
                     alarmIdBuilder_ = null;
                 }
                 return this;
@@ -17239,18 +17995,43 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.AlarmID buildPartial() {
                 monitoring.Monitoring.AlarmID result = new monitoring.Monitoring.AlarmID(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (alarmIdBuilder_ == null) {
+                    result.alarmId_ = alarmId_;
+                } else {
+                    result.alarmId_ = alarmIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.AlarmID result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.alarmId_ = alarmIdBuilder_ == null ? alarmId_ : alarmIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -17269,7 +18050,7 @@ public final class Monitoring {
                 if (other.hasAlarmId()) {
                     mergeAlarmId(other.getAlarmId());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -17278,50 +18059,23 @@ public final class Monitoring {
             public final boolean isInitialized() {
                 return true;
             }
-
-            @java.lang.Override
-            public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
-                try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getAlarmIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
+                monitoring.Monitoring.AlarmID parsedMessage = null;
+                try {
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.AlarmID) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid alarmId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 alarmIdBuilder_;
@@ -17331,7 +18085,7 @@ public final class Monitoring {
              * @return Whether the alarmId field is set.
              */
             public boolean hasAlarmId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return alarmIdBuilder_ != null || alarmId_ != null;
             }
 
             /**
@@ -17355,11 +18109,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     alarmId_ = value;
+                    onChanged();
                 } else {
                     alarmIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -17369,11 +18122,10 @@ public final class Monitoring {
             public Builder setAlarmId(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (alarmIdBuilder_ == null) {
                     alarmId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     alarmIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -17382,16 +18134,15 @@ public final class Monitoring {
              */
             public Builder mergeAlarmId(context.ContextOuterClass.Uuid value) {
                 if (alarmIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && alarmId_ != null && alarmId_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getAlarmIdBuilder().mergeFrom(value);
+                    if (alarmId_ != null) {
+                        alarmId_ = context.ContextOuterClass.Uuid.newBuilder(alarmId_).mergeFrom(value).buildPartial();
                     } else {
                         alarmId_ = value;
                     }
+                    onChanged();
                 } else {
                     alarmIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -17399,13 +18150,13 @@ public final class Monitoring {
              * .context.Uuid alarm_id = 1;
              */
             public Builder clearAlarmId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                alarmId_ = null;
-                if (alarmIdBuilder_ != null) {
-                    alarmIdBuilder_.dispose();
+                if (alarmIdBuilder_ == null) {
+                    alarmId_ = null;
+                    onChanged();
+                } else {
+                    alarmId_ = null;
                     alarmIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -17413,7 +18164,6 @@ public final class Monitoring {
              * .context.Uuid alarm_id = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getAlarmIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getAlarmIdFieldBuilder().getBuilder();
             }
@@ -17467,17 +18217,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public AlarmID parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new AlarmID(input, extensionRegistry);
             }
         };
 
@@ -17551,6 +18291,67 @@ public final class Monitoring {
             return new AlarmSubscription();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private AlarmSubscription(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.AlarmID.Builder subBuilder = null;
+                                if (alarmId_ != null) {
+                                    subBuilder = alarmId_.toBuilder();
+                                }
+                                alarmId_ = input.readMessage(monitoring.Monitoring.AlarmID.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(alarmId_);
+                                    alarmId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 21:
+                            {
+                                subscriptionTimeoutS_ = input.readFloat();
+                                break;
+                            }
+                        case 29:
+                            {
+                                subscriptionFrequencyMs_ = input.readFloat();
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_AlarmSubscription_descriptor;
         }
@@ -17587,12 +18388,12 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.AlarmIDOrBuilder getAlarmIdOrBuilder() {
-            return alarmId_ == null ? monitoring.Monitoring.AlarmID.getDefaultInstance() : alarmId_;
+            return getAlarmId();
         }
 
         public static final int SUBSCRIPTION_TIMEOUT_S_FIELD_NUMBER = 2;
 
-        private float subscriptionTimeoutS_ = 0F;
+        private float subscriptionTimeoutS_;
 
         /**
          * float subscription_timeout_s = 2;
@@ -17605,7 +18406,7 @@ public final class Monitoring {
 
         public static final int SUBSCRIPTION_FREQUENCY_MS_FIELD_NUMBER = 3;
 
-        private float subscriptionFrequencyMs_ = 0F;
+        private float subscriptionFrequencyMs_;
 
         /**
          * float subscription_frequency_ms = 3;
@@ -17634,13 +18435,13 @@ public final class Monitoring {
             if (alarmId_ != null) {
                 output.writeMessage(1, getAlarmId());
             }
-            if (java.lang.Float.floatToRawIntBits(subscriptionTimeoutS_) != 0) {
+            if (subscriptionTimeoutS_ != 0F) {
                 output.writeFloat(2, subscriptionTimeoutS_);
             }
-            if (java.lang.Float.floatToRawIntBits(subscriptionFrequencyMs_) != 0) {
+            if (subscriptionFrequencyMs_ != 0F) {
                 output.writeFloat(3, subscriptionFrequencyMs_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -17652,13 +18453,13 @@ public final class Monitoring {
             if (alarmId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getAlarmId());
             }
-            if (java.lang.Float.floatToRawIntBits(subscriptionTimeoutS_) != 0) {
+            if (subscriptionTimeoutS_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(2, subscriptionTimeoutS_);
             }
-            if (java.lang.Float.floatToRawIntBits(subscriptionFrequencyMs_) != 0) {
+            if (subscriptionFrequencyMs_ != 0F) {
                 size += com.google.protobuf.CodedOutputStream.computeFloatSize(3, subscriptionFrequencyMs_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -17682,7 +18483,7 @@ public final class Monitoring {
                 return false;
             if (java.lang.Float.floatToIntBits(getSubscriptionFrequencyMs()) != java.lang.Float.floatToIntBits(other.getSubscriptionFrequencyMs()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -17702,7 +18503,7 @@ public final class Monitoring {
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getSubscriptionTimeoutS());
             hash = (37 * hash) + SUBSCRIPTION_FREQUENCY_MS_FIELD_NUMBER;
             hash = (53 * hash) + java.lang.Float.floatToIntBits(getSubscriptionFrequencyMs());
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -17796,19 +18597,26 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.AlarmSubscription.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                alarmId_ = null;
-                if (alarmIdBuilder_ != null) {
-                    alarmIdBuilder_.dispose();
+                if (alarmIdBuilder_ == null) {
+                    alarmId_ = null;
+                } else {
+                    alarmId_ = null;
                     alarmIdBuilder_ = null;
                 }
                 subscriptionTimeoutS_ = 0F;
@@ -17838,24 +18646,45 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.AlarmSubscription buildPartial() {
                 monitoring.Monitoring.AlarmSubscription result = new monitoring.Monitoring.AlarmSubscription(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (alarmIdBuilder_ == null) {
+                    result.alarmId_ = alarmId_;
+                } else {
+                    result.alarmId_ = alarmIdBuilder_.build();
                 }
+                result.subscriptionTimeoutS_ = subscriptionTimeoutS_;
+                result.subscriptionFrequencyMs_ = subscriptionFrequencyMs_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.AlarmSubscription result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.alarmId_ = alarmIdBuilder_ == null ? alarmId_ : alarmIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.subscriptionTimeoutS_ = subscriptionTimeoutS_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.subscriptionFrequencyMs_ = subscriptionFrequencyMs_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -17880,7 +18709,7 @@ public final class Monitoring {
                 if (other.getSubscriptionFrequencyMs() != 0F) {
                     setSubscriptionFrequencyMs(other.getSubscriptionFrequencyMs());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -17892,61 +18721,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.AlarmSubscription parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getAlarmIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 21:
-                                {
-                                    subscriptionTimeoutS_ = input.readFloat();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 21
-                            case 29:
-                                {
-                                    subscriptionFrequencyMs_ = input.readFloat();
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 29
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.AlarmSubscription) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.AlarmID alarmId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 alarmIdBuilder_;
@@ -17956,7 +18744,7 @@ public final class Monitoring {
              * @return Whether the alarmId field is set.
              */
             public boolean hasAlarmId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return alarmIdBuilder_ != null || alarmId_ != null;
             }
 
             /**
@@ -17980,11 +18768,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     alarmId_ = value;
+                    onChanged();
                 } else {
                     alarmIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -17994,11 +18781,10 @@ public final class Monitoring {
             public Builder setAlarmId(monitoring.Monitoring.AlarmID.Builder builderForValue) {
                 if (alarmIdBuilder_ == null) {
                     alarmId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     alarmIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -18007,16 +18793,15 @@ public final class Monitoring {
              */
             public Builder mergeAlarmId(monitoring.Monitoring.AlarmID value) {
                 if (alarmIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && alarmId_ != null && alarmId_ != monitoring.Monitoring.AlarmID.getDefaultInstance()) {
-                        getAlarmIdBuilder().mergeFrom(value);
+                    if (alarmId_ != null) {
+                        alarmId_ = monitoring.Monitoring.AlarmID.newBuilder(alarmId_).mergeFrom(value).buildPartial();
                     } else {
                         alarmId_ = value;
                     }
+                    onChanged();
                 } else {
                     alarmIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -18024,13 +18809,13 @@ public final class Monitoring {
              * .monitoring.AlarmID alarm_id = 1;
              */
             public Builder clearAlarmId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                alarmId_ = null;
-                if (alarmIdBuilder_ != null) {
-                    alarmIdBuilder_.dispose();
+                if (alarmIdBuilder_ == null) {
+                    alarmId_ = null;
+                    onChanged();
+                } else {
+                    alarmId_ = null;
                     alarmIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -18038,7 +18823,6 @@ public final class Monitoring {
              * .monitoring.AlarmID alarm_id = 1;
              */
             public monitoring.Monitoring.AlarmID.Builder getAlarmIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getAlarmIdFieldBuilder().getBuilder();
             }
@@ -18083,7 +18867,6 @@ public final class Monitoring {
              */
             public Builder setSubscriptionTimeoutS(float value) {
                 subscriptionTimeoutS_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -18093,7 +18876,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearSubscriptionTimeoutS() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 subscriptionTimeoutS_ = 0F;
                 onChanged();
                 return this;
@@ -18117,7 +18899,6 @@ public final class Monitoring {
              */
             public Builder setSubscriptionFrequencyMs(float value) {
                 subscriptionFrequencyMs_ = value;
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
@@ -18127,7 +18908,6 @@ public final class Monitoring {
              * @return This builder for chaining.
              */
             public Builder clearSubscriptionFrequencyMs() {
-                bitField0_ = (bitField0_ & ~0x00000004);
                 subscriptionFrequencyMs_ = 0F;
                 onChanged();
                 return this;
@@ -18160,17 +18940,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public AlarmSubscription parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new AlarmSubscription(input, extensionRegistry);
             }
         };
 
@@ -18262,6 +19032,76 @@ public final class Monitoring {
             return new AlarmResponse();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private AlarmResponse(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                monitoring.Monitoring.AlarmID.Builder subBuilder = null;
+                                if (alarmId_ != null) {
+                                    subBuilder = alarmId_.toBuilder();
+                                }
+                                alarmId_ = input.readMessage(monitoring.Monitoring.AlarmID.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(alarmId_);
+                                    alarmId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                text_ = s;
+                                break;
+                            }
+                        case 26:
+                            {
+                                monitoring.Monitoring.KpiList.Builder subBuilder = null;
+                                if (kpiList_ != null) {
+                                    subBuilder = kpiList_.toBuilder();
+                                }
+                                kpiList_ = input.readMessage(monitoring.Monitoring.KpiList.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(kpiList_);
+                                    kpiList_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_AlarmResponse_descriptor;
         }
@@ -18298,13 +19138,12 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.AlarmIDOrBuilder getAlarmIdOrBuilder() {
-            return alarmId_ == null ? monitoring.Monitoring.AlarmID.getDefaultInstance() : alarmId_;
+            return getAlarmId();
         }
 
         public static final int TEXT_FIELD_NUMBER = 2;
 
-        @SuppressWarnings("serial")
-        private volatile java.lang.Object text_ = "";
+        private volatile java.lang.Object text_;
 
         /**
          * string text = 2;
@@ -18366,7 +19205,7 @@ public final class Monitoring {
          */
         @java.lang.Override
         public monitoring.Monitoring.KpiListOrBuilder getKpiListOrBuilder() {
-            return kpiList_ == null ? monitoring.Monitoring.KpiList.getDefaultInstance() : kpiList_;
+            return getKpiList();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -18387,13 +19226,13 @@ public final class Monitoring {
             if (alarmId_ != null) {
                 output.writeMessage(1, getAlarmId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(text_)) {
+            if (!getTextBytes().isEmpty()) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 2, text_);
             }
             if (kpiList_ != null) {
                 output.writeMessage(3, getKpiList());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -18405,13 +19244,13 @@ public final class Monitoring {
             if (alarmId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getAlarmId());
             }
-            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(text_)) {
+            if (!getTextBytes().isEmpty()) {
                 size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, text_);
             }
             if (kpiList_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getKpiList());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -18439,7 +19278,7 @@ public final class Monitoring {
                 if (!getKpiList().equals(other.getKpiList()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -18461,7 +19300,7 @@ public final class Monitoring {
                 hash = (37 * hash) + KPI_LIST_FIELD_NUMBER;
                 hash = (53 * hash) + getKpiList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -18555,25 +19394,33 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.AlarmResponse.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                alarmId_ = null;
-                if (alarmIdBuilder_ != null) {
-                    alarmIdBuilder_.dispose();
+                if (alarmIdBuilder_ == null) {
+                    alarmId_ = null;
+                } else {
+                    alarmId_ = null;
                     alarmIdBuilder_ = null;
                 }
                 text_ = "";
-                kpiList_ = null;
-                if (kpiListBuilder_ != null) {
-                    kpiListBuilder_.dispose();
+                if (kpiListBuilder_ == null) {
+                    kpiList_ = null;
+                } else {
+                    kpiList_ = null;
                     kpiListBuilder_ = null;
                 }
                 return this;
@@ -18601,24 +19448,49 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.AlarmResponse buildPartial() {
                 monitoring.Monitoring.AlarmResponse result = new monitoring.Monitoring.AlarmResponse(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (alarmIdBuilder_ == null) {
+                    result.alarmId_ = alarmId_;
+                } else {
+                    result.alarmId_ = alarmIdBuilder_.build();
+                }
+                result.text_ = text_;
+                if (kpiListBuilder_ == null) {
+                    result.kpiList_ = kpiList_;
+                } else {
+                    result.kpiList_ = kpiListBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.AlarmResponse result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.alarmId_ = alarmIdBuilder_ == null ? alarmId_ : alarmIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.text_ = text_;
-                }
-                if (((from_bitField0_ & 0x00000004) != 0)) {
-                    result.kpiList_ = kpiListBuilder_ == null ? kpiList_ : kpiListBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -18639,13 +19511,12 @@ public final class Monitoring {
                 }
                 if (!other.getText().isEmpty()) {
                     text_ = other.text_;
-                    bitField0_ |= 0x00000002;
                     onChanged();
                 }
                 if (other.hasKpiList()) {
                     mergeKpiList(other.getKpiList());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -18657,61 +19528,20 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.AlarmResponse parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getAlarmIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    text_ = input.readStringRequireUtf8();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            case 26:
-                                {
-                                    input.readMessage(getKpiListFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000004;
-                                    break;
-                                }
-                            // case 26
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.AlarmResponse) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private monitoring.Monitoring.AlarmID alarmId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 alarmIdBuilder_;
@@ -18721,7 +19551,7 @@ public final class Monitoring {
              * @return Whether the alarmId field is set.
              */
             public boolean hasAlarmId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return alarmIdBuilder_ != null || alarmId_ != null;
             }
 
             /**
@@ -18745,11 +19575,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     alarmId_ = value;
+                    onChanged();
                 } else {
                     alarmIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -18759,11 +19588,10 @@ public final class Monitoring {
             public Builder setAlarmId(monitoring.Monitoring.AlarmID.Builder builderForValue) {
                 if (alarmIdBuilder_ == null) {
                     alarmId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     alarmIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -18772,16 +19600,15 @@ public final class Monitoring {
              */
             public Builder mergeAlarmId(monitoring.Monitoring.AlarmID value) {
                 if (alarmIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && alarmId_ != null && alarmId_ != monitoring.Monitoring.AlarmID.getDefaultInstance()) {
-                        getAlarmIdBuilder().mergeFrom(value);
+                    if (alarmId_ != null) {
+                        alarmId_ = monitoring.Monitoring.AlarmID.newBuilder(alarmId_).mergeFrom(value).buildPartial();
                     } else {
                         alarmId_ = value;
                     }
+                    onChanged();
                 } else {
                     alarmIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -18789,13 +19616,13 @@ public final class Monitoring {
              * .monitoring.AlarmID alarm_id = 1;
              */
             public Builder clearAlarmId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                alarmId_ = null;
-                if (alarmIdBuilder_ != null) {
-                    alarmIdBuilder_.dispose();
+                if (alarmIdBuilder_ == null) {
+                    alarmId_ = null;
+                    onChanged();
+                } else {
+                    alarmId_ = null;
                     alarmIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -18803,7 +19630,6 @@ public final class Monitoring {
              * .monitoring.AlarmID alarm_id = 1;
              */
             public monitoring.Monitoring.AlarmID.Builder getAlarmIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getAlarmIdFieldBuilder().getBuilder();
             }
@@ -18873,7 +19699,6 @@ public final class Monitoring {
                     throw new NullPointerException();
                 }
                 text_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -18884,7 +19709,6 @@ public final class Monitoring {
              */
             public Builder clearText() {
                 text_ = getDefaultInstance().getText();
-                bitField0_ = (bitField0_ & ~0x00000002);
                 onChanged();
                 return this;
             }
@@ -18900,7 +19724,6 @@ public final class Monitoring {
                 }
                 checkByteStringIsUtf8(value);
                 text_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -18914,7 +19737,7 @@ public final class Monitoring {
              * @return Whether the kpiList field is set.
              */
             public boolean hasKpiList() {
-                return ((bitField0_ & 0x00000004) != 0);
+                return kpiListBuilder_ != null || kpiList_ != null;
             }
 
             /**
@@ -18938,11 +19761,10 @@ public final class Monitoring {
                         throw new NullPointerException();
                     }
                     kpiList_ = value;
+                    onChanged();
                 } else {
                     kpiListBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -18952,11 +19774,10 @@ public final class Monitoring {
             public Builder setKpiList(monitoring.Monitoring.KpiList.Builder builderForValue) {
                 if (kpiListBuilder_ == null) {
                     kpiList_ = builderForValue.build();
+                    onChanged();
                 } else {
                     kpiListBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -18965,16 +19786,15 @@ public final class Monitoring {
              */
             public Builder mergeKpiList(monitoring.Monitoring.KpiList value) {
                 if (kpiListBuilder_ == null) {
-                    if (((bitField0_ & 0x00000004) != 0) && kpiList_ != null && kpiList_ != monitoring.Monitoring.KpiList.getDefaultInstance()) {
-                        getKpiListBuilder().mergeFrom(value);
+                    if (kpiList_ != null) {
+                        kpiList_ = monitoring.Monitoring.KpiList.newBuilder(kpiList_).mergeFrom(value).buildPartial();
                     } else {
                         kpiList_ = value;
                     }
+                    onChanged();
                 } else {
                     kpiListBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000004;
-                onChanged();
                 return this;
             }
 
@@ -18982,13 +19802,13 @@ public final class Monitoring {
              * .monitoring.KpiList kpi_list = 3;
              */
             public Builder clearKpiList() {
-                bitField0_ = (bitField0_ & ~0x00000004);
-                kpiList_ = null;
-                if (kpiListBuilder_ != null) {
-                    kpiListBuilder_.dispose();
+                if (kpiListBuilder_ == null) {
+                    kpiList_ = null;
+                    onChanged();
+                } else {
+                    kpiList_ = null;
                     kpiListBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -18996,7 +19816,6 @@ public final class Monitoring {
              * .monitoring.KpiList kpi_list = 3;
              */
             public monitoring.Monitoring.KpiList.Builder getKpiListBuilder() {
-                bitField0_ |= 0x00000004;
                 onChanged();
                 return getKpiListFieldBuilder().getBuilder();
             }
@@ -19050,17 +19869,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public AlarmResponse parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new AlarmResponse(input, extensionRegistry);
             }
         };
 
@@ -19131,6 +19940,57 @@ public final class Monitoring {
             return new AlarmList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private AlarmList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    alarmDescriptor_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                alarmDescriptor_.add(input.readMessage(monitoring.Monitoring.AlarmDescriptor.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    alarmDescriptor_ = java.util.Collections.unmodifiableList(alarmDescriptor_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return monitoring.Monitoring.internal_static_monitoring_AlarmList_descriptor;
         }
@@ -19142,7 +20002,6 @@ public final class Monitoring {
 
         public static final int ALARM_DESCRIPTOR_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List alarmDescriptor_;
 
         /**
@@ -19203,7 +20062,7 @@ public final class Monitoring {
             for (int i = 0; i < alarmDescriptor_.size(); i++) {
                 output.writeMessage(1, alarmDescriptor_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -19215,7 +20074,7 @@ public final class Monitoring {
             for (int i = 0; i < alarmDescriptor_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, alarmDescriptor_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -19231,7 +20090,7 @@ public final class Monitoring {
             monitoring.Monitoring.AlarmList other = (monitoring.Monitoring.AlarmList) obj;
             if (!getAlarmDescriptorList().equals(other.getAlarmDescriptorList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -19247,7 +20106,7 @@ public final class Monitoring {
                 hash = (37 * hash) + ALARM_DESCRIPTOR_FIELD_NUMBER;
                 hash = (53 * hash) + getAlarmDescriptorList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -19341,23 +20200,29 @@ public final class Monitoring {
 
             // Construct using monitoring.Monitoring.AlarmList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getAlarmDescriptorFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (alarmDescriptorBuilder_ == null) {
                     alarmDescriptor_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    alarmDescriptor_ = null;
                     alarmDescriptorBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -19383,15 +20248,7 @@ public final class Monitoring {
             @java.lang.Override
             public monitoring.Monitoring.AlarmList buildPartial() {
                 monitoring.Monitoring.AlarmList result = new monitoring.Monitoring.AlarmList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(monitoring.Monitoring.AlarmList result) {
+                int from_bitField0_ = bitField0_;
                 if (alarmDescriptorBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         alarmDescriptor_ = java.util.Collections.unmodifiableList(alarmDescriptor_);
@@ -19401,10 +20258,38 @@ public final class Monitoring {
                 } else {
                     result.alarmDescriptor_ = alarmDescriptorBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(monitoring.Monitoring.AlarmList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -19444,7 +20329,7 @@ public final class Monitoring {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -19456,47 +20341,17 @@ public final class Monitoring {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                monitoring.Monitoring.AlarmList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    monitoring.Monitoring.AlarmDescriptor m = input.readMessage(monitoring.Monitoring.AlarmDescriptor.parser(), extensionRegistry);
-                                    if (alarmDescriptorBuilder_ == null) {
-                                        ensureAlarmDescriptorIsMutable();
-                                        alarmDescriptor_.add(m);
-                                    } else {
-                                        alarmDescriptorBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (monitoring.Monitoring.AlarmList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -19766,17 +20621,7 @@ public final class Monitoring {
 
             @java.lang.Override
             public AlarmList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new AlarmList(input, extensionRegistry);
             }
         };
 
diff --git a/src/ztp/target/generated-sources/grpc/monitoring/MonitoringServiceGrpc.java b/src/ztp/target/generated-sources/grpc/monitoring/MonitoringServiceGrpc.java
index 7a275e577..83dffd625 100644
--- a/src/ztp/target/generated-sources/grpc/monitoring/MonitoringServiceGrpc.java
+++ b/src/ztp/target/generated-sources/grpc/monitoring/MonitoringServiceGrpc.java
@@ -4,8 +4,7 @@ import static io.grpc.MethodDescriptor.generateFullMethodName;
 
 /**
  */
-@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.55.1)", comments = "Source: monitoring.proto")
-@io.grpc.stub.annotations.GrpcGenerated
+@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.38.1)", comments = "Source: monitoring.proto")
 public final class MonitoringServiceGrpc {
 
     private MonitoringServiceGrpc() {
@@ -328,130 +327,123 @@ public final class MonitoringServiceGrpc {
 
     /**
      */
-    public interface AsyncService {
+    public static abstract class MonitoringServiceImplBase implements io.grpc.BindableService {
 
         /**
          */
-        default void setKpi(monitoring.Monitoring.KpiDescriptor request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setKpi(monitoring.Monitoring.KpiDescriptor request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetKpiMethod(), responseObserver);
         }
 
         /**
          */
-        default void deleteKpi(monitoring.Monitoring.KpiId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void deleteKpi(monitoring.Monitoring.KpiId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getDeleteKpiMethod(), responseObserver);
         }
 
         /**
          */
-        default void getKpiDescriptor(monitoring.Monitoring.KpiId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getKpiDescriptor(monitoring.Monitoring.KpiId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetKpiDescriptorMethod(), responseObserver);
         }
 
         /**
          */
-        default void getKpiDescriptorList(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getKpiDescriptorList(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetKpiDescriptorListMethod(), responseObserver);
         }
 
         /**
          */
-        default void includeKpi(monitoring.Monitoring.Kpi request, io.grpc.stub.StreamObserver responseObserver) {
+        public void includeKpi(monitoring.Monitoring.Kpi request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getIncludeKpiMethod(), responseObserver);
         }
 
         /**
          */
-        default void monitorKpi(monitoring.Monitoring.MonitorKpiRequest request, io.grpc.stub.StreamObserver responseObserver) {
+        public void monitorKpi(monitoring.Monitoring.MonitorKpiRequest request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getMonitorKpiMethod(), responseObserver);
         }
 
         /**
          */
-        default void queryKpiData(monitoring.Monitoring.KpiQuery request, io.grpc.stub.StreamObserver responseObserver) {
+        public void queryKpiData(monitoring.Monitoring.KpiQuery request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getQueryKpiDataMethod(), responseObserver);
         }
 
         /**
          */
-        default void setKpiSubscription(monitoring.Monitoring.SubsDescriptor request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setKpiSubscription(monitoring.Monitoring.SubsDescriptor request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetKpiSubscriptionMethod(), responseObserver);
         }
 
         /**
          */
-        default void getSubsDescriptor(monitoring.Monitoring.SubscriptionID request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getSubsDescriptor(monitoring.Monitoring.SubscriptionID request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetSubsDescriptorMethod(), responseObserver);
         }
 
         /**
          */
-        default void getSubscriptions(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getSubscriptions(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetSubscriptionsMethod(), responseObserver);
         }
 
         /**
          */
-        default void deleteSubscription(monitoring.Monitoring.SubscriptionID request, io.grpc.stub.StreamObserver responseObserver) {
+        public void deleteSubscription(monitoring.Monitoring.SubscriptionID request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getDeleteSubscriptionMethod(), responseObserver);
         }
 
         /**
          */
-        default void setKpiAlarm(monitoring.Monitoring.AlarmDescriptor request, io.grpc.stub.StreamObserver responseObserver) {
+        public void setKpiAlarm(monitoring.Monitoring.AlarmDescriptor request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetKpiAlarmMethod(), responseObserver);
         }
 
         /**
          */
-        default void getAlarms(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getAlarms(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetAlarmsMethod(), responseObserver);
         }
 
         /**
          */
-        default void getAlarmDescriptor(monitoring.Monitoring.AlarmID request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getAlarmDescriptor(monitoring.Monitoring.AlarmID request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetAlarmDescriptorMethod(), responseObserver);
         }
 
         /**
          */
-        default void getAlarmResponseStream(monitoring.Monitoring.AlarmSubscription request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getAlarmResponseStream(monitoring.Monitoring.AlarmSubscription request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetAlarmResponseStreamMethod(), responseObserver);
         }
 
         /**
          */
-        default void deleteAlarm(monitoring.Monitoring.AlarmID request, io.grpc.stub.StreamObserver responseObserver) {
+        public void deleteAlarm(monitoring.Monitoring.AlarmID request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getDeleteAlarmMethod(), responseObserver);
         }
 
         /**
          */
-        default void getStreamKpi(monitoring.Monitoring.KpiId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getStreamKpi(monitoring.Monitoring.KpiId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetStreamKpiMethod(), responseObserver);
         }
 
         /**
          */
-        default void getInstantKpi(monitoring.Monitoring.KpiId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void getInstantKpi(monitoring.Monitoring.KpiId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetInstantKpiMethod(), responseObserver);
         }
-    }
-
-    /**
-     * Base class for the server implementation of the service MonitoringService.
-     */
-    public static abstract class MonitoringServiceImplBase implements io.grpc.BindableService, AsyncService {
 
         @java.lang.Override
         public io.grpc.ServerServiceDefinition bindService() {
-            return MonitoringServiceGrpc.bindService(this);
+            return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getSetKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_KPI))).addMethod(getDeleteKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_DELETE_KPI))).addMethod(getGetKpiDescriptorMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_KPI_DESCRIPTOR))).addMethod(getGetKpiDescriptorListMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_KPI_DESCRIPTOR_LIST))).addMethod(getIncludeKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_INCLUDE_KPI))).addMethod(getMonitorKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_MONITOR_KPI))).addMethod(getQueryKpiDataMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_QUERY_KPI_DATA))).addMethod(getSetKpiSubscriptionMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_SET_KPI_SUBSCRIPTION))).addMethod(getGetSubsDescriptorMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_SUBS_DESCRIPTOR))).addMethod(getGetSubscriptionsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_SUBSCRIPTIONS))).addMethod(getDeleteSubscriptionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_DELETE_SUBSCRIPTION))).addMethod(getSetKpiAlarmMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_SET_KPI_ALARM))).addMethod(getGetAlarmsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_ALARMS))).addMethod(getGetAlarmDescriptorMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_ALARM_DESCRIPTOR))).addMethod(getGetAlarmResponseStreamMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_ALARM_RESPONSE_STREAM))).addMethod(getDeleteAlarmMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_DELETE_ALARM))).addMethod(getGetStreamKpiMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(this, METHODID_GET_STREAM_KPI))).addMethod(getGetInstantKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_GET_INSTANT_KPI))).build();
         }
     }
 
     /**
-     * A stub to allow clients to do asynchronous rpc calls to service MonitoringService.
      */
     public static class MonitoringServiceStub extends io.grpc.stub.AbstractAsyncStub {
 
@@ -574,7 +566,6 @@ public final class MonitoringServiceGrpc {
     }
 
     /**
-     * A stub to allow clients to do synchronous rpc calls to service MonitoringService.
      */
     public static class MonitoringServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub {
 
@@ -697,7 +688,6 @@ public final class MonitoringServiceGrpc {
     }
 
     /**
-     * A stub to allow clients to do ListenableFuture-style rpc calls to service MonitoringService.
      */
     public static class MonitoringServiceFutureStub extends io.grpc.stub.AbstractFutureStub {
 
@@ -839,11 +829,11 @@ public final class MonitoringServiceGrpc {
 
     private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, io.grpc.stub.ServerCalls.ServerStreamingMethod, io.grpc.stub.ServerCalls.ClientStreamingMethod, io.grpc.stub.ServerCalls.BidiStreamingMethod {
 
-        private final AsyncService serviceImpl;
+        private final MonitoringServiceImplBase serviceImpl;
 
         private final int methodId;
 
-        MethodHandlers(AsyncService serviceImpl, int methodId) {
+        MethodHandlers(MonitoringServiceImplBase serviceImpl, int methodId) {
             this.serviceImpl = serviceImpl;
             this.methodId = methodId;
         }
@@ -921,10 +911,6 @@ public final class MonitoringServiceGrpc {
         }
     }
 
-    public static io.grpc.ServerServiceDefinition bindService(AsyncService service) {
-        return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getSetKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_KPI))).addMethod(getDeleteKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_DELETE_KPI))).addMethod(getGetKpiDescriptorMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_KPI_DESCRIPTOR))).addMethod(getGetKpiDescriptorListMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_KPI_DESCRIPTOR_LIST))).addMethod(getIncludeKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_INCLUDE_KPI))).addMethod(getMonitorKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_MONITOR_KPI))).addMethod(getQueryKpiDataMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_QUERY_KPI_DATA))).addMethod(getSetKpiSubscriptionMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_SET_KPI_SUBSCRIPTION))).addMethod(getGetSubsDescriptorMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_SUBS_DESCRIPTOR))).addMethod(getGetSubscriptionsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_SUBSCRIPTIONS))).addMethod(getDeleteSubscriptionMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_DELETE_SUBSCRIPTION))).addMethod(getSetKpiAlarmMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_SET_KPI_ALARM))).addMethod(getGetAlarmsMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_ALARMS))).addMethod(getGetAlarmDescriptorMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_ALARM_DESCRIPTOR))).addMethod(getGetAlarmResponseStreamMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_ALARM_RESPONSE_STREAM))).addMethod(getDeleteAlarmMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_DELETE_ALARM))).addMethod(getGetStreamKpiMethod(), io.grpc.stub.ServerCalls.asyncServerStreamingCall(new MethodHandlers(service, METHODID_GET_STREAM_KPI))).addMethod(getGetInstantKpiMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_GET_INSTANT_KPI))).build();
-    }
-
     private static abstract class MonitoringServiceBaseDescriptorSupplier implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
 
         MonitoringServiceBaseDescriptorSupplier() {
diff --git a/src/ztp/target/generated-sources/grpc/ztp/Ztp.java b/src/ztp/target/generated-sources/grpc/ztp/Ztp.java
index 0812fc8eb..bef889c0d 100644
--- a/src/ztp/target/generated-sources/grpc/ztp/Ztp.java
+++ b/src/ztp/target/generated-sources/grpc/ztp/Ztp.java
@@ -322,6 +322,70 @@ public final class Ztp {
             return new DeviceRoleId();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceRoleId(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                context.ContextOuterClass.Uuid.Builder subBuilder = null;
+                                if (devRoleId_ != null) {
+                                    subBuilder = devRoleId_.toBuilder();
+                                }
+                                devRoleId_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(devRoleId_);
+                                    devRoleId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.DeviceId.Builder subBuilder = null;
+                                if (devId_ != null) {
+                                    subBuilder = devId_.toBuilder();
+                                }
+                                devId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(devId_);
+                                    devId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return ztp.Ztp.internal_static_ztp_DeviceRoleId_descriptor;
         }
@@ -358,7 +422,7 @@ public final class Ztp {
          */
         @java.lang.Override
         public context.ContextOuterClass.UuidOrBuilder getDevRoleIdOrBuilder() {
-            return devRoleId_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : devRoleId_;
+            return getDevRoleId();
         }
 
         public static final int DEVID_FIELD_NUMBER = 2;
@@ -388,7 +452,7 @@ public final class Ztp {
          */
         @java.lang.Override
         public context.ContextOuterClass.DeviceIdOrBuilder getDevIdOrBuilder() {
-            return devId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : devId_;
+            return getDevId();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -412,7 +476,7 @@ public final class Ztp {
             if (devId_ != null) {
                 output.writeMessage(2, getDevId());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -427,7 +491,7 @@ public final class Ztp {
             if (devId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getDevId());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -453,7 +517,7 @@ public final class Ztp {
                 if (!getDevId().equals(other.getDevId()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -473,7 +537,7 @@ public final class Ztp {
                 hash = (37 * hash) + DEVID_FIELD_NUMBER;
                 hash = (53 * hash) + getDevId().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -567,24 +631,32 @@ public final class Ztp {
 
             // Construct using ztp.Ztp.DeviceRoleId.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                devRoleId_ = null;
-                if (devRoleIdBuilder_ != null) {
-                    devRoleIdBuilder_.dispose();
+                if (devRoleIdBuilder_ == null) {
+                    devRoleId_ = null;
+                } else {
+                    devRoleId_ = null;
                     devRoleIdBuilder_ = null;
                 }
-                devId_ = null;
-                if (devIdBuilder_ != null) {
-                    devIdBuilder_.dispose();
+                if (devIdBuilder_ == null) {
+                    devId_ = null;
+                } else {
+                    devId_ = null;
                     devIdBuilder_ = null;
                 }
                 return this;
@@ -612,21 +684,48 @@ public final class Ztp {
             @java.lang.Override
             public ztp.Ztp.DeviceRoleId buildPartial() {
                 ztp.Ztp.DeviceRoleId result = new ztp.Ztp.DeviceRoleId(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (devRoleIdBuilder_ == null) {
+                    result.devRoleId_ = devRoleId_;
+                } else {
+                    result.devRoleId_ = devRoleIdBuilder_.build();
+                }
+                if (devIdBuilder_ == null) {
+                    result.devId_ = devId_;
+                } else {
+                    result.devId_ = devIdBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(ztp.Ztp.DeviceRoleId result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.devRoleId_ = devRoleIdBuilder_ == null ? devRoleId_ : devRoleIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.devId_ = devIdBuilder_ == null ? devId_ : devIdBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -648,7 +747,7 @@ public final class Ztp {
                 if (other.hasDevId()) {
                     mergeDevId(other.getDevId());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -660,54 +759,20 @@ public final class Ztp {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                ztp.Ztp.DeviceRoleId parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getDevRoleIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getDevIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (ztp.Ztp.DeviceRoleId) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private context.ContextOuterClass.Uuid devRoleId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 devRoleIdBuilder_;
@@ -717,7 +782,7 @@ public final class Ztp {
              * @return Whether the devRoleId field is set.
              */
             public boolean hasDevRoleId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return devRoleIdBuilder_ != null || devRoleId_ != null;
             }
 
             /**
@@ -741,11 +806,10 @@ public final class Ztp {
                         throw new NullPointerException();
                     }
                     devRoleId_ = value;
+                    onChanged();
                 } else {
                     devRoleIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -755,11 +819,10 @@ public final class Ztp {
             public Builder setDevRoleId(context.ContextOuterClass.Uuid.Builder builderForValue) {
                 if (devRoleIdBuilder_ == null) {
                     devRoleId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     devRoleIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -768,16 +831,15 @@ public final class Ztp {
              */
             public Builder mergeDevRoleId(context.ContextOuterClass.Uuid value) {
                 if (devRoleIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && devRoleId_ != null && devRoleId_ != context.ContextOuterClass.Uuid.getDefaultInstance()) {
-                        getDevRoleIdBuilder().mergeFrom(value);
+                    if (devRoleId_ != null) {
+                        devRoleId_ = context.ContextOuterClass.Uuid.newBuilder(devRoleId_).mergeFrom(value).buildPartial();
                     } else {
                         devRoleId_ = value;
                     }
+                    onChanged();
                 } else {
                     devRoleIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -785,13 +847,13 @@ public final class Ztp {
              * .context.Uuid devRoleId = 1;
              */
             public Builder clearDevRoleId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                devRoleId_ = null;
-                if (devRoleIdBuilder_ != null) {
-                    devRoleIdBuilder_.dispose();
+                if (devRoleIdBuilder_ == null) {
+                    devRoleId_ = null;
+                    onChanged();
+                } else {
+                    devRoleId_ = null;
                     devRoleIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -799,7 +861,6 @@ public final class Ztp {
              * .context.Uuid devRoleId = 1;
              */
             public context.ContextOuterClass.Uuid.Builder getDevRoleIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getDevRoleIdFieldBuilder().getBuilder();
             }
@@ -835,7 +896,7 @@ public final class Ztp {
              * @return Whether the devId field is set.
              */
             public boolean hasDevId() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return devIdBuilder_ != null || devId_ != null;
             }
 
             /**
@@ -859,11 +920,10 @@ public final class Ztp {
                         throw new NullPointerException();
                     }
                     devId_ = value;
+                    onChanged();
                 } else {
                     devIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -873,11 +933,10 @@ public final class Ztp {
             public Builder setDevId(context.ContextOuterClass.DeviceId.Builder builderForValue) {
                 if (devIdBuilder_ == null) {
                     devId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     devIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -886,16 +945,15 @@ public final class Ztp {
              */
             public Builder mergeDevId(context.ContextOuterClass.DeviceId value) {
                 if (devIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && devId_ != null && devId_ != context.ContextOuterClass.DeviceId.getDefaultInstance()) {
-                        getDevIdBuilder().mergeFrom(value);
+                    if (devId_ != null) {
+                        devId_ = context.ContextOuterClass.DeviceId.newBuilder(devId_).mergeFrom(value).buildPartial();
                     } else {
                         devId_ = value;
                     }
+                    onChanged();
                 } else {
                     devIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -903,13 +961,13 @@ public final class Ztp {
              * .context.DeviceId devId = 2;
              */
             public Builder clearDevId() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                devId_ = null;
-                if (devIdBuilder_ != null) {
-                    devIdBuilder_.dispose();
+                if (devIdBuilder_ == null) {
+                    devId_ = null;
+                    onChanged();
+                } else {
+                    devId_ = null;
                     devIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -917,7 +975,6 @@ public final class Ztp {
              * .context.DeviceId devId = 2;
              */
             public context.ContextOuterClass.DeviceId.Builder getDevIdBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getDevIdFieldBuilder().getBuilder();
             }
@@ -971,17 +1028,7 @@ public final class Ztp {
 
             @java.lang.Override
             public DeviceRoleId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceRoleId(input, extensionRegistry);
             }
         };
 
@@ -1056,6 +1103,63 @@ public final class Ztp {
             return new DeviceRole();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceRole(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                ztp.Ztp.DeviceRoleId.Builder subBuilder = null;
+                                if (devRoleId_ != null) {
+                                    subBuilder = devRoleId_.toBuilder();
+                                }
+                                devRoleId_ = input.readMessage(ztp.Ztp.DeviceRoleId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(devRoleId_);
+                                    devRoleId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 16:
+                            {
+                                int rawValue = input.readEnum();
+                                devRoleType_ = rawValue;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return ztp.Ztp.internal_static_ztp_DeviceRole_descriptor;
         }
@@ -1092,12 +1196,12 @@ public final class Ztp {
          */
         @java.lang.Override
         public ztp.Ztp.DeviceRoleIdOrBuilder getDevRoleIdOrBuilder() {
-            return devRoleId_ == null ? ztp.Ztp.DeviceRoleId.getDefaultInstance() : devRoleId_;
+            return getDevRoleId();
         }
 
         public static final int DEVROLETYPE_FIELD_NUMBER = 2;
 
-        private int devRoleType_ = 0;
+        private int devRoleType_;
 
         /**
          * .ztp.DeviceRoleType devRoleType = 2;
@@ -1114,7 +1218,8 @@ public final class Ztp {
          */
         @java.lang.Override
         public ztp.Ztp.DeviceRoleType getDevRoleType() {
-            ztp.Ztp.DeviceRoleType result = ztp.Ztp.DeviceRoleType.forNumber(devRoleType_);
+            @SuppressWarnings("deprecation")
+            ztp.Ztp.DeviceRoleType result = ztp.Ztp.DeviceRoleType.valueOf(devRoleType_);
             return result == null ? ztp.Ztp.DeviceRoleType.UNRECOGNIZED : result;
         }
 
@@ -1139,7 +1244,7 @@ public final class Ztp {
             if (devRoleType_ != ztp.Ztp.DeviceRoleType.NONE.getNumber()) {
                 output.writeEnum(2, devRoleType_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -1154,7 +1259,7 @@ public final class Ztp {
             if (devRoleType_ != ztp.Ztp.DeviceRoleType.NONE.getNumber()) {
                 size += com.google.protobuf.CodedOutputStream.computeEnumSize(2, devRoleType_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -1176,7 +1281,7 @@ public final class Ztp {
             }
             if (devRoleType_ != other.devRoleType_)
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -1194,7 +1299,7 @@ public final class Ztp {
             }
             hash = (37 * hash) + DEVROLETYPE_FIELD_NUMBER;
             hash = (53 * hash) + devRoleType_;
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -1288,19 +1393,26 @@ public final class Ztp {
 
             // Construct using ztp.Ztp.DeviceRole.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                devRoleId_ = null;
-                if (devRoleIdBuilder_ != null) {
-                    devRoleIdBuilder_.dispose();
+                if (devRoleIdBuilder_ == null) {
+                    devRoleId_ = null;
+                } else {
+                    devRoleId_ = null;
                     devRoleIdBuilder_ = null;
                 }
                 devRoleType_ = 0;
@@ -1329,21 +1441,44 @@ public final class Ztp {
             @java.lang.Override
             public ztp.Ztp.DeviceRole buildPartial() {
                 ztp.Ztp.DeviceRole result = new ztp.Ztp.DeviceRole(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (devRoleIdBuilder_ == null) {
+                    result.devRoleId_ = devRoleId_;
+                } else {
+                    result.devRoleId_ = devRoleIdBuilder_.build();
                 }
+                result.devRoleType_ = devRoleType_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(ztp.Ztp.DeviceRole result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.devRoleId_ = devRoleIdBuilder_ == null ? devRoleId_ : devRoleIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.devRoleType_ = devRoleType_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -1365,7 +1500,7 @@ public final class Ztp {
                 if (other.devRoleType_ != 0) {
                     setDevRoleTypeValue(other.getDevRoleTypeValue());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -1377,54 +1512,20 @@ public final class Ztp {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                ztp.Ztp.DeviceRole parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getDevRoleIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 16:
-                                {
-                                    devRoleType_ = input.readEnum();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (ztp.Ztp.DeviceRole) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private ztp.Ztp.DeviceRoleId devRoleId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 devRoleIdBuilder_;
@@ -1434,7 +1535,7 @@ public final class Ztp {
              * @return Whether the devRoleId field is set.
              */
             public boolean hasDevRoleId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return devRoleIdBuilder_ != null || devRoleId_ != null;
             }
 
             /**
@@ -1458,11 +1559,10 @@ public final class Ztp {
                         throw new NullPointerException();
                     }
                     devRoleId_ = value;
+                    onChanged();
                 } else {
                     devRoleIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -1472,11 +1572,10 @@ public final class Ztp {
             public Builder setDevRoleId(ztp.Ztp.DeviceRoleId.Builder builderForValue) {
                 if (devRoleIdBuilder_ == null) {
                     devRoleId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     devRoleIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -1485,16 +1584,15 @@ public final class Ztp {
              */
             public Builder mergeDevRoleId(ztp.Ztp.DeviceRoleId value) {
                 if (devRoleIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && devRoleId_ != null && devRoleId_ != ztp.Ztp.DeviceRoleId.getDefaultInstance()) {
-                        getDevRoleIdBuilder().mergeFrom(value);
+                    if (devRoleId_ != null) {
+                        devRoleId_ = ztp.Ztp.DeviceRoleId.newBuilder(devRoleId_).mergeFrom(value).buildPartial();
                     } else {
                         devRoleId_ = value;
                     }
+                    onChanged();
                 } else {
                     devRoleIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -1502,13 +1600,13 @@ public final class Ztp {
              * .ztp.DeviceRoleId devRoleId = 1;
              */
             public Builder clearDevRoleId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                devRoleId_ = null;
-                if (devRoleIdBuilder_ != null) {
-                    devRoleIdBuilder_.dispose();
+                if (devRoleIdBuilder_ == null) {
+                    devRoleId_ = null;
+                    onChanged();
+                } else {
+                    devRoleId_ = null;
                     devRoleIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -1516,7 +1614,6 @@ public final class Ztp {
              * .ztp.DeviceRoleId devRoleId = 1;
              */
             public ztp.Ztp.DeviceRoleId.Builder getDevRoleIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getDevRoleIdFieldBuilder().getBuilder();
             }
@@ -1561,7 +1658,6 @@ public final class Ztp {
              */
             public Builder setDevRoleTypeValue(int value) {
                 devRoleType_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -1572,7 +1668,8 @@ public final class Ztp {
              */
             @java.lang.Override
             public ztp.Ztp.DeviceRoleType getDevRoleType() {
-                ztp.Ztp.DeviceRoleType result = ztp.Ztp.DeviceRoleType.forNumber(devRoleType_);
+                @SuppressWarnings("deprecation")
+                ztp.Ztp.DeviceRoleType result = ztp.Ztp.DeviceRoleType.valueOf(devRoleType_);
                 return result == null ? ztp.Ztp.DeviceRoleType.UNRECOGNIZED : result;
             }
 
@@ -1585,7 +1682,6 @@ public final class Ztp {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000002;
                 devRoleType_ = value.getNumber();
                 onChanged();
                 return this;
@@ -1596,7 +1692,6 @@ public final class Ztp {
              * @return This builder for chaining.
              */
             public Builder clearDevRoleType() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 devRoleType_ = 0;
                 onChanged();
                 return this;
@@ -1629,17 +1724,7 @@ public final class Ztp {
 
             @java.lang.Override
             public DeviceRole parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceRole(input, extensionRegistry);
             }
         };
 
@@ -1718,6 +1803,70 @@ public final class Ztp {
             return new DeviceRoleConfig();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceRoleConfig(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                ztp.Ztp.DeviceRole.Builder subBuilder = null;
+                                if (devRole_ != null) {
+                                    subBuilder = devRole_.toBuilder();
+                                }
+                                devRole_ = input.readMessage(ztp.Ztp.DeviceRole.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(devRole_);
+                                    devRole_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 18:
+                            {
+                                context.ContextOuterClass.DeviceConfig.Builder subBuilder = null;
+                                if (devConfig_ != null) {
+                                    subBuilder = devConfig_.toBuilder();
+                                }
+                                devConfig_ = input.readMessage(context.ContextOuterClass.DeviceConfig.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(devConfig_);
+                                    devConfig_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return ztp.Ztp.internal_static_ztp_DeviceRoleConfig_descriptor;
         }
@@ -1754,7 +1903,7 @@ public final class Ztp {
          */
         @java.lang.Override
         public ztp.Ztp.DeviceRoleOrBuilder getDevRoleOrBuilder() {
-            return devRole_ == null ? ztp.Ztp.DeviceRole.getDefaultInstance() : devRole_;
+            return getDevRole();
         }
 
         public static final int DEVCONFIG_FIELD_NUMBER = 2;
@@ -1784,7 +1933,7 @@ public final class Ztp {
          */
         @java.lang.Override
         public context.ContextOuterClass.DeviceConfigOrBuilder getDevConfigOrBuilder() {
-            return devConfig_ == null ? context.ContextOuterClass.DeviceConfig.getDefaultInstance() : devConfig_;
+            return getDevConfig();
         }
 
         private byte memoizedIsInitialized = -1;
@@ -1808,7 +1957,7 @@ public final class Ztp {
             if (devConfig_ != null) {
                 output.writeMessage(2, getDevConfig());
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -1823,7 +1972,7 @@ public final class Ztp {
             if (devConfig_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getDevConfig());
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -1849,7 +1998,7 @@ public final class Ztp {
                 if (!getDevConfig().equals(other.getDevConfig()))
                     return false;
             }
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -1869,7 +2018,7 @@ public final class Ztp {
                 hash = (37 * hash) + DEVCONFIG_FIELD_NUMBER;
                 hash = (53 * hash) + getDevConfig().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -1963,24 +2112,32 @@ public final class Ztp {
 
             // Construct using ztp.Ztp.DeviceRoleConfig.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                devRole_ = null;
-                if (devRoleBuilder_ != null) {
-                    devRoleBuilder_.dispose();
+                if (devRoleBuilder_ == null) {
+                    devRole_ = null;
+                } else {
+                    devRole_ = null;
                     devRoleBuilder_ = null;
                 }
-                devConfig_ = null;
-                if (devConfigBuilder_ != null) {
-                    devConfigBuilder_.dispose();
+                if (devConfigBuilder_ == null) {
+                    devConfig_ = null;
+                } else {
+                    devConfig_ = null;
                     devConfigBuilder_ = null;
                 }
                 return this;
@@ -2008,21 +2165,48 @@ public final class Ztp {
             @java.lang.Override
             public ztp.Ztp.DeviceRoleConfig buildPartial() {
                 ztp.Ztp.DeviceRoleConfig result = new ztp.Ztp.DeviceRoleConfig(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (devRoleBuilder_ == null) {
+                    result.devRole_ = devRole_;
+                } else {
+                    result.devRole_ = devRoleBuilder_.build();
+                }
+                if (devConfigBuilder_ == null) {
+                    result.devConfig_ = devConfig_;
+                } else {
+                    result.devConfig_ = devConfigBuilder_.build();
                 }
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(ztp.Ztp.DeviceRoleConfig result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.devRole_ = devRoleBuilder_ == null ? devRole_ : devRoleBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.devConfig_ = devConfigBuilder_ == null ? devConfig_ : devConfigBuilder_.build();
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -2044,7 +2228,7 @@ public final class Ztp {
                 if (other.hasDevConfig()) {
                     mergeDevConfig(other.getDevConfig());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -2056,54 +2240,20 @@ public final class Ztp {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                ztp.Ztp.DeviceRoleConfig parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getDevRoleFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 18:
-                                {
-                                    input.readMessage(getDevConfigFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 18
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (ztp.Ztp.DeviceRoleConfig) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private ztp.Ztp.DeviceRole devRole_;
 
             private com.google.protobuf.SingleFieldBuilderV3 devRoleBuilder_;
@@ -2113,7 +2263,7 @@ public final class Ztp {
              * @return Whether the devRole field is set.
              */
             public boolean hasDevRole() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return devRoleBuilder_ != null || devRole_ != null;
             }
 
             /**
@@ -2137,11 +2287,10 @@ public final class Ztp {
                         throw new NullPointerException();
                     }
                     devRole_ = value;
+                    onChanged();
                 } else {
                     devRoleBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -2151,11 +2300,10 @@ public final class Ztp {
             public Builder setDevRole(ztp.Ztp.DeviceRole.Builder builderForValue) {
                 if (devRoleBuilder_ == null) {
                     devRole_ = builderForValue.build();
+                    onChanged();
                 } else {
                     devRoleBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -2164,16 +2312,15 @@ public final class Ztp {
              */
             public Builder mergeDevRole(ztp.Ztp.DeviceRole value) {
                 if (devRoleBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && devRole_ != null && devRole_ != ztp.Ztp.DeviceRole.getDefaultInstance()) {
-                        getDevRoleBuilder().mergeFrom(value);
+                    if (devRole_ != null) {
+                        devRole_ = ztp.Ztp.DeviceRole.newBuilder(devRole_).mergeFrom(value).buildPartial();
                     } else {
                         devRole_ = value;
                     }
+                    onChanged();
                 } else {
                     devRoleBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -2181,13 +2328,13 @@ public final class Ztp {
              * .ztp.DeviceRole devRole = 1;
              */
             public Builder clearDevRole() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                devRole_ = null;
-                if (devRoleBuilder_ != null) {
-                    devRoleBuilder_.dispose();
+                if (devRoleBuilder_ == null) {
+                    devRole_ = null;
+                    onChanged();
+                } else {
+                    devRole_ = null;
                     devRoleBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -2195,7 +2342,6 @@ public final class Ztp {
              * .ztp.DeviceRole devRole = 1;
              */
             public ztp.Ztp.DeviceRole.Builder getDevRoleBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getDevRoleFieldBuilder().getBuilder();
             }
@@ -2231,7 +2377,7 @@ public final class Ztp {
              * @return Whether the devConfig field is set.
              */
             public boolean hasDevConfig() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return devConfigBuilder_ != null || devConfig_ != null;
             }
 
             /**
@@ -2255,11 +2401,10 @@ public final class Ztp {
                         throw new NullPointerException();
                     }
                     devConfig_ = value;
+                    onChanged();
                 } else {
                     devConfigBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -2269,11 +2414,10 @@ public final class Ztp {
             public Builder setDevConfig(context.ContextOuterClass.DeviceConfig.Builder builderForValue) {
                 if (devConfigBuilder_ == null) {
                     devConfig_ = builderForValue.build();
+                    onChanged();
                 } else {
                     devConfigBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -2282,16 +2426,15 @@ public final class Ztp {
              */
             public Builder mergeDevConfig(context.ContextOuterClass.DeviceConfig value) {
                 if (devConfigBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && devConfig_ != null && devConfig_ != context.ContextOuterClass.DeviceConfig.getDefaultInstance()) {
-                        getDevConfigBuilder().mergeFrom(value);
+                    if (devConfig_ != null) {
+                        devConfig_ = context.ContextOuterClass.DeviceConfig.newBuilder(devConfig_).mergeFrom(value).buildPartial();
                     } else {
                         devConfig_ = value;
                     }
+                    onChanged();
                 } else {
                     devConfigBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
-                onChanged();
                 return this;
             }
 
@@ -2299,13 +2442,13 @@ public final class Ztp {
              * .context.DeviceConfig devConfig = 2;
              */
             public Builder clearDevConfig() {
-                bitField0_ = (bitField0_ & ~0x00000002);
-                devConfig_ = null;
-                if (devConfigBuilder_ != null) {
-                    devConfigBuilder_.dispose();
+                if (devConfigBuilder_ == null) {
+                    devConfig_ = null;
+                    onChanged();
+                } else {
+                    devConfig_ = null;
                     devConfigBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -2313,7 +2456,6 @@ public final class Ztp {
              * .context.DeviceConfig devConfig = 2;
              */
             public context.ContextOuterClass.DeviceConfig.Builder getDevConfigBuilder() {
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return getDevConfigFieldBuilder().getBuilder();
             }
@@ -2367,17 +2509,7 @@ public final class Ztp {
 
             @java.lang.Override
             public DeviceRoleConfig parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceRoleConfig(input, extensionRegistry);
             }
         };
 
@@ -2448,6 +2580,57 @@ public final class Ztp {
             return new DeviceRoleList();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceRoleList(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    devRole_ = new java.util.ArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                devRole_.add(input.readMessage(ztp.Ztp.DeviceRole.parser(), extensionRegistry));
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    devRole_ = java.util.Collections.unmodifiableList(devRole_);
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return ztp.Ztp.internal_static_ztp_DeviceRoleList_descriptor;
         }
@@ -2459,7 +2642,6 @@ public final class Ztp {
 
         public static final int DEVROLE_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
         private java.util.List devRole_;
 
         /**
@@ -2520,7 +2702,7 @@ public final class Ztp {
             for (int i = 0; i < devRole_.size(); i++) {
                 output.writeMessage(1, devRole_.get(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -2532,7 +2714,7 @@ public final class Ztp {
             for (int i = 0; i < devRole_.size(); i++) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, devRole_.get(i));
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -2548,7 +2730,7 @@ public final class Ztp {
             ztp.Ztp.DeviceRoleList other = (ztp.Ztp.DeviceRoleList) obj;
             if (!getDevRoleList().equals(other.getDevRoleList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -2564,7 +2746,7 @@ public final class Ztp {
                 hash = (37 * hash) + DEVROLE_FIELD_NUMBER;
                 hash = (53 * hash) + getDevRoleList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -2658,23 +2840,29 @@ public final class Ztp {
 
             // Construct using ztp.Ztp.DeviceRoleList.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                    getDevRoleFieldBuilder();
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
                 if (devRoleBuilder_ == null) {
                     devRole_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 } else {
-                    devRole_ = null;
                     devRoleBuilder_.clear();
                 }
-                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -2700,15 +2888,7 @@ public final class Ztp {
             @java.lang.Override
             public ztp.Ztp.DeviceRoleList buildPartial() {
                 ztp.Ztp.DeviceRoleList result = new ztp.Ztp.DeviceRoleList(this);
-                buildPartialRepeatedFields(result);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
-                }
-                onBuilt();
-                return result;
-            }
-
-            private void buildPartialRepeatedFields(ztp.Ztp.DeviceRoleList result) {
+                int from_bitField0_ = bitField0_;
                 if (devRoleBuilder_ == null) {
                     if (((bitField0_ & 0x00000001) != 0)) {
                         devRole_ = java.util.Collections.unmodifiableList(devRole_);
@@ -2718,10 +2898,38 @@ public final class Ztp {
                 } else {
                     result.devRole_ = devRoleBuilder_.build();
                 }
+                onBuilt();
+                return result;
             }
 
-            private void buildPartial0(ztp.Ztp.DeviceRoleList result) {
-                int from_bitField0_ = bitField0_;
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -2761,7 +2969,7 @@ public final class Ztp {
                         }
                     }
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -2773,47 +2981,17 @@ public final class Ztp {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                ztp.Ztp.DeviceRoleList parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    ztp.Ztp.DeviceRole m = input.readMessage(ztp.Ztp.DeviceRole.parser(), extensionRegistry);
-                                    if (devRoleBuilder_ == null) {
-                                        ensureDevRoleIsMutable();
-                                        devRole_.add(m);
-                                    } else {
-                                        devRoleBuilder_.addMessage(m);
-                                    }
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (ztp.Ztp.DeviceRoleList) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
@@ -3083,17 +3261,7 @@ public final class Ztp {
 
             @java.lang.Override
             public DeviceRoleList parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceRoleList(input, extensionRegistry);
             }
         };
 
@@ -3168,6 +3336,63 @@ public final class Ztp {
             return new DeviceRoleState();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceRoleState(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                ztp.Ztp.DeviceRoleId.Builder subBuilder = null;
+                                if (devRoleId_ != null) {
+                                    subBuilder = devRoleId_.toBuilder();
+                                }
+                                devRoleId_ = input.readMessage(ztp.Ztp.DeviceRoleId.parser(), extensionRegistry);
+                                if (subBuilder != null) {
+                                    subBuilder.mergeFrom(devRoleId_);
+                                    devRoleId_ = subBuilder.buildPartial();
+                                }
+                                break;
+                            }
+                        case 16:
+                            {
+                                int rawValue = input.readEnum();
+                                devRoleState_ = rawValue;
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return ztp.Ztp.internal_static_ztp_DeviceRoleState_descriptor;
         }
@@ -3204,12 +3429,12 @@ public final class Ztp {
          */
         @java.lang.Override
         public ztp.Ztp.DeviceRoleIdOrBuilder getDevRoleIdOrBuilder() {
-            return devRoleId_ == null ? ztp.Ztp.DeviceRoleId.getDefaultInstance() : devRoleId_;
+            return getDevRoleId();
         }
 
         public static final int DEVROLESTATE_FIELD_NUMBER = 2;
 
-        private int devRoleState_ = 0;
+        private int devRoleState_;
 
         /**
          * .ztp.ZtpDeviceState devRoleState = 2;
@@ -3226,7 +3451,8 @@ public final class Ztp {
          */
         @java.lang.Override
         public ztp.Ztp.ZtpDeviceState getDevRoleState() {
-            ztp.Ztp.ZtpDeviceState result = ztp.Ztp.ZtpDeviceState.forNumber(devRoleState_);
+            @SuppressWarnings("deprecation")
+            ztp.Ztp.ZtpDeviceState result = ztp.Ztp.ZtpDeviceState.valueOf(devRoleState_);
             return result == null ? ztp.Ztp.ZtpDeviceState.UNRECOGNIZED : result;
         }
 
@@ -3251,7 +3477,7 @@ public final class Ztp {
             if (devRoleState_ != ztp.Ztp.ZtpDeviceState.ZTP_DEV_STATE_UNDEFINED.getNumber()) {
                 output.writeEnum(2, devRoleState_);
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -3266,7 +3492,7 @@ public final class Ztp {
             if (devRoleState_ != ztp.Ztp.ZtpDeviceState.ZTP_DEV_STATE_UNDEFINED.getNumber()) {
                 size += com.google.protobuf.CodedOutputStream.computeEnumSize(2, devRoleState_);
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -3288,7 +3514,7 @@ public final class Ztp {
             }
             if (devRoleState_ != other.devRoleState_)
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -3306,7 +3532,7 @@ public final class Ztp {
             }
             hash = (37 * hash) + DEVROLESTATE_FIELD_NUMBER;
             hash = (53 * hash) + devRoleState_;
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -3400,19 +3626,26 @@ public final class Ztp {
 
             // Construct using ztp.Ztp.DeviceRoleState.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                devRoleId_ = null;
-                if (devRoleIdBuilder_ != null) {
-                    devRoleIdBuilder_.dispose();
+                if (devRoleIdBuilder_ == null) {
+                    devRoleId_ = null;
+                } else {
+                    devRoleId_ = null;
                     devRoleIdBuilder_ = null;
                 }
                 devRoleState_ = 0;
@@ -3441,21 +3674,44 @@ public final class Ztp {
             @java.lang.Override
             public ztp.Ztp.DeviceRoleState buildPartial() {
                 ztp.Ztp.DeviceRoleState result = new ztp.Ztp.DeviceRoleState(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                if (devRoleIdBuilder_ == null) {
+                    result.devRoleId_ = devRoleId_;
+                } else {
+                    result.devRoleId_ = devRoleIdBuilder_.build();
                 }
+                result.devRoleState_ = devRoleState_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(ztp.Ztp.DeviceRoleState result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    result.devRoleId_ = devRoleIdBuilder_ == null ? devRoleId_ : devRoleIdBuilder_.build();
-                }
-                if (((from_bitField0_ & 0x00000002) != 0)) {
-                    result.devRoleState_ = devRoleState_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -3477,7 +3733,7 @@ public final class Ztp {
                 if (other.devRoleState_ != 0) {
                     setDevRoleStateValue(other.getDevRoleStateValue());
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -3489,54 +3745,20 @@ public final class Ztp {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                ztp.Ztp.DeviceRoleState parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    input.readMessage(getDevRoleIdFieldBuilder().getBuilder(), extensionRegistry);
-                                    bitField0_ |= 0x00000001;
-                                    break;
-                                }
-                            // case 10
-                            case 16:
-                                {
-                                    devRoleState_ = input.readEnum();
-                                    bitField0_ |= 0x00000002;
-                                    break;
-                                }
-                            // case 16
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (ztp.Ztp.DeviceRoleState) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
-            private int bitField0_;
-
             private ztp.Ztp.DeviceRoleId devRoleId_;
 
             private com.google.protobuf.SingleFieldBuilderV3 devRoleIdBuilder_;
@@ -3546,7 +3768,7 @@ public final class Ztp {
              * @return Whether the devRoleId field is set.
              */
             public boolean hasDevRoleId() {
-                return ((bitField0_ & 0x00000001) != 0);
+                return devRoleIdBuilder_ != null || devRoleId_ != null;
             }
 
             /**
@@ -3570,11 +3792,10 @@ public final class Ztp {
                         throw new NullPointerException();
                     }
                     devRoleId_ = value;
+                    onChanged();
                 } else {
                     devRoleIdBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -3584,11 +3805,10 @@ public final class Ztp {
             public Builder setDevRoleId(ztp.Ztp.DeviceRoleId.Builder builderForValue) {
                 if (devRoleIdBuilder_ == null) {
                     devRoleId_ = builderForValue.build();
+                    onChanged();
                 } else {
                     devRoleIdBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -3597,16 +3817,15 @@ public final class Ztp {
              */
             public Builder mergeDevRoleId(ztp.Ztp.DeviceRoleId value) {
                 if (devRoleIdBuilder_ == null) {
-                    if (((bitField0_ & 0x00000001) != 0) && devRoleId_ != null && devRoleId_ != ztp.Ztp.DeviceRoleId.getDefaultInstance()) {
-                        getDevRoleIdBuilder().mergeFrom(value);
+                    if (devRoleId_ != null) {
+                        devRoleId_ = ztp.Ztp.DeviceRoleId.newBuilder(devRoleId_).mergeFrom(value).buildPartial();
                     } else {
                         devRoleId_ = value;
                     }
+                    onChanged();
                 } else {
                     devRoleIdBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000001;
-                onChanged();
                 return this;
             }
 
@@ -3614,13 +3833,13 @@ public final class Ztp {
              * .ztp.DeviceRoleId devRoleId = 1;
              */
             public Builder clearDevRoleId() {
-                bitField0_ = (bitField0_ & ~0x00000001);
-                devRoleId_ = null;
-                if (devRoleIdBuilder_ != null) {
-                    devRoleIdBuilder_.dispose();
+                if (devRoleIdBuilder_ == null) {
+                    devRoleId_ = null;
+                    onChanged();
+                } else {
+                    devRoleId_ = null;
                     devRoleIdBuilder_ = null;
                 }
-                onChanged();
                 return this;
             }
 
@@ -3628,7 +3847,6 @@ public final class Ztp {
              * .ztp.DeviceRoleId devRoleId = 1;
              */
             public ztp.Ztp.DeviceRoleId.Builder getDevRoleIdBuilder() {
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return getDevRoleIdFieldBuilder().getBuilder();
             }
@@ -3673,7 +3891,6 @@ public final class Ztp {
              */
             public Builder setDevRoleStateValue(int value) {
                 devRoleState_ = value;
-                bitField0_ |= 0x00000002;
                 onChanged();
                 return this;
             }
@@ -3684,7 +3901,8 @@ public final class Ztp {
              */
             @java.lang.Override
             public ztp.Ztp.ZtpDeviceState getDevRoleState() {
-                ztp.Ztp.ZtpDeviceState result = ztp.Ztp.ZtpDeviceState.forNumber(devRoleState_);
+                @SuppressWarnings("deprecation")
+                ztp.Ztp.ZtpDeviceState result = ztp.Ztp.ZtpDeviceState.valueOf(devRoleState_);
                 return result == null ? ztp.Ztp.ZtpDeviceState.UNRECOGNIZED : result;
             }
 
@@ -3697,7 +3915,6 @@ public final class Ztp {
                 if (value == null) {
                     throw new NullPointerException();
                 }
-                bitField0_ |= 0x00000002;
                 devRoleState_ = value.getNumber();
                 onChanged();
                 return this;
@@ -3708,7 +3925,6 @@ public final class Ztp {
              * @return This builder for chaining.
              */
             public Builder clearDevRoleState() {
-                bitField0_ = (bitField0_ & ~0x00000002);
                 devRoleState_ = 0;
                 onChanged();
                 return this;
@@ -3741,17 +3957,7 @@ public final class Ztp {
 
             @java.lang.Override
             public DeviceRoleState parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceRoleState(input, extensionRegistry);
             }
         };
 
@@ -3814,7 +4020,7 @@ public final class Ztp {
         }
 
         private DeviceDeletionResult() {
-            deleted_ = com.google.protobuf.LazyStringArrayList.emptyList();
+            deleted_ = com.google.protobuf.LazyStringArrayList.EMPTY;
         }
 
         @java.lang.Override
@@ -3823,6 +4029,58 @@ public final class Ztp {
             return new DeviceDeletionResult();
         }
 
+        @java.lang.Override
+        public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+            return this.unknownFields;
+        }
+
+        private DeviceDeletionResult(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            this();
+            if (extensionRegistry == null) {
+                throw new java.lang.NullPointerException();
+            }
+            int mutable_bitField0_ = 0;
+            com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder();
+            try {
+                boolean done = false;
+                while (!done) {
+                    int tag = input.readTag();
+                    switch(tag) {
+                        case 0:
+                            done = true;
+                            break;
+                        case 10:
+                            {
+                                java.lang.String s = input.readStringRequireUtf8();
+                                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                                    deleted_ = new com.google.protobuf.LazyStringArrayList();
+                                    mutable_bitField0_ |= 0x00000001;
+                                }
+                                deleted_.add(s);
+                                break;
+                            }
+                        default:
+                            {
+                                if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {
+                                    done = true;
+                                }
+                                break;
+                            }
+                    }
+                }
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                throw e.setUnfinishedMessage(this);
+            } catch (java.io.IOException e) {
+                throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+            } finally {
+                if (((mutable_bitField0_ & 0x00000001) != 0)) {
+                    deleted_ = deleted_.getUnmodifiableView();
+                }
+                this.unknownFields = unknownFields.build();
+                makeExtensionsImmutable();
+            }
+        }
+
         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
             return ztp.Ztp.internal_static_ztp_DeviceDeletionResult_descriptor;
         }
@@ -3834,8 +4092,7 @@ public final class Ztp {
 
         public static final int DELETED_FIELD_NUMBER = 1;
 
-        @SuppressWarnings("serial")
-        private com.google.protobuf.LazyStringArrayList deleted_ = com.google.protobuf.LazyStringArrayList.emptyList();
+        private com.google.protobuf.LazyStringList deleted_;
 
         /**
          * repeated string deleted = 1;
@@ -3889,7 +4146,7 @@ public final class Ztp {
             for (int i = 0; i < deleted_.size(); i++) {
                 com.google.protobuf.GeneratedMessageV3.writeString(output, 1, deleted_.getRaw(i));
             }
-            getUnknownFields().writeTo(output);
+            unknownFields.writeTo(output);
         }
 
         @java.lang.Override
@@ -3906,7 +4163,7 @@ public final class Ztp {
                 size += dataSize;
                 size += 1 * getDeletedList().size();
             }
-            size += getUnknownFields().getSerializedSize();
+            size += unknownFields.getSerializedSize();
             memoizedSize = size;
             return size;
         }
@@ -3922,7 +4179,7 @@ public final class Ztp {
             ztp.Ztp.DeviceDeletionResult other = (ztp.Ztp.DeviceDeletionResult) obj;
             if (!getDeletedList().equals(other.getDeletedList()))
                 return false;
-            if (!getUnknownFields().equals(other.getUnknownFields()))
+            if (!unknownFields.equals(other.unknownFields))
                 return false;
             return true;
         }
@@ -3938,7 +4195,7 @@ public final class Ztp {
                 hash = (37 * hash) + DELETED_FIELD_NUMBER;
                 hash = (53 * hash) + getDeletedList().hashCode();
             }
-            hash = (29 * hash) + getUnknownFields().hashCode();
+            hash = (29 * hash) + unknownFields.hashCode();
             memoizedHashCode = hash;
             return hash;
         }
@@ -4032,17 +4289,24 @@ public final class Ztp {
 
             // Construct using ztp.Ztp.DeviceDeletionResult.newBuilder()
             private Builder() {
+                maybeForceBuilderInitialization();
             }
 
             private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
                 super(parent);
+                maybeForceBuilderInitialization();
+            }
+
+            private void maybeForceBuilderInitialization() {
+                if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) {
+                }
             }
 
             @java.lang.Override
             public Builder clear() {
                 super.clear();
-                bitField0_ = 0;
-                deleted_ = com.google.protobuf.LazyStringArrayList.emptyList();
+                deleted_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+                bitField0_ = (bitField0_ & ~0x00000001);
                 return this;
             }
 
@@ -4068,19 +4332,44 @@ public final class Ztp {
             @java.lang.Override
             public ztp.Ztp.DeviceDeletionResult buildPartial() {
                 ztp.Ztp.DeviceDeletionResult result = new ztp.Ztp.DeviceDeletionResult(this);
-                if (bitField0_ != 0) {
-                    buildPartial0(result);
+                int from_bitField0_ = bitField0_;
+                if (((bitField0_ & 0x00000001) != 0)) {
+                    deleted_ = deleted_.getUnmodifiableView();
+                    bitField0_ = (bitField0_ & ~0x00000001);
                 }
+                result.deleted_ = deleted_;
                 onBuilt();
                 return result;
             }
 
-            private void buildPartial0(ztp.Ztp.DeviceDeletionResult result) {
-                int from_bitField0_ = bitField0_;
-                if (((from_bitField0_ & 0x00000001) != 0)) {
-                    deleted_.makeImmutable();
-                    result.deleted_ = deleted_;
-                }
+            @java.lang.Override
+            public Builder clone() {
+                return super.clone();
+            }
+
+            @java.lang.Override
+            public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.setField(field, value);
+            }
+
+            @java.lang.Override
+            public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+                return super.clearField(field);
+            }
+
+            @java.lang.Override
+            public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+                return super.clearOneof(oneof);
+            }
+
+            @java.lang.Override
+            public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+                return super.setRepeatedField(field, index, value);
+            }
+
+            @java.lang.Override
+            public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+                return super.addRepeatedField(field, value);
             }
 
             @java.lang.Override
@@ -4099,14 +4388,14 @@ public final class Ztp {
                 if (!other.deleted_.isEmpty()) {
                     if (deleted_.isEmpty()) {
                         deleted_ = other.deleted_;
-                        bitField0_ |= 0x00000001;
+                        bitField0_ = (bitField0_ & ~0x00000001);
                     } else {
                         ensureDeletedIsMutable();
                         deleted_.addAll(other.deleted_);
                     }
                     onChanged();
                 }
-                this.mergeUnknownFields(other.getUnknownFields());
+                this.mergeUnknownFields(other.unknownFields);
                 onChanged();
                 return this;
             }
@@ -4118,55 +4407,29 @@ public final class Ztp {
 
             @java.lang.Override
             public Builder mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
-                if (extensionRegistry == null) {
-                    throw new java.lang.NullPointerException();
-                }
+                ztp.Ztp.DeviceDeletionResult parsedMessage = null;
                 try {
-                    boolean done = false;
-                    while (!done) {
-                        int tag = input.readTag();
-                        switch(tag) {
-                            case 0:
-                                done = true;
-                                break;
-                            case 10:
-                                {
-                                    java.lang.String s = input.readStringRequireUtf8();
-                                    ensureDeletedIsMutable();
-                                    deleted_.add(s);
-                                    break;
-                                }
-                            // case 10
-                            default:
-                                {
-                                    if (!super.parseUnknownField(input, extensionRegistry, tag)) {
-                                        // was an endgroup tag
-                                        done = true;
-                                    }
-                                    break;
-                                }
-                        }
-                        // switch (tag)
-                    }
-                    // while (!done)
+                    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
                 } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    parsedMessage = (ztp.Ztp.DeviceDeletionResult) e.getUnfinishedMessage();
                     throw e.unwrapIOException();
                 } finally {
-                    onChanged();
+                    if (parsedMessage != null) {
+                        mergeFrom(parsedMessage);
+                    }
                 }
-                // finally
                 return this;
             }
 
             private int bitField0_;
 
-            private com.google.protobuf.LazyStringArrayList deleted_ = com.google.protobuf.LazyStringArrayList.emptyList();
+            private com.google.protobuf.LazyStringList deleted_ = com.google.protobuf.LazyStringArrayList.EMPTY;
 
             private void ensureDeletedIsMutable() {
-                if (!deleted_.isModifiable()) {
+                if (!((bitField0_ & 0x00000001) != 0)) {
                     deleted_ = new com.google.protobuf.LazyStringArrayList(deleted_);
+                    bitField0_ |= 0x00000001;
                 }
-                bitField0_ |= 0x00000001;
             }
 
             /**
@@ -4174,8 +4437,7 @@ public final class Ztp {
              * @return A list containing the deleted.
              */
             public com.google.protobuf.ProtocolStringList getDeletedList() {
-                deleted_.makeImmutable();
-                return deleted_;
+                return deleted_.getUnmodifiableView();
             }
 
             /**
@@ -4216,7 +4478,6 @@ public final class Ztp {
                 }
                 ensureDeletedIsMutable();
                 deleted_.set(index, value);
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -4232,7 +4493,6 @@ public final class Ztp {
                 }
                 ensureDeletedIsMutable();
                 deleted_.add(value);
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -4245,7 +4505,6 @@ public final class Ztp {
             public Builder addAllDeleted(java.lang.Iterable values) {
                 ensureDeletedIsMutable();
                 com.google.protobuf.AbstractMessageLite.Builder.addAll(values, deleted_);
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -4255,9 +4514,8 @@ public final class Ztp {
              * @return This builder for chaining.
              */
             public Builder clearDeleted() {
-                deleted_ = com.google.protobuf.LazyStringArrayList.emptyList();
+                deleted_ = com.google.protobuf.LazyStringArrayList.EMPTY;
                 bitField0_ = (bitField0_ & ~0x00000001);
-                ;
                 onChanged();
                 return this;
             }
@@ -4274,7 +4532,6 @@ public final class Ztp {
                 checkByteStringIsUtf8(value);
                 ensureDeletedIsMutable();
                 deleted_.add(value);
-                bitField0_ |= 0x00000001;
                 onChanged();
                 return this;
             }
@@ -4306,17 +4563,7 @@ public final class Ztp {
 
             @java.lang.Override
             public DeviceDeletionResult parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
-                Builder builder = newBuilder();
-                try {
-                    builder.mergeFrom(input, extensionRegistry);
-                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-                    throw e.setUnfinishedMessage(builder.buildPartial());
-                } catch (com.google.protobuf.UninitializedMessageException e) {
-                    throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
-                } catch (java.io.IOException e) {
-                    throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
-                }
-                return builder.buildPartial();
+                return new DeviceDeletionResult(input, extensionRegistry);
             }
         };
 
diff --git a/src/ztp/target/generated-sources/grpc/ztp/ZtpServiceGrpc.java b/src/ztp/target/generated-sources/grpc/ztp/ZtpServiceGrpc.java
index e989a3637..796e4bcee 100644
--- a/src/ztp/target/generated-sources/grpc/ztp/ZtpServiceGrpc.java
+++ b/src/ztp/target/generated-sources/grpc/ztp/ZtpServiceGrpc.java
@@ -4,8 +4,7 @@ import static io.grpc.MethodDescriptor.generateFullMethodName;
 
 /**
  */
-@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.55.1)", comments = "Source: ztp.proto")
-@io.grpc.stub.annotations.GrpcGenerated
+@io.quarkus.grpc.common.Generated(value = "by gRPC proto compiler (version 1.38.1)", comments = "Source: ztp.proto")
 public final class ZtpServiceGrpc {
 
     private ZtpServiceGrpc() {
@@ -148,58 +147,51 @@ public final class ZtpServiceGrpc {
 
     /**
      */
-    public interface AsyncService {
+    public static abstract class ZtpServiceImplBase implements io.grpc.BindableService {
 
         /**
          */
-        default void ztpGetDeviceRole(ztp.Ztp.DeviceRoleId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void ztpGetDeviceRole(ztp.Ztp.DeviceRoleId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getZtpGetDeviceRoleMethod(), responseObserver);
         }
 
         /**
          */
-        default void ztpGetDeviceRolesByDeviceId(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) {
+        public void ztpGetDeviceRolesByDeviceId(context.ContextOuterClass.DeviceId request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getZtpGetDeviceRolesByDeviceIdMethod(), responseObserver);
         }
 
         /**
          */
-        default void ztpAdd(ztp.Ztp.DeviceRole request, io.grpc.stub.StreamObserver responseObserver) {
+        public void ztpAdd(ztp.Ztp.DeviceRole request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getZtpAddMethod(), responseObserver);
         }
 
         /**
          */
-        default void ztpUpdate(ztp.Ztp.DeviceRoleConfig request, io.grpc.stub.StreamObserver responseObserver) {
+        public void ztpUpdate(ztp.Ztp.DeviceRoleConfig request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getZtpUpdateMethod(), responseObserver);
         }
 
         /**
          */
-        default void ztpDelete(ztp.Ztp.DeviceRole request, io.grpc.stub.StreamObserver responseObserver) {
+        public void ztpDelete(ztp.Ztp.DeviceRole request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getZtpDeleteMethod(), responseObserver);
         }
 
         /**
          */
-        default void ztpDeleteAll(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
+        public void ztpDeleteAll(context.ContextOuterClass.Empty request, io.grpc.stub.StreamObserver responseObserver) {
             io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getZtpDeleteAllMethod(), responseObserver);
         }
-    }
-
-    /**
-     * Base class for the server implementation of the service ZtpService.
-     */
-    public static abstract class ZtpServiceImplBase implements io.grpc.BindableService, AsyncService {
 
         @java.lang.Override
         public io.grpc.ServerServiceDefinition bindService() {
-            return ZtpServiceGrpc.bindService(this);
+            return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getZtpGetDeviceRoleMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_ZTP_GET_DEVICE_ROLE))).addMethod(getZtpGetDeviceRolesByDeviceIdMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_ZTP_GET_DEVICE_ROLES_BY_DEVICE_ID))).addMethod(getZtpAddMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_ZTP_ADD))).addMethod(getZtpUpdateMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_ZTP_UPDATE))).addMethod(getZtpDeleteMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_ZTP_DELETE))).addMethod(getZtpDeleteAllMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(this, METHODID_ZTP_DELETE_ALL))).build();
         }
     }
 
     /**
-     * A stub to allow clients to do asynchronous rpc calls to service ZtpService.
      */
     public static class ZtpServiceStub extends io.grpc.stub.AbstractAsyncStub {
 
@@ -250,7 +242,6 @@ public final class ZtpServiceGrpc {
     }
 
     /**
-     * A stub to allow clients to do synchronous rpc calls to service ZtpService.
      */
     public static class ZtpServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub {
 
@@ -301,7 +292,6 @@ public final class ZtpServiceGrpc {
     }
 
     /**
-     * A stub to allow clients to do ListenableFuture-style rpc calls to service ZtpService.
      */
     public static class ZtpServiceFutureStub extends io.grpc.stub.AbstractFutureStub {
 
@@ -365,11 +355,11 @@ public final class ZtpServiceGrpc {
 
     private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, io.grpc.stub.ServerCalls.ServerStreamingMethod, io.grpc.stub.ServerCalls.ClientStreamingMethod, io.grpc.stub.ServerCalls.BidiStreamingMethod {
 
-        private final AsyncService serviceImpl;
+        private final ZtpServiceImplBase serviceImpl;
 
         private final int methodId;
 
-        MethodHandlers(AsyncService serviceImpl, int methodId) {
+        MethodHandlers(ZtpServiceImplBase serviceImpl, int methodId) {
             this.serviceImpl = serviceImpl;
             this.methodId = methodId;
         }
@@ -411,10 +401,6 @@ public final class ZtpServiceGrpc {
         }
     }
 
-    public static io.grpc.ServerServiceDefinition bindService(AsyncService service) {
-        return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()).addMethod(getZtpGetDeviceRoleMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_ZTP_GET_DEVICE_ROLE))).addMethod(getZtpGetDeviceRolesByDeviceIdMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_ZTP_GET_DEVICE_ROLES_BY_DEVICE_ID))).addMethod(getZtpAddMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_ZTP_ADD))).addMethod(getZtpUpdateMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_ZTP_UPDATE))).addMethod(getZtpDeleteMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_ZTP_DELETE))).addMethod(getZtpDeleteAllMethod(), io.grpc.stub.ServerCalls.asyncUnaryCall(new MethodHandlers(service, METHODID_ZTP_DELETE_ALL))).build();
-    }
-
     private static abstract class ZtpServiceBaseDescriptorSupplier implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
 
         ZtpServiceBaseDescriptorSupplier() {
diff --git a/src/ztp/target/kubernetes/kubernetes.yml b/src/ztp/target/kubernetes/kubernetes.yml
index 442ff876a..95eca6ae2 100644
--- a/src/ztp/target/kubernetes/kubernetes.yml
+++ b/src/ztp/target/kubernetes/kubernetes.yml
@@ -3,8 +3,8 @@ apiVersion: v1
 kind: Service
 metadata:
   annotations:
-    app.quarkus.io/commit-id: 7fce72764fa6bb9b37b407bbcba502cc0a23735f
-    app.quarkus.io/build-timestamp: 2024-04-04 - 09:35:22 +0000
+    app.quarkus.io/commit-id: 1fd284c73cf7d419152c8bc99644d0ed8955b355
+    app.quarkus.io/build-timestamp: 2024-04-08 - 17:36:46 +0000
     prometheus.io/scrape: "true"
     prometheus.io/path: /q/metrics
     prometheus.io/port: "8080"
@@ -21,14 +21,14 @@ spec:
       port: 9192
       protocol: TCP
       targetPort: 8080
-    - name: grpc
-      port: 5050
-      protocol: TCP
-      targetPort: 5050
     - name: https
       port: 443
       protocol: TCP
       targetPort: 8443
+    - name: grpc
+      port: 5050
+      protocol: TCP
+      targetPort: 5050
   selector:
     app.kubernetes.io/name: ztpservice
   type: ClusterIP
@@ -37,8 +37,8 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   annotations:
-    app.quarkus.io/commit-id: 7fce72764fa6bb9b37b407bbcba502cc0a23735f
-    app.quarkus.io/build-timestamp: 2024-04-04 - 09:35:22 +0000
+    app.quarkus.io/commit-id: 1fd284c73cf7d419152c8bc99644d0ed8955b355
+    app.quarkus.io/build-timestamp: 2024-04-08 - 17:36:46 +0000
     prometheus.io/scrape: "true"
     prometheus.io/path: /q/metrics
     prometheus.io/port: "8080"
@@ -57,8 +57,8 @@ spec:
   template:
     metadata:
       annotations:
-        app.quarkus.io/commit-id: 7fce72764fa6bb9b37b407bbcba502cc0a23735f
-        app.quarkus.io/build-timestamp: 2024-04-04 - 09:35:22 +0000
+        app.quarkus.io/commit-id: 1fd284c73cf7d419152c8bc99644d0ed8955b355
+        app.quarkus.io/build-timestamp: 2024-04-08 - 17:36:46 +0000
         prometheus.io/scrape: "true"
         prometheus.io/path: /q/metrics
         prometheus.io/port: "8080"
@@ -96,12 +96,12 @@ spec:
             - containerPort: 8080
               name: http
               protocol: TCP
-            - containerPort: 5050
-              name: grpc
-              protocol: TCP
             - containerPort: 8443
               name: https
               protocol: TCP
+            - containerPort: 5050
+              name: grpc
+              protocol: TCP
           readinessProbe:
             failureThreshold: 3
             httpGet:
-- 
GitLab


From 826e1bac8738fec7b5369b6bffffe648751fc57d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Ara=C3=BAjo?= 
Date: Mon, 11 Dec 2023 17:03:55 +0000
Subject: [PATCH 085/602] HPA in services

HPA in webui service
---
 manifests/deviceservice.yaml     | 35 ++++++++++++++++++++++++--------
 manifests/monitoringservice.yaml | 35 ++++++++++++++++++++++++--------
 manifests/webuiservice.yaml      | 35 ++++++++++++++++++++++++++------
 3 files changed, 83 insertions(+), 22 deletions(-)

diff --git a/manifests/deviceservice.yaml b/manifests/deviceservice.yaml
index fdc3cea02..6181fc63a 100644
--- a/manifests/deviceservice.yaml
+++ b/manifests/deviceservice.yaml
@@ -70,11 +70,30 @@ spec:
   selector:
     app: deviceservice
   ports:
-    - name: grpc
-      protocol: TCP
-      port: 2020
-      targetPort: 2020
-    - name: metrics
-      protocol: TCP
-      port: 9192
-      targetPort: 9192
+  - name: grpc
+    protocol: TCP
+    port: 2020
+    targetPort: 2020
+  - name: metrics
+    protocol: TCP
+    port: 9192
+    targetPort: 9192
+---
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+  name: deviceservice-hpa
+spec:
+  scaleTargetRef:
+    apiVersion: apps/v1
+    kind: Deployment
+    name: deviceservice
+  minReplicas: 1
+  maxReplicas: 10
+  metrics:
+  - type: Resource
+    resource:
+      name: cpu
+      target:
+        type: Utilization
+        averageUtilization: 80
diff --git a/manifests/monitoringservice.yaml b/manifests/monitoringservice.yaml
index 3a4d43cd9..6700afdd6 100644
--- a/manifests/monitoringservice.yaml
+++ b/manifests/monitoringservice.yaml
@@ -65,11 +65,30 @@ spec:
   selector:
     app: monitoringservice
   ports:
-    - name: grpc
-      protocol: TCP
-      port: 7070
-      targetPort: 7070
-    - name: metrics
-      protocol: TCP
-      port: 9192
-      targetPort: 9192
+  - name: grpc
+    protocol: TCP
+    port: 7070
+    targetPort: 7070
+  - name: metrics
+    protocol: TCP
+    port: 9192
+    targetPort: 9192
+---
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+  name: monitoringservice-hpa
+spec:
+  scaleTargetRef:
+    apiVersion: apps/v1
+    kind: Deployment
+    name: monitoringservice
+  minReplicas: 1
+  maxReplicas: 10
+  metrics:
+  - type: Resource
+    resource:
+      name: cpu
+      target:
+        type: Utilization
+        averageUtilization: 80
diff --git a/manifests/webuiservice.yaml b/manifests/webuiservice.yaml
index bb2573c45..87fe57719 100644
--- a/manifests/webuiservice.yaml
+++ b/manifests/webuiservice.yaml
@@ -111,9 +111,32 @@ spec:
   selector:
     app: webuiservice
   ports:
-    - name: webui
-      port: 8004
-      targetPort: 8004
-    - name: grafana
-      port: 3000
-      targetPort: 3000
+  - name: webui
+    port: 8004
+    targetPort: 8004
+  - name: grafana
+    port: 3000
+    targetPort: 3000
+# TESTING
+---
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+  name: webuiservice-hpa
+spec:
+  scaleTargetRef:
+    apiVersion: apps/v1
+    kind: Deployment
+    name: webuiservice
+  minReplicas: 1
+  maxReplicas: 20
+  metrics:
+  - type: Resource
+    resource:
+      name: cpu
+      target:
+        type: Utilization
+        averageUtilization: 50
+  #behavior:
+  #  scaleDown:
+  #    stabilizationWindowSeconds: 30
-- 
GitLab


From 6763315984de86baf9d4979609650fb443d875a6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Ara=C3=BAjo?= 
Date: Wed, 22 Nov 2023 15:54:26 +0000
Subject: [PATCH 086/602] Added rate limiting to ingress controller

---
 manifests/nginx_ingress_http.yaml | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/manifests/nginx_ingress_http.yaml b/manifests/nginx_ingress_http.yaml
index 2b63e5c1c..f150e4c86 100644
--- a/manifests/nginx_ingress_http.yaml
+++ b/manifests/nginx_ingress_http.yaml
@@ -18,6 +18,11 @@ metadata:
   name: tfs-ingress
   annotations:
     nginx.ingress.kubernetes.io/rewrite-target: /$2
+    nginx.ingress.kubernetes.io/limit-rps: '2'
+    nginx.ingress.kubernetes.io/limit-connections: '5'
+    nginx.ingress.kubernetes.io/proxy-connect-timeout: '10'
+    nginx.ingress.kubernetes.io/proxy-send-timeout: '10'
+    nginx.ingress.kubernetes.io/proxy-read-timeout: '10'
 spec:
   rules:
     - http:
-- 
GitLab


From f1a63185fbd81f1d92ccf3a7a2d4d76b540a46fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Ara=C3=BAjo?= 
Date: Fri, 2 Feb 2024 13:52:55 +0000
Subject: [PATCH 087/602] NGINX and redeployall

default variables set

code refactoring

NATS cluster complete

Startup Probe failling in NATS cluster mode

Cockroach cluster operator and NATS cluster mode

Update

Update scheduling policy for CRDB

NATS cluster mode

Testing CRDB cluster with node affinity

Revert "Testing dynamic node resources"

This reverts commit 856eb4799d2136697c721b387e6fca9fdcdbf5fd.

Testing dynamic node resources

NGINX and redeployall

Update my_deploy.sh

Update nginx_ingress_http.yaml

Redeploy all fixed

Add redeploy all feature
---
 deploy/all.sh                       |  14 ++++
 deploy/crdb.sh                      |  11 ++-
 deploy/nats.sh                      | 119 ++++++++++++++++++++++++++--
 deploy/qdb.sh                       |   6 +-
 manifests/cockroachdb/cluster.yaml  |  36 ++++-----
 manifests/cockroachdb/operator.yaml |   2 +
 manifests/nats/cluster.yaml         |  34 ++++++++
 manifests/nginx_ingress_http.yaml   |   4 +-
 my_deploy.sh                        |  12 ++-
 9 files changed, 204 insertions(+), 34 deletions(-)
 create mode 100644 manifests/nats/cluster.yaml

diff --git a/deploy/all.sh b/deploy/all.sh
index 25d69b485..50a6c0816 100755
--- a/deploy/all.sh
+++ b/deploy/all.sh
@@ -18,6 +18,11 @@
 # Read deployment settings
 ########################################################################################################################
 
+# ----- Redeploy All ------------------------------------------------------------
+
+# If not already set, enables all components redeployment
+export REDEPLOYALL=${REDEPLOYALL:-""}
+
 
 # ----- TeraFlowSDN ------------------------------------------------------------
 
@@ -102,6 +107,15 @@ export NATS_EXT_PORT_CLIENT=${NATS_EXT_PORT_CLIENT:-"4222"}
 # If not already set, set the external port NATS HTTP Mgmt GUI interface will be exposed to.
 export NATS_EXT_PORT_HTTP=${NATS_EXT_PORT_HTTP:-"8222"}
 
+# TESTING
+# If not already set, set NATS installation mode. Accepted values are: 'single' and 'cluster'.
+# - If NATS_DEPLOY_MODE is "single", NATS is deployed in single node mode. It is convenient for
+#   development and testing purposes and should fit in a VM. IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS.
+# - If NATS_DEPLOY_MODE is "cluster", NATS is deployed in cluster mode, and an entire NATS cluster
+#   with 3 replicas (set by default) will be deployed. It is convenient for production and
+#   provides scalability features.
+export NATS_DEPLOY_MODE=${NATS_DEPLOY_MODE:-"single"}
+
 # If not already set, disable flag for re-deploying NATS from scratch.
 # WARNING: ACTIVATING THIS FLAG IMPLIES LOOSING THE MESSAGE BROKER INFORMATION!
 # If NATS_REDEPLOY is "YES", the message broker will be dropped while checking/deploying NATS.
diff --git a/deploy/crdb.sh b/deploy/crdb.sh
index a304e83d1..2a8bd88d3 100755
--- a/deploy/crdb.sh
+++ b/deploy/crdb.sh
@@ -18,6 +18,11 @@
 # Read deployment settings
 ########################################################################################################################
 
+# ----- Redeploy All ------------------------------------------------------------
+# If not already set, enables all components redeployment
+export REDEPLOYALL=${REDEPLOYALL:-""}
+
+
 # If not already set, set the namespace where CockroackDB will be deployed.
 export CRDB_NAMESPACE=${CRDB_NAMESPACE:-"crdb"}
 
@@ -223,7 +228,7 @@ function crdb_deploy_cluster() {
     kubectl create namespace ${CRDB_NAMESPACE}
     echo
 
-    echo "CockroachDB"
+    echo "CockroachDB (cluster-mode)"
     echo ">>> Checking if CockroachDB is deployed..."
     if kubectl get --namespace ${CRDB_NAMESPACE} statefulset/cockroachdb &> /dev/null; then
         echo ">>> CockroachDB is present; skipping step."
@@ -360,7 +365,7 @@ function crdb_drop_database_cluster() {
 }
 
 if [ "$CRDB_DEPLOY_MODE" == "single" ]; then
-    if [ "$CRDB_REDEPLOY" == "YES" ]; then
+    if [ "$CRDB_REDEPLOY" == "YES" ] || [ "$REDEPLOYALL" == "YES" ]; then
         crdb_undeploy_single
     fi
 
@@ -370,7 +375,7 @@ if [ "$CRDB_DEPLOY_MODE" == "single" ]; then
         crdb_drop_database_single
     fi
 elif [ "$CRDB_DEPLOY_MODE" == "cluster" ]; then
-    if [ "$CRDB_REDEPLOY" == "YES" ]; then
+    if [ "$CRDB_REDEPLOY" == "YES" ] || [ "$REDEPLOYALL" == "YES" ]; then
         crdb_undeploy_cluster
     fi
 
diff --git a/deploy/nats.sh b/deploy/nats.sh
index 004f67c44..d6922d86b 100755
--- a/deploy/nats.sh
+++ b/deploy/nats.sh
@@ -18,6 +18,10 @@
 # Read deployment settings
 ########################################################################################################################
 
+# ----- Redeploy All ------------------------------------------------------------
+# If not already set, enables all components redeployment
+export REDEPLOYALL=${REDEPLOYALL:-""}
+
 # If not already set, set the namespace where NATS will be deployed.
 export NATS_NAMESPACE=${NATS_NAMESPACE:-"nats"}
 
@@ -27,16 +31,32 @@ export NATS_EXT_PORT_CLIENT=${NATS_EXT_PORT_CLIENT:-"4222"}
 # If not already set, set the external port NATS HTTP Mgmt GUI interface will be exposed to.
 export NATS_EXT_PORT_HTTP=${NATS_EXT_PORT_HTTP:-"8222"}
 
+# TESTING
+# If not already set, set NATS installation mode. Accepted values are: 'single' and 'cluster'.
+# - If NATS_DEPLOY_MODE is "single", NATS is deployed in single node mode. It is convenient for
+#   development and testing purposes and should fit in a VM. IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS.
+# - If NATS_DEPLOY_MODE is "cluster", NATS is deployed in cluster mode, and an entire NATS cluster
+#   with 3 replicas (set by default) will be deployed. It is convenient for production and
+#   provides scalability features.
+export NATS_DEPLOY_MODE=${NATS_DEPLOY_MODE:-"single"}
+
 # If not already set, disable flag for re-deploying NATS from scratch.
 # WARNING: ACTIVATING THIS FLAG IMPLIES LOOSING THE MESSAGE BROKER INFORMATION!
 # If NATS_REDEPLOY is "YES", the message broker will be dropped while checking/deploying NATS.
 export NATS_REDEPLOY=${NATS_REDEPLOY:-""}
 
-
 ########################################################################################################################
 # Automated steps start here
 ########################################################################################################################
 
+# Constants
+TMP_FOLDER="./tmp"
+NATS_MANIFESTS_PATH="manifests/nats"
+
+# Create a tmp folder for files modified during the deployment
+TMP_MANIFESTS_FOLDER="${TMP_FOLDER}/${NATS_NAMESPACE}/manifests"
+mkdir -p $TMP_MANIFESTS_FOLDER
+
 function nats_deploy_single() {
     echo "NATS Namespace"
     echo ">>> Create NATS Namespace (if missing)"
@@ -47,18 +67,85 @@ function nats_deploy_single() {
     helm3 repo add nats https://nats-io.github.io/k8s/helm/charts/
     echo
 
+    echo "Install NATS (single-node)"
+    echo ">>> Checking if NATS is deployed..."
+    if kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; then
+        echo ">>> NATS is present; skipping step."
+    else
+        echo ">>> Deploy NATS"
+        helm3 install ${NATS_NAMESPACE} nats/nats --namespace ${NATS_NAMESPACE} --set nats.image=nats:2.9-alpine
+
+        echo ">>> Waiting NATS statefulset to be created..."
+        while ! kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; do
+            printf "%c" "."
+            sleep 1
+        done
+
+        # Wait for statefulset condition "Available=True" does not work
+        # Wait for statefulset condition "jsonpath='{.status.readyReplicas}'=3" throws error:
+        #   "error: readyReplicas is not found"
+        # Workaround: Check the pods are ready
+        #echo ">>> NATS statefulset created. Waiting for readiness condition..."
+        #kubectl wait --namespace  ${NATS_NAMESPACE} --for=condition=Available=True --timeout=300s statefulset/nats
+        #kubectl wait --namespace ${NATS_NAMESPACE} --for=jsonpath='{.status.readyReplicas}'=3 --timeout=300s \
+        #    statefulset/nats
+        echo ">>> NATS statefulset created. Waiting NATS pods to be created..."
+        while ! kubectl get --namespace ${NATS_NAMESPACE} pod/${NATS_NAMESPACE}-0 &> /dev/null; do
+            printf "%c" "."
+            sleep 1
+        done
+        kubectl wait --namespace ${NATS_NAMESPACE} --for=condition=Ready --timeout=300s pod/${NATS_NAMESPACE}-0
+    fi
+    echo
+
+    echo "NATS Port Mapping"
+    echo ">>> Expose NATS Client port (4222->${NATS_EXT_PORT_CLIENT})"
+    NATS_PORT_CLIENT=$(kubectl --namespace ${NATS_NAMESPACE} get service ${NATS_NAMESPACE} -o 'jsonpath={.spec.ports[?(@.name=="client")].port}')
+    PATCH='{"data": {"'${NATS_EXT_PORT_CLIENT}'": "'${NATS_NAMESPACE}'/'${NATS_NAMESPACE}':'${NATS_PORT_CLIENT}'"}}'
+    kubectl patch configmap nginx-ingress-tcp-microk8s-conf --namespace ingress --patch "${PATCH}"
+
+    PORT_MAP='{"containerPort": '${NATS_EXT_PORT_CLIENT}', "hostPort": '${NATS_EXT_PORT_CLIENT}'}'
+    CONTAINER='{"name": "nginx-ingress-microk8s", "ports": ['${PORT_MAP}']}'
+    PATCH='{"spec": {"template": {"spec": {"containers": ['${CONTAINER}']}}}}'
+    kubectl patch daemonset nginx-ingress-microk8s-controller --namespace ingress --patch "${PATCH}"
+    echo
+
+    echo ">>> Expose NATS HTTP Mgmt GUI port (8222->${NATS_EXT_PORT_HTTP})"
+    NATS_PORT_HTTP=$(kubectl --namespace ${NATS_NAMESPACE} get service ${NATS_NAMESPACE} -o 'jsonpath={.spec.ports[?(@.name=="monitor")].port}')
+    PATCH='{"data": {"'${NATS_EXT_PORT_HTTP}'": "'${NATS_NAMESPACE}'/'${NATS_NAMESPACE}':'${NATS_PORT_HTTP}'"}}'
+    kubectl patch configmap nginx-ingress-tcp-microk8s-conf --namespace ingress --patch "${PATCH}"
+
+    PORT_MAP='{"containerPort": '${NATS_EXT_PORT_HTTP}', "hostPort": '${NATS_EXT_PORT_HTTP}'}'
+    CONTAINER='{"name": "nginx-ingress-microk8s", "ports": ['${PORT_MAP}']}'
+    PATCH='{"spec": {"template": {"spec": {"containers": ['${CONTAINER}']}}}}'
+    kubectl patch daemonset nginx-ingress-microk8s-controller --namespace ingress --patch "${PATCH}"
+    echo
+}
+
+
+function nats_deploy_cluster() {
+    echo "NATS Namespace"
+    echo ">>> Create NATS Namespace (if missing)"
+    kubectl create namespace ${NATS_NAMESPACE}
+    echo
+
+    echo "Add NATS Helm Chart"
+    helm3 repo add nats https://nats-io.github.io/k8s/helm/charts/
+    echo
+
     echo "Upgrade NATS Helm Chart"
     helm3 repo update nats
     echo
 
-    echo "Install NATS (single-node)"
+    echo "Install NATS (cluster-mode)"
     echo ">>> Checking if NATS is deployed..."
     if kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; then
         echo ">>> NATS is present; skipping step."
     else
         echo ">>> Deploy NATS"
-        helm3 install ${NATS_NAMESPACE} nats/nats --namespace ${NATS_NAMESPACE} --set nats.image=nats:2.9-alpine
-
+        cp "${NATS_MANIFESTS_PATH}/cluster.yaml" "${TMP_MANIFESTS_FOLDER}/nats_cluster.yaml"
+        helm3 install ${NATS_NAMESPACE} nats/nats --namespace ${NATS_NAMESPACE} -f "${TMP_MANIFESTS_FOLDER}/nats_cluster.yaml"
+    
         echo ">>> Waiting NATS statefulset to be created..."
         while ! kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; do
             printf "%c" "."
@@ -78,7 +165,17 @@ function nats_deploy_single() {
             printf "%c" "."
             sleep 1
         done
+        while ! kubectl get --namespace ${NATS_NAMESPACE} pod/${NATS_NAMESPACE}-1 &> /dev/null; do
+            printf "%c" "."
+            sleep 1
+        done
+        while ! kubectl get --namespace ${NATS_NAMESPACE} pod/${NATS_NAMESPACE}-2 &> /dev/null; do
+            printf "%c" "."
+            sleep 1
+        done
         kubectl wait --namespace ${NATS_NAMESPACE} --for=condition=Ready --timeout=300s pod/${NATS_NAMESPACE}-0
+        kubectl wait --namespace ${NATS_NAMESPACE} --for=condition=Ready --timeout=300s pod/${NATS_NAMESPACE}-1
+        kubectl wait --namespace ${NATS_NAMESPACE} --for=condition=Ready --timeout=300s pod/${NATS_NAMESPACE}-2
     fi
     echo
 
@@ -110,7 +207,7 @@ function nats_deploy_single() {
     echo
 }
 
-function nats_undeploy_single() {
+function nats_undeploy() {
     echo "NATS"
     echo ">>> Checking if NATS is deployed..."
     if kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; then
@@ -127,8 +224,14 @@ function nats_undeploy_single() {
     echo
 }
 
-if [ "$NATS_REDEPLOY" == "YES" ]; then
-    nats_undeploy_single
+if [ "$NATS_REDEPLOY" == "YES" ] || [ "$REDEPLOYALL" == "YES" ]; then
+    nats_undeploy
 fi
 
-nats_deploy_single
+if [ "$NATS_DEPLOY_MODE" == "single" ]; then
+    nats_deploy_single
+elif [ "$NATS_DEPLOY_MODE" == "cluster" ]; then
+    nats_deploy_cluster
+else
+    echo "Unsupported value: NATS_DEPLOY_MODE=$NATS_DEPLOY_MODE"
+fi
\ No newline at end of file
diff --git a/deploy/qdb.sh b/deploy/qdb.sh
index 3235c6c82..52d2fc7db 100755
--- a/deploy/qdb.sh
+++ b/deploy/qdb.sh
@@ -18,6 +18,10 @@
 # Read deployment settings
 ########################################################################################################################
 
+# ----- Redeploy All ------------------------------------------------------------
+# If not already set, enables all components redeployment
+export REDEPLOYALL=${REDEPLOYALL:-""}
+
 # If not already set, set the namespace where QuestDB will be deployed.
 export QDB_NAMESPACE=${QDB_NAMESPACE:-"qdb"}
 
@@ -177,7 +181,7 @@ function qdb_drop_tables() {
     echo
 }
 
-if [ "$QDB_REDEPLOY" == "YES" ]; then
+if [ "$QDB_REDEPLOY" == "YES" ] || [ "$REDEPLOYALL" == "YES" ]; then
     qdb_undeploy
 fi
 
diff --git a/manifests/cockroachdb/cluster.yaml b/manifests/cockroachdb/cluster.yaml
index 4d9ef0f84..73875ca3f 100644
--- a/manifests/cockroachdb/cluster.yaml
+++ b/manifests/cockroachdb/cluster.yaml
@@ -33,14 +33,16 @@ spec:
   resources:
     requests:
       # This is intentionally low to make it work on local k3d clusters.
-      cpu: 4
-      memory: 4Gi
+      # TESTING
+      cpu: 1 #4
+      memory: 500Mi #4Gi
     limits:
-      cpu: 8
-      memory: 8Gi
+      # TESTING
+      cpu: 1 #8
+      memory: 1Gi #8Gi
   tlsEnabled: true
-# You can set either a version of the db or a specific image name
-# cockroachDBVersion: v22.2.8
+  # You can set either a version of the db or a specific image name
+  # cockroachDBVersion: v22.2.8
   image:
     name: cockroachdb/cockroach:v22.2.8
   # nodes refers to the number of crdb pods that are created
@@ -49,21 +51,17 @@ spec:
   additionalLabels:
     crdb: is-cool
   # affinity is a new API field that is behind a feature gate that is
-  # disabled by default.  To enable please see the operator.yaml file.
+  # disabled by default. To enable please see the operator.yaml file.
 
   # The affinity field will accept any podSpec affinity rule.
-  # affinity:
-  #   podAntiAffinity:
-  #      preferredDuringSchedulingIgnoredDuringExecution:
-  #      - weight: 100
-  #        podAffinityTerm:
-  #          labelSelector:
-  #            matchExpressions:
-  #            - key: app.kubernetes.io/instance
-  #              operator: In
-  #              values:
-  #              - cockroachdb
-  #          topologyKey: kubernetes.io/hostname
+  # TESTING: Force one pod per node, if possible
+  topologySpreadConstraints:
+  - maxSkew: 1
+    topologyKey: kubernetes.io/hostname  
+    whenUnsatisfiable: ScheduleAnyway
+    labelSelector:
+      matchLabels:
+        app.kubernetes.io/instance: cockroachdb
 
   # nodeSelectors used to match against
   # nodeSelector:
diff --git a/manifests/cockroachdb/operator.yaml b/manifests/cockroachdb/operator.yaml
index 59d515061..0d578410c 100644
--- a/manifests/cockroachdb/operator.yaml
+++ b/manifests/cockroachdb/operator.yaml
@@ -381,6 +381,8 @@ spec:
     spec:
       containers:
       - args:
+        # TESTING
+        - -feature-gates=TolerationRules=true,AffinityRules=true,TopologySpreadRules=true
         - -zap-log-level
         - info
         env:
diff --git a/manifests/nats/cluster.yaml b/manifests/nats/cluster.yaml
new file mode 100644
index 000000000..39e41958f
--- /dev/null
+++ b/manifests/nats/cluster.yaml
@@ -0,0 +1,34 @@
+container:
+  image:
+    tags: 2.9-alpine
+  env:
+    # different from k8s units, suffix must be B, KiB, MiB, GiB, or TiB
+    # should be ~90% of memory limit
+    GOMEMLIMIT: 400MiB
+  merge:
+    # recommended limit is at least 2 CPU cores and 8Gi Memory for production JetStream clusters
+    resources:
+      requests:
+        cpu: 1 # 2
+        memory: 500Mi # 4Gi
+      limits:
+        cpu: 1 # 4
+        memory: 1Gi # 8Gi 
+
+config:
+  cluster:
+    enabled: true
+    replicas: 3
+  jetstream:
+    enabled: true
+    fileStore:
+      pvc:
+        size: 4Gi
+    
+# Force one pod per node, if possible
+podTemplate:
+  topologySpreadConstraints:
+    kubernetes.io/hostname:
+      maxSkew: 1
+      whenUnsatisfiable: ScheduleAnyway
+      
\ No newline at end of file
diff --git a/manifests/nginx_ingress_http.yaml b/manifests/nginx_ingress_http.yaml
index f150e4c86..e91f62242 100644
--- a/manifests/nginx_ingress_http.yaml
+++ b/manifests/nginx_ingress_http.yaml
@@ -18,8 +18,8 @@ metadata:
   name: tfs-ingress
   annotations:
     nginx.ingress.kubernetes.io/rewrite-target: /$2
-    nginx.ingress.kubernetes.io/limit-rps: '2'
-    nginx.ingress.kubernetes.io/limit-connections: '5'
+    nginx.ingress.kubernetes.io/limit-rps: '5'
+    nginx.ingress.kubernetes.io/limit-connections: '10'
     nginx.ingress.kubernetes.io/proxy-connect-timeout: '10'
     nginx.ingress.kubernetes.io/proxy-send-timeout: '10'
     nginx.ingress.kubernetes.io/proxy-read-timeout: '10'
diff --git a/my_deploy.sh b/my_deploy.sh
index 7dd5e5c3e..92a1bfb63 100755
--- a/my_deploy.sh
+++ b/my_deploy.sh
@@ -13,6 +13,11 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+# ----- Redeploy All ------------------------------------------------------------
+
+# If not already set, enables all components redeployment
+export REDEPLOYALL=""
+
 
 # ----- TeraFlowSDN ------------------------------------------------------------
 
@@ -96,7 +101,7 @@ export CRDB_DATABASE="tfs"
 
 # Set CockroachDB installation mode to 'single'. This option is convenient for development and testing.
 # See ./deploy/all.sh or ./deploy/crdb.sh for additional details
-export CRDB_DEPLOY_MODE="single"
+export CRDB_DEPLOY_MODE="cluster"
 
 # Disable flag for dropping database, if it exists.
 export CRDB_DROP_DATABASE_IF_EXISTS=""
@@ -116,6 +121,11 @@ export NATS_EXT_PORT_CLIENT="4222"
 # Set the external port NATS HTTP Mgmt GUI interface will be exposed to.
 export NATS_EXT_PORT_HTTP="8222"
 
+# TESTING
+# Set NATS installation mode to 'single'. This option is convenient for development and testing.
+# See ./deploy/all.sh or ./deploy/nats.sh for additional details
+export NATS_DEPLOY_MODE="single"
+
 # Disable flag for re-deploying NATS from scratch.
 export NATS_REDEPLOY=""
 
-- 
GitLab


From cb8eb2dc4e153dd4b0a7f3ef46cda7f8f854f64a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Ara=C3=BAjo?= 
Date: Wed, 31 Jan 2024 16:29:09 +0000
Subject: [PATCH 088/602] CRDB and NATS cluter mode

Restore default values
---
 deploy/all.sh                       |  1 -
 deploy/nats.sh                      |  4 ++--
 manifests/cockroachdb/cluster.yaml  | 11 ++++-------
 manifests/cockroachdb/operator.yaml |  1 -
 manifests/nats/cluster.yaml         |  8 ++++----
 manifests/webuiservice.yaml         |  1 -
 my_deploy.sh                        |  3 +--
 7 files changed, 11 insertions(+), 18 deletions(-)

diff --git a/deploy/all.sh b/deploy/all.sh
index 50a6c0816..63d202960 100755
--- a/deploy/all.sh
+++ b/deploy/all.sh
@@ -107,7 +107,6 @@ export NATS_EXT_PORT_CLIENT=${NATS_EXT_PORT_CLIENT:-"4222"}
 # If not already set, set the external port NATS HTTP Mgmt GUI interface will be exposed to.
 export NATS_EXT_PORT_HTTP=${NATS_EXT_PORT_HTTP:-"8222"}
 
-# TESTING
 # If not already set, set NATS installation mode. Accepted values are: 'single' and 'cluster'.
 # - If NATS_DEPLOY_MODE is "single", NATS is deployed in single node mode. It is convenient for
 #   development and testing purposes and should fit in a VM. IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS.
diff --git a/deploy/nats.sh b/deploy/nats.sh
index d6922d86b..02e22965e 100755
--- a/deploy/nats.sh
+++ b/deploy/nats.sh
@@ -31,7 +31,6 @@ export NATS_EXT_PORT_CLIENT=${NATS_EXT_PORT_CLIENT:-"4222"}
 # If not already set, set the external port NATS HTTP Mgmt GUI interface will be exposed to.
 export NATS_EXT_PORT_HTTP=${NATS_EXT_PORT_HTTP:-"8222"}
 
-# TESTING
 # If not already set, set NATS installation mode. Accepted values are: 'single' and 'cluster'.
 # - If NATS_DEPLOY_MODE is "single", NATS is deployed in single node mode. It is convenient for
 #   development and testing purposes and should fit in a VM. IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS.
@@ -73,7 +72,8 @@ function nats_deploy_single() {
         echo ">>> NATS is present; skipping step."
     else
         echo ">>> Deploy NATS"
-        helm3 install ${NATS_NAMESPACE} nats/nats --namespace ${NATS_NAMESPACE} --set nats.image=nats:2.9-alpine
+        helm3 install ${NATS_NAMESPACE} nats/nats --namespace ${NATS_NAMESPACE} --set nats.image=nats:2.9-alpine --set config.cluster.enabled=true --set config.cluster.tls.enabled=true
+
 
         echo ">>> Waiting NATS statefulset to be created..."
         while ! kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; do
diff --git a/manifests/cockroachdb/cluster.yaml b/manifests/cockroachdb/cluster.yaml
index 73875ca3f..bcb0c7049 100644
--- a/manifests/cockroachdb/cluster.yaml
+++ b/manifests/cockroachdb/cluster.yaml
@@ -33,13 +33,11 @@ spec:
   resources:
     requests:
       # This is intentionally low to make it work on local k3d clusters.
-      # TESTING
-      cpu: 1 #4
-      memory: 500Mi #4Gi
+      cpu: 4
+      memory: 4Gi
     limits:
-      # TESTING
-      cpu: 1 #8
-      memory: 1Gi #8Gi
+      cpu: 8
+      memory: 8Gi
   tlsEnabled: true
   # You can set either a version of the db or a specific image name
   # cockroachDBVersion: v22.2.8
@@ -54,7 +52,6 @@ spec:
   # disabled by default. To enable please see the operator.yaml file.
 
   # The affinity field will accept any podSpec affinity rule.
-  # TESTING: Force one pod per node, if possible
   topologySpreadConstraints:
   - maxSkew: 1
     topologyKey: kubernetes.io/hostname  
diff --git a/manifests/cockroachdb/operator.yaml b/manifests/cockroachdb/operator.yaml
index 0d578410c..d8e691308 100644
--- a/manifests/cockroachdb/operator.yaml
+++ b/manifests/cockroachdb/operator.yaml
@@ -381,7 +381,6 @@ spec:
     spec:
       containers:
       - args:
-        # TESTING
         - -feature-gates=TolerationRules=true,AffinityRules=true,TopologySpreadRules=true
         - -zap-log-level
         - info
diff --git a/manifests/nats/cluster.yaml b/manifests/nats/cluster.yaml
index 39e41958f..491c86628 100644
--- a/manifests/nats/cluster.yaml
+++ b/manifests/nats/cluster.yaml
@@ -9,11 +9,11 @@ container:
     # recommended limit is at least 2 CPU cores and 8Gi Memory for production JetStream clusters
     resources:
       requests:
-        cpu: 1 # 2
-        memory: 500Mi # 4Gi
+        cpu: 1
+        memory: 500Mi
       limits:
-        cpu: 1 # 4
-        memory: 1Gi # 8Gi 
+        cpu: 1
+        memory: 1Gi
 
 config:
   cluster:
diff --git a/manifests/webuiservice.yaml b/manifests/webuiservice.yaml
index 87fe57719..d7e7c9777 100644
--- a/manifests/webuiservice.yaml
+++ b/manifests/webuiservice.yaml
@@ -117,7 +117,6 @@ spec:
   - name: grafana
     port: 3000
     targetPort: 3000
-# TESTING
 ---
 apiVersion: autoscaling/v2
 kind: HorizontalPodAutoscaler
diff --git a/my_deploy.sh b/my_deploy.sh
index 92a1bfb63..bc8ff56a9 100755
--- a/my_deploy.sh
+++ b/my_deploy.sh
@@ -101,7 +101,7 @@ export CRDB_DATABASE="tfs"
 
 # Set CockroachDB installation mode to 'single'. This option is convenient for development and testing.
 # See ./deploy/all.sh or ./deploy/crdb.sh for additional details
-export CRDB_DEPLOY_MODE="cluster"
+export CRDB_DEPLOY_MODE="single"
 
 # Disable flag for dropping database, if it exists.
 export CRDB_DROP_DATABASE_IF_EXISTS=""
@@ -121,7 +121,6 @@ export NATS_EXT_PORT_CLIENT="4222"
 # Set the external port NATS HTTP Mgmt GUI interface will be exposed to.
 export NATS_EXT_PORT_HTTP="8222"
 
-# TESTING
 # Set NATS installation mode to 'single'. This option is convenient for development and testing.
 # See ./deploy/all.sh or ./deploy/nats.sh for additional details
 export NATS_DEPLOY_MODE="single"
-- 
GitLab


From cd80faa13caddc80e552f8391081a3555d9e8bb5 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 9 Apr 2024 13:25:48 +0000
Subject: [PATCH 089/602] Service component:

- Corrected format of URLs in OpticalTools.py
---
 src/service/service/tools/OpticalTools.py | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/service/service/tools/OpticalTools.py b/src/service/service/tools/OpticalTools.py
index ad2f8cbec..1837bf688 100644
--- a/src/service/service/tools/OpticalTools.py
+++ b/src/service/service/tools/OpticalTools.py
@@ -109,11 +109,11 @@ def add_lightpath(src, dst, bitrate, bidir, ob_band) -> str:
         if ob_band is None:
             if bidir is None:
                 bidir = 1
-            urlx = "{:s}/AddFlexLightpath/{:s}/{:s}/{:s}/{:s}".format(base_url, src, dst, bitrate, bidir)
+            urlx = "{:s}/AddFlexLightpath/{:s}/{:s}/{:s}/{:s}".format(base_url, src, dst, str(bitrate), str(bidir))
         else:
             if bidir is None:
                 bidir = 1
-            urlx = "{:s}/AddFlexLightpath/{:s}/{:s}/{:s}/{:s}/{:s}".format(base_url, src, dst, bitrate, bidir, ob_band)
+            urlx = "{:s}/AddFlexLightpath/{:s}/{:s}/{:s}/{:s}/{:s}".format(base_url, src, dst, str(bitrate), str(bidir), str(ob_band))
         r = requests.put(urlx, headers=headers)
         reply = r.text 
         return reply
@@ -127,7 +127,7 @@ def add_lightpath(src, dst, bitrate, bidir, ob_band) -> str:
 def get_optical_band(idx) -> str:
     if not TESTING:
         base_url = get_optical_controller_base_url()
-        urlx = "{:s}/GetOpticalBand/{:s}".format(base_url, idx)
+        urlx = "{:s}/GetOpticalBand/{:s}".format(base_url, str(idx))
         headers = {"Content-Type": "application/json"}
         r = requests.get(urlx, headers=headers)
         reply = r.text 
@@ -143,7 +143,7 @@ def delete_lightpath(flow_id, src, dst, bitrate) -> str:
     reply = "200"
     if not TESTING:
         base_url = get_optical_controller_base_url()
-        urlx = "{:s}/DelLightpath/{:s}/{:s}/{:s}/{:s}".format(base_url, flow_id, src, dst, bitrate)
+        urlx = "{:s}/DelLightpath/{:s}/{:s}/{:s}/{:s}".format(base_url, str(flow_id), src, dst, str(bitrate))
 
         headers = {"Content-Type": "application/json"}
         r = requests.delete(urlx, headers=headers)
-- 
GitLab


From f85eaa28fcf6dd586a15fbab371ca5164e135602 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 9 Apr 2024 16:16:44 +0000
Subject: [PATCH 090/602] Context component:

- Corrected case in *opticalconfig* symbols
---
 src/context/service/ContextServiceServicerImpl.py | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/src/context/service/ContextServiceServicerImpl.py b/src/context/service/ContextServiceServicerImpl.py
index a102fa176..379705372 100644
--- a/src/context/service/ContextServiceServicerImpl.py
+++ b/src/context/service/ContextServiceServicerImpl.py
@@ -305,7 +305,7 @@ class ContextServiceServicerImpl(ContextServiceServicer, ContextPolicyServiceSer
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetOpticalConfig(self, request : Empty, context : grpc.ServicerContext) -> OpticalConfigList:
         result = get_opticalconfig(self.db_engine)
-        return OpticalConfigList(OpticalConfigs=result)
+        return OpticalConfigList(opticalconfigs=result)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SetOpticalConfig(self, request : OpticalConfig, context : grpc.ServicerContext) -> OpticalConfigId:
@@ -315,6 +315,4 @@ class ContextServiceServicerImpl(ContextServiceServicer, ContextPolicyServiceSer
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SelectOpticalConfig(self, request : OpticalConfigId, context : grpc.ServicerContext) -> OpticalConfig:
         result = select_opticalconfig(self.db_engine, request)
-        optical_config_id = OpticalConfigId()
-        optical_config_id.CopyFrom(result.OpticalConfig_id)
-        return OpticalConfig(config=result.config, OpticalConfig_id=optical_config_id)
+        return OpticalConfig(config=result.config, opticalconfig_id=result.opticalconfig_id)
-- 
GitLab


From f9fcd9ff532eadec1aed247a348470f4a49e1c27 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 9 Apr 2024 16:32:27 +0000
Subject: [PATCH 091/602] GitLab CI/CD pipeline:

- Deactivated unneeded tests
---
 .gitlab-ci.yml           | 20 ++++++++++----------
 src/tests/.gitlab-ci.yml |  4 ++--
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2d7c2e21b..b33b5b3df 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -22,19 +22,19 @@ stages:
 # include the individual .gitlab-ci.yml of each micro-service and tests
 include:
   #- local: '/manifests/.gitlab-ci.yml'
-  - local: '/src/monitoring/.gitlab-ci.yml'
+  ###- local: '/src/monitoring/.gitlab-ci.yml'
   - local: '/src/nbi/.gitlab-ci.yml'
   - local: '/src/context/.gitlab-ci.yml'
   - local: '/src/device/.gitlab-ci.yml'
   - local: '/src/service/.gitlab-ci.yml'
-  - local: '/src/dbscanserving/.gitlab-ci.yml'
-  - local: '/src/opticalattackmitigator/.gitlab-ci.yml'
-  - local: '/src/opticalattackdetector/.gitlab-ci.yml'
-  - local: '/src/opticalattackmanager/.gitlab-ci.yml'
+  ###- local: '/src/dbscanserving/.gitlab-ci.yml'
+  ###- local: '/src/opticalattackmitigator/.gitlab-ci.yml'
+  ###- local: '/src/opticalattackdetector/.gitlab-ci.yml'
+  ###- local: '/src/opticalattackmanager/.gitlab-ci.yml'
   - local: '/src/opticalcontroller/.gitlab-ci.yml'
-  - local: '/src/ztp/.gitlab-ci.yml'
-  - local: '/src/policy/.gitlab-ci.yml'
-  - local: '/src/forecaster/.gitlab-ci.yml'
+  ###- local: '/src/ztp/.gitlab-ci.yml'
+  ###- local: '/src/policy/.gitlab-ci.yml'
+  ###- local: '/src/forecaster/.gitlab-ci.yml'
   #- local: '/src/webui/.gitlab-ci.yml'
   #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml'
   #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml'
@@ -43,8 +43,8 @@ include:
   #- local: '/src/interdomain/.gitlab-ci.yml'
   - local: '/src/pathcomp/.gitlab-ci.yml'
   #- local: '/src/dlt/.gitlab-ci.yml'
-  - local: '/src/load_generator/.gitlab-ci.yml'
-  - local: '/src/bgpls_speaker/.gitlab-ci.yml'
+  ###- local: '/src/load_generator/.gitlab-ci.yml'
+  ###- local: '/src/bgpls_speaker/.gitlab-ci.yml'
 
   # This should be last one: end-to-end integration tests
   - local: '/src/tests/.gitlab-ci.yml'
diff --git a/src/tests/.gitlab-ci.yml b/src/tests/.gitlab-ci.yml
index b7345bbd1..36bfd6636 100644
--- a/src/tests/.gitlab-ci.yml
+++ b/src/tests/.gitlab-ci.yml
@@ -14,9 +14,9 @@
 
 # include the individual .gitlab-ci.yml of each end-to-end integration test
 include:
-  - local: '/src/tests/ofc22/.gitlab-ci.yml'
+  ###- local: '/src/tests/ofc22/.gitlab-ci.yml'
   #- local: '/src/tests/oeccpsc22/.gitlab-ci.yml'
-  - local: '/src/tests/ecoc22/.gitlab-ci.yml'
+  ###- local: '/src/tests/ecoc22/.gitlab-ci.yml'
   #- local: '/src/tests/nfvsdn22/.gitlab-ci.yml'
   #- local: '/src/tests/ofc23/.gitlab-ci.yml'
   - local: '/src/tests/ofc24/.gitlab-ci.yml'
-- 
GitLab


From 62093d79535c576c000d5038f8c8b5575c6b9af2 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 10 Apr 2024 10:56:23 +0000
Subject: [PATCH 092/602] Optical Controller component:

- Added log message to debug issue
---
 src/opticalcontroller/OpticalController.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/opticalcontroller/OpticalController.py b/src/opticalcontroller/OpticalController.py
index c2805695a..ec8c4db2c 100644
--- a/src/opticalcontroller/OpticalController.py
+++ b/src/opticalcontroller/OpticalController.py
@@ -85,6 +85,7 @@ class AddFlexLightpath(Resource):
         if rsa is not None:
             flow_id, optical_band_id = rsa.rsa_fs_computation(src, dst, bitrate, bidir, band)
             print (f"flow_id {flow_id} and optical_band_id {optical_band_id} ")
+            LOGGER.warning('flow_id={:s} rsa.db_flows={:s}'.format(str(flow_id), str(rsa.db_flows)))
             if flow_id is not None:
                 if rsa.db_flows[flow_id]["op-mode"] == 0:
                     return 'No path found', 404
-- 
GitLab


From 0c68bc65f7ffe72f10f95ed13ac1fc87404d5952 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 11 Apr 2024 13:50:35 +0000
Subject: [PATCH 093/602] comment added to mentioned the place of error during
 KPI_MANAGER tests

---
 src/kpi_manager/tests/test_unitary.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/kpi_manager/tests/test_unitary.py b/src/kpi_manager/tests/test_unitary.py
index 113b26890..b45346d06 100755
--- a/src/kpi_manager/tests/test_unitary.py
+++ b/src/kpi_manager/tests/test_unitary.py
@@ -239,6 +239,7 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab
 # Prepare Environment, should be the first test
 ##################################################
 
+# ERROR on this test --- 
 def test_prepare_environment(
     context_client : ContextClient,                 # pylint: disable=redefined-outer-name,unused-argument
 ):
-- 
GitLab


From 3de99d75ff905e1b38304775752d5144ec9d6143 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 11 Apr 2024 13:51:51 +0000
Subject: [PATCH 094/602] Kafka.sh is added (An automated script to deply
 Apache kafka)

---
 deploy/kafka.sh | 64 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 64 insertions(+)
 create mode 100755 deploy/kafka.sh

diff --git a/deploy/kafka.sh b/deploy/kafka.sh
new file mode 100755
index 000000000..976bec117
--- /dev/null
+++ b/deploy/kafka.sh
@@ -0,0 +1,64 @@
+#!/bin/bash
+# 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.
+
+########################################################################################################################
+# Read deployment settings
+########################################################################################################################
+
+# If not already set, set the namespace where Apache Kafka will be deployed.
+export KFK_NAMESPACE=${KFK_NAMESPACE:-"kafka"}
+
+
+########################################################################################################################
+# Automated steps start here
+########################################################################################################################
+
+# Constants
+TMP_FOLDER="./tmp"
+KFK_MANIFESTS_PATH="manifests/kafka"
+KFK_ZOOKEEPER_MANIFEST="01-zookeeper.yaml"
+KFK_MANIFEST="02-kafka.yaml"
+
+# Create a tmp folder for files modified during the deployment
+TMP_MANIFESTS_FOLDER="${TMP_FOLDER}/${KFK_NAMESPACE}/manifests"
+mkdir -p ${TMP_MANIFESTS_FOLDER}
+
+# copy zookeeper and kafka manifest files to temporary manifest location
+cp "${KFK_MANIFESTS_PATH}/${KFK_ZOOKEEPER_MANIFEST}" "${TMP_MANIFESTS_FOLDER}/${KFK_ZOOKEEPER_MANIFEST}"
+cp "${KFK_MANIFESTS_PATH}/${KFK_MANIFEST}" "${TMP_MANIFESTS_FOLDER}/${KFK_MANIFEST}"
+
+kubectl delete namespace ${KFK_NAMESPACE} --ignore-not-found
+kubectl create namespace ${KFK_NAMESPACE}
+# sleep 2
+# echo "----"
+
+# Kafka zookeeper service should be deployed before the kafka service
+kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/${KFK_ZOOKEEPER_MANIFEST}"
+# kubectl get services --namespace ${KFK_NAMESPACE}
+# echo "----"
+
+KFK_ZOOKEEPER_SERVICE="zookeeper-service"    # this command may be replaced with command to get service name automatically
+KFK_ZOOKEEPER_IP=$(kubectl --namespace ${KFK_NAMESPACE} get service ${KFK_ZOOKEEPER_SERVICE} -o 'jsonpath={.spec.clusterIP}')
+# echo $KFK_ZOOKEEPER_IP
+# echo "----"
+
+# Kafka service should be deployed after the zookeeper service
+sed -i "s//${KFK_ZOOKEEPER_IP}/" "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST"
+# echo "----"
+kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST"
+sleep 5
+kubectl --namespace ${KFK_NAMESPACE} get pods
+
+echo "--- Kafka service deployed sucessfully ---"
\ No newline at end of file
-- 
GitLab


From a0ae85f2b319f06221d7eb1f523e9ec8e052bd1f Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 11 Apr 2024 13:52:31 +0000
Subject: [PATCH 095/602] Apache Kafka manifest files for deployment

---
 manifests/kafka/01-zookeeper.yaml | 40 +++++++++++++++++++++++++++
 manifests/kafka/02-kafka.yaml     | 46 +++++++++++++++++++++++++++++++
 2 files changed, 86 insertions(+)
 create mode 100644 manifests/kafka/01-zookeeper.yaml
 create mode 100644 manifests/kafka/02-kafka.yaml

diff --git a/manifests/kafka/01-zookeeper.yaml b/manifests/kafka/01-zookeeper.yaml
new file mode 100644
index 000000000..0f5ade5d9
--- /dev/null
+++ b/manifests/kafka/01-zookeeper.yaml
@@ -0,0 +1,40 @@
+apiVersion: v1
+kind: Service
+metadata:
+  labels:
+    app: zookeeper-service
+  name: zookeeper-service
+  namespace: kafka
+spec:
+  type: NodePort
+  ports:
+    - name: zookeeper-port
+      port: 2181
+      nodePort: 30181
+      targetPort: 2181
+  selector:
+    app: zookeeper
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  labels:
+    app: zookeeper
+  name: zookeeper
+  namespace: kafka
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: zookeeper
+  template:
+    metadata:
+      labels:
+        app: zookeeper
+    spec:
+      containers:
+        - image: wurstmeister/zookeeper
+          imagePullPolicy: IfNotPresent
+          name: zookeeper
+          ports:
+            - containerPort: 2181
\ No newline at end of file
diff --git a/manifests/kafka/02-kafka.yaml b/manifests/kafka/02-kafka.yaml
new file mode 100644
index 000000000..8a2b51724
--- /dev/null
+++ b/manifests/kafka/02-kafka.yaml
@@ -0,0 +1,46 @@
+apiVersion: v1
+kind: Service
+metadata:
+  labels:
+    app: kafka-broker
+  name: kafka-service
+  namespace: kafka
+spec:
+  ports:
+  - port: 9092
+  selector:
+    app: kafka-broker
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  labels:
+    app: kafka-broker
+  name: kafka-broker
+  namespace: kafka
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: kafka-broker
+  template:
+    metadata:
+      labels:
+        app: kafka-broker
+    spec:
+      hostname: kafka-broker
+      containers:
+      - env:
+        - name: KAFKA_BROKER_ID
+          value: "1"
+        - name: KAFKA_ZOOKEEPER_CONNECT
+          value: :2181
+        - name: KAFKA_LISTENERS
+          value: PLAINTEXT://:9092
+        - name: KAFKA_ADVERTISED_LISTENERS
+          value: PLAINTEXT://localhost:9092
+        image: wurstmeister/kafka
+        imagePullPolicy: IfNotPresent
+        name: kafka-broker
+        ports:
+          - containerPort: 9092
\ No newline at end of file
-- 
GitLab


From 2e0889be589f100d22ae6246ebaac0ef967010ac Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 11 Apr 2024 13:54:00 +0000
Subject: [PATCH 096/602] packages version changed to pre-tested versions.

---
 src/monitoring/requirements.in | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/src/monitoring/requirements.in b/src/monitoring/requirements.in
index 4e57dd019..bea1bc165 100644
--- a/src/monitoring/requirements.in
+++ b/src/monitoring/requirements.in
@@ -32,3 +32,15 @@ requests==2.27.1
 xmltodict==0.12.0
 questdb==1.0.1
 psycopg2-binary==2.9.3
+coverage==6.3
+grpcio==1.47.*
+grpcio-health-checking==1.47.*
+grpcio-tools==1.47.*
+grpclib==0.4.4
+prettytable==3.5.0
+prometheus-client==0.13.0
+protobuf==3.20.*
+pytest==6.2.5
+pytest-benchmark==3.4.1
+python-dateutil==2.8.2
+pytest-depends==1.0.1
-- 
GitLab


From 2fc6a4982fea2681100e2737a8b43d22d19b6ed6 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 11 Apr 2024 13:54:46 +0000
Subject: [PATCH 097/602] Apache Kafka enviornment variable is added.

---
 my_deploy.sh | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/my_deploy.sh b/my_deploy.sh
index 5bd58d0dc..74c293619 100755
--- a/my_deploy.sh
+++ b/my_deploy.sh
@@ -154,3 +154,10 @@ export PROM_EXT_PORT_HTTP="9090"
 
 # Set the external port Grafana HTTP Dashboards will be exposed to.
 export GRAF_EXT_PORT_HTTP="3000"
+
+
+# ----- Apache Kafka -----------------------------------------------------------
+
+# Set the namespace where Apache Kafka will be deployed.
+export KFK_NAMESPACE="kafka"
+
-- 
GitLab


From bf8f0f3b38c3e4e94a08879f2f4f0a6a11a4fe0b Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Thu, 11 Apr 2024 15:44:26 +0000
Subject: [PATCH 098/602] Service component:

- Corrected config generation in TaskExecutor::configure_optical_device()
---
 src/service/service/task_scheduler/TaskExecutor.py | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/src/service/service/task_scheduler/TaskExecutor.py b/src/service/service/task_scheduler/TaskExecutor.py
index 5c5747970..fdfcb903b 100644
--- a/src/service/service/task_scheduler/TaskExecutor.py
+++ b/src/service/service/task_scheduler/TaskExecutor.py
@@ -122,17 +122,16 @@ class TaskExecutor:
         optical_config_id = OpticalConfigId()
         optical_config_id.opticalconfig_uuid = device.device_id.device_uuid.uuid
         optical_config = OpticalConfig()
-        setting = settings.value if settings else ""
+        setting = settings.value if settings else ''
 
-        new_config = {}
         try:
             result = self._context_client.SelectOpticalConfig(optical_config_id)
-            new_config = json.loads(result.config)
-            if result is not None :
+            if result is not None:
+                new_config = json.loads(result.config)
                 new_config["new_config"] = setting
                 new_config["is_opticalband"] = is_opticalband
                 new_config["flow"] = flows
-                result.config = str(new_config)
+                result.config = json.dumps(new_config)
                 optical_config.CopyFrom(result)
                 self._device_client.ConfigureOpticalDevice(optical_config)
             self._store_grpc_object(CacheableObjectType.DEVICE, device_key, device)
-- 
GitLab


From 14db9b7c6317d021d29c88541593eb716a1804cf Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Thu, 11 Apr 2024 15:46:01 +0000
Subject: [PATCH 099/602] OFC'24 test:

- Corrected tests create/delete service unidir/bidir
- Added run-tests-locally.sh script
- Removed unneeded README.md file
---
 src/tests/ofc24/README.md                     | 21 -----
 src/tests/ofc24/run-tests-locally.sh          | 22 ++++++
 .../test_functional_create_service_bidir.py   | 30 ++++----
 .../test_functional_create_service_unidir.py  | 30 ++++----
 .../test_functional_delete_service_bidir.py   | 76 ++++++++-----------
 .../test_functional_delete_service_unidir.py  | 76 ++++++++-----------
 6 files changed, 116 insertions(+), 139 deletions(-)
 delete mode 100644 src/tests/ofc24/README.md
 create mode 100755 src/tests/ofc24/run-tests-locally.sh

diff --git a/src/tests/ofc24/README.md b/src/tests/ofc24/README.md
deleted file mode 100644
index 93e95fc64..000000000
--- a/src/tests/ofc24/README.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# OFC'24 - Test scenario
-
-## Start Topology
-Topology is composed of 2 transponders managed through OpenConfig and 2 Multi-granular ROAMDS
-Strat the topology executing the following command:
-```bash
-sudo ./start_topo.sh
-```
-
-## Populate the TFS context and topology
-Pushing the JSON files following the file indexes, i.e, 1, 2, 3, ...
-The last JSON file with ID 7 is the service.
-To check the service is onboarded successfully go into the TFS WebUI and check the `Service` tab.
-
-## Check configuration in devices
-Check if the devices are configured properly.
-To check that, run, for each device (X={1, 2, 3, 4}):
-```bash
-screen -r tX
-```
-To release the terminal, press `Ctrl + A + D`
diff --git a/src/tests/ofc24/run-tests-locally.sh b/src/tests/ofc24/run-tests-locally.sh
new file mode 100755
index 000000000..14cf78500
--- /dev/null
+++ b/src/tests/ofc24/run-tests-locally.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+# 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.
+
+source ~/tfs-ctrl/tfs_runtime_env_vars.sh
+pytest --verbose --log-level=INFO ~/tfs-ctrl/ofc24/tests/test_functional_bootstrap.py
+pytest --verbose --log-level=INFO ~/tfs-ctrl/ofc24/tests/test_functional_create_service_unidir.py
+pytest --verbose --log-level=INFO ~/tfs-ctrl/ofc24/tests/test_functional_delete_service_unidir.py
+pytest --verbose --log-level=INFO ~/tfs-ctrl/ofc24/tests/test_functional_create_service_bidir.py
+pytest --verbose --log-level=INFO ~/tfs-ctrl/ofc24/tests/test_functional_delete_service_bidir.py
+pytest --verbose --log-level=INFO ~/tfs-ctrl/ofc24/tests/test_functional_cleanup.py
diff --git a/src/tests/ofc24/tests/test_functional_create_service_bidir.py b/src/tests/ofc24/tests/test_functional_create_service_bidir.py
index 82408eaa5..e910c946d 100644
--- a/src/tests/ofc24/tests/test_functional_create_service_bidir.py
+++ b/src/tests/ofc24/tests/test_functional_create_service_bidir.py
@@ -14,7 +14,7 @@
 
 import logging, os
 from common.Constants import DEFAULT_CONTEXT_NAME
-from common.proto.context_pb2 import ContextId, ServiceTypeEnum
+from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum
 from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results
 from common.tools.grpc.Tools import grpc_message_to_json_string
 from common.tools.object_factory.Context import json_context_id
@@ -41,32 +41,32 @@ def test_service_creation_bidir(
     )
     results = descriptor_loader.process()
     check_descriptor_load_results(results, descriptor_loader)
-    descriptor_loader.validate()
 
-    # Verify the scenario has no services/slices
+    # Verify the scenario has 1 service and 0 slices
     response = context_client.GetContext(ADMIN_CONTEXT_ID)
-    #assert len(response.service_ids) == 0
-    #assert len(response.slice_ids) == 0
+    assert len(response.service_ids) == 1
+    assert len(response.slice_ids) == 0
 
-    # Ensure slices and services are created
+    # Check there are no slices
     response = context_client.ListSlices(ADMIN_CONTEXT_ID)
     LOGGER.warning('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response)))
-    #assert len(response.slices) == 1 # OSM slice
+    assert len(response.slices) == 0
 
+    # Check there is 1 service
     response = context_client.ListServices(ADMIN_CONTEXT_ID)
     LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response)))
-    #assert len(response.services) == 2 # 1xL3NM + 1xTAPI
+    assert len(response.services) == 1
 
     for service in response.services:
         service_id = service.service_id
+        assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE
+
         response = context_client.ListConnections(service_id)
         LOGGER.warning('  ServiceId[{:s}] => Connections[{:d}] = {:s}'.format(
             grpc_message_to_json_string(service_id), len(response.connections), grpc_message_to_json_string(response)))
 
-        #if service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM:
-        #    assert len(response.connections) == 1 # 1 connection per service
-        #elif service.service_type == ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE:
-        #    assert len(response.connections) == 1 # 1 connection per service
-        #else:
-        #    str_service = grpc_message_to_json_string(service)
-        #    raise Exception('Unexpected ServiceType: {:s}'.format(str_service))
+        if service.service_type == ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY:
+            assert len(response.connections) == 2
+        else:
+            str_service = grpc_message_to_json_string(service)
+            raise Exception('Unexpected ServiceType: {:s}'.format(str_service))
diff --git a/src/tests/ofc24/tests/test_functional_create_service_unidir.py b/src/tests/ofc24/tests/test_functional_create_service_unidir.py
index 1cc0f43ce..5b2550ae1 100644
--- a/src/tests/ofc24/tests/test_functional_create_service_unidir.py
+++ b/src/tests/ofc24/tests/test_functional_create_service_unidir.py
@@ -14,7 +14,7 @@
 
 import logging, os
 from common.Constants import DEFAULT_CONTEXT_NAME
-from common.proto.context_pb2 import ContextId, ServiceTypeEnum
+from common.proto.context_pb2 import ContextId, ServiceStatusEnum, ServiceTypeEnum
 from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results
 from common.tools.grpc.Tools import grpc_message_to_json_string
 from common.tools.object_factory.Context import json_context_id
@@ -41,32 +41,32 @@ def test_service_creation_unidir(
     )
     results = descriptor_loader.process()
     check_descriptor_load_results(results, descriptor_loader)
-    descriptor_loader.validate()
 
-    # Verify the scenario has no services/slices
+    # Verify the scenario has 1 service and 0 slices
     response = context_client.GetContext(ADMIN_CONTEXT_ID)
-    #assert len(response.service_ids) == 0
-    #assert len(response.slice_ids) == 0
+    assert len(response.service_ids) == 1
+    assert len(response.slice_ids) == 0
 
-    # Ensure slices and services are created
+    # Check there are no slices
     response = context_client.ListSlices(ADMIN_CONTEXT_ID)
     LOGGER.warning('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response)))
-    #assert len(response.slices) == 1 # OSM slice
+    assert len(response.slices) == 0
 
+    # Check there is 1 service
     response = context_client.ListServices(ADMIN_CONTEXT_ID)
     LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response)))
-    #assert len(response.services) == 2 # 1xL3NM + 1xTAPI
+    assert len(response.services) == 1
 
     for service in response.services:
         service_id = service.service_id
+        assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE
+
         response = context_client.ListConnections(service_id)
         LOGGER.warning('  ServiceId[{:s}] => Connections[{:d}] = {:s}'.format(
             grpc_message_to_json_string(service_id), len(response.connections), grpc_message_to_json_string(response)))
 
-        #if service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM:
-        #    assert len(response.connections) == 1 # 1 connection per service
-        #elif service.service_type == ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE:
-        #    assert len(response.connections) == 1 # 1 connection per service
-        #else:
-        #    str_service = grpc_message_to_json_string(service)
-        #    raise Exception('Unexpected ServiceType: {:s}'.format(str_service))
+        if service.service_type == ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY:
+            assert len(response.connections) == 2
+        else:
+            str_service = grpc_message_to_json_string(service)
+            raise Exception('Unexpected ServiceType: {:s}'.format(str_service))
diff --git a/src/tests/ofc24/tests/test_functional_delete_service_bidir.py b/src/tests/ofc24/tests/test_functional_delete_service_bidir.py
index ee0572df2..a337336a8 100644
--- a/src/tests/ofc24/tests/test_functional_delete_service_bidir.py
+++ b/src/tests/ofc24/tests/test_functional_delete_service_bidir.py
@@ -12,79 +12,67 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import logging, os
+import logging
+from typing import Set, Tuple
 from common.Constants import DEFAULT_CONTEXT_NAME
-from common.proto.context_pb2 import ContextId, ServiceId, ServiceTypeEnum
-from common.tools.descriptor.Loader import DescriptorLoader
+from common.proto.context_pb2 import ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum
 from common.tools.grpc.Tools import grpc_message_to_json_string
 from common.tools.object_factory.Context import json_context_id
+from common.tools.object_factory.Service import json_service_id
 from context.client.ContextClient import ContextClient
-from device.client.DeviceClient import DeviceClient
 from service.client.ServiceClient import ServiceClient
-from tests.Fixtures import context_client, device_client, service_client        # pylint: disable=unused-import
+from tests.Fixtures import context_client, service_client   # pylint: disable=unused-import
 
 LOGGER = logging.getLogger(__name__)
 LOGGER.setLevel(logging.DEBUG)
 
-DESCRIPTOR_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'descriptors', 'service-bidir.json')
 ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME))
 
 def test_service_removal_bidir(
     context_client : ContextClient, # pylint: disable=redefined-outer-name
-    device_client  : DeviceClient,  # pylint: disable=redefined-outer-name
     service_client : ServiceClient, # pylint: disable=redefined-outer-name
 ):
-    # Load descriptors and validate the base scenario
-    descriptor_loader = DescriptorLoader(
-        descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client,
-        service_client=service_client
-    )
-    descriptor_loader.validate()
-
-    # Verify the scenario has no services/slices
+    # Verify the scenario has 1 service and 0 slices
     response = context_client.GetContext(ADMIN_CONTEXT_ID)
-    #assert len(response.service_ids) == 0
-    #assert len(response.slice_ids) == 0
+    assert len(response.service_ids) == 1
+    assert len(response.slice_ids) == 0
 
-    # Ensure slices and services are created
+    # Check there are no slices
     response = context_client.ListSlices(ADMIN_CONTEXT_ID)
     LOGGER.warning('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response)))
-    #assert len(response.slices) == 1 # OSM slice
+    assert len(response.slices) == 0
 
+    # Check there is 1 service
     response = context_client.ListServices(ADMIN_CONTEXT_ID)
     LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response)))
-    #assert len(response.services) == 2 # 1xL3NM + 1xTAPI
+    assert len(response.services) == 1
 
-    #service_uuids = set()
+    context_service_uuids : Set[Tuple[str, str]] = set()
     for service in response.services:
         service_id = service.service_id
+        assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE
+
         response = context_client.ListConnections(service_id)
         LOGGER.warning('  ServiceId[{:s}] => Connections[{:d}] = {:s}'.format(
             grpc_message_to_json_string(service_id), len(response.connections), grpc_message_to_json_string(response)))
 
-        #if service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM:
-        #    assert len(response.connections) == 1 # 1 connection per service
-        #    service_uuid = service_id.service_uuid.uuid
-        #    service_uuids.add(service_uuid)
-        #    osm_wim.conn_info[service_uuid] = {}
-        #elif service.service_type == ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE:
-        #    assert len(response.connections) == 1 # 1 connection per service
-        #else:
-        #    str_service = grpc_message_to_json_string(service)
-        #    raise Exception('Unexpected ServiceType: {:s}'.format(str_service))
+        if service.service_type == ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY:
+            assert len(response.connections) == 2
+            context_uuid = service_id.context_id.context_uuid.uuid
+            service_uuid = service_id.service_uuid.uuid
+            context_service_uuids.add((context_uuid, service_uuid))
+        else:
+            str_service = grpc_message_to_json_string(service)
+            raise Exception('Unexpected ServiceType: {:s}'.format(str_service))
 
-    ## Identify service to delete
-    #assert len(service_uuids) == 1  # assume a single L3NM service has been created
-    #service_uuid = set(service_uuids).pop()
+    # Identify service to delete
+    assert len(context_service_uuids) == 1
+    context_uuid, service_uuid = set(context_service_uuids).pop()
 
-    ## Delete Service
-    #service_client.DeleteService(ServiceId(json_service_id(service_uuid, context_uuid)))
+    # Delete Service
+    service_client.DeleteService(ServiceId(**json_service_id(service_uuid, json_context_id(context_uuid))))
 
-    ## Verify the scenario has no services/slices
-    #response = context_client.GetContext(ADMIN_CONTEXT_ID)
-    #assert len(response.service_ids) == 0
-    #assert len(response.slice_ids) == 0
-
-    ## Load descriptors and validate the base scenario
-    #descriptor_loader = DescriptorLoader(descriptors_file=DESCRIPTOR_FILE, context_client=context_client)
-    #descriptor_loader.validate()
+    # Verify the scenario has no services/slices
+    response = context_client.GetContext(ADMIN_CONTEXT_ID)
+    assert len(response.service_ids) == 0
+    assert len(response.slice_ids) == 0
diff --git a/src/tests/ofc24/tests/test_functional_delete_service_unidir.py b/src/tests/ofc24/tests/test_functional_delete_service_unidir.py
index 0861b103c..9b0381c49 100644
--- a/src/tests/ofc24/tests/test_functional_delete_service_unidir.py
+++ b/src/tests/ofc24/tests/test_functional_delete_service_unidir.py
@@ -12,79 +12,67 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import logging, os
+import logging
+from typing import Set, Tuple
 from common.Constants import DEFAULT_CONTEXT_NAME
-from common.proto.context_pb2 import ContextId, ServiceId, ServiceTypeEnum
-from common.tools.descriptor.Loader import DescriptorLoader
+from common.proto.context_pb2 import ContextId, ServiceId, ServiceStatusEnum, ServiceTypeEnum
 from common.tools.grpc.Tools import grpc_message_to_json_string
 from common.tools.object_factory.Context import json_context_id
+from common.tools.object_factory.Service import json_service_id
 from context.client.ContextClient import ContextClient
-from device.client.DeviceClient import DeviceClient
 from service.client.ServiceClient import ServiceClient
-from tests.Fixtures import context_client, device_client, service_client        # pylint: disable=unused-import
+from tests.Fixtures import context_client, service_client   # pylint: disable=unused-import
 
 LOGGER = logging.getLogger(__name__)
 LOGGER.setLevel(logging.DEBUG)
 
-DESCRIPTOR_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'descriptors', 'service-unidir.json')
 ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME))
 
 def test_service_removal_unidir(
     context_client : ContextClient, # pylint: disable=redefined-outer-name
-    device_client  : DeviceClient,  # pylint: disable=redefined-outer-name
     service_client : ServiceClient, # pylint: disable=redefined-outer-name
 ):
-    # Load descriptors and validate the base scenario
-    descriptor_loader = DescriptorLoader(
-        descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client,
-        service_client=service_client
-    )
-    descriptor_loader.validate()
-
-    # Verify the scenario has no services/slices
+    # Verify the scenario has 1 service and 0 slices
     response = context_client.GetContext(ADMIN_CONTEXT_ID)
-    #assert len(response.service_ids) == 0
-    #assert len(response.slice_ids) == 0
+    assert len(response.service_ids) == 1
+    assert len(response.slice_ids) == 0
 
-    # Ensure slices and services are created
+    # Check there are no slices
     response = context_client.ListSlices(ADMIN_CONTEXT_ID)
     LOGGER.warning('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response)))
-    #assert len(response.slices) == 1 # OSM slice
+    assert len(response.slices) == 0
 
+    # Check there is 1 service
     response = context_client.ListServices(ADMIN_CONTEXT_ID)
     LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response)))
-    #assert len(response.services) == 2 # 1xL3NM + 1xTAPI
+    assert len(response.services) == 1
 
-    #service_uuids = set()
+    context_service_uuids : Set[Tuple[str, str]] = set()
     for service in response.services:
         service_id = service.service_id
+        assert service.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE
+
         response = context_client.ListConnections(service_id)
         LOGGER.warning('  ServiceId[{:s}] => Connections[{:d}] = {:s}'.format(
             grpc_message_to_json_string(service_id), len(response.connections), grpc_message_to_json_string(response)))
 
-        #if service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM:
-        #    assert len(response.connections) == 1 # 1 connection per service
-        #    service_uuid = service_id.service_uuid.uuid
-        #    service_uuids.add(service_uuid)
-        #    osm_wim.conn_info[service_uuid] = {}
-        #elif service.service_type == ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE:
-        #    assert len(response.connections) == 1 # 1 connection per service
-        #else:
-        #    str_service = grpc_message_to_json_string(service)
-        #    raise Exception('Unexpected ServiceType: {:s}'.format(str_service))
+        if service.service_type == ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY:
+            assert len(response.connections) == 2
+            context_uuid = service_id.context_id.context_uuid.uuid
+            service_uuid = service_id.service_uuid.uuid
+            context_service_uuids.add((context_uuid, service_uuid))
+        else:
+            str_service = grpc_message_to_json_string(service)
+            raise Exception('Unexpected ServiceType: {:s}'.format(str_service))
 
-    ## Identify service to delete
-    #assert len(service_uuids) == 1  # assume a single L3NM service has been created
-    #service_uuid = set(service_uuids).pop()
+    # Identify service to delete
+    assert len(context_service_uuids) == 1
+    context_uuid, service_uuid = set(context_service_uuids).pop()
 
-    ## Delete Service
-    #service_client.DeleteService(ServiceId(json_service_id(service_uuid, context_uuid)))
+    # Delete Service
+    service_client.DeleteService(ServiceId(**json_service_id(service_uuid, json_context_id(context_uuid))))
 
-    ## Verify the scenario has no services/slices
-    #response = context_client.GetContext(ADMIN_CONTEXT_ID)
-    #assert len(response.service_ids) == 0
-    #assert len(response.slice_ids) == 0
-
-    ## Load descriptors and validate the base scenario
-    #descriptor_loader = DescriptorLoader(descriptors_file=DESCRIPTOR_FILE, context_client=context_client)
-    #descriptor_loader.validate()
+    # Verify the scenario has no services/slices
+    response = context_client.GetContext(ADMIN_CONTEXT_ID)
+    assert len(response.service_ids) == 0
+    assert len(response.slice_ids) == 0
-- 
GitLab


From 9790bd3c5bceb401161cf7c50a3edb58ac52cf85 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Thu, 11 Apr 2024 16:13:11 +0000
Subject: [PATCH 100/602] GitLab CI/CD pipeline:

- Reactivated tests
---
 .gitlab-ci.yml           | 20 ++++++++++----------
 src/tests/.gitlab-ci.yml |  4 ++--
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b33b5b3df..2d7c2e21b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -22,19 +22,19 @@ stages:
 # include the individual .gitlab-ci.yml of each micro-service and tests
 include:
   #- local: '/manifests/.gitlab-ci.yml'
-  ###- local: '/src/monitoring/.gitlab-ci.yml'
+  - local: '/src/monitoring/.gitlab-ci.yml'
   - local: '/src/nbi/.gitlab-ci.yml'
   - local: '/src/context/.gitlab-ci.yml'
   - local: '/src/device/.gitlab-ci.yml'
   - local: '/src/service/.gitlab-ci.yml'
-  ###- local: '/src/dbscanserving/.gitlab-ci.yml'
-  ###- local: '/src/opticalattackmitigator/.gitlab-ci.yml'
-  ###- local: '/src/opticalattackdetector/.gitlab-ci.yml'
-  ###- local: '/src/opticalattackmanager/.gitlab-ci.yml'
+  - local: '/src/dbscanserving/.gitlab-ci.yml'
+  - local: '/src/opticalattackmitigator/.gitlab-ci.yml'
+  - local: '/src/opticalattackdetector/.gitlab-ci.yml'
+  - local: '/src/opticalattackmanager/.gitlab-ci.yml'
   - local: '/src/opticalcontroller/.gitlab-ci.yml'
-  ###- local: '/src/ztp/.gitlab-ci.yml'
-  ###- local: '/src/policy/.gitlab-ci.yml'
-  ###- local: '/src/forecaster/.gitlab-ci.yml'
+  - local: '/src/ztp/.gitlab-ci.yml'
+  - local: '/src/policy/.gitlab-ci.yml'
+  - local: '/src/forecaster/.gitlab-ci.yml'
   #- local: '/src/webui/.gitlab-ci.yml'
   #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml'
   #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml'
@@ -43,8 +43,8 @@ include:
   #- local: '/src/interdomain/.gitlab-ci.yml'
   - local: '/src/pathcomp/.gitlab-ci.yml'
   #- local: '/src/dlt/.gitlab-ci.yml'
-  ###- local: '/src/load_generator/.gitlab-ci.yml'
-  ###- local: '/src/bgpls_speaker/.gitlab-ci.yml'
+  - local: '/src/load_generator/.gitlab-ci.yml'
+  - local: '/src/bgpls_speaker/.gitlab-ci.yml'
 
   # This should be last one: end-to-end integration tests
   - local: '/src/tests/.gitlab-ci.yml'
diff --git a/src/tests/.gitlab-ci.yml b/src/tests/.gitlab-ci.yml
index 36bfd6636..b7345bbd1 100644
--- a/src/tests/.gitlab-ci.yml
+++ b/src/tests/.gitlab-ci.yml
@@ -14,9 +14,9 @@
 
 # include the individual .gitlab-ci.yml of each end-to-end integration test
 include:
-  ###- local: '/src/tests/ofc22/.gitlab-ci.yml'
+  - local: '/src/tests/ofc22/.gitlab-ci.yml'
   #- local: '/src/tests/oeccpsc22/.gitlab-ci.yml'
-  ###- local: '/src/tests/ecoc22/.gitlab-ci.yml'
+  - local: '/src/tests/ecoc22/.gitlab-ci.yml'
   #- local: '/src/tests/nfvsdn22/.gitlab-ci.yml'
   #- local: '/src/tests/ofc23/.gitlab-ci.yml'
   - local: '/src/tests/ofc24/.gitlab-ci.yml'
-- 
GitLab


From a419c7b6e8457ad10a72c406c09822c568ff5b9f Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Thu, 11 Apr 2024 16:22:23 +0000
Subject: [PATCH 101/602] Deploy scripts:

- Corrected deployment order in my_deploy.sh for opticalcontroller and service components
---
 my_deploy.sh | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/my_deploy.sh b/my_deploy.sh
index 7dd5e5c3e..4e705622b 100755
--- a/my_deploy.sh
+++ b/my_deploy.sh
@@ -29,7 +29,14 @@ export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_gene
 #export TFS_COMPONENTS="${TFS_COMPONENTS} bgpls_speaker"
 
 # Uncomment to activate Optical Controller
-#export TFS_COMPONENTS="${TFS_COMPONENTS} opticalcontroller"
+#   To manage optical connections, "service" requires "opticalcontroller" to be deployed
+#   before "service", thus we "hack" the TFS_COMPONENTS environment variable prepending the
+#   "opticalcontroller" only if "service" is already in TFS_COMPONENTS, and re-export it.
+#if [[ "$TFS_COMPONENTS" == *"service"* ]]; then
+#    BEFORE="${TFS_COMPONENTS% service*}"
+#    AFTER="${TFS_COMPONENTS#* service}"
+#    export TFS_COMPONENTS="${BEFORE} opticalcontroller service ${AFTER}"
+#fi
 
 # Uncomment to activate ZTP
 #export TFS_COMPONENTS="${TFS_COMPONENTS} ztp"
-- 
GitLab


From 62a30586927deb2442baa266f7386d49fd2a8ee7 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Thu, 11 Apr 2024 16:23:47 +0000
Subject: [PATCH 102/602] Optical Controller component:

- Reduced level of some debug log messages
---
 src/opticalcontroller/OpticalController.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/opticalcontroller/OpticalController.py b/src/opticalcontroller/OpticalController.py
index ec8c4db2c..326862f93 100644
--- a/src/opticalcontroller/OpticalController.py
+++ b/src/opticalcontroller/OpticalController.py
@@ -85,7 +85,7 @@ class AddFlexLightpath(Resource):
         if rsa is not None:
             flow_id, optical_band_id = rsa.rsa_fs_computation(src, dst, bitrate, bidir, band)
             print (f"flow_id {flow_id} and optical_band_id {optical_band_id} ")
-            LOGGER.warning('flow_id={:s} rsa.db_flows={:s}'.format(str(flow_id), str(rsa.db_flows)))
+            LOGGER.debug('flow_id={:s} rsa.db_flows={:s}'.format(str(flow_id), str(rsa.db_flows)))
             if flow_id is not None:
                 if rsa.db_flows[flow_id]["op-mode"] == 0:
                     return 'No path found', 404
-- 
GitLab


From 3a00a55c67a4105fcadc6e9944bf8f598b6ed1b9 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 12 Apr 2024 09:05:59 +0000
Subject: [PATCH 103/602] Improvement in Kafka deployment script

---
 deploy/kafka.sh | 27 ++++++++++++++++-----------
 1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/deploy/kafka.sh b/deploy/kafka.sh
index 976bec117..f2fb666b5 100755
--- a/deploy/kafka.sh
+++ b/deploy/kafka.sh
@@ -39,26 +39,31 @@ mkdir -p ${TMP_MANIFESTS_FOLDER}
 cp "${KFK_MANIFESTS_PATH}/${KFK_ZOOKEEPER_MANIFEST}" "${TMP_MANIFESTS_FOLDER}/${KFK_ZOOKEEPER_MANIFEST}"
 cp "${KFK_MANIFESTS_PATH}/${KFK_MANIFEST}" "${TMP_MANIFESTS_FOLDER}/${KFK_MANIFEST}"
 
+echo "Apache Kafka Namespace"
+echo ">>> Delete Apache Kafka Namespace"
 kubectl delete namespace ${KFK_NAMESPACE} --ignore-not-found
+
+echo ">>> Create Apache Kafka Namespace"
 kubectl create namespace ${KFK_NAMESPACE}
-# sleep 2
-# echo "----"
 
+echo ">>> Deplying Apache Kafka Zookeeper"
 # Kafka zookeeper service should be deployed before the kafka service
 kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/${KFK_ZOOKEEPER_MANIFEST}"
-# kubectl get services --namespace ${KFK_NAMESPACE}
-# echo "----"
 
-KFK_ZOOKEEPER_SERVICE="zookeeper-service"    # this command may be replaced with command to get service name automatically
+KFK_ZOOKEEPER_SERVICE="zookeeper-service"    # this command may be replaced with command to extract service name automatically
 KFK_ZOOKEEPER_IP=$(kubectl --namespace ${KFK_NAMESPACE} get service ${KFK_ZOOKEEPER_SERVICE} -o 'jsonpath={.spec.clusterIP}')
-# echo $KFK_ZOOKEEPER_IP
-# echo "----"
 
 # Kafka service should be deployed after the zookeeper service
 sed -i "s//${KFK_ZOOKEEPER_IP}/" "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST"
-# echo "----"
+
+echo ">>> Deploying Apache Kafka Broker"
 kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST"
-sleep 5
-kubectl --namespace ${KFK_NAMESPACE} get pods
 
-echo "--- Kafka service deployed sucessfully ---"
\ No newline at end of file
+echo ">>> Verifing Apache Kafka deployment"
+sleep 5
+KFK_PODS_STATUS=$(kubectl --namespace ${KFK_NAMESPACE} get pods)
+if echo "$KFK_PODS_STATUS" | grep -qEv 'STATUS|Running'; then
+    echo "Deployment Error: $KFK_PODS_STATUS"
+else
+    echo "$KFK_PODS_STATUS"
+fi
\ No newline at end of file
-- 
GitLab


From 3364f79c439ed0b7f15a5766da342bf38d9f46a3 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Fri, 12 Apr 2024 12:52:08 +0000
Subject: [PATCH 104/602] Scripts:

- Updated license headers in update_license_headers.py script
---
 scripts/update_license_headers.py | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/scripts/update_license_headers.py b/scripts/update_license_headers.py
index 45baf39e0..62bfffd0e 100644
--- a/scripts/update_license_headers.py
+++ b/scripts/update_license_headers.py
@@ -27,8 +27,9 @@ FILE_PATH_SKIPPED    = 'out-skipped.txt'
 FILE_PATH_NO_HEADER  = 'out-no-header.txt'
 FILE_PATH_UPDATED    = 'out-updated.txt'
 
-RE_OLD_COPYRIGHT  = re.compile(r'Copyright\ 2021\-2023\ H2020\ TeraFlow\ \(https\:\/\/www\.teraflow\-h2020\.eu\/\)')
-STR_NEW_COPYRIGHT = 'Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)'
+#RE_OLD_COPYRIGHT  = re.compile(r'Copyright\ 2021\-2023\ H2020\ TeraFlow\ \(https\:\/\/www\.teraflow\-h2020\.eu\/\)')
+RE_OLD_COPYRIGHT  = re.compile(r'Copyright\ 2022\-2023\ ETSI\ TeraFlowSDN\ \-\ TFS\ OSG\ \(https\:\/\/tfs\.etsi\.org\/\)')
+STR_NEW_COPYRIGHT = 'Copyright 2022-2024 ETSI TeraFlowSDN - TFS OSG/SDG (https://tfs.etsi.org/)'
 
 def skip_file(file_path : str) -> bool:
     if file_path.endswith('.pyc'): return True
-- 
GitLab


From 1e84d8c0d014103faf42c6c5226ca249c42356db Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Mon, 15 Apr 2024 17:16:58 +0000
Subject: [PATCH 105/602] Scripts:

- Updated license headers in update_license_headers.py script
---
 scripts/update_license_headers.py | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/scripts/update_license_headers.py b/scripts/update_license_headers.py
index 62bfffd0e..88f511387 100644
--- a/scripts/update_license_headers.py
+++ b/scripts/update_license_headers.py
@@ -27,8 +27,10 @@ FILE_PATH_SKIPPED    = 'out-skipped.txt'
 FILE_PATH_NO_HEADER  = 'out-no-header.txt'
 FILE_PATH_UPDATED    = 'out-updated.txt'
 
-#RE_OLD_COPYRIGHT  = re.compile(r'Copyright\ 2021\-2023\ H2020\ TeraFlow\ \(https\:\/\/www\.teraflow\-h2020\.eu\/\)')
-RE_OLD_COPYRIGHT  = re.compile(r'Copyright\ 2022\-2023\ ETSI\ TeraFlowSDN\ \-\ TFS\ OSG\ \(https\:\/\/tfs\.etsi\.org\/\)')
+RE_OLD_COPYRIGHTS = [
+    re.compile(r'Copyright\ 2021\-2023\ H2020\ TeraFlow\ \(https\:\/\/www\.teraflow\-h2020\.eu\/\)'),
+    re.compile(r'Copyright\ 2022\-2023\ ETSI\ TeraFlowSDN\ \-\ TFS\ OSG\ \(https\:\/\/tfs\.etsi\.org\/\)'),
+]
 STR_NEW_COPYRIGHT = 'Copyright 2022-2024 ETSI TeraFlowSDN - TFS OSG/SDG (https://tfs.etsi.org/)'
 
 def skip_file(file_path : str) -> bool:
@@ -68,8 +70,10 @@ def skip_file(file_path : str) -> bool:
     return False
 
 def process_line(line_in : str) -> str:
-    line_out = RE_OLD_COPYRIGHT.sub(STR_NEW_COPYRIGHT, line_in)
-    if line_out != line_in: return line_out
+    for re_old_copyright in RE_OLD_COPYRIGHTS:
+        if re_old_copyright.match(line_in) is None: continue
+        line_out = re_old_copyright.sub(STR_NEW_COPYRIGHT, line_in)
+        return line_out
     return line_in
 
 def process_file(
-- 
GitLab


From 0989a478c64c7dab0399988efc72cd7439f83612 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Mon, 15 Apr 2024 17:19:02 +0000
Subject: [PATCH 106/602] Scripts:

- Updated file mode update in update_license_headers.py script
---
 scripts/update_license_headers.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/scripts/update_license_headers.py b/scripts/update_license_headers.py
index 88f511387..62a166f17 100644
--- a/scripts/update_license_headers.py
+++ b/scripts/update_license_headers.py
@@ -87,6 +87,7 @@ def process_file(
 
     temp_file_path = file_path + '.temp'
     replaced = False
+    file_mode = os.stat(file_path)
     try:
         with open(file_path, encoding='UTF-8') as source:
             with open(temp_file_path, 'w', encoding='UTF-8') as target:
@@ -103,6 +104,7 @@ def process_file(
         file_updated.write(file_path + '\n')
 
     os.rename(temp_file_path, file_path)
+    os.chmod(file_path, file_mode)
 
 def main() -> int:
     with open(FILE_PATH_NO_HEADER, 'w', encoding='UTF-8') as file_no_header:
-- 
GitLab


From c2f1fdbb605db46dd2ebfc646efe1d189b13887b Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Mon, 15 Apr 2024 17:20:14 +0000
Subject: [PATCH 107/602] Scripts:

- Updated file mode update in update_license_headers.py script
---
 scripts/update_license_headers.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/scripts/update_license_headers.py b/scripts/update_license_headers.py
index 62a166f17..da839ba0a 100644
--- a/scripts/update_license_headers.py
+++ b/scripts/update_license_headers.py
@@ -87,7 +87,7 @@ def process_file(
 
     temp_file_path = file_path + '.temp'
     replaced = False
-    file_mode = os.stat(file_path)
+    file_stat = os.stat(file_path)
     try:
         with open(file_path, encoding='UTF-8') as source:
             with open(temp_file_path, 'w', encoding='UTF-8') as target:
@@ -104,7 +104,7 @@ def process_file(
         file_updated.write(file_path + '\n')
 
     os.rename(temp_file_path, file_path)
-    os.chmod(file_path, file_mode)
+    os.chmod(file_path, file_stat.st_mode)
 
 def main() -> int:
     with open(FILE_PATH_NO_HEADER, 'w', encoding='UTF-8') as file_no_header:
-- 
GitLab


From 7a342bb6e3d2a70822befcf6c32f869c96cc3430 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 16 Apr 2024 09:22:03 +0000
Subject: [PATCH 108/602] Added new message (KpiDescriptorFilter) and updated
 method name

---
 proto/kpi_manager.proto | 42 +++++++++++++++++++++++++++--------------
 1 file changed, 28 insertions(+), 14 deletions(-)

diff --git a/proto/kpi_manager.proto b/proto/kpi_manager.proto
index f5769ed37..ad48eb84f 100644
--- a/proto/kpi_manager.proto
+++ b/proto/kpi_manager.proto
@@ -19,27 +19,41 @@ import "context.proto";
 import "kpi_sample_types.proto";
 
 service KpiManagerService{
-  rpc SetKpi                (KpiDescriptor      ) returns (KpiId               ) {} // Stable not final
-  rpc DeleteKpi             (KpiId              ) returns (context.Empty       ) {} // Stable and final
-  rpc GetKpiDescriptor      (KpiId              ) returns (KpiDescriptor       ) {} // Stable and final
-  rpc GetKpiDescriptorList  (context.Empty      ) returns (KpiDescriptorList   ) {} // Stable and final
+  rpc SetKpiDescriptor    (KpiDescriptor      ) returns (KpiId               ) {} // Stable not final
+  rpc DeleteKpiDescriptor (KpiId              ) returns (context.Empty       ) {} // Stable and final
+  rpc GetKpiDescriptor    (KpiId              ) returns (KpiDescriptor       ) {} // Stable and final
+  rpc SelectKpiDescriptor (KpiDescriptorFilter) returns (KpiDescriptorList   ) {} // Stable and final
+}
+
+
+message KpiId {
+  context.Uuid kpi_id = 1;
 }
 
 message KpiDescriptor {
   KpiId                          kpi_id          = 1;
   string                         kpi_description = 2;
-  repeated KpiId                 kpi_id_list     = 3;
-  kpi_sample_types.KpiSampleType kpi_sample_type = 4;
-  context.DeviceId               device_id       = 5;
-  context.EndPointId             endpoint_id     = 6;
-  context.ServiceId              service_id      = 7;
-  context.SliceId                slice_id        = 8;
-  context.ConnectionId           connection_id   = 9;
-  context.LinkId                 link_id         = 10;
+  kpi_sample_types.KpiSampleType kpi_sample_type = 3;
+  context.DeviceId               device_id       = 4;
+  context.EndPointId             endpoint_id     = 5;
+  context.ServiceId              service_id      = 6;
+  context.SliceId                slice_id        = 7;
+  context.ConnectionId           connection_id   = 8;
+  context.LinkId                 link_id         = 9;
 }
 
-message KpiId {
-  context.Uuid kpi_id = 1;
+message KpiDescriptorFilter {
+  // KPI Descriptors 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 KPI Descriptors
+  repeated KpiId                          kpi_id          = 1;
+  repeated kpi_sample_types.KpiSampleType kpi_sample_type = 2;
+  repeated context.DeviceId               device_id       = 3;
+  repeated context.EndPointId             endpoint_id     = 4;
+  repeated context.ServiceId              service_id      = 5;
+  repeated context.SliceId                slice_id        = 6;
+  repeated context.ConnectionId           connection_id   = 7;
+  repeated context.LinkId                 link_id         = 8;
 }
 
 message KpiDescriptorList {
-- 
GitLab


From 2a3ddf384af7bd9751b35207588333d0bc0c06e4 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 16 Apr 2024 09:23:18 +0000
Subject: [PATCH 109/602] Update method names

---
 src/kpi_manager/client/KpiManagerClient.py | 30 +++++++++++-----------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/src/kpi_manager/client/KpiManagerClient.py b/src/kpi_manager/client/KpiManagerClient.py
index a129cd327..5a4cd2e20 100755
--- a/src/kpi_manager/client/KpiManagerClient.py
+++ b/src/kpi_manager/client/KpiManagerClient.py
@@ -19,7 +19,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_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList
 from common.proto.kpi_manager_pb2_grpc import KpiManagerServiceStub
 
 LOGGER = logging.getLogger(__name__)
@@ -29,8 +29,8 @@ RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION,
 
 class KpiManagerClient:
     def __init__(self, host=None, port=None):
-        if not host: host = get_service_host(ServiceNameEnum.KPIMANAGER) # update enum
-        if not port: port = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # update enum 
+        if not host: host = get_service_host(ServiceNameEnum.KPIMANAGER) 
+        if not port: port = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) 
         self.endpoint = '{:s}:{:s}'.format(str(host), str(port))
         LOGGER.debug('Creating channel to {:s}...'.format(str(self.endpoint)))
         self.channel = None
@@ -48,17 +48,17 @@ class KpiManagerClient:
         self.stub = None
 
     @RETRY_DECORATOR
-    def SetKpi(self, request : KpiDescriptor) -> KpiId:
-        LOGGER.debug('SetKpi: {:s}'.format(grpc_message_to_json_string(request)))
-        response = self.stub.SetKpi(request)
-        LOGGER.debug('SetKpi result: {:s}'.format(grpc_message_to_json_string(response)))
+    def SetKpiDescriptor(self, request : KpiDescriptor) -> KpiId:
+        LOGGER.debug('SetKpiDescriptor: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.SetKpiDescriptor(request)
+        LOGGER.debug('SetKpiDescriptor result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
 
     @RETRY_DECORATOR
-    def DeleteKpi(self,request : KpiId) -> Empty:
-        LOGGER.debug('DeleteKpi: {:s}'.format(grpc_message_to_json_string(request)))
-        response = self.stub.DeleteKpi(request)
-        LOGGER.info('DeleteKpi result: {:s}'.format(grpc_message_to_json_string(response)))
+    def DeleteKpiDescriptor(self,request : KpiId) -> Empty:
+        LOGGER.debug('DeleteKpiDescriptor: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.DeleteKpiDescriptor(request)
+        LOGGER.info('DeleteKpiDescriptor result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
 
     @RETRY_DECORATOR
@@ -69,8 +69,8 @@ class KpiManagerClient:
         return response
 
     @RETRY_DECORATOR
-    def GetKpiDescriptorList(self, request : Empty) -> KpiDescriptorList:
-        LOGGER.debug('GetKpiDescriptorList: {:s}'.format(grpc_message_to_json_string(request)))
-        response = self.stub.GetKpiDescriptorList(request)
-        LOGGER.debug('GetKpiDescriptorList result: {:s}'.format(grpc_message_to_json_string(response)))
+    def SelectKpiDescriptor(self, request : KpiDescriptorFilter) -> KpiDescriptorList:
+        LOGGER.debug('SelectKpiDescriptor: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.SelectKpiDescriptor(request)
+        LOGGER.debug('SelectKpiDescriptor result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
\ No newline at end of file
-- 
GitLab


From bb54d7a49c083f2a7927e3259ce7a50d014498be Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 16 Apr 2024 09:23:43 +0000
Subject: [PATCH 110/602] update method name

---
 src/kpi_manager/service/KpiManagerServiceServicerImpl.py | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py
index 3a40195da..fc1ea3b96 100644
--- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py
+++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py
@@ -16,7 +16,7 @@ import logging, grpc
 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, KpiDescriptorList
+from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList
 from monitoring.service.NameMapping import NameMapping
 from monitoring.service import ManagementDBTools
 
@@ -34,7 +34,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
         LOGGER.info('MetricsDB initialized --- KPI Manager Service')
   
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def SetKpi(
+    def SetKpiDescriptor(
             self, request: KpiDescriptor, grpc_context: grpc.ServicerContext
     ) -> KpiId:
         response = KpiId()
@@ -57,7 +57,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
         return response
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def DeleteKpi(self, request: KpiId, grpc_context: grpc.ServicerContext) -> Empty:
+    def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> Empty:
         kpi_id = int(request.kpi_id.uuid)
         kpi = self.management_db.get_KPI(kpi_id)
         if kpi:
@@ -85,7 +85,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
         return kpiDescriptor
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def GetKpiDescriptorList(self, request: Empty, grpc_context: grpc.ServicerContext) -> KpiDescriptorList:
+    def SelectKpiDescriptor(self, request: KpiDescriptorFilter, grpc_context: grpc.ServicerContext) -> KpiDescriptorList:
         kpi_descriptor_list = KpiDescriptorList()
         data = self.management_db.get_KPIS()
         LOGGER.debug(f"data: {data}")
-- 
GitLab


From 4720cbc7a3b1c0beda0861839075701b488daa49 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 16 Apr 2024 09:25:08 +0000
Subject: [PATCH 111/602] New method "create_kpi_filter_request" is added

---
 src/kpi_manager/tests/test_messages.py | 73 +++++++++++++++++---------
 1 file changed, 47 insertions(+), 26 deletions(-)

diff --git a/src/kpi_manager/tests/test_messages.py b/src/kpi_manager/tests/test_messages.py
index 589d6cb84..237a983bf 100755
--- a/src/kpi_manager/tests/test_messages.py
+++ b/src/kpi_manager/tests/test_messages.py
@@ -24,46 +24,67 @@ def create_kpi_request(kpi_id_str):
     _create_kpi_request                                     = kpi_manager_pb2.KpiDescriptor()
     _create_kpi_request.kpi_description                     = 'KPI Description Test'
     _create_kpi_request.kpi_sample_type                     = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
-    _create_kpi_request.device_id.device_uuid.uuid          = 'DEV' + str(kpi_id_str)
+    _create_kpi_request.device_id.device_uuid.uuid          = 'DEV'  + str(kpi_id_str)
     _create_kpi_request.service_id.service_uuid.uuid        = 'SERV' + str(kpi_id_str)
-    _create_kpi_request.slice_id.slice_uuid.uuid            = 'SLC' + str(kpi_id_str)
-    _create_kpi_request.endpoint_id.endpoint_uuid.uuid      = 'END' + str(kpi_id_str)
-    _create_kpi_request.connection_id.connection_uuid.uuid  = 'CON' + str(kpi_id_str)
+    _create_kpi_request.slice_id.slice_uuid.uuid            = 'SLC'  + str(kpi_id_str)
+    _create_kpi_request.endpoint_id.endpoint_uuid.uuid      = 'END'  + str(kpi_id_str)
+    _create_kpi_request.connection_id.connection_uuid.uuid  = 'CON'  + str(kpi_id_str)
     return _create_kpi_request
 
 def create_kpi_request_b():
-    _create_kpi_request                                = kpi_manager_pb2.KpiDescriptor()
-    _create_kpi_request.kpi_description                = 'KPI Description Test'
-    _create_kpi_request.kpi_sample_type                = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
-    _create_kpi_request.device_id.device_uuid.uuid     = 'DEV2'     # pylint: disable=maybe-no-member
-    _create_kpi_request.service_id.service_uuid.uuid   = 'SERV2'    # pylint: disable=maybe-no-member
-    _create_kpi_request.slice_id.slice_uuid.uuid       = 'SLC2'  # pylint: disable=maybe-no-member
-    _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END2'     # pylint: disable=maybe-no-member
+    _create_kpi_request                                    = kpi_manager_pb2.KpiDescriptor()
+    _create_kpi_request.kpi_description                    = 'KPI Description Test'
+    _create_kpi_request.kpi_sample_type                    = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
+    _create_kpi_request.device_id.device_uuid.uuid         = 'DEV2'     # pylint: disable=maybe-no-member
+    _create_kpi_request.service_id.service_uuid.uuid       = 'SERV2'    # pylint: disable=maybe-no-member
+    _create_kpi_request.slice_id.slice_uuid.uuid           = 'SLC2'  # pylint: disable=maybe-no-member
+    _create_kpi_request.endpoint_id.endpoint_uuid.uuid     = 'END2'     # pylint: disable=maybe-no-member
     _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2'  # pylint: disable=maybe-no-member
     return _create_kpi_request
 
 def create_kpi_request_c():
-    _create_kpi_request                                = kpi_manager_pb2.KpiDescriptor()
-    _create_kpi_request.kpi_description                = 'KPI Description Test'
-    _create_kpi_request.kpi_sample_type                = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
-    _create_kpi_request.device_id.device_uuid.uuid     = 'DEV3'     # pylint: disable=maybe-no-member
-    _create_kpi_request.service_id.service_uuid.uuid   = 'SERV3'    # pylint: disable=maybe-no-member
-    _create_kpi_request.slice_id.slice_uuid.uuid       = 'SLC3'  # pylint: disable=maybe-no-member
-    _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END3'     # pylint: disable=maybe-no-member
+    _create_kpi_request                                    = kpi_manager_pb2.KpiDescriptor()
+    _create_kpi_request.kpi_description                    = 'KPI Description Test'
+    _create_kpi_request.kpi_sample_type                    = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
+    _create_kpi_request.device_id.device_uuid.uuid         = 'DEV3'     # pylint: disable=maybe-no-member
+    _create_kpi_request.service_id.service_uuid.uuid       = 'SERV3'    # pylint: disable=maybe-no-member
+    _create_kpi_request.slice_id.slice_uuid.uuid           = 'SLC3'  # pylint: disable=maybe-no-member
+    _create_kpi_request.endpoint_id.endpoint_uuid.uuid     = 'END3'     # pylint: disable=maybe-no-member
     _create_kpi_request.connection_id.connection_uuid.uuid = 'CON3'  # pylint: disable=maybe-no-member
     return _create_kpi_request
 
 def create_kpi_request_d():
-    _create_kpi_request                                = kpi_manager_pb2.KpiDescriptor()
-    _create_kpi_request.kpi_description                = 'KPI Description Test'
-    _create_kpi_request.kpi_sample_type                = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
-    _create_kpi_request.device_id.device_uuid.uuid     = 'DEV4'     # pylint: disable=maybe-no-member
-    _create_kpi_request.service_id.service_uuid.uuid   = 'SERV4'    # pylint: disable=maybe-no-member
-    _create_kpi_request.slice_id.slice_uuid.uuid       = 'SLC4'  # pylint: disable=maybe-no-member
-    _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END4'     # pylint: disable=maybe-no-member
+    _create_kpi_request                                    = kpi_manager_pb2.KpiDescriptor()
+    _create_kpi_request.kpi_description                    = 'KPI Description Test'
+    _create_kpi_request.kpi_sample_type                    = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
+    _create_kpi_request.device_id.device_uuid.uuid         = 'DEV4'     # pylint: disable=maybe-no-member
+    _create_kpi_request.service_id.service_uuid.uuid       = 'SERV4'    # pylint: disable=maybe-no-member
+    _create_kpi_request.slice_id.slice_uuid.uuid           = 'SLC4'  # pylint: disable=maybe-no-member
+    _create_kpi_request.endpoint_id.endpoint_uuid.uuid     = 'END4'     # pylint: disable=maybe-no-member
     _create_kpi_request.connection_id.connection_uuid.uuid = 'CON4'  # pylint: disable=maybe-no-member
     return _create_kpi_request
 
 def kpi_descriptor_list():
     _kpi_descriptor_list = kpi_manager_pb2.KpiDescriptorList()
-    return _kpi_descriptor_list
\ No newline at end of file
+    return _kpi_descriptor_list
+
+def create_kpi_filter_request():
+    _create_kpi_filter_request             = kpi_manager_pb2.KpiDescriptorFilter()
+    _create_kpi_filter_request.kpi_sample_type.append(KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED)  
+    new_device_id                          = _create_kpi_filter_request.device_id.add()
+    new_device_id.device_uuid.uuid         = 'DEV1'
+    new_service_id                         = _create_kpi_filter_request.service_id.add()
+    new_service_id.service_uuid.uuid       = 'SERV1'
+    new_slice_id                           = _create_kpi_filter_request.slice_id.add()
+    new_slice_id.slice_uuid.uuid           = 'SLC1'
+    new_endpoint_id                        = _create_kpi_filter_request.endpoint_id.add()
+    new_endpoint_id.endpoint_uuid.uuid     = 'END1'
+    new_connection_id                      = _create_kpi_filter_request.connection_id.add()
+    new_connection_id.connection_uuid.uuid = 'CON1'
+
+    # _create_kpi_filter_request.device_id.device_uuid.uuid.append('DEV1')        # pylint: disable=maybe-no-member
+    # _create_kpi_filter_request[0].service_id.service_uuid.uuid       = 'SERV1'     # pylint: disable=maybe-no-member
+    # _create_kpi_filter_request[0].slice_id.slice_uuid.uuid           = 'SLC1'      # pylint: disable=maybe-no-member
+    # _create_kpi_filter_request[0].endpoint_id.endpoint_uuid.uuid     = 'END1'      # pylint: disable=maybe-no-member
+    # _create_kpi_filter_request[0].connection_id.connection_uuid.uuid = 'CON1'      # pylint: disable=maybe-no-member
+    return _create_kpi_filter_request
-- 
GitLab


From 44158d341973232e47826cde8a7b50406dfab10f Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 16 Apr 2024 09:25:29 +0000
Subject: [PATCH 112/602] comments were removed

---
 src/kpi_manager/tests/test_messages.py | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/src/kpi_manager/tests/test_messages.py b/src/kpi_manager/tests/test_messages.py
index 237a983bf..72ff74c16 100755
--- a/src/kpi_manager/tests/test_messages.py
+++ b/src/kpi_manager/tests/test_messages.py
@@ -82,9 +82,4 @@ def create_kpi_filter_request():
     new_connection_id                      = _create_kpi_filter_request.connection_id.add()
     new_connection_id.connection_uuid.uuid = 'CON1'
 
-    # _create_kpi_filter_request.device_id.device_uuid.uuid.append('DEV1')        # pylint: disable=maybe-no-member
-    # _create_kpi_filter_request[0].service_id.service_uuid.uuid       = 'SERV1'     # pylint: disable=maybe-no-member
-    # _create_kpi_filter_request[0].slice_id.slice_uuid.uuid           = 'SLC1'      # pylint: disable=maybe-no-member
-    # _create_kpi_filter_request[0].endpoint_id.endpoint_uuid.uuid     = 'END1'      # pylint: disable=maybe-no-member
-    # _create_kpi_filter_request[0].connection_id.connection_uuid.uuid = 'CON1'      # pylint: disable=maybe-no-member
-    return _create_kpi_filter_request
+    return _create_kpi_filter_request
\ No newline at end of file
-- 
GitLab


From 843c37fbf969fcc2261b72a1171ad1c0bfd675e0 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 16 Apr 2024 09:26:39 +0000
Subject: [PATCH 113/602] function calls were updated according to name method
 names

---
 src/kpi_manager/tests/test_unitary.py | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/kpi_manager/tests/test_unitary.py b/src/kpi_manager/tests/test_unitary.py
index b45346d06..adc886341 100755
--- a/src/kpi_manager/tests/test_unitary.py
+++ b/src/kpi_manager/tests/test_unitary.py
@@ -33,7 +33,7 @@ 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, KpiDescriptorList
+from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList
 from common.tools.service.GenericGrpcService import GenericGrpcService
 from context.client.ContextClient import ContextClient
 
@@ -43,7 +43,7 @@ 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_request, create_kpi_request_b, create_kpi_request_c, create_kpi_request_d
+from kpi_manager.tests.test_messages import create_kpi_request, create_kpi_request_b, create_kpi_request_c, create_kpi_request_d, create_kpi_filter_request
 # from monitoring.service.MonitoringService import MonitoringService
 from kpi_manager.service.KpiManagerService import KpiManagerService
 # from monitoring.client.MonitoringClient import MonitoringClient
@@ -256,7 +256,7 @@ def test_set_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name
     # make call to server
     LOGGER.warning('test_create_kpi requesting')
     for i in range(3):
-        response = kpi_manager_client.SetKpi(create_kpi_request(str(i+1)))
+        response = kpi_manager_client.SetKpiDescriptor(create_kpi_request(str(i+1)))
         LOGGER.debug(str(response))
         assert isinstance(response, KpiId)
 
@@ -264,14 +264,14 @@ def test_set_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name
 def test_delete_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name
     # make call to server
     LOGGER.warning('delete_kpi requesting')
-    response = kpi_manager_client.SetKpi(create_kpi_request('4'))
-    response = kpi_manager_client.DeleteKpi(response)
+    response = kpi_manager_client.SetKpiDescriptor(create_kpi_request('4'))
+    response = kpi_manager_client.DeleteKpiDescriptor(response)
     LOGGER.debug(str(response))
     assert isinstance(response, Empty)
 
 # Test case that makes use of client fixture to test server's GetKpiDescriptor method
-def test_get_kpi_descriptor_list(kpi_manager_client): # pylint: disable=redefined-outer-name
-    LOGGER.warning('test_getkpidescritor_kpi begin')
-    response = kpi_manager_client.GetKpiDescriptorList(Empty())
+def test_select_kpi_descriptor(kpi_manager_client): # pylint: disable=redefined-outer-name
+    LOGGER.warning('test_selectkpidescritor begin')
+    response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request())
     LOGGER.debug(str(response))
     assert isinstance(response, KpiDescriptorList)
-- 
GitLab


From d68f6218de82a05df7d82cae6d61a59579b71bc4 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 16 Apr 2024 10:37:14 +0000
Subject: [PATCH 114/602] Scripts - update_license_headers.py:

- Added missing skip patterns
- Added multiple old copyright lines
- Added logic to keep new-line chars
- Not finished
---
 scripts/update_license_headers.py | 33 ++++++++++++++++++++++++-------
 1 file changed, 26 insertions(+), 7 deletions(-)

diff --git a/scripts/update_license_headers.py b/scripts/update_license_headers.py
index da839ba0a..562352faa 100644
--- a/scripts/update_license_headers.py
+++ b/scripts/update_license_headers.py
@@ -28,12 +28,18 @@ FILE_PATH_NO_HEADER  = 'out-no-header.txt'
 FILE_PATH_UPDATED    = 'out-updated.txt'
 
 RE_OLD_COPYRIGHTS = [
-    re.compile(r'Copyright\ 2021\-2023\ H2020\ TeraFlow\ \(https\:\/\/www\.teraflow\-h2020\.eu\/\)'),
-    re.compile(r'Copyright\ 2022\-2023\ ETSI\ TeraFlowSDN\ \-\ TFS\ OSG\ \(https\:\/\/tfs\.etsi\.org\/\)'),
+    r'Copyright\ 2021\-2023\ H2020\ TeraFlow\ \(https\:\/\/www\.teraflow\-h2020\.eu\/\)',
+    r'Copyright\ 2022\-2023\ ETSI\ TeraFlowSDN\ \-\ TFS\ OSG\ \(https\:\/\/tfs\.etsi\.org\/\)',
 ]
+RE_OLD_COPYRIGHTS = [
+    (re.compile(re_old_copyright), re.compile(r'.*{}.*'.format(re_old_copyright)))
+    for re_old_copyright in RE_OLD_COPYRIGHTS
+]
+
 STR_NEW_COPYRIGHT = 'Copyright 2022-2024 ETSI TeraFlowSDN - TFS OSG/SDG (https://tfs.etsi.org/)'
 
 def skip_file(file_path : str) -> bool:
+    if os.path.islink(file_path): return True
     if file_path.endswith('.pyc'): return True
     if file_path.endswith('_pb2_grpc.py'): return True
     if file_path.endswith('_pb2.py'): return True
@@ -43,10 +49,14 @@ def skip_file(file_path : str) -> bool:
     if file_path.endswith('.zip'): return True
     if file_path.endswith('.zip'): return True
     if file_path.endswith('.jar'): return True
+    if file_path.endswith('.onnx'): return True
     if file_path.endswith('/tstat'): return True
     if file_path.endswith('/.gitignore'): return True
     if file_path.endswith('/.gitkeep'): return True
     if file_path.endswith('/coverage/.coverage'): return True
+    if file_path.endswith('/grpc/grpcurl/grpcurl'): return True
+    if file_path.endswith('/probe/probe-tfs/target/x86_64-unknown-linux-musl/release/tfsagent'): return True
+    if file_path.endswith('/probe/probe-tfs/target/x86_64-unknown-linux-musl/release/tfsping'): return True
     if file_path.startswith('./netconf_openconfig/'): return True
     if file_path.startswith('./tmp/'): return True
     if '/manifests/cttc-ols/' in file_path: return True
@@ -70,9 +80,16 @@ def skip_file(file_path : str) -> bool:
     return False
 
 def process_line(line_in : str) -> str:
-    for re_old_copyright in RE_OLD_COPYRIGHTS:
-        if re_old_copyright.match(line_in) is None: continue
-        line_out = re_old_copyright.sub(STR_NEW_COPYRIGHT, line_in)
+    print('line_in', line_in)
+    for re_match, re_sub in RE_OLD_COPYRIGHTS:
+        print('re_match', re_match)
+        print('re_sub', re_sub)
+        match = re_match.match(line_in)
+        print('match', match)
+        if match is None: continue
+        print('matched!')
+        line_out = re_sub.sub(STR_NEW_COPYRIGHT, line_in)
+        print('line_out', line_out)
         return line_out
     return line_in
 
@@ -89,8 +106,8 @@ def process_file(
     replaced = False
     file_stat = os.stat(file_path)
     try:
-        with open(file_path, encoding='UTF-8') as source:
-            with open(temp_file_path, 'w', encoding='UTF-8') as target:
+        with open(file_path, encoding='UTF-8', newline='') as source:
+            with open(temp_file_path, 'w', encoding='UTF-8', newline='') as target:
                 for line_in in source:
                     line_out = process_line(line_in)
                     target.write(line_out)
@@ -106,6 +123,8 @@ def process_file(
     os.rename(temp_file_path, file_path)
     os.chmod(file_path, file_stat.st_mode)
 
+    raise Exception()
+
 def main() -> int:
     with open(FILE_PATH_NO_HEADER, 'w', encoding='UTF-8') as file_no_header:
         with open(FILE_PATH_SKIPPED, 'w', encoding='UTF-8') as file_skipped:
-- 
GitLab


From d70cdd05ffacfba65c5a97c23084a419a6101cb8 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 16 Apr 2024 10:41:11 +0000
Subject: [PATCH 115/602] Scripts - update_license_headers.py:

- Corrected regular experssions
- Not finished
---
 scripts/update_license_headers.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scripts/update_license_headers.py b/scripts/update_license_headers.py
index 562352faa..ee9f1ef9a 100644
--- a/scripts/update_license_headers.py
+++ b/scripts/update_license_headers.py
@@ -32,7 +32,7 @@ RE_OLD_COPYRIGHTS = [
     r'Copyright\ 2022\-2023\ ETSI\ TeraFlowSDN\ \-\ TFS\ OSG\ \(https\:\/\/tfs\.etsi\.org\/\)',
 ]
 RE_OLD_COPYRIGHTS = [
-    (re.compile(re_old_copyright), re.compile(r'.*{}.*'.format(re_old_copyright)))
+    (re.compile(r'.*{}.*'.format(re_old_copyright)), re.compile(re_old_copyright))
     for re_old_copyright in RE_OLD_COPYRIGHTS
 ]
 
-- 
GitLab


From 364480484b6e66dfa804e6190a2fc1c2f0ca65da Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 16 Apr 2024 10:45:23 +0000
Subject: [PATCH 116/602] Scripts - update_license_headers.py:

- Code cleanup
- Not finished
---
 scripts/update_license_headers.py | 11 +----------
 1 file changed, 1 insertion(+), 10 deletions(-)

diff --git a/scripts/update_license_headers.py b/scripts/update_license_headers.py
index ee9f1ef9a..eda54099a 100644
--- a/scripts/update_license_headers.py
+++ b/scripts/update_license_headers.py
@@ -27,6 +27,7 @@ FILE_PATH_SKIPPED    = 'out-skipped.txt'
 FILE_PATH_NO_HEADER  = 'out-no-header.txt'
 FILE_PATH_UPDATED    = 'out-updated.txt'
 
+STR_NEW_COPYRIGHT = 'Copyright 2022-2024 ETSI TeraFlowSDN - TFS OSG/SDG (https://tfs.etsi.org/)'
 RE_OLD_COPYRIGHTS = [
     r'Copyright\ 2021\-2023\ H2020\ TeraFlow\ \(https\:\/\/www\.teraflow\-h2020\.eu\/\)',
     r'Copyright\ 2022\-2023\ ETSI\ TeraFlowSDN\ \-\ TFS\ OSG\ \(https\:\/\/tfs\.etsi\.org\/\)',
@@ -36,8 +37,6 @@ RE_OLD_COPYRIGHTS = [
     for re_old_copyright in RE_OLD_COPYRIGHTS
 ]
 
-STR_NEW_COPYRIGHT = 'Copyright 2022-2024 ETSI TeraFlowSDN - TFS OSG/SDG (https://tfs.etsi.org/)'
-
 def skip_file(file_path : str) -> bool:
     if os.path.islink(file_path): return True
     if file_path.endswith('.pyc'): return True
@@ -80,16 +79,10 @@ def skip_file(file_path : str) -> bool:
     return False
 
 def process_line(line_in : str) -> str:
-    print('line_in', line_in)
     for re_match, re_sub in RE_OLD_COPYRIGHTS:
-        print('re_match', re_match)
-        print('re_sub', re_sub)
         match = re_match.match(line_in)
-        print('match', match)
         if match is None: continue
-        print('matched!')
         line_out = re_sub.sub(STR_NEW_COPYRIGHT, line_in)
-        print('line_out', line_out)
         return line_out
     return line_in
 
@@ -123,8 +116,6 @@ def process_file(
     os.rename(temp_file_path, file_path)
     os.chmod(file_path, file_stat.st_mode)
 
-    raise Exception()
-
 def main() -> int:
     with open(FILE_PATH_NO_HEADER, 'w', encoding='UTF-8') as file_no_header:
         with open(FILE_PATH_SKIPPED, 'w', encoding='UTF-8') as file_skipped:
-- 
GitLab


From d5c59f9de2b2f344e5f5cf85f4d50dd0dbfaa2b0 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 16 Apr 2024 10:52:27 +0000
Subject: [PATCH 117/602] Scripts - update_license_headers.py:

- Updated copyright line
---
 scripts/update_license_headers.py | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/scripts/update_license_headers.py b/scripts/update_license_headers.py
index eda54099a..ded746483 100644
--- a/scripts/update_license_headers.py
+++ b/scripts/update_license_headers.py
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI TeraFlowSDN - TFS OSG/SDG (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.
@@ -27,7 +27,8 @@ FILE_PATH_SKIPPED    = 'out-skipped.txt'
 FILE_PATH_NO_HEADER  = 'out-no-header.txt'
 FILE_PATH_UPDATED    = 'out-updated.txt'
 
-STR_NEW_COPYRIGHT = 'Copyright 2022-2024 ETSI TeraFlowSDN - TFS OSG/SDG (https://tfs.etsi.org/)'
+STR_NEW_COPYRIGHT = 'Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)'
+
 RE_OLD_COPYRIGHTS = [
     r'Copyright\ 2021\-2023\ H2020\ TeraFlow\ \(https\:\/\/www\.teraflow\-h2020\.eu\/\)',
     r'Copyright\ 2022\-2023\ ETSI\ TeraFlowSDN\ \-\ TFS\ OSG\ \(https\:\/\/tfs\.etsi\.org\/\)',
-- 
GitLab


From 6c4f8a97117ae28c71ffef36c4d43714202b2f97 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 16 Apr 2024 15:00:18 +0000
Subject: [PATCH 118/602] Scripts - add_license_header_to_files.sh:

- Updated copyright line
- Updated ignore filters
---
 scripts/add_license_header_to_files.sh | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/scripts/add_license_header_to_files.sh b/scripts/add_license_header_to_files.sh
index 4c11fc316..d2d6d22de 100755
--- a/scripts/add_license_header_to_files.sh
+++ b/scripts/add_license_header_to_files.sh
@@ -16,7 +16,7 @@
 
 docker pull ghcr.io/google/addlicense:latest
 docker run -it -v ${PWD}:/src ghcr.io/google/addlicense \
-    -l apache -c "H2020 TeraFlow (https://www.teraflow-h2020.eu/)" -y 2021-2023 \
+    -l apache -c "ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)" -y 2022-2024 \
     -ignore "data/*" -ignore "data/**" -ignore "tmp/*" -ignore "tmp/**" -ignore "manifests/cttc-ols/*" \
     -ignore "coverage/*" -ignore "coverage/**" -ignore ".vscode/*" -ignore ".vscode/**" \
     -ignore ".git/*" -ignore ".git/**" -ignore "proto/uml/*" -ignore "proto/uml/**" \
@@ -25,6 +25,21 @@ docker run -it -v ${PWD}:/src ghcr.io/google/addlicense \
     -ignore "src/.pytest_cache/*" -ignore "src/.pytest_cache/**" -ignore ".pytest_cache/*" -ignore ".pytest_cache/**" \
     -ignore "src/**/target/generated-sources/grpc/*" -ignore "src/**/target/generated-sources/grpc/**" \
     -ignore "src/**/*_pb2.py" -ignore "src/**/*_pb2_grpc.py" \
+    -ignore "src/device/service/drivers/gnmi_openconfig/gnmi/*.proto" \
     -ignore "src/device/service/drivers/openconfig/templates/**/*.xml" \
+    -ignore "src/device/service/drivers/openconfig/templates/ACL/openconfig_acl.py" \
+    -ignore "src/device/service/drivers/openconfig/templates/VPN/openconfig_interfaces.py" \
+    -ignore "src/device/service/drivers/openconfig/templates/VPN/openconfig_network_instance.py" \
+    -ignore "src/device/service/drivers/openconfig/templates/VPN/openconfig_routing_policy.py" \
+    -ignore "src/nbi/service/rest_server/nbi_plugins/ietf_network/bindings/**/*.py" \
+    -ignore "src/policy/target/kubernetes/kubernetes.yml" \
+    -ignore "src/ztp/target/kubernetes/kubernetes.yml" \
     -ignore "src/**/.mvn/*" -ignore "src/**/.mvn/**" \
+    -ignore "hackfest/**/*_pb2.py" -ignore "hackfest/**/*_pb2_grpc.py" \
+    -ignore "hackfest/netconf/**/binding_*.py" -ignore "hackfest/netconf/**/binding_*.py" \
+    -ignore "hackfest/yang/**/binding_*.py" -ignore "hackfest/yang/**/binding_*.py" \
+    -ignore "hackfest/netconf-oc/openconfig/*" -ignore "hackfest/netconf-oc/openconfig/**" \
+    -ignore "hackfest/restconf/connectionserver/*" -ignore "hackfest/restconf/connectionserver/**" \
+    -ignore "hackfest/restconf/topologyserver/*" -ignore "hackfest/restconf/topologyserver/**" \
+    -ignore "hackfest/tapi/server/*" -ignore "hackfest/tapi/server/**" \
     *
-- 
GitLab


From ee179f5fba0e1ead67513a5787ec8da21928258d Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 16 Apr 2024 16:43:08 +0000
Subject: [PATCH 119/602] Added missing file headers

---
 .../data/sql_hash_join_full_scan_tests.sql       | 14 ++++++++++++++
 .../ofc24/node-agents-config/platform_r1.xml     | 16 ++++++++++++++++
 .../ofc24/node-agents-config/platform_r2.xml     | 16 ++++++++++++++++
 .../ofc24/node-agents-config/platform_t1.xml     | 16 ++++++++++++++++
 .../ofc24/node-agents-config/platform_t2.xml     | 16 ++++++++++++++++
 .../ssl_not_working/mock-mw-sdn-ctrl.yaml        | 14 ++++++++++++++
 src/tests/tools/mock_mw_sdn_ctrl/test_mw.py      | 14 ++++++++++++++
 7 files changed, 106 insertions(+)

diff --git a/src/context/data/sql_hash_join_full_scan_tests.sql b/src/context/data/sql_hash_join_full_scan_tests.sql
index ebead1be6..29ac593e2 100644
--- a/src/context/data/sql_hash_join_full_scan_tests.sql
+++ b/src/context/data/sql_hash_join_full_scan_tests.sql
@@ -1,3 +1,17 @@
+-- Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
+
 -- When inserting config rules, for instance related to device
 --   If we insert few rules (3~4 rows), does a lookup join with more rows does hash join which is less performant...
 --   To be investigated...
diff --git a/src/tests/ofc24/node-agents-config/platform_r1.xml b/src/tests/ofc24/node-agents-config/platform_r1.xml
index 625d7048a..b9412d1bd 100644
--- a/src/tests/ofc24/node-agents-config/platform_r1.xml
+++ b/src/tests/ofc24/node-agents-config/platform_r1.xml
@@ -1,3 +1,19 @@
+
+
 
     
         
diff --git a/src/tests/ofc24/node-agents-config/platform_r2.xml b/src/tests/ofc24/node-agents-config/platform_r2.xml
index 65f7ee458..317203483 100644
--- a/src/tests/ofc24/node-agents-config/platform_r2.xml
+++ b/src/tests/ofc24/node-agents-config/platform_r2.xml
@@ -1,3 +1,19 @@
+
+
 
     
         
diff --git a/src/tests/ofc24/node-agents-config/platform_t1.xml b/src/tests/ofc24/node-agents-config/platform_t1.xml
index 09f316211..2ef7a1a4e 100644
--- a/src/tests/ofc24/node-agents-config/platform_t1.xml
+++ b/src/tests/ofc24/node-agents-config/platform_t1.xml
@@ -1,3 +1,19 @@
+
+
 
 	
 		
diff --git a/src/tests/ofc24/node-agents-config/platform_t2.xml b/src/tests/ofc24/node-agents-config/platform_t2.xml
index 03c643c91..f071badaa 100644
--- a/src/tests/ofc24/node-agents-config/platform_t2.xml
+++ b/src/tests/ofc24/node-agents-config/platform_t2.xml
@@ -1,3 +1,19 @@
+
+
 
 	
 		
diff --git a/src/tests/tools/mock_mw_sdn_ctrl/ssl_not_working/mock-mw-sdn-ctrl.yaml b/src/tests/tools/mock_mw_sdn_ctrl/ssl_not_working/mock-mw-sdn-ctrl.yaml
index 05b89f949..bccbfc987 100644
--- a/src/tests/tools/mock_mw_sdn_ctrl/ssl_not_working/mock-mw-sdn-ctrl.yaml
+++ b/src/tests/tools/mock_mw_sdn_ctrl/ssl_not_working/mock-mw-sdn-ctrl.yaml
@@ -1,3 +1,17 @@
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
+
 kind: Namespace
 apiVersion: v1
 metadata:
diff --git a/src/tests/tools/mock_mw_sdn_ctrl/test_mw.py b/src/tests/tools/mock_mw_sdn_ctrl/test_mw.py
index 0329d30ad..3165662b1 100644
--- a/src/tests/tools/mock_mw_sdn_ctrl/test_mw.py
+++ b/src/tests/tools/mock_mw_sdn_ctrl/test_mw.py
@@ -1,3 +1,17 @@
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 json, logging, requests
 from requests.auth import HTTPBasicAuth
 from typing import Optional
-- 
GitLab


From c29d73cd3d5f6538c9ae5250fc7e8fe3b2366782 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Thu, 18 Apr 2024 12:51:05 +0000
Subject: [PATCH 120/602] Updated copyright in file headers

---
 .gitlab-ci.yml                                                | 2 +-
 clean_testing_environment.sh                                  | 2 +-
 common_requirements.in                                        | 2 +-
 coverage/.coveragerc.template                                 | 2 +-
 data/perf/old/MW/generate.sh                                  | 2 +-
 data/perf/old/MW/generate_plot.py                             | 2 +-
 data/perf/old/OpenConfig/generate.sh                          | 2 +-
 data/perf/old/OpenConfig/generate_plot.py                     | 2 +-
 data/perf/old/TE/te-cdf.py                                    | 2 +-
 data/perf/old/XR/generate.sh                                  | 2 +-
 data/perf/old/XR/generate_plot.py                             | 2 +-
 data/perf/old/emulated/generate.sh                            | 2 +-
 data/perf/old/emulated/generate_plot.py                       | 2 +-
 deploy/all.sh                                                 | 2 +-
 deploy/component.sh                                           | 2 +-
 deploy/crdb.sh                                                | 2 +-
 deploy/expose_dashboard.sh                                    | 2 +-
 deploy/mock_blockchain.sh                                     | 2 +-
 deploy/nats.sh                                                | 2 +-
 deploy/qdb.sh                                                 | 2 +-
 deploy/show.sh                                                | 2 +-
 deploy/tfs.sh                                                 | 2 +-
 hackfest/containerlab/tfs-scenario.clab.yml                   | 2 +-
 hackfest/gnmi/srlinux.clab.yml                                | 2 +-
 hackfest/grpc/connection.proto                                | 2 +-
 hackfest/grpc/connection/create.py                            | 2 +-
 hackfest/grpc/connection/list.py                              | 2 +-
 hackfest/grpc/connectionService.proto                         | 2 +-
 hackfest/grpc/connectionService/connectionService_client.py   | 2 +-
 hackfest/grpc/connectionService/connectionService_server.py   | 2 +-
 hackfest/grpc/connectionServiceWithNotif.proto                | 2 +-
 .../connectionServiceWithNotif_client.py                      | 2 +-
 .../connectionServiceWithNotif_server.py                      | 2 +-
 hackfest/grpc/topologyService.proto                           | 2 +-
 hackfest/grpc/topologyService/topologyService_client.py       | 2 +-
 hackfest/grpc/topologyService/topologyService_server.py       | 2 +-
 hackfest/kafka/pub.py                                         | 2 +-
 hackfest/kafka/sub.py                                         | 2 +-
 hackfest/mock_osm/MockOSM.py                                  | 2 +-
 hackfest/mock_osm/__init__.py                                 | 2 +-
 hackfest/mock_osm/__main__.py                                 | 2 +-
 hackfest/netconf-oc/device_definition.py                      | 2 +-
 hackfest/netconf-oc/interfaces.xml                            | 2 +-
 hackfest/netconf-oc/platform.xml                              | 2 +-
 hackfest/netconf-oc/server_openconfig.py                      | 2 +-
 hackfest/netconf/client_topology.py                           | 2 +-
 hackfest/netconf/connection/client_connection.py              | 2 +-
 hackfest/netconf/connection/server_topology_connection.py     | 2 +-
 hackfest/netconf/connection/topology.xml                      | 2 +-
 hackfest/netconf/server_topology.py                           | 2 +-
 hackfest/netconf/topology.xml                                 | 2 +-
 hackfest/onos_api/onos_flows.py                               | 2 +-
 hackfest/onos_api/onos_topology.py                            | 2 +-
 hackfest/openconfig/generated.go                              | 2 +-
 hackfest/p4/__init__.py                                       | 2 +-
 hackfest/p4/deploy_specs.sh                                   | 2 +-
 hackfest/p4/run_test_01_bootstrap.sh                          | 2 +-
 hackfest/p4/run_test_02_create_service.sh                     | 2 +-
 hackfest/p4/run_test_03_delete_service.sh                     | 2 +-
 hackfest/p4/run_test_04_cleanup.sh                            | 2 +-
 hackfest/p4/setup.sh                                          | 2 +-
 hackfest/p4/tests/BuildDescriptors.py                         | 2 +-
 hackfest/p4/tests/LoadDescriptors.py                          | 2 +-
 hackfest/p4/tests/Objects.py                                  | 2 +-
 hackfest/p4/tests/__init__.py                                 | 2 +-
 hackfest/p4/tests/test_functional_bootstrap.py                | 2 +-
 hackfest/p4/tests/test_functional_cleanup.py                  | 2 +-
 hackfest/p4/tests/test_functional_create_service.py           | 2 +-
 hackfest/p4/tests/test_functional_delete_service.py           | 2 +-
 hackfest/restconf/connection.yaml                             | 2 +-
 hackfest/restconf/connectionserver/swagger_server/database.py | 2 +-
 .../connectionserver/swagger_server/swagger/swagger.yaml      | 2 +-
 hackfest/restconf/topology.yaml                               | 2 +-
 .../topologyserver/swagger_server/swagger/swagger.yaml        | 2 +-
 hackfest/tapi/client/tapi-client.sh                           | 2 +-
 hackfest/tapi/server/run.sh                                   | 2 +-
 hackfest/tapi/server/tapi_server/__main__.py                  | 2 +-
 hackfest/tapi/server/tapi_server/database.py                  | 2 +-
 hackfest/tapi/server/tapi_server/swagger/swagger.yaml         | 2 +-
 hackfest/tapi/tapi-connectivity.yaml                          | 2 +-
 hackfest/tapi/tapi_app/requirements.sh                        | 2 +-
 hackfest/tapi/tapi_app/tapi_app.py                            | 2 +-
 hackfest/yang/connection/connection.py                        | 2 +-
 hackfest/yang/topology.py                                     | 2 +-
 hackfest/yang/topology.xml                                    | 2 +-
 install_requirements.sh                                       | 2 +-
 manifests/.gitlab-ci.yml                                      | 2 +-
 manifests/bgpls_speakerservice.yaml                           | 2 +-
 manifests/cachingservice.yaml                                 | 2 +-
 manifests/cockroachdb/single-node.yaml                        | 2 +-
 manifests/contextservice.yaml                                 | 2 +-
 manifests/dbscanservingservice.yaml                           | 2 +-
 manifests/deviceservice.yaml                                  | 2 +-
 manifests/dltservice.yaml                                     | 2 +-
 manifests/e2e_orchestratorservice.yaml                        | 2 +-
 manifests/forecasterservice.yaml                              | 2 +-
 manifests/interdomainservice.yaml                             | 2 +-
 manifests/l3_attackmitigatorservice.yaml                      | 2 +-
 manifests/l3_centralizedattackdetectorservice.yaml            | 2 +-
 manifests/l3_distributedattackdetectorservice.yaml            | 2 +-
 manifests/load_generatorservice.yaml                          | 2 +-
 manifests/mock_blockchain.yaml                                | 2 +-
 manifests/monitoringservice.yaml                              | 2 +-
 manifests/nbiservice.yaml                                     | 2 +-
 manifests/nginx_ingress_http.yaml                             | 2 +-
 manifests/opticalattackdetectorservice.yaml                   | 2 +-
 manifests/opticalattackmanagerservice.yaml                    | 2 +-
 manifests/opticalattackmitigatorservice.yaml                  | 2 +-
 manifests/opticalcontrollerservice.yaml                       | 2 +-
 manifests/pathcompservice.yaml                                | 2 +-
 manifests/policyservice.yaml                                  | 2 +-
 manifests/prometheus.yaml                                     | 2 +-
 manifests/questdb/manifest.yaml                               | 2 +-
 manifests/servicemonitors.yaml                                | 2 +-
 manifests/serviceservice.yaml                                 | 2 +-
 manifests/sliceservice.yaml                                   | 2 +-
 manifests/teservice.yaml                                      | 2 +-
 manifests/webuiservice.yaml                                   | 2 +-
 manifests/ztpservice.yaml                                     | 2 +-
 my_deploy.sh                                                  | 2 +-
 proto/acl.proto                                               | 2 +-
 proto/attack_mitigator.proto                                  | 2 +-
 proto/bgpls.proto                                             | 2 +-
 proto/context.proto                                           | 2 +-
 proto/context_policy.proto                                    | 2 +-
 proto/dbscanserving.proto                                     | 2 +-
 proto/device.proto                                            | 2 +-
 proto/distributed_cybersecurity.proto                         | 2 +-
 proto/dlt_connector.proto                                     | 2 +-
 proto/dlt_gateway.proto                                       | 2 +-
 proto/e2eorchestrator.proto                                   | 2 +-
 proto/forecaster.proto                                        | 2 +-
 proto/generate_code_erlang.sh                                 | 2 +-
 proto/generate_code_java.sh                                   | 2 +-
 proto/generate_code_python.sh                                 | 4 ++--
 proto/generate_uml.sh                                         | 2 +-
 proto/health.proto                                            | 2 +-
 proto/interdomain.proto                                       | 2 +-
 proto/kpi_sample_types.proto                                  | 2 +-
 proto/l3_attackmitigator.proto                                | 2 +-
 proto/l3_centralizedattackdetector.proto                      | 2 +-
 proto/load_generator.proto                                    | 2 +-
 proto/monitoring.proto                                        | 2 +-
 proto/nbi.proto                                               | 2 +-
 proto/openconfig_device.proto                                 | 2 +-
 proto/optical_attack_detector.proto                           | 2 +-
 proto/optical_attack_mitigator.proto                          | 2 +-
 proto/pathcomp.proto                                          | 2 +-
 proto/policy.proto                                            | 2 +-
 proto/policy_action.proto                                     | 2 +-
 proto/policy_condition.proto                                  | 2 +-
 proto/service.proto                                           | 2 +-
 proto/slice.proto                                             | 2 +-
 proto/src/erlang/rebar.config                                 | 2 +-
 proto/src/erlang/src/tfpb.app.src                             | 2 +-
 proto/src/python/__init__.py                                  | 2 +-
 proto/src/python/asyncio/__init__.py                          | 2 +-
 proto/te.proto                                                | 2 +-
 proto/ztp.proto                                               | 2 +-
 scripts/add_license_header_to_files.sh                        | 2 +-
 scripts/build_run_report_tests_locally.sh                     | 2 +-
 scripts/cockroachdb_client.sh                                 | 2 +-
 scripts/create_component.sh                                   | 2 +-
 scripts/dump_logs.sh                                          | 2 +-
 scripts/expose_ingress_grpc.sh                                | 2 +-
 scripts/old/configure_dashboards_in_kubernetes.sh             | 2 +-
 scripts/old/deploy_in_kubernetes.sh                           | 2 +-
 scripts/old/open_dashboard.sh                                 | 2 +-
 scripts/old/open_webui.sh                                     | 2 +-
 scripts/report_coverage_all.sh                                | 2 +-
 scripts/report_coverage_common.sh                             | 2 +-
 scripts/report_coverage_context.sh                            | 2 +-
 scripts/report_coverage_device.sh                             | 2 +-
 scripts/report_coverage_l3_attackmitigator.sh                 | 2 +-
 scripts/report_coverage_l3_centralizedattackdetector.sh       | 2 +-
 scripts/report_coverage_l3_distributedattackdetector.sh       | 2 +-
 scripts/report_coverage_nbi.sh                                | 2 +-
 scripts/report_coverage_pathcomp.sh                           | 2 +-
 scripts/report_coverage_service.sh                            | 2 +-
 scripts/report_coverage_slice.sh                              | 2 +-
 scripts/run_tests_docker.sh                                   | 2 +-
 scripts/run_tests_locally-context.sh                          | 2 +-
 scripts/run_tests_locally-device-all.sh                       | 2 +-
 scripts/run_tests_locally-device-emulated.sh                  | 2 +-
 scripts/run_tests_locally-device-ietf-actn.sh                 | 2 +-
 scripts/run_tests_locally-device-microwave.sh                 | 2 +-
 scripts/run_tests_locally-device-openconfig.sh                | 2 +-
 scripts/run_tests_locally-device-p4.sh                        | 2 +-
 scripts/run_tests_locally-device-tapi.sh                      | 2 +-
 scripts/run_tests_locally-forecaster.sh                       | 2 +-
 scripts/run_tests_locally-interdomain-compute-domains.sh      | 2 +-
 scripts/run_tests_locally-interdomain-topology-abstractor.sh  | 2 +-
 scripts/run_tests_locally-nbi-all.sh                          | 2 +-
 scripts/run_tests_locally-nbi-etsi-bwm.sh                     | 2 +-
 scripts/run_tests_locally-nbi-ietf-l2vpn.sh                   | 2 +-
 scripts/run_tests_locally-nbi-ietf-l3vpn.sh                   | 2 +-
 scripts/run_tests_locally-nbi-ietf-network.sh                 | 2 +-
 scripts/run_tests_locally-nbi-tfs-api.sh                      | 2 +-
 scripts/run_tests_locally-optical-attack-detector.sh          | 2 +-
 scripts/run_tests_locally-pathcomp-frontend.sh                | 2 +-
 scripts/run_tests_locally-service.sh                          | 2 +-
 scripts/run_tests_locally-slice.sh                            | 2 +-
 scripts/run_tests_locally.sh                                  | 2 +-
 scripts/show_logs_automation.sh                               | 2 +-
 scripts/show_logs_bgp.sh                                      | 2 +-
 scripts/show_logs_context.sh                                  | 2 +-
 scripts/show_logs_device.sh                                   | 2 +-
 scripts/show_logs_dlt_connector.sh                            | 2 +-
 scripts/show_logs_dlt_gateway.sh                              | 2 +-
 scripts/show_logs_e2eorchestrator.sh                          | 2 +-
 scripts/show_logs_forecaster.sh                               | 2 +-
 scripts/show_logs_l3-attack-mitigator.sh                      | 2 +-
 scripts/show_logs_l3-centralized-attack-detector.sh           | 2 +-
 scripts/show_logs_load_generator.sh                           | 2 +-
 scripts/show_logs_monitoring.sh                               | 2 +-
 scripts/show_logs_nbi.sh                                      | 2 +-
 scripts/show_logs_opticalcontroller.sh                        | 2 +-
 scripts/show_logs_pathcomp_backend.sh                         | 2 +-
 scripts/show_logs_pathcomp_frontend.sh                        | 2 +-
 scripts/show_logs_service.sh                                  | 2 +-
 scripts/show_logs_slice.sh                                    | 2 +-
 scripts/show_logs_webui.sh                                    | 2 +-
 scripts/start_webui_dev_mode.sh                               | 2 +-
 scripts/wait_context_nats.sh                                  | 2 +-
 src/__init__.py                                               | 2 +-
 src/bgpls_speaker/.gitlab-ci.yml                              | 2 +-
 src/bgpls_speaker/Config.py                                   | 2 +-
 src/bgpls_speaker/Dockerfile                                  | 2 +-
 src/bgpls_speaker/__init__.py                                 | 2 +-
 src/bgpls_speaker/client/BgplsClient.py                       | 2 +-
 src/bgpls_speaker/client/__init__.py                          | 2 +-
 src/bgpls_speaker/quick_deploy.sh                             | 2 +-
 src/bgpls_speaker/requirements.in                             | 2 +-
 src/bgpls_speaker/service/BgplsService.py                     | 2 +-
 src/bgpls_speaker/service/BgplsServiceServicerImpl.py         | 2 +-
 src/bgpls_speaker/service/__init__.py                         | 2 +-
 src/bgpls_speaker/service/__main__.py                         | 2 +-
 src/bgpls_speaker/service/java/BGP4Parameters_3.xml           | 2 +-
 src/bgpls_speaker/service/java/exec_speakear_java.sh          | 2 +-
 .../service/java/netphony-topology/BGP4Parameters_3.xml       | 2 +-
 src/bgpls_speaker/service/java/netphony-topology/CHANGELOG    | 2 +-
 src/bgpls_speaker/service/java/netphony-topology/log4j2.xml   | 2 +-
 src/bgpls_speaker/service/java/netphony-topology/pom.xml      | 2 +-
 .../tid/bgp4Peer/bgp4session/BGP4PeerInitiatedSession.java    | 2 +-
 .../eu/teraflow/tid/bgp4Peer/bgp4session/BGP4Session.java     | 2 +-
 .../teraflow/tid/bgp4Peer/bgp4session/BGP4SessionClient.java  | 2 +-
 .../tid/bgp4Peer/bgp4session/BGP4SessionExistsException.java  | 2 +-
 .../tid/bgp4Peer/bgp4session/BGP4SessionsInformation.java     | 2 +-
 .../teraflow/tid/bgp4Peer/bgp4session/BGP4StateSession.java   | 2 +-
 .../teraflow/tid/bgp4Peer/bgp4session/ConnectRetryTimer.java  | 2 +-
 .../eu/teraflow/tid/bgp4Peer/bgp4session/DeadTimerThread.java | 2 +-
 .../teraflow/tid/bgp4Peer/bgp4session/GenericBGP4Session.java | 2 +-
 .../eu/teraflow/tid/bgp4Peer/bgp4session/KeepAliveThread.java | 2 +-
 .../teraflow/tid/bgp4Peer/bgp4session/KeepWaitTimerTask.java  | 2 +-
 .../teraflow/tid/bgp4Peer/bgp4session/OpenWaitTimerTask.java  | 2 +-
 .../src/main/java/eu/teraflow/tid/bgp4Peer/grpc/grpcApp.java  | 2 +-
 .../main/java/eu/teraflow/tid/bgp4Peer/grpc/grpcClient.java   | 2 +-
 .../java/eu/teraflow/tid/bgp4Peer/grpc/updateServiceImpl.java | 2 +-
 .../main/java/eu/teraflow/tid/bgp4Peer/json/bgpMarshal.java   | 2 +-
 .../tid/bgp4Peer/management/BGP4ManagementServer.java         | 2 +-
 .../tid/bgp4Peer/management/BGP4ManagementSession.java        | 2 +-
 .../java/eu/teraflow/tid/bgp4Peer/models/LinkNLRIMsg.java     | 2 +-
 .../java/eu/teraflow/tid/bgp4Peer/models/NodeNLRIMsg.java     | 2 +-
 .../eu/teraflow/tid/bgp4Peer/models/PathAttributeMsg.java     | 2 +-
 .../main/java/eu/teraflow/tid/bgp4Peer/models/UpdateMsg.java  | 2 +-
 .../java/eu/teraflow/tid/bgp4Peer/models/UpdateMsgList.java   | 2 +-
 .../java/eu/teraflow/tid/bgp4Peer/peer/BGP4Exception.java     | 2 +-
 .../java/eu/teraflow/tid/bgp4Peer/peer/BGP4LSPeerInfo.java    | 2 +-
 .../java/eu/teraflow/tid/bgp4Peer/peer/BGP4Parameters.java    | 2 +-
 .../teraflow/tid/bgp4Peer/peer/BGP4SessionClientManager.java  | 2 +-
 .../teraflow/tid/bgp4Peer/peer/BGP4SessionServerManager.java  | 2 +-
 .../src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGPPeer.java  | 2 +-
 .../main/java/eu/teraflow/tid/bgp4Peer/peer/BGPPeerMain.java  | 2 +-
 .../java/eu/teraflow/tid/bgp4Peer/peer/SaveTopologyinDB.java  | 2 +-
 .../main/java/eu/teraflow/tid/bgp4Peer/peer/SendTopology.java | 2 +-
 .../java/eu/teraflow/tid/bgp4Peer/tedb/BGP4DomainTEDB.java    | 2 +-
 .../eu/teraflow/tid/bgp4Peer/tedb/BGP4IntradomainTEDB.java    | 2 +-
 .../main/java/eu/teraflow/tid/bgp4Peer/tedb/IntraTEDBS.java   | 2 +-
 .../eu/teraflow/tid/bgp4Peer/updateTEDB/UpdateDispatcher.java | 2 +-
 .../java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdateLink.java  | 2 +-
 .../tid/bgp4Peer/updateTEDB/UpdateProccesorThread.java        | 2 +-
 .../tid/bgp4Peer/updateTEDB/UpdaterThreadRedisTED.java        | 2 +-
 .../eu/teraflow/tid/tedb/DatabaseControlSimplifiedLSA.java    | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/DomainTEDB.java        | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/EdgeUtils.java         | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/FileTEDBUpdater.java   | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/IT_Resources.java      | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/InterDomainEdge.java   | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/IntraDomainEdge.java   | 2 +-
 .../main/java/eu/teraflow/tid/tedb/IntraDomainWeightEdge.java | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/Layer.java             | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/MDTEDB.java            | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/MultiDomainTEDB.java   | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/MultiLayerTEDB.java    | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/Node_Info.java         | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/ReachabilityEntry.java | 2 +-
 .../main/java/eu/teraflow/tid/tedb/ReachabilityManager.java   | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/SSONInformation.java   | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/SSONListener.java      | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/SimpleTEDB.java        | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/TEDB.java              | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/TEDBUpdater.java       | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/TEDListener.java       | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/TE_Information.java    | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/WSONInformation.java   | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/WSONListener.java      | 2 +-
 .../teraflow/tid/tedb/controllers/TEDUpdaterController.java   | 2 +-
 .../teraflow/tid/tedb/controllers/TEDUpdaterFloodlight.java   | 2 +-
 .../java/eu/teraflow/tid/tedb/controllers/TEDUpdaterNOX.java  | 2 +-
 .../java/eu/teraflow/tid/tedb/controllers/TEDUpdaterODL.java  | 2 +-
 .../java/eu/teraflow/tid/tedb/controllers/TEDUpdaterRYU.java  | 2 +-
 .../eu/teraflow/tid/tedb/controllers/TEDUpdaterTREMA.java     | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/elements/AuthInfo.java | 2 +-
 .../main/java/eu/teraflow/tid/tedb/elements/Bandwidth.java    | 2 +-
 .../main/java/eu/teraflow/tid/tedb/elements/BgpParams.java    | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/elements/EndPoint.java | 2 +-
 .../main/java/eu/teraflow/tid/tedb/elements/IPNodeParams.java | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/elements/Intf.java     | 2 +-
 .../main/java/eu/teraflow/tid/tedb/elements/IsisParams.java   | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/elements/Link.java     | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/elements/Location.java | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/elements/Node.java     | 2 +-
 .../main/java/eu/teraflow/tid/tedb/elements/OspfParams.java   | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/elements/Path.java     | 2 +-
 .../java/eu/teraflow/tid/tedb/elements/PhyLinkParams.java     | 2 +-
 .../main/java/eu/teraflow/tid/tedb/elements/RouterDesc.java   | 2 +-
 .../main/java/eu/teraflow/tid/tedb/elements/RouterInfoPM.java | 2 +-
 .../src/main/java/eu/teraflow/tid/tedb/elements/Service.java  | 2 +-
 .../eu/teraflow/tid/tedb/elements/StaticRoutingParams.java    | 2 +-
 .../java/netphony-topology/src/main/proto/grpcService.proto   | 2 +-
 .../main/sample-config-files/TM_COP_example1/TMConfCOP.xml    | 2 +-
 .../src/main/sample-config-files/TM_COP_example1/network1.xml | 2 +-
 .../main/sample-config-files/TM_TAPI_example1/TMConfTAPI.xml  | 2 +-
 .../main/sample-config-files/TM_TAPI_example1/network1.xml    | 2 +-
 .../sample-config-files/bgpls_example1/BGP4Parameters_1.xml   | 2 +-
 .../sample-config-files/bgpls_example1/BGP4Parameters_2.xml   | 2 +-
 .../src/main/sample-config-files/bgpls_example1/network1.xml  | 2 +-
 .../src/main/sample-config-files/conf1wayTest/BGPLS1.xml      | 2 +-
 .../src/main/sample-config-files/conf1wayTest/BGPLS2.xml      | 2 +-
 .../src/main/sample-config-files/conf1wayTest/BGPLS3.xml      | 2 +-
 .../src/main/sample-config-files/conf1wayTest/TM1.xml         | 2 +-
 .../src/main/sample-config-files/conf1wayTest/TM2.xml         | 2 +-
 .../src/main/sample-config-files/conf1wayTest/TM3.xml         | 2 +-
 .../conf1wayTest/TMConfiguration_BGPLSreader_UNIFYwriter.xml  | 2 +-
 .../src/main/sample-config-files/conf1wayTest/network1.xml    | 2 +-
 .../src/main/sample-config-files/conf1wayTest/network2.xml    | 2 +-
 .../src/main/sample-config-files/conf1wayTest/network3.xml    | 2 +-
 .../main/sample-config-files/conf2waysReal/BGPLS1_2way.xml    | 2 +-
 .../main/sample-config-files/conf2waysReal/BGPLS2_2way.xml    | 2 +-
 .../main/sample-config-files/conf2waysReal/BGPLS3_2way.xml    | 2 +-
 .../src/main/sample-config-files/conf2waysReal/README         | 2 +-
 .../src/main/sample-config-files/conf2waysReal/TM1.xml        | 2 +-
 .../src/main/sample-config-files/conf2waysReal/TM2.xml        | 2 +-
 .../src/main/sample-config-files/conf2waysReal/TM3.xml        | 2 +-
 .../src/main/sample-config-files/conf2waysReal/network1.xml   | 2 +-
 .../src/main/sample-config-files/conf2waysReal/network2.xml   | 2 +-
 .../src/main/sample-config-files/conf2waysReal/network3.xml   | 2 +-
 .../src/main/sample-config-files/examples/BGP4Parameters.xml  | 2 +-
 .../main/sample-config-files/examples/BGP4ParametersRX.xml    | 2 +-
 .../main/sample-config-files/examples/BGP4ParametersTX.xml    | 2 +-
 .../main/sample-config-files/examples/BGP4ParametersTXRX.xml  | 2 +-
 .../main/sample-config-files/examples/BGP4Parameters_1.xml    | 2 +-
 .../main/sample-config-files/examples/BGP4Parameters_1_IT.xml | 2 +-
 .../main/sample-config-files/examples/BGP4Parameters_2.xml    | 2 +-
 .../main/sample-config-files/examples/BGP4Parameters_PCE.xml  | 2 +-
 .../main/sample-config-files/examples/BGP4Parameters_TM.xml   | 2 +-
 .../main/sample-config-files/examples/EmulatedTopology.xml    | 2 +-
 .../sample-config-files/examples/EmulatedTopologyECOC.xml     | 2 +-
 .../src/main/sample-config-files/examples/TMConfiguration.xml | 2 +-
 .../main/sample-config-files/examples/TMConfiguration2.xml    | 2 +-
 .../main/sample-config-files/examples/TMConfigurationCOP.xml  | 2 +-
 .../examples/TMConfiguration_BGPLSreader_COPwriter.xml        | 2 +-
 .../examples/TMConfiguration_BGPLSreader_IETFwriter.xml       | 2 +-
 .../examples/TMConfiguration_BGPLSreader_UNIFYwriter.xml      | 2 +-
 .../examples/TMConfiguration_COPreader_BGPLSsender.xml        | 2 +-
 .../examples/TMConfiguration_COPsender.xml                    | 2 +-
 .../src/main/sample-config-files/examples/log4j2.xml          | 2 +-
 .../src/main/sample-config-files/examples/network1_pce.xml    | 2 +-
 .../src/main/sample-config-files/examples/total.xml           | 2 +-
 .../src/main/sample-config-files/examples/total101.xml        | 2 +-
 .../src/main/sample-config-files/examples/total10v2.xml       | 2 +-
 .../src/test/java/es/tid/bgp/bgp4Peer/tests/BGP4PeerTest.java | 2 +-
 .../netphony-topology/src/test/resources/BGP4Parameters_1.xml | 2 +-
 .../src/test/resources/BGP4Parameters_1_IT.xml                | 2 +-
 .../netphony-topology/src/test/resources/BGP4Parameters_2.xml | 2 +-
 .../netphony-topology/src/test/resources/EmulatedTopology.xml | 2 +-
 .../src/test/resources/EmulatedTopologyECOC.xml               | 2 +-
 .../java/netphony-topology/src/test/resources/log4j2.xml      | 2 +-
 .../java/netphony-topology/src/test/resources/network1.xml    | 2 +-
 .../protobuf/grpc-java/src/main/proto/updateServiceGrpc.java  | 2 +-
 src/bgpls_speaker/service/java/netphony-topology/topology.iml | 2 +-
 src/bgpls_speaker/service/tools/DiscoveredDBManager.py        | 2 +-
 src/bgpls_speaker/service/tools/GrpcServer.py                 | 2 +-
 src/bgpls_speaker/service/tools/JavaRunner.py                 | 2 +-
 src/bgpls_speaker/service/tools/Tools.py                      | 2 +-
 src/bgpls_speaker/service/tools/__init__.py                   | 2 +-
 src/bgpls_speaker/service/tools/json_loader.py                | 2 +-
 src/bgpls_speaker/service/tools/protos/grpcService.proto      | 2 +-
 src/bgpls_speaker/tests/__init__.py                           | 2 +-
 src/bgpls_speaker/tests/test_unitary.py                       | 2 +-
 src/common/Constants.py                                       | 2 +-
 src/common/DeviceTypes.py                                     | 2 +-
 src/common/Settings.py                                        | 2 +-
 src/common/__init__.py                                        | 2 +-
 src/common/logger.py                                          | 2 +-
 src/common/message_broker/Constants.py                        | 2 +-
 src/common/message_broker/Factory.py                          | 2 +-
 src/common/message_broker/Message.py                          | 2 +-
 src/common/message_broker/MessageBroker.py                    | 2 +-
 src/common/message_broker/__init__.py                         | 2 +-
 src/common/message_broker/backend/BackendEnum.py              | 2 +-
 src/common/message_broker/backend/_Backend.py                 | 2 +-
 src/common/message_broker/backend/__init__.py                 | 2 +-
 src/common/message_broker/backend/inmemory/InMemoryBackend.py | 2 +-
 src/common/message_broker/backend/inmemory/__init__.py        | 2 +-
 src/common/message_broker/backend/nats/NatsBackend.py         | 2 +-
 src/common/message_broker/backend/nats/NatsBackendThread.py   | 2 +-
 src/common/message_broker/backend/nats/__init__.py            | 2 +-
 src/common/message_broker/backend/redis/RedisBackend.py       | 2 +-
 src/common/message_broker/backend/redis/__init__.py           | 2 +-
 src/common/message_broker/tests/__init__.py                   | 2 +-
 src/common/message_broker/tests/test_unitary.py               | 2 +-
 src/common/method_wrappers/Decorator.py                       | 2 +-
 src/common/method_wrappers/ServiceExceptions.py               | 2 +-
 src/common/method_wrappers/__init__.py                        | 2 +-
 src/common/method_wrappers/tests/DummyDeviceDriver.py         | 2 +-
 src/common/method_wrappers/tests/__init__.py                  | 2 +-
 src/common/method_wrappers/tests/__main__.py                  | 2 +-
 src/common/method_wrappers/tests/deploy_specs.sh              | 2 +-
 src/common/method_wrappers/tests/old/docker_grafana.sh        | 2 +-
 src/common/method_wrappers/tests/old/prometheus.yml           | 2 +-
 src/common/method_wrappers/tests/test_unitary.py              | 2 +-
 src/common/tests/EventTools.py                                | 2 +-
 src/common/tests/InMemoryObjectDatabase.py                    | 2 +-
 src/common/tests/InMemoryTimeSeriesDatabase.py                | 2 +-
 src/common/tests/MockMessageBroker.py                         | 2 +-
 src/common/tests/MockServicerImpl_Context.py                  | 2 +-
 src/common/tests/MockServicerImpl_Device.py                   | 2 +-
 src/common/tests/MockServicerImpl_DltGateway.py               | 2 +-
 src/common/tests/MockServicerImpl_Monitoring.py               | 2 +-
 src/common/tests/MockServicerImpl_Service.py                  | 2 +-
 src/common/tests/MockServicerImpl_Slice.py                    | 2 +-
 src/common/tests/PytestGenerateTests.py                       | 2 +-
 src/common/tests/__init__.py                                  | 2 +-
 src/common/tools/__init__.py                                  | 2 +-
 src/common/tools/client/RetryDecorator.py                     | 2 +-
 src/common/tools/client/__init__.py                           | 2 +-
 src/common/tools/context_queries/CheckType.py                 | 2 +-
 src/common/tools/context_queries/Connection.py                | 2 +-
 src/common/tools/context_queries/Context.py                   | 2 +-
 src/common/tools/context_queries/Device.py                    | 2 +-
 src/common/tools/context_queries/EndPoint.py                  | 2 +-
 src/common/tools/context_queries/InterDomain.py               | 2 +-
 src/common/tools/context_queries/InterDomain_old.py           | 2 +-
 src/common/tools/context_queries/Link.py                      | 2 +-
 src/common/tools/context_queries/Service.py                   | 2 +-
 src/common/tools/context_queries/Slice.py                     | 2 +-
 src/common/tools/context_queries/Topology.py                  | 2 +-
 src/common/tools/context_queries/__init__.py                  | 2 +-
 src/common/tools/descriptor/Loader.py                         | 2 +-
 src/common/tools/descriptor/Tools.py                          | 2 +-
 src/common/tools/descriptor/__init__.py                       | 2 +-
 src/common/tools/descriptor/old/BuildDescriptors.py           | 2 +-
 src/common/tools/descriptor/old/LoadDescriptors.py            | 2 +-
 src/common/tools/grpc/ConfigRules.py                          | 2 +-
 src/common/tools/grpc/Constraints.py                          | 2 +-
 src/common/tools/grpc/EndPointIds.py                          | 2 +-
 src/common/tools/grpc/ServiceIds.py                           | 2 +-
 src/common/tools/grpc/Tools.py                                | 2 +-
 src/common/tools/grpc/__init__.py                             | 2 +-
 src/common/tools/mutex_queues/MutexQueues.py                  | 2 +-
 src/common/tools/mutex_queues/__init__.py                     | 2 +-
 src/common/tools/object_factory/ConfigRule.py                 | 2 +-
 src/common/tools/object_factory/Connection.py                 | 2 +-
 src/common/tools/object_factory/Constraint.py                 | 2 +-
 src/common/tools/object_factory/Context.py                    | 2 +-
 src/common/tools/object_factory/Device.py                     | 2 +-
 src/common/tools/object_factory/EndPoint.py                   | 2 +-
 src/common/tools/object_factory/Link.py                       | 2 +-
 src/common/tools/object_factory/Location.py                   | 2 +-
 src/common/tools/object_factory/PolicyRule.py                 | 2 +-
 src/common/tools/object_factory/Service.py                    | 2 +-
 src/common/tools/object_factory/Slice.py                      | 2 +-
 src/common/tools/object_factory/Topology.py                   | 2 +-
 src/common/tools/object_factory/__init__.py                   | 2 +-
 src/common/tools/service/GenericGrpcService.py                | 2 +-
 src/common/tools/service/GenericRestServer.py                 | 2 +-
 src/common/tools/service/__init__.py                          | 2 +-
 src/common/tools/timestamp/Converters.py                      | 2 +-
 src/common/tools/timestamp/__init__.py                        | 2 +-
 src/common/type_checkers/Assertions.py                        | 2 +-
 src/common/type_checkers/Checkers.py                          | 2 +-
 src/common/type_checkers/__init__.py                          | 2 +-
 src/context/.gitlab-ci.yml                                    | 2 +-
 src/context/Config.py                                         | 2 +-
 src/context/Dockerfile                                        | 2 +-
 src/context/__init__.py                                       | 2 +-
 src/context/client/ContextClient.py                           | 2 +-
 src/context/client/EventsCollector.py                         | 2 +-
 src/context/client/__init__.py                                | 2 +-
 src/context/data/cleanup_commands.sql                         | 2 +-
 src/context/requirements.in                                   | 2 +-
 src/context/service/ContextService.py                         | 2 +-
 src/context/service/ContextServiceServicerImpl.py             | 2 +-
 src/context/service/__init__.py                               | 2 +-
 src/context/service/__main__.py                               | 2 +-
 src/context/service/database/Component.py                     | 2 +-
 src/context/service/database/ConfigRule.py                    | 2 +-
 src/context/service/database/Connection.py                    | 2 +-
 src/context/service/database/Constraint.py                    | 2 +-
 src/context/service/database/Context.py                       | 2 +-
 src/context/service/database/Device.py                        | 2 +-
 src/context/service/database/EndPoint.py                      | 2 +-
 src/context/service/database/Engine.py                        | 2 +-
 src/context/service/database/Events.py                        | 2 +-
 src/context/service/database/Link.py                          | 2 +-
 src/context/service/database/OpticalConfig.py                 | 2 +-
 src/context/service/database/PolicyRule.py                    | 2 +-
 src/context/service/database/Service.py                       | 2 +-
 src/context/service/database/Slice.py                         | 2 +-
 src/context/service/database/Topology.py                      | 2 +-
 src/context/service/database/__init__.py                      | 2 +-
 src/context/service/database/models/ComponentModel.py         | 2 +-
 src/context/service/database/models/ConfigRuleModel.py        | 2 +-
 src/context/service/database/models/ConnectionModel.py        | 2 +-
 src/context/service/database/models/ConstraintModel.py        | 2 +-
 src/context/service/database/models/ContextModel.py           | 2 +-
 src/context/service/database/models/DeviceModel.py            | 2 +-
 src/context/service/database/models/EndPointModel.py          | 2 +-
 src/context/service/database/models/LinkModel.py              | 2 +-
 src/context/service/database/models/OpticalConfigModel.py     | 2 +-
 src/context/service/database/models/PolicyRuleModel.py        | 2 +-
 src/context/service/database/models/ServiceModel.py           | 2 +-
 src/context/service/database/models/SliceModel.py             | 2 +-
 src/context/service/database/models/TopologyModel.py          | 2 +-
 src/context/service/database/models/_Base.py                  | 2 +-
 src/context/service/database/models/__init__.py               | 2 +-
 src/context/service/database/models/enums/ConfigAction.py     | 2 +-
 src/context/service/database/models/enums/ConstraintAction.py | 2 +-
 src/context/service/database/models/enums/DeviceDriver.py     | 2 +-
 .../service/database/models/enums/DeviceOperationalStatus.py  | 2 +-
 src/context/service/database/models/enums/KpiSampleType.py    | 2 +-
 src/context/service/database/models/enums/PolicyRuleState.py  | 2 +-
 src/context/service/database/models/enums/ServiceStatus.py    | 2 +-
 src/context/service/database/models/enums/ServiceType.py      | 2 +-
 src/context/service/database/models/enums/SliceStatus.py      | 2 +-
 src/context/service/database/models/enums/_GrpcToEnum.py      | 2 +-
 src/context/service/database/models/enums/__init__.py         | 2 +-
 src/context/service/database/tools/FastHasher.py              | 2 +-
 src/context/service/database/tools/__init__.py                | 2 +-
 src/context/service/database/uuids/Connection.py              | 2 +-
 src/context/service/database/uuids/Context.py                 | 2 +-
 src/context/service/database/uuids/Device.py                  | 2 +-
 src/context/service/database/uuids/EndPoint.py                | 2 +-
 src/context/service/database/uuids/Link.py                    | 2 +-
 src/context/service/database/uuids/PolicuRule.py              | 2 +-
 src/context/service/database/uuids/Service.py                 | 2 +-
 src/context/service/database/uuids/Slice.py                   | 2 +-
 src/context/service/database/uuids/Topology.py                | 2 +-
 src/context/service/database/uuids/_Builder.py                | 2 +-
 src/context/service/database/uuids/__init__.py                | 2 +-
 src/context/tests/Constants.py                                | 2 +-
 src/context/tests/Objects.py                                  | 2 +-
 src/context/tests/__init__.py                                 | 2 +-
 src/context/tests/conftest.py                                 | 2 +-
 src/context/tests/test_connection.py                          | 2 +-
 src/context/tests/test_context.py                             | 2 +-
 src/context/tests/test_device.py                              | 2 +-
 src/context/tests/test_hasher.py                              | 2 +-
 src/context/tests/test_link.py                                | 2 +-
 src/context/tests/test_policy.py                              | 2 +-
 src/context/tests/test_service.py                             | 2 +-
 src/context/tests/test_slice.py                               | 2 +-
 src/context/tests/test_topology.py                            | 2 +-
 src/dbscanserving/.gitlab-ci.yml                              | 2 +-
 src/dbscanserving/Config.py                                   | 2 +-
 src/dbscanserving/Dockerfile                                  | 2 +-
 src/dbscanserving/__init__.py                                 | 2 +-
 src/dbscanserving/client/DbscanServingClient.py               | 2 +-
 src/dbscanserving/client/__init__.py                          | 2 +-
 src/dbscanserving/requirements.in                             | 2 +-
 src/dbscanserving/service/DbscanService.py                    | 2 +-
 src/dbscanserving/service/DbscanServiceServicerImpl.py        | 2 +-
 src/dbscanserving/service/__init__.py                         | 2 +-
 src/dbscanserving/service/__main__.py                         | 2 +-
 src/dbscanserving/tests/__init__.py                           | 2 +-
 src/dbscanserving/tests/test_unitary.py                       | 2 +-
 src/device/.gitlab-ci.yml                                     | 2 +-
 src/device/Config.py                                          | 2 +-
 src/device/Dockerfile                                         | 2 +-
 src/device/__init__.py                                        | 2 +-
 src/device/client/DeviceClient.py                             | 2 +-
 src/device/client/__init__.py                                 | 2 +-
 src/device/requirements.in                                    | 2 +-
 src/device/service/DeviceService.py                           | 2 +-
 src/device/service/DeviceServiceServicerImpl.py               | 2 +-
 src/device/service/ErrorMessages.py                           | 2 +-
 src/device/service/OpenConfigServicer.py                      | 2 +-
 src/device/service/Tools.py                                   | 2 +-
 src/device/service/__init__.py                                | 2 +-
 src/device/service/__main__.py                                | 2 +-
 src/device/service/driver_api/AnyTreeTools.py                 | 2 +-
 src/device/service/driver_api/DriverFactory.py                | 2 +-
 src/device/service/driver_api/DriverInstanceCache.py          | 2 +-
 src/device/service/driver_api/Exceptions.py                   | 2 +-
 src/device/service/driver_api/FilterFields.py                 | 2 +-
 src/device/service/driver_api/ImportTopologyEnum.py           | 2 +-
 src/device/service/driver_api/_Driver.py                      | 2 +-
 src/device/service/driver_api/__init__.py                     | 2 +-
 src/device/service/drivers/__init__.py                        | 2 +-
 src/device/service/drivers/emulated/Constants.py              | 2 +-
 src/device/service/drivers/emulated/EmulatedDriver.py         | 2 +-
 .../service/drivers/emulated/SyntheticSamplingParameters.py   | 2 +-
 src/device/service/drivers/emulated/Tools.py                  | 2 +-
 src/device/service/drivers/emulated/__init__.py               | 2 +-
 .../service/drivers/gnmi_openconfig/DeltaSampleCache.py       | 2 +-
 .../service/drivers/gnmi_openconfig/GnmiOpenConfigDriver.py   | 2 +-
 .../service/drivers/gnmi_openconfig/GnmiSessionHandler.py     | 2 +-
 .../service/drivers/gnmi_openconfig/MonitoringThread.py       | 2 +-
 src/device/service/drivers/gnmi_openconfig/__init__.py        | 2 +-
 src/device/service/drivers/gnmi_openconfig/gnmi/__init__.py   | 2 +-
 .../service/drivers/gnmi_openconfig/handlers/Component.py     | 2 +-
 .../service/drivers/gnmi_openconfig/handlers/Interface.py     | 2 +-
 .../drivers/gnmi_openconfig/handlers/InterfaceCounter.py      | 2 +-
 .../drivers/gnmi_openconfig/handlers/NetworkInstance.py       | 2 +-
 .../gnmi_openconfig/handlers/NetworkInstanceInterface.py      | 2 +-
 .../gnmi_openconfig/handlers/NetworkInstanceStaticRoute.py    | 2 +-
 src/device/service/drivers/gnmi_openconfig/handlers/Tools.py  | 2 +-
 .../service/drivers/gnmi_openconfig/handlers/_Handler.py      | 2 +-
 .../service/drivers/gnmi_openconfig/handlers/__init__.py      | 2 +-
 .../drivers/gnmi_openconfig/handlers/old_bgp_handler.txt      | 2 +-
 .../service/drivers/gnmi_openconfig/tools/Capabilities.py     | 2 +-
 src/device/service/drivers/gnmi_openconfig/tools/Channel.py   | 2 +-
 src/device/service/drivers/gnmi_openconfig/tools/Path.py      | 2 +-
 .../service/drivers/gnmi_openconfig/tools/Subscriptions.py    | 2 +-
 src/device/service/drivers/gnmi_openconfig/tools/Value.py     | 2 +-
 src/device/service/drivers/gnmi_openconfig/tools/__init__.py  | 2 +-
 src/device/service/drivers/ietf_actn/IetfActnDriver.py        | 2 +-
 src/device/service/drivers/ietf_actn/Tools.py                 | 2 +-
 src/device/service/drivers/ietf_actn/__init__.py              | 2 +-
 .../service/drivers/ietf_actn/handlers/EthtServiceHandler.py  | 2 +-
 .../service/drivers/ietf_actn/handlers/OsuTunnelHandler.py    | 2 +-
 .../service/drivers/ietf_actn/handlers/RestApiClient.py       | 2 +-
 src/device/service/drivers/ietf_actn/handlers/__init__.py     | 2 +-
 src/device/service/drivers/ietf_l2vpn/IetfL2VpnDriver.py      | 2 +-
 src/device/service/drivers/ietf_l2vpn/TfsApiClient.py         | 2 +-
 src/device/service/drivers/ietf_l2vpn/Tools.py                | 2 +-
 src/device/service/drivers/ietf_l2vpn/__init__.py             | 2 +-
 src/device/service/drivers/microwave/IETFApiDriver.py         | 2 +-
 src/device/service/drivers/microwave/Tools.py                 | 2 +-
 src/device/service/drivers/microwave/__init__.py              | 2 +-
 src/device/service/drivers/oc_driver/OCDriver.py              | 2 +-
 src/device/service/drivers/oc_driver/RetryDecorator.py        | 2 +-
 src/device/service/drivers/oc_driver/Tools.py                 | 2 +-
 src/device/service/drivers/oc_driver/__init__.py              | 2 +-
 .../drivers/oc_driver/templates/Interfaces/__init__.py        | 2 +-
 .../drivers/oc_driver/templates/Interfaces/interfaces.py      | 2 +-
 src/device/service/drivers/oc_driver/templates/Tools.py       | 2 +-
 .../service/drivers/oc_driver/templates/VPN/__init__.py       | 2 +-
 .../service/drivers/oc_driver/templates/VPN/physical.py       | 2 +-
 src/device/service/drivers/oc_driver/templates/__init__.py    | 2 +-
 src/device/service/drivers/openconfig/OpenConfigDriver.py     | 2 +-
 src/device/service/drivers/openconfig/RetryDecorator.py       | 2 +-
 src/device/service/drivers/openconfig/Tools.py                | 2 +-
 src/device/service/drivers/openconfig/__init__.py             | 2 +-
 .../drivers/openconfig/templates/ACL/ACL_multivendor.py       | 2 +-
 .../service/drivers/openconfig/templates/ACL/__init__.py      | 2 +-
 src/device/service/drivers/openconfig/templates/Acl.py        | 2 +-
 src/device/service/drivers/openconfig/templates/EndPoints.py  | 2 +-
 src/device/service/drivers/openconfig/templates/Interfaces.py | 2 +-
 src/device/service/drivers/openconfig/templates/Inventory.py  | 2 +-
 src/device/service/drivers/openconfig/templates/Namespace.py  | 2 +-
 .../service/drivers/openconfig/templates/NetworkInstances.py  | 2 +-
 .../service/drivers/openconfig/templates/RoutingPolicy.py     | 2 +-
 src/device/service/drivers/openconfig/templates/Tools.py      | 2 +-
 .../openconfig/templates/VPN/Interfaces_multivendor.py        | 2 +-
 .../openconfig/templates/VPN/Network_instance_multivendor.py  | 2 +-
 .../drivers/openconfig/templates/VPN/Routing_policy.py        | 2 +-
 .../service/drivers/openconfig/templates/VPN/__init__.py      | 2 +-
 src/device/service/drivers/openconfig/templates/__init__.py   | 2 +-
 src/device/service/drivers/optical_tfs/OpticalTfsDriver.py    | 2 +-
 src/device/service/drivers/optical_tfs/Tools.py               | 2 +-
 src/device/service/drivers/optical_tfs/__init__.py            | 2 +-
 src/device/service/drivers/p4/__init__.py                     | 2 +-
 src/device/service/drivers/p4/p4_client.py                    | 2 +-
 src/device/service/drivers/p4/p4_common.py                    | 2 +-
 src/device/service/drivers/p4/p4_context.py                   | 2 +-
 src/device/service/drivers/p4/p4_driver.py                    | 2 +-
 src/device/service/drivers/p4/p4_exception.py                 | 2 +-
 src/device/service/drivers/p4/p4_global_options.py            | 2 +-
 src/device/service/drivers/p4/p4_manager.py                   | 2 +-
 src/device/service/drivers/transport_api/Tools.py             | 2 +-
 .../service/drivers/transport_api/TransportApiDriver.py       | 2 +-
 src/device/service/drivers/transport_api/__init__.py          | 2 +-
 src/device/service/drivers/xr/XrDriver.py                     | 2 +-
 src/device/service/drivers/xr/__init__.py                     | 2 +-
 src/device/service/drivers/xr/cm-cli.py                       | 2 +-
 src/device/service/drivers/xr/cm/__init__.py                  | 2 +-
 src/device/service/drivers/xr/cm/cm_connection.py             | 2 +-
 src/device/service/drivers/xr/cm/connection.py                | 2 +-
 src/device/service/drivers/xr/cm/constellation.py             | 2 +-
 src/device/service/drivers/xr/cm/tests/__init__.py            | 2 +-
 src/device/service/drivers/xr/cm/tests/test_cm_connection.py  | 2 +-
 src/device/service/drivers/xr/cm/tests/test_connection.py     | 2 +-
 src/device/service/drivers/xr/cm/tests/test_constellation.py  | 2 +-
 .../service/drivers/xr/cm/tests/test_transport_capacitity.py  | 2 +-
 .../service/drivers/xr/cm/tests/test_xr_service_set_config.py | 2 +-
 src/device/service/drivers/xr/cm/tf.py                        | 2 +-
 src/device/service/drivers/xr/cm/tf_service.py                | 2 +-
 src/device/service/drivers/xr/cm/transport_capacity.py        | 2 +-
 src/device/service/drivers/xr/cm/utils.py                     | 2 +-
 src/device/service/drivers/xr/service-cli.py                  | 2 +-
 src/device/service/drivers/xr/setup_test_env.sh               | 2 +-
 src/device/service/monitoring/MonitoringLoop.py               | 2 +-
 src/device/service/monitoring/MonitoringLoops.py              | 2 +-
 src/device/service/monitoring/__init__.py                     | 2 +-
 src/device/tests/CommonObjects.py                             | 2 +-
 src/device/tests/Device_Emulated.py                           | 2 +-
 src/device/tests/Device_Microwave_Template.py                 | 2 +-
 src/device/tests/Device_OpenConfig_Template.py                | 2 +-
 src/device/tests/Device_Transport_Api_Template.py             | 2 +-
 src/device/tests/MockService_Dependencies.py                  | 2 +-
 src/device/tests/PrepareTestScenario.py                       | 2 +-
 src/device/tests/__init__.py                                  | 2 +-
 src/device/tests/device_p4.py                                 | 2 +-
 src/device/tests/mock_p4runtime_service.py                    | 2 +-
 src/device/tests/mock_p4runtime_servicer_impl.py              | 2 +-
 src/device/tests/test_gnmi.py                                 | 2 +-
 src/device/tests/test_internal_p4.py                          | 2 +-
 src/device/tests/test_netconf.py                              | 2 +-
 src/device/tests/test_unitary_emulated.py                     | 2 +-
 src/device/tests/test_unitary_ietf_actn.py                    | 2 +-
 src/device/tests/test_unitary_microwave.py                    | 2 +-
 src/device/tests/test_unitary_openconfig.py                   | 2 +-
 src/device/tests/test_unitary_p4.py                           | 2 +-
 src/device/tests/test_unitary_tapi.py                         | 2 +-
 src/dlt/.gitlab-ci.yml                                        | 2 +-
 src/dlt/__init__.py                                           | 2 +-
 src/dlt/connector/Config.py                                   | 2 +-
 src/dlt/connector/Dockerfile                                  | 2 +-
 src/dlt/connector/__init__.py                                 | 2 +-
 src/dlt/connector/client/DltConnectorClient.py                | 2 +-
 src/dlt/connector/client/DltEventsCollector.py                | 2 +-
 src/dlt/connector/client/DltGatewayClient.py                  | 2 +-
 src/dlt/connector/client/__init__.py                          | 2 +-
 src/dlt/connector/requirements.in                             | 2 +-
 src/dlt/connector/service/DltConnectorService.py              | 2 +-
 src/dlt/connector/service/DltConnectorServiceServicerImpl.py  | 2 +-
 src/dlt/connector/service/__init__.py                         | 2 +-
 src/dlt/connector/service/__main__.py                         | 2 +-
 .../connector/service/event_dispatcher/DltEventDispatcher.py  | 2 +-
 src/dlt/connector/service/event_dispatcher/__init__.py        | 2 +-
 src/dlt/connector/service/tools/Checkers.py                   | 2 +-
 src/dlt/connector/service/tools/__init__.py                   | 2 +-
 src/dlt/connector/tests/MockService_Dependencies.py           | 2 +-
 src/dlt/connector/tests/Objects.py                            | 2 +-
 src/dlt/connector/tests/PrepareTestScenario.py                | 2 +-
 src/dlt/connector/tests/__init__.py                           | 2 +-
 src/dlt/connector/tests/basic.py                              | 2 +-
 src/dlt/connector/tests/test_unitary.py                       | 2 +-
 src/dlt/gateway/Dockerfile                                    | 2 +-
 src/dlt/mock_blockchain/Dockerfile                            | 2 +-
 src/dlt/mock_blockchain/__init__.py                           | 2 +-
 src/dlt/mock_blockchain/requirements.in                       | 2 +-
 src/dlt/mock_blockchain/service/__init__.py                   | 2 +-
 src/dlt/mock_blockchain/service/__main__.py                   | 2 +-
 src/dlt/performance/__init__.py                               | 2 +-
 src/dlt/performance/__main__.py                               | 2 +-
 src/dlt/performance/play_ground/Dlt.py                        | 2 +-
 src/dlt/performance/play_ground/Enums.py                      | 2 +-
 src/dlt/performance/play_ground/PerfData.py                   | 2 +-
 src/dlt/performance/play_ground/PerfPoint.py                  | 2 +-
 src/dlt/performance/play_ground/Random.py                     | 2 +-
 src/dlt/performance/play_ground/Settings.py                   | 2 +-
 src/dlt/performance/play_ground/__init__.py                   | 2 +-
 src/dlt/performance/run_test.sh                               | 2 +-
 src/e2e_orchestrator/.gitlab-ci.yml                           | 2 +-
 src/e2e_orchestrator/Config.py                                | 2 +-
 src/e2e_orchestrator/Dockerfile                               | 2 +-
 src/e2e_orchestrator/__init__.py                              | 2 +-
 src/e2e_orchestrator/client/E2EOrchestratorClient.py          | 2 +-
 src/e2e_orchestrator/client/__init__.py                       | 2 +-
 src/e2e_orchestrator/requirements.in                          | 2 +-
 src/e2e_orchestrator/service/E2EOrchestratorService.py        | 2 +-
 .../service/E2EOrchestratorServiceServicerImpl.py             | 2 +-
 src/e2e_orchestrator/service/__init__.py                      | 2 +-
 src/e2e_orchestrator/service/__main__.py                      | 2 +-
 src/e2e_orchestrator/tests/__init__.py                        | 2 +-
 src/e2e_orchestrator/tests/deploy_specs.sh                    | 2 +-
 src/e2e_orchestrator/tests/functional_tests/Fixtures.py       | 2 +-
 src/e2e_orchestrator/tests/functional_tests/Objects.py        | 2 +-
 src/e2e_orchestrator/tests/functional_tests/__init__.py       | 2 +-
 .../tests/functional_tests/test_functional_bootstrap.py       | 2 +-
 .../tests/functional_tests/test_functional_cleanup.py         | 2 +-
 .../tests/functional_tests/test_functional_compute_path.py    | 2 +-
 src/e2e_orchestrator/tests/redeploy.sh                        | 2 +-
 src/e2e_orchestrator/tests/run_test_01_bootstrap.sh           | 2 +-
 src/e2e_orchestrator/tests/run_test_02_compute_path.sh        | 2 +-
 src/e2e_orchestrator/tests/run_test_03_cleanup.sh             | 2 +-
 src/e2e_orchestrator/tests/run_tests.sh                       | 2 +-
 src/forecaster/.gitlab-ci.yml                                 | 2 +-
 src/forecaster/Config.py                                      | 2 +-
 src/forecaster/Dockerfile                                     | 2 +-
 src/forecaster/__init__.py                                    | 2 +-
 src/forecaster/client/ForecasterClient.py                     | 2 +-
 src/forecaster/client/__init__.py                             | 2 +-
 src/forecaster/requirements.in                                | 2 +-
 src/forecaster/service/Forecaster.py                          | 2 +-
 src/forecaster/service/ForecasterService.py                   | 2 +-
 src/forecaster/service/ForecasterServiceServicerImpl.py       | 2 +-
 src/forecaster/service/KpiManager.py                          | 2 +-
 src/forecaster/service/__init__.py                            | 2 +-
 src/forecaster/service/__main__.py                            | 2 +-
 src/forecaster/tests/MockService_Dependencies.py              | 2 +-
 src/forecaster/tests/PrepareTestScenario.py                   | 2 +-
 src/forecaster/tests/Tools.py                                 | 2 +-
 src/forecaster/tests/__init__.py                              | 2 +-
 src/forecaster/tests/data/inject_samples.py                   | 2 +-
 src/forecaster/tests/test_unitary.py                          | 2 +-
 src/gitlab-ci.yml_generator.py                                | 2 +-
 src/interdomain/.gitlab-ci.yml                                | 2 +-
 src/interdomain/Config.py                                     | 2 +-
 src/interdomain/Dockerfile                                    | 2 +-
 src/interdomain/__init__.py                                   | 2 +-
 src/interdomain/client/InterdomainClient.py                   | 2 +-
 src/interdomain/client/__init__.py                            | 2 +-
 src/interdomain/requirements.in                               | 2 +-
 src/interdomain/service/InterdomainService.py                 | 2 +-
 src/interdomain/service/InterdomainServiceServicerImpl.py     | 2 +-
 src/interdomain/service/RemoteDomainClients.py                | 2 +-
 src/interdomain/service/Tools.py                              | 2 +-
 src/interdomain/service/__init__.py                           | 2 +-
 src/interdomain/service/__main__.py                           | 2 +-
 .../service/_old_code/InterdomainServiceServicerImpl.py       | 2 +-
 src/interdomain/service/topology_abstractor/AbstractDevice.py | 2 +-
 src/interdomain/service/topology_abstractor/AbstractLink.py   | 2 +-
 .../service/topology_abstractor/DltRecordSender.py            | 2 +-
 .../service/topology_abstractor/TopologyAbstractor.py         | 2 +-
 src/interdomain/service/topology_abstractor/Types.py          | 2 +-
 src/interdomain/service/topology_abstractor/__init__.py       | 2 +-
 src/interdomain/tests/__init__.py                             | 2 +-
 src/interdomain/tests/old_tests.py                            | 2 +-
 src/interdomain/tests/test_compute_domains.py                 | 2 +-
 src/interdomain/tests/test_topology_abstractor.py             | 2 +-
 src/l3_attackmitigator/.gitlab-ci.yml                         | 2 +-
 src/l3_attackmitigator/Config.py                              | 2 +-
 src/l3_attackmitigator/Dockerfile                             | 2 +-
 src/l3_attackmitigator/__init__.py                            | 2 +-
 src/l3_attackmitigator/client/__init__.py                     | 2 +-
 src/l3_attackmitigator/client/l3_attackmitigatorClient.py     | 2 +-
 src/l3_attackmitigator/requirements.in                        | 2 +-
 src/l3_attackmitigator/service/__init__.py                    | 2 +-
 src/l3_attackmitigator/service/__main__.py                    | 2 +-
 src/l3_attackmitigator/service/l3_attackmitigatorService.py   | 2 +-
 .../service/l3_attackmitigatorServiceServicerImpl.py          | 2 +-
 src/l3_attackmitigator/tests/__init__.py                      | 2 +-
 src/l3_attackmitigator/tests/test_unitary.py                  | 2 +-
 src/l3_centralizedattackdetector/.gitlab-ci.yml               | 2 +-
 src/l3_centralizedattackdetector/Config.py                    | 2 +-
 src/l3_centralizedattackdetector/Dockerfile                   | 2 +-
 src/l3_centralizedattackdetector/__init__.py                  | 2 +-
 src/l3_centralizedattackdetector/client/__init__.py           | 2 +-
 .../client/l3_centralizedattackdetectorClient.py              | 2 +-
 src/l3_centralizedattackdetector/requirements.in              | 2 +-
 src/l3_centralizedattackdetector/service/__init__.py          | 2 +-
 src/l3_centralizedattackdetector/service/__main__.py          | 2 +-
 .../service/l3_centralizedattackdetectorService.py            | 2 +-
 .../l3_centralizedattackdetectorServiceServicerImpl.py        | 2 +-
 src/l3_centralizedattackdetector/tests/__init__.py            | 2 +-
 src/l3_centralizedattackdetector/tests/test_unitary.py        | 2 +-
 src/l3_distributedattackdetector/.gitlab-ci.yml               | 2 +-
 src/l3_distributedattackdetector/Config.py                    | 2 +-
 src/l3_distributedattackdetector/Dockerfile                   | 2 +-
 src/l3_distributedattackdetector/__init__.py                  | 2 +-
 src/l3_distributedattackdetector/requirements.in              | 2 +-
 src/l3_distributedattackdetector/service/__init__.py          | 2 +-
 src/l3_distributedattackdetector/service/__main__.py          | 2 +-
 .../service/l3_distributedattackdetector.py                   | 2 +-
 src/l3_distributedattackdetector/tests/__init__.py            | 2 +-
 src/l3_distributedattackdetector/tests/data_generator.py      | 2 +-
 src/l3_distributedattackdetector/tests/test_unitary.py        | 2 +-
 src/load_generator/.gitlab-ci.yml                             | 2 +-
 src/load_generator/Config.py                                  | 2 +-
 src/load_generator/Dockerfile                                 | 2 +-
 src/load_generator/__init__.py                                | 2 +-
 src/load_generator/client/LoadGeneratorClient.py              | 2 +-
 src/load_generator/client/__init__.py                         | 2 +-
 src/load_generator/command/__init__.py                        | 2 +-
 src/load_generator/command/__main__.py                        | 2 +-
 src/load_generator/load_gen/Constants.py                      | 2 +-
 src/load_generator/load_gen/DltTools.py                       | 2 +-
 src/load_generator/load_gen/Parameters.py                     | 2 +-
 src/load_generator/load_gen/RequestGenerator.py               | 2 +-
 src/load_generator/load_gen/RequestScheduler.py               | 2 +-
 src/load_generator/load_gen/__init__.py                       | 2 +-
 src/load_generator/requirements.in                            | 2 +-
 src/load_generator/run.sh                                     | 2 +-
 src/load_generator/service/Constants.py                       | 2 +-
 src/load_generator/service/LoadGeneratorService.py            | 2 +-
 .../service/LoadGeneratorServiceServicerImpl.py               | 2 +-
 src/load_generator/service/__init__.py                        | 2 +-
 src/load_generator/service/__main__.py                        | 2 +-
 src/load_generator/tests/__init__.py                          | 2 +-
 src/load_generator/tests/deploy_specs.sh                      | 2 +-
 src/load_generator/tests/test_dlt_functional.py               | 2 +-
 src/load_generator/tools/ListScalarRange.py                   | 2 +-
 src/load_generator/tools/__init__.py                          | 2 +-
 src/monitoring/.gitlab-ci.yml                                 | 2 +-
 src/monitoring/Dockerfile                                     | 2 +-
 src/monitoring/__init__.py                                    | 2 +-
 src/monitoring/client/MonitoringClient.py                     | 2 +-
 src/monitoring/client/__init__.py                             | 2 +-
 src/monitoring/requirements.in                                | 2 +-
 src/monitoring/service/AlarmManager.py                        | 2 +-
 src/monitoring/service/EventTools.py                          | 2 +-
 src/monitoring/service/InfluxTools.py                         | 2 +-
 src/monitoring/service/ManagementDBTools.py                   | 2 +-
 src/monitoring/service/MetricsDBTools.py                      | 2 +-
 src/monitoring/service/MonitoringService.py                   | 2 +-
 src/monitoring/service/MonitoringServiceServicerImpl.py       | 2 +-
 src/monitoring/service/NameMapping.py                         | 2 +-
 src/monitoring/service/SubscriptionManager.py                 | 2 +-
 src/monitoring/service/__init__.py                            | 2 +-
 src/monitoring/service/__main__.py                            | 2 +-
 src/monitoring/tests/Messages.py                              | 2 +-
 src/monitoring/tests/Objects.py                               | 2 +-
 src/monitoring/tests/__init__.py                              | 2 +-
 src/monitoring/tests/test_unitary.py                          | 2 +-
 src/nbi/.gitlab-ci.yml                                        | 2 +-
 src/nbi/Config.py                                             | 2 +-
 src/nbi/Dockerfile                                            | 2 +-
 src/nbi/__init__.py                                           | 2 +-
 src/nbi/client/NbiClient.py                                   | 2 +-
 src/nbi/client/__init__.py                                    | 2 +-
 src/nbi/requirements.in                                       | 2 +-
 src/nbi/service/NbiService.py                                 | 2 +-
 src/nbi/service/NbiServiceServicerImpl.py                     | 2 +-
 src/nbi/service/__init__.py                                   | 2 +-
 src/nbi/service/__main__.py                                   | 2 +-
 src/nbi/service/rest_server/RestServer.py                     | 2 +-
 src/nbi/service/rest_server/__init__.py                       | 2 +-
 src/nbi/service/rest_server/nbi_plugins/__init__.py           | 2 +-
 src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Resources.py | 2 +-
 src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py     | 2 +-
 src/nbi/service/rest_server/nbi_plugins/etsi_bwm/__init__.py  | 2 +-
 .../service/rest_server/nbi_plugins/ietf_l2vpn/Constants.py   | 2 +-
 .../rest_server/nbi_plugins/ietf_l2vpn/L2VPN_Service.py       | 2 +-
 .../rest_server/nbi_plugins/ietf_l2vpn/L2VPN_Services.py      | 2 +-
 .../nbi_plugins/ietf_l2vpn/L2VPN_SiteNetworkAccesses.py       | 2 +-
 .../service/rest_server/nbi_plugins/ietf_l2vpn/__init__.py    | 2 +-
 .../rest_server/nbi_plugins/ietf_l2vpn/schemas/Common.py      | 2 +-
 .../rest_server/nbi_plugins/ietf_l2vpn/schemas/__init__.py    | 2 +-
 .../nbi_plugins/ietf_l2vpn/schemas/site_network_access.py     | 2 +-
 .../rest_server/nbi_plugins/ietf_l2vpn/schemas/vpn_service.py | 2 +-
 .../service/rest_server/nbi_plugins/ietf_l3vpn/Handlers.py    | 2 +-
 .../rest_server/nbi_plugins/ietf_l3vpn/L3VPN_Service.py       | 2 +-
 .../rest_server/nbi_plugins/ietf_l3vpn/L3VPN_Services.py      | 2 +-
 .../nbi_plugins/ietf_l3vpn/L3VPN_SiteNetworkAccesses.py       | 2 +-
 .../rest_server/nbi_plugins/ietf_l3vpn/YangValidator.py       | 2 +-
 .../service/rest_server/nbi_plugins/ietf_l3vpn/__init__.py    | 2 +-
 .../rest_server/nbi_plugins/ietf_network/ComposeLink.py       | 2 +-
 .../rest_server/nbi_plugins/ietf_network/ComposeNetwork.py    | 2 +-
 .../rest_server/nbi_plugins/ietf_network/ComposeNode.py       | 2 +-
 .../rest_server/nbi_plugins/ietf_network/ComposeTermPoint.py  | 2 +-
 .../rest_server/nbi_plugins/ietf_network/ManualFixes.py       | 2 +-
 .../rest_server/nbi_plugins/ietf_network/NameMapping.py       | 2 +-
 .../rest_server/nbi_plugins/ietf_network/NetworkTypeEnum.py   | 2 +-
 .../service/rest_server/nbi_plugins/ietf_network/Networks.py  | 2 +-
 .../service/rest_server/nbi_plugins/ietf_network/__init__.py  | 2 +-
 .../nbi_plugins/ietf_network/build-yang-bindings.sh           | 2 +-
 .../rest_server/nbi_plugins/ietf_network_slice/NSS_Service.py | 2 +-
 .../nbi_plugins/ietf_network_slice/NSS_Services.py            | 2 +-
 .../rest_server/nbi_plugins/ietf_network_slice/__init__.py    | 2 +-
 .../nbi_plugins/ietf_network_slice/bindings/__init__.py       | 2 +-
 .../nbi_plugins/ietf_network_slice/bindings/nacm/__init__.py  | 2 +-
 .../ietf_network_slice/bindings/nacm/groups/__init__.py       | 2 +-
 .../ietf_network_slice/bindings/nacm/groups/group/__init__.py | 2 +-
 .../ietf_network_slice/bindings/nacm/rule_list/__init__.py    | 2 +-
 .../bindings/nacm/rule_list/rule/__init__.py                  | 2 +-
 .../bindings/nacm/rule_list/rule/rule_type/__init__.py        | 2 +-
 .../nacm/rule_list/rule/rule_type/data_node/__init__.py       | 2 +-
 .../nacm/rule_list/rule/rule_type/notification/__init__.py    | 2 +-
 .../rule_list/rule/rule_type/protocol_operation/__init__.py   | 2 +-
 .../bindings/network_slice_services/__init__.py               | 2 +-
 .../bindings/network_slice_services/slice_service/__init__.py | 2 +-
 .../slice_service/connection_groups/__init__.py               | 2 +-
 .../connection_groups/connection_group/__init__.py            | 2 +-
 .../connection_group/connection_group_monitoring/__init__.py  | 2 +-
 .../connection_group/connectivity_construct/__init__.py       | 2 +-
 .../connectivity_construct_monitoring/__init__.py             | 2 +-
 .../connectivity_construct_type/__init__.py                   | 2 +-
 .../connectivity_construct_type/a2a/__init__.py               | 2 +-
 .../connectivity_construct_type/a2a/a2a_sdp/__init__.py       | 2 +-
 .../a2a/a2a_sdp/slo_sle_policy/__init__.py                    | 2 +-
 .../a2a/a2a_sdp/slo_sle_policy/custom/__init__.py             | 2 +-
 .../slo_sle_policy/custom/service_slo_sle_policy/__init__.py  | 2 +-
 .../custom/service_slo_sle_policy/metric_bounds/__init__.py   | 2 +-
 .../metric_bounds/metric_bound/__init__.py                    | 2 +-
 .../service_slo_sle_policy/steering_constraints/__init__.py   | 2 +-
 .../steering_constraints/path_constraints/__init__.py         | 2 +-
 .../steering_constraints/service_function/__init__.py         | 2 +-
 .../a2a/a2a_sdp/slo_sle_policy/standard/__init__.py           | 2 +-
 .../connectivity_construct_type/p2mp/__init__.py              | 2 +-
 .../connectivity_construct_type/p2p/__init__.py               | 2 +-
 .../connectivity_construct/slo_sle_policy/__init__.py         | 2 +-
 .../connectivity_construct/slo_sle_policy/custom/__init__.py  | 2 +-
 .../slo_sle_policy/custom/service_slo_sle_policy/__init__.py  | 2 +-
 .../custom/service_slo_sle_policy/metric_bounds/__init__.py   | 2 +-
 .../metric_bounds/metric_bound/__init__.py                    | 2 +-
 .../service_slo_sle_policy/steering_constraints/__init__.py   | 2 +-
 .../steering_constraints/path_constraints/__init__.py         | 2 +-
 .../steering_constraints/service_function/__init__.py         | 2 +-
 .../slo_sle_policy/standard/__init__.py                       | 2 +-
 .../connection_group/slo_sle_policy/__init__.py               | 2 +-
 .../connection_group/slo_sle_policy/custom/__init__.py        | 2 +-
 .../slo_sle_policy/custom/service_slo_sle_policy/__init__.py  | 2 +-
 .../custom/service_slo_sle_policy/metric_bounds/__init__.py   | 2 +-
 .../metric_bounds/metric_bound/__init__.py                    | 2 +-
 .../service_slo_sle_policy/steering_constraints/__init__.py   | 2 +-
 .../steering_constraints/path_constraints/__init__.py         | 2 +-
 .../steering_constraints/service_function/__init__.py         | 2 +-
 .../connection_group/slo_sle_policy/standard/__init__.py      | 2 +-
 .../network_slice_services/slice_service/sdps/__init__.py     | 2 +-
 .../network_slice_services/slice_service/sdps/sdp/__init__.py | 2 +-
 .../slice_service/sdps/sdp/attachment_circuits/__init__.py    | 2 +-
 .../sdp/attachment_circuits/attachment_circuit/__init__.py    | 2 +-
 .../attachment_circuit/ac_tags/__init__.py                    | 2 +-
 .../attachment_circuit/ac_tags/ac_tag_opaque/__init__.py      | 2 +-
 .../attachment_circuit/ac_tags/ac_tags/__init__.py            | 2 +-
 .../attachment_circuit/incoming_qos_policy/__init__.py        | 2 +-
 .../incoming_qos_policy/rate_limits/__init__.py               | 2 +-
 .../attachment_circuit/outgoing_qos_policy/__init__.py        | 2 +-
 .../outgoing_qos_policy/rate_limits/__init__.py               | 2 +-
 .../attachment_circuit/sdp_peering/__init__.py                | 2 +-
 .../attachment_circuit/sdp_peering/opaque/__init__.py         | 2 +-
 .../attachment_circuit/sdp_peering/protocol/__init__.py       | 2 +-
 .../sdp_peering/protocol/attribute/__init__.py                | 2 +-
 .../slice_service/sdps/sdp/incoming_qos_policy/__init__.py    | 2 +-
 .../sdps/sdp/incoming_qos_policy/rate_limits/__init__.py      | 2 +-
 .../slice_service/sdps/sdp/location/__init__.py               | 2 +-
 .../slice_service/sdps/sdp/outgoing_qos_policy/__init__.py    | 2 +-
 .../sdps/sdp/outgoing_qos_policy/rate_limits/__init__.py      | 2 +-
 .../slice_service/sdps/sdp/sdp_monitoring/__init__.py         | 2 +-
 .../slice_service/sdps/sdp/sdp_peering/__init__.py            | 2 +-
 .../slice_service/sdps/sdp/sdp_peering/opaque/__init__.py     | 2 +-
 .../slice_service/sdps/sdp/sdp_peering/protocol/__init__.py   | 2 +-
 .../sdps/sdp/sdp_peering/protocol/attribute/__init__.py       | 2 +-
 .../slice_service/sdps/sdp/service_match_criteria/__init__.py | 2 +-
 .../sdp/service_match_criteria/match_criterion/__init__.py    | 2 +-
 .../slice_service/sdps/sdp/status/__init__.py                 | 2 +-
 .../slice_service/sdps/sdp/status/admin_status/__init__.py    | 2 +-
 .../slice_service/sdps/sdp/status/oper_status/__init__.py     | 2 +-
 .../slice_service/service_tags/__init__.py                    | 2 +-
 .../slice_service/service_tags/tag_opaque/__init__.py         | 2 +-
 .../slice_service/service_tags/tag_type/__init__.py           | 2 +-
 .../slice_service/slo_sle_policy/__init__.py                  | 2 +-
 .../slice_service/slo_sle_policy/custom/__init__.py           | 2 +-
 .../slo_sle_policy/custom/service_slo_sle_policy/__init__.py  | 2 +-
 .../custom/service_slo_sle_policy/metric_bounds/__init__.py   | 2 +-
 .../metric_bounds/metric_bound/__init__.py                    | 2 +-
 .../service_slo_sle_policy/steering_constraints/__init__.py   | 2 +-
 .../steering_constraints/path_constraints/__init__.py         | 2 +-
 .../steering_constraints/service_function/__init__.py         | 2 +-
 .../slice_service/slo_sle_policy/standard/__init__.py         | 2 +-
 .../network_slice_services/slice_service/status/__init__.py   | 2 +-
 .../slice_service/status/admin_status/__init__.py             | 2 +-
 .../slice_service/status/oper_status/__init__.py              | 2 +-
 .../slice_service/te_topology_identifier/__init__.py          | 2 +-
 .../network_slice_services/slo_sle_templates/__init__.py      | 2 +-
 .../slo_sle_templates/slo_sle_template/__init__.py            | 2 +-
 .../slo_sle_template/service_slo_sle_policy/__init__.py       | 2 +-
 .../service_slo_sle_policy/metric_bounds/__init__.py          | 2 +-
 .../metric_bounds/metric_bound/__init__.py                    | 2 +-
 .../service_slo_sle_policy/steering_constraints/__init__.py   | 2 +-
 .../steering_constraints/path_constraints/__init__.py         | 2 +-
 .../steering_constraints/service_function/__init__.py         | 2 +-
 .../ietf_network_slice/bindings/networks/__init__.py          | 2 +-
 .../ietf_network_slice/bindings/networks/network/__init__.py  | 2 +-
 .../bindings/networks/network/link/__init__.py                | 2 +-
 .../bindings/networks/network/link/destination/__init__.py    | 2 +-
 .../bindings/networks/network/link/source/__init__.py         | 2 +-
 .../networks/network/link/supporting_link/__init__.py         | 2 +-
 .../bindings/networks/network/link/te/__init__.py             | 2 +-
 .../networks/network/link/te/bundle_stack_level/__init__.py   | 2 +-
 .../network/link/te/bundle_stack_level/bundle/__init__.py     | 2 +-
 .../te/bundle_stack_level/bundle/bundled_links/__init__.py    | 2 +-
 .../bundle/bundled_links/bundled_link/__init__.py             | 2 +-
 .../network/link/te/bundle_stack_level/component/__init__.py  | 2 +-
 .../bundle_stack_level/component/component_links/__init__.py  | 2 +-
 .../component/component_links/component_link/__init__.py      | 2 +-
 .../network/link/te/information_source_entry/__init__.py      | 2 +-
 .../information_source_state/__init__.py                      | 2 +-
 .../information_source_state/topology/__init__.py             | 2 +-
 .../interface_switching_capability/__init__.py                | 2 +-
 .../max_lsp_bandwidth/__init__.py                             | 2 +-
 .../max_lsp_bandwidth/te_bandwidth/__init__.py                | 2 +-
 .../max_lsp_bandwidth/te_bandwidth/technology/__init__.py     | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../information_source_entry/label_restrictions/__init__.py   | 2 +-
 .../label_restrictions/label_restriction/__init__.py          | 2 +-
 .../label_restriction/label_end/__init__.py                   | 2 +-
 .../label_restriction/label_end/te_label/__init__.py          | 2 +-
 .../label_end/te_label/technology/__init__.py                 | 2 +-
 .../label_end/te_label/technology/generic/__init__.py         | 2 +-
 .../label_restriction/label_start/__init__.py                 | 2 +-
 .../label_restriction/label_start/te_label/__init__.py        | 2 +-
 .../label_start/te_label/technology/__init__.py               | 2 +-
 .../label_start/te_label/technology/generic/__init__.py       | 2 +-
 .../label_restriction/label_step/__init__.py                  | 2 +-
 .../label_restriction/label_step/technology/__init__.py       | 2 +-
 .../label_step/technology/generic/__init__.py                 | 2 +-
 .../information_source_entry/max_link_bandwidth/__init__.py   | 2 +-
 .../max_link_bandwidth/te_bandwidth/__init__.py               | 2 +-
 .../max_link_bandwidth/te_bandwidth/technology/__init__.py    | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../max_resv_link_bandwidth/__init__.py                       | 2 +-
 .../max_resv_link_bandwidth/te_bandwidth/__init__.py          | 2 +-
 .../te_bandwidth/technology/__init__.py                       | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../link/te/information_source_entry/te_nsrlgs/__init__.py    | 2 +-
 .../link/te/information_source_entry/te_srlgs/__init__.py     | 2 +-
 .../information_source_entry/unreserved_bandwidth/__init__.py | 2 +-
 .../unreserved_bandwidth/te_bandwidth/__init__.py             | 2 +-
 .../unreserved_bandwidth/te_bandwidth/technology/__init__.py  | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../network/link/te/information_source_state/__init__.py      | 2 +-
 .../link/te/information_source_state/topology/__init__.py     | 2 +-
 .../bindings/networks/network/link/te/recovery/__init__.py    | 2 +-
 .../bindings/networks/network/link/te/statistics/__init__.py  | 2 +-
 .../networks/network/link/te/te_link_attributes/__init__.py   | 2 +-
 .../link/te/te_link_attributes/external_domain/__init__.py    | 2 +-
 .../interface_switching_capability/__init__.py                | 2 +-
 .../max_lsp_bandwidth/__init__.py                             | 2 +-
 .../max_lsp_bandwidth/te_bandwidth/__init__.py                | 2 +-
 .../max_lsp_bandwidth/te_bandwidth/technology/__init__.py     | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../link/te/te_link_attributes/label_restrictions/__init__.py | 2 +-
 .../label_restrictions/label_restriction/__init__.py          | 2 +-
 .../label_restriction/label_end/__init__.py                   | 2 +-
 .../label_restriction/label_end/te_label/__init__.py          | 2 +-
 .../label_end/te_label/technology/__init__.py                 | 2 +-
 .../label_end/te_label/technology/generic/__init__.py         | 2 +-
 .../label_restriction/label_start/__init__.py                 | 2 +-
 .../label_restriction/label_start/te_label/__init__.py        | 2 +-
 .../label_start/te_label/technology/__init__.py               | 2 +-
 .../label_start/te_label/technology/generic/__init__.py       | 2 +-
 .../label_restriction/label_step/__init__.py                  | 2 +-
 .../label_restriction/label_step/technology/__init__.py       | 2 +-
 .../label_step/technology/generic/__init__.py                 | 2 +-
 .../link/te/te_link_attributes/max_link_bandwidth/__init__.py | 2 +-
 .../max_link_bandwidth/te_bandwidth/__init__.py               | 2 +-
 .../max_link_bandwidth/te_bandwidth/technology/__init__.py    | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../te/te_link_attributes/max_resv_link_bandwidth/__init__.py | 2 +-
 .../max_resv_link_bandwidth/te_bandwidth/__init__.py          | 2 +-
 .../te_bandwidth/technology/__init__.py                       | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../network/link/te/te_link_attributes/te_nsrlgs/__init__.py  | 2 +-
 .../network/link/te/te_link_attributes/te_srlgs/__init__.py   | 2 +-
 .../network/link/te/te_link_attributes/underlay/__init__.py   | 2 +-
 .../te/te_link_attributes/underlay/backup_path/__init__.py    | 2 +-
 .../underlay/backup_path/path_element/__init__.py             | 2 +-
 .../underlay/backup_path/path_element/type/__init__.py        | 2 +-
 .../backup_path/path_element/type/as_number/__init__.py       | 2 +-
 .../path_element/type/as_number/as_number_hop/__init__.py     | 2 +-
 .../underlay/backup_path/path_element/type/label/__init__.py  | 2 +-
 .../backup_path/path_element/type/label/label_hop/__init__.py | 2 +-
 .../path_element/type/label/label_hop/te_label/__init__.py    | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_element/type/numbered_link_hop/__init__.py           | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_element/type/numbered_node_hop/__init__.py           | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_element/type/unnumbered_link_hop/__init__.py         | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../te/te_link_attributes/underlay/primary_path/__init__.py   | 2 +-
 .../underlay/primary_path/path_element/__init__.py            | 2 +-
 .../underlay/primary_path/path_element/type/__init__.py       | 2 +-
 .../primary_path/path_element/type/as_number/__init__.py      | 2 +-
 .../path_element/type/as_number/as_number_hop/__init__.py     | 2 +-
 .../underlay/primary_path/path_element/type/label/__init__.py | 2 +-
 .../path_element/type/label/label_hop/__init__.py             | 2 +-
 .../path_element/type/label/label_hop/te_label/__init__.py    | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_element/type/numbered_link_hop/__init__.py           | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_element/type/numbered_node_hop/__init__.py           | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_element/type/unnumbered_link_hop/__init__.py         | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../underlay/tunnel_termination_points/__init__.py            | 2 +-
 .../link/te/te_link_attributes/underlay/tunnels/__init__.py   | 2 +-
 .../te/te_link_attributes/underlay/tunnels/tunnel/__init__.py | 2 +-
 .../te/te_link_attributes/unreserved_bandwidth/__init__.py    | 2 +-
 .../unreserved_bandwidth/te_bandwidth/__init__.py             | 2 +-
 .../unreserved_bandwidth/te_bandwidth/technology/__init__.py  | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../bindings/networks/network/link/te/underlay/__init__.py    | 2 +-
 .../bindings/networks/network/network_types/__init__.py       | 2 +-
 .../networks/network/network_types/te_topology/__init__.py    | 2 +-
 .../bindings/networks/network/node/__init__.py                | 2 +-
 .../networks/network/node/supporting_node/__init__.py         | 2 +-
 .../bindings/networks/network/node/te/__init__.py             | 2 +-
 .../bindings/networks/network/node/te/geolocation/__init__.py | 2 +-
 .../network/node/te/information_source_entry/__init__.py      | 2 +-
 .../connectivity_matrices/__init__.py                         | 2 +-
 .../connectivity_matrices/connectivity_matrix/__init__.py     | 2 +-
 .../connectivity_matrix/from/__init__.py                      | 2 +-
 .../connectivity_matrix/from/label_restrictions/__init__.py   | 2 +-
 .../from/label_restrictions/label_restriction/__init__.py     | 2 +-
 .../label_restriction/label_end/__init__.py                   | 2 +-
 .../label_restriction/label_end/te_label/__init__.py          | 2 +-
 .../label_end/te_label/technology/__init__.py                 | 2 +-
 .../label_end/te_label/technology/generic/__init__.py         | 2 +-
 .../label_restriction/label_start/__init__.py                 | 2 +-
 .../label_restriction/label_start/te_label/__init__.py        | 2 +-
 .../label_start/te_label/technology/__init__.py               | 2 +-
 .../label_start/te_label/technology/generic/__init__.py       | 2 +-
 .../label_restriction/label_step/__init__.py                  | 2 +-
 .../label_restriction/label_step/technology/__init__.py       | 2 +-
 .../label_step/technology/generic/__init__.py                 | 2 +-
 .../connectivity_matrix/optimizations/__init__.py             | 2 +-
 .../connectivity_matrix/optimizations/algorithm/__init__.py   | 2 +-
 .../optimizations/algorithm/metric/__init__.py                | 2 +-
 .../algorithm/metric/optimization_metric/__init__.py          | 2 +-
 .../explicit_route_exclude_objects/__init__.py                | 2 +-
 .../route_object_exclude_object/__init__.py                   | 2 +-
 .../route_object_exclude_object/type/__init__.py              | 2 +-
 .../route_object_exclude_object/type/as_number/__init__.py    | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../route_object_exclude_object/type/label/__init__.py        | 2 +-
 .../type/label/label_hop/__init__.py                          | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../type/numbered_link_hop/__init__.py                        | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/__init__.py                        | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../route_object_exclude_object/type/srlg/__init__.py         | 2 +-
 .../route_object_exclude_object/type/srlg/srlg/__init__.py    | 2 +-
 .../type/unnumbered_link_hop/__init__.py                      | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../explicit_route_include_objects/__init__.py                | 2 +-
 .../route_object_include_object/__init__.py                   | 2 +-
 .../route_object_include_object/type/__init__.py              | 2 +-
 .../route_object_include_object/type/as_number/__init__.py    | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../route_object_include_object/type/label/__init__.py        | 2 +-
 .../type/label/label_hop/__init__.py                          | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../type/numbered_link_hop/__init__.py                        | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/__init__.py                        | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../type/unnumbered_link_hop/__init__.py                      | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../optimizations/algorithm/metric/tiebreakers/__init__.py    | 2 +-
 .../algorithm/metric/tiebreakers/tiebreaker/__init__.py       | 2 +-
 .../optimizations/algorithm/objective_function/__init__.py    | 2 +-
 .../objective_function/objective_function/__init__.py         | 2 +-
 .../connectivity_matrix/path_constraints/__init__.py          | 2 +-
 .../path_constraints/path_affinities_values/__init__.py       | 2 +-
 .../path_affinities_values/path_affinities_value/__init__.py  | 2 +-
 .../path_constraints/path_affinity_names/__init__.py          | 2 +-
 .../path_affinity_names/path_affinity_name/__init__.py        | 2 +-
 .../path_affinity_name/affinity_name/__init__.py              | 2 +-
 .../path_constraints/path_metric_bounds/__init__.py           | 2 +-
 .../path_metric_bounds/path_metric_bound/__init__.py          | 2 +-
 .../path_constraints/path_srlgs_lists/__init__.py             | 2 +-
 .../path_srlgs_lists/path_srlgs_list/__init__.py              | 2 +-
 .../path_constraints/path_srlgs_names/__init__.py             | 2 +-
 .../path_srlgs_names/path_srlgs_name/__init__.py              | 2 +-
 .../path_constraints/te_bandwidth/__init__.py                 | 2 +-
 .../path_constraints/te_bandwidth/technology/__init__.py      | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../connectivity_matrix/path_properties/__init__.py           | 2 +-
 .../path_properties/path_affinities_values/__init__.py        | 2 +-
 .../path_affinities_values/path_affinities_value/__init__.py  | 2 +-
 .../path_properties/path_affinity_names/__init__.py           | 2 +-
 .../path_affinity_names/path_affinity_name/__init__.py        | 2 +-
 .../path_affinity_name/affinity_name/__init__.py              | 2 +-
 .../path_properties/path_metric/__init__.py                   | 2 +-
 .../path_properties/path_route_objects/__init__.py            | 2 +-
 .../path_route_objects/path_route_object/__init__.py          | 2 +-
 .../path_route_objects/path_route_object/type/__init__.py     | 2 +-
 .../path_route_object/type/as_number/__init__.py              | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../path_route_object/type/label/__init__.py                  | 2 +-
 .../path_route_object/type/label/label_hop/__init__.py        | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_route_object/type/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_route_object/type/numbered_node_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_route_object/type/unnumbered_link_hop/__init__.py    | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../path_properties/path_srlgs_lists/__init__.py              | 2 +-
 .../path_srlgs_lists/path_srlgs_list/__init__.py              | 2 +-
 .../path_properties/path_srlgs_names/__init__.py              | 2 +-
 .../path_srlgs_names/path_srlgs_name/__init__.py              | 2 +-
 .../connectivity_matrices/connectivity_matrix/to/__init__.py  | 2 +-
 .../connectivity_matrix/to/label_restrictions/__init__.py     | 2 +-
 .../to/label_restrictions/label_restriction/__init__.py       | 2 +-
 .../label_restriction/label_end/__init__.py                   | 2 +-
 .../label_restriction/label_end/te_label/__init__.py          | 2 +-
 .../label_end/te_label/technology/__init__.py                 | 2 +-
 .../label_end/te_label/technology/generic/__init__.py         | 2 +-
 .../label_restriction/label_start/__init__.py                 | 2 +-
 .../label_restriction/label_start/te_label/__init__.py        | 2 +-
 .../label_start/te_label/technology/__init__.py               | 2 +-
 .../label_start/te_label/technology/generic/__init__.py       | 2 +-
 .../label_restriction/label_step/__init__.py                  | 2 +-
 .../label_restriction/label_step/technology/__init__.py       | 2 +-
 .../label_step/technology/generic/__init__.py                 | 2 +-
 .../connectivity_matrix/underlay/__init__.py                  | 2 +-
 .../connectivity_matrix/underlay/backup_path/__init__.py      | 2 +-
 .../underlay/backup_path/path_element/__init__.py             | 2 +-
 .../underlay/backup_path/path_element/type/__init__.py        | 2 +-
 .../backup_path/path_element/type/as_number/__init__.py       | 2 +-
 .../path_element/type/as_number/as_number_hop/__init__.py     | 2 +-
 .../underlay/backup_path/path_element/type/label/__init__.py  | 2 +-
 .../backup_path/path_element/type/label/label_hop/__init__.py | 2 +-
 .../path_element/type/label/label_hop/te_label/__init__.py    | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_element/type/numbered_link_hop/__init__.py           | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_element/type/numbered_node_hop/__init__.py           | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_element/type/unnumbered_link_hop/__init__.py         | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../connectivity_matrix/underlay/primary_path/__init__.py     | 2 +-
 .../underlay/primary_path/path_element/__init__.py            | 2 +-
 .../underlay/primary_path/path_element/type/__init__.py       | 2 +-
 .../primary_path/path_element/type/as_number/__init__.py      | 2 +-
 .../path_element/type/as_number/as_number_hop/__init__.py     | 2 +-
 .../underlay/primary_path/path_element/type/label/__init__.py | 2 +-
 .../path_element/type/label/label_hop/__init__.py             | 2 +-
 .../path_element/type/label/label_hop/te_label/__init__.py    | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_element/type/numbered_link_hop/__init__.py           | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_element/type/numbered_node_hop/__init__.py           | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_element/type/unnumbered_link_hop/__init__.py         | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../underlay/tunnel_termination_points/__init__.py            | 2 +-
 .../connectivity_matrix/underlay/tunnels/__init__.py          | 2 +-
 .../connectivity_matrix/underlay/tunnels/tunnel/__init__.py   | 2 +-
 .../connectivity_matrices/label_restrictions/__init__.py      | 2 +-
 .../label_restrictions/label_restriction/__init__.py          | 2 +-
 .../label_restriction/label_end/__init__.py                   | 2 +-
 .../label_restriction/label_end/te_label/__init__.py          | 2 +-
 .../label_end/te_label/technology/__init__.py                 | 2 +-
 .../label_end/te_label/technology/generic/__init__.py         | 2 +-
 .../label_restriction/label_start/__init__.py                 | 2 +-
 .../label_restriction/label_start/te_label/__init__.py        | 2 +-
 .../label_start/te_label/technology/__init__.py               | 2 +-
 .../label_start/te_label/technology/generic/__init__.py       | 2 +-
 .../label_restriction/label_step/__init__.py                  | 2 +-
 .../label_restriction/label_step/technology/__init__.py       | 2 +-
 .../label_step/technology/generic/__init__.py                 | 2 +-
 .../connectivity_matrices/optimizations/__init__.py           | 2 +-
 .../connectivity_matrices/optimizations/algorithm/__init__.py | 2 +-
 .../optimizations/algorithm/metric/__init__.py                | 2 +-
 .../algorithm/metric/optimization_metric/__init__.py          | 2 +-
 .../explicit_route_exclude_objects/__init__.py                | 2 +-
 .../route_object_exclude_object/__init__.py                   | 2 +-
 .../route_object_exclude_object/type/__init__.py              | 2 +-
 .../route_object_exclude_object/type/as_number/__init__.py    | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../route_object_exclude_object/type/label/__init__.py        | 2 +-
 .../type/label/label_hop/__init__.py                          | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../type/numbered_link_hop/__init__.py                        | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/__init__.py                        | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../route_object_exclude_object/type/srlg/__init__.py         | 2 +-
 .../route_object_exclude_object/type/srlg/srlg/__init__.py    | 2 +-
 .../type/unnumbered_link_hop/__init__.py                      | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../explicit_route_include_objects/__init__.py                | 2 +-
 .../route_object_include_object/__init__.py                   | 2 +-
 .../route_object_include_object/type/__init__.py              | 2 +-
 .../route_object_include_object/type/as_number/__init__.py    | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../route_object_include_object/type/label/__init__.py        | 2 +-
 .../type/label/label_hop/__init__.py                          | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../type/numbered_link_hop/__init__.py                        | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/__init__.py                        | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../type/unnumbered_link_hop/__init__.py                      | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../optimizations/algorithm/metric/tiebreakers/__init__.py    | 2 +-
 .../algorithm/metric/tiebreakers/tiebreaker/__init__.py       | 2 +-
 .../optimizations/algorithm/objective_function/__init__.py    | 2 +-
 .../objective_function/objective_function/__init__.py         | 2 +-
 .../connectivity_matrices/path_constraints/__init__.py        | 2 +-
 .../path_constraints/path_affinities_values/__init__.py       | 2 +-
 .../path_affinities_values/path_affinities_value/__init__.py  | 2 +-
 .../path_constraints/path_affinity_names/__init__.py          | 2 +-
 .../path_affinity_names/path_affinity_name/__init__.py        | 2 +-
 .../path_affinity_name/affinity_name/__init__.py              | 2 +-
 .../path_constraints/path_metric_bounds/__init__.py           | 2 +-
 .../path_metric_bounds/path_metric_bound/__init__.py          | 2 +-
 .../path_constraints/path_srlgs_lists/__init__.py             | 2 +-
 .../path_srlgs_lists/path_srlgs_list/__init__.py              | 2 +-
 .../path_constraints/path_srlgs_names/__init__.py             | 2 +-
 .../path_srlgs_names/path_srlgs_name/__init__.py              | 2 +-
 .../path_constraints/te_bandwidth/__init__.py                 | 2 +-
 .../path_constraints/te_bandwidth/technology/__init__.py      | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../connectivity_matrices/path_properties/__init__.py         | 2 +-
 .../path_properties/path_affinities_values/__init__.py        | 2 +-
 .../path_affinities_values/path_affinities_value/__init__.py  | 2 +-
 .../path_properties/path_affinity_names/__init__.py           | 2 +-
 .../path_affinity_names/path_affinity_name/__init__.py        | 2 +-
 .../path_affinity_name/affinity_name/__init__.py              | 2 +-
 .../path_properties/path_metric/__init__.py                   | 2 +-
 .../path_properties/path_route_objects/__init__.py            | 2 +-
 .../path_route_objects/path_route_object/__init__.py          | 2 +-
 .../path_route_objects/path_route_object/type/__init__.py     | 2 +-
 .../path_route_object/type/as_number/__init__.py              | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../path_route_object/type/label/__init__.py                  | 2 +-
 .../path_route_object/type/label/label_hop/__init__.py        | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_route_object/type/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_route_object/type/numbered_node_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_route_object/type/unnumbered_link_hop/__init__.py    | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../path_properties/path_srlgs_lists/__init__.py              | 2 +-
 .../path_srlgs_lists/path_srlgs_list/__init__.py              | 2 +-
 .../path_properties/path_srlgs_names/__init__.py              | 2 +-
 .../path_srlgs_names/path_srlgs_name/__init__.py              | 2 +-
 .../connectivity_matrices/underlay/__init__.py                | 2 +-
 .../connectivity_matrices/underlay/backup_path/__init__.py    | 2 +-
 .../underlay/backup_path/path_element/__init__.py             | 2 +-
 .../underlay/backup_path/path_element/type/__init__.py        | 2 +-
 .../backup_path/path_element/type/as_number/__init__.py       | 2 +-
 .../path_element/type/as_number/as_number_hop/__init__.py     | 2 +-
 .../underlay/backup_path/path_element/type/label/__init__.py  | 2 +-
 .../backup_path/path_element/type/label/label_hop/__init__.py | 2 +-
 .../path_element/type/label/label_hop/te_label/__init__.py    | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_element/type/numbered_link_hop/__init__.py           | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_element/type/numbered_node_hop/__init__.py           | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_element/type/unnumbered_link_hop/__init__.py         | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../connectivity_matrices/underlay/primary_path/__init__.py   | 2 +-
 .../underlay/primary_path/path_element/__init__.py            | 2 +-
 .../underlay/primary_path/path_element/type/__init__.py       | 2 +-
 .../primary_path/path_element/type/as_number/__init__.py      | 2 +-
 .../path_element/type/as_number/as_number_hop/__init__.py     | 2 +-
 .../underlay/primary_path/path_element/type/label/__init__.py | 2 +-
 .../path_element/type/label/label_hop/__init__.py             | 2 +-
 .../path_element/type/label/label_hop/te_label/__init__.py    | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_element/type/numbered_link_hop/__init__.py           | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_element/type/numbered_node_hop/__init__.py           | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_element/type/unnumbered_link_hop/__init__.py         | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../underlay/tunnel_termination_points/__init__.py            | 2 +-
 .../connectivity_matrices/underlay/tunnels/__init__.py        | 2 +-
 .../connectivity_matrices/underlay/tunnels/tunnel/__init__.py | 2 +-
 .../information_source_state/__init__.py                      | 2 +-
 .../information_source_state/topology/__init__.py             | 2 +-
 .../te/information_source_entry/underlay_topology/__init__.py | 2 +-
 .../network/node/te/information_source_state/__init__.py      | 2 +-
 .../node/te/information_source_state/topology/__init__.py     | 2 +-
 .../bindings/networks/network/node/te/statistics/__init__.py  | 2 +-
 .../node/te/statistics/connectivity_matrix_entry/__init__.py  | 2 +-
 .../networks/network/node/te/statistics/node/__init__.py      | 2 +-
 .../networks/network/node/te/te_node_attributes/__init__.py   | 2 +-
 .../te/te_node_attributes/connectivity_matrices/__init__.py   | 2 +-
 .../connectivity_matrices/connectivity_matrix/__init__.py     | 2 +-
 .../connectivity_matrix/from/__init__.py                      | 2 +-
 .../connectivity_matrix/from/label_restrictions/__init__.py   | 2 +-
 .../from/label_restrictions/label_restriction/__init__.py     | 2 +-
 .../label_restriction/label_end/__init__.py                   | 2 +-
 .../label_restriction/label_end/te_label/__init__.py          | 2 +-
 .../label_end/te_label/technology/__init__.py                 | 2 +-
 .../label_end/te_label/technology/generic/__init__.py         | 2 +-
 .../label_restriction/label_start/__init__.py                 | 2 +-
 .../label_restriction/label_start/te_label/__init__.py        | 2 +-
 .../label_start/te_label/technology/__init__.py               | 2 +-
 .../label_start/te_label/technology/generic/__init__.py       | 2 +-
 .../label_restriction/label_step/__init__.py                  | 2 +-
 .../label_restriction/label_step/technology/__init__.py       | 2 +-
 .../label_step/technology/generic/__init__.py                 | 2 +-
 .../connectivity_matrix/optimizations/__init__.py             | 2 +-
 .../connectivity_matrix/optimizations/algorithm/__init__.py   | 2 +-
 .../optimizations/algorithm/metric/__init__.py                | 2 +-
 .../algorithm/metric/optimization_metric/__init__.py          | 2 +-
 .../explicit_route_exclude_objects/__init__.py                | 2 +-
 .../route_object_exclude_object/__init__.py                   | 2 +-
 .../route_object_exclude_object/type/__init__.py              | 2 +-
 .../route_object_exclude_object/type/as_number/__init__.py    | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../route_object_exclude_object/type/label/__init__.py        | 2 +-
 .../type/label/label_hop/__init__.py                          | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../type/numbered_link_hop/__init__.py                        | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/__init__.py                        | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../route_object_exclude_object/type/srlg/__init__.py         | 2 +-
 .../route_object_exclude_object/type/srlg/srlg/__init__.py    | 2 +-
 .../type/unnumbered_link_hop/__init__.py                      | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../explicit_route_include_objects/__init__.py                | 2 +-
 .../route_object_include_object/__init__.py                   | 2 +-
 .../route_object_include_object/type/__init__.py              | 2 +-
 .../route_object_include_object/type/as_number/__init__.py    | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../route_object_include_object/type/label/__init__.py        | 2 +-
 .../type/label/label_hop/__init__.py                          | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../type/numbered_link_hop/__init__.py                        | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/__init__.py                        | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../type/unnumbered_link_hop/__init__.py                      | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../optimizations/algorithm/metric/tiebreakers/__init__.py    | 2 +-
 .../algorithm/metric/tiebreakers/tiebreaker/__init__.py       | 2 +-
 .../optimizations/algorithm/objective_function/__init__.py    | 2 +-
 .../objective_function/objective_function/__init__.py         | 2 +-
 .../connectivity_matrix/path_constraints/__init__.py          | 2 +-
 .../path_constraints/path_affinities_values/__init__.py       | 2 +-
 .../path_affinities_values/path_affinities_value/__init__.py  | 2 +-
 .../path_constraints/path_affinity_names/__init__.py          | 2 +-
 .../path_affinity_names/path_affinity_name/__init__.py        | 2 +-
 .../path_affinity_name/affinity_name/__init__.py              | 2 +-
 .../path_constraints/path_metric_bounds/__init__.py           | 2 +-
 .../path_metric_bounds/path_metric_bound/__init__.py          | 2 +-
 .../path_constraints/path_srlgs_lists/__init__.py             | 2 +-
 .../path_srlgs_lists/path_srlgs_list/__init__.py              | 2 +-
 .../path_constraints/path_srlgs_names/__init__.py             | 2 +-
 .../path_srlgs_names/path_srlgs_name/__init__.py              | 2 +-
 .../path_constraints/te_bandwidth/__init__.py                 | 2 +-
 .../path_constraints/te_bandwidth/technology/__init__.py      | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../connectivity_matrix/path_properties/__init__.py           | 2 +-
 .../path_properties/path_affinities_values/__init__.py        | 2 +-
 .../path_affinities_values/path_affinities_value/__init__.py  | 2 +-
 .../path_properties/path_affinity_names/__init__.py           | 2 +-
 .../path_affinity_names/path_affinity_name/__init__.py        | 2 +-
 .../path_affinity_name/affinity_name/__init__.py              | 2 +-
 .../path_properties/path_metric/__init__.py                   | 2 +-
 .../path_properties/path_route_objects/__init__.py            | 2 +-
 .../path_route_objects/path_route_object/__init__.py          | 2 +-
 .../path_route_objects/path_route_object/type/__init__.py     | 2 +-
 .../path_route_object/type/as_number/__init__.py              | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../path_route_object/type/label/__init__.py                  | 2 +-
 .../path_route_object/type/label/label_hop/__init__.py        | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_route_object/type/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_route_object/type/numbered_node_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_route_object/type/unnumbered_link_hop/__init__.py    | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../path_properties/path_srlgs_lists/__init__.py              | 2 +-
 .../path_srlgs_lists/path_srlgs_list/__init__.py              | 2 +-
 .../path_properties/path_srlgs_names/__init__.py              | 2 +-
 .../path_srlgs_names/path_srlgs_name/__init__.py              | 2 +-
 .../connectivity_matrices/connectivity_matrix/to/__init__.py  | 2 +-
 .../connectivity_matrix/to/label_restrictions/__init__.py     | 2 +-
 .../to/label_restrictions/label_restriction/__init__.py       | 2 +-
 .../label_restriction/label_end/__init__.py                   | 2 +-
 .../label_restriction/label_end/te_label/__init__.py          | 2 +-
 .../label_end/te_label/technology/__init__.py                 | 2 +-
 .../label_end/te_label/technology/generic/__init__.py         | 2 +-
 .../label_restriction/label_start/__init__.py                 | 2 +-
 .../label_restriction/label_start/te_label/__init__.py        | 2 +-
 .../label_start/te_label/technology/__init__.py               | 2 +-
 .../label_start/te_label/technology/generic/__init__.py       | 2 +-
 .../label_restriction/label_step/__init__.py                  | 2 +-
 .../label_restriction/label_step/technology/__init__.py       | 2 +-
 .../label_step/technology/generic/__init__.py                 | 2 +-
 .../connectivity_matrix/underlay/__init__.py                  | 2 +-
 .../connectivity_matrix/underlay/backup_path/__init__.py      | 2 +-
 .../underlay/backup_path/path_element/__init__.py             | 2 +-
 .../underlay/backup_path/path_element/type/__init__.py        | 2 +-
 .../backup_path/path_element/type/as_number/__init__.py       | 2 +-
 .../path_element/type/as_number/as_number_hop/__init__.py     | 2 +-
 .../underlay/backup_path/path_element/type/label/__init__.py  | 2 +-
 .../backup_path/path_element/type/label/label_hop/__init__.py | 2 +-
 .../path_element/type/label/label_hop/te_label/__init__.py    | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_element/type/numbered_link_hop/__init__.py           | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_element/type/numbered_node_hop/__init__.py           | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_element/type/unnumbered_link_hop/__init__.py         | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../connectivity_matrix/underlay/primary_path/__init__.py     | 2 +-
 .../underlay/primary_path/path_element/__init__.py            | 2 +-
 .../underlay/primary_path/path_element/type/__init__.py       | 2 +-
 .../primary_path/path_element/type/as_number/__init__.py      | 2 +-
 .../path_element/type/as_number/as_number_hop/__init__.py     | 2 +-
 .../underlay/primary_path/path_element/type/label/__init__.py | 2 +-
 .../path_element/type/label/label_hop/__init__.py             | 2 +-
 .../path_element/type/label/label_hop/te_label/__init__.py    | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_element/type/numbered_link_hop/__init__.py           | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_element/type/numbered_node_hop/__init__.py           | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_element/type/unnumbered_link_hop/__init__.py         | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../underlay/tunnel_termination_points/__init__.py            | 2 +-
 .../connectivity_matrix/underlay/tunnels/__init__.py          | 2 +-
 .../connectivity_matrix/underlay/tunnels/tunnel/__init__.py   | 2 +-
 .../connectivity_matrices/label_restrictions/__init__.py      | 2 +-
 .../label_restrictions/label_restriction/__init__.py          | 2 +-
 .../label_restriction/label_end/__init__.py                   | 2 +-
 .../label_restriction/label_end/te_label/__init__.py          | 2 +-
 .../label_end/te_label/technology/__init__.py                 | 2 +-
 .../label_end/te_label/technology/generic/__init__.py         | 2 +-
 .../label_restriction/label_start/__init__.py                 | 2 +-
 .../label_restriction/label_start/te_label/__init__.py        | 2 +-
 .../label_start/te_label/technology/__init__.py               | 2 +-
 .../label_start/te_label/technology/generic/__init__.py       | 2 +-
 .../label_restriction/label_step/__init__.py                  | 2 +-
 .../label_restriction/label_step/technology/__init__.py       | 2 +-
 .../label_step/technology/generic/__init__.py                 | 2 +-
 .../connectivity_matrices/optimizations/__init__.py           | 2 +-
 .../connectivity_matrices/optimizations/algorithm/__init__.py | 2 +-
 .../optimizations/algorithm/metric/__init__.py                | 2 +-
 .../algorithm/metric/optimization_metric/__init__.py          | 2 +-
 .../explicit_route_exclude_objects/__init__.py                | 2 +-
 .../route_object_exclude_object/__init__.py                   | 2 +-
 .../route_object_exclude_object/type/__init__.py              | 2 +-
 .../route_object_exclude_object/type/as_number/__init__.py    | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../route_object_exclude_object/type/label/__init__.py        | 2 +-
 .../type/label/label_hop/__init__.py                          | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../type/numbered_link_hop/__init__.py                        | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/__init__.py                        | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../route_object_exclude_object/type/srlg/__init__.py         | 2 +-
 .../route_object_exclude_object/type/srlg/srlg/__init__.py    | 2 +-
 .../type/unnumbered_link_hop/__init__.py                      | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../explicit_route_include_objects/__init__.py                | 2 +-
 .../route_object_include_object/__init__.py                   | 2 +-
 .../route_object_include_object/type/__init__.py              | 2 +-
 .../route_object_include_object/type/as_number/__init__.py    | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../route_object_include_object/type/label/__init__.py        | 2 +-
 .../type/label/label_hop/__init__.py                          | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../type/numbered_link_hop/__init__.py                        | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/__init__.py                        | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../type/unnumbered_link_hop/__init__.py                      | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../optimizations/algorithm/metric/tiebreakers/__init__.py    | 2 +-
 .../algorithm/metric/tiebreakers/tiebreaker/__init__.py       | 2 +-
 .../optimizations/algorithm/objective_function/__init__.py    | 2 +-
 .../objective_function/objective_function/__init__.py         | 2 +-
 .../connectivity_matrices/path_constraints/__init__.py        | 2 +-
 .../path_constraints/path_affinities_values/__init__.py       | 2 +-
 .../path_affinities_values/path_affinities_value/__init__.py  | 2 +-
 .../path_constraints/path_affinity_names/__init__.py          | 2 +-
 .../path_affinity_names/path_affinity_name/__init__.py        | 2 +-
 .../path_affinity_name/affinity_name/__init__.py              | 2 +-
 .../path_constraints/path_metric_bounds/__init__.py           | 2 +-
 .../path_metric_bounds/path_metric_bound/__init__.py          | 2 +-
 .../path_constraints/path_srlgs_lists/__init__.py             | 2 +-
 .../path_srlgs_lists/path_srlgs_list/__init__.py              | 2 +-
 .../path_constraints/path_srlgs_names/__init__.py             | 2 +-
 .../path_srlgs_names/path_srlgs_name/__init__.py              | 2 +-
 .../path_constraints/te_bandwidth/__init__.py                 | 2 +-
 .../path_constraints/te_bandwidth/technology/__init__.py      | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../connectivity_matrices/path_properties/__init__.py         | 2 +-
 .../path_properties/path_affinities_values/__init__.py        | 2 +-
 .../path_affinities_values/path_affinities_value/__init__.py  | 2 +-
 .../path_properties/path_affinity_names/__init__.py           | 2 +-
 .../path_affinity_names/path_affinity_name/__init__.py        | 2 +-
 .../path_affinity_name/affinity_name/__init__.py              | 2 +-
 .../path_properties/path_metric/__init__.py                   | 2 +-
 .../path_properties/path_route_objects/__init__.py            | 2 +-
 .../path_route_objects/path_route_object/__init__.py          | 2 +-
 .../path_route_objects/path_route_object/type/__init__.py     | 2 +-
 .../path_route_object/type/as_number/__init__.py              | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../path_route_object/type/label/__init__.py                  | 2 +-
 .../path_route_object/type/label/label_hop/__init__.py        | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_route_object/type/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_route_object/type/numbered_node_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_route_object/type/unnumbered_link_hop/__init__.py    | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../path_properties/path_srlgs_lists/__init__.py              | 2 +-
 .../path_srlgs_lists/path_srlgs_list/__init__.py              | 2 +-
 .../path_properties/path_srlgs_names/__init__.py              | 2 +-
 .../path_srlgs_names/path_srlgs_name/__init__.py              | 2 +-
 .../connectivity_matrices/underlay/__init__.py                | 2 +-
 .../connectivity_matrices/underlay/backup_path/__init__.py    | 2 +-
 .../underlay/backup_path/path_element/__init__.py             | 2 +-
 .../underlay/backup_path/path_element/type/__init__.py        | 2 +-
 .../backup_path/path_element/type/as_number/__init__.py       | 2 +-
 .../path_element/type/as_number/as_number_hop/__init__.py     | 2 +-
 .../underlay/backup_path/path_element/type/label/__init__.py  | 2 +-
 .../backup_path/path_element/type/label/label_hop/__init__.py | 2 +-
 .../path_element/type/label/label_hop/te_label/__init__.py    | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_element/type/numbered_link_hop/__init__.py           | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_element/type/numbered_node_hop/__init__.py           | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_element/type/unnumbered_link_hop/__init__.py         | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../connectivity_matrices/underlay/primary_path/__init__.py   | 2 +-
 .../underlay/primary_path/path_element/__init__.py            | 2 +-
 .../underlay/primary_path/path_element/type/__init__.py       | 2 +-
 .../primary_path/path_element/type/as_number/__init__.py      | 2 +-
 .../path_element/type/as_number/as_number_hop/__init__.py     | 2 +-
 .../underlay/primary_path/path_element/type/label/__init__.py | 2 +-
 .../path_element/type/label/label_hop/__init__.py             | 2 +-
 .../path_element/type/label/label_hop/te_label/__init__.py    | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_element/type/numbered_link_hop/__init__.py           | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_element/type/numbered_node_hop/__init__.py           | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_element/type/unnumbered_link_hop/__init__.py         | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../underlay/tunnel_termination_points/__init__.py            | 2 +-
 .../connectivity_matrices/underlay/tunnels/__init__.py        | 2 +-
 .../connectivity_matrices/underlay/tunnels/tunnel/__init__.py | 2 +-
 .../node/te/te_node_attributes/underlay_topology/__init__.py  | 2 +-
 .../network/node/te/tunnel_termination_point/__init__.py      | 2 +-
 .../client_layer_adaptation/__init__.py                       | 2 +-
 .../client_layer_adaptation/switching_capability/__init__.py  | 2 +-
 .../switching_capability/te_bandwidth/__init__.py             | 2 +-
 .../switching_capability/te_bandwidth/technology/__init__.py  | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../node/te/tunnel_termination_point/geolocation/__init__.py  | 2 +-
 .../local_link_connectivities/__init__.py                     | 2 +-
 .../local_link_connectivities/label_restrictions/__init__.py  | 2 +-
 .../label_restrictions/label_restriction/__init__.py          | 2 +-
 .../label_restriction/label_end/__init__.py                   | 2 +-
 .../label_restriction/label_end/te_label/__init__.py          | 2 +-
 .../label_end/te_label/technology/__init__.py                 | 2 +-
 .../label_end/te_label/technology/generic/__init__.py         | 2 +-
 .../label_restriction/label_start/__init__.py                 | 2 +-
 .../label_restriction/label_start/te_label/__init__.py        | 2 +-
 .../label_start/te_label/technology/__init__.py               | 2 +-
 .../label_start/te_label/technology/generic/__init__.py       | 2 +-
 .../label_restriction/label_step/__init__.py                  | 2 +-
 .../label_restriction/label_step/technology/__init__.py       | 2 +-
 .../label_step/technology/generic/__init__.py                 | 2 +-
 .../local_link_connectivity/__init__.py                       | 2 +-
 .../local_link_connectivity/label_restrictions/__init__.py    | 2 +-
 .../label_restrictions/label_restriction/__init__.py          | 2 +-
 .../label_restriction/label_end/__init__.py                   | 2 +-
 .../label_restriction/label_end/te_label/__init__.py          | 2 +-
 .../label_end/te_label/technology/__init__.py                 | 2 +-
 .../label_end/te_label/technology/generic/__init__.py         | 2 +-
 .../label_restriction/label_start/__init__.py                 | 2 +-
 .../label_restriction/label_start/te_label/__init__.py        | 2 +-
 .../label_start/te_label/technology/__init__.py               | 2 +-
 .../label_start/te_label/technology/generic/__init__.py       | 2 +-
 .../label_restriction/label_step/__init__.py                  | 2 +-
 .../label_restriction/label_step/technology/__init__.py       | 2 +-
 .../label_step/technology/generic/__init__.py                 | 2 +-
 .../local_link_connectivity/optimizations/__init__.py         | 2 +-
 .../optimizations/algorithm/__init__.py                       | 2 +-
 .../optimizations/algorithm/metric/__init__.py                | 2 +-
 .../algorithm/metric/optimization_metric/__init__.py          | 2 +-
 .../explicit_route_exclude_objects/__init__.py                | 2 +-
 .../route_object_exclude_object/__init__.py                   | 2 +-
 .../route_object_exclude_object/type/__init__.py              | 2 +-
 .../route_object_exclude_object/type/as_number/__init__.py    | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../route_object_exclude_object/type/label/__init__.py        | 2 +-
 .../type/label/label_hop/__init__.py                          | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../type/numbered_link_hop/__init__.py                        | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/__init__.py                        | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../route_object_exclude_object/type/srlg/__init__.py         | 2 +-
 .../route_object_exclude_object/type/srlg/srlg/__init__.py    | 2 +-
 .../type/unnumbered_link_hop/__init__.py                      | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../explicit_route_include_objects/__init__.py                | 2 +-
 .../route_object_include_object/__init__.py                   | 2 +-
 .../route_object_include_object/type/__init__.py              | 2 +-
 .../route_object_include_object/type/as_number/__init__.py    | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../route_object_include_object/type/label/__init__.py        | 2 +-
 .../type/label/label_hop/__init__.py                          | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../type/numbered_link_hop/__init__.py                        | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/__init__.py                        | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../type/unnumbered_link_hop/__init__.py                      | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../optimizations/algorithm/metric/tiebreakers/__init__.py    | 2 +-
 .../algorithm/metric/tiebreakers/tiebreaker/__init__.py       | 2 +-
 .../optimizations/algorithm/objective_function/__init__.py    | 2 +-
 .../objective_function/objective_function/__init__.py         | 2 +-
 .../local_link_connectivity/path_constraints/__init__.py      | 2 +-
 .../path_constraints/path_affinities_values/__init__.py       | 2 +-
 .../path_affinities_values/path_affinities_value/__init__.py  | 2 +-
 .../path_constraints/path_affinity_names/__init__.py          | 2 +-
 .../path_affinity_names/path_affinity_name/__init__.py        | 2 +-
 .../path_affinity_name/affinity_name/__init__.py              | 2 +-
 .../path_constraints/path_metric_bounds/__init__.py           | 2 +-
 .../path_metric_bounds/path_metric_bound/__init__.py          | 2 +-
 .../path_constraints/path_srlgs_lists/__init__.py             | 2 +-
 .../path_srlgs_lists/path_srlgs_list/__init__.py              | 2 +-
 .../path_constraints/path_srlgs_names/__init__.py             | 2 +-
 .../path_srlgs_names/path_srlgs_name/__init__.py              | 2 +-
 .../path_constraints/te_bandwidth/__init__.py                 | 2 +-
 .../path_constraints/te_bandwidth/technology/__init__.py      | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../local_link_connectivity/path_properties/__init__.py       | 2 +-
 .../path_properties/path_affinities_values/__init__.py        | 2 +-
 .../path_affinities_values/path_affinities_value/__init__.py  | 2 +-
 .../path_properties/path_affinity_names/__init__.py           | 2 +-
 .../path_affinity_names/path_affinity_name/__init__.py        | 2 +-
 .../path_affinity_name/affinity_name/__init__.py              | 2 +-
 .../path_properties/path_metric/__init__.py                   | 2 +-
 .../path_properties/path_route_objects/__init__.py            | 2 +-
 .../path_route_objects/path_route_object/__init__.py          | 2 +-
 .../path_route_objects/path_route_object/type/__init__.py     | 2 +-
 .../path_route_object/type/as_number/__init__.py              | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../path_route_object/type/label/__init__.py                  | 2 +-
 .../path_route_object/type/label/label_hop/__init__.py        | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_route_object/type/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_route_object/type/numbered_node_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_route_object/type/unnumbered_link_hop/__init__.py    | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../path_properties/path_srlgs_lists/__init__.py              | 2 +-
 .../path_srlgs_lists/path_srlgs_list/__init__.py              | 2 +-
 .../path_properties/path_srlgs_names/__init__.py              | 2 +-
 .../path_srlgs_names/path_srlgs_name/__init__.py              | 2 +-
 .../local_link_connectivity/underlay/__init__.py              | 2 +-
 .../local_link_connectivity/underlay/backup_path/__init__.py  | 2 +-
 .../underlay/backup_path/path_element/__init__.py             | 2 +-
 .../underlay/backup_path/path_element/type/__init__.py        | 2 +-
 .../backup_path/path_element/type/as_number/__init__.py       | 2 +-
 .../path_element/type/as_number/as_number_hop/__init__.py     | 2 +-
 .../underlay/backup_path/path_element/type/label/__init__.py  | 2 +-
 .../backup_path/path_element/type/label/label_hop/__init__.py | 2 +-
 .../path_element/type/label/label_hop/te_label/__init__.py    | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_element/type/numbered_link_hop/__init__.py           | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_element/type/numbered_node_hop/__init__.py           | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_element/type/unnumbered_link_hop/__init__.py         | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../local_link_connectivity/underlay/primary_path/__init__.py | 2 +-
 .../underlay/primary_path/path_element/__init__.py            | 2 +-
 .../underlay/primary_path/path_element/type/__init__.py       | 2 +-
 .../primary_path/path_element/type/as_number/__init__.py      | 2 +-
 .../path_element/type/as_number/as_number_hop/__init__.py     | 2 +-
 .../underlay/primary_path/path_element/type/label/__init__.py | 2 +-
 .../path_element/type/label/label_hop/__init__.py             | 2 +-
 .../path_element/type/label/label_hop/te_label/__init__.py    | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_element/type/numbered_link_hop/__init__.py           | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_element/type/numbered_node_hop/__init__.py           | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_element/type/unnumbered_link_hop/__init__.py         | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../underlay/tunnel_termination_points/__init__.py            | 2 +-
 .../local_link_connectivity/underlay/tunnels/__init__.py      | 2 +-
 .../underlay/tunnels/tunnel/__init__.py                       | 2 +-
 .../local_link_connectivities/optimizations/__init__.py       | 2 +-
 .../optimizations/algorithm/__init__.py                       | 2 +-
 .../optimizations/algorithm/metric/__init__.py                | 2 +-
 .../algorithm/metric/optimization_metric/__init__.py          | 2 +-
 .../explicit_route_exclude_objects/__init__.py                | 2 +-
 .../route_object_exclude_object/__init__.py                   | 2 +-
 .../route_object_exclude_object/type/__init__.py              | 2 +-
 .../route_object_exclude_object/type/as_number/__init__.py    | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../route_object_exclude_object/type/label/__init__.py        | 2 +-
 .../type/label/label_hop/__init__.py                          | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../type/numbered_link_hop/__init__.py                        | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/__init__.py                        | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../route_object_exclude_object/type/srlg/__init__.py         | 2 +-
 .../route_object_exclude_object/type/srlg/srlg/__init__.py    | 2 +-
 .../type/unnumbered_link_hop/__init__.py                      | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../explicit_route_include_objects/__init__.py                | 2 +-
 .../route_object_include_object/__init__.py                   | 2 +-
 .../route_object_include_object/type/__init__.py              | 2 +-
 .../route_object_include_object/type/as_number/__init__.py    | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../route_object_include_object/type/label/__init__.py        | 2 +-
 .../type/label/label_hop/__init__.py                          | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../type/numbered_link_hop/__init__.py                        | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/__init__.py                        | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../type/unnumbered_link_hop/__init__.py                      | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../optimizations/algorithm/metric/tiebreakers/__init__.py    | 2 +-
 .../algorithm/metric/tiebreakers/tiebreaker/__init__.py       | 2 +-
 .../optimizations/algorithm/objective_function/__init__.py    | 2 +-
 .../objective_function/objective_function/__init__.py         | 2 +-
 .../local_link_connectivities/path_constraints/__init__.py    | 2 +-
 .../path_constraints/path_affinities_values/__init__.py       | 2 +-
 .../path_affinities_values/path_affinities_value/__init__.py  | 2 +-
 .../path_constraints/path_affinity_names/__init__.py          | 2 +-
 .../path_affinity_names/path_affinity_name/__init__.py        | 2 +-
 .../path_affinity_name/affinity_name/__init__.py              | 2 +-
 .../path_constraints/path_metric_bounds/__init__.py           | 2 +-
 .../path_metric_bounds/path_metric_bound/__init__.py          | 2 +-
 .../path_constraints/path_srlgs_lists/__init__.py             | 2 +-
 .../path_srlgs_lists/path_srlgs_list/__init__.py              | 2 +-
 .../path_constraints/path_srlgs_names/__init__.py             | 2 +-
 .../path_srlgs_names/path_srlgs_name/__init__.py              | 2 +-
 .../path_constraints/te_bandwidth/__init__.py                 | 2 +-
 .../path_constraints/te_bandwidth/technology/__init__.py      | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../local_link_connectivities/path_properties/__init__.py     | 2 +-
 .../path_properties/path_affinities_values/__init__.py        | 2 +-
 .../path_affinities_values/path_affinities_value/__init__.py  | 2 +-
 .../path_properties/path_affinity_names/__init__.py           | 2 +-
 .../path_affinity_names/path_affinity_name/__init__.py        | 2 +-
 .../path_affinity_name/affinity_name/__init__.py              | 2 +-
 .../path_properties/path_metric/__init__.py                   | 2 +-
 .../path_properties/path_route_objects/__init__.py            | 2 +-
 .../path_route_objects/path_route_object/__init__.py          | 2 +-
 .../path_route_objects/path_route_object/type/__init__.py     | 2 +-
 .../path_route_object/type/as_number/__init__.py              | 2 +-
 .../type/as_number/as_number_hop/__init__.py                  | 2 +-
 .../path_route_object/type/label/__init__.py                  | 2 +-
 .../path_route_object/type/label/label_hop/__init__.py        | 2 +-
 .../type/label/label_hop/te_label/__init__.py                 | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_route_object/type/numbered_link_hop/__init__.py      | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_route_object/type/numbered_node_hop/__init__.py      | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_route_object/type/unnumbered_link_hop/__init__.py    | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../path_properties/path_srlgs_lists/__init__.py              | 2 +-
 .../path_srlgs_lists/path_srlgs_list/__init__.py              | 2 +-
 .../path_properties/path_srlgs_names/__init__.py              | 2 +-
 .../path_srlgs_names/path_srlgs_name/__init__.py              | 2 +-
 .../local_link_connectivities/underlay/__init__.py            | 2 +-
 .../underlay/backup_path/__init__.py                          | 2 +-
 .../underlay/backup_path/path_element/__init__.py             | 2 +-
 .../underlay/backup_path/path_element/type/__init__.py        | 2 +-
 .../backup_path/path_element/type/as_number/__init__.py       | 2 +-
 .../path_element/type/as_number/as_number_hop/__init__.py     | 2 +-
 .../underlay/backup_path/path_element/type/label/__init__.py  | 2 +-
 .../backup_path/path_element/type/label/label_hop/__init__.py | 2 +-
 .../path_element/type/label/label_hop/te_label/__init__.py    | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_element/type/numbered_link_hop/__init__.py           | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_element/type/numbered_node_hop/__init__.py           | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_element/type/unnumbered_link_hop/__init__.py         | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../underlay/primary_path/__init__.py                         | 2 +-
 .../underlay/primary_path/path_element/__init__.py            | 2 +-
 .../underlay/primary_path/path_element/type/__init__.py       | 2 +-
 .../primary_path/path_element/type/as_number/__init__.py      | 2 +-
 .../path_element/type/as_number/as_number_hop/__init__.py     | 2 +-
 .../underlay/primary_path/path_element/type/label/__init__.py | 2 +-
 .../path_element/type/label/label_hop/__init__.py             | 2 +-
 .../path_element/type/label/label_hop/te_label/__init__.py    | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_element/type/numbered_link_hop/__init__.py           | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_element/type/numbered_node_hop/__init__.py           | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_element/type/unnumbered_link_hop/__init__.py         | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../underlay/tunnel_termination_points/__init__.py            | 2 +-
 .../local_link_connectivities/underlay/tunnels/__init__.py    | 2 +-
 .../underlay/tunnels/tunnel/__init__.py                       | 2 +-
 .../node/te/tunnel_termination_point/statistics/__init__.py   | 2 +-
 .../statistics/local_link_connectivity/__init__.py            | 2 +-
 .../statistics/tunnel_termination_point/__init__.py           | 2 +-
 .../supporting_tunnel_termination_point/__init__.py           | 2 +-
 .../networks/network/node/termination_point/__init__.py       | 2 +-
 .../supporting_termination_point/__init__.py                  | 2 +-
 .../networks/network/node/termination_point/te/__init__.py    | 2 +-
 .../network/node/termination_point/te/geolocation/__init__.py | 2 +-
 .../te/interface_switching_capability/__init__.py             | 2 +-
 .../max_lsp_bandwidth/__init__.py                             | 2 +-
 .../max_lsp_bandwidth/te_bandwidth/__init__.py                | 2 +-
 .../max_lsp_bandwidth/te_bandwidth/technology/__init__.py     | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../bindings/networks/network/supporting_network/__init__.py  | 2 +-
 .../bindings/networks/network/te/__init__.py                  | 2 +-
 .../bindings/networks/network/te/geolocation/__init__.py      | 2 +-
 .../bindings/networks/network/te/nsrlg/__init__.py            | 2 +-
 .../networks/network/te_topology_identifier/__init__.py       | 2 +-
 .../ietf_network_slice/bindings/networks/te/__init__.py       | 2 +-
 .../bindings/networks/te/templates/__init__.py                | 2 +-
 .../bindings/networks/te/templates/link_template/__init__.py  | 2 +-
 .../te/templates/link_template/te_link_attributes/__init__.py | 2 +-
 .../te_link_attributes/external_domain/__init__.py            | 2 +-
 .../interface_switching_capability/__init__.py                | 2 +-
 .../max_lsp_bandwidth/__init__.py                             | 2 +-
 .../max_lsp_bandwidth/te_bandwidth/__init__.py                | 2 +-
 .../max_lsp_bandwidth/te_bandwidth/technology/__init__.py     | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../te_link_attributes/label_restrictions/__init__.py         | 2 +-
 .../label_restrictions/label_restriction/__init__.py          | 2 +-
 .../label_restriction/label_end/__init__.py                   | 2 +-
 .../label_restriction/label_end/te_label/__init__.py          | 2 +-
 .../label_end/te_label/technology/__init__.py                 | 2 +-
 .../label_end/te_label/technology/generic/__init__.py         | 2 +-
 .../label_restriction/label_start/__init__.py                 | 2 +-
 .../label_restriction/label_start/te_label/__init__.py        | 2 +-
 .../label_start/te_label/technology/__init__.py               | 2 +-
 .../label_start/te_label/technology/generic/__init__.py       | 2 +-
 .../label_restriction/label_step/__init__.py                  | 2 +-
 .../label_restriction/label_step/technology/__init__.py       | 2 +-
 .../label_step/technology/generic/__init__.py                 | 2 +-
 .../te_link_attributes/max_link_bandwidth/__init__.py         | 2 +-
 .../max_link_bandwidth/te_bandwidth/__init__.py               | 2 +-
 .../max_link_bandwidth/te_bandwidth/technology/__init__.py    | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../te_link_attributes/max_resv_link_bandwidth/__init__.py    | 2 +-
 .../max_resv_link_bandwidth/te_bandwidth/__init__.py          | 2 +-
 .../te_bandwidth/technology/__init__.py                       | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../link_template/te_link_attributes/te_nsrlgs/__init__.py    | 2 +-
 .../link_template/te_link_attributes/te_srlgs/__init__.py     | 2 +-
 .../link_template/te_link_attributes/underlay/__init__.py     | 2 +-
 .../te_link_attributes/underlay/backup_path/__init__.py       | 2 +-
 .../underlay/backup_path/path_element/__init__.py             | 2 +-
 .../underlay/backup_path/path_element/type/__init__.py        | 2 +-
 .../backup_path/path_element/type/as_number/__init__.py       | 2 +-
 .../path_element/type/as_number/as_number_hop/__init__.py     | 2 +-
 .../underlay/backup_path/path_element/type/label/__init__.py  | 2 +-
 .../backup_path/path_element/type/label/label_hop/__init__.py | 2 +-
 .../path_element/type/label/label_hop/te_label/__init__.py    | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_element/type/numbered_link_hop/__init__.py           | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_element/type/numbered_node_hop/__init__.py           | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_element/type/unnumbered_link_hop/__init__.py         | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../te_link_attributes/underlay/primary_path/__init__.py      | 2 +-
 .../underlay/primary_path/path_element/__init__.py            | 2 +-
 .../underlay/primary_path/path_element/type/__init__.py       | 2 +-
 .../primary_path/path_element/type/as_number/__init__.py      | 2 +-
 .../path_element/type/as_number/as_number_hop/__init__.py     | 2 +-
 .../underlay/primary_path/path_element/type/label/__init__.py | 2 +-
 .../path_element/type/label/label_hop/__init__.py             | 2 +-
 .../path_element/type/label/label_hop/te_label/__init__.py    | 2 +-
 .../type/label/label_hop/te_label/technology/__init__.py      | 2 +-
 .../label/label_hop/te_label/technology/generic/__init__.py   | 2 +-
 .../path_element/type/numbered_link_hop/__init__.py           | 2 +-
 .../type/numbered_link_hop/numbered_link_hop/__init__.py      | 2 +-
 .../path_element/type/numbered_node_hop/__init__.py           | 2 +-
 .../type/numbered_node_hop/numbered_node_hop/__init__.py      | 2 +-
 .../path_element/type/unnumbered_link_hop/__init__.py         | 2 +-
 .../type/unnumbered_link_hop/unnumbered_link_hop/__init__.py  | 2 +-
 .../underlay/tunnel_termination_points/__init__.py            | 2 +-
 .../te_link_attributes/underlay/tunnels/__init__.py           | 2 +-
 .../te_link_attributes/underlay/tunnels/tunnel/__init__.py    | 2 +-
 .../te_link_attributes/unreserved_bandwidth/__init__.py       | 2 +-
 .../unreserved_bandwidth/te_bandwidth/__init__.py             | 2 +-
 .../unreserved_bandwidth/te_bandwidth/technology/__init__.py  | 2 +-
 .../te_bandwidth/technology/generic/__init__.py               | 2 +-
 .../bindings/networks/te/templates/node_template/__init__.py  | 2 +-
 .../te/templates/node_template/te_node_attributes/__init__.py | 2 +-
 .../te_node_attributes/underlay_topology/__init__.py          | 2 +-
 .../nbi_plugins/ietf_network_slice/ofc23_batch_slices.py      | 2 +-
 src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py  | 2 +-
 src/nbi/service/rest_server/nbi_plugins/tfs_api/Tools.py      | 2 +-
 src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py   | 2 +-
 .../service/rest_server/nbi_plugins/tools/Authentication.py   | 2 +-
 .../service/rest_server/nbi_plugins/tools/HttpStatusCodes.py  | 2 +-
 src/nbi/service/rest_server/nbi_plugins/tools/Validator.py    | 2 +-
 src/nbi/service/rest_server/nbi_plugins/tools/__init__.py     | 2 +-
 src/nbi/tests/Constants.py                                    | 2 +-
 src/nbi/tests/MockService_Dependencies.py                     | 2 +-
 src/nbi/tests/PrepareTestScenario.py                          | 2 +-
 src/nbi/tests/__init__.py                                     | 2 +-
 src/nbi/tests/test_etsi_bwm.py                                | 2 +-
 src/nbi/tests/test_ietf_l2vpn.py                              | 2 +-
 src/nbi/tests/test_ietf_l3vpn.py                              | 2 +-
 src/nbi/tests/test_ietf_network.py                            | 2 +-
 src/nbi/tests/test_slice.py                                   | 2 +-
 src/nbi/tests/test_tfs_api.py                                 | 2 +-
 src/opticalattackdetector/.gitlab-ci.yml                      | 2 +-
 src/opticalattackdetector/Config.py                           | 2 +-
 src/opticalattackdetector/Dockerfile                          | 2 +-
 src/opticalattackdetector/__init__.py                         | 2 +-
 .../client/OpticalAttackDetectorClient.py                     | 2 +-
 src/opticalattackdetector/client/__init__.py                  | 2 +-
 src/opticalattackdetector/requirements.in                     | 2 +-
 .../service/OpticalAttackDetectorService.py                   | 2 +-
 .../service/OpticalAttackDetectorServiceServicerImpl.py       | 2 +-
 src/opticalattackdetector/service/__init__.py                 | 2 +-
 src/opticalattackdetector/service/__main__.py                 | 2 +-
 src/opticalattackdetector/tests/__init__.py                   | 2 +-
 src/opticalattackdetector/tests/example_objects.py            | 2 +-
 src/opticalattackdetector/tests/test_unitary.py               | 2 +-
 src/opticalattackmanager/.gitlab-ci.yml                       | 2 +-
 src/opticalattackmanager/Config.py                            | 2 +-
 src/opticalattackmanager/Dockerfile                           | 2 +-
 src/opticalattackmanager/__init__.py                          | 2 +-
 src/opticalattackmanager/requirements.in                      | 2 +-
 src/opticalattackmanager/service/__init__.py                  | 2 +-
 src/opticalattackmanager/service/__main__.py                  | 2 +-
 src/opticalattackmanager/tests/__init__.py                    | 2 +-
 src/opticalattackmanager/tests/test_unitary.py                | 2 +-
 src/opticalattackmanager/utils/__init__.py                    | 2 +-
 src/opticalattackmanager/utils/monitor.py                     | 2 +-
 src/opticalattackmitigator/.gitlab-ci.yml                     | 2 +-
 src/opticalattackmitigator/Config.py                          | 2 +-
 src/opticalattackmitigator/Dockerfile                         | 2 +-
 src/opticalattackmitigator/__init__.py                        | 2 +-
 .../client/OpticalAttackMitigatorClient.py                    | 2 +-
 src/opticalattackmitigator/client/__init__.py                 | 2 +-
 src/opticalattackmitigator/requirements.in                    | 2 +-
 .../service/OpticalAttackMitigatorService.py                  | 2 +-
 .../service/OpticalAttackMitigatorServiceServicerImpl.py      | 2 +-
 src/opticalattackmitigator/service/__init__.py                | 2 +-
 src/opticalattackmitigator/service/__main__.py                | 2 +-
 src/opticalattackmitigator/tests/__init__.py                  | 2 +-
 src/opticalattackmitigator/tests/test_unitary.py              | 2 +-
 src/opticalcontroller/.gitlab-ci.yml                          | 2 +-
 src/opticalcontroller/Dockerfile                              | 2 +-
 src/opticalcontroller/OpticalController.py                    | 2 +-
 src/opticalcontroller/RSA.py                                  | 2 +-
 src/opticalcontroller/__init__.py                             | 2 +-
 src/opticalcontroller/dijsktra.py                             | 2 +-
 src/opticalcontroller/requirements.in                         | 2 +-
 src/opticalcontroller/tools.py                                | 2 +-
 src/opticalcontroller/variables.py                            | 2 +-
 src/pathcomp/.gitlab-ci.yml                                   | 2 +-
 src/pathcomp/__init__.py                                      | 2 +-
 src/pathcomp/backend/Dockerfile                               | 2 +-
 src/pathcomp/backend/Dockerfile-gdb                           | 2 +-
 src/pathcomp/backend/Makefile                                 | 2 +-
 src/pathcomp/backend/pathComp.c                               | 2 +-
 src/pathcomp/backend/pathComp.h                               | 2 +-
 src/pathcomp/backend/pathComp_RESTapi.c                       | 2 +-
 src/pathcomp/backend/pathComp_RESTapi.h                       | 2 +-
 src/pathcomp/backend/pathComp_cjson.c                         | 2 +-
 src/pathcomp/backend/pathComp_cjson.h                         | 2 +-
 src/pathcomp/backend/pathComp_ear.c                           | 2 +-
 src/pathcomp/backend/pathComp_ear.h                           | 2 +-
 src/pathcomp/backend/pathComp_ksp.c                           | 2 +-
 src/pathcomp/backend/pathComp_ksp.h                           | 2 +-
 src/pathcomp/backend/pathComp_log.c                           | 2 +-
 src/pathcomp/backend/pathComp_log.h                           | 2 +-
 src/pathcomp/backend/pathComp_sp.c                            | 2 +-
 src/pathcomp/backend/pathComp_sp.h                            | 2 +-
 src/pathcomp/backend/pathComp_tools.c                         | 2 +-
 src/pathcomp/backend/pathComp_tools.h                         | 2 +-
 src/pathcomp/backend/tests/run-test.sh                        | 2 +-
 src/pathcomp/frontend/Config.py                               | 2 +-
 src/pathcomp/frontend/Dockerfile                              | 2 +-
 src/pathcomp/frontend/__init__.py                             | 2 +-
 src/pathcomp/frontend/client/PathCompClient.py                | 2 +-
 src/pathcomp/frontend/client/__init__.py                      | 2 +-
 src/pathcomp/frontend/requirements.in                         | 2 +-
 src/pathcomp/frontend/service/PathCompService.py              | 2 +-
 src/pathcomp/frontend/service/PathCompServiceServicerImpl.py  | 2 +-
 src/pathcomp/frontend/service/TopologyTools.py                | 2 +-
 src/pathcomp/frontend/service/__init__.py                     | 2 +-
 src/pathcomp/frontend/service/__main__.py                     | 2 +-
 src/pathcomp/frontend/service/algorithms/Factory.py           | 2 +-
 .../frontend/service/algorithms/KDisjointPathAlgorithm.py     | 2 +-
 .../frontend/service/algorithms/KShortestPathAlgorithm.py     | 2 +-
 .../frontend/service/algorithms/ShortestPathAlgorithm.py      | 2 +-
 src/pathcomp/frontend/service/algorithms/_Algorithm.py        | 2 +-
 src/pathcomp/frontend/service/algorithms/__init__.py          | 2 +-
 .../frontend/service/algorithms/tools/ComposeConfigRules.py   | 2 +-
 .../frontend/service/algorithms/tools/ComposeRequest.py       | 2 +-
 .../frontend/service/algorithms/tools/ComputeSubServices.py   | 2 +-
 .../frontend/service/algorithms/tools/ConstantsMappings.py    | 2 +-
 .../frontend/service/algorithms/tools/EroPathToHops.py        | 2 +-
 .../frontend/service/algorithms/tools/ResourceGroups.py       | 2 +-
 .../frontend/service/algorithms/tools/ServiceTypes.py         | 2 +-
 src/pathcomp/frontend/service/algorithms/tools/__init__.py    | 2 +-
 src/pathcomp/frontend/tests/MockService_Dependencies.py       | 2 +-
 src/pathcomp/frontend/tests/Objects_A_B_C.py                  | 2 +-
 src/pathcomp/frontend/tests/Objects_DC_CSGW_TN.py             | 2 +-
 src/pathcomp/frontend/tests/Objects_DC_CSGW_TN_OLS.py         | 2 +-
 src/pathcomp/frontend/tests/PrepareTestScenario.py            | 2 +-
 src/pathcomp/frontend/tests/__init__.py                       | 2 +-
 src/pathcomp/frontend/tests/test_ero_path.py                  | 2 +-
 src/pathcomp/frontend/tests/test_pathcomp/__init__.py         | 2 +-
 src/pathcomp/frontend/tests/test_pathcomp/__main__.py         | 2 +-
 src/pathcomp/frontend/tests/test_pathcomp/data.py             | 2 +-
 src/pathcomp/frontend/tests/test_unitary.py                   | 2 +-
 .../frontend/tests/test_unitary_pathcomp_forecaster.py        | 2 +-
 src/pathcomp/misc/my_deploy-tests.sh                          | 2 +-
 src/pathcomp/misc/test-commands.sh                            | 2 +-
 src/policy/.gitlab-ci.yml                                     | 2 +-
 src/policy/pom.xml                                            | 2 +-
 src/policy/src/main/docker/Dockerfile.multistage.jvm          | 2 +-
 src/policy/src/main/java/org/etsi/tfs/policy/Serializer.java  | 2 +-
 .../main/java/org/etsi/tfs/policy/SimpleLivenessCheck.java    | 2 +-
 .../main/java/org/etsi/tfs/policy/SimpleReadinessCheck.java   | 2 +-
 .../src/main/java/org/etsi/tfs/policy/acl/AclAction.java      | 2 +-
 .../src/main/java/org/etsi/tfs/policy/acl/AclEntry.java       | 2 +-
 .../java/org/etsi/tfs/policy/acl/AclForwardActionEnum.java    | 2 +-
 .../main/java/org/etsi/tfs/policy/acl/AclLogActionEnum.java   | 2 +-
 .../src/main/java/org/etsi/tfs/policy/acl/AclMatch.java       | 2 +-
 .../src/main/java/org/etsi/tfs/policy/acl/AclRuleSet.java     | 2 +-
 .../main/java/org/etsi/tfs/policy/acl/AclRuleTypeEnum.java    | 2 +-
 .../org/etsi/tfs/policy/common/ApplicationProperties.java     | 2 +-
 src/policy/src/main/java/org/etsi/tfs/policy/common/Util.java | 2 +-
 .../main/java/org/etsi/tfs/policy/context/ContextGateway.java | 2 +-
 .../java/org/etsi/tfs/policy/context/ContextGatewayImpl.java  | 2 +-
 .../main/java/org/etsi/tfs/policy/context/ContextService.java | 2 +-
 .../java/org/etsi/tfs/policy/context/ContextServiceImpl.java  | 2 +-
 .../org/etsi/tfs/policy/context/model/ConfigActionEnum.java   | 2 +-
 .../java/org/etsi/tfs/policy/context/model/ConfigRule.java    | 2 +-
 .../java/org/etsi/tfs/policy/context/model/ConfigRuleAcl.java | 2 +-
 .../org/etsi/tfs/policy/context/model/ConfigRuleCustom.java   | 2 +-
 .../org/etsi/tfs/policy/context/model/ConfigRuleType.java     | 2 +-
 .../org/etsi/tfs/policy/context/model/ConfigRuleTypeAcl.java  | 2 +-
 .../etsi/tfs/policy/context/model/ConfigRuleTypeCustom.java   | 2 +-
 .../java/org/etsi/tfs/policy/context/model/Constraint.java    | 2 +-
 .../org/etsi/tfs/policy/context/model/ConstraintCustom.java   | 2 +-
 .../tfs/policy/context/model/ConstraintEndPointLocation.java  | 2 +-
 .../org/etsi/tfs/policy/context/model/ConstraintSchedule.java | 2 +-
 .../tfs/policy/context/model/ConstraintSlaAvailability.java   | 2 +-
 .../etsi/tfs/policy/context/model/ConstraintSlaCapacity.java  | 2 +-
 .../tfs/policy/context/model/ConstraintSlaIsolationLevel.java | 2 +-
 .../etsi/tfs/policy/context/model/ConstraintSlaLatency.java   | 2 +-
 .../org/etsi/tfs/policy/context/model/ConstraintType.java     | 2 +-
 .../etsi/tfs/policy/context/model/ConstraintTypeCustom.java   | 2 +-
 .../policy/context/model/ConstraintTypeEndPointLocation.java  | 2 +-
 .../etsi/tfs/policy/context/model/ConstraintTypeSchedule.java | 2 +-
 .../policy/context/model/ConstraintTypeSlaAvailability.java   | 2 +-
 .../tfs/policy/context/model/ConstraintTypeSlaCapacity.java   | 2 +-
 .../policy/context/model/ConstraintTypeSlaIsolationLevel.java | 2 +-
 .../tfs/policy/context/model/ConstraintTypeSlaLatency.java    | 2 +-
 .../main/java/org/etsi/tfs/policy/context/model/Device.java   | 2 +-
 .../java/org/etsi/tfs/policy/context/model/DeviceConfig.java  | 2 +-
 .../org/etsi/tfs/policy/context/model/DeviceDriverEnum.java   | 2 +-
 .../tfs/policy/context/model/DeviceOperationalStatus.java     | 2 +-
 .../main/java/org/etsi/tfs/policy/context/model/Empty.java    | 2 +-
 .../main/java/org/etsi/tfs/policy/context/model/EndPoint.java | 2 +-
 .../java/org/etsi/tfs/policy/context/model/EndPointId.java    | 2 +-
 .../main/java/org/etsi/tfs/policy/context/model/Event.java    | 2 +-
 .../java/org/etsi/tfs/policy/context/model/EventTypeEnum.java | 2 +-
 .../java/org/etsi/tfs/policy/context/model/GpsPosition.java   | 2 +-
 .../org/etsi/tfs/policy/context/model/IsolationLevelEnum.java | 2 +-
 .../main/java/org/etsi/tfs/policy/context/model/Location.java | 2 +-
 .../java/org/etsi/tfs/policy/context/model/LocationType.java  | 2 +-
 .../tfs/policy/context/model/LocationTypeGpsPosition.java     | 2 +-
 .../org/etsi/tfs/policy/context/model/LocationTypeRegion.java | 2 +-
 .../main/java/org/etsi/tfs/policy/context/model/Service.java  | 2 +-
 .../java/org/etsi/tfs/policy/context/model/ServiceConfig.java | 2 +-
 .../java/org/etsi/tfs/policy/context/model/ServiceId.java     | 2 +-
 .../java/org/etsi/tfs/policy/context/model/ServiceStatus.java | 2 +-
 .../org/etsi/tfs/policy/context/model/ServiceStatusEnum.java  | 2 +-
 .../org/etsi/tfs/policy/context/model/ServiceTypeEnum.java    | 2 +-
 .../main/java/org/etsi/tfs/policy/context/model/SliceId.java  | 2 +-
 .../java/org/etsi/tfs/policy/context/model/TopologyId.java    | 2 +-
 .../main/java/org/etsi/tfs/policy/device/DeviceGateway.java   | 2 +-
 .../java/org/etsi/tfs/policy/device/DeviceGatewayImpl.java    | 2 +-
 .../main/java/org/etsi/tfs/policy/device/DeviceService.java   | 2 +-
 .../java/org/etsi/tfs/policy/device/DeviceServiceImpl.java    | 2 +-
 .../tfs/policy/exception/ExternalServiceFailureException.java | 2 +-
 .../etsi/tfs/policy/exception/GeneralExceptionHandler.java    | 2 +-
 .../etsi/tfs/policy/kpi_sample_types/model/KpiSampleType.java | 2 +-
 .../org/etsi/tfs/policy/monitoring/MonitoringGateway.java     | 2 +-
 .../org/etsi/tfs/policy/monitoring/MonitoringGatewayImpl.java | 2 +-
 .../org/etsi/tfs/policy/monitoring/MonitoringService.java     | 2 +-
 .../org/etsi/tfs/policy/monitoring/MonitoringServiceImpl.java | 2 +-
 .../org/etsi/tfs/policy/monitoring/model/AlarmDescriptor.java | 2 +-
 .../org/etsi/tfs/policy/monitoring/model/AlarmResponse.java   | 2 +-
 .../etsi/tfs/policy/monitoring/model/AlarmSubscription.java   | 2 +-
 .../org/etsi/tfs/policy/monitoring/model/BooleanKpiValue.java | 2 +-
 .../org/etsi/tfs/policy/monitoring/model/FloatKpiValue.java   | 2 +-
 .../org/etsi/tfs/policy/monitoring/model/IntegerKpiValue.java | 2 +-
 .../main/java/org/etsi/tfs/policy/monitoring/model/Kpi.java   | 2 +-
 .../org/etsi/tfs/policy/monitoring/model/KpiDescriptor.java   | 2 +-
 .../java/org/etsi/tfs/policy/monitoring/model/KpiValue.java   | 2 +-
 .../org/etsi/tfs/policy/monitoring/model/KpiValueRange.java   | 2 +-
 .../org/etsi/tfs/policy/monitoring/model/LongKpiValue.java    | 2 +-
 .../etsi/tfs/policy/monitoring/model/MonitorKpiRequest.java   | 2 +-
 .../org/etsi/tfs/policy/monitoring/model/StringKpiValue.java  | 2 +-
 .../org/etsi/tfs/policy/monitoring/model/SubsDescriptor.java  | 2 +-
 .../org/etsi/tfs/policy/monitoring/model/SubsResponse.java    | 2 +-
 .../java/org/etsi/tfs/policy/policy/AddPolicyDeviceImpl.java  | 2 +-
 .../java/org/etsi/tfs/policy/policy/AddPolicyServiceImpl.java | 2 +-
 .../java/org/etsi/tfs/policy/policy/CommonAlarmService.java   | 2 +-
 .../org/etsi/tfs/policy/policy/CommonPolicyServiceImpl.java   | 2 +-
 .../main/java/org/etsi/tfs/policy/policy/PolicyGateway.java   | 2 +-
 .../java/org/etsi/tfs/policy/policy/PolicyGatewayImpl.java    | 2 +-
 .../main/java/org/etsi/tfs/policy/policy/PolicyService.java   | 2 +-
 .../java/org/etsi/tfs/policy/policy/PolicyServiceImpl.java    | 2 +-
 .../org/etsi/tfs/policy/policy/model/BooleanOperator.java     | 2 +-
 .../org/etsi/tfs/policy/policy/model/NumericalOperator.java   | 2 +-
 .../java/org/etsi/tfs/policy/policy/model/PolicyRule.java     | 2 +-
 .../org/etsi/tfs/policy/policy/model/PolicyRuleAction.java    | 2 +-
 .../etsi/tfs/policy/policy/model/PolicyRuleActionConfig.java  | 2 +-
 .../etsi/tfs/policy/policy/model/PolicyRuleActionEnum.java    | 2 +-
 .../java/org/etsi/tfs/policy/policy/model/PolicyRuleBase.java | 2 +-
 .../org/etsi/tfs/policy/policy/model/PolicyRuleBasic.java     | 2 +-
 .../org/etsi/tfs/policy/policy/model/PolicyRuleCondition.java | 2 +-
 .../org/etsi/tfs/policy/policy/model/PolicyRuleDevice.java    | 2 +-
 .../org/etsi/tfs/policy/policy/model/PolicyRuleService.java   | 2 +-
 .../org/etsi/tfs/policy/policy/model/PolicyRuleState.java     | 2 +-
 .../org/etsi/tfs/policy/policy/model/PolicyRuleStateEnum.java | 2 +-
 .../java/org/etsi/tfs/policy/policy/model/PolicyRuleType.java | 2 +-
 .../etsi/tfs/policy/policy/model/PolicyRuleTypeDevice.java    | 2 +-
 .../etsi/tfs/policy/policy/model/PolicyRuleTypeService.java   | 2 +-
 .../policy/service/PolicyRuleConditionFieldsGetter.java       | 2 +-
 .../policy/policy/service/PolicyRuleConditionValidator.java   | 2 +-
 .../main/java/org/etsi/tfs/policy/service/ServiceGateway.java | 2 +-
 .../java/org/etsi/tfs/policy/service/ServiceGatewayImpl.java  | 2 +-
 .../main/java/org/etsi/tfs/policy/service/ServiceService.java | 2 +-
 .../java/org/etsi/tfs/policy/service/ServiceServiceImpl.java  | 2 +-
 src/policy/src/main/resources/application.yml                 | 2 +-
 .../src/test/java/org/etsi/tfs/policy/ConfigRuleTypeTest.java | 2 +-
 .../src/test/java/org/etsi/tfs/policy/ConstraintTypeTest.java | 2 +-
 .../test/java/org/etsi/tfs/policy/EndPointCreationTest.java   | 2 +-
 .../src/test/java/org/etsi/tfs/policy/LocationTypeTest.java   | 2 +-
 .../test/java/org/etsi/tfs/policy/PolicyAddDeviceTest.java    | 2 +-
 .../test/java/org/etsi/tfs/policy/PolicyAddServiceTest.java   | 2 +-
 .../java/org/etsi/tfs/policy/PolicyDeleteServiceTest.java     | 2 +-
 .../test/java/org/etsi/tfs/policy/PolicyGrpcServiceTest.java  | 2 +-
 .../org/etsi/tfs/policy/PolicyRuleBasicValidationTest.java    | 2 +-
 .../etsi/tfs/policy/PolicyRuleConditionValidationTest.java    | 2 +-
 .../org/etsi/tfs/policy/PolicyRuleDeviceValidationTest.java   | 2 +-
 .../org/etsi/tfs/policy/PolicyRuleServiceValidationTest.java  | 2 +-
 .../test/java/org/etsi/tfs/policy/PolicyUpdateDeviceTest.java | 2 +-
 .../java/org/etsi/tfs/policy/PolicyUpdateServiceTest.java     | 2 +-
 .../src/test/java/org/etsi/tfs/policy/SerializerTest.java     | 2 +-
 src/policy/util/set_version.sh                                | 2 +-
 src/service/.gitlab-ci.yml                                    | 2 +-
 src/service/Config.py                                         | 2 +-
 src/service/Dockerfile                                        | 2 +-
 src/service/__init__.py                                       | 2 +-
 src/service/client/ServiceClient.py                           | 2 +-
 src/service/client/TEServiceClient.py                         | 2 +-
 src/service/client/__init__.py                                | 2 +-
 src/service/requirements.in                                   | 2 +-
 src/service/service/ServiceService.py                         | 2 +-
 src/service/service/ServiceServiceServicerImpl.py             | 2 +-
 src/service/service/__init__.py                               | 2 +-
 src/service/service/__main__.py                               | 2 +-
 src/service/service/service_handler_api/AnyTreeTools.py       | 2 +-
 src/service/service/service_handler_api/Exceptions.py         | 2 +-
 src/service/service/service_handler_api/FilterFields.py       | 2 +-
 .../service/service_handler_api/ServiceHandlerFactory.py      | 2 +-
 src/service/service/service_handler_api/SettingsHandler.py    | 2 +-
 src/service/service/service_handler_api/Tools.py              | 2 +-
 src/service/service/service_handler_api/_ServiceHandler.py    | 2 +-
 src/service/service/service_handler_api/__init__.py           | 2 +-
 src/service/service/service_handlers/__init__.py              | 2 +-
 .../e2e_orch/E2EOrchestratorServiceHandler.py                 | 2 +-
 src/service/service/service_handlers/e2e_orch/__init__.py     | 2 +-
 .../service/service_handlers/l2nm_emulated/ConfigRules.py     | 2 +-
 .../l2nm_emulated/L2NMEmulatedServiceHandler.py               | 2 +-
 .../service/service_handlers/l2nm_emulated/__init__.py        | 2 +-
 .../l2nm_ietfl2vpn/L2NM_IETFL2VPN_ServiceHandler.py           | 2 +-
 .../service/service_handlers/l2nm_ietfl2vpn/__init__.py       | 2 +-
 .../service/service_handlers/l2nm_openconfig/ConfigRules.py   | 2 +-
 .../l2nm_openconfig/L2NMOpenConfigServiceHandler.py           | 2 +-
 .../service/service_handlers/l2nm_openconfig/__init__.py      | 2 +-
 .../service/service_handlers/l3nm_emulated/ConfigRules.py     | 2 +-
 .../l3nm_emulated/L3NMEmulatedServiceHandler.py               | 2 +-
 .../service/service_handlers/l3nm_emulated/__init__.py        | 2 +-
 .../l3nm_gnmi_openconfig/ConfigRuleComposer.py                | 2 +-
 .../l3nm_gnmi_openconfig/L3NMGnmiOpenConfigServiceHandler.py  | 2 +-
 .../service/service_handlers/l3nm_gnmi_openconfig/__init__.py | 2 +-
 .../service/service_handlers/l3nm_ietf_actn/Constants.py      | 2 +-
 .../l3nm_ietf_actn/L3NMIetfActnServiceHandler.py              | 2 +-
 .../service/service_handlers/l3nm_ietf_actn/__init__.py       | 2 +-
 .../service/service_handlers/l3nm_openconfig/ConfigRules.py   | 2 +-
 .../l3nm_openconfig/L3NMOpenConfigServiceHandler.py           | 2 +-
 .../service/service_handlers/l3nm_openconfig/__init__.py      | 2 +-
 .../service_handlers/microwave/MicrowaveServiceHandler.py     | 2 +-
 src/service/service/service_handlers/microwave/__init__.py    | 2 +-
 src/service/service/service_handlers/oc/ConfigRules.py        | 2 +-
 src/service/service/service_handlers/oc/OCServiceHandler.py   | 2 +-
 src/service/service/service_handlers/oc/OCTools.py            | 2 +-
 src/service/service/service_handlers/oc/__init__.py           | 2 +-
 src/service/service/service_handlers/p4/__init__.py           | 2 +-
 src/service/service/service_handlers/p4/p4_service_handler.py | 2 +-
 .../service/service_handlers/tapi_tapi/TapiServiceHandler.py  | 2 +-
 src/service/service/service_handlers/tapi_tapi/__init__.py    | 2 +-
 .../service/service_handlers/tapi_xr/TapiXrServiceHandler.py  | 2 +-
 src/service/service/service_handlers/tapi_xr/__init__.py      | 2 +-
 src/service/service/task_scheduler/ConnectionExpander.py      | 2 +-
 src/service/service/task_scheduler/TaskExecutor.py            | 2 +-
 src/service/service/task_scheduler/TaskScheduler.py           | 2 +-
 src/service/service/task_scheduler/__init__.py                | 2 +-
 .../service/task_scheduler/tasks/Task_ConnectionConfigure.py  | 2 +-
 .../task_scheduler/tasks/Task_ConnectionDeconfigure.py        | 2 +-
 .../service/task_scheduler/tasks/Task_ServiceDelete.py        | 2 +-
 .../service/task_scheduler/tasks/Task_ServiceSetStatus.py     | 2 +-
 src/service/service/task_scheduler/tasks/_Task.py             | 2 +-
 src/service/service/task_scheduler/tasks/__init__.py          | 2 +-
 src/service/service/tools/ConnectionToString.py               | 2 +-
 src/service/service/tools/EndpointIdFormatters.py             | 2 +-
 src/service/service/tools/GeodesicDistance.py                 | 2 +-
 src/service/service/tools/ObjectKeys.py                       | 2 +-
 src/service/service/tools/OpticalTools.py                     | 2 +-
 src/service/service/tools/__init__.py                         | 2 +-
 src/service/service/tools/replies.py                          | 2 +-
 src/service/tests/CommonObjects.py                            | 2 +-
 src/service/tests/MockService_Dependencies.py                 | 2 +-
 src/service/tests/PrepareTestScenario.py                      | 2 +-
 src/service/tests/ServiceHandler_L3NM_EMU.py                  | 2 +-
 src/service/tests/ServiceHandler_L3NM_OC.py                   | 2 +-
 src/service/tests/ServiceHandlersToTest.py                    | 2 +-
 src/service/tests/__init__.py                                 | 2 +-
 src/service/tests/test_service_recompute_cons.sh              | 2 +-
 src/service/tests/test_unitary.py                             | 2 +-
 src/service/tests/test_unitary_recompute_conns.py             | 2 +-
 src/service/tests/test_unitary_task_scheduler.py              | 2 +-
 src/slice/.gitlab-ci.yml                                      | 2 +-
 src/slice/Config.py                                           | 2 +-
 src/slice/Dockerfile                                          | 2 +-
 src/slice/__init__.py                                         | 2 +-
 src/slice/client/SliceClient.py                               | 2 +-
 src/slice/client/__init__.py                                  | 2 +-
 src/slice/old_code/ConstraintsChecker.py                      | 2 +-
 src/slice/old_code/SliceCheckers.py                           | 2 +-
 src/slice/old_code/SliceStatus.py                             | 2 +-
 src/slice/old_code/Tools.py                                   | 2 +-
 src/slice/old_code/Tools_2.py                                 | 2 +-
 src/slice/requirements.in                                     | 2 +-
 src/slice/service/SliceService.py                             | 2 +-
 src/slice/service/SliceServiceServicerImpl.py                 | 2 +-
 src/slice/service/__init__.py                                 | 2 +-
 src/slice/service/__main__.py                                 | 2 +-
 src/slice/service/slice_grouper/Constants.py                  | 2 +-
 src/slice/service/slice_grouper/MetricsExporter.py            | 2 +-
 src/slice/service/slice_grouper/SliceGrouper.py               | 2 +-
 src/slice/service/slice_grouper/Tools.py                      | 2 +-
 src/slice/service/slice_grouper/__init__.py                   | 2 +-
 src/slice/tests/__init__.py                                   | 2 +-
 src/slice/tests/old/Main.py                                   | 2 +-
 src/slice/tests/old/MetricsExporter.py                        | 2 +-
 src/slice/tests/old/test_kmeans.py                            | 2 +-
 src/slice/tests/old/test_subslices.py                         | 2 +-
 src/slice/tests/test_unitary.py                               | 2 +-
 src/te/Dockerfile                                             | 2 +-
 src/te/apps/epce/src/epce.app.src                             | 2 +-
 src/te/apps/epce/src/epce_app.erl                             | 2 +-
 src/te/apps/epce/src/epce_pcep_server_handler.erl             | 2 +-
 src/te/apps/epce/src/epce_server.erl                          | 2 +-
 src/te/apps/epce/src/epce_sup.erl                             | 2 +-
 src/te/apps/epce/src/epce_ted.erl                             | 2 +-
 src/te/apps/tfte/src/tfte.app.src                             | 2 +-
 src/te/apps/tfte/src/tfte_app.erl                             | 2 +-
 src/te/apps/tfte/src/tfte_context.erl                         | 2 +-
 src/te/apps/tfte/src/tfte_server.erl                          | 2 +-
 src/te/apps/tfte/src/tfte_service_sup.erl                     | 2 +-
 src/te/apps/tfte/src/tfte_sup.erl                             | 2 +-
 src/te/apps/tfte/src/tfte_te_service.erl                      | 2 +-
 src/te/apps/tfte/src/tfte_topology.erl                        | 2 +-
 src/te/apps/tfte/src/tfte_util.erl                            | 2 +-
 src/te/config/dev.config.template                             | 2 +-
 src/te/config/sys.config.src                                  | 2 +-
 src/te/rebar.config                                           | 2 +-
 src/te/tests/deploy_specs.sh                                  | 2 +-
 src/te/tests/netgen-config.yml                                | 2 +-
 src/te/tests/netgen-topology.yml.template                     | 2 +-
 src/te/tests/start-testbed.sh                                 | 2 +-
 src/te/tests/test_te_service.py                               | 2 +-
 src/tests/.gitlab-ci.yml                                      | 2 +-
 src/tests/Fixtures.py                                         | 2 +-
 src/tests/__init__.py                                         | 2 +-
 src/tests/benchmark/policy/PolicyAddService.js                | 2 +-
 src/tests/benchmark/policy/PolicyDelete.js                    | 2 +-
 src/tests/benchmark/policy/PolicyUpdateService.js             | 2 +-
 src/tests/benchmark/policy/__init__.py                        | 2 +-
 src/tests/benchmark/policy/deploy_specs.sh                    | 2 +-
 src/tests/benchmark/policy/run_test_01_bootstrap.sh           | 2 +-
 src/tests/benchmark/policy/run_test_02_create_service.sh      | 2 +-
 src/tests/benchmark/policy/run_test_03_delete_service.sh      | 2 +-
 src/tests/benchmark/policy/run_test_04_cleanup.sh             | 2 +-
 src/tests/benchmark/policy/tests/Fixtures.py                  | 2 +-
 src/tests/benchmark/policy/tests/Objects.py                   | 2 +-
 src/tests/benchmark/policy/tests/__init__.py                  | 2 +-
 src/tests/benchmark/policy/tests/test_functional_bootstrap.py | 2 +-
 src/tests/benchmark/policy/tests/test_functional_cleanup.py   | 2 +-
 .../benchmark/policy/tests/test_functional_create_service.py  | 2 +-
 .../benchmark/policy/tests/test_functional_delete_service.py  | 2 +-
 src/tests/benchmark/ztp/ZtpAdd.js                             | 2 +-
 src/tests/benchmark/ztp/ZtpDelete.js                          | 2 +-
 src/tests/benchmark/ztp/ZtpUpdate.js                          | 2 +-
 src/tests/benchmark/ztp/__init__.py                           | 2 +-
 src/tests/benchmark/ztp/run_test_01_bootstrap.sh              | 2 +-
 src/tests/benchmark/ztp/run_test_02_cleanup.sh                | 2 +-
 src/tests/benchmark/ztp/tests/Fixtures.py                     | 2 +-
 src/tests/benchmark/ztp/tests/Objects.py                      | 2 +-
 src/tests/benchmark/ztp/tests/__init__.py                     | 2 +-
 src/tests/benchmark/ztp/tests/test_functional_bootstrap.py    | 2 +-
 src/tests/benchmark/ztp/tests/test_functional_cleanup.py      | 2 +-
 src/tests/ecoc22/.gitlab-ci.yml                               | 2 +-
 src/tests/ecoc22/Dockerfile                                   | 2 +-
 src/tests/ecoc22/__init__.py                                  | 2 +-
 src/tests/ecoc22/deploy_specs.sh                              | 2 +-
 src/tests/ecoc22/redeploy.sh                                  | 2 +-
 src/tests/ecoc22/requirements.in                              | 2 +-
 src/tests/ecoc22/run_test_01_bootstrap.sh                     | 2 +-
 src/tests/ecoc22/run_test_02_create_service.sh                | 2 +-
 src/tests/ecoc22/run_test_03_delete_service.sh                | 2 +-
 src/tests/ecoc22/run_test_04_cleanup.sh                       | 2 +-
 src/tests/ecoc22/run_tests.sh                                 | 2 +-
 src/tests/ecoc22/tests/Fixtures.py                            | 2 +-
 src/tests/ecoc22/tests/Objects.py                             | 2 +-
 src/tests/ecoc22/tests/Tools.py                               | 2 +-
 src/tests/ecoc22/tests/__init__.py                            | 2 +-
 src/tests/ecoc22/tests/old_code/BuildDescriptors.py           | 2 +-
 src/tests/ecoc22/tests/old_code/LoadDescriptors.py            | 2 +-
 src/tests/ecoc22/tests/old_code/Objects_BigNet.py             | 2 +-
 src/tests/ecoc22/tests/old_code/Objects_DC_CSGW_OLS.py        | 2 +-
 src/tests/ecoc22/tests/old_code/Objects_DC_CSGW_TN.py         | 2 +-
 src/tests/ecoc22/tests/old_code/Objects_DC_CSGW_TN_OLS.py     | 2 +-
 src/tests/ecoc22/tests/test_functional_bootstrap.py           | 2 +-
 src/tests/ecoc22/tests/test_functional_cleanup.py             | 2 +-
 src/tests/ecoc22/tests/test_functional_create_service.py      | 2 +-
 src/tests/ecoc22/tests/test_functional_delete_service.py      | 2 +-
 src/tests/hackfest3/__init__.py                               | 2 +-
 src/tests/hackfest3/deploy_specs.sh                           | 2 +-
 src/tests/hackfest3/grpc/addPolicy.sh                         | 2 +-
 src/tests/hackfest3/grpc/removePolicy.sh                      | 2 +-
 src/tests/hackfest3/int/build_p4.sh                           | 2 +-
 src/tests/hackfest3/int/connect_to_mininet.sh                 | 2 +-
 src/tests/hackfest3/int/copy_int_helpers.sh                   | 2 +-
 src/tests/hackfest3/int/install-scapy.sh                      | 2 +-
 src/tests/hackfest3/int/receive.py                            | 2 +-
 src/tests/hackfest3/int/send.py                               | 2 +-
 src/tests/hackfest3/int/solution/p4_service_handler.py        | 2 +-
 src/tests/hackfest3/int/solution/timestamp/receive2.py        | 2 +-
 src/tests/hackfest3/new-probe/agent.py                        | 2 +-
 src/tests/hackfest3/new-probe/connect_to_mininet.sh           | 2 +-
 src/tests/hackfest3/new-probe/copy.sh                         | 2 +-
 src/tests/hackfest3/new-probe/ping2.py                        | 2 +-
 src/tests/hackfest3/new-probe/solution/agent.py               | 2 +-
 src/tests/hackfest3/new-probe/solution/connect_to_mininet.sh  | 2 +-
 src/tests/hackfest3/new-probe/solution/copy.sh                | 2 +-
 src/tests/hackfest3/new-probe/solution/ping2.py               | 2 +-
 src/tests/hackfest3/probe/monitoring_kpis.py                  | 2 +-
 src/tests/hackfest3/probe/probe-tfs/Cargo.toml                | 2 +-
 src/tests/hackfest3/probe/probe-tfs/build.rs                  | 2 +-
 src/tests/hackfest3/probe/probe-tfs/connect_to_mininet.sh     | 2 +-
 src/tests/hackfest3/probe/probe-tfs/deploy.sh                 | 2 +-
 src/tests/hackfest3/probe/probe-tfs/src/agent.rs              | 2 +-
 src/tests/hackfest3/probe/probe-tfs/src/ping.rs               | 2 +-
 src/tests/hackfest3/run_test_01_bootstrap.sh                  | 2 +-
 src/tests/hackfest3/run_test_02_create_service.sh             | 2 +-
 src/tests/hackfest3/run_test_03_delete_service.sh             | 2 +-
 src/tests/hackfest3/run_test_04_cleanup.sh                    | 2 +-
 src/tests/hackfest3/setup.sh                                  | 2 +-
 src/tests/hackfest3/tests/BuildDescriptors.py                 | 2 +-
 src/tests/hackfest3/tests/LoadDescriptors.py                  | 2 +-
 src/tests/hackfest3/tests/Objects.py                          | 2 +-
 src/tests/hackfest3/tests/__init__.py                         | 2 +-
 src/tests/hackfest3/tests/test_functional_bootstrap.py        | 2 +-
 src/tests/hackfest3/tests/test_functional_cleanup.py          | 2 +-
 src/tests/hackfest3/tests/test_functional_create_service.py   | 2 +-
 src/tests/hackfest3/tests/test_functional_delete_service.py   | 2 +-
 src/tests/oeccpsc22/__init__.py                               | 2 +-
 src/tests/oeccpsc22/delete_all.sh                             | 2 +-
 src/tests/oeccpsc22/deploy_all.sh                             | 2 +-
 src/tests/oeccpsc22/deploy_dom1.sh                            | 2 +-
 src/tests/oeccpsc22/deploy_dom2.sh                            | 2 +-
 src/tests/oeccpsc22/deploy_specs_dom1.sh                      | 2 +-
 src/tests/oeccpsc22/deploy_specs_dom2.sh                      | 2 +-
 src/tests/oeccpsc22/dump_logs.sh                              | 2 +-
 src/tests/oeccpsc22/expose_interdomain_dom2.sh                | 2 +-
 src/tests/oeccpsc22/fast_redeploy.sh                          | 2 +-
 src/tests/oeccpsc22/nginx-ingress-controller-dom1.yaml        | 2 +-
 src/tests/oeccpsc22/nginx-ingress-controller-dom2.yaml        | 2 +-
 src/tests/oeccpsc22/nginx-ingress-http-dom1.yaml              | 2 +-
 src/tests/oeccpsc22/nginx-ingress-http-dom2.yaml              | 2 +-
 src/tests/oeccpsc22/old/deploy_in_kubernetes.sh               | 2 +-
 src/tests/oeccpsc22/old/expose-services-dom1.yaml             | 2 +-
 src/tests/oeccpsc22/old/expose-services-dom2.yaml             | 2 +-
 src/tests/oeccpsc22/run_test_01_bootstrap.sh                  | 2 +-
 src/tests/oeccpsc22/run_test_02_create_interdomain_slice.sh   | 2 +-
 src/tests/oeccpsc22/run_test_03_delete_interdomain_slice.sh   | 2 +-
 src/tests/oeccpsc22/run_test_04_cleanup.sh                    | 2 +-
 src/tests/oeccpsc22/show_deploy.sh                            | 2 +-
 src/tests/oeccpsc22/tests/Objects_Domain_1.py                 | 2 +-
 src/tests/oeccpsc22/tests/Objects_Domain_2.py                 | 2 +-
 src/tests/oeccpsc22/tests/Objects_Service.py                  | 2 +-
 src/tests/oeccpsc22/tests/Tools.py                            | 2 +-
 src/tests/oeccpsc22/tests/__init__.py                         | 2 +-
 src/tests/oeccpsc22/tests/test_functional_bootstrap.py        | 2 +-
 src/tests/oeccpsc22/tests/test_functional_cleanup.py          | 2 +-
 .../tests/test_functional_create_interdomain_slice.py         | 2 +-
 .../tests/test_functional_delete_interdomain_slice.py         | 2 +-
 src/tests/ofc22/.gitlab-ci.yml                                | 2 +-
 src/tests/ofc22/Dockerfile                                    | 2 +-
 src/tests/ofc22/__init__.py                                   | 2 +-
 src/tests/ofc22/deploy_specs.sh                               | 2 +-
 src/tests/ofc22/redeploy.sh                                   | 2 +-
 src/tests/ofc22/requirements.in                               | 2 +-
 src/tests/ofc22/run_test_01_bootstrap.sh                      | 2 +-
 src/tests/ofc22/run_test_02_create_service.sh                 | 2 +-
 src/tests/ofc22/run_test_03_delete_service.sh                 | 2 +-
 src/tests/ofc22/run_test_04_cleanup.sh                        | 2 +-
 src/tests/ofc22/run_tests.sh                                  | 2 +-
 src/tests/ofc22/tests/Fixtures.py                             | 2 +-
 src/tests/ofc22/tests/Objects.py                              | 2 +-
 src/tests/ofc22/tests/ObjectsXr.py                            | 2 +-
 src/tests/ofc22/tests/__init__.py                             | 2 +-
 src/tests/ofc22/tests/test_functional_bootstrap.py            | 2 +-
 src/tests/ofc22/tests/test_functional_cleanup.py              | 2 +-
 src/tests/ofc22/tests/test_functional_create_service.py       | 2 +-
 src/tests/ofc22/tests/test_functional_create_service_xr.py    | 2 +-
 src/tests/ofc22/tests/test_functional_delete_service.py       | 2 +-
 src/tests/ofc22/tests/test_functional_delete_service_xr.py    | 2 +-
 src/tests/ofc23/__init__.py                                   | 2 +-
 src/tests/ofc23/delete_hierar.sh                              | 2 +-
 src/tests/ofc23/delete_sligrp.sh                              | 2 +-
 src/tests/ofc23/deploy_child.sh                               | 2 +-
 src/tests/ofc23/deploy_hierar.sh                              | 2 +-
 src/tests/ofc23/deploy_parent.sh                              | 2 +-
 src/tests/ofc23/deploy_sligrp.sh                              | 2 +-
 src/tests/ofc23/deploy_specs_child.sh                         | 2 +-
 src/tests/ofc23/deploy_specs_parent.sh                        | 2 +-
 src/tests/ofc23/deploy_specs_sligrp.sh                        | 2 +-
 src/tests/ofc23/dump_logs.sh                                  | 2 +-
 src/tests/ofc23/fast_redeploy.sh                              | 2 +-
 src/tests/ofc23/nginx-ingress-controller-child.yaml           | 2 +-
 src/tests/ofc23/nginx-ingress-controller-parent.yaml          | 2 +-
 src/tests/ofc23/show_deploy.sh                                | 2 +-
 src/tests/ofc23/show_deploy_sligrp.sh                         | 2 +-
 src/tests/ofc23/tfs-ingress-child.yaml                        | 2 +-
 src/tests/ofc23/tfs-ingress-parent.yaml                       | 2 +-
 src/tests/ofc24/.gitlab-ci.yml                                | 2 +-
 src/tests/ofc24/Dockerfile                                    | 2 +-
 src/tests/ofc24/__init__.py                                   | 2 +-
 src/tests/ofc24/_old/startExtraNetConfigAgent.sh              | 2 +-
 src/tests/ofc24/_old/start_topo.sh                            | 2 +-
 src/tests/ofc24/deploy-node-agents.sh                         | 2 +-
 src/tests/ofc24/deploy_specs.sh                               | 2 +-
 src/tests/ofc24/destroy-node-agents.sh                        | 2 +-
 src/tests/ofc24/node-agents-config/startNetconfAgent-mg-on.sh | 2 +-
 src/tests/ofc24/node-agents-config/startNetconfAgent-tp.sh    | 2 +-
 src/tests/ofc24/requirements.in                               | 2 +-
 src/tests/ofc24/run-tests-locally.sh                          | 2 +-
 src/tests/ofc24/tests/__init__.py                             | 2 +-
 src/tests/ofc24/tests/test_functional_bootstrap.py            | 2 +-
 src/tests/ofc24/tests/test_functional_cleanup.py              | 2 +-
 src/tests/ofc24/tests/test_functional_create_service_bidir.py | 2 +-
 .../ofc24/tests/test_functional_create_service_unidir.py      | 2 +-
 src/tests/ofc24/tests/test_functional_delete_service_bidir.py | 2 +-
 .../ofc24/tests/test_functional_delete_service_unidir.py      | 2 +-
 src/tests/p4/__init__.py                                      | 2 +-
 src/tests/p4/deploy_specs.sh                                  | 2 +-
 src/tests/p4/mininet/8switch3path.py                          | 2 +-
 src/tests/p4/probe/monitoring_kpis.py                         | 2 +-
 src/tests/p4/probe/probe-tfs/Cargo.toml                       | 2 +-
 src/tests/p4/probe/probe-tfs/build.rs                         | 2 +-
 src/tests/p4/probe/probe-tfs/connect_to_mininet.sh            | 2 +-
 src/tests/p4/probe/probe-tfs/deploy.sh                        | 2 +-
 src/tests/p4/probe/probe-tfs/src/agent.rs                     | 2 +-
 src/tests/p4/probe/probe-tfs/src/ping.rs                      | 2 +-
 src/tests/p4/run_test_01_bootstrap.sh                         | 2 +-
 src/tests/p4/run_test_02_create_service.sh                    | 2 +-
 src/tests/p4/run_test_03_delete_service.sh                    | 2 +-
 src/tests/p4/run_test_04_cleanup.sh                           | 2 +-
 src/tests/p4/setup.sh                                         | 2 +-
 src/tests/p4/tests/BuildDescriptors.py                        | 2 +-
 src/tests/p4/tests/LoadDescriptors.py                         | 2 +-
 src/tests/p4/tests/Objects.py                                 | 2 +-
 src/tests/p4/tests/__init__.py                                | 2 +-
 src/tests/p4/tests/test_functional_bootstrap.py               | 2 +-
 src/tests/p4/tests/test_functional_cleanup.py                 | 2 +-
 src/tests/p4/tests/test_functional_create_service.py          | 2 +-
 src/tests/p4/tests/test_functional_delete_service.py          | 2 +-
 src/tests/p4/tests/topologies/6switchObjects.py               | 2 +-
 src/tests/scenario2/__init__.py                               | 2 +-
 src/tests/scenario2/delete_all.sh                             | 2 +-
 src/tests/scenario2/deploy_all.sh                             | 2 +-
 src/tests/scenario2/deploy_specs_dom1.sh                      | 2 +-
 src/tests/scenario2/deploy_specs_dom2.sh                      | 2 +-
 src/tests/scenario2/deploy_specs_dom3.sh                      | 2 +-
 src/tests/scenario2/deploy_specs_dom4.sh                      | 2 +-
 src/tests/scenario2/dump_logs.sh                              | 2 +-
 src/tests/scenario2/fast_redeploy.sh                          | 2 +-
 src/tests/scenario2/nginx-ingress-controller-dom1.yaml        | 2 +-
 src/tests/scenario2/nginx-ingress-controller-dom2.yaml        | 2 +-
 src/tests/scenario2/nginx-ingress-controller-dom3.yaml        | 2 +-
 src/tests/scenario2/nginx-ingress-controller-dom4.yaml        | 2 +-
 src/tests/scenario2/old_tests/run_test_01_bootstrap.sh        | 2 +-
 src/tests/scenario2/old_tests/run_test_02_create_service.sh   | 2 +-
 src/tests/scenario2/old_tests/run_test_03_delete_service.sh   | 2 +-
 src/tests/scenario2/old_tests/run_test_04_cleanup.sh          | 2 +-
 src/tests/scenario2/old_tests/run_tests_and_coverage.sh       | 2 +-
 src/tests/scenario2/old_tests/tests/BuildDescriptors.py       | 2 +-
 src/tests/scenario2/old_tests/tests/Fixtures.py               | 2 +-
 src/tests/scenario2/old_tests/tests/LoadDescriptors.py        | 2 +-
 src/tests/scenario2/old_tests/tests/Objects.py                | 2 +-
 src/tests/scenario2/old_tests/tests/__init__.py               | 2 +-
 .../scenario2/old_tests/tests/test_functional_bootstrap.py    | 2 +-
 .../scenario2/old_tests/tests/test_functional_cleanup.py      | 2 +-
 .../old_tests/tests/test_functional_create_service.py         | 2 +-
 .../old_tests/tests/test_functional_delete_service.py         | 2 +-
 src/tests/scenario2/reset.sh                                  | 2 +-
 src/tests/scenario2/show_deploy.sh                            | 2 +-
 src/tests/scenario2/tfs-ingress-dom1.yaml                     | 2 +-
 src/tests/scenario2/tfs-ingress-dom2.yaml                     | 2 +-
 src/tests/scenario2/tfs-ingress-dom3.yaml                     | 2 +-
 src/tests/scenario2/tfs-ingress-dom4.yaml                     | 2 +-
 src/tests/scenario3/l3/deploy.sh                              | 2 +-
 src/tests/scenario3/l3/deploy_specs.sh                        | 2 +-
 src/tests/scenario3/l3/run.sh                                 | 2 +-
 src/tests/scenario3/optical/deploy_specs.sh                   | 2 +-
 src/tests/scenario3/optical/jocn/run_experiment.py            | 2 +-
 src/tests/scenario3/optical/ofc23/run_experiment_demo.py      | 2 +-
 src/tests/tools/__init__.py                                   | 2 +-
 src/tests/tools/load_scenario/__init__.py                     | 2 +-
 src/tests/tools/load_scenario/__main__.py                     | 2 +-
 src/tests/tools/load_scenario/run.sh                          | 2 +-
 src/tests/tools/mock_ietf_actn_sdn_ctrl/Dockerfile            | 2 +-
 .../tools/mock_ietf_actn_sdn_ctrl/MockIetfActnSdnCtrl.py      | 2 +-
 .../tools/mock_ietf_actn_sdn_ctrl/ResourceEthServices.py      | 2 +-
 src/tests/tools/mock_ietf_actn_sdn_ctrl/ResourceOsuTunnels.py | 2 +-
 src/tests/tools/mock_ietf_actn_sdn_ctrl/__init__.py           | 2 +-
 src/tests/tools/mock_ietf_actn_sdn_ctrl/build.sh              | 2 +-
 src/tests/tools/mock_ietf_actn_sdn_ctrl/deploy.sh             | 2 +-
 .../mock_ietf_actn_sdn_ctrl/mock-ietf-actn-sdn-ctrl.yaml      | 2 +-
 src/tests/tools/mock_ietf_actn_sdn_ctrl/requirements.in       | 2 +-
 src/tests/tools/mock_ietf_actn_sdn_ctrl/run.sh                | 2 +-
 src/tests/tools/mock_ipm_sdn_ctrl/MockIPMSdnCtrl.py           | 2 +-
 src/tests/tools/mock_ipm_sdn_ctrl/run.sh                      | 2 +-
 src/tests/tools/mock_mw_sdn_ctrl/MockMWSdnCtrl.py             | 2 +-
 src/tests/tools/mock_mw_sdn_ctrl/run.sh                       | 2 +-
 src/tests/tools/mock_mw_sdn_ctrl/scenario/microwave_deploy.sh | 2 +-
 src/tests/tools/mock_mw_sdn_ctrl/ssl_not_working/Dockerfile   | 2 +-
 src/tests/tools/mock_mw_sdn_ctrl/ssl_not_working/build.sh     | 2 +-
 src/tests/tools/mock_mw_sdn_ctrl/ssl_not_working/deploy.sh    | 2 +-
 .../tools/mock_mw_sdn_ctrl/ssl_not_working/requirements.in    | 2 +-
 src/tests/tools/mock_osm/Constants.py                         | 2 +-
 src/tests/tools/mock_osm/MockOSM.py                           | 2 +-
 src/tests/tools/mock_osm/Tools.py                             | 2 +-
 src/tests/tools/mock_osm/__init__.py                          | 2 +-
 .../tools/mock_tfs_optical_sdn_ctrl/MockTfsOpticalSdnCtrl.py  | 2 +-
 src/tests/tools/mock_tfs_optical_sdn_ctrl/data.py             | 2 +-
 src/tests/tools/mock_tfs_optical_sdn_ctrl/run.sh              | 2 +-
 src/tests/tools/perf_plots/Component_RPC_Methods.py           | 2 +-
 src/tests/tools/perf_plots/Device_Driver_Details.py           | 2 +-
 src/tests/tools/perf_plots/Device_Driver_Methods.py           | 2 +-
 src/tests/tools/perf_plots/LoadGen_Requests.py                | 2 +-
 src/tests/tools/perf_plots/Service_Handler_Methods.py         | 2 +-
 src/tests/tools/perf_plots/__init__.py                        | 2 +-
 src/tests/tools/perf_plots/collect.sh                         | 2 +-
 src/tests/tools/perf_plots/experiments/Experiment.py          | 2 +-
 src/tests/tools/perf_plots/experiments/__init__.py            | 2 +-
 .../tools/perf_plots/experiments/scenario_1/Emu_Onboard.py    | 2 +-
 .../perf_plots/experiments/scenario_1/L2NM_EMU_Service.py     | 2 +-
 .../perf_plots/experiments/scenario_1/L3NM_EMU_Service.py     | 2 +-
 src/tests/tools/perf_plots/experiments/scenario_1/__init__.py | 2 +-
 .../perf_plots/experiments/scenario_2/Scal_001tnt_005erl.py   | 2 +-
 .../perf_plots/experiments/scenario_2/Scal_005tnt_025erl.py   | 2 +-
 .../perf_plots/experiments/scenario_2/Scal_010tnt_050erl.py   | 2 +-
 .../perf_plots/experiments/scenario_2/Scal_020tnt_100erl.py   | 2 +-
 .../perf_plots/experiments/scenario_2/Scal_040tnt_200erl.py   | 2 +-
 .../perf_plots/experiments/scenario_2/Scal_060tnt_300erl.py   | 2 +-
 .../perf_plots/experiments/scenario_2/Scal_080tnt_400erl.py   | 2 +-
 .../perf_plots/experiments/scenario_2/Scal_100tnt_500erl.py   | 2 +-
 .../perf_plots/experiments/scenario_2/Scal_120tnt_600erl.py   | 2 +-
 src/tests/tools/perf_plots/experiments/scenario_2/__init__.py | 2 +-
 src/tests/tools/perf_plots/tools/FileSystem.py                | 2 +-
 src/tests/tools/perf_plots/tools/Histogram.py                 | 2 +-
 src/tests/tools/perf_plots/tools/HistogramData.py             | 2 +-
 src/tests/tools/perf_plots/tools/Plotter.py                   | 2 +-
 src/tests/tools/perf_plots/tools/Prometheus.py                | 2 +-
 src/tests/tools/perf_plots/tools/__init__.py                  | 2 +-
 src/webui/.gitlab-ci.yml                                      | 2 +-
 src/webui/Config.py                                           | 2 +-
 src/webui/Dockerfile                                          | 2 +-
 src/webui/__init__.py                                         | 2 +-
 src/webui/requirements.in                                     | 2 +-
 src/webui/service/__init__.py                                 | 2 +-
 src/webui/service/__main__.py                                 | 2 +-
 src/webui/service/bgpls/__init__.py                           | 2 +-
 src/webui/service/bgpls/forms.py                              | 2 +-
 src/webui/service/bgpls/routes.py                             | 2 +-
 src/webui/service/context/__init__.py                         | 2 +-
 src/webui/service/context/routes.py                           | 2 +-
 src/webui/service/device/__init__.py                          | 2 +-
 src/webui/service/device/forms.py                             | 2 +-
 src/webui/service/device/routes.py                            | 2 +-
 src/webui/service/js/__init__.py                              | 2 +-
 src/webui/service/js/routes.py                                | 2 +-
 src/webui/service/link/__init__.py                            | 2 +-
 src/webui/service/link/routes.py                              | 2 +-
 src/webui/service/load_gen/__init__.py                        | 2 +-
 src/webui/service/load_gen/forms.py                           | 2 +-
 src/webui/service/load_gen/routes.py                          | 2 +-
 src/webui/service/main/__init__.py                            | 2 +-
 src/webui/service/main/forms.py                               | 2 +-
 src/webui/service/main/routes.py                              | 2 +-
 src/webui/service/policy_rule/__init__.py                     | 2 +-
 src/webui/service/policy_rule/routes.py                       | 2 +-
 src/webui/service/service/__init__.py                         | 2 +-
 src/webui/service/service/forms.py                            | 2 +-
 src/webui/service/service/routes.py                           | 2 +-
 src/webui/service/slice/__init__.py                           | 2 +-
 src/webui/service/slice/routes.py                             | 2 +-
 src/webui/service/templates/base.html                         | 2 +-
 src/webui/service/templates/bgpls/add.html                    | 2 +-
 src/webui/service/templates/bgpls/addSpeaker.html             | 2 +-
 src/webui/service/templates/bgpls/editSpeakers.html           | 2 +-
 src/webui/service/templates/bgpls/home.html                   | 2 +-
 src/webui/service/templates/context/home.html                 | 2 +-
 src/webui/service/templates/device/add.html                   | 2 +-
 src/webui/service/templates/device/addconfig.html             | 2 +-
 src/webui/service/templates/device/detail.html                | 2 +-
 src/webui/service/templates/device/home.html                  | 2 +-
 src/webui/service/templates/device/inventory.html             | 2 +-
 src/webui/service/templates/device/update.html                | 2 +-
 src/webui/service/templates/device/updateconfig.html          | 2 +-
 src/webui/service/templates/js/site.js                        | 2 +-
 src/webui/service/templates/js/topology.js                    | 2 +-
 src/webui/service/templates/link/detail.html                  | 2 +-
 src/webui/service/templates/link/home.html                    | 2 +-
 src/webui/service/templates/load_gen/home.html                | 2 +-
 src/webui/service/templates/main/about.html                   | 2 +-
 src/webui/service/templates/main/debug.html                   | 2 +-
 src/webui/service/templates/main/home.html                    | 2 +-
 src/webui/service/templates/policy_rule/home.html             | 2 +-
 src/webui/service/templates/service/add-xr.html               | 2 +-
 src/webui/service/templates/service/add.html                  | 2 +-
 src/webui/service/templates/service/configure_ACL_IPV4.html   | 2 +-
 src/webui/service/templates/service/configure_ACL_IPV6.html   | 2 +-
 src/webui/service/templates/service/configure_ACL_L2.html     | 2 +-
 src/webui/service/templates/service/configure_L2VPN.html      | 2 +-
 src/webui/service/templates/service/configure_L3VPN.html      | 2 +-
 src/webui/service/templates/service/detail.html               | 2 +-
 src/webui/service/templates/service/home.html                 | 2 +-
 src/webui/service/templates/slice/detail.html                 | 2 +-
 src/webui/service/templates/slice/home.html                   | 2 +-
 src/webui/service/templates/topology/add.html                 | 2 +-
 src/webui/service/templates/topology/addSpeaker.html          | 2 +-
 src/webui/service/templates/topology/editSpeakers.html        | 2 +-
 src/webui/service/templates/topology/home.html                | 2 +-
 src/webui/service/topology/__init__.py                        | 2 +-
 src/webui/service/topology/forms.py                           | 2 +-
 src/webui/service/topology/routes.py                          | 2 +-
 src/webui/tests/__init__.py                                   | 2 +-
 src/webui/tests/test_unitary.py                               | 2 +-
 src/webui/utils/__init__.py                                   | 2 +-
 src/webui/utils/form_validators.py                            | 2 +-
 src/ztp/.gitlab-ci.yml                                        | 2 +-
 src/ztp/pom.xml                                               | 2 +-
 src/ztp/src/main/docker/Dockerfile.multistage.jvm             | 2 +-
 src/ztp/src/main/java/org/etsi/tfs/ztp/ContextSubscriber.java | 2 +-
 src/ztp/src/main/java/org/etsi/tfs/ztp/Serializer.java        | 2 +-
 .../src/main/java/org/etsi/tfs/ztp/SimpleLivenessCheck.java   | 2 +-
 .../src/main/java/org/etsi/tfs/ztp/SimpleReadinessCheck.java  | 2 +-
 src/ztp/src/main/java/org/etsi/tfs/ztp/ZtpConfiguration.java  | 2 +-
 src/ztp/src/main/java/org/etsi/tfs/ztp/ZtpGateway.java        | 2 +-
 src/ztp/src/main/java/org/etsi/tfs/ztp/ZtpGatewayImpl.java    | 2 +-
 src/ztp/src/main/java/org/etsi/tfs/ztp/ZtpService.java        | 2 +-
 src/ztp/src/main/java/org/etsi/tfs/ztp/ZtpServiceImpl.java    | 2 +-
 src/ztp/src/main/java/org/etsi/tfs/ztp/acl/AclAction.java     | 2 +-
 src/ztp/src/main/java/org/etsi/tfs/ztp/acl/AclEntry.java      | 2 +-
 .../main/java/org/etsi/tfs/ztp/acl/AclForwardActionEnum.java  | 2 +-
 .../src/main/java/org/etsi/tfs/ztp/acl/AclLogActionEnum.java  | 2 +-
 src/ztp/src/main/java/org/etsi/tfs/ztp/acl/AclMatch.java      | 2 +-
 src/ztp/src/main/java/org/etsi/tfs/ztp/acl/AclRuleSet.java    | 2 +-
 .../src/main/java/org/etsi/tfs/ztp/acl/AclRuleTypeEnum.java   | 2 +-
 src/ztp/src/main/java/org/etsi/tfs/ztp/common/Util.java       | 2 +-
 .../main/java/org/etsi/tfs/ztp/context/ContextGateway.java    | 2 +-
 .../java/org/etsi/tfs/ztp/context/ContextGatewayImpl.java     | 2 +-
 .../main/java/org/etsi/tfs/ztp/context/ContextService.java    | 2 +-
 .../java/org/etsi/tfs/ztp/context/ContextServiceImpl.java     | 2 +-
 .../java/org/etsi/tfs/ztp/context/model/ConfigActionEnum.java | 2 +-
 .../main/java/org/etsi/tfs/ztp/context/model/ConfigRule.java  | 2 +-
 .../java/org/etsi/tfs/ztp/context/model/ConfigRuleAcl.java    | 2 +-
 .../java/org/etsi/tfs/ztp/context/model/ConfigRuleCustom.java | 2 +-
 .../java/org/etsi/tfs/ztp/context/model/ConfigRuleType.java   | 2 +-
 .../org/etsi/tfs/ztp/context/model/ConfigRuleTypeAcl.java     | 2 +-
 .../org/etsi/tfs/ztp/context/model/ConfigRuleTypeCustom.java  | 2 +-
 .../src/main/java/org/etsi/tfs/ztp/context/model/Device.java  | 2 +-
 .../java/org/etsi/tfs/ztp/context/model/DeviceConfig.java     | 2 +-
 .../java/org/etsi/tfs/ztp/context/model/DeviceDriverEnum.java | 2 +-
 .../main/java/org/etsi/tfs/ztp/context/model/DeviceEvent.java | 2 +-
 .../etsi/tfs/ztp/context/model/DeviceOperationalStatus.java   | 2 +-
 .../src/main/java/org/etsi/tfs/ztp/context/model/Empty.java   | 2 +-
 .../main/java/org/etsi/tfs/ztp/context/model/EndPoint.java    | 2 +-
 .../main/java/org/etsi/tfs/ztp/context/model/EndPointId.java  | 2 +-
 .../src/main/java/org/etsi/tfs/ztp/context/model/Event.java   | 2 +-
 .../java/org/etsi/tfs/ztp/context/model/EventTypeEnum.java    | 2 +-
 .../main/java/org/etsi/tfs/ztp/context/model/GpsPosition.java | 2 +-
 .../main/java/org/etsi/tfs/ztp/context/model/Location.java    | 2 +-
 .../java/org/etsi/tfs/ztp/context/model/LocationType.java     | 2 +-
 .../etsi/tfs/ztp/context/model/LocationTypeGpsPosition.java   | 2 +-
 .../org/etsi/tfs/ztp/context/model/LocationTypeRegion.java    | 2 +-
 .../main/java/org/etsi/tfs/ztp/context/model/TopologyId.java  | 2 +-
 .../src/main/java/org/etsi/tfs/ztp/device/DeviceGateway.java  | 2 +-
 .../main/java/org/etsi/tfs/ztp/device/DeviceGatewayImpl.java  | 2 +-
 .../src/main/java/org/etsi/tfs/ztp/device/DeviceService.java  | 2 +-
 .../main/java/org/etsi/tfs/ztp/device/DeviceServiceImpl.java  | 2 +-
 .../tfs/ztp/exception/ExternalServiceFailureException.java    | 2 +-
 .../org/etsi/tfs/ztp/exception/GeneralExceptionHandler.java   | 2 +-
 .../etsi/tfs/ztp/kpi_sample_types/model/KpiSampleType.java    | 2 +-
 src/ztp/src/main/java/org/etsi/tfs/ztp/model/DeviceRole.java  | 2 +-
 .../main/java/org/etsi/tfs/ztp/model/DeviceRoleConfig.java    | 2 +-
 .../src/main/java/org/etsi/tfs/ztp/model/DeviceRoleId.java    | 2 +-
 .../src/main/java/org/etsi/tfs/ztp/model/DeviceRoleType.java  | 2 +-
 src/ztp/src/main/java/org/etsi/tfs/ztp/model/DeviceState.java | 2 +-
 src/ztp/src/main/resources/application.yml                    | 2 +-
 .../src/test/java/org/etsi/tfs/ztp/ConfigRuleTypeTest.java    | 2 +-
 .../src/test/java/org/etsi/tfs/ztp/ContextSubscriberTest.java | 2 +-
 .../src/test/java/org/etsi/tfs/ztp/EndPointCreationTest.java  | 2 +-
 src/ztp/src/test/java/org/etsi/tfs/ztp/LocationTypeTest.java  | 2 +-
 .../src/test/java/org/etsi/tfs/ztp/MockZtpConfiguration.java  | 2 +-
 src/ztp/src/test/java/org/etsi/tfs/ztp/SerializerTest.java    | 2 +-
 .../test/java/org/etsi/tfs/ztp/ZtpFunctionalServiceTest.java  | 2 +-
 src/ztp/src/test/java/org/etsi/tfs/ztp/ZtpServiceTest.java    | 2 +-
 src/ztp/util/set_version.sh                                   | 2 +-
 update_tfs_runtime_env_vars.sh                                | 2 +-
 3002 files changed, 3003 insertions(+), 3003 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2d7c2e21b..e2d653e03 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/clean_testing_environment.sh b/clean_testing_environment.sh
index b9c502ade..f037a2a39 100755
--- a/clean_testing_environment.sh
+++ b/clean_testing_environment.sh
@@ -1,5 +1,5 @@
 #!/usr/bin/env bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/common_requirements.in b/common_requirements.in
index 37b70c993..3aa30e174 100644
--- a/common_requirements.in
+++ b/common_requirements.in
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/coverage/.coveragerc.template b/coverage/.coveragerc.template
index 4421399ca..3d8065aca 100644
--- a/coverage/.coveragerc.template
+++ b/coverage/.coveragerc.template
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/data/perf/old/MW/generate.sh b/data/perf/old/MW/generate.sh
index a7fd03b2f..ccef4e113 100755
--- a/data/perf/old/MW/generate.sh
+++ b/data/perf/old/MW/generate.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/data/perf/old/MW/generate_plot.py b/data/perf/old/MW/generate_plot.py
index 3d2d3a77c..22befef30 100644
--- a/data/perf/old/MW/generate_plot.py
+++ b/data/perf/old/MW/generate_plot.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/data/perf/old/OpenConfig/generate.sh b/data/perf/old/OpenConfig/generate.sh
index 6a6123bab..5147d4962 100755
--- a/data/perf/old/OpenConfig/generate.sh
+++ b/data/perf/old/OpenConfig/generate.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/data/perf/old/OpenConfig/generate_plot.py b/data/perf/old/OpenConfig/generate_plot.py
index 63166d7ac..8d50ab81f 100644
--- a/data/perf/old/OpenConfig/generate_plot.py
+++ b/data/perf/old/OpenConfig/generate_plot.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/data/perf/old/TE/te-cdf.py b/data/perf/old/TE/te-cdf.py
index fdcc1f679..a3e7cc530 100644
--- a/data/perf/old/TE/te-cdf.py
+++ b/data/perf/old/TE/te-cdf.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/data/perf/old/XR/generate.sh b/data/perf/old/XR/generate.sh
index a26632959..d5b704763 100755
--- a/data/perf/old/XR/generate.sh
+++ b/data/perf/old/XR/generate.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/data/perf/old/XR/generate_plot.py b/data/perf/old/XR/generate_plot.py
index d9cf628a1..f27c37e53 100644
--- a/data/perf/old/XR/generate_plot.py
+++ b/data/perf/old/XR/generate_plot.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/data/perf/old/emulated/generate.sh b/data/perf/old/emulated/generate.sh
index c61406525..7b978c1fd 100755
--- a/data/perf/old/emulated/generate.sh
+++ b/data/perf/old/emulated/generate.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/data/perf/old/emulated/generate_plot.py b/data/perf/old/emulated/generate_plot.py
index 0f74bc401..d049386c3 100644
--- a/data/perf/old/emulated/generate_plot.py
+++ b/data/perf/old/emulated/generate_plot.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/deploy/all.sh b/deploy/all.sh
index 25d69b485..c169bc92c 100755
--- a/deploy/all.sh
+++ b/deploy/all.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/deploy/component.sh b/deploy/component.sh
index d3a94c259..89d2383d7 100755
--- a/deploy/component.sh
+++ b/deploy/component.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/deploy/crdb.sh b/deploy/crdb.sh
index a304e83d1..c979ad4f2 100755
--- a/deploy/crdb.sh
+++ b/deploy/crdb.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/deploy/expose_dashboard.sh b/deploy/expose_dashboard.sh
index 65f715cab..f2391ab5d 100755
--- a/deploy/expose_dashboard.sh
+++ b/deploy/expose_dashboard.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/deploy/mock_blockchain.sh b/deploy/mock_blockchain.sh
index df8496bea..fafa435b1 100755
--- a/deploy/mock_blockchain.sh
+++ b/deploy/mock_blockchain.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/deploy/nats.sh b/deploy/nats.sh
index 004f67c44..366270a69 100755
--- a/deploy/nats.sh
+++ b/deploy/nats.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/deploy/qdb.sh b/deploy/qdb.sh
index 3235c6c82..acbcfd4f9 100755
--- a/deploy/qdb.sh
+++ b/deploy/qdb.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/deploy/show.sh b/deploy/show.sh
index a4084ac65..4fa1ce3a6 100755
--- a/deploy/show.sh
+++ b/deploy/show.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/deploy/tfs.sh b/deploy/tfs.sh
index fd49c9758..3fdbe77fb 100755
--- a/deploy/tfs.sh
+++ b/deploy/tfs.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/containerlab/tfs-scenario.clab.yml b/hackfest/containerlab/tfs-scenario.clab.yml
index df197ebea..f79378757 100644
--- a/hackfest/containerlab/tfs-scenario.clab.yml
+++ b/hackfest/containerlab/tfs-scenario.clab.yml
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/gnmi/srlinux.clab.yml b/hackfest/gnmi/srlinux.clab.yml
index a589292ac..6cfeb6108 100644
--- a/hackfest/gnmi/srlinux.clab.yml
+++ b/hackfest/gnmi/srlinux.clab.yml
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/grpc/connection.proto b/hackfest/grpc/connection.proto
index 0e8522768..0da1059f3 100644
--- a/hackfest/grpc/connection.proto
+++ b/hackfest/grpc/connection.proto
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/grpc/connection/create.py b/hackfest/grpc/connection/create.py
index 7d134105d..9e32dd8d4 100644
--- a/hackfest/grpc/connection/create.py
+++ b/hackfest/grpc/connection/create.py
@@ -1,5 +1,5 @@
 #! /usr/bin/env python3
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/grpc/connection/list.py b/hackfest/grpc/connection/list.py
index 5b1926d3c..e852b69b7 100644
--- a/hackfest/grpc/connection/list.py
+++ b/hackfest/grpc/connection/list.py
@@ -1,5 +1,5 @@
 #! /usr/bin/env python3
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/grpc/connectionService.proto b/hackfest/grpc/connectionService.proto
index 8f6b5a6e7..0a80f2c1a 100644
--- a/hackfest/grpc/connectionService.proto
+++ b/hackfest/grpc/connectionService.proto
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/grpc/connectionService/connectionService_client.py b/hackfest/grpc/connectionService/connectionService_client.py
index e5c1bf481..2ed97ae97 100644
--- a/hackfest/grpc/connectionService/connectionService_client.py
+++ b/hackfest/grpc/connectionService/connectionService_client.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/grpc/connectionService/connectionService_server.py b/hackfest/grpc/connectionService/connectionService_server.py
index f1632db90..ff991f44c 100644
--- a/hackfest/grpc/connectionService/connectionService_server.py
+++ b/hackfest/grpc/connectionService/connectionService_server.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/grpc/connectionServiceWithNotif.proto b/hackfest/grpc/connectionServiceWithNotif.proto
index f2f5b17e3..778203e26 100644
--- a/hackfest/grpc/connectionServiceWithNotif.proto
+++ b/hackfest/grpc/connectionServiceWithNotif.proto
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_client.py b/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_client.py
index 9518bf743..2503f424f 100644
--- a/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_client.py
+++ b/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_client.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_server.py b/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_server.py
index 922f91837..d5c413064 100644
--- a/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_server.py
+++ b/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_server.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/grpc/topologyService.proto b/hackfest/grpc/topologyService.proto
index 775e45add..6a38bf9c7 100644
--- a/hackfest/grpc/topologyService.proto
+++ b/hackfest/grpc/topologyService.proto
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/grpc/topologyService/topologyService_client.py b/hackfest/grpc/topologyService/topologyService_client.py
index ef628183b..aa1ffc2bf 100644
--- a/hackfest/grpc/topologyService/topologyService_client.py
+++ b/hackfest/grpc/topologyService/topologyService_client.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/grpc/topologyService/topologyService_server.py b/hackfest/grpc/topologyService/topologyService_server.py
index ff1c80e82..dfd62aa13 100644
--- a/hackfest/grpc/topologyService/topologyService_server.py
+++ b/hackfest/grpc/topologyService/topologyService_server.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/kafka/pub.py b/hackfest/kafka/pub.py
index e80dd5db8..77564dfcb 100644
--- a/hackfest/kafka/pub.py
+++ b/hackfest/kafka/pub.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/kafka/sub.py b/hackfest/kafka/sub.py
index 233b9f9d0..2253c6467 100644
--- a/hackfest/kafka/sub.py
+++ b/hackfest/kafka/sub.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/mock_osm/MockOSM.py b/hackfest/mock_osm/MockOSM.py
index 338db0e19..7ced57d3e 100644
--- a/hackfest/mock_osm/MockOSM.py
+++ b/hackfest/mock_osm/MockOSM.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/mock_osm/__init__.py b/hackfest/mock_osm/__init__.py
index 1549d9811..3ee6f7071 100644
--- a/hackfest/mock_osm/__init__.py
+++ b/hackfest/mock_osm/__init__.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/mock_osm/__main__.py b/hackfest/mock_osm/__main__.py
index 4ed25eaed..48866fb2d 100644
--- a/hackfest/mock_osm/__main__.py
+++ b/hackfest/mock_osm/__main__.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/netconf-oc/device_definition.py b/hackfest/netconf-oc/device_definition.py
index 6e737f556..ecd3dd6ce 100644
--- a/hackfest/netconf-oc/device_definition.py
+++ b/hackfest/netconf-oc/device_definition.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/hackfest/netconf-oc/interfaces.xml b/hackfest/netconf-oc/interfaces.xml
index c47fc44e3..f04504bd4 100644
--- a/hackfest/netconf-oc/interfaces.xml
+++ b/hackfest/netconf-oc/interfaces.xml
@@ -1,6 +1,6 @@
 
 
+			
 
 			
 			
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4PeerInitiatedSession.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4PeerInitiatedSession.java
index e5a37e743..9651d7876 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4PeerInitiatedSession.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4PeerInitiatedSession.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4Session.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4Session.java
index 002a5caa5..0c1a656c4 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4Session.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4Session.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4SessionClient.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4SessionClient.java
index 61a5fc41c..b96359b6c 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4SessionClient.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4SessionClient.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4SessionExistsException.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4SessionExistsException.java
index 668825ca8..4f6f4af85 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4SessionExistsException.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4SessionExistsException.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4SessionsInformation.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4SessionsInformation.java
index df5d7bc9c..963406700 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4SessionsInformation.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4SessionsInformation.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4StateSession.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4StateSession.java
index 6f426828b..5a1a5119a 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4StateSession.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/BGP4StateSession.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/ConnectRetryTimer.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/ConnectRetryTimer.java
index 736c56fc5..0eba7b309 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/ConnectRetryTimer.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/ConnectRetryTimer.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/DeadTimerThread.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/DeadTimerThread.java
index f32f0218f..ee9dd6623 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/DeadTimerThread.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/DeadTimerThread.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/GenericBGP4Session.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/GenericBGP4Session.java
index 45636a2fe..c42423aff 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/GenericBGP4Session.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/GenericBGP4Session.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/KeepAliveThread.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/KeepAliveThread.java
index 70ebe101f..32112e01b 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/KeepAliveThread.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/KeepAliveThread.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/KeepWaitTimerTask.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/KeepWaitTimerTask.java
index 3bc72c84d..94e39fb19 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/KeepWaitTimerTask.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/KeepWaitTimerTask.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/OpenWaitTimerTask.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/OpenWaitTimerTask.java
index 20b77ce4e..fbb9aca1a 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/OpenWaitTimerTask.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/bgp4session/OpenWaitTimerTask.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/grpc/grpcApp.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/grpc/grpcApp.java
index 329404668..02cfbaf91 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/grpc/grpcApp.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/grpc/grpcApp.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/grpc/grpcClient.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/grpc/grpcClient.java
index 6e74dff00..ca9b13007 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/grpc/grpcClient.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/grpc/grpcClient.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/grpc/updateServiceImpl.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/grpc/updateServiceImpl.java
index 3010cbbfb..e9dff709f 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/grpc/updateServiceImpl.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/grpc/updateServiceImpl.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/json/bgpMarshal.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/json/bgpMarshal.java
index 87d141222..f4bdcc587 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/json/bgpMarshal.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/json/bgpMarshal.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/management/BGP4ManagementServer.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/management/BGP4ManagementServer.java
index f135a446d..3a813e936 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/management/BGP4ManagementServer.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/management/BGP4ManagementServer.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/management/BGP4ManagementSession.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/management/BGP4ManagementSession.java
index 18a433e40..476628728 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/management/BGP4ManagementSession.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/management/BGP4ManagementSession.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/LinkNLRIMsg.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/LinkNLRIMsg.java
index 9455ccd1c..fb9a08d7e 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/LinkNLRIMsg.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/LinkNLRIMsg.java
@@ -1,5 +1,5 @@
 
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/NodeNLRIMsg.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/NodeNLRIMsg.java
index 958544f63..d206cf7e2 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/NodeNLRIMsg.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/NodeNLRIMsg.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/PathAttributeMsg.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/PathAttributeMsg.java
index 11bf355d0..4f036b8a1 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/PathAttributeMsg.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/PathAttributeMsg.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/UpdateMsg.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/UpdateMsg.java
index 37d87e683..aba3dcef5 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/UpdateMsg.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/UpdateMsg.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/UpdateMsgList.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/UpdateMsgList.java
index 6fd30c6cb..e274a87aa 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/UpdateMsgList.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/models/UpdateMsgList.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4Exception.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4Exception.java
index 736f6cd3e..6bd951501 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4Exception.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4Exception.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4LSPeerInfo.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4LSPeerInfo.java
index 768e4a87b..d751622ee 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4LSPeerInfo.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4LSPeerInfo.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4Parameters.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4Parameters.java
index e8958d306..3c83a9a77 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4Parameters.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4Parameters.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4SessionClientManager.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4SessionClientManager.java
index 75694e90c..9e54e64c1 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4SessionClientManager.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4SessionClientManager.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4SessionServerManager.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4SessionServerManager.java
index ccb59fa2e..0d337bb61 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4SessionServerManager.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGP4SessionServerManager.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGPPeer.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGPPeer.java
index bdddd4379..9894a8966 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGPPeer.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGPPeer.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGPPeerMain.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGPPeerMain.java
index 97e2702f5..aa2a5cc6a 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGPPeerMain.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/BGPPeerMain.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/SaveTopologyinDB.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/SaveTopologyinDB.java
index bd27bb87a..d66f2485d 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/SaveTopologyinDB.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/SaveTopologyinDB.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/SendTopology.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/SendTopology.java
index d2de34a91..5bfeae8e2 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/SendTopology.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/peer/SendTopology.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/tedb/BGP4DomainTEDB.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/tedb/BGP4DomainTEDB.java
index 512467ccf..cbea17cc5 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/tedb/BGP4DomainTEDB.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/tedb/BGP4DomainTEDB.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/tedb/BGP4IntradomainTEDB.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/tedb/BGP4IntradomainTEDB.java
index 0f027c693..19aad7115 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/tedb/BGP4IntradomainTEDB.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/tedb/BGP4IntradomainTEDB.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/tedb/IntraTEDBS.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/tedb/IntraTEDBS.java
index ae4946dd2..22319122a 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/tedb/IntraTEDBS.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/tedb/IntraTEDBS.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdateDispatcher.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdateDispatcher.java
index e77612ea6..0da582030 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdateDispatcher.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdateDispatcher.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdateLink.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdateLink.java
index df711c284..bf7a0b84a 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdateLink.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdateLink.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdateProccesorThread.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdateProccesorThread.java
index cedbe3498..26d876c17 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdateProccesorThread.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdateProccesorThread.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdaterThreadRedisTED.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdaterThreadRedisTED.java
index 229fbe1de..4c0fd1380 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdaterThreadRedisTED.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/bgp4Peer/updateTEDB/UpdaterThreadRedisTED.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/DatabaseControlSimplifiedLSA.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/DatabaseControlSimplifiedLSA.java
index e56e45cf5..436263a47 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/DatabaseControlSimplifiedLSA.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/DatabaseControlSimplifiedLSA.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/DomainTEDB.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/DomainTEDB.java
index 85ecd8fd3..44d2973b2 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/DomainTEDB.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/DomainTEDB.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/EdgeUtils.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/EdgeUtils.java
index e2fafa238..79ad7f82c 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/EdgeUtils.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/EdgeUtils.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/FileTEDBUpdater.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/FileTEDBUpdater.java
index ce5652267..16ba2de9b 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/FileTEDBUpdater.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/FileTEDBUpdater.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/IT_Resources.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/IT_Resources.java
index a819bcf4d..dac19068f 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/IT_Resources.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/IT_Resources.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/InterDomainEdge.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/InterDomainEdge.java
index 724dbb8e0..187b21205 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/InterDomainEdge.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/InterDomainEdge.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/IntraDomainEdge.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/IntraDomainEdge.java
index 50bf93959..09eeedd49 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/IntraDomainEdge.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/IntraDomainEdge.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/IntraDomainWeightEdge.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/IntraDomainWeightEdge.java
index ce3cac72e..63052028b 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/IntraDomainWeightEdge.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/IntraDomainWeightEdge.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/Layer.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/Layer.java
index e9835d418..96d0c0c2e 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/Layer.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/Layer.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/MDTEDB.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/MDTEDB.java
index 09b75f6fe..b8e671de2 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/MDTEDB.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/MDTEDB.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/MultiDomainTEDB.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/MultiDomainTEDB.java
index 19c345888..746338df2 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/MultiDomainTEDB.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/MultiDomainTEDB.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/MultiLayerTEDB.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/MultiLayerTEDB.java
index a2690516a..bed570fed 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/MultiLayerTEDB.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/MultiLayerTEDB.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/Node_Info.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/Node_Info.java
index bc523ba5a..b0f3bb3ac 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/Node_Info.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/Node_Info.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/ReachabilityEntry.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/ReachabilityEntry.java
index d51896c0e..e65a0ec3f 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/ReachabilityEntry.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/ReachabilityEntry.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/ReachabilityManager.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/ReachabilityManager.java
index cf2f3c5c3..161d27f1f 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/ReachabilityManager.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/ReachabilityManager.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/SSONInformation.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/SSONInformation.java
index ff69b8901..78a234ee1 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/SSONInformation.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/SSONInformation.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/SSONListener.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/SSONListener.java
index ce769c41c..22b91b986 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/SSONListener.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/SSONListener.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/SimpleTEDB.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/SimpleTEDB.java
index f2d5dbc89..4e74e445b 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/SimpleTEDB.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/SimpleTEDB.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/TEDB.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/TEDB.java
index 51fc3d8c1..ca937a5aa 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/TEDB.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/TEDB.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/TEDBUpdater.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/TEDBUpdater.java
index fe261b80e..6b0aa6176 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/TEDBUpdater.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/TEDBUpdater.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/TEDListener.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/TEDListener.java
index 86e653ed0..ec1b2e650 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/TEDListener.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/TEDListener.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/TE_Information.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/TE_Information.java
index 0e5476dfe..f1842a6ce 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/TE_Information.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/TE_Information.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/WSONInformation.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/WSONInformation.java
index c67f3a826..2b344a342 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/WSONInformation.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/WSONInformation.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/WSONListener.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/WSONListener.java
index 31b35b441..a802fae9e 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/WSONListener.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/WSONListener.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterController.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterController.java
index 463e300c4..853aa217e 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterController.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterController.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterFloodlight.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterFloodlight.java
index 9bea224fa..401e4bc9c 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterFloodlight.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterFloodlight.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterNOX.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterNOX.java
index fb2c3c51d..5b8e65f0c 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterNOX.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterNOX.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterODL.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterODL.java
index a1a8c0e6f..1bdbc624d 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterODL.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterODL.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterRYU.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterRYU.java
index c1383b8b2..74b0a1f4e 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterRYU.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterRYU.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterTREMA.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterTREMA.java
index a87fc3790..ac11500b7 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterTREMA.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/controllers/TEDUpdaterTREMA.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/AuthInfo.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/AuthInfo.java
index aec4c98c0..223c1940e 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/AuthInfo.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/AuthInfo.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Bandwidth.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Bandwidth.java
index 0fb657e27..fd5f7aa88 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Bandwidth.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Bandwidth.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/BgpParams.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/BgpParams.java
index 98c529e65..37fab2297 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/BgpParams.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/BgpParams.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/EndPoint.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/EndPoint.java
index 27a4c0ffc..845bcf416 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/EndPoint.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/EndPoint.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/IPNodeParams.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/IPNodeParams.java
index 6bd26cf48..0c56d240c 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/IPNodeParams.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/IPNodeParams.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Intf.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Intf.java
index 23f619fa5..57010b999 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Intf.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Intf.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/IsisParams.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/IsisParams.java
index 0cdc583a9..1daaf2124 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/IsisParams.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/IsisParams.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Link.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Link.java
index cd2ab812c..35b3e9c22 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Link.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Link.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Location.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Location.java
index 7e6453682..311387bc3 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Location.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Location.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Node.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Node.java
index bd3350a66..596dedb9a 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Node.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Node.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/OspfParams.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/OspfParams.java
index 3e383487e..4b06f3868 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/OspfParams.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/OspfParams.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Path.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Path.java
index 1ff00d3c6..d77a70397 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Path.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Path.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/PhyLinkParams.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/PhyLinkParams.java
index 7c6e003c8..739508b41 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/PhyLinkParams.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/PhyLinkParams.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/RouterDesc.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/RouterDesc.java
index 4bfc3e9fa..71cd098a5 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/RouterDesc.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/RouterDesc.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/RouterInfoPM.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/RouterInfoPM.java
index a967ef88f..037e6a1eb 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/RouterInfoPM.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/RouterInfoPM.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Service.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Service.java
index 423b71ee3..a60bb60ff 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Service.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/Service.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/StaticRoutingParams.java b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/StaticRoutingParams.java
index c6db597fc..efae98762 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/StaticRoutingParams.java
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/java/eu/teraflow/tid/tedb/elements/StaticRoutingParams.java
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/proto/grpcService.proto b/src/bgpls_speaker/service/java/netphony-topology/src/main/proto/grpcService.proto
index ec8accd8b..89ab745e1 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/proto/grpcService.proto
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/proto/grpcService.proto
@@ -1,4 +1,4 @@
-// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
diff --git a/src/bgpls_speaker/service/java/netphony-topology/src/main/sample-config-files/TM_COP_example1/TMConfCOP.xml b/src/bgpls_speaker/service/java/netphony-topology/src/main/sample-config-files/TM_COP_example1/TMConfCOP.xml
index e048daf06..c83d4ec1a 100644
--- a/src/bgpls_speaker/service/java/netphony-topology/src/main/sample-config-files/TM_COP_example1/TMConfCOP.xml
+++ b/src/bgpls_speaker/service/java/netphony-topology/src/main/sample-config-files/TM_COP_example1/TMConfCOP.xml
@@ -1,4 +1,4 @@
- CollectorId:
+        LOGGER.debug('StartCollector: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.StartCollector(request)
+        LOGGER.debug('StartCollector result: {:s}'.format(grpc_message_to_json_string(response)))
+        return response
+
+    @RETRY_DECORATOR
+    def StopCollector(self, request : CollectorId) --> Empty:
+        LOGGER.debug('StopCollector: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.StopCollector(request)
+        LOGGER.debug('StopCollector result: {:s}'.format(grpc_message_to_json_string(response)))
+        return response
+
+    @RETRY_DECORATOR
+    def SelectCollectors(self, request : CollectorFilter) --> CollectorList:
+        LOGGER.debug('SelectCollectors: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.SelectCollectors(request)
+        LOGGER.debug('SelectCollectors result: {:s}'.format(grpc_message_to_json_string(response)))
+        return response
+
-- 
GitLab


From 55deaf8425de3a736a5fbf574295a2477f9a793e Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Wed, 24 Apr 2024 16:24:05 +0000
Subject: [PATCH 143/602] __init__.py added in "Telemetry Frontend"
 subdirectories.

---
 src/telemetry_frontend/__init__.py         |  1 +
 src/telemetry_frontend/client/__init__.py  | 14 ++++++++++++++
 src/telemetry_frontend/service/__init__.py |  0
 3 files changed, 15 insertions(+)
 create mode 100644 src/telemetry_frontend/__init__.py
 create mode 100644 src/telemetry_frontend/client/__init__.py
 create mode 100644 src/telemetry_frontend/service/__init__.py

diff --git a/src/telemetry_frontend/__init__.py b/src/telemetry_frontend/__init__.py
new file mode 100644
index 000000000..eb1ae458f
--- /dev/null
+++ b/src/telemetry_frontend/__init__.py
@@ -0,0 +1 @@
+...
diff --git a/src/telemetry_frontend/client/__init__.py b/src/telemetry_frontend/client/__init__.py
new file mode 100644
index 000000000..1549d9811
--- /dev/null
+++ b/src/telemetry_frontend/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/telemetry_frontend/service/__init__.py b/src/telemetry_frontend/service/__init__.py
new file mode 100644
index 000000000..e69de29bb
-- 
GitLab


From b7df322b4cc2b728168474cf21924f72cbfd2372 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Wed, 24 Apr 2024 16:50:22 +0000
Subject: [PATCH 144/602] "TelemetryFrontendServiceServicerImpl" file added

---
 .../service/TelemetryFrontendServiceServicerImpl.py | 13 +++++++++++++
 1 file changed, 13 insertions(+)
 create mode 100644 src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py

diff --git a/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py
new file mode 100644
index 000000000..f80ccfd52
--- /dev/null
+++ b/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py
@@ -0,0 +1,13 @@
+# 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.
\ No newline at end of file
-- 
GitLab


From a39e8f074701d1d79af7fc71e593ca71da39d6d2 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Wed, 24 Apr 2024 16:51:01 +0000
Subject: [PATCH 145/602] Initial "TelemetryFrontendService" generic file added

---
 .../service/TelemetryFrontendService.py       | 30 +++++++++++++++++++
 1 file changed, 30 insertions(+)
 create mode 100644 src/telemetry_frontend/service/TelemetryFrontendService.py

diff --git a/src/telemetry_frontend/service/TelemetryFrontendService.py b/src/telemetry_frontend/service/TelemetryFrontendService.py
new file mode 100644
index 000000000..16e77e61b
--- /dev/null
+++ b/src/telemetry_frontend/service/TelemetryFrontendService.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.
+
+from common.Constants import ServiceNameEnum
+from common.Settings import get_service_port_grpc
+from monitoring.service.NameMapping import NameMapping
+from common.tools.service.GenericGrpcService import GenericGrpcService
+from common.proto.telemetry_frontend_pb2_grpc import add_TelemetryFrontendServiceServicer_to_server
+from telemetryfrontend.service.TelemetryFrontendServiceServicerImpl import TelemetryFrontendServiceServicerImpl
+
+
+class TelemetryFrontendService(GenericGrpcService):
+    def __init__(self, name_mapping : NameMapping, cls_name: str = __name__) -> None:
+        port = get_service_port_grpc(ServiceNameEnum.TELEMETRYFRONTEND)
+        super().__init__(port, cls_name=cls_name)
+        self.telemetry_frontend_servicer = TelemetryFrontendServiceServicerImpl(name_mapping)
+
+    def install_servicers(self):
+        add_TelemetryFrontendServiceServicer_to_server(self.telemetry_frontend_servicer, self.server)
-- 
GitLab


From faeed6d72cd393b7a6643a9038651d42b1395e94 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 25 Apr 2024 10:12:58 +0000
Subject: [PATCH 146/602] Metric pool sub-module name changed from "RPC" to
 "KpiManager"

---
 src/kpi_manager/service/KpiManagerServiceServicerImpl.py | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py
index fc1ea3b96..4ffa1d2a6 100644
--- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py
+++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py
@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+# do tests to verify the "grpc.ServicerContext" is required or not.
 import logging, grpc
 from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method
 from common.proto.context_pb2 import Empty
@@ -23,7 +24,7 @@ from monitoring.service import ManagementDBTools
 
 LOGGER = logging.getLogger(__name__)
 
-METRICS_POOL = MetricsPool('Monitoring', 'RPC')
+METRICS_POOL = MetricsPool('Monitoring', 'KpiManager')
 
 class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
     def __init__(self, name_mapping : NameMapping):
@@ -36,7 +37,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SetKpiDescriptor(
             self, request: KpiDescriptor, grpc_context: grpc.ServicerContext
-    ) -> KpiId:
+        ) -> KpiId:
         response = KpiId()
         kpi_description = request.kpi_description
         kpi_sample_type = request.kpi_sample_type
-- 
GitLab


From c8b75826bcda70d652b9c3c2a534b33ada39f8c7 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 25 Apr 2024 10:13:44 +0000
Subject: [PATCH 147/602] "__init__.py" file added in TelemeteryFrontend
 sub-directories

---
 src/telemetry_frontend/service/__init__.py | 14 ++++++++++++++
 src/telemetry_frontend/tests/__init__.py   | 14 ++++++++++++++
 2 files changed, 28 insertions(+)
 create mode 100644 src/telemetry_frontend/tests/__init__.py

diff --git a/src/telemetry_frontend/service/__init__.py b/src/telemetry_frontend/service/__init__.py
index e69de29bb..1549d9811 100644
--- a/src/telemetry_frontend/service/__init__.py
+++ b/src/telemetry_frontend/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/telemetry_frontend/tests/__init__.py b/src/telemetry_frontend/tests/__init__.py
new file mode 100644
index 000000000..1549d9811
--- /dev/null
+++ b/src/telemetry_frontend/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.
+
-- 
GitLab


From dd0f90fad5e20056bf2e2f2b799464b88391ce84 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 25 Apr 2024 10:14:37 +0000
Subject: [PATCH 148/602] "StartCollector" method dummy defination added

---
 .../TelemetryFrontendServiceServicerImpl.py   | 27 ++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py
index f80ccfd52..6ffb78ab1 100644
--- a/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py
+++ b/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py
@@ -10,4 +10,29 @@
 # 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.
\ No newline at end of file
+# limitations under the License.
+
+import logging
+from monitoring.service.NameMapping import NameMapping
+from common.proto.telemetry_frontend_pb2 import CollectorId, Collector
+from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method
+from common.proto.telemetry_frontend_pb2_grpc import TelemetryFrontendServiceServicer
+
+
+LOGGER = logging.getLogger(__name__)
+METRICS_POOL = MetricsPool('Monitoring', 'TelemetryFrontend')
+
+class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer):
+    def __init__(self, name_mapping : NameMapping):
+        LOGGER.info('Init TelemetryFrontendService')
+
+    @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
+    def StartCollector(self, request: Collector) -> CollectorId:
+        response = CollectorId()
+        collector_id = request.collector_id
+        collector_kpi_id = request.kpi_id
+        collector_duration = request.duration_s
+        collector_interval = request.interval_s
+
+        response.collector_id.uuid = request.collector_id.uuid
+        return response
\ No newline at end of file
-- 
GitLab


From d66e79c3cbaf8a70e064689aae2690be658ccf29 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 25 Apr 2024 10:15:29 +0000
Subject: [PATCH 149/602] method to test "collectorId" message is added

---
 src/telemetry_frontend/tests/test_mesages.py | 22 ++++++++++++++++++++
 1 file changed, 22 insertions(+)
 create mode 100644 src/telemetry_frontend/tests/test_mesages.py

diff --git a/src/telemetry_frontend/tests/test_mesages.py b/src/telemetry_frontend/tests/test_mesages.py
new file mode 100644
index 000000000..0b7eaeb2b
--- /dev/null
+++ b/src/telemetry_frontend/tests/test_mesages.py
@@ -0,0 +1,22 @@
+# 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.
+
+from common.proto import telemetry_frontend_pb2
+# from common.proto.kpi_manager_pb2 import kpi_id
+# from common.proto.kpi_sample_types_pb2 import KpiSampleType
+
+def collector_id():
+    _collector_id                   = telemetry_frontend_pb2.CollectorId()
+    _collector_id.collector_id.uuid = str(1)
+    return _collector_id
\ No newline at end of file
-- 
GitLab


From e03a7344575d87aeaa234ada771d15205552e6b1 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 25 Apr 2024 10:16:27 +0000
Subject: [PATCH 150/602] __main__.py function is added in TelemetryFrontend
 directory

---
 src/telemetry_frontend/service/__main__.py | 69 ++++++++++++++++++++++
 1 file changed, 69 insertions(+)
 create mode 100644 src/telemetry_frontend/service/__main__.py

diff --git a/src/telemetry_frontend/service/__main__.py b/src/telemetry_frontend/service/__main__.py
new file mode 100644
index 000000000..9b5fe70de
--- /dev/null
+++ b/src/telemetry_frontend/service/__main__.py
@@ -0,0 +1,69 @@
+# 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 logging, threading
+from .TelemetryFrontendService import TelemetryFrontendService
+from monitoring.service.NameMapping import NameMapping
+from monitoring.service.EventTools import EventsDeviceCollector
+from common.Settings import (
+    get_log_level, wait_for_environment_variables, get_env_var_name, 
+    get_metrics_port )
+
+terminate = threading.Event()
+LOGGER = None
+
+def signal_handler(signal, frame): # pylint: disable=redefined-outer-name
+    LOGGER.warning('Terminate signal received')
+    terminate.set()
+
+def main():
+    global LOGGER
+
+    log_level = get_log_level()
+    logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s")
+    LOGGER = logging.getLogger(__name__)
+
+# ------- will be added later --------------
+    # wait_for_environment_variables([
+    #     get_env_var_name
+
+
+    # ])
+# ------- will be added later --------------
+
+    signal.signal(signal.SIGINT,  signal_handler)
+    signal.signal(signal.SIGTERM, signal_handler)
+
+    LOGGER.info('Starting...')
+
+    # Start metrics server
+    metrics_port = get_metrics_port()
+    start_http_server(metrics_port)
+
+    name_mapping = NameMapping()
+
+    grpc_service = TelemetryFrontendService(name_mapping)
+    grpc_service.start()
+
+    # Wait for Ctrl+C or termination signal
+    while not terminate.wait(timeout=1.0): pass
+
+    LOGGER.info('Terminating...')
+    grpc_service.stop()
+
+    LOGGER.info('Bye')
+    return 0
+
+if __name__ == '__main__':
+    sys.exit(main())
\ No newline at end of file
-- 
GitLab


From af3678e5618f7c3f038da5b307bbc1afe17e8781 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 25 Apr 2024 15:08:50 +0000
Subject: [PATCH 151/602] test script for telemetry frontend

---
 .../run_tests_locally_telemetry-frontend.sh   | 28 +++++++++++++++++++
 1 file changed, 28 insertions(+)
 create mode 100755 scripts/run_tests_locally_telemetry-frontend.sh

diff --git a/scripts/run_tests_locally_telemetry-frontend.sh b/scripts/run_tests_locally_telemetry-frontend.sh
new file mode 100755
index 000000000..ac59f6dde
--- /dev/null
+++ b/scripts/run_tests_locally_telemetry-frontend.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+# 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.
+
+
+PROJECTDIR=`pwd`
+
+cd $PROJECTDIR/src
+# RCFILE=$PROJECTDIR/coverage/.coveragerc
+# coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
+#     kpi_manager/tests/test_unitary.py
+
+# python3 kpi_manager/tests/test_unitary.py
+
+RCFILE=$PROJECTDIR/coverage/.coveragerc
+python3 -m pytest --log-level=INFO --verbose \
+    telemetry_frontend/tests/test_unitary.py
\ No newline at end of file
-- 
GitLab


From 48afe65f0b4122f768f045c3abb5d312727f0180 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 25 Apr 2024 15:09:35 +0000
Subject: [PATCH 152/602] added __init_.py file

---
 src/kpi_manager/tests/__init__.py | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
 create mode 100644 src/kpi_manager/tests/__init__.py

diff --git a/src/kpi_manager/tests/__init__.py b/src/kpi_manager/tests/__init__.py
new file mode 100644
index 000000000..1549d9811
--- /dev/null
+++ b/src/kpi_manager/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.
+
-- 
GitLab


From 2f8a2a3371ba4f638a0f03bb41f7b4949a8626a4 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 26 Apr 2024 07:05:34 +0000
Subject: [PATCH 153/602] improvements in comments

---
 src/kpi_manager/tests/test_unitary.py | 46 +--------------------------
 1 file changed, 1 insertion(+), 45 deletions(-)

diff --git a/src/kpi_manager/tests/test_unitary.py b/src/kpi_manager/tests/test_unitary.py
index adc886341..75987a5f4 100755
--- a/src/kpi_manager/tests/test_unitary.py
+++ b/src/kpi_manager/tests/test_unitary.py
@@ -191,50 +191,6 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab
 
     LOGGER.info('Closed KpiManagerClient...')
 
-# @pytest.fixture(scope='session')
-# def management_db():
-#     _management_db = ManagementDB('monitoring.db')
-#     return _management_db
-
-# @pytest.fixture(scope='session')
-# def metrics_db(kpi_manager_service : KpiManagerService): # pylint: disable=redefined-outer-name
-#     return monitoring_service.monitoring_servicer.metrics_db
-
-# # This function os not clear to me (Changes should me made before execution)
-# @pytest.fixture(scope='session')
-# def metrics_db(monitoring_service : MonitoringService): # pylint: disable=redefined-outer-name
-#     return monitoring_service.monitoring_servicer.metrics_db
-#     #_metrics_db = MetricsDBTools.MetricsDB(
-#     #    METRICSDB_HOSTNAME, METRICSDB_ILP_PORT, METRICSDB_REST_PORT, METRICSDB_TABLE_MONITORING_KPIS)
-#     #return _metrics_db
-
-# @pytest.fixture(scope='session')
-# def subs_scheduler():
-#     _scheduler = BackgroundScheduler(executors={'processpool': ProcessPoolExecutor(max_workers=20)})
-#     _scheduler.start()
-#     return _scheduler
-
-# def ingestion_data(kpi_id_int):
-#     # pylint: disable=redefined-outer-name,unused-argument
-#     metrics_db = MetricsDB('localhost', '9009', '9000', 'monitoring')
-
-#     kpiSampleType = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
-#     kpiSampleType_name = KpiSampleType.Name(kpiSampleType).upper().replace('KPISAMPLETYPE_', '')
-#     for _ in range(50):
-#         kpiSampleType   = kpiSampleType_name
-#         kpiId           = kpi_id_int
-#         deviceId        = 'DEV'+ str(kpi_id_int)
-#         endpointId      = 'END' + str(kpi_id_int)
-#         serviceId       = 'SERV' + str(kpi_id_int)
-#         sliceId         = 'SLC' + str(kpi_id_int)
-#         connectionId    = 'CON' + str(kpi_id_int)
-#         time_stamp      = timestamp_utcnow_to_float()
-#         kpi_value       = 500*random()
-
-#         metrics_db.write_KPI(time_stamp, kpiId, kpiSampleType, deviceId, endpointId, serviceId, sliceId, connectionId,
-#                                   kpi_value)
-#         sleep(0.1)
-
 ##################################################
 # Prepare Environment, should be the first test
 ##################################################
@@ -248,7 +204,7 @@ def test_prepare_environment(
     context_client.SetTopology(Topology(**json_topology(DEFAULT_TOPOLOGY_NAME, context_id=context_id)))
 
 ###########################
-# Tests Implementation
+# Tests Implementation of Kpi Manager
 ###########################
 
 # Test case that makes use of client fixture to test server's CreateKpi method
-- 
GitLab


From 8cf8288c3ccf6d81d3f415fd50c0517b19982f28 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 26 Apr 2024 07:06:59 +0000
Subject: [PATCH 154/602] few syntax errors are removed

---
 src/telemetry_frontend/client/TelemetryFrontendClient.py | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/telemetry_frontend/client/TelemetryFrontendClient.py b/src/telemetry_frontend/client/TelemetryFrontendClient.py
index 9ca19bb8c..a215dd408 100644
--- a/src/telemetry_frontend/client/TelemetryFrontendClient.py
+++ b/src/telemetry_frontend/client/TelemetryFrontendClient.py
@@ -20,7 +20,7 @@ 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.telemetry_frontend_pb2_grpc import TelemetryFrontendServiceStub
-from comment.proto.telemetry_frontend_pb2 import Collector, CollectorId, CollectorFilter, CollectorList
+from common.proto.telemetry_frontend_pb2 import Collector, CollectorId, CollectorFilter, CollectorList
 
 LOGGER = logging.getLogger(__name__)
 MAX_RETRIES = 10
@@ -48,21 +48,21 @@ class TelemetryFrontendClient:
         self.stub = None
 
     @RETRY_DECORATOR
-    def StartCollector(self, request : Collector) --> CollectorId:
+    def StartCollector(self, request : Collector) -> CollectorId:
         LOGGER.debug('StartCollector: {:s}'.format(grpc_message_to_json_string(request)))
         response = self.stub.StartCollector(request)
         LOGGER.debug('StartCollector result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
 
     @RETRY_DECORATOR
-    def StopCollector(self, request : CollectorId) --> Empty:
+    def StopCollector(self, request : CollectorId) -> Empty:
         LOGGER.debug('StopCollector: {:s}'.format(grpc_message_to_json_string(request)))
         response = self.stub.StopCollector(request)
         LOGGER.debug('StopCollector result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
 
     @RETRY_DECORATOR
-    def SelectCollectors(self, request : CollectorFilter) --> CollectorList:
+    def SelectCollectors(self, request : CollectorFilter) -> CollectorList:
         LOGGER.debug('SelectCollectors: {:s}'.format(grpc_message_to_json_string(request)))
         response = self.stub.SelectCollectors(request)
         LOGGER.debug('SelectCollectors result: {:s}'.format(grpc_message_to_json_string(response)))
-- 
GitLab


From 70ebba4213af67e7cd762631c7700f7df4c681e1 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 26 Apr 2024 07:08:01 +0000
Subject: [PATCH 155/602] corrected package name to "telemetry_frontend"

---
 src/telemetry_frontend/service/TelemetryFrontendService.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/telemetry_frontend/service/TelemetryFrontendService.py b/src/telemetry_frontend/service/TelemetryFrontendService.py
index 16e77e61b..a0ae704d3 100644
--- a/src/telemetry_frontend/service/TelemetryFrontendService.py
+++ b/src/telemetry_frontend/service/TelemetryFrontendService.py
@@ -17,7 +17,7 @@ from common.Settings import get_service_port_grpc
 from monitoring.service.NameMapping import NameMapping
 from common.tools.service.GenericGrpcService import GenericGrpcService
 from common.proto.telemetry_frontend_pb2_grpc import add_TelemetryFrontendServiceServicer_to_server
-from telemetryfrontend.service.TelemetryFrontendServiceServicerImpl import TelemetryFrontendServiceServicerImpl
+from telemetry_frontend.service.TelemetryFrontendServiceServicerImpl import TelemetryFrontendServiceServicerImpl
 
 
 class TelemetryFrontendService(GenericGrpcService):
-- 
GitLab


From e921ccd330ac0720591cc3d1417ec719944d80b2 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 26 Apr 2024 07:08:50 +0000
Subject: [PATCH 156/602] New messages test file added in "telemetry_frontend"

---
 src/telemetry_frontend/tests/Messages.py | 30 ++++++++++++++++++++++++
 1 file changed, 30 insertions(+)
 create mode 100644 src/telemetry_frontend/tests/Messages.py

diff --git a/src/telemetry_frontend/tests/Messages.py b/src/telemetry_frontend/tests/Messages.py
new file mode 100644
index 000000000..86b454004
--- /dev/null
+++ b/src/telemetry_frontend/tests/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.
+
+from common.proto import telemetry_frontend_pb2
+# from common.proto.kpi_manager_pb2 import kpi_id
+# from common.proto.kpi_sample_types_pb2 import KpiSampleType
+
+def collector_id():
+    _collector_id                   = telemetry_frontend_pb2.CollectorId()
+    _collector_id.collector_id.uuid = str(1)
+    return _collector_id
+
+def create_collector_request(coll_id_str):
+    _create_collector_request                      = telemetry_frontend_pb2.Collector()
+    _create_collector_request.collector_id.uuid    = str(coll_id_str)
+    _create_collector_request.kpi_id.kpi_uuid.uuid = 'KPIid' + str(coll_id_str)
+    _create_collector_request.duration_s           = float(-1)
+    _create_collector_request.interval_s           = float(-1)
+    return _create_collector_request
-- 
GitLab


From c73dc9a5eb79edfd53f826653e0a5baeacc2f7af Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 26 Apr 2024 07:10:40 +0000
Subject: [PATCH 157/602] "test_messages.py" renamed to "Messages.py"

---
 src/telemetry_frontend/tests/test_mesages.py | 22 --------------------
 1 file changed, 22 deletions(-)
 delete mode 100644 src/telemetry_frontend/tests/test_mesages.py

diff --git a/src/telemetry_frontend/tests/test_mesages.py b/src/telemetry_frontend/tests/test_mesages.py
deleted file mode 100644
index 0b7eaeb2b..000000000
--- a/src/telemetry_frontend/tests/test_mesages.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# 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.
-
-from common.proto import telemetry_frontend_pb2
-# from common.proto.kpi_manager_pb2 import kpi_id
-# from common.proto.kpi_sample_types_pb2 import KpiSampleType
-
-def collector_id():
-    _collector_id                   = telemetry_frontend_pb2.CollectorId()
-    _collector_id.collector_id.uuid = str(1)
-    return _collector_id
\ No newline at end of file
-- 
GitLab


From e994a4a1a29765f4142795fc01225350f263b385 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 26 Apr 2024 07:24:27 +0000
Subject: [PATCH 158/602] "test_unitary.py" file is added in
 "telemetery_frontend"

---
 src/telemetry_frontend/tests/test_unitary.py | 166 +++++++++++++++++++
 1 file changed, 166 insertions(+)
 create mode 100644 src/telemetry_frontend/tests/test_unitary.py

diff --git a/src/telemetry_frontend/tests/test_unitary.py b/src/telemetry_frontend/tests/test_unitary.py
new file mode 100644
index 000000000..c52d68921
--- /dev/null
+++ b/src/telemetry_frontend/tests/test_unitary.py
@@ -0,0 +1,166 @@
+# 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 os
+import logging
+from common.Constants import ServiceNameEnum
+from common.proto.telemetry_frontend_pb2 import CollectorId
+from context.client.ContextClient import ContextClient
+
+
+from telemetry_frontend.client.TelemetryFrontendClient import TelemetryFrontendClient
+from telemetry_frontend.service.TelemetryFrontendService import TelemetryFrontendService
+from telemetry_frontend.tests.Messages import create_collector_request
+
+from common.Settings import ( 
+    get_service_port_grpc, get_env_var_name, ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC)
+
+from device.client.DeviceClient import DeviceClient
+from device.service.DeviceService import DeviceService
+from device.service.driver_api.DriverFactory import DriverFactory
+from device.service.driver_api.DriverInstanceCache import DriverInstanceCache
+
+from monitoring.service.NameMapping import NameMapping
+
+os.environ['DEVICE_EMULATED_ONLY'] = 'TRUE'
+from device.service.drivers import DRIVERS
+
+###########################
+# Tests Setup
+###########################
+
+LOCAL_HOST = '127.0.0.1'
+MOCKSERVICE_PORT = 10000
+
+TELEMETRY_FRONTEND_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.TELEMETRYFRONTEND)
+os.environ[get_env_var_name(ServiceNameEnum.TELEMETRYFRONTEND, ENVVAR_SUFIX_SERVICE_HOST     )] = str(LOCAL_HOST)
+os.environ[get_env_var_name(ServiceNameEnum.TELEMETRYFRONTEND, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(TELEMETRY_FRONTEND_PORT)
+
+LOGGER = logging.getLogger(__name__)
+
+class MockContextService(GenericGrpcService):
+    # Mock Service implementing Context to simplify unitary tests of Monitoring
+
+    def __init__(self, bind_port: Union[str, int]) -> None:
+        super().__init__(bind_port, LOCAL_HOST, enable_health_servicer=False, cls_name='MockService')
+
+    # pylint: disable=attribute-defined-outside-init
+    def install_servicers(self):
+        self.context_servicer = MockServicerImpl_Context()
+        add_ContextServiceServicer_to_server(self.context_servicer, self.server)
+
+@pytest.fixture(scope='session')
+def context_service():
+    LOGGER.info('Initializing MockContextService...')
+    _service = MockContextService(MOCKSERVICE_PORT)
+    _service.start()
+    
+    LOGGER.info('Yielding MockContextService...')
+    yield _service
+
+    LOGGER.info('Terminating MockContextService...')
+    _service.context_servicer.msg_broker.terminate()
+    _service.stop()
+
+    LOGGER.info('Terminated MockContextService...')
+
+@pytest.fixture(scope='session')
+def context_client(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument
+    LOGGER.info('Initializing ContextClient...')
+    _client = ContextClient()
+    
+    LOGGER.info('Yielding ContextClient...')
+    yield _client
+
+    LOGGER.info('Closing ContextClient...')
+    _client.close()
+
+    LOGGER.info('Closed ContextClient...')
+
+@pytest.fixture(scope='session')
+def device_service(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument
+    LOGGER.info('Initializing DeviceService...')
+    driver_factory = DriverFactory(DRIVERS)
+    driver_instance_cache = DriverInstanceCache(driver_factory)
+    _service = DeviceService(driver_instance_cache)
+    _service.start()
+
+    # yield the server, when test finishes, execution will resume to stop it
+    LOGGER.info('Yielding DeviceService...')
+    yield _service
+
+    LOGGER.info('Terminating DeviceService...')
+    _service.stop()
+
+    LOGGER.info('Terminated DeviceService...')
+
+@pytest.fixture(scope='session')
+def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument
+    LOGGER.info('Initializing DeviceClient...')
+    _client = DeviceClient()
+
+    LOGGER.info('Yielding DeviceClient...')
+    yield _client
+
+    LOGGER.info('Closing DeviceClient...')
+    _client.close()
+
+    LOGGER.info('Closed DeviceClient...')
+
+@pytest.fixture(scope='session')
+def telemetryFrontend_service(
+        context_service : MockContextService,
+        device_service  : DeviceService
+    ):
+    LOGGER.info('Initializing TelemetryFrontendService...')
+    name_mapping = NameMapping()
+
+    _service = TelemetryFrontendService(name_mapping)
+    _service.start()
+
+    # yield the server, when test finishes, execution will resume to stop it
+    LOGGER.info('Yielding TelemetryFrontendService...')
+    yield _service
+
+    LOGGER.info('Terminating TelemetryFrontendService...')
+    _service.stop()
+
+    LOGGER.info('Terminated TelemetryFrontendService...')
+
+@pytest.fixture(scope='session')
+def telemetryFrontend_client(
+        telemetryFrontend_service : TelemetryFrontendService
+    ):
+    LOGGER.info('Initializing TelemetryFrontendClient...')
+    _client = TelemetryFrontendClient()
+
+    # yield the server, when test finishes, execution will resume to stop it
+    LOGGER.info('Yielding TelemetryFrontendClient...')
+    yield _client
+
+    LOGGER.info('Closing TelemetryFrontendClient...')
+    _client.close()
+
+    LOGGER.info('Closed TelemetryFrontendClient...')
+
+
+###########################
+# Tests Implementation of Telemetry Frontend
+###########################
+def test_start_collector(telemetryFrontend_client):
+    LOGGER.warning('test_start_collector requesting')
+    response = telemetryFrontend_client.StartCollector(create_collector_request('1'))
+    LOGGER.debug(str(response))
+    assert isinstance(response, CollectorId)
+
-- 
GitLab


From 2f8cc53e86e0502aedc78eda071159f14ec99252 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 26 Apr 2024 07:25:24 +0000
Subject: [PATCH 159/602] "# type: ignore" is added to surpass the warning
 message

---
 src/telemetry_frontend/client/TelemetryFrontendClient.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/telemetry_frontend/client/TelemetryFrontendClient.py b/src/telemetry_frontend/client/TelemetryFrontendClient.py
index a215dd408..9b4e27b36 100644
--- a/src/telemetry_frontend/client/TelemetryFrontendClient.py
+++ b/src/telemetry_frontend/client/TelemetryFrontendClient.py
@@ -48,21 +48,21 @@ class TelemetryFrontendClient:
         self.stub = None
 
     @RETRY_DECORATOR
-    def StartCollector(self, request : Collector) -> CollectorId:
+    def StartCollector(self, request : Collector) -> CollectorId: # type: ignore
         LOGGER.debug('StartCollector: {:s}'.format(grpc_message_to_json_string(request)))
         response = self.stub.StartCollector(request)
         LOGGER.debug('StartCollector result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
 
     @RETRY_DECORATOR
-    def StopCollector(self, request : CollectorId) -> Empty:
+    def StopCollector(self, request : CollectorId) -> Empty: # type: ignore
         LOGGER.debug('StopCollector: {:s}'.format(grpc_message_to_json_string(request)))
         response = self.stub.StopCollector(request)
         LOGGER.debug('StopCollector result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
 
     @RETRY_DECORATOR
-    def SelectCollectors(self, request : CollectorFilter) -> CollectorList:
+    def SelectCollectors(self, request : CollectorFilter) -> CollectorList: # type: ignore
         LOGGER.debug('SelectCollectors: {:s}'.format(grpc_message_to_json_string(request)))
         response = self.stub.SelectCollectors(request)
         LOGGER.debug('SelectCollectors result: {:s}'.format(grpc_message_to_json_string(response)))
-- 
GitLab


From 79423dca2735fe4d06b6a6c64620f7250b388a7f Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 26 Apr 2024 07:26:36 +0000
Subject: [PATCH 160/602] New imports were corrected/added

---
 src/telemetry_frontend/tests/test_unitary.py | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/telemetry_frontend/tests/test_unitary.py b/src/telemetry_frontend/tests/test_unitary.py
index c52d68921..4f37514dc 100644
--- a/src/telemetry_frontend/tests/test_unitary.py
+++ b/src/telemetry_frontend/tests/test_unitary.py
@@ -13,19 +13,22 @@
 # limitations under the License.
 
 import os
+import pytest
 import logging
+from typing import Union
 from common.Constants import ServiceNameEnum
 from common.proto.telemetry_frontend_pb2 import CollectorId
+from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server
 from context.client.ContextClient import ContextClient
-
+from common.tools.service.GenericGrpcService import GenericGrpcService
+from common.tests.MockServicerImpl_Context import MockServicerImpl_Context
+from common.Settings import ( 
+    get_service_port_grpc, get_env_var_name, ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC)
 
 from telemetry_frontend.client.TelemetryFrontendClient import TelemetryFrontendClient
 from telemetry_frontend.service.TelemetryFrontendService import TelemetryFrontendService
 from telemetry_frontend.tests.Messages import create_collector_request
 
-from common.Settings import ( 
-    get_service_port_grpc, get_env_var_name, ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC)
-
 from device.client.DeviceClient import DeviceClient
 from device.service.DeviceService import DeviceService
 from device.service.driver_api.DriverFactory import DriverFactory
-- 
GitLab


From 8a0adf79a66595af009a5d808141d4df13e6f118 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 26 Apr 2024 10:29:33 +0000
Subject: [PATCH 161/602] Added specific requirements in "telemetry_frontend"

---
 src/telemetry_frontend/requirements.in | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)
 create mode 100644 src/telemetry_frontend/requirements.in

diff --git a/src/telemetry_frontend/requirements.in b/src/telemetry_frontend/requirements.in
new file mode 100644
index 000000000..1dd24fe32
--- /dev/null
+++ b/src/telemetry_frontend/requirements.in
@@ -0,0 +1,24 @@
+# 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.
+
+anytree==2.8.0
+APScheduler==3.10.1
+influx-line-protocol==0.1.4
+psycopg2-binary==2.9.3
+python-dateutil==2.8.2
+python-json-logger==2.0.2
+pytz==2024.1
+questdb==1.0.1
+requests==2.27.1
+xmltodict==0.12.0
\ No newline at end of file
-- 
GitLab


From 7c705a70add69fde12435984a53d7911c8c12492 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 26 Apr 2024 10:30:49 +0000
Subject: [PATCH 162/602] Add "# type: ignore" to surpass warning message

---
 .../service/KpiManagerServiceServicerImpl.py           | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py
index 4ffa1d2a6..f1d370f30 100644
--- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py
+++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py
@@ -36,8 +36,8 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
   
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SetKpiDescriptor(
-            self, request: KpiDescriptor, grpc_context: grpc.ServicerContext
-        ) -> KpiId:
+            self, request: KpiDescriptor, grpc_context: grpc.ServicerContext # type: ignore
+        ) -> KpiId: # type: ignore
         response = KpiId()
         kpi_description = request.kpi_description
         kpi_sample_type = request.kpi_sample_type
@@ -58,7 +58,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
         return response
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> Empty:
+    def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> Empty: # type: ignore
         kpi_id = int(request.kpi_id.uuid)
         kpi = self.management_db.get_KPI(kpi_id)
         if kpi:
@@ -68,7 +68,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
         return Empty()
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> KpiDescriptor:
+    def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> KpiDescriptor: # type: ignore
         kpi_id = request.kpi_id.uuid
         kpi_db = self.management_db.get_KPI(int(kpi_id))
         kpiDescriptor = KpiDescriptor()
@@ -86,7 +86,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
         return kpiDescriptor
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def SelectKpiDescriptor(self, request: KpiDescriptorFilter, grpc_context: grpc.ServicerContext) -> KpiDescriptorList:
+    def SelectKpiDescriptor(self, request: KpiDescriptorFilter, grpc_context: grpc.ServicerContext) -> KpiDescriptorList: # type: ignore
         kpi_descriptor_list = KpiDescriptorList()
         data = self.management_db.get_KPIS()
         LOGGER.debug(f"data: {data}")
-- 
GitLab


From 21f0b22aca943ee14cf9d6e20ed8e32bafcd3696 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 26 Apr 2024 10:31:35 +0000
Subject: [PATCH 163/602] Adds dummy logic in "StartCollector" function

---
 .../TelemetryFrontendServiceServicerImpl.py        | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py
index 6ffb78ab1..7814107dd 100644
--- a/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py
+++ b/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py
@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import grpc
 import logging
 from monitoring.service.NameMapping import NameMapping
 from common.proto.telemetry_frontend_pb2 import CollectorId, Collector
@@ -27,12 +28,13 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer):
         LOGGER.info('Init TelemetryFrontendService')
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def StartCollector(self, request: Collector) -> CollectorId:
+    def StartCollector(self, request : Collector, grpc_context: grpc.ServicerContext # type: ignore
+        ) -> CollectorId: # type: ignore
         response = CollectorId()
-        collector_id = request.collector_id
-        collector_kpi_id = request.kpi_id
-        collector_duration = request.duration_s
-        collector_interval = request.interval_s
+        _collector_id = request.collector_id
+        # collector_kpi_id = request.kpi_id
+        # collector_duration = request.duration_s
+        # collector_interval = request.interval_s
 
-        response.collector_id.uuid = request.collector_id.uuid
+        response.collector_id.uuid = _collector_id.collector_id.uuid
         return response
\ No newline at end of file
-- 
GitLab


From 29b6cfbd1009560aa808280d35f22555889c4b4c Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 26 Apr 2024 10:33:38 +0000
Subject: [PATCH 164/602] Correction of "collector_id.uuid" and "kpi_id.uuid"
 assignments

---
 src/telemetry_frontend/tests/Messages.py | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/telemetry_frontend/tests/Messages.py b/src/telemetry_frontend/tests/Messages.py
index 86b454004..d63422b72 100644
--- a/src/telemetry_frontend/tests/Messages.py
+++ b/src/telemetry_frontend/tests/Messages.py
@@ -22,9 +22,9 @@ def collector_id():
     return _collector_id
 
 def create_collector_request(coll_id_str):
-    _create_collector_request                      = telemetry_frontend_pb2.Collector()
-    _create_collector_request.collector_id.uuid    = str(coll_id_str)
-    _create_collector_request.kpi_id.kpi_uuid.uuid = 'KPIid' + str(coll_id_str)
-    _create_collector_request.duration_s           = float(-1)
-    _create_collector_request.interval_s           = float(-1)
+    _create_collector_request                                = telemetry_frontend_pb2.Collector()
+    _create_collector_request.collector_id.collector_id.uuid = str(coll_id_str)
+    _create_collector_request.kpi_id.kpi_id.uuid             = 'KPIid' + str(coll_id_str)
+    _create_collector_request.duration_s                     = float(-1)
+    _create_collector_request.interval_s                     = float(-1)
     return _create_collector_request
-- 
GitLab


From be791afc3d372eaadb9f7e7471864e05629e2c74 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 26 Apr 2024 16:15:51 +0000
Subject: [PATCH 165/602] files name updation

---
 ...ts_locally_kpi_manager.sh => run_tests_locally-kpi_manager.sh} | 0
 ...emetry-frontend.sh => run_tests_locally-telemetry-frontend.sh} | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 rename scripts/{run_tests_locally_kpi_manager.sh => run_tests_locally-kpi_manager.sh} (100%)
 rename scripts/{run_tests_locally_telemetry-frontend.sh => run_tests_locally-telemetry-frontend.sh} (100%)

diff --git a/scripts/run_tests_locally_kpi_manager.sh b/scripts/run_tests_locally-kpi_manager.sh
similarity index 100%
rename from scripts/run_tests_locally_kpi_manager.sh
rename to scripts/run_tests_locally-kpi_manager.sh
diff --git a/scripts/run_tests_locally_telemetry-frontend.sh b/scripts/run_tests_locally-telemetry-frontend.sh
similarity index 100%
rename from scripts/run_tests_locally_telemetry-frontend.sh
rename to scripts/run_tests_locally-telemetry-frontend.sh
-- 
GitLab


From 4343146c456ecd906c0ab51154e5361fb4852a57 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 26 Apr 2024 16:16:43 +0000
Subject: [PATCH 166/602] "StopCollector" and "SelectCollector" methods are
 added

---
 .../TelemetryFrontendServiceServicerImpl.py       | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py
index 7814107dd..cb66b6b6a 100644
--- a/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py
+++ b/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py
@@ -14,8 +14,9 @@
 
 import grpc
 import logging
+from common.proto.context_pb2 import Empty
 from monitoring.service.NameMapping import NameMapping
-from common.proto.telemetry_frontend_pb2 import CollectorId, Collector
+from common.proto.telemetry_frontend_pb2 import CollectorId, Collector, CollectorFilter, CollectorList
 from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method
 from common.proto.telemetry_frontend_pb2_grpc import TelemetryFrontendServiceServicer
 
@@ -37,4 +38,16 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer):
         # collector_interval = request.interval_s
 
         response.collector_id.uuid = _collector_id.collector_id.uuid
+        return response
+    
+    @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
+    def StopCollector(self, request : CollectorId, grpc_context: grpc.ServicerContext # type: ignore
+        ) -> Empty:  # type: ignore
+
+        return Empty()
+    
+    def SelectCollectors(self, request : CollectorFilter, contextgrpc_context: grpc.ServicerContext # type: ignore
+        ) -> CollectorList:  # type: ignore
+        response = CollectorList()
+        
         return response
\ No newline at end of file
-- 
GitLab


From e2c690c1edbe07abae9531f39901c2f0cf8bbbe3 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 26 Apr 2024 16:18:30 +0000
Subject: [PATCH 167/602] "create_collector_filter" method is added in
 "Messages.py"

---
 src/telemetry_frontend/tests/Messages.py | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/telemetry_frontend/tests/Messages.py b/src/telemetry_frontend/tests/Messages.py
index d63422b72..877781b79 100644
--- a/src/telemetry_frontend/tests/Messages.py
+++ b/src/telemetry_frontend/tests/Messages.py
@@ -28,3 +28,7 @@ def create_collector_request(coll_id_str):
     _create_collector_request.duration_s                     = float(-1)
     _create_collector_request.interval_s                     = float(-1)
     return _create_collector_request
+
+def create_collector_filter(filter):
+    _create_collector_filter = telemetry_frontend_pb2.CollectorFilter()
+    
\ No newline at end of file
-- 
GitLab


From 231ab1e65b6f4b69c8c65e01b5e3be050273ec84 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Fri, 26 Apr 2024 16:19:31 +0000
Subject: [PATCH 168/602] "test_stop_collector" and "test_select_collectors"
 are added

---
 src/telemetry_frontend/tests/test_unitary.py | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/telemetry_frontend/tests/test_unitary.py b/src/telemetry_frontend/tests/test_unitary.py
index 4f37514dc..4b2594839 100644
--- a/src/telemetry_frontend/tests/test_unitary.py
+++ b/src/telemetry_frontend/tests/test_unitary.py
@@ -16,8 +16,9 @@ import os
 import pytest
 import logging
 from typing import Union
+from common.proto.context_pb2 import Empty
 from common.Constants import ServiceNameEnum
-from common.proto.telemetry_frontend_pb2 import CollectorId
+from common.proto.telemetry_frontend_pb2 import CollectorId, CollectorList
 from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server
 from context.client.ContextClient import ContextClient
 from common.tools.service.GenericGrpcService import GenericGrpcService
@@ -167,3 +168,14 @@ def test_start_collector(telemetryFrontend_client):
     LOGGER.debug(str(response))
     assert isinstance(response, CollectorId)
 
+def test_stop_collector(telemetryFrontend_client):
+    LOGGER.warning('test_stop_collector requesting')
+    response = telemetryFrontend_client.StopCollector('1')
+    LOGGER.debug(str(response))
+    assert isinstance(response, Empty)
+
+def test_select_collectors(telemetryFrontend_client):
+    LOGGER.warning('test_select_collector requesting')
+    response = telemetryFrontend_client.SelectCollectors()
+    LOGGER.debug(str(response))
+    assert isinstance(response, CollectorList)
\ No newline at end of file
-- 
GitLab


From 908b88b4da1ad7e533004d73c9ba56120fa1ad47 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Ara=C3=BAjo?= 
Date: Mon, 11 Dec 2023 17:03:55 +0000
Subject: [PATCH 169/602] HPA in services

HPA in webui service
---
 manifests/deviceservice.yaml     | 35 ++++++++++++++++++++++++--------
 manifests/monitoringservice.yaml | 35 ++++++++++++++++++++++++--------
 manifests/webuiservice.yaml      | 35 ++++++++++++++++++++++++++------
 3 files changed, 83 insertions(+), 22 deletions(-)

diff --git a/manifests/deviceservice.yaml b/manifests/deviceservice.yaml
index e49ba2399..bf599d0b4 100644
--- a/manifests/deviceservice.yaml
+++ b/manifests/deviceservice.yaml
@@ -70,11 +70,30 @@ spec:
   selector:
     app: deviceservice
   ports:
-    - name: grpc
-      protocol: TCP
-      port: 2020
-      targetPort: 2020
-    - name: metrics
-      protocol: TCP
-      port: 9192
-      targetPort: 9192
+  - name: grpc
+    protocol: TCP
+    port: 2020
+    targetPort: 2020
+  - name: metrics
+    protocol: TCP
+    port: 9192
+    targetPort: 9192
+---
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+  name: deviceservice-hpa
+spec:
+  scaleTargetRef:
+    apiVersion: apps/v1
+    kind: Deployment
+    name: deviceservice
+  minReplicas: 1
+  maxReplicas: 10
+  metrics:
+  - type: Resource
+    resource:
+      name: cpu
+      target:
+        type: Utilization
+        averageUtilization: 80
diff --git a/manifests/monitoringservice.yaml b/manifests/monitoringservice.yaml
index 1540db0a1..4058436e5 100644
--- a/manifests/monitoringservice.yaml
+++ b/manifests/monitoringservice.yaml
@@ -65,11 +65,30 @@ spec:
   selector:
     app: monitoringservice
   ports:
-    - name: grpc
-      protocol: TCP
-      port: 7070
-      targetPort: 7070
-    - name: metrics
-      protocol: TCP
-      port: 9192
-      targetPort: 9192
+  - name: grpc
+    protocol: TCP
+    port: 7070
+    targetPort: 7070
+  - name: metrics
+    protocol: TCP
+    port: 9192
+    targetPort: 9192
+---
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+  name: monitoringservice-hpa
+spec:
+  scaleTargetRef:
+    apiVersion: apps/v1
+    kind: Deployment
+    name: monitoringservice
+  minReplicas: 1
+  maxReplicas: 10
+  metrics:
+  - type: Resource
+    resource:
+      name: cpu
+      target:
+        type: Utilization
+        averageUtilization: 80
diff --git a/manifests/webuiservice.yaml b/manifests/webuiservice.yaml
index a519aa4a2..58e1a65a0 100644
--- a/manifests/webuiservice.yaml
+++ b/manifests/webuiservice.yaml
@@ -111,9 +111,32 @@ spec:
   selector:
     app: webuiservice
   ports:
-    - name: webui
-      port: 8004
-      targetPort: 8004
-    - name: grafana
-      port: 3000
-      targetPort: 3000
+  - name: webui
+    port: 8004
+    targetPort: 8004
+  - name: grafana
+    port: 3000
+    targetPort: 3000
+# TESTING
+---
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+  name: webuiservice-hpa
+spec:
+  scaleTargetRef:
+    apiVersion: apps/v1
+    kind: Deployment
+    name: webuiservice
+  minReplicas: 1
+  maxReplicas: 20
+  metrics:
+  - type: Resource
+    resource:
+      name: cpu
+      target:
+        type: Utilization
+        averageUtilization: 50
+  #behavior:
+  #  scaleDown:
+  #    stabilizationWindowSeconds: 30
-- 
GitLab


From 503a17bd49c8a2052915f2a6b59565ae7e2af241 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Ara=C3=BAjo?= 
Date: Wed, 22 Nov 2023 15:54:26 +0000
Subject: [PATCH 170/602] Added rate limiting to ingress controller

---
 manifests/nginx_ingress_http.yaml | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/manifests/nginx_ingress_http.yaml b/manifests/nginx_ingress_http.yaml
index 0892f0c9b..210848fa9 100644
--- a/manifests/nginx_ingress_http.yaml
+++ b/manifests/nginx_ingress_http.yaml
@@ -18,6 +18,11 @@ metadata:
   name: tfs-ingress
   annotations:
     nginx.ingress.kubernetes.io/rewrite-target: /$2
+    nginx.ingress.kubernetes.io/limit-rps: '2'
+    nginx.ingress.kubernetes.io/limit-connections: '5'
+    nginx.ingress.kubernetes.io/proxy-connect-timeout: '10'
+    nginx.ingress.kubernetes.io/proxy-send-timeout: '10'
+    nginx.ingress.kubernetes.io/proxy-read-timeout: '10'
 spec:
   rules:
     - http:
-- 
GitLab


From 14de559fbbbacad009f4d2688b53b4d1c5270847 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Ara=C3=BAjo?= 
Date: Fri, 2 Feb 2024 13:52:55 +0000
Subject: [PATCH 171/602] NGINX and redeployall

default variables set

code refactoring

NATS cluster complete

Startup Probe failling in NATS cluster mode

Cockroach cluster operator and NATS cluster mode

Update

Update scheduling policy for CRDB

NATS cluster mode

Testing CRDB cluster with node affinity

Revert "Testing dynamic node resources"

This reverts commit 856eb4799d2136697c721b387e6fca9fdcdbf5fd.

Testing dynamic node resources

NGINX and redeployall

Update my_deploy.sh

Update nginx_ingress_http.yaml

Redeploy all fixed

Add redeploy all feature
---
 deploy/all.sh                       |  14 ++++
 deploy/crdb.sh                      |  11 ++-
 deploy/nats.sh                      | 119 ++++++++++++++++++++++++++--
 deploy/qdb.sh                       |   6 +-
 manifests/cockroachdb/cluster.yaml  |  36 ++++-----
 manifests/cockroachdb/operator.yaml |   2 +
 manifests/nats/cluster.yaml         |  34 ++++++++
 manifests/nginx_ingress_http.yaml   |   4 +-
 my_deploy.sh                        |  12 ++-
 9 files changed, 204 insertions(+), 34 deletions(-)
 create mode 100644 manifests/nats/cluster.yaml

diff --git a/deploy/all.sh b/deploy/all.sh
index c169bc92c..204bbcfe2 100755
--- a/deploy/all.sh
+++ b/deploy/all.sh
@@ -18,6 +18,11 @@
 # Read deployment settings
 ########################################################################################################################
 
+# ----- Redeploy All ------------------------------------------------------------
+
+# If not already set, enables all components redeployment
+export REDEPLOYALL=${REDEPLOYALL:-""}
+
 
 # ----- TeraFlowSDN ------------------------------------------------------------
 
@@ -102,6 +107,15 @@ export NATS_EXT_PORT_CLIENT=${NATS_EXT_PORT_CLIENT:-"4222"}
 # If not already set, set the external port NATS HTTP Mgmt GUI interface will be exposed to.
 export NATS_EXT_PORT_HTTP=${NATS_EXT_PORT_HTTP:-"8222"}
 
+# TESTING
+# If not already set, set NATS installation mode. Accepted values are: 'single' and 'cluster'.
+# - If NATS_DEPLOY_MODE is "single", NATS is deployed in single node mode. It is convenient for
+#   development and testing purposes and should fit in a VM. IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS.
+# - If NATS_DEPLOY_MODE is "cluster", NATS is deployed in cluster mode, and an entire NATS cluster
+#   with 3 replicas (set by default) will be deployed. It is convenient for production and
+#   provides scalability features.
+export NATS_DEPLOY_MODE=${NATS_DEPLOY_MODE:-"single"}
+
 # If not already set, disable flag for re-deploying NATS from scratch.
 # WARNING: ACTIVATING THIS FLAG IMPLIES LOOSING THE MESSAGE BROKER INFORMATION!
 # If NATS_REDEPLOY is "YES", the message broker will be dropped while checking/deploying NATS.
diff --git a/deploy/crdb.sh b/deploy/crdb.sh
index c979ad4f2..6412d1316 100755
--- a/deploy/crdb.sh
+++ b/deploy/crdb.sh
@@ -18,6 +18,11 @@
 # Read deployment settings
 ########################################################################################################################
 
+# ----- Redeploy All ------------------------------------------------------------
+# If not already set, enables all components redeployment
+export REDEPLOYALL=${REDEPLOYALL:-""}
+
+
 # If not already set, set the namespace where CockroackDB will be deployed.
 export CRDB_NAMESPACE=${CRDB_NAMESPACE:-"crdb"}
 
@@ -223,7 +228,7 @@ function crdb_deploy_cluster() {
     kubectl create namespace ${CRDB_NAMESPACE}
     echo
 
-    echo "CockroachDB"
+    echo "CockroachDB (cluster-mode)"
     echo ">>> Checking if CockroachDB is deployed..."
     if kubectl get --namespace ${CRDB_NAMESPACE} statefulset/cockroachdb &> /dev/null; then
         echo ">>> CockroachDB is present; skipping step."
@@ -360,7 +365,7 @@ function crdb_drop_database_cluster() {
 }
 
 if [ "$CRDB_DEPLOY_MODE" == "single" ]; then
-    if [ "$CRDB_REDEPLOY" == "YES" ]; then
+    if [ "$CRDB_REDEPLOY" == "YES" ] || [ "$REDEPLOYALL" == "YES" ]; then
         crdb_undeploy_single
     fi
 
@@ -370,7 +375,7 @@ if [ "$CRDB_DEPLOY_MODE" == "single" ]; then
         crdb_drop_database_single
     fi
 elif [ "$CRDB_DEPLOY_MODE" == "cluster" ]; then
-    if [ "$CRDB_REDEPLOY" == "YES" ]; then
+    if [ "$CRDB_REDEPLOY" == "YES" ] || [ "$REDEPLOYALL" == "YES" ]; then
         crdb_undeploy_cluster
     fi
 
diff --git a/deploy/nats.sh b/deploy/nats.sh
index 366270a69..9cc11ca8b 100755
--- a/deploy/nats.sh
+++ b/deploy/nats.sh
@@ -18,6 +18,10 @@
 # Read deployment settings
 ########################################################################################################################
 
+# ----- Redeploy All ------------------------------------------------------------
+# If not already set, enables all components redeployment
+export REDEPLOYALL=${REDEPLOYALL:-""}
+
 # If not already set, set the namespace where NATS will be deployed.
 export NATS_NAMESPACE=${NATS_NAMESPACE:-"nats"}
 
@@ -27,16 +31,32 @@ export NATS_EXT_PORT_CLIENT=${NATS_EXT_PORT_CLIENT:-"4222"}
 # If not already set, set the external port NATS HTTP Mgmt GUI interface will be exposed to.
 export NATS_EXT_PORT_HTTP=${NATS_EXT_PORT_HTTP:-"8222"}
 
+# TESTING
+# If not already set, set NATS installation mode. Accepted values are: 'single' and 'cluster'.
+# - If NATS_DEPLOY_MODE is "single", NATS is deployed in single node mode. It is convenient for
+#   development and testing purposes and should fit in a VM. IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS.
+# - If NATS_DEPLOY_MODE is "cluster", NATS is deployed in cluster mode, and an entire NATS cluster
+#   with 3 replicas (set by default) will be deployed. It is convenient for production and
+#   provides scalability features.
+export NATS_DEPLOY_MODE=${NATS_DEPLOY_MODE:-"single"}
+
 # If not already set, disable flag for re-deploying NATS from scratch.
 # WARNING: ACTIVATING THIS FLAG IMPLIES LOOSING THE MESSAGE BROKER INFORMATION!
 # If NATS_REDEPLOY is "YES", the message broker will be dropped while checking/deploying NATS.
 export NATS_REDEPLOY=${NATS_REDEPLOY:-""}
 
-
 ########################################################################################################################
 # Automated steps start here
 ########################################################################################################################
 
+# Constants
+TMP_FOLDER="./tmp"
+NATS_MANIFESTS_PATH="manifests/nats"
+
+# Create a tmp folder for files modified during the deployment
+TMP_MANIFESTS_FOLDER="${TMP_FOLDER}/${NATS_NAMESPACE}/manifests"
+mkdir -p $TMP_MANIFESTS_FOLDER
+
 function nats_deploy_single() {
     echo "NATS Namespace"
     echo ">>> Create NATS Namespace (if missing)"
@@ -47,18 +67,85 @@ function nats_deploy_single() {
     helm3 repo add nats https://nats-io.github.io/k8s/helm/charts/
     echo
 
+    echo "Install NATS (single-node)"
+    echo ">>> Checking if NATS is deployed..."
+    if kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; then
+        echo ">>> NATS is present; skipping step."
+    else
+        echo ">>> Deploy NATS"
+        helm3 install ${NATS_NAMESPACE} nats/nats --namespace ${NATS_NAMESPACE} --set nats.image=nats:2.9-alpine
+
+        echo ">>> Waiting NATS statefulset to be created..."
+        while ! kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; do
+            printf "%c" "."
+            sleep 1
+        done
+
+        # Wait for statefulset condition "Available=True" does not work
+        # Wait for statefulset condition "jsonpath='{.status.readyReplicas}'=3" throws error:
+        #   "error: readyReplicas is not found"
+        # Workaround: Check the pods are ready
+        #echo ">>> NATS statefulset created. Waiting for readiness condition..."
+        #kubectl wait --namespace  ${NATS_NAMESPACE} --for=condition=Available=True --timeout=300s statefulset/nats
+        #kubectl wait --namespace ${NATS_NAMESPACE} --for=jsonpath='{.status.readyReplicas}'=3 --timeout=300s \
+        #    statefulset/nats
+        echo ">>> NATS statefulset created. Waiting NATS pods to be created..."
+        while ! kubectl get --namespace ${NATS_NAMESPACE} pod/${NATS_NAMESPACE}-0 &> /dev/null; do
+            printf "%c" "."
+            sleep 1
+        done
+        kubectl wait --namespace ${NATS_NAMESPACE} --for=condition=Ready --timeout=300s pod/${NATS_NAMESPACE}-0
+    fi
+    echo
+
+    echo "NATS Port Mapping"
+    echo ">>> Expose NATS Client port (4222->${NATS_EXT_PORT_CLIENT})"
+    NATS_PORT_CLIENT=$(kubectl --namespace ${NATS_NAMESPACE} get service ${NATS_NAMESPACE} -o 'jsonpath={.spec.ports[?(@.name=="client")].port}')
+    PATCH='{"data": {"'${NATS_EXT_PORT_CLIENT}'": "'${NATS_NAMESPACE}'/'${NATS_NAMESPACE}':'${NATS_PORT_CLIENT}'"}}'
+    kubectl patch configmap nginx-ingress-tcp-microk8s-conf --namespace ingress --patch "${PATCH}"
+
+    PORT_MAP='{"containerPort": '${NATS_EXT_PORT_CLIENT}', "hostPort": '${NATS_EXT_PORT_CLIENT}'}'
+    CONTAINER='{"name": "nginx-ingress-microk8s", "ports": ['${PORT_MAP}']}'
+    PATCH='{"spec": {"template": {"spec": {"containers": ['${CONTAINER}']}}}}'
+    kubectl patch daemonset nginx-ingress-microk8s-controller --namespace ingress --patch "${PATCH}"
+    echo
+
+    echo ">>> Expose NATS HTTP Mgmt GUI port (8222->${NATS_EXT_PORT_HTTP})"
+    NATS_PORT_HTTP=$(kubectl --namespace ${NATS_NAMESPACE} get service ${NATS_NAMESPACE} -o 'jsonpath={.spec.ports[?(@.name=="monitor")].port}')
+    PATCH='{"data": {"'${NATS_EXT_PORT_HTTP}'": "'${NATS_NAMESPACE}'/'${NATS_NAMESPACE}':'${NATS_PORT_HTTP}'"}}'
+    kubectl patch configmap nginx-ingress-tcp-microk8s-conf --namespace ingress --patch "${PATCH}"
+
+    PORT_MAP='{"containerPort": '${NATS_EXT_PORT_HTTP}', "hostPort": '${NATS_EXT_PORT_HTTP}'}'
+    CONTAINER='{"name": "nginx-ingress-microk8s", "ports": ['${PORT_MAP}']}'
+    PATCH='{"spec": {"template": {"spec": {"containers": ['${CONTAINER}']}}}}'
+    kubectl patch daemonset nginx-ingress-microk8s-controller --namespace ingress --patch "${PATCH}"
+    echo
+}
+
+
+function nats_deploy_cluster() {
+    echo "NATS Namespace"
+    echo ">>> Create NATS Namespace (if missing)"
+    kubectl create namespace ${NATS_NAMESPACE}
+    echo
+
+    echo "Add NATS Helm Chart"
+    helm3 repo add nats https://nats-io.github.io/k8s/helm/charts/
+    echo
+
     echo "Upgrade NATS Helm Chart"
     helm3 repo update nats
     echo
 
-    echo "Install NATS (single-node)"
+    echo "Install NATS (cluster-mode)"
     echo ">>> Checking if NATS is deployed..."
     if kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; then
         echo ">>> NATS is present; skipping step."
     else
         echo ">>> Deploy NATS"
-        helm3 install ${NATS_NAMESPACE} nats/nats --namespace ${NATS_NAMESPACE} --set nats.image=nats:2.9-alpine
-
+        cp "${NATS_MANIFESTS_PATH}/cluster.yaml" "${TMP_MANIFESTS_FOLDER}/nats_cluster.yaml"
+        helm3 install ${NATS_NAMESPACE} nats/nats --namespace ${NATS_NAMESPACE} -f "${TMP_MANIFESTS_FOLDER}/nats_cluster.yaml"
+    
         echo ">>> Waiting NATS statefulset to be created..."
         while ! kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; do
             printf "%c" "."
@@ -78,7 +165,17 @@ function nats_deploy_single() {
             printf "%c" "."
             sleep 1
         done
+        while ! kubectl get --namespace ${NATS_NAMESPACE} pod/${NATS_NAMESPACE}-1 &> /dev/null; do
+            printf "%c" "."
+            sleep 1
+        done
+        while ! kubectl get --namespace ${NATS_NAMESPACE} pod/${NATS_NAMESPACE}-2 &> /dev/null; do
+            printf "%c" "."
+            sleep 1
+        done
         kubectl wait --namespace ${NATS_NAMESPACE} --for=condition=Ready --timeout=300s pod/${NATS_NAMESPACE}-0
+        kubectl wait --namespace ${NATS_NAMESPACE} --for=condition=Ready --timeout=300s pod/${NATS_NAMESPACE}-1
+        kubectl wait --namespace ${NATS_NAMESPACE} --for=condition=Ready --timeout=300s pod/${NATS_NAMESPACE}-2
     fi
     echo
 
@@ -110,7 +207,7 @@ function nats_deploy_single() {
     echo
 }
 
-function nats_undeploy_single() {
+function nats_undeploy() {
     echo "NATS"
     echo ">>> Checking if NATS is deployed..."
     if kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; then
@@ -127,8 +224,14 @@ function nats_undeploy_single() {
     echo
 }
 
-if [ "$NATS_REDEPLOY" == "YES" ]; then
-    nats_undeploy_single
+if [ "$NATS_REDEPLOY" == "YES" ] || [ "$REDEPLOYALL" == "YES" ]; then
+    nats_undeploy
 fi
 
-nats_deploy_single
+if [ "$NATS_DEPLOY_MODE" == "single" ]; then
+    nats_deploy_single
+elif [ "$NATS_DEPLOY_MODE" == "cluster" ]; then
+    nats_deploy_cluster
+else
+    echo "Unsupported value: NATS_DEPLOY_MODE=$NATS_DEPLOY_MODE"
+fi
\ No newline at end of file
diff --git a/deploy/qdb.sh b/deploy/qdb.sh
index acbcfd4f9..513ef9ae0 100755
--- a/deploy/qdb.sh
+++ b/deploy/qdb.sh
@@ -18,6 +18,10 @@
 # Read deployment settings
 ########################################################################################################################
 
+# ----- Redeploy All ------------------------------------------------------------
+# If not already set, enables all components redeployment
+export REDEPLOYALL=${REDEPLOYALL:-""}
+
 # If not already set, set the namespace where QuestDB will be deployed.
 export QDB_NAMESPACE=${QDB_NAMESPACE:-"qdb"}
 
@@ -177,7 +181,7 @@ function qdb_drop_tables() {
     echo
 }
 
-if [ "$QDB_REDEPLOY" == "YES" ]; then
+if [ "$QDB_REDEPLOY" == "YES" ] || [ "$REDEPLOYALL" == "YES" ]; then
     qdb_undeploy
 fi
 
diff --git a/manifests/cockroachdb/cluster.yaml b/manifests/cockroachdb/cluster.yaml
index 4d9ef0f84..73875ca3f 100644
--- a/manifests/cockroachdb/cluster.yaml
+++ b/manifests/cockroachdb/cluster.yaml
@@ -33,14 +33,16 @@ spec:
   resources:
     requests:
       # This is intentionally low to make it work on local k3d clusters.
-      cpu: 4
-      memory: 4Gi
+      # TESTING
+      cpu: 1 #4
+      memory: 500Mi #4Gi
     limits:
-      cpu: 8
-      memory: 8Gi
+      # TESTING
+      cpu: 1 #8
+      memory: 1Gi #8Gi
   tlsEnabled: true
-# You can set either a version of the db or a specific image name
-# cockroachDBVersion: v22.2.8
+  # You can set either a version of the db or a specific image name
+  # cockroachDBVersion: v22.2.8
   image:
     name: cockroachdb/cockroach:v22.2.8
   # nodes refers to the number of crdb pods that are created
@@ -49,21 +51,17 @@ spec:
   additionalLabels:
     crdb: is-cool
   # affinity is a new API field that is behind a feature gate that is
-  # disabled by default.  To enable please see the operator.yaml file.
+  # disabled by default. To enable please see the operator.yaml file.
 
   # The affinity field will accept any podSpec affinity rule.
-  # affinity:
-  #   podAntiAffinity:
-  #      preferredDuringSchedulingIgnoredDuringExecution:
-  #      - weight: 100
-  #        podAffinityTerm:
-  #          labelSelector:
-  #            matchExpressions:
-  #            - key: app.kubernetes.io/instance
-  #              operator: In
-  #              values:
-  #              - cockroachdb
-  #          topologyKey: kubernetes.io/hostname
+  # TESTING: Force one pod per node, if possible
+  topologySpreadConstraints:
+  - maxSkew: 1
+    topologyKey: kubernetes.io/hostname  
+    whenUnsatisfiable: ScheduleAnyway
+    labelSelector:
+      matchLabels:
+        app.kubernetes.io/instance: cockroachdb
 
   # nodeSelectors used to match against
   # nodeSelector:
diff --git a/manifests/cockroachdb/operator.yaml b/manifests/cockroachdb/operator.yaml
index 59d515061..0d578410c 100644
--- a/manifests/cockroachdb/operator.yaml
+++ b/manifests/cockroachdb/operator.yaml
@@ -381,6 +381,8 @@ spec:
     spec:
       containers:
       - args:
+        # TESTING
+        - -feature-gates=TolerationRules=true,AffinityRules=true,TopologySpreadRules=true
         - -zap-log-level
         - info
         env:
diff --git a/manifests/nats/cluster.yaml b/manifests/nats/cluster.yaml
new file mode 100644
index 000000000..39e41958f
--- /dev/null
+++ b/manifests/nats/cluster.yaml
@@ -0,0 +1,34 @@
+container:
+  image:
+    tags: 2.9-alpine
+  env:
+    # different from k8s units, suffix must be B, KiB, MiB, GiB, or TiB
+    # should be ~90% of memory limit
+    GOMEMLIMIT: 400MiB
+  merge:
+    # recommended limit is at least 2 CPU cores and 8Gi Memory for production JetStream clusters
+    resources:
+      requests:
+        cpu: 1 # 2
+        memory: 500Mi # 4Gi
+      limits:
+        cpu: 1 # 4
+        memory: 1Gi # 8Gi 
+
+config:
+  cluster:
+    enabled: true
+    replicas: 3
+  jetstream:
+    enabled: true
+    fileStore:
+      pvc:
+        size: 4Gi
+    
+# Force one pod per node, if possible
+podTemplate:
+  topologySpreadConstraints:
+    kubernetes.io/hostname:
+      maxSkew: 1
+      whenUnsatisfiable: ScheduleAnyway
+      
\ No newline at end of file
diff --git a/manifests/nginx_ingress_http.yaml b/manifests/nginx_ingress_http.yaml
index 210848fa9..cb400ee7d 100644
--- a/manifests/nginx_ingress_http.yaml
+++ b/manifests/nginx_ingress_http.yaml
@@ -18,8 +18,8 @@ metadata:
   name: tfs-ingress
   annotations:
     nginx.ingress.kubernetes.io/rewrite-target: /$2
-    nginx.ingress.kubernetes.io/limit-rps: '2'
-    nginx.ingress.kubernetes.io/limit-connections: '5'
+    nginx.ingress.kubernetes.io/limit-rps: '5'
+    nginx.ingress.kubernetes.io/limit-connections: '10'
     nginx.ingress.kubernetes.io/proxy-connect-timeout: '10'
     nginx.ingress.kubernetes.io/proxy-send-timeout: '10'
     nginx.ingress.kubernetes.io/proxy-read-timeout: '10'
diff --git a/my_deploy.sh b/my_deploy.sh
index 8417f6eae..0b7a259de 100755
--- a/my_deploy.sh
+++ b/my_deploy.sh
@@ -13,6 +13,11 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+# ----- Redeploy All ------------------------------------------------------------
+
+# If not already set, enables all components redeployment
+export REDEPLOYALL=""
+
 
 # ----- TeraFlowSDN ------------------------------------------------------------
 
@@ -103,7 +108,7 @@ export CRDB_DATABASE="tfs"
 
 # Set CockroachDB installation mode to 'single'. This option is convenient for development and testing.
 # See ./deploy/all.sh or ./deploy/crdb.sh for additional details
-export CRDB_DEPLOY_MODE="single"
+export CRDB_DEPLOY_MODE="cluster"
 
 # Disable flag for dropping database, if it exists.
 export CRDB_DROP_DATABASE_IF_EXISTS=""
@@ -123,6 +128,11 @@ export NATS_EXT_PORT_CLIENT="4222"
 # Set the external port NATS HTTP Mgmt GUI interface will be exposed to.
 export NATS_EXT_PORT_HTTP="8222"
 
+# TESTING
+# Set NATS installation mode to 'single'. This option is convenient for development and testing.
+# See ./deploy/all.sh or ./deploy/nats.sh for additional details
+export NATS_DEPLOY_MODE="single"
+
 # Disable flag for re-deploying NATS from scratch.
 export NATS_REDEPLOY=""
 
-- 
GitLab


From f9f0d2823708c7f18c76c503ea0bd792800493d2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Ara=C3=BAjo?= 
Date: Wed, 31 Jan 2024 16:29:09 +0000
Subject: [PATCH 172/602] CRDB and NATS cluter mode

Restore default values
---
 deploy/all.sh                       |  1 -
 deploy/nats.sh                      |  4 ++--
 manifests/cockroachdb/cluster.yaml  | 11 ++++-------
 manifests/cockroachdb/operator.yaml |  1 -
 manifests/nats/cluster.yaml         |  8 ++++----
 manifests/webuiservice.yaml         |  1 -
 my_deploy.sh                        |  3 +--
 7 files changed, 11 insertions(+), 18 deletions(-)

diff --git a/deploy/all.sh b/deploy/all.sh
index 204bbcfe2..c5d423a2f 100755
--- a/deploy/all.sh
+++ b/deploy/all.sh
@@ -107,7 +107,6 @@ export NATS_EXT_PORT_CLIENT=${NATS_EXT_PORT_CLIENT:-"4222"}
 # If not already set, set the external port NATS HTTP Mgmt GUI interface will be exposed to.
 export NATS_EXT_PORT_HTTP=${NATS_EXT_PORT_HTTP:-"8222"}
 
-# TESTING
 # If not already set, set NATS installation mode. Accepted values are: 'single' and 'cluster'.
 # - If NATS_DEPLOY_MODE is "single", NATS is deployed in single node mode. It is convenient for
 #   development and testing purposes and should fit in a VM. IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS.
diff --git a/deploy/nats.sh b/deploy/nats.sh
index 9cc11ca8b..57fda629c 100755
--- a/deploy/nats.sh
+++ b/deploy/nats.sh
@@ -31,7 +31,6 @@ export NATS_EXT_PORT_CLIENT=${NATS_EXT_PORT_CLIENT:-"4222"}
 # If not already set, set the external port NATS HTTP Mgmt GUI interface will be exposed to.
 export NATS_EXT_PORT_HTTP=${NATS_EXT_PORT_HTTP:-"8222"}
 
-# TESTING
 # If not already set, set NATS installation mode. Accepted values are: 'single' and 'cluster'.
 # - If NATS_DEPLOY_MODE is "single", NATS is deployed in single node mode. It is convenient for
 #   development and testing purposes and should fit in a VM. IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS.
@@ -73,7 +72,8 @@ function nats_deploy_single() {
         echo ">>> NATS is present; skipping step."
     else
         echo ">>> Deploy NATS"
-        helm3 install ${NATS_NAMESPACE} nats/nats --namespace ${NATS_NAMESPACE} --set nats.image=nats:2.9-alpine
+        helm3 install ${NATS_NAMESPACE} nats/nats --namespace ${NATS_NAMESPACE} --set nats.image=nats:2.9-alpine --set config.cluster.enabled=true --set config.cluster.tls.enabled=true
+
 
         echo ">>> Waiting NATS statefulset to be created..."
         while ! kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; do
diff --git a/manifests/cockroachdb/cluster.yaml b/manifests/cockroachdb/cluster.yaml
index 73875ca3f..bcb0c7049 100644
--- a/manifests/cockroachdb/cluster.yaml
+++ b/manifests/cockroachdb/cluster.yaml
@@ -33,13 +33,11 @@ spec:
   resources:
     requests:
       # This is intentionally low to make it work on local k3d clusters.
-      # TESTING
-      cpu: 1 #4
-      memory: 500Mi #4Gi
+      cpu: 4
+      memory: 4Gi
     limits:
-      # TESTING
-      cpu: 1 #8
-      memory: 1Gi #8Gi
+      cpu: 8
+      memory: 8Gi
   tlsEnabled: true
   # You can set either a version of the db or a specific image name
   # cockroachDBVersion: v22.2.8
@@ -54,7 +52,6 @@ spec:
   # disabled by default. To enable please see the operator.yaml file.
 
   # The affinity field will accept any podSpec affinity rule.
-  # TESTING: Force one pod per node, if possible
   topologySpreadConstraints:
   - maxSkew: 1
     topologyKey: kubernetes.io/hostname  
diff --git a/manifests/cockroachdb/operator.yaml b/manifests/cockroachdb/operator.yaml
index 0d578410c..d8e691308 100644
--- a/manifests/cockroachdb/operator.yaml
+++ b/manifests/cockroachdb/operator.yaml
@@ -381,7 +381,6 @@ spec:
     spec:
       containers:
       - args:
-        # TESTING
         - -feature-gates=TolerationRules=true,AffinityRules=true,TopologySpreadRules=true
         - -zap-log-level
         - info
diff --git a/manifests/nats/cluster.yaml b/manifests/nats/cluster.yaml
index 39e41958f..491c86628 100644
--- a/manifests/nats/cluster.yaml
+++ b/manifests/nats/cluster.yaml
@@ -9,11 +9,11 @@ container:
     # recommended limit is at least 2 CPU cores and 8Gi Memory for production JetStream clusters
     resources:
       requests:
-        cpu: 1 # 2
-        memory: 500Mi # 4Gi
+        cpu: 1
+        memory: 500Mi
       limits:
-        cpu: 1 # 4
-        memory: 1Gi # 8Gi 
+        cpu: 1
+        memory: 1Gi
 
 config:
   cluster:
diff --git a/manifests/webuiservice.yaml b/manifests/webuiservice.yaml
index 58e1a65a0..132839edd 100644
--- a/manifests/webuiservice.yaml
+++ b/manifests/webuiservice.yaml
@@ -117,7 +117,6 @@ spec:
   - name: grafana
     port: 3000
     targetPort: 3000
-# TESTING
 ---
 apiVersion: autoscaling/v2
 kind: HorizontalPodAutoscaler
diff --git a/my_deploy.sh b/my_deploy.sh
index 0b7a259de..991c21e71 100755
--- a/my_deploy.sh
+++ b/my_deploy.sh
@@ -108,7 +108,7 @@ export CRDB_DATABASE="tfs"
 
 # Set CockroachDB installation mode to 'single'. This option is convenient for development and testing.
 # See ./deploy/all.sh or ./deploy/crdb.sh for additional details
-export CRDB_DEPLOY_MODE="cluster"
+export CRDB_DEPLOY_MODE="single"
 
 # Disable flag for dropping database, if it exists.
 export CRDB_DROP_DATABASE_IF_EXISTS=""
@@ -128,7 +128,6 @@ export NATS_EXT_PORT_CLIENT="4222"
 # Set the external port NATS HTTP Mgmt GUI interface will be exposed to.
 export NATS_EXT_PORT_HTTP="8222"
 
-# TESTING
 # Set NATS installation mode to 'single'. This option is convenient for development and testing.
 # See ./deploy/all.sh or ./deploy/nats.sh for additional details
 export NATS_DEPLOY_MODE="single"
-- 
GitLab


From 610f10e79f4d22d927239994e916ace3d61f8b9a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Ara=C3=BAjo?= 
Date: Wed, 24 Apr 2024 15:46:39 +0100
Subject: [PATCH 173/602] Container lab fixed

---
 hackfest/containerlab/srl1.cli              | 14 ++++++++++++++
 hackfest/containerlab/srl2.cli              | 14 ++++++++++++++
 hackfest/containerlab/tfs-scenario.clab.yml | 12 +++++++++---
 3 files changed, 37 insertions(+), 3 deletions(-)
 create mode 100644 hackfest/containerlab/srl1.cli
 create mode 100644 hackfest/containerlab/srl2.cli

diff --git a/hackfest/containerlab/srl1.cli b/hackfest/containerlab/srl1.cli
new file mode 100644
index 000000000..fd7144ca7
--- /dev/null
+++ b/hackfest/containerlab/srl1.cli
@@ -0,0 +1,14 @@
+set / interface ethernet-1/2 admin-state enable
+set / interface ethernet-1/2 subinterface 0 admin-state enable
+set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.1.1/24
+
+set / interface ethernet-1/1 admin-state enable
+set / interface ethernet-1/1 subinterface 0 admin-state enable
+set / interface ethernet-1/1 subinterface 0 ipv4 address 172.0.0.1/30
+
+set / network-instance default
+set / network-instance default interface ethernet-1/1.0
+set / network-instance default interface ethernet-1/2.0
+
+set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.2 admin-state enable
+set / network-instance default static-routes route 172.16.2.0/24 next-hop-group group1 admin-state enable
\ No newline at end of file
diff --git a/hackfest/containerlab/srl2.cli b/hackfest/containerlab/srl2.cli
new file mode 100644
index 000000000..395d53c71
--- /dev/null
+++ b/hackfest/containerlab/srl2.cli
@@ -0,0 +1,14 @@
+set / interface ethernet-1/2 admin-state enable
+set / interface ethernet-1/2 subinterface 0 admin-state enable
+set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.2.1/24
+
+set / interface ethernet-1/1 admin-state enable
+set / interface ethernet-1/1 subinterface 0 admin-state enable
+set / interface ethernet-1/1 subinterface 0 ipv4 address 172.0.0.2/30
+
+set / network-instance default
+set / network-instance default interface ethernet-1/1.0
+set / network-instance default interface ethernet-1/2.0
+
+set /network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.1 admin-state enable
+set /network-instance default static-routes route 172.16.1.0/24 next-hop-group group1 admin-state enable
\ No newline at end of file
diff --git a/hackfest/containerlab/tfs-scenario.clab.yml b/hackfest/containerlab/tfs-scenario.clab.yml
index f79378757..91467d2b9 100644
--- a/hackfest/containerlab/tfs-scenario.clab.yml
+++ b/hackfest/containerlab/tfs-scenario.clab.yml
@@ -24,7 +24,7 @@ mgmt:
 topology:
   kinds:
     srl:
-      image: ghcr.io/nokia/srlinux:23.3.1
+      image: ghcr.io/nokia/srlinux:21.11.3
     linux:
       image: ghcr.io/hellt/network-multitool
   nodes:
@@ -34,24 +34,30 @@ topology:
       cpu: 0.5
       memory: 1GB
       mgmt-ipv4: 172.100.100.101
-      #startup-config: srl1.cli
+      startup-config: ./srl1.cli
     srl2:
       kind: srl
       type: ixr6
       cpu: 0.5
       memory: 1GB
       mgmt-ipv4: 172.100.100.102
-      #startup-config: srl2.cli
+      startup-config: ./srl2.cli
     client1:
       kind: linux
       cpu: 0.1
       memory: 100MB
       mgmt-ipv4: 172.100.100.201
+      exec:
+        - ip address add 172.16.1.10/24 dev eth1
+        - ip route add 172.16.2.0/24 via 172.16.1.1
     client2:
       kind: linux
       cpu: 0.1
       memory: 100MB
       mgmt-ipv4: 172.100.100.202
+      exec:
+        - ip address add 172.16.2.10/24 dev eth1
+        - ip route add 172.16.1.0/24 via 172.16.2.1
 
   links:
     - endpoints: ["srl1:e1-1", "srl2:e1-1"]
-- 
GitLab


From 269da2e96f88e271fc255375923f437ba7a6342c Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Mon, 29 Apr 2024 12:36:22 +0000
Subject: [PATCH 174/602] dummy logic is added in "SopCollector" method

---
 .../service/TelemetryFrontendServiceServicerImpl.py             | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py
index cb66b6b6a..498d07a91 100644
--- a/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py
+++ b/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py
@@ -43,7 +43,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer):
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def StopCollector(self, request : CollectorId, grpc_context: grpc.ServicerContext # type: ignore
         ) -> Empty:  # type: ignore
-
+        request.collector_id.uuid = ""
         return Empty()
     
     def SelectCollectors(self, request : CollectorFilter, contextgrpc_context: grpc.ServicerContext # type: ignore
-- 
GitLab


From 1c177bb7a6d589cdd0d1f38d001299cd8c646628 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Mon, 29 Apr 2024 12:37:22 +0000
Subject: [PATCH 175/602] New test case are added

---
 src/telemetry_frontend/tests/Messages.py | 42 ++++++++++++++++++++----
 1 file changed, 36 insertions(+), 6 deletions(-)

diff --git a/src/telemetry_frontend/tests/Messages.py b/src/telemetry_frontend/tests/Messages.py
index 877781b79..86c869834 100644
--- a/src/telemetry_frontend/tests/Messages.py
+++ b/src/telemetry_frontend/tests/Messages.py
@@ -13,12 +13,11 @@
 # limitations under the License.
 
 from common.proto import telemetry_frontend_pb2
-# from common.proto.kpi_manager_pb2 import kpi_id
-# from common.proto.kpi_sample_types_pb2 import KpiSampleType
+from common.proto.kpi_sample_types_pb2 import KpiSampleType
 
-def collector_id():
+def create_collector_id(coll_id_str):
     _collector_id                   = telemetry_frontend_pb2.CollectorId()
-    _collector_id.collector_id.uuid = str(1)
+    _collector_id.collector_id.uuid = str(coll_id_str)
     return _collector_id
 
 def create_collector_request(coll_id_str):
@@ -29,6 +28,37 @@ def create_collector_request(coll_id_str):
     _create_collector_request.interval_s                     = float(-1)
     return _create_collector_request
 
-def create_collector_filter(filter):
+def create_collector_request_a():
+    _create_collector_request_a                    = telemetry_frontend_pb2.Collector()
+    _create_collector_request_a.kpi_id.kpi_id.uuid = "-1"
+    return _create_collector_request_a
+
+def create_collector_request_b(str_kpi_id, coll_duration_s, coll_interval_s):
+    _create_collector_request_b                    = telemetry_frontend_pb2.Collector()
+    _create_collector_request_b.kpi_id.kpi_id.uuid = str_kpi_id
+    _create_collector_request_b.duration_s         = coll_duration_s
+    _create_collector_request_b.interval_s         = coll_interval_s
+    return _create_collector_request_b
+
+def create_collector_filter():
     _create_collector_filter = telemetry_frontend_pb2.CollectorFilter()
-    
\ No newline at end of file
+    new_collector_id                       = _create_collector_filter.collector_id.add()
+    new_collector_id.collector_id.uuid     = "COLL1"
+    new_kpi_id                             = _create_collector_filter.kpi_id.add()
+    new_kpi_id.kpi_id.uuid                 = "KPI1"
+    new_device_id                          = _create_collector_filter.device_id.add()
+    new_device_id.device_uuid.uuid         = 'DEV1'
+    new_service_id                         = _create_collector_filter.service_id.add()
+    new_service_id.service_uuid.uuid       = 'SERV1'
+    new_slice_id                           = _create_collector_filter.slice_id.add()
+    new_slice_id.slice_uuid.uuid           = 'SLC1'
+    new_endpoint_id                        = _create_collector_filter.endpoint_id.add()
+    new_endpoint_id.endpoint_uuid.uuid     = 'END1'
+    new_connection_id                      = _create_collector_filter.connection_id.add()
+    new_connection_id.connection_uuid.uuid = 'CON1'
+    _create_collector_filter.kpi_sample_type.append(KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED)
+    return _create_collector_filter
+
+def create_collector_list():
+    _create_collector_list = telemetry_frontend_pb2.CollectorList()
+    return _create_collector_list
\ No newline at end of file
-- 
GitLab


From f6c040ab31901e0049c80aa0d91625dafd12b78c Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Mon, 29 Apr 2024 12:37:57 +0000
Subject: [PATCH 176/602] New test cases are added

---
 src/telemetry_frontend/tests/test_unitary.py | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/telemetry_frontend/tests/test_unitary.py b/src/telemetry_frontend/tests/test_unitary.py
index 4b2594839..68467590f 100644
--- a/src/telemetry_frontend/tests/test_unitary.py
+++ b/src/telemetry_frontend/tests/test_unitary.py
@@ -16,6 +16,7 @@ import os
 import pytest
 import logging
 from typing import Union
+
 from common.proto.context_pb2 import Empty
 from common.Constants import ServiceNameEnum
 from common.proto.telemetry_frontend_pb2 import CollectorId, CollectorList
@@ -28,7 +29,8 @@ from common.Settings import (
 
 from telemetry_frontend.client.TelemetryFrontendClient import TelemetryFrontendClient
 from telemetry_frontend.service.TelemetryFrontendService import TelemetryFrontendService
-from telemetry_frontend.tests.Messages import create_collector_request
+from telemetry_frontend.tests.Messages import ( create_collector_id, create_collector_request, 
+    create_collector_filter, create_collector_request_a, create_collector_request_b)
 
 from device.client.DeviceClient import DeviceClient
 from device.service.DeviceService import DeviceService
@@ -168,14 +170,26 @@ def test_start_collector(telemetryFrontend_client):
     LOGGER.debug(str(response))
     assert isinstance(response, CollectorId)
 
+def test_start_collector_a(telemetryFrontend_client):
+    LOGGER.warning('test_start_collector requesting')
+    response = telemetryFrontend_client.StartCollector(create_collector_request_a())
+    LOGGER.debug(str(response))
+    assert isinstance(response, CollectorId)
+
+def test_start_collector_b(telemetryFrontend_client):
+    LOGGER.warning('test_start_collector requesting')
+    response = telemetryFrontend_client.StartCollector(create_collector_request_b('1',10,2))
+    LOGGER.debug(str(response))
+    assert isinstance(response, CollectorId)
+
 def test_stop_collector(telemetryFrontend_client):
     LOGGER.warning('test_stop_collector requesting')
-    response = telemetryFrontend_client.StopCollector('1')
+    response = telemetryFrontend_client.StopCollector(create_collector_id("1"))
     LOGGER.debug(str(response))
     assert isinstance(response, Empty)
 
 def test_select_collectors(telemetryFrontend_client):
     LOGGER.warning('test_select_collector requesting')
-    response = telemetryFrontend_client.SelectCollectors()
+    response = telemetryFrontend_client.SelectCollectors(create_collector_filter())
     LOGGER.debug(str(response))
     assert isinstance(response, CollectorList)
\ No newline at end of file
-- 
GitLab


From 220e0fd5f6f2f7a64ea2ebf58f2876d295fc1e13 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Ara=C3=BAjo?= 
Date: Mon, 29 Apr 2024 16:30:27 +0100
Subject: [PATCH 177/602] Revert "Container lab fixed"

This reverts commit 610f10e79f4d22d927239994e916ace3d61f8b9a.
---
 hackfest/containerlab/srl1.cli              | 14 --------------
 hackfest/containerlab/srl2.cli              | 14 --------------
 hackfest/containerlab/tfs-scenario.clab.yml | 12 +++---------
 3 files changed, 3 insertions(+), 37 deletions(-)
 delete mode 100644 hackfest/containerlab/srl1.cli
 delete mode 100644 hackfest/containerlab/srl2.cli

diff --git a/hackfest/containerlab/srl1.cli b/hackfest/containerlab/srl1.cli
deleted file mode 100644
index fd7144ca7..000000000
--- a/hackfest/containerlab/srl1.cli
+++ /dev/null
@@ -1,14 +0,0 @@
-set / interface ethernet-1/2 admin-state enable
-set / interface ethernet-1/2 subinterface 0 admin-state enable
-set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.1.1/24
-
-set / interface ethernet-1/1 admin-state enable
-set / interface ethernet-1/1 subinterface 0 admin-state enable
-set / interface ethernet-1/1 subinterface 0 ipv4 address 172.0.0.1/30
-
-set / network-instance default
-set / network-instance default interface ethernet-1/1.0
-set / network-instance default interface ethernet-1/2.0
-
-set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.2 admin-state enable
-set / network-instance default static-routes route 172.16.2.0/24 next-hop-group group1 admin-state enable
\ No newline at end of file
diff --git a/hackfest/containerlab/srl2.cli b/hackfest/containerlab/srl2.cli
deleted file mode 100644
index 395d53c71..000000000
--- a/hackfest/containerlab/srl2.cli
+++ /dev/null
@@ -1,14 +0,0 @@
-set / interface ethernet-1/2 admin-state enable
-set / interface ethernet-1/2 subinterface 0 admin-state enable
-set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.2.1/24
-
-set / interface ethernet-1/1 admin-state enable
-set / interface ethernet-1/1 subinterface 0 admin-state enable
-set / interface ethernet-1/1 subinterface 0 ipv4 address 172.0.0.2/30
-
-set / network-instance default
-set / network-instance default interface ethernet-1/1.0
-set / network-instance default interface ethernet-1/2.0
-
-set /network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.1 admin-state enable
-set /network-instance default static-routes route 172.16.1.0/24 next-hop-group group1 admin-state enable
\ No newline at end of file
diff --git a/hackfest/containerlab/tfs-scenario.clab.yml b/hackfest/containerlab/tfs-scenario.clab.yml
index 91467d2b9..f79378757 100644
--- a/hackfest/containerlab/tfs-scenario.clab.yml
+++ b/hackfest/containerlab/tfs-scenario.clab.yml
@@ -24,7 +24,7 @@ mgmt:
 topology:
   kinds:
     srl:
-      image: ghcr.io/nokia/srlinux:21.11.3
+      image: ghcr.io/nokia/srlinux:23.3.1
     linux:
       image: ghcr.io/hellt/network-multitool
   nodes:
@@ -34,30 +34,24 @@ topology:
       cpu: 0.5
       memory: 1GB
       mgmt-ipv4: 172.100.100.101
-      startup-config: ./srl1.cli
+      #startup-config: srl1.cli
     srl2:
       kind: srl
       type: ixr6
       cpu: 0.5
       memory: 1GB
       mgmt-ipv4: 172.100.100.102
-      startup-config: ./srl2.cli
+      #startup-config: srl2.cli
     client1:
       kind: linux
       cpu: 0.1
       memory: 100MB
       mgmt-ipv4: 172.100.100.201
-      exec:
-        - ip address add 172.16.1.10/24 dev eth1
-        - ip route add 172.16.2.0/24 via 172.16.1.1
     client2:
       kind: linux
       cpu: 0.1
       memory: 100MB
       mgmt-ipv4: 172.100.100.202
-      exec:
-        - ip address add 172.16.2.10/24 dev eth1
-        - ip route add 172.16.1.0/24 via 172.16.2.1
 
   links:
     - endpoints: ["srl1:e1-1", "srl2:e1-1"]
-- 
GitLab


From cd5f2e6565cab03b027614087c409d6431e5fcd2 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 30 Apr 2024 13:38:28 +0000
Subject: [PATCH 178/602] NodeExporter deplyment script

---
 manifests/mock_nodeexporter.yaml | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
 create mode 100644 manifests/mock_nodeexporter.yaml

diff --git a/manifests/mock_nodeexporter.yaml b/manifests/mock_nodeexporter.yaml
new file mode 100644
index 000000000..bf595d63a
--- /dev/null
+++ b/manifests/mock_nodeexporter.yaml
@@ -0,0 +1,21 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: node-exporter
+  labels:
+    app: node-exporter
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: node-exporter
+  template:
+    metadata:
+      labels:
+        app: node-exporter
+    spec:
+      containers:
+      - name: node-exporter
+        image: prom/node-exporter:latest
+        ports:
+        - containerPort: 9100
-- 
GitLab


From 04f1681b12c9d403424434fe6d986c89a65b898c Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 30 Apr 2024 13:38:58 +0000
Subject: [PATCH 179/602] NodeExporter service Script

---
 manifests/mock_nodeexporterservice.yaml | 12 ++++++++++++
 1 file changed, 12 insertions(+)
 create mode 100644 manifests/mock_nodeexporterservice.yaml

diff --git a/manifests/mock_nodeexporterservice.yaml b/manifests/mock_nodeexporterservice.yaml
new file mode 100644
index 000000000..b7bb4f879
--- /dev/null
+++ b/manifests/mock_nodeexporterservice.yaml
@@ -0,0 +1,12 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: node-exporter
+spec:
+  selector:
+    app: node-exporter
+  ports:
+    - protocol: TCP
+      port: 9100
+      targetPort: 9100
+  type: NodePort
-- 
GitLab


From e08d7ce3e9f51ed989cb7e5a87ce27231a460d40 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 30 Apr 2024 13:41:24 +0000
Subject: [PATCH 180/602] List of Telemetry virtual enviornment installed
 packages

---
 src/telemetry_frontend/telemetry_virenv.txt | 44 +++++++++++++++++++++
 1 file changed, 44 insertions(+)
 create mode 100644 src/telemetry_frontend/telemetry_virenv.txt

diff --git a/src/telemetry_frontend/telemetry_virenv.txt b/src/telemetry_frontend/telemetry_virenv.txt
new file mode 100644
index 000000000..0ce9b803a
--- /dev/null
+++ b/src/telemetry_frontend/telemetry_virenv.txt
@@ -0,0 +1,44 @@
+anytree==2.8.0
+APScheduler==3.10.1
+attrs==23.2.0
+certifi==2024.2.2
+charset-normalizer==2.0.12
+colorama==0.4.6
+confluent-kafka==2.3.0
+coverage==6.3
+future-fstrings==1.2.0
+grpcio==1.47.5
+grpcio-health-checking==1.47.5
+grpcio-tools==1.47.5
+grpclib==0.4.4
+h2==4.1.0
+hpack==4.0.0
+hyperframe==6.0.1
+idna==3.7
+influx-line-protocol==0.1.4
+iniconfig==2.0.0
+kafka-python==2.0.2
+multidict==6.0.5
+networkx==3.3
+packaging==24.0
+pluggy==1.5.0
+prettytable==3.5.0
+prometheus-client==0.13.0
+protobuf==3.20.3
+psycopg2-binary==2.9.3
+py==1.11.0
+py-cpuinfo==9.0.0
+pytest==6.2.5
+pytest-benchmark==3.4.1
+pytest-depends==1.0.1
+python-dateutil==2.8.2
+python-json-logger==2.0.2
+pytz==2024.1
+questdb==1.0.1
+requests==2.27.1
+six==1.16.0
+toml==0.10.2
+tzlocal==5.2
+urllib3==1.26.18
+wcwidth==0.2.13
+xmltodict==0.12.0
-- 
GitLab


From 54839a5ca7635a187bdeb4c7e73c7e249eee6e3c Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 30 Apr 2024 13:43:19 +0000
Subject: [PATCH 181/602] KafkaProducerController: for Kafka configuration and
 execution of producer

---
 .../backend/KafkaProducerController.py        | 57 +++++++++++++++++++
 1 file changed, 57 insertions(+)
 create mode 100755 src/telemetry_frontend/backend/KafkaProducerController.py

diff --git a/src/telemetry_frontend/backend/KafkaProducerController.py b/src/telemetry_frontend/backend/KafkaProducerController.py
new file mode 100755
index 000000000..8c88d5e8e
--- /dev/null
+++ b/src/telemetry_frontend/backend/KafkaProducerController.py
@@ -0,0 +1,57 @@
+# 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.
+
+from NodeExporterProducer import KafkaNodeExporterProducer
+
+class KafkaProducerController:
+    """
+    Class to control Kafka producer functionality.
+    """
+    def __init__(self):
+        kafka_configs = self.generate_kafka_configurations()
+        self.bootstrap_servers      = kafka_configs['bootstrap_servers'] 
+        self.node_exporter_endpoint = kafka_configs['node_exporter_endpoint']
+        self.kafka_topic            = kafka_configs['kafka_topic']
+        self.run_duration           = kafka_configs['run_duration']
+        self.fetch_interval         = kafka_configs['fetch_interval']
+
+    def generate_kafka_configurations(self):
+        """
+        Method to generate Kafka configurations 
+        """
+        create_kafka_configuration = {
+            'bootstrap_servers'      : '127.0.0.1:9092',                      # Kafka broker address - Replace with your Kafka broker address            
+            'node_exporter_endpoint' : 'http://10.152.183.231:9100/metrics',  # Node Exporter metrics endpoint - Replace with your Node Exporter endpoint
+            'kafka_topic'            : 'metric-data',                         # Kafka topic to produce to
+            'run_duration'           :  20,                                   # Total duration to execute the producer
+            'fetch_interval'         :  3                                     # Time between two fetch requests
+        }
+        return create_kafka_configuration
+
+    def run_producer(self):
+        """
+        Method to create KafkaNodeExporterProducer object and start producer thread.
+        """
+        # Create NodeExporterProducer object and run start_producer_thread
+        producer = KafkaNodeExporterProducer(self.bootstrap_servers, self.node_exporter_endpoint, 
+                    self.kafka_topic, self.run_duration, self.fetch_interval
+                    )
+        # producer.start_producer_thread()    # if threading is required
+        producer.produce_metrics()      # if threading is not required
+
+if __name__ == "__main__":
+
+    # Create Kafka producer controller object and run producer
+    kafka_controller = KafkaProducerController()
+    kafka_controller.run_producer()
-- 
GitLab


From 179a2193cf887ba4aabd677bd745d148d800c136 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 30 Apr 2024 13:44:42 +0000
Subject: [PATCH 182/602] NodeExporterProducer: Implementation of Producer:
 Read from NodeExporter endpoint and writes on Kafka topic

---
 .../backend/NodeExporterProducer.py           | 128 ++++++++++++++++++
 1 file changed, 128 insertions(+)
 create mode 100755 src/telemetry_frontend/backend/NodeExporterProducer.py

diff --git a/src/telemetry_frontend/backend/NodeExporterProducer.py b/src/telemetry_frontend/backend/NodeExporterProducer.py
new file mode 100755
index 000000000..5f7b1471b
--- /dev/null
+++ b/src/telemetry_frontend/backend/NodeExporterProducer.py
@@ -0,0 +1,128 @@
+
+# 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.
+
+from confluent_kafka import Producer, KafkaException
+from confluent_kafka.admin import AdminClient, NewTopic
+import requests
+import time
+import threading
+
+class KafkaNodeExporterProducer:
+    """
+    Class to fetch metrics from Node Exporter and produce them to Kafka.
+    """
+
+    def __init__(self, bootstrap_servers, node_exporter_endpoint, kafka_topic, run_duration, fetch_interval):
+        """
+        Constructor to initialize Kafka producer parameters.
+        Args:
+            bootstrap_servers (str): Kafka broker address.
+            node_exporter_endpoint (str): Node Exporter metrics endpoint.
+            kafka_topic (str): Kafka topic to produce metrics to.
+            run_interval (int): Time interval in seconds to run the producer.
+        """
+        self.bootstrap_servers = bootstrap_servers
+        self.node_exporter_endpoint = node_exporter_endpoint
+        self.kafka_topic = kafka_topic
+        self.run_duration = run_duration
+        self.fetch_interval = fetch_interval
+
+    def fetch_metrics(self):
+        """
+        Method to fetch metrics from Node Exporter.
+        Returns:
+            str: Metrics fetched from Node Exporter.
+        """
+        try:
+            response = requests.get(self.node_exporter_endpoint)
+            if response.status_code == 200:
+                print(f"Metrics fetched sucessfully...")
+                return response.text
+            else:
+                print(f"Failed to fetch metrics. Status code: {response.status_code}")
+                return None
+        except Exception as e:
+            print(f"Failed to fetch metrics: {str(e)}")
+            return None
+
+    def delivery_callback(self, err, msg):
+        """
+        Callback function to handle message delivery status.
+        Args:
+            err (KafkaError): Kafka error object.
+            msg (Message): Kafka message object.
+        """
+        if err:
+            print(f'Message delivery failed: {err}')
+        else:
+            print(f'Message delivered to topic {msg.topic()}')
+
+    def create_topic_if_not_exists(self, admin_client):
+        """
+        Method to create Kafka topic if it does not exist.
+        Args:
+            admin_client (AdminClient): Kafka admin client.
+        """
+        try:
+            topic_metadata = admin_client.list_topics(timeout=5)
+            if self.kafka_topic not in topic_metadata.topics:
+                # If the topic does not exist, create a new topic
+                print(f"Topic '{self.kafka_topic}' does not exist. Creating...")
+                new_topic = NewTopic(self.kafka_topic, num_partitions=1, replication_factor=1)
+                admin_client.create_topics([new_topic])
+        except KafkaException as e:
+            print(f"Failed to create topic: {e}")
+
+    def produce_metrics(self):
+        """
+        Method to continuously produce metrics to Kafka topic.
+        """
+        conf = {
+            'bootstrap.servers': self.bootstrap_servers,
+        }
+
+        admin_client = AdminClient(conf)
+        self.create_topic_if_not_exists(admin_client)
+
+        kafka_producer = Producer(conf)
+
+        try:
+            start_time = time.time()
+            while True:
+                metrics = self.fetch_metrics()
+
+                if metrics:
+                    kafka_producer.produce(self.kafka_topic, metrics.encode('utf-8'), callback=self.delivery_callback)
+                    kafka_producer.flush()
+                    print("Metrics produced to Kafka topic")
+
+                # Check if the specified run duration has elapsed
+                if time.time() - start_time >= self.run_duration:
+                    break
+
+                # waiting time until next fetch 
+                time.sleep(self.fetch_interval)
+        except KeyboardInterrupt:
+            print("Keyboard interrupt detected. Exiting...")
+        finally:
+            kafka_producer.flush()
+            # kafka_producer.close()        # this command generates ERROR
+
+    def start_producer_thread(self):
+        """
+        Method to start the producer thread.
+        """
+        producer_thread = threading.Thread(target=self.produce_metrics)
+        producer_thread.start()
-- 
GitLab


From 97e5fafc9201f56737444996639e9f54f1483e27 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 30 Apr 2024 13:55:07 +0000
Subject: [PATCH 183/602] format improvements

---
 src/telemetry_frontend/backend/NodeExporterProducer.py | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/telemetry_frontend/backend/NodeExporterProducer.py b/src/telemetry_frontend/backend/NodeExporterProducer.py
index 5f7b1471b..b15943727 100755
--- a/src/telemetry_frontend/backend/NodeExporterProducer.py
+++ b/src/telemetry_frontend/backend/NodeExporterProducer.py
@@ -33,11 +33,11 @@ class KafkaNodeExporterProducer:
             kafka_topic (str): Kafka topic to produce metrics to.
             run_interval (int): Time interval in seconds to run the producer.
         """
-        self.bootstrap_servers = bootstrap_servers
+        self.bootstrap_servers      = bootstrap_servers
         self.node_exporter_endpoint = node_exporter_endpoint
-        self.kafka_topic = kafka_topic
-        self.run_duration = run_duration
-        self.fetch_interval = fetch_interval
+        self.kafka_topic            = kafka_topic
+        self.run_duration           = run_duration
+        self.fetch_interval         = fetch_interval
 
     def fetch_metrics(self):
         """
-- 
GitLab


From e41e43f205185532a4e64c7ee8a45dbe10ac8f55 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Ara=C3=BAjo?= 
Date: Tue, 30 Apr 2024 14:56:12 +0100
Subject: [PATCH 184/602] containerlab pre-configured lab

---
 hackfest/containerlab/srl1.cli              | 0
 hackfest/containerlab/srl2.cli              | 0
 hackfest/containerlab/tfs-scenario.clab.yml | 6 ++++++
 3 files changed, 6 insertions(+)
 create mode 100644 hackfest/containerlab/srl1.cli
 create mode 100644 hackfest/containerlab/srl2.cli

diff --git a/hackfest/containerlab/srl1.cli b/hackfest/containerlab/srl1.cli
new file mode 100644
index 000000000..e69de29bb
diff --git a/hackfest/containerlab/srl2.cli b/hackfest/containerlab/srl2.cli
new file mode 100644
index 000000000..e69de29bb
diff --git a/hackfest/containerlab/tfs-scenario.clab.yml b/hackfest/containerlab/tfs-scenario.clab.yml
index f79378757..8e3514630 100644
--- a/hackfest/containerlab/tfs-scenario.clab.yml
+++ b/hackfest/containerlab/tfs-scenario.clab.yml
@@ -47,11 +47,17 @@ topology:
       cpu: 0.1
       memory: 100MB
       mgmt-ipv4: 172.100.100.201
+      exec:
+        - ip address add 172.16.1.10/24 dev eth1
+        - ip route add 172.16.2.0/24 via 172.16.1.1
     client2:
       kind: linux
       cpu: 0.1
       memory: 100MB
       mgmt-ipv4: 172.100.100.202
+      exec:
+        - ip address add 172.16.2.10/24 dev eth1
+        - ip route add 172.16.2.0/24 via 172.16.2.1
 
   links:
     - endpoints: ["srl1:e1-1", "srl2:e1-1"]
-- 
GitLab


From 3f0db71ace25fcda364eaf2264753cccb4c064f5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Ara=C3=BAjo?= 
Date: Tue, 30 Apr 2024 15:40:52 +0100
Subject: [PATCH 185/602] Configuration files

---
 hackfest/containerlab/srl1.cli              | 17 +++++++++++++++++
 hackfest/containerlab/srl2.cli              | 17 +++++++++++++++++
 hackfest/containerlab/tfs-scenario.clab.yml |  2 +-
 3 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/hackfest/containerlab/srl1.cli b/hackfest/containerlab/srl1.cli
index e69de29bb..c72ae130a 100644
--- a/hackfest/containerlab/srl1.cli
+++ b/hackfest/containerlab/srl1.cli
@@ -0,0 +1,17 @@
+set / interface ethernet-1/2 admin-state enable
+set / interface ethernet-1/2 subinterface 0 admin-state enable
+set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.1.1/24
+
+set / interface ethernet-1/1 admin-state enable
+set / interface ethernet-1/1 subinterface 0 admin-state enable
+set / interface ethernet-1/1 subinterface 0 ipv4 address 172.0.0.1/30
+
+set / network-instance default
+set / network-instance default interface ethernet-1/1.0
+set / network-instance default interface ethernet-1/2.0
+
+set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.2 admin-state enable
+set / network-instance default static-routes route 172.16.2.0/24 next-hop-group group1 admin-state enable
+
+set / system management openconfig admin-state enable
+set / system gnmi-server network-instance mgmt yang-models openconfig
\ No newline at end of file
diff --git a/hackfest/containerlab/srl2.cli b/hackfest/containerlab/srl2.cli
index e69de29bb..c72ae130a 100644
--- a/hackfest/containerlab/srl2.cli
+++ b/hackfest/containerlab/srl2.cli
@@ -0,0 +1,17 @@
+set / interface ethernet-1/2 admin-state enable
+set / interface ethernet-1/2 subinterface 0 admin-state enable
+set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.1.1/24
+
+set / interface ethernet-1/1 admin-state enable
+set / interface ethernet-1/1 subinterface 0 admin-state enable
+set / interface ethernet-1/1 subinterface 0 ipv4 address 172.0.0.1/30
+
+set / network-instance default
+set / network-instance default interface ethernet-1/1.0
+set / network-instance default interface ethernet-1/2.0
+
+set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.2 admin-state enable
+set / network-instance default static-routes route 172.16.2.0/24 next-hop-group group1 admin-state enable
+
+set / system management openconfig admin-state enable
+set / system gnmi-server network-instance mgmt yang-models openconfig
\ No newline at end of file
diff --git a/hackfest/containerlab/tfs-scenario.clab.yml b/hackfest/containerlab/tfs-scenario.clab.yml
index 8e3514630..ffb00dfc9 100644
--- a/hackfest/containerlab/tfs-scenario.clab.yml
+++ b/hackfest/containerlab/tfs-scenario.clab.yml
@@ -57,7 +57,7 @@ topology:
       mgmt-ipv4: 172.100.100.202
       exec:
         - ip address add 172.16.2.10/24 dev eth1
-        - ip route add 172.16.2.0/24 via 172.16.2.1
+        - ip route add 172.16.1.0/24 via 172.16.2.1
 
   links:
     - endpoints: ["srl1:e1-1", "srl2:e1-1"]
-- 
GitLab


From 0e46347ccacdd2c76d0a2030a9e6233d7d885695 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 30 Apr 2024 15:43:42 +0000
Subject: [PATCH 186/602] files rename to "KafkaProducerService" and
 "KafkaProducerServiceImpl"

---
 .../KafkaProducerService.py}                  | 14 +++---
 .../KafkaProducerServiceImpl.py}              | 43 +++++++++++++++----
 2 files changed, 42 insertions(+), 15 deletions(-)
 rename src/telemetry_frontend/backend/{KafkaProducerController.py => service/KafkaProducerService.py} (83%)
 rename src/telemetry_frontend/backend/{NodeExporterProducer.py => service/KafkaProducerServiceImpl.py} (70%)

diff --git a/src/telemetry_frontend/backend/KafkaProducerController.py b/src/telemetry_frontend/backend/service/KafkaProducerService.py
similarity index 83%
rename from src/telemetry_frontend/backend/KafkaProducerController.py
rename to src/telemetry_frontend/backend/service/KafkaProducerService.py
index 8c88d5e8e..fd2507abf 100755
--- a/src/telemetry_frontend/backend/KafkaProducerController.py
+++ b/src/telemetry_frontend/backend/service/KafkaProducerService.py
@@ -12,9 +12,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from NodeExporterProducer import KafkaNodeExporterProducer
+from KafkaProducerServiceImpl import KafkaProducerServiceImpl
 
-class KafkaProducerController:
+class KafkaProducerService:
     """
     Class to control Kafka producer functionality.
     """
@@ -35,16 +35,16 @@ class KafkaProducerController:
             'node_exporter_endpoint' : 'http://10.152.183.231:9100/metrics',  # Node Exporter metrics endpoint - Replace with your Node Exporter endpoint
             'kafka_topic'            : 'metric-data',                         # Kafka topic to produce to
             'run_duration'           :  20,                                   # Total duration to execute the producer
-            'fetch_interval'         :  3                                     # Time between two fetch requests
+            'fetch_interval'         :  4                                     # Time between two fetch requests
         }
         return create_kafka_configuration
 
     def run_producer(self):
         """
-        Method to create KafkaNodeExporterProducer object and start producer thread.
+        Method to create KafkaProducerServiceImpl object and start producer thread.
         """
         # Create NodeExporterProducer object and run start_producer_thread
-        producer = KafkaNodeExporterProducer(self.bootstrap_servers, self.node_exporter_endpoint, 
+        producer = KafkaProducerServiceImpl(self.bootstrap_servers, self.node_exporter_endpoint, 
                     self.kafka_topic, self.run_duration, self.fetch_interval
                     )
         # producer.start_producer_thread()    # if threading is required
@@ -52,6 +52,6 @@ class KafkaProducerController:
 
 if __name__ == "__main__":
 
-    # Create Kafka producer controller object and run producer
-    kafka_controller = KafkaProducerController()
+    # Create Kafka producer service object and run producer
+    kafka_controller = KafkaProducerService()
     kafka_controller.run_producer()
diff --git a/src/telemetry_frontend/backend/NodeExporterProducer.py b/src/telemetry_frontend/backend/service/KafkaProducerServiceImpl.py
similarity index 70%
rename from src/telemetry_frontend/backend/NodeExporterProducer.py
rename to src/telemetry_frontend/backend/service/KafkaProducerServiceImpl.py
index b15943727..6017f26cc 100755
--- a/src/telemetry_frontend/backend/NodeExporterProducer.py
+++ b/src/telemetry_frontend/backend/service/KafkaProducerServiceImpl.py
@@ -19,9 +19,9 @@ import requests
 import time
 import threading
 
-class KafkaNodeExporterProducer:
+class KafkaProducerServiceImpl:
     """
-    Class to fetch metrics from Node Exporter and produce them to Kafka.
+    Class to fetch metrics from Exporter and produce them to Kafka.
     """
 
     def __init__(self, bootstrap_servers, node_exporter_endpoint, kafka_topic, run_duration, fetch_interval):
@@ -39,17 +39,25 @@ class KafkaNodeExporterProducer:
         self.run_duration           = run_duration
         self.fetch_interval         = fetch_interval
 
-    def fetch_metrics(self):
+    def fetch_node_exporter_metrics(self):
         """
         Method to fetch metrics from Node Exporter.
         Returns:
             str: Metrics fetched from Node Exporter.
         """
+        KPI = "node_network_receive_packets_total"
         try:
             response = requests.get(self.node_exporter_endpoint)
             if response.status_code == 200:
-                print(f"Metrics fetched sucessfully...")
-                return response.text
+                # print(f"Metrics fetched sucessfully...")
+                metrics = response.text
+                # Check if the desired metric is available in the response
+                if KPI in metrics:
+                    KPI_VALUE = self.extract_metric_value(metrics, KPI)
+                    # Extract the metric value
+                    if KPI_VALUE is not None:
+                        print(f"KPI value: {KPI_VALUE}")
+                        return KPI_VALUE
             else:
                 print(f"Failed to fetch metrics. Status code: {response.status_code}")
                 return None
@@ -57,6 +65,25 @@ class KafkaNodeExporterProducer:
             print(f"Failed to fetch metrics: {str(e)}")
             return None
 
+    def extract_metric_value(self, metrics, metric_name):
+        """
+        Method to extract the value of a metric from the metrics string.
+        Args:
+            metrics (str): Metrics string fetched from Node Exporter.
+            metric_name (str): Name of the metric to extract.
+        Returns:
+            float: Value of the extracted metric, or None if not found.
+        """
+        try:
+            # Find the metric line containing the desired metric name
+            metric_line = next(line for line in metrics.split('\n') if line.startswith(metric_name))
+            # Split the line to extract the metric value
+            metric_value = float(metric_line.split()[1])
+            return metric_value
+        except StopIteration:
+            print(f"Metric '{metric_name}' not found in the metrics.")
+            return None
+
     def delivery_callback(self, err, msg):
         """
         Callback function to handle message delivery status.
@@ -101,12 +128,12 @@ class KafkaNodeExporterProducer:
         try:
             start_time = time.time()
             while True:
-                metrics = self.fetch_metrics()
+                metrics = self.fetch_node_exporter_metrics()  # select the function name based on the provided requirements
 
                 if metrics:
-                    kafka_producer.produce(self.kafka_topic, metrics.encode('utf-8'), callback=self.delivery_callback)
+                    kafka_producer.produce(self.kafka_topic, str(metrics), callback=self.delivery_callback)
                     kafka_producer.flush()
-                    print("Metrics produced to Kafka topic")
+                    # print("Metrics produced to Kafka topic")
 
                 # Check if the specified run duration has elapsed
                 if time.time() - start_time >= self.run_duration:
-- 
GitLab


From a5f83a179afd7b4176f4d72befdd475af839332a Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 30 Apr 2024 15:44:08 +0000
Subject: [PATCH 187/602] Kafka tests file added

---
 .../backend/tests/KafkaProducerTests.py       | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
 create mode 100644 src/telemetry_frontend/backend/tests/KafkaProducerTests.py

diff --git a/src/telemetry_frontend/backend/tests/KafkaProducerTests.py b/src/telemetry_frontend/backend/tests/KafkaProducerTests.py
new file mode 100644
index 000000000..b353f9fe2
--- /dev/null
+++ b/src/telemetry_frontend/backend/tests/KafkaProducerTests.py
@@ -0,0 +1,19 @@
+
+# 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.
+
+from telemetry_frontend.backend.service.KafkaProducerService import KafkaProducerService
+
+kafka_controller = KafkaProducerService()
+kafka_controller.run_producer()
\ No newline at end of file
-- 
GitLab


From 185fbeb3c0b630baadae373658d683f069957d3c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Ara=C3=BAjo?= 
Date: Mon, 6 May 2024 15:22:28 +0100
Subject: [PATCH 188/602] Stable with previous version of SRLinux

---
 hackfest/containerlab/srl1.cli                      |  3 +--
 hackfest/containerlab/srl2.cli                      |  5 ++---
 hackfest/containerlab/tfs-descriptors/topology.json |  4 ++--
 hackfest/containerlab/tfs-scenario.clab.yml         | 13 ++++++-------
 4 files changed, 11 insertions(+), 14 deletions(-)

diff --git a/hackfest/containerlab/srl1.cli b/hackfest/containerlab/srl1.cli
index c72ae130a..b0e1b5c79 100644
--- a/hackfest/containerlab/srl1.cli
+++ b/hackfest/containerlab/srl1.cli
@@ -13,5 +13,4 @@ set / network-instance default interface ethernet-1/2.0
 set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.2 admin-state enable
 set / network-instance default static-routes route 172.16.2.0/24 next-hop-group group1 admin-state enable
 
-set / system management openconfig admin-state enable
-set / system gnmi-server network-instance mgmt yang-models openconfig
\ No newline at end of file
+set / system gnmi-server network-instance mgmt admin-state enable
\ No newline at end of file
diff --git a/hackfest/containerlab/srl2.cli b/hackfest/containerlab/srl2.cli
index c72ae130a..a5c72d027 100644
--- a/hackfest/containerlab/srl2.cli
+++ b/hackfest/containerlab/srl2.cli
@@ -1,6 +1,6 @@
 set / interface ethernet-1/2 admin-state enable
 set / interface ethernet-1/2 subinterface 0 admin-state enable
-set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.1.1/24
+set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.2.1/24
 
 set / interface ethernet-1/1 admin-state enable
 set / interface ethernet-1/1 subinterface 0 admin-state enable
@@ -13,5 +13,4 @@ set / network-instance default interface ethernet-1/2.0
 set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.2 admin-state enable
 set / network-instance default static-routes route 172.16.2.0/24 next-hop-group group1 admin-state enable
 
-set / system management openconfig admin-state enable
-set / system gnmi-server network-instance mgmt yang-models openconfig
\ No newline at end of file
+set / system gnmi-server network-instance mgmt admin-state enable
\ No newline at end of file
diff --git a/hackfest/containerlab/tfs-descriptors/topology.json b/hackfest/containerlab/tfs-descriptors/topology.json
index e4a49981f..f5d1c0d73 100644
--- a/hackfest/containerlab/tfs-descriptors/topology.json
+++ b/hackfest/containerlab/tfs-descriptors/topology.json
@@ -32,7 +32,7 @@
                 {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.100.100.101"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "57400"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {
-                    "username": "admin", "password": "NokiaSrl1!", "use_tls": true
+                    "username": "admin", "password": "admin", "use_tls": true
                 }}}
             ]}
         },
@@ -42,7 +42,7 @@
                 {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.100.100.102"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "57400"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {
-                    "username": "admin", "password": "NokiaSrl1!", "use_tls": true
+                    "username": "admin", "password": "admin", "use_tls": true
                 }}}
             ]}
         }
diff --git a/hackfest/containerlab/tfs-scenario.clab.yml b/hackfest/containerlab/tfs-scenario.clab.yml
index ffb00dfc9..950870b84 100644
--- a/hackfest/containerlab/tfs-scenario.clab.yml
+++ b/hackfest/containerlab/tfs-scenario.clab.yml
@@ -20,28 +20,27 @@ name: tfs-scenario
 mgmt:
   network: mgmt-net
   ipv4-subnet: 172.100.100.0/24
-
 topology:
   kinds:
-    srl:
-      image: ghcr.io/nokia/srlinux:23.3.1
+    nokia_srlinux:
+      image: ghcr.io/nokia/srlinux:21.11.3
     linux:
       image: ghcr.io/hellt/network-multitool
   nodes:
     srl1:
-      kind: srl
+      kind: nokia_srlinux
       type: ixr6
       cpu: 0.5
       memory: 1GB
       mgmt-ipv4: 172.100.100.101
-      #startup-config: srl1.cli
+      startup-config: srl1.cli
     srl2:
-      kind: srl
+      kind: nokia_srlinux
       type: ixr6
       cpu: 0.5
       memory: 1GB
       mgmt-ipv4: 172.100.100.102
-      #startup-config: srl2.cli
+      startup-config: srl2.cli
     client1:
       kind: linux
       cpu: 0.1
-- 
GitLab


From 23742187793fe472292300d972b7a07ba454d827 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 7 May 2024 14:01:42 +0000
Subject: [PATCH 189/602] Script to run "Telemetry Backend" service

---
 .../run_tests_locally-telemetry-backend.sh    | 28 +++++++++++++++++++
 1 file changed, 28 insertions(+)
 create mode 100755 scripts/run_tests_locally-telemetry-backend.sh

diff --git a/scripts/run_tests_locally-telemetry-backend.sh b/scripts/run_tests_locally-telemetry-backend.sh
new file mode 100755
index 000000000..cbebd6807
--- /dev/null
+++ b/scripts/run_tests_locally-telemetry-backend.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+# 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.
+
+
+PROJECTDIR=`pwd`
+
+cd $PROJECTDIR/src
+# RCFILE=$PROJECTDIR/coverage/.coveragerc
+# coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
+#     kpi_manager/tests/test_unitary.py
+
+# python3 kpi_manager/tests/test_unitary.py
+
+RCFILE=$PROJECTDIR/coverage/.coveragerc
+python3 -m pytest --log-level=INFO --verbose \
+    telemetry_frontend/backend/tests/test_kafka_backend.py
\ No newline at end of file
-- 
GitLab


From 6d5bc62a7cb4c87315fa4c23068e45babf8e409b Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 7 May 2024 14:02:12 +0000
Subject: [PATCH 190/602] __init__.py file added

---
 src/telemetry_frontend/__init__.py               | 16 +++++++++++++++-
 .../{tests/KafkaProducerTests.py => __init__.py} |  6 ------
 .../backend/service/__init__.py                  | 13 +++++++++++++
 src/telemetry_frontend/backend/tests/__init__.py | 13 +++++++++++++
 4 files changed, 41 insertions(+), 7 deletions(-)
 rename src/telemetry_frontend/backend/{tests/KafkaProducerTests.py => __init__.py} (78%)
 create mode 100644 src/telemetry_frontend/backend/service/__init__.py
 create mode 100644 src/telemetry_frontend/backend/tests/__init__.py

diff --git a/src/telemetry_frontend/__init__.py b/src/telemetry_frontend/__init__.py
index eb1ae458f..6a8f39746 100644
--- a/src/telemetry_frontend/__init__.py
+++ b/src/telemetry_frontend/__init__.py
@@ -1 +1,15 @@
-...
+
+# 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/telemetry_frontend/backend/tests/KafkaProducerTests.py b/src/telemetry_frontend/backend/__init__.py
similarity index 78%
rename from src/telemetry_frontend/backend/tests/KafkaProducerTests.py
rename to src/telemetry_frontend/backend/__init__.py
index b353f9fe2..38d04994f 100644
--- a/src/telemetry_frontend/backend/tests/KafkaProducerTests.py
+++ b/src/telemetry_frontend/backend/__init__.py
@@ -1,4 +1,3 @@
-
 # Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,8 +11,3 @@
 # 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.
-
-from telemetry_frontend.backend.service.KafkaProducerService import KafkaProducerService
-
-kafka_controller = KafkaProducerService()
-kafka_controller.run_producer()
\ No newline at end of file
diff --git a/src/telemetry_frontend/backend/service/__init__.py b/src/telemetry_frontend/backend/service/__init__.py
new file mode 100644
index 000000000..38d04994f
--- /dev/null
+++ b/src/telemetry_frontend/backend/service/__init__.py
@@ -0,0 +1,13 @@
+# 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/telemetry_frontend/backend/tests/__init__.py b/src/telemetry_frontend/backend/tests/__init__.py
new file mode 100644
index 000000000..38d04994f
--- /dev/null
+++ b/src/telemetry_frontend/backend/tests/__init__.py
@@ -0,0 +1,13 @@
+# 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.
-- 
GitLab


From beb53c88457021589a6a6a12288120ab9aaba74a Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 7 May 2024 14:03:24 +0000
Subject: [PATCH 191/602] method name change from
 "generate_kafka_configurations" to "generate_kafka_configs"

---
 .../backend/service/KafkaProducerService.py        | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/telemetry_frontend/backend/service/KafkaProducerService.py b/src/telemetry_frontend/backend/service/KafkaProducerService.py
index fd2507abf..4e2d79347 100755
--- a/src/telemetry_frontend/backend/service/KafkaProducerService.py
+++ b/src/telemetry_frontend/backend/service/KafkaProducerService.py
@@ -12,36 +12,38 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from KafkaProducerServiceImpl import KafkaProducerServiceImpl
+from .KafkaProducerServiceImpl import KafkaProducerServiceImpl
 
 class KafkaProducerService:
     """
     Class to control Kafka producer functionality.
     """
     def __init__(self):
-        kafka_configs = self.generate_kafka_configurations()
+
+        kafka_configs = self.generate_kafka_configs()
+
         self.bootstrap_servers      = kafka_configs['bootstrap_servers'] 
         self.node_exporter_endpoint = kafka_configs['node_exporter_endpoint']
         self.kafka_topic            = kafka_configs['kafka_topic']
         self.run_duration           = kafka_configs['run_duration']
         self.fetch_interval         = kafka_configs['fetch_interval']
 
-    def generate_kafka_configurations(self):
+    def generate_kafka_configs(self):    # define the function to get every attribute
         """
         Method to generate Kafka configurations 
         """
-        create_kafka_configuration = {
+        create_kafka_configs = {
             'bootstrap_servers'      : '127.0.0.1:9092',                      # Kafka broker address - Replace with your Kafka broker address            
             'node_exporter_endpoint' : 'http://10.152.183.231:9100/metrics',  # Node Exporter metrics endpoint - Replace with your Node Exporter endpoint
             'kafka_topic'            : 'metric-data',                         # Kafka topic to produce to
             'run_duration'           :  20,                                   # Total duration to execute the producer
             'fetch_interval'         :  4                                     # Time between two fetch requests
         }
-        return create_kafka_configuration
+        return create_kafka_configs
 
     def run_producer(self):
         """
-        Method to create KafkaProducerServiceImpl object and start producer thread.
+        Method to create KafkaProducerServiceImpl object and start producer.
         """
         # Create NodeExporterProducer object and run start_producer_thread
         producer = KafkaProducerServiceImpl(self.bootstrap_servers, self.node_exporter_endpoint, 
-- 
GitLab


From 7a1da84510d9aa5480612edaf04fe311ffda63bd Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 7 May 2024 14:05:00 +0000
Subject: [PATCH 192/602] Two methods add "export_collector_value()" and
 "write_to_kafka()"

---
 .../service/KafkaProducerServiceImpl.py       | 34 ++++++++++++++++---
 1 file changed, 29 insertions(+), 5 deletions(-)

diff --git a/src/telemetry_frontend/backend/service/KafkaProducerServiceImpl.py b/src/telemetry_frontend/backend/service/KafkaProducerServiceImpl.py
index 6017f26cc..b6b55f913 100755
--- a/src/telemetry_frontend/backend/service/KafkaProducerServiceImpl.py
+++ b/src/telemetry_frontend/backend/service/KafkaProducerServiceImpl.py
@@ -13,11 +13,19 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from confluent_kafka import Producer, KafkaException
-from confluent_kafka.admin import AdminClient, NewTopic
-import requests
 import time
+import grpc
+import logging
+import requests
 import threading
+from common.proto.context_pb2 import Empty
+from confluent_kafka import Producer, KafkaException
+from confluent_kafka.admin import AdminClient, NewTopic
+from common.proto.telemetry_frontend_pb2 import Collector, CollectorId
+from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method
+
+LOGGER = logging.getLogger(__name__)
+METRICS_POOL = MetricsPool('Telemetry', 'TelemetryBackend')
 
 class KafkaProducerServiceImpl:
     """
@@ -33,11 +41,25 @@ class KafkaProducerServiceImpl:
             kafka_topic (str): Kafka topic to produce metrics to.
             run_interval (int): Time interval in seconds to run the producer.
         """
+        LOGGER.info('Init TelemetryBackendService')
+
         self.bootstrap_servers      = bootstrap_servers
         self.node_exporter_endpoint = node_exporter_endpoint
         self.kafka_topic            = kafka_topic
         self.run_duration           = run_duration
         self.fetch_interval         = fetch_interval
+    
+    # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
+    def export_collector_value(request: CollectorId) -> str: # type: ignore
+        response = str()
+        response = '-1'
+        return response
+
+    # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
+    def write_to_kafka(Collector, kpi_value) -> Empty: # type: ignore
+        return Empty()
+        
+# ----------- BELOW: Actual Implementation of Kafka Producer with Node Exporter -----------
 
     def fetch_node_exporter_metrics(self):
         """
@@ -114,7 +136,7 @@ class KafkaProducerServiceImpl:
 
     def produce_metrics(self):
         """
-        Method to continuously produce metrics to Kafka topic.
+        Method to produce metrics to Kafka topic as per Kafka configs.
         """
         conf = {
             'bootstrap.servers': self.bootstrap_servers,
@@ -146,10 +168,12 @@ class KafkaProducerServiceImpl:
         finally:
             kafka_producer.flush()
             # kafka_producer.close()        # this command generates ERROR
-
+    # ---
     def start_producer_thread(self):
         """
         Method to start the producer thread.
         """
         producer_thread = threading.Thread(target=self.produce_metrics)
         producer_thread.start()
+
+# ----------- ABOVE: Actual Implementation of Kafka Producer with Node Exporter -----------
\ No newline at end of file
-- 
GitLab


From 062cc59b7e178ab67507fc4d29d09694a0a26bf4 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 7 May 2024 14:05:37 +0000
Subject: [PATCH 193/602] "TelemetryBackend" messages file added

---
 .../backend/tests/messagesBackend.py          | 46 +++++++++++++++++++
 1 file changed, 46 insertions(+)
 create mode 100644 src/telemetry_frontend/backend/tests/messagesBackend.py

diff --git a/src/telemetry_frontend/backend/tests/messagesBackend.py b/src/telemetry_frontend/backend/tests/messagesBackend.py
new file mode 100644
index 000000000..bfcebf0cc
--- /dev/null
+++ b/src/telemetry_frontend/backend/tests/messagesBackend.py
@@ -0,0 +1,46 @@
+# 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.
+
+
+def create_kafka_config():
+        """
+        No input parameter is requested
+        Returns the dict object with Kafka configs
+        """
+        _kafka_configs = dict()
+        _kafka_configs['bootstrap_servers'] = '127.0.0.1:9092'
+        _kafka_configs['exporter_endpoint'] = 'http://10.152.183.231:9100/metrics'
+        _kafka_configs['kafka_topic']       = 'metric-data'
+        _kafka_configs['run_duration']      = 20
+        _kafka_configs['fetch_interval']    = 4
+
+        return _kafka_configs
+
+def create_kafka_config_a(bootstrap_server, exporter_endpoint, kafka_topic, run_duration, fetch_interval):
+        """
+        Provide ...
+        Bootstrap_server IP address as String.
+        Exporter endpoint with port  address as String.
+        Kafka topic name as String.
+        Total duration of the test as Float.
+        Fetch_interval as Float.
+        """
+        _kafka_configs = dict()
+        _kafka_configs['bootstrap_servers'] = bootstrap_server
+        _kafka_configs['exporter_endpoint'] = exporter_endpoint
+        _kafka_configs['kafka_topic']       = kafka_topic
+        _kafka_configs['run_duration']      = run_duration
+        _kafka_configs['fetch_interval']    = fetch_interval
+
+        return _kafka_configs
\ No newline at end of file
-- 
GitLab


From 4b39f8d0b7a2d553b670d3a9f28d3e3a420f61bc Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 7 May 2024 14:06:53 +0000
Subject: [PATCH 194/602] "TelemetryBackend" tests "test_get_kafka_configs()",
 "test_get_kafka_configs_a()" and "test_export_collector_value()" are added.

---
 .../backend/tests/test_kafka_backend.py       | 51 +++++++++++++++++++
 1 file changed, 51 insertions(+)
 create mode 100644 src/telemetry_frontend/backend/tests/test_kafka_backend.py

diff --git a/src/telemetry_frontend/backend/tests/test_kafka_backend.py b/src/telemetry_frontend/backend/tests/test_kafka_backend.py
new file mode 100644
index 000000000..5caabb9e0
--- /dev/null
+++ b/src/telemetry_frontend/backend/tests/test_kafka_backend.py
@@ -0,0 +1,51 @@
+# 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 sys
+# print (sys.path)
+import logging
+from .messagesBackend import create_kafka_config, create_kafka_config_a
+from src.telemetry_frontend.tests.Messages import create_collector_request
+from src.telemetry_frontend.backend.service.KafkaProducerService import KafkaProducerService
+from src.telemetry_frontend.backend.service.KafkaProducerServiceImpl import KafkaProducerServiceImpl
+
+LOGGER = logging.getLogger(__name__)
+
+
+###########################
+# Tests Implementation of Telemetry Backend
+###########################
+def test_get_kafka_configs():
+    LOGGER.warning('test_get_kafka_configs requesting')
+    response = KafkaProducerService.generate_kafka_configs(
+        create_kafka_config()
+        )
+    LOGGER.debug(str(response))
+    assert isinstance(response, dict)
+
+def test_get_kafka_configs_a():
+    LOGGER.warning('test_get_kafka_configs_a requesting')
+    response = KafkaProducerService.generate_kafka_configs(
+        create_kafka_config_a('ip:port', 'ip:port', 'test_topic', 10, 3)
+        )
+    LOGGER.debug(str(response))
+    assert isinstance(response, dict)
+
+def test_export_collector_value():
+    LOGGER.warning('test_export_collector_value requesting')
+    response = KafkaProducerServiceImpl.export_collector_value(
+        create_collector_request('1')
+    )
+    LOGGER.debug(str(response))
+    assert isinstance(response, str)
\ No newline at end of file
-- 
GitLab


From dc32fbb82671af64b0d78d93ee4a59371a9bef92 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 7 May 2024 16:32:35 +0000
Subject: [PATCH 195/602] Device - OpenConfig SBI driver:

- Corrected Jinja template for edit-config interface/subinterface
---
 .../interface/subinterface/edit_config.xml    | 29 +++++++++----------
 1 file changed, 14 insertions(+), 15 deletions(-)

diff --git a/src/device/service/drivers/openconfig/templates/interface/subinterface/edit_config.xml b/src/device/service/drivers/openconfig/templates/interface/subinterface/edit_config.xml
index 20aecb90b..2d8d3ee07 100644
--- a/src/device/service/drivers/openconfig/templates/interface/subinterface/edit_config.xml
+++ b/src/device/service/drivers/openconfig/templates/interface/subinterface/edit_config.xml
@@ -1,5 +1,4 @@
-
+
     
         {{name}}
         {% if operation is defined and operation != 'delete' %}
@@ -31,20 +30,20 @@
                 
                 {% endif %}
                 {% if address_ip is defined %}
-                
-                    
+                
+                    
                         {% if mtu is defined %}{{mtu}}{% endif%}
-                    
-                    
-                        
-                            {{address_ip}}
-                            
-                                {{address_ip}}
-                                {{address_prefix}}
-                            
-                        
-                    
-                
+                    
+                    
+                        
+ {{address_ip}} + + {{address_ip}} + {{address_prefix}} + +
+
+ {% endif %} -- GitLab From 658b71b00cbc29adcd34fc3e73b138ee75c1b4c3 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Tue, 7 May 2024 16:52:40 +0000 Subject: [PATCH 196/602] Device - OpenConfig SBI driver: - Added test for IPInfusion OcNOS --- ...n_tests_locally-device-openconfig-ocnos.sh | 25 +++ .../tests/test_unitary_openconfig_ocnos.py | 210 ++++++++++++++++++ 2 files changed, 235 insertions(+) create mode 100755 scripts/run_tests_locally-device-openconfig-ocnos.sh create mode 100644 src/device/tests/test_unitary_openconfig_ocnos.py diff --git a/scripts/run_tests_locally-device-openconfig-ocnos.sh b/scripts/run_tests_locally-device-openconfig-ocnos.sh new file mode 100755 index 000000000..413691b85 --- /dev/null +++ b/scripts/run_tests_locally-device-openconfig-ocnos.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# 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. + + +PROJECTDIR=`pwd` + +cd $PROJECTDIR/src +RCFILE=$PROJECTDIR/coverage/.coveragerc + +# Run unitary tests and analyze coverage of code at same time +# 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 -o log_cli=true --verbose \ + device/tests/test_unitary_openconfig_ocnos.py diff --git a/src/device/tests/test_unitary_openconfig_ocnos.py b/src/device/tests/test_unitary_openconfig_ocnos.py new file mode 100644 index 000000000..5e02accdd --- /dev/null +++ b/src/device/tests/test_unitary_openconfig_ocnos.py @@ -0,0 +1,210 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 json, logging, os, pytest, time +from typing import Dict, Tuple +os.environ['DEVICE_EMULATED_ONLY'] = 'YES' + +# pylint: disable=wrong-import-position +from device.service.drivers.openconfig.OpenConfigDriver import OpenConfigDriver +#from device.service.driver_api._Driver import ( +# RESOURCE_ENDPOINTS, RESOURCE_INTERFACES, RESOURCE_NETWORK_INSTANCES, RESOURCE_ROUTING_POLICIES, RESOURCE_SERVICES +#) + +logging.basicConfig(level=logging.DEBUG) +#logging.getLogger('ncclient.operations.rpc').setLevel(logging.INFO) +#logging.getLogger('ncclient.transport.parser').setLevel(logging.INFO) + +LOGGER = logging.getLogger(__name__) + + +##### DRIVERS FIXTURE ################################################################################################## + +DEVICES = { + 'CSGW1': {'address': '10.1.1.86', 'port': 830, 'settings': { + 'username': 'ocnos', 'password': 'ocnos', + 'vendor': None, 'force_running': False, 'hostkey_verify': False, 'look_for_keys': False, 'allow_agent': False, + 'commit_per_rule': True, 'device_params': {'name': 'default'}, 'manager_params': {'timeout' : 120} + }}, + 'CSGW2': {'address': '10.1.1.87', 'port': 830, 'settings': { + 'username': 'ocnos', 'password': 'ocnos', + 'vendor': None, 'force_running': False, 'hostkey_verify': False, 'look_for_keys': False, 'allow_agent': False, + 'commit_per_rule': True, 'device_params': {'name': 'default'}, 'manager_params': {'timeout' : 120} + }}, +} + +@pytest.fixture(scope='session') +def drivers() -> Dict[str, OpenConfigDriver]: + _drivers : Dict[str, OpenConfigDriver] = dict() + for device_name, driver_params in DEVICES.items(): + driver = OpenConfigDriver(driver_params['address'], driver_params['port'], **(driver_params['settings'])) + driver.Connect() + _drivers[device_name] = driver + yield _drivers + time.sleep(1) + for _,driver in _drivers.items(): + driver.Disconnect() + + +def network_instance(ni_name, ni_type, ni_router_id=None, ni_route_distinguisher=None) -> Tuple[str, Dict]: + path = '/network_instance[{:s}]'.format(ni_name) + data = {'name': ni_name, 'type': ni_type} + if ni_router_id is not None: data['router_id'] = ni_router_id + if ni_route_distinguisher is not None: data['route_distinguisher'] = ni_route_distinguisher + return path, json.dumps(data) + +def network_instance_add_protocol_bgp(ni_name, ni_type, ni_router_id, ni_bgp_as, neighbors=[]) -> Tuple[str, Dict]: + path = '/network_instance[{:s}]/protocols[BGP]'.format(ni_name) + data = { + 'name': ni_name, 'type': ni_type, 'router_id': ni_router_id, 'identifier': 'BGP', + 'protocol_name': ni_bgp_as, 'as': ni_bgp_as + } + if len(neighbors) > 0: + data['neighbors'] = [ + {'ip_address': neighbor_ip_address, 'remote_as': neighbor_remote_as} + for neighbor_ip_address, neighbor_remote_as in neighbors + ] + return path, json.dumps(data) + +def network_instance_add_protocol_direct(ni_name, ni_type) -> Tuple[str, Dict]: + path = '/network_instance[{:s}]/protocols[DIRECTLY_CONNECTED]'.format(ni_name) + data = { + 'name': ni_name, 'type': ni_type, 'identifier': 'DIRECTLY_CONNECTED', + 'protocol_name': 'DIRECTLY_CONNECTED' + } + return path, json.dumps(data) + +def network_instance_add_protocol_static(ni_name, ni_type) -> Tuple[str, Dict]: + path = '/network_instance[{:s}]/protocols[STATIC]'.format(ni_name) + data = { + 'name': ni_name, 'type': ni_type, 'identifier': 'STATIC', + 'protocol_name': 'STATIC' + } + return path, json.dumps(data) + +#def network_instance_static_route(ni_name, prefix, next_hop, next_hop_index=0) -> Tuple[str, Dict]: +# path = '/network_instance[{:s}]/static_route[{:s}]'.format(ni_name, prefix) +# data = {'name': ni_name, 'prefix': prefix, 'next_hop': next_hop, 'next_hop_index': next_hop_index} +# return path, json.dumps(data) + +def network_instance_add_table_connection( + ni_name, src_protocol, dst_protocol, address_family, default_import_policy, bgp_as=None +) -> Tuple[str, Dict]: + path = '/network_instance[{:s}]/table_connections[{:s}][{:s}][{:s}]'.format( + ni_name, src_protocol, dst_protocol, address_family + ) + data = { + 'name': ni_name, 'src_protocol': src_protocol, 'dst_protocol': dst_protocol, + 'address_family': address_family, 'default_import_policy': default_import_policy, + } + if bgp_as is not None: data['as'] = bgp_as + return path, json.dumps(data) + +def interface( + name, index, description=None, if_type=None, vlan_id=None, mtu=None, ipv4_address_prefix=None, enabled=None +) -> Tuple[str, Dict]: + path = '/interface[{:s}]/subinterface[{:d}]'.format(name, index) + data = {'name': name, 'index': index} + if description is not None: data['description'] = description + if if_type is not None: data['type' ] = if_type + if vlan_id is not None: data['vlan_id' ] = vlan_id + if mtu is not None: data['mtu' ] = mtu + if enabled is not None: data['enabled' ] = enabled + if ipv4_address_prefix is not None: + ipv4_address, ipv4_prefix = ipv4_address_prefix + data['address_ip' ] = ipv4_address + data['address_prefix'] = ipv4_prefix + return path, json.dumps(data) + +def network_instance_interface(ni_name, ni_type, if_name, if_index) -> Tuple[str, Dict]: + path = '/network_instance[{:s}]/interface[{:s}.{:d}]'.format(ni_name, if_name, if_index) + data = {'name': ni_name, 'type': ni_type, 'id': if_name, 'interface': if_name, 'subinterface': if_index} + return path, json.dumps(data) + +def test_configure(drivers : Dict[str, OpenConfigDriver]): + #resources_to_get = [] + #resources_to_get = [RESOURCE_ENDPOINTS] + #resources_to_get = [RESOURCE_INTERFACES] + #resources_to_get = [RESOURCE_NETWORK_INSTANCES] + #resources_to_get = [RESOURCE_ROUTING_POLICIES] + #resources_to_get = [RESOURCE_SERVICES] + #LOGGER.info('resources_to_get = {:s}'.format(str(resources_to_get))) + #results_getconfig = driver.GetConfig(resources_to_get) + #LOGGER.info('results_getconfig = {:s}'.format(str(results_getconfig))) + + #csgw1_resources_to_set = [ + # network_instance('ecoc24', 'L3VRF', '192.168.150.1', '65001:1'), + # network_instance_add_protocol_direct('ecoc24', 'L3VRF'), + # network_instance_add_protocol_static('ecoc24', 'L3VRF'), + # network_instance_add_protocol_bgp('ecoc24', 'L3VRF', '192.168.150.1', '65001', neighbors=[ + # ('192.168.150.2', '65001') + # ]), + # network_instance_add_table_connection('ecoc24', 'DIRECTLY_CONNECTED', 'BGP', 'IPV4', 'ACCEPT_ROUTE', bgp_as='65001'), + # network_instance_add_table_connection('ecoc24', 'STATIC', 'BGP', 'IPV4', 'ACCEPT_ROUTE', bgp_as='65001'), + # + # interface('ce1', 0, if_type='ethernetCsmacd', mtu=1500), + # network_instance_interface('ecoc24', 'L3VRF', 'ce1', 0), + # interface('ce1', 0, if_type='ethernetCsmacd', mtu=1500, ipv4_address_prefix=('192.168.10.1', 24), enabled=True), + # + # interface('xe5', 0, if_type='ethernetCsmacd', mtu=1500), + # network_instance_interface('ecoc24', 'L3VRF', 'xe5', 0), + # interface('xe5', 0, if_type='ethernetCsmacd', mtu=1500, ipv4_address_prefix=('192.168.150.1', 24), enabled=True), + #] + #LOGGER.info('CSGW1 resources_to_set = {:s}'.format(str(csgw1_resources_to_set))) + #results_setconfig = drivers['CSGW1'].SetConfig(csgw1_resources_to_set) + #LOGGER.info('CSGW1 results_setconfig = {:s}'.format(str(results_setconfig))) + + #csgw2_resources_to_set = [ + # network_instance('ecoc24', 'L3VRF', '192.168.150.2', '65001:1'), + # network_instance_add_protocol_direct('ecoc24', 'L3VRF'), + # network_instance_add_protocol_static('ecoc24', 'L3VRF'), + # network_instance_add_protocol_bgp('ecoc24', 'L3VRF', '192.168.150.2', '65001', neighbors=[ + # ('192.168.150.1', '65001') + # ]), + # network_instance_add_table_connection('ecoc24', 'DIRECTLY_CONNECTED', 'BGP', 'IPV4', 'ACCEPT_ROUTE', bgp_as='65001'), + # network_instance_add_table_connection('ecoc24', 'STATIC', 'BGP', 'IPV4', 'ACCEPT_ROUTE', bgp_as='65001'), + # + # interface('ce1', 0, if_type='ethernetCsmacd', mtu=1500), + # network_instance_interface('ecoc24', 'L3VRF', 'ce1', 0), + # interface('ce1', 0, if_type='ethernetCsmacd', mtu=1500, ipv4_address_prefix=('192.168.20.1', 24), enabled=True), + # + # interface('xe5', 0, if_type='ethernetCsmacd', mtu=1500), + # network_instance_interface('ecoc24', 'L3VRF', 'xe5', 0), + # interface('xe5', 0, if_type='ethernetCsmacd', mtu=1500, ipv4_address_prefix=('192.168.150.2', 24), enabled=True), + #] + #LOGGER.info('CSGW2 resources_to_set = {:s}'.format(str(csgw2_resources_to_set))) + #results_setconfig = drivers['CSGW2'].SetConfig(csgw2_resources_to_set) + #LOGGER.info('CSGW2 results_setconfig = {:s}'.format(str(results_setconfig))) + + csgw1_resources_to_delete = [ + network_instance_interface('ecoc24', 'L3VRF', 'ce1', 0), + network_instance_interface('ecoc24', 'L3VRF', 'xe5', 0), + #interface('ce1', 0), + #interface('xe5', 0), + network_instance('ecoc24', 'L3VRF'), + ] + LOGGER.info('CSGW1 resources_to_delete = {:s}'.format(str(csgw1_resources_to_delete))) + results_deleteconfig = drivers['CSGW1'].DeleteConfig(csgw1_resources_to_delete) + LOGGER.info('CSGW1 results_deleteconfig = {:s}'.format(str(results_deleteconfig))) + + #csgw2_resources_to_delete = [ + # network_instance_interface('ecoc24', 'L3VRF', 'ce1', 0), + # network_instance_interface('ecoc24', 'L3VRF', 'xe5', 0), + # #interface('ce1', 0), + # #interface('xe5', 0), + # network_instance('ecoc24', 'L3VRF'), + #] + #LOGGER.info('CSGW2 resources_to_delete = {:s}'.format(str(csgw2_resources_to_delete))) + #results_deleteconfig = drivers['CSGW2'].DeleteConfig(csgw2_resources_to_delete) + #LOGGER.info('CSGW2 results_deleteconfig = {:s}'.format(str(results_deleteconfig))) -- GitLab From 1c03799fdf4730e2a6a389a3d9c3d82440b77ac9 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 8 May 2024 13:24:56 +0000 Subject: [PATCH 197/602] Move "Kafka_configs" initiation to "generate_kafka_configs" --- .../backend/service/KafkaProducerService.py | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/telemetry_frontend/backend/service/KafkaProducerService.py b/src/telemetry_frontend/backend/service/KafkaProducerService.py index 4e2d79347..0a76b2d99 100755 --- a/src/telemetry_frontend/backend/service/KafkaProducerService.py +++ b/src/telemetry_frontend/backend/service/KafkaProducerService.py @@ -19,25 +19,19 @@ class KafkaProducerService: Class to control Kafka producer functionality. """ def __init__(self): + pass - kafka_configs = self.generate_kafka_configs() - self.bootstrap_servers = kafka_configs['bootstrap_servers'] - self.node_exporter_endpoint = kafka_configs['node_exporter_endpoint'] - self.kafka_topic = kafka_configs['kafka_topic'] - self.run_duration = kafka_configs['run_duration'] - self.fetch_interval = kafka_configs['fetch_interval'] - - def generate_kafka_configs(self): # define the function to get every attribute + def generate_kafka_configs(self): """ Method to generate Kafka configurations """ create_kafka_configs = { - 'bootstrap_servers' : '127.0.0.1:9092', # Kafka broker address - Replace with your Kafka broker address - 'node_exporter_endpoint' : 'http://10.152.183.231:9100/metrics', # Node Exporter metrics endpoint - Replace with your Node Exporter endpoint - 'kafka_topic' : 'metric-data', # Kafka topic to produce to - 'run_duration' : 20, # Total duration to execute the producer - 'fetch_interval' : 4 # Time between two fetch requests + 'bootstrap_servers' : "test_server", # Kafka broker address - Replace with your Kafka broker address + 'exporter_endpoint' : "test_exporter", # Node Exporter metrics endpoint - Replace with your Node Exporter endpoint + 'kafka_topic' : "test_kafka_topic", # Kafka topic to produce to + 'run_duration' : 10, # Total duration to execute the producer + 'fetch_interval' : 2 # Time between two fetch requests } return create_kafka_configs -- GitLab From eb47527c6a668ce8d48086d8f9432c6ad949a19e Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 8 May 2024 13:28:28 +0000 Subject: [PATCH 198/602] update methods "export_collector_value" and "write_to_kafka" parameters and return type of "export_collector_value". --- .../service/KafkaProducerServiceImpl.py | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/telemetry_frontend/backend/service/KafkaProducerServiceImpl.py b/src/telemetry_frontend/backend/service/KafkaProducerServiceImpl.py index b6b55f913..da5513170 100755 --- a/src/telemetry_frontend/backend/service/KafkaProducerServiceImpl.py +++ b/src/telemetry_frontend/backend/service/KafkaProducerServiceImpl.py @@ -14,10 +14,10 @@ # limitations under the License. import time -import grpc import logging import requests import threading +from typing import Tuple from common.proto.context_pb2 import Empty from confluent_kafka import Producer, KafkaException from confluent_kafka.admin import AdminClient, NewTopic @@ -32,31 +32,34 @@ class KafkaProducerServiceImpl: Class to fetch metrics from Exporter and produce them to Kafka. """ - def __init__(self, bootstrap_servers, node_exporter_endpoint, kafka_topic, run_duration, fetch_interval): + def __init__(self, bootstrap_servers=None, exporter_endpoint=None, + kafka_topic=None, run_duration=None, fetch_interval=None): """ Constructor to initialize Kafka producer parameters. Args: bootstrap_servers (str): Kafka broker address. - node_exporter_endpoint (str): Node Exporter metrics endpoint. + exporter_endpoint (str): Node Exporter metrics endpoint. kafka_topic (str): Kafka topic to produce metrics to. run_interval (int): Time interval in seconds to run the producer. """ LOGGER.info('Init TelemetryBackendService') - self.bootstrap_servers = bootstrap_servers - self.node_exporter_endpoint = node_exporter_endpoint - self.kafka_topic = kafka_topic - self.run_duration = run_duration - self.fetch_interval = fetch_interval + self.bootstrap_servers = bootstrap_servers + self.exporter_endpoint = exporter_endpoint + self.kafka_topic = kafka_topic + self.run_duration = run_duration + self.fetch_interval = fetch_interval # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def export_collector_value(request: CollectorId) -> str: # type: ignore - response = str() - response = '-1' + def export_collector_value(request : Collector) -> Tuple[str, str]: # type: ignore + response = Tuple[str, str] + response = ('test collector Id', 'test collected value') # Metric to be fetched from endpoint based on Collector message return response # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def write_to_kafka(Collector, kpi_value) -> Empty: # type: ignore + def write_to_kafka(request: Tuple[str, str]) -> Empty: # type: ignore + # _collector_id, _collector_id_value = request + # write collector_id and collector_id value on the Kafka topic return Empty() # ----------- BELOW: Actual Implementation of Kafka Producer with Node Exporter ----------- @@ -69,7 +72,7 @@ class KafkaProducerServiceImpl: """ KPI = "node_network_receive_packets_total" try: - response = requests.get(self.node_exporter_endpoint) + response = requests.get(self.exporter_endpoint) if response.status_code == 200: # print(f"Metrics fetched sucessfully...") metrics = response.text -- GitLab From a7e1ddfbc2ee39936c83f2d6a2105ebfd97473bd Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 8 May 2024 13:29:03 +0000 Subject: [PATCH 199/602] Remove "create_kafka_config" message type --- .../backend/tests/messagesBackend.py | 34 ++++++------------- 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/src/telemetry_frontend/backend/tests/messagesBackend.py b/src/telemetry_frontend/backend/tests/messagesBackend.py index bfcebf0cc..ef1235383 100644 --- a/src/telemetry_frontend/backend/tests/messagesBackend.py +++ b/src/telemetry_frontend/backend/tests/messagesBackend.py @@ -13,34 +13,20 @@ # limitations under the License. -def create_kafka_config(): - """ - No input parameter is requested - Returns the dict object with Kafka configs - """ - _kafka_configs = dict() - _kafka_configs['bootstrap_servers'] = '127.0.0.1:9092' - _kafka_configs['exporter_endpoint'] = 'http://10.152.183.231:9100/metrics' - _kafka_configs['kafka_topic'] = 'metric-data' - _kafka_configs['run_duration'] = 20 - _kafka_configs['fetch_interval'] = 4 - - return _kafka_configs - -def create_kafka_config_a(bootstrap_server, exporter_endpoint, kafka_topic, run_duration, fetch_interval): +def create_kafka_config_a(bootstrap_server: str, exporter_endpoint: str, kafka_topic: str, + run_duration: int, fetch_interval: int): """ Provide ... Bootstrap_server IP address as String. Exporter endpoint with port address as String. Kafka topic name as String. - Total duration of the test as Float. - Fetch_interval as Float. + Total duration of the test as Int. + Fetch_interval as Int. """ - _kafka_configs = dict() - _kafka_configs['bootstrap_servers'] = bootstrap_server - _kafka_configs['exporter_endpoint'] = exporter_endpoint - _kafka_configs['kafka_topic'] = kafka_topic - _kafka_configs['run_duration'] = run_duration - _kafka_configs['fetch_interval'] = fetch_interval + _bootstrap_servers = bootstrap_server + _exporter_endpoint = exporter_endpoint + _kafka_topic = kafka_topic + _run_duration = run_duration + _fetch_interval = fetch_interval - return _kafka_configs \ No newline at end of file + return _bootstrap_servers, _exporter_endpoint, _kafka_topic, _run_duration, _fetch_interval -- GitLab From f82e44099a206d323c4415605527deb96d040ee2 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 8 May 2024 13:30:06 +0000 Subject: [PATCH 200/602] Test "test_get_kafka_configs_a" is removed and "test_write_to_kafka" is added --- .../backend/tests/test_kafka_backend.py | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/telemetry_frontend/backend/tests/test_kafka_backend.py b/src/telemetry_frontend/backend/tests/test_kafka_backend.py index 5caabb9e0..e64a65ccd 100644 --- a/src/telemetry_frontend/backend/tests/test_kafka_backend.py +++ b/src/telemetry_frontend/backend/tests/test_kafka_backend.py @@ -15,8 +15,9 @@ # import sys # print (sys.path) import logging -from .messagesBackend import create_kafka_config, create_kafka_config_a -from src.telemetry_frontend.tests.Messages import create_collector_request +from typing import Tuple +from common.proto.context_pb2 import Empty +from src.telemetry_frontend.tests.Messages import create_collector_request, create_collector_id from src.telemetry_frontend.backend.service.KafkaProducerService import KafkaProducerService from src.telemetry_frontend.backend.service.KafkaProducerServiceImpl import KafkaProducerServiceImpl @@ -28,17 +29,8 @@ LOGGER = logging.getLogger(__name__) ########################### def test_get_kafka_configs(): LOGGER.warning('test_get_kafka_configs requesting') - response = KafkaProducerService.generate_kafka_configs( - create_kafka_config() - ) - LOGGER.debug(str(response)) - assert isinstance(response, dict) - -def test_get_kafka_configs_a(): - LOGGER.warning('test_get_kafka_configs_a requesting') - response = KafkaProducerService.generate_kafka_configs( - create_kafka_config_a('ip:port', 'ip:port', 'test_topic', 10, 3) - ) + KafkaProducerServiceObj = KafkaProducerService() + response = KafkaProducerServiceObj.generate_kafka_configs() LOGGER.debug(str(response)) assert isinstance(response, dict) @@ -48,4 +40,11 @@ def test_export_collector_value(): create_collector_request('1') ) LOGGER.debug(str(response)) - assert isinstance(response, str) \ No newline at end of file + assert isinstance(response, Tuple) + +def test_write_to_kafka(): + LOGGER.warning('test_write_to_kafka requesting') + collector_value = KafkaProducerServiceImpl.export_collector_value(create_collector_request('1')) + response = KafkaProducerServiceImpl.write_to_kafka(collector_value) # type: ignore (don't know why warning here) + LOGGER.debug(str(response)) + assert isinstance(response, Empty) -- GitLab From 05194f29c452c8db23ce30443c92f9da05ce1026 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 8 May 2024 13:32:46 +0000 Subject: [PATCH 201/602] Added parameter type in methods "create_collector_id" and "create_collector_request". Replaced "kpi_id.kpi_id.uuid" with "collector_id.collector_id.uuid" in methods "create_collector_request_a" and "create_collector_request_b". --- src/telemetry_frontend/tests/Messages.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/telemetry_frontend/tests/Messages.py b/src/telemetry_frontend/tests/Messages.py index 86c869834..d323aa7fd 100644 --- a/src/telemetry_frontend/tests/Messages.py +++ b/src/telemetry_frontend/tests/Messages.py @@ -15,12 +15,12 @@ from common.proto import telemetry_frontend_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType -def create_collector_id(coll_id_str): +def create_collector_id(coll_id_str : str): _collector_id = telemetry_frontend_pb2.CollectorId() _collector_id.collector_id.uuid = str(coll_id_str) return _collector_id -def create_collector_request(coll_id_str): +def create_collector_request(coll_id_str : str): _create_collector_request = telemetry_frontend_pb2.Collector() _create_collector_request.collector_id.collector_id.uuid = str(coll_id_str) _create_collector_request.kpi_id.kpi_id.uuid = 'KPIid' + str(coll_id_str) @@ -29,15 +29,16 @@ def create_collector_request(coll_id_str): return _create_collector_request def create_collector_request_a(): - _create_collector_request_a = telemetry_frontend_pb2.Collector() - _create_collector_request_a.kpi_id.kpi_id.uuid = "-1" + _create_collector_request_a = telemetry_frontend_pb2.Collector() + _create_collector_request_a.collector_id.collector_id.uuid = "-1" return _create_collector_request_a def create_collector_request_b(str_kpi_id, coll_duration_s, coll_interval_s): - _create_collector_request_b = telemetry_frontend_pb2.Collector() - _create_collector_request_b.kpi_id.kpi_id.uuid = str_kpi_id - _create_collector_request_b.duration_s = coll_duration_s - _create_collector_request_b.interval_s = coll_interval_s + _create_collector_request_b = telemetry_frontend_pb2.Collector() + _create_collector_request_b.collector_id.collector_id.uuid = '-1' + _create_collector_request_b.kpi_id.kpi_id.uuid = str_kpi_id + _create_collector_request_b.duration_s = coll_duration_s + _create_collector_request_b.interval_s = coll_interval_s return _create_collector_request_b def create_collector_filter(): -- GitLab From 0bcb839ea4cf561431b3a7111de4bde13e942fdb Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 8 May 2024 13:52:53 +0000 Subject: [PATCH 202/602] Two imports were missing --- src/telemetry/frontend/service/__main__.py | 71 ++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/telemetry/frontend/service/__main__.py diff --git a/src/telemetry/frontend/service/__main__.py b/src/telemetry/frontend/service/__main__.py new file mode 100644 index 000000000..afc381e09 --- /dev/null +++ b/src/telemetry/frontend/service/__main__.py @@ -0,0 +1,71 @@ +# 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 signal +import sys +import logging, threading +from .TelemetryFrontendService import TelemetryFrontendService +from monitoring.service.NameMapping import NameMapping +from monitoring.service.EventTools import EventsDeviceCollector +from common.Settings import ( + get_log_level, wait_for_environment_variables, get_env_var_name, + get_metrics_port ) + +terminate = threading.Event() +LOGGER = None + +def signal_handler(signal, frame): # pylint: disable=redefined-outer-name + LOGGER.warning('Terminate signal received') + terminate.set() + +def main(): + global LOGGER + + log_level = get_log_level() + logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") + LOGGER = logging.getLogger(__name__) + +# ------- will be added later -------------- + # wait_for_environment_variables([ + # get_env_var_name + + + # ]) +# ------- will be added later -------------- + + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + + LOGGER.info('Starting...') + + # Start metrics server + metrics_port = get_metrics_port() + start_http_server(metrics_port) + + name_mapping = NameMapping() + + grpc_service = TelemetryFrontendService(name_mapping) + grpc_service.start() + + # Wait for Ctrl+C or termination signal + while not terminate.wait(timeout=1.0): pass + + LOGGER.info('Terminating...') + grpc_service.stop() + + LOGGER.info('Bye') + return 0 + +if __name__ == '__main__': + sys.exit(main()) \ No newline at end of file -- GitLab From f05d40206e1137c3d10de79b5203bd981d8ff87f Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 8 May 2024 13:55:10 +0000 Subject: [PATCH 203/602] folder name changed from "telemetry_frontend" to "frontend", and "client", "service" and "tests" move inside the "frontend" --- .../__init__.py | 0 .../backend/__init__.py | 0 .../backend/service/KafkaProducerService.py | 0 .../service/KafkaProducerServiceImpl.py | 0 .../backend/service/__init__.py | 0 .../backend/tests/__init__.py | 0 .../backend/tests/messagesBackend.py | 0 .../backend/tests/test_kafka_backend.py | 6 +- src/telemetry/frontend/__init__.py | 15 ++++ .../client/TelemetryFrontendClient.py | 0 .../frontend}/client/__init__.py | 0 .../service/TelemetryFrontendService.py | 2 +- .../TelemetryFrontendServiceServicerImpl.py | 0 .../frontend}/service/__init__.py | 0 .../frontend}/tests/Messages.py | 0 .../frontend}/tests/__init__.py | 0 .../frontend}/tests/test_unitary.py | 6 +- .../requirements.in | 0 .../telemetry_virenv.txt | 0 src/telemetry_frontend/service/__main__.py | 69 ------------------- 20 files changed, 22 insertions(+), 76 deletions(-) rename src/{telemetry_frontend => telemetry}/__init__.py (100%) rename src/{telemetry_frontend => telemetry}/backend/__init__.py (100%) rename src/{telemetry_frontend => telemetry}/backend/service/KafkaProducerService.py (100%) rename src/{telemetry_frontend => telemetry}/backend/service/KafkaProducerServiceImpl.py (100%) rename src/{telemetry_frontend => telemetry}/backend/service/__init__.py (100%) rename src/{telemetry_frontend => telemetry}/backend/tests/__init__.py (100%) rename src/{telemetry_frontend => telemetry}/backend/tests/messagesBackend.py (100%) rename src/{telemetry_frontend => telemetry}/backend/tests/test_kafka_backend.py (87%) create mode 100644 src/telemetry/frontend/__init__.py rename src/{telemetry_frontend => telemetry/frontend}/client/TelemetryFrontendClient.py (100%) rename src/{telemetry_frontend => telemetry/frontend}/client/__init__.py (100%) rename src/{telemetry_frontend => telemetry/frontend}/service/TelemetryFrontendService.py (95%) rename src/{telemetry_frontend => telemetry/frontend}/service/TelemetryFrontendServiceServicerImpl.py (100%) rename src/{telemetry_frontend => telemetry/frontend}/service/__init__.py (100%) rename src/{telemetry_frontend => telemetry/frontend}/tests/Messages.py (100%) rename src/{telemetry_frontend => telemetry/frontend}/tests/__init__.py (100%) rename src/{telemetry_frontend => telemetry/frontend}/tests/test_unitary.py (96%) rename src/{telemetry_frontend => telemetry}/requirements.in (100%) rename src/{telemetry_frontend => telemetry}/telemetry_virenv.txt (100%) delete mode 100644 src/telemetry_frontend/service/__main__.py diff --git a/src/telemetry_frontend/__init__.py b/src/telemetry/__init__.py similarity index 100% rename from src/telemetry_frontend/__init__.py rename to src/telemetry/__init__.py diff --git a/src/telemetry_frontend/backend/__init__.py b/src/telemetry/backend/__init__.py similarity index 100% rename from src/telemetry_frontend/backend/__init__.py rename to src/telemetry/backend/__init__.py diff --git a/src/telemetry_frontend/backend/service/KafkaProducerService.py b/src/telemetry/backend/service/KafkaProducerService.py similarity index 100% rename from src/telemetry_frontend/backend/service/KafkaProducerService.py rename to src/telemetry/backend/service/KafkaProducerService.py diff --git a/src/telemetry_frontend/backend/service/KafkaProducerServiceImpl.py b/src/telemetry/backend/service/KafkaProducerServiceImpl.py similarity index 100% rename from src/telemetry_frontend/backend/service/KafkaProducerServiceImpl.py rename to src/telemetry/backend/service/KafkaProducerServiceImpl.py diff --git a/src/telemetry_frontend/backend/service/__init__.py b/src/telemetry/backend/service/__init__.py similarity index 100% rename from src/telemetry_frontend/backend/service/__init__.py rename to src/telemetry/backend/service/__init__.py diff --git a/src/telemetry_frontend/backend/tests/__init__.py b/src/telemetry/backend/tests/__init__.py similarity index 100% rename from src/telemetry_frontend/backend/tests/__init__.py rename to src/telemetry/backend/tests/__init__.py diff --git a/src/telemetry_frontend/backend/tests/messagesBackend.py b/src/telemetry/backend/tests/messagesBackend.py similarity index 100% rename from src/telemetry_frontend/backend/tests/messagesBackend.py rename to src/telemetry/backend/tests/messagesBackend.py diff --git a/src/telemetry_frontend/backend/tests/test_kafka_backend.py b/src/telemetry/backend/tests/test_kafka_backend.py similarity index 87% rename from src/telemetry_frontend/backend/tests/test_kafka_backend.py rename to src/telemetry/backend/tests/test_kafka_backend.py index e64a65ccd..05174da2b 100644 --- a/src/telemetry_frontend/backend/tests/test_kafka_backend.py +++ b/src/telemetry/backend/tests/test_kafka_backend.py @@ -17,9 +17,9 @@ import logging from typing import Tuple from common.proto.context_pb2 import Empty -from src.telemetry_frontend.tests.Messages import create_collector_request, create_collector_id -from src.telemetry_frontend.backend.service.KafkaProducerService import KafkaProducerService -from src.telemetry_frontend.backend.service.KafkaProducerServiceImpl import KafkaProducerServiceImpl +from src.telemetry.frontend.tests.Messages import create_collector_request, create_collector_id +from src.telemetry.backend.service.KafkaProducerService import KafkaProducerService +from src.telemetry.backend.service.KafkaProducerServiceImpl import KafkaProducerServiceImpl LOGGER = logging.getLogger(__name__) diff --git a/src/telemetry/frontend/__init__.py b/src/telemetry/frontend/__init__.py new file mode 100644 index 000000000..6a8f39746 --- /dev/null +++ b/src/telemetry/frontend/__init__.py @@ -0,0 +1,15 @@ + +# 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/telemetry_frontend/client/TelemetryFrontendClient.py b/src/telemetry/frontend/client/TelemetryFrontendClient.py similarity index 100% rename from src/telemetry_frontend/client/TelemetryFrontendClient.py rename to src/telemetry/frontend/client/TelemetryFrontendClient.py diff --git a/src/telemetry_frontend/client/__init__.py b/src/telemetry/frontend/client/__init__.py similarity index 100% rename from src/telemetry_frontend/client/__init__.py rename to src/telemetry/frontend/client/__init__.py diff --git a/src/telemetry_frontend/service/TelemetryFrontendService.py b/src/telemetry/frontend/service/TelemetryFrontendService.py similarity index 95% rename from src/telemetry_frontend/service/TelemetryFrontendService.py rename to src/telemetry/frontend/service/TelemetryFrontendService.py index a0ae704d3..522d125e6 100644 --- a/src/telemetry_frontend/service/TelemetryFrontendService.py +++ b/src/telemetry/frontend/service/TelemetryFrontendService.py @@ -17,7 +17,7 @@ from common.Settings import get_service_port_grpc from monitoring.service.NameMapping import NameMapping from common.tools.service.GenericGrpcService import GenericGrpcService from common.proto.telemetry_frontend_pb2_grpc import add_TelemetryFrontendServiceServicer_to_server -from telemetry_frontend.service.TelemetryFrontendServiceServicerImpl import TelemetryFrontendServiceServicerImpl +from telemetry.frontend.service.TelemetryFrontendServiceServicerImpl import TelemetryFrontendServiceServicerImpl class TelemetryFrontendService(GenericGrpcService): diff --git a/src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py similarity index 100% rename from src/telemetry_frontend/service/TelemetryFrontendServiceServicerImpl.py rename to src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py diff --git a/src/telemetry_frontend/service/__init__.py b/src/telemetry/frontend/service/__init__.py similarity index 100% rename from src/telemetry_frontend/service/__init__.py rename to src/telemetry/frontend/service/__init__.py diff --git a/src/telemetry_frontend/tests/Messages.py b/src/telemetry/frontend/tests/Messages.py similarity index 100% rename from src/telemetry_frontend/tests/Messages.py rename to src/telemetry/frontend/tests/Messages.py diff --git a/src/telemetry_frontend/tests/__init__.py b/src/telemetry/frontend/tests/__init__.py similarity index 100% rename from src/telemetry_frontend/tests/__init__.py rename to src/telemetry/frontend/tests/__init__.py diff --git a/src/telemetry_frontend/tests/test_unitary.py b/src/telemetry/frontend/tests/test_unitary.py similarity index 96% rename from src/telemetry_frontend/tests/test_unitary.py rename to src/telemetry/frontend/tests/test_unitary.py index 68467590f..312695659 100644 --- a/src/telemetry_frontend/tests/test_unitary.py +++ b/src/telemetry/frontend/tests/test_unitary.py @@ -27,9 +27,9 @@ from common.tests.MockServicerImpl_Context import MockServicerImpl_Context from common.Settings import ( get_service_port_grpc, get_env_var_name, ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC) -from telemetry_frontend.client.TelemetryFrontendClient import TelemetryFrontendClient -from telemetry_frontend.service.TelemetryFrontendService import TelemetryFrontendService -from telemetry_frontend.tests.Messages import ( create_collector_id, create_collector_request, +from telemetry.frontend.client.TelemetryFrontendClient import TelemetryFrontendClient +from telemetry.frontend.service.TelemetryFrontendService import TelemetryFrontendService +from telemetry.frontend.tests.Messages import ( create_collector_id, create_collector_request, create_collector_filter, create_collector_request_a, create_collector_request_b) from device.client.DeviceClient import DeviceClient diff --git a/src/telemetry_frontend/requirements.in b/src/telemetry/requirements.in similarity index 100% rename from src/telemetry_frontend/requirements.in rename to src/telemetry/requirements.in diff --git a/src/telemetry_frontend/telemetry_virenv.txt b/src/telemetry/telemetry_virenv.txt similarity index 100% rename from src/telemetry_frontend/telemetry_virenv.txt rename to src/telemetry/telemetry_virenv.txt diff --git a/src/telemetry_frontend/service/__main__.py b/src/telemetry_frontend/service/__main__.py deleted file mode 100644 index 9b5fe70de..000000000 --- a/src/telemetry_frontend/service/__main__.py +++ /dev/null @@ -1,69 +0,0 @@ -# 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 logging, threading -from .TelemetryFrontendService import TelemetryFrontendService -from monitoring.service.NameMapping import NameMapping -from monitoring.service.EventTools import EventsDeviceCollector -from common.Settings import ( - get_log_level, wait_for_environment_variables, get_env_var_name, - get_metrics_port ) - -terminate = threading.Event() -LOGGER = None - -def signal_handler(signal, frame): # pylint: disable=redefined-outer-name - LOGGER.warning('Terminate signal received') - terminate.set() - -def main(): - global LOGGER - - log_level = get_log_level() - logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") - LOGGER = logging.getLogger(__name__) - -# ------- will be added later -------------- - # wait_for_environment_variables([ - # get_env_var_name - - - # ]) -# ------- will be added later -------------- - - signal.signal(signal.SIGINT, signal_handler) - signal.signal(signal.SIGTERM, signal_handler) - - LOGGER.info('Starting...') - - # Start metrics server - metrics_port = get_metrics_port() - start_http_server(metrics_port) - - name_mapping = NameMapping() - - grpc_service = TelemetryFrontendService(name_mapping) - grpc_service.start() - - # Wait for Ctrl+C or termination signal - while not terminate.wait(timeout=1.0): pass - - LOGGER.info('Terminating...') - grpc_service.stop() - - LOGGER.info('Bye') - return 0 - -if __name__ == '__main__': - sys.exit(main()) \ No newline at end of file -- GitLab From 10a7540ceab14adb8abad0c751bb3207dcdb90bf Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 8 May 2024 14:20:48 +0000 Subject: [PATCH 204/602] "KafkaProducerService" and "KafkaProducerServiceImpl" class name changed to "TelemetryBackendService" and "TelemetryBackendServiceImpl" respectivily --- ...rService.py => TelemetryBackendService.py} | 18 +---- ...Impl.py => TelemetryBackendServiceImpl.py} | 9 +-- src/telemetry/backend/service/__main__.py | 72 +++++++++++++++++++ .../backend/tests/test_kafka_backend.py | 12 ++-- src/telemetry/frontend/service/__main__.py | 3 +- 5 files changed, 82 insertions(+), 32 deletions(-) rename src/telemetry/backend/service/{KafkaProducerService.py => TelemetryBackendService.py} (64%) rename src/telemetry/backend/service/{KafkaProducerServiceImpl.py => TelemetryBackendServiceImpl.py} (96%) create mode 100644 src/telemetry/backend/service/__main__.py diff --git a/src/telemetry/backend/service/KafkaProducerService.py b/src/telemetry/backend/service/TelemetryBackendService.py similarity index 64% rename from src/telemetry/backend/service/KafkaProducerService.py rename to src/telemetry/backend/service/TelemetryBackendService.py index 0a76b2d99..8e6fb243e 100755 --- a/src/telemetry/backend/service/KafkaProducerService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -12,9 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from .KafkaProducerServiceImpl import KafkaProducerServiceImpl - -class KafkaProducerService: +class TelemetryBackendService: """ Class to control Kafka producer functionality. """ @@ -35,19 +33,5 @@ class KafkaProducerService: } return create_kafka_configs - def run_producer(self): - """ - Method to create KafkaProducerServiceImpl object and start producer. - """ - # Create NodeExporterProducer object and run start_producer_thread - producer = KafkaProducerServiceImpl(self.bootstrap_servers, self.node_exporter_endpoint, - self.kafka_topic, self.run_duration, self.fetch_interval - ) - # producer.start_producer_thread() # if threading is required - producer.produce_metrics() # if threading is not required -if __name__ == "__main__": - # Create Kafka producer service object and run producer - kafka_controller = KafkaProducerService() - kafka_controller.run_producer() diff --git a/src/telemetry/backend/service/KafkaProducerServiceImpl.py b/src/telemetry/backend/service/TelemetryBackendServiceImpl.py similarity index 96% rename from src/telemetry/backend/service/KafkaProducerServiceImpl.py rename to src/telemetry/backend/service/TelemetryBackendServiceImpl.py index da5513170..ea57f6167 100755 --- a/src/telemetry/backend/service/KafkaProducerServiceImpl.py +++ b/src/telemetry/backend/service/TelemetryBackendServiceImpl.py @@ -27,7 +27,7 @@ from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_m LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('Telemetry', 'TelemetryBackend') -class KafkaProducerServiceImpl: +class TelemetryBackendServiceImpl: """ Class to fetch metrics from Exporter and produce them to Kafka. """ @@ -171,12 +171,5 @@ class KafkaProducerServiceImpl: finally: kafka_producer.flush() # kafka_producer.close() # this command generates ERROR - # --- - def start_producer_thread(self): - """ - Method to start the producer thread. - """ - producer_thread = threading.Thread(target=self.produce_metrics) - producer_thread.start() # ----------- ABOVE: Actual Implementation of Kafka Producer with Node Exporter ----------- \ No newline at end of file diff --git a/src/telemetry/backend/service/__main__.py b/src/telemetry/backend/service/__main__.py new file mode 100644 index 000000000..10c3f76d1 --- /dev/null +++ b/src/telemetry/backend/service/__main__.py @@ -0,0 +1,72 @@ +# 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 sys +import signal +import logging +import threading +from prometheus_client import start_http_server +from monitoring.service.NameMapping import NameMapping +from .KafkaProducerService import KafkaProducerService +from common.Settings import ( + get_log_level, + get_metrics_port) + +terminate = threading.Event() +LOGGER = None + +def signal_handler(signal, frame): # pylint: disable=redefined-outer-name + LOGGER.warning('Terminate signal received') + terminate.set() + +def main(): + global LOGGER + + log_level = get_log_level() + logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") + LOGGER = logging.getLogger(__name__) + +# ------- will be added later -------------- + # wait_for_environment_variables([ + # get_env_var_name + + + # ]) +# ------- will be added later -------------- + + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + + LOGGER.info('Starting Telemetry Backend...') + + # Start metrics server + metrics_port = get_metrics_port() + start_http_server(metrics_port) + + name_mapping = NameMapping() + + grpc_service = KafkaProducerService(name_mapping) + grpc_service.start() + + # Wait for Ctrl+C or termination signal + while not terminate.wait(timeout=1.0): pass + + LOGGER.info('Terminating...') + grpc_service.stop() + + LOGGER.info('Bye') + return 0 + +if __name__ == '__main__': + sys.exit(main()) \ No newline at end of file diff --git a/src/telemetry/backend/tests/test_kafka_backend.py b/src/telemetry/backend/tests/test_kafka_backend.py index 05174da2b..ac49bc30f 100644 --- a/src/telemetry/backend/tests/test_kafka_backend.py +++ b/src/telemetry/backend/tests/test_kafka_backend.py @@ -18,8 +18,8 @@ import logging from typing import Tuple from common.proto.context_pb2 import Empty from src.telemetry.frontend.tests.Messages import create_collector_request, create_collector_id -from src.telemetry.backend.service.KafkaProducerService import KafkaProducerService -from src.telemetry.backend.service.KafkaProducerServiceImpl import KafkaProducerServiceImpl +from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService +from src.telemetry.backend.service.TelemetryBackendServiceImpl import TelemetryBackendServiceImpl LOGGER = logging.getLogger(__name__) @@ -29,14 +29,14 @@ LOGGER = logging.getLogger(__name__) ########################### def test_get_kafka_configs(): LOGGER.warning('test_get_kafka_configs requesting') - KafkaProducerServiceObj = KafkaProducerService() + KafkaProducerServiceObj = TelemetryBackendService() response = KafkaProducerServiceObj.generate_kafka_configs() LOGGER.debug(str(response)) assert isinstance(response, dict) def test_export_collector_value(): LOGGER.warning('test_export_collector_value requesting') - response = KafkaProducerServiceImpl.export_collector_value( + response = TelemetryBackendServiceImpl.export_collector_value( create_collector_request('1') ) LOGGER.debug(str(response)) @@ -44,7 +44,7 @@ def test_export_collector_value(): def test_write_to_kafka(): LOGGER.warning('test_write_to_kafka requesting') - collector_value = KafkaProducerServiceImpl.export_collector_value(create_collector_request('1')) - response = KafkaProducerServiceImpl.write_to_kafka(collector_value) # type: ignore (don't know why warning here) + collector_value = TelemetryBackendServiceImpl.export_collector_value(create_collector_request('1')) + response = TelemetryBackendServiceImpl.write_to_kafka(collector_value) # type: ignore (don't know why warning here) LOGGER.debug(str(response)) assert isinstance(response, Empty) diff --git a/src/telemetry/frontend/service/__main__.py b/src/telemetry/frontend/service/__main__.py index afc381e09..0f48a4de1 100644 --- a/src/telemetry/frontend/service/__main__.py +++ b/src/telemetry/frontend/service/__main__.py @@ -15,8 +15,9 @@ import signal import sys import logging, threading -from .TelemetryFrontendService import TelemetryFrontendService +from prometheus_client import start_http_server from monitoring.service.NameMapping import NameMapping +from .TelemetryFrontendService import TelemetryFrontendService from monitoring.service.EventTools import EventsDeviceCollector from common.Settings import ( get_log_level, wait_for_environment_variables, get_env_var_name, -- GitLab From f52e3126a4de88469d949245e8ca5fe91166dbf0 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 9 May 2024 11:03:38 +0000 Subject: [PATCH 205/602] Telemetry Backend test path updated --- scripts/run_tests_locally-telemetry-backend.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/run_tests_locally-telemetry-backend.sh b/scripts/run_tests_locally-telemetry-backend.sh index cbebd6807..34e9e0542 100755 --- a/scripts/run_tests_locally-telemetry-backend.sh +++ b/scripts/run_tests_locally-telemetry-backend.sh @@ -25,4 +25,4 @@ cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc python3 -m pytest --log-level=INFO --verbose \ - telemetry_frontend/backend/tests/test_kafka_backend.py \ No newline at end of file + telemetry/backend/tests/testTelemetryBackend.py \ No newline at end of file -- GitLab From d2df9b75f9ad52dc40a6e139ebadfd117b2efc16 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 9 May 2024 11:05:52 +0000 Subject: [PATCH 206/602] Not required in service --- src/telemetry/backend/service/__main__.py | 72 ----------------------- 1 file changed, 72 deletions(-) delete mode 100644 src/telemetry/backend/service/__main__.py diff --git a/src/telemetry/backend/service/__main__.py b/src/telemetry/backend/service/__main__.py deleted file mode 100644 index 10c3f76d1..000000000 --- a/src/telemetry/backend/service/__main__.py +++ /dev/null @@ -1,72 +0,0 @@ -# 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 sys -import signal -import logging -import threading -from prometheus_client import start_http_server -from monitoring.service.NameMapping import NameMapping -from .KafkaProducerService import KafkaProducerService -from common.Settings import ( - get_log_level, - get_metrics_port) - -terminate = threading.Event() -LOGGER = None - -def signal_handler(signal, frame): # pylint: disable=redefined-outer-name - LOGGER.warning('Terminate signal received') - terminate.set() - -def main(): - global LOGGER - - log_level = get_log_level() - logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") - LOGGER = logging.getLogger(__name__) - -# ------- will be added later -------------- - # wait_for_environment_variables([ - # get_env_var_name - - - # ]) -# ------- will be added later -------------- - - signal.signal(signal.SIGINT, signal_handler) - signal.signal(signal.SIGTERM, signal_handler) - - LOGGER.info('Starting Telemetry Backend...') - - # Start metrics server - metrics_port = get_metrics_port() - start_http_server(metrics_port) - - name_mapping = NameMapping() - - grpc_service = KafkaProducerService(name_mapping) - grpc_service.start() - - # Wait for Ctrl+C or termination signal - while not terminate.wait(timeout=1.0): pass - - LOGGER.info('Terminating...') - grpc_service.stop() - - LOGGER.info('Bye') - return 0 - -if __name__ == '__main__': - sys.exit(main()) \ No newline at end of file -- GitLab From 45f62a560db3115e343fbd04cae7ac8617a8d184 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 9 May 2024 11:07:55 +0000 Subject: [PATCH 207/602] basic defination is added into both "export_collector_value" and "write_to_kafka" function --- .../service/TelemetryBackendServiceImpl.py | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/telemetry/backend/service/TelemetryBackendServiceImpl.py b/src/telemetry/backend/service/TelemetryBackendServiceImpl.py index ea57f6167..abcc30baf 100755 --- a/src/telemetry/backend/service/TelemetryBackendServiceImpl.py +++ b/src/telemetry/backend/service/TelemetryBackendServiceImpl.py @@ -16,16 +16,17 @@ import time import logging import requests -import threading from typing import Tuple from common.proto.context_pb2 import Empty -from confluent_kafka import Producer, KafkaException +from confluent_kafka import Producer as KafkaProducer +from confluent_kafka import KafkaException from confluent_kafka.admin import AdminClient, NewTopic from common.proto.telemetry_frontend_pb2 import Collector, CollectorId from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('Telemetry', 'TelemetryBackend') +ACTIVE_KAFKA_PRODUCERS = [] # list of active kafka producers class TelemetryBackendServiceImpl: """ @@ -51,17 +52,29 @@ class TelemetryBackendServiceImpl: self.fetch_interval = fetch_interval # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def export_collector_value(request : Collector) -> Tuple[str, str]: # type: ignore - response = Tuple[str, str] - response = ('test collector Id', 'test collected value') # Metric to be fetched from endpoint based on Collector message + def export_collector_value(self, request : Collector) -> Tuple[str, str]: # type: ignore + response = Tuple[str, str] + collector_id = str('test collector Id') + collected_Value = str('test collected value') # Metric to be fetched from endpoint based on Collector message + response = (collector_id, collected_Value) return response # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def write_to_kafka(request: Tuple[str, str]) -> Empty: # type: ignore + def write_to_kafka(self, request: Tuple[str, str]) -> KafkaProducer: + (collector_id, collector_value) = request + response = KafkaProducer({'bootstrap.servers': self.bootstrap_servers}) # _collector_id, _collector_id_value = request # write collector_id and collector_id value on the Kafka topic - return Empty() + + # get kafka bootstrap server and topic name + # write to kafka topic + return response + + def stop_producer(self, request: KafkaProducer) -> Empty: # type: ignore + # flush and close kafka producer object + return Empty() + # ----------- BELOW: Actual Implementation of Kafka Producer with Node Exporter ----------- def fetch_node_exporter_metrics(self): @@ -72,7 +85,7 @@ class TelemetryBackendServiceImpl: """ KPI = "node_network_receive_packets_total" try: - response = requests.get(self.exporter_endpoint) + response = requests.get(self.exporter_endpoint) # type: ignore if response.status_code == 200: # print(f"Metrics fetched sucessfully...") metrics = response.text @@ -148,7 +161,7 @@ class TelemetryBackendServiceImpl: admin_client = AdminClient(conf) self.create_topic_if_not_exists(admin_client) - kafka_producer = Producer(conf) + kafka_producer = KafkaProducer(conf) try: start_time = time.time() @@ -161,11 +174,11 @@ class TelemetryBackendServiceImpl: # print("Metrics produced to Kafka topic") # Check if the specified run duration has elapsed - if time.time() - start_time >= self.run_duration: + if time.time() - start_time >= self.run_duration: # type: ignore break # waiting time until next fetch - time.sleep(self.fetch_interval) + time.sleep(self.fetch_interval) # type: ignore except KeyboardInterrupt: print("Keyboard interrupt detected. Exiting...") finally: -- GitLab From 6bb6d617ce7fea549f5506beb57989d9d6033f6c Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 9 May 2024 11:08:43 +0000 Subject: [PATCH 208/602] file nae change to "testTelemetryBackend" --- ...fka_backend.py => testTelemetryBackend.py} | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) rename src/telemetry/backend/tests/{test_kafka_backend.py => testTelemetryBackend.py} (63%) diff --git a/src/telemetry/backend/tests/test_kafka_backend.py b/src/telemetry/backend/tests/testTelemetryBackend.py similarity index 63% rename from src/telemetry/backend/tests/test_kafka_backend.py rename to src/telemetry/backend/tests/testTelemetryBackend.py index ac49bc30f..8c3fbd247 100644 --- a/src/telemetry/backend/tests/test_kafka_backend.py +++ b/src/telemetry/backend/tests/testTelemetryBackend.py @@ -16,6 +16,7 @@ # print (sys.path) import logging from typing import Tuple +from confluent_kafka import Producer as KafkaProducer from common.proto.context_pb2 import Empty from src.telemetry.frontend.tests.Messages import create_collector_request, create_collector_id from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService @@ -29,22 +30,30 @@ LOGGER = logging.getLogger(__name__) ########################### def test_get_kafka_configs(): LOGGER.warning('test_get_kafka_configs requesting') - KafkaProducerServiceObj = TelemetryBackendService() - response = KafkaProducerServiceObj.generate_kafka_configs() + TelemetryBackendServiceObj = TelemetryBackendService() + response = TelemetryBackendServiceObj.generate_kafka_configs() LOGGER.debug(str(response)) assert isinstance(response, dict) def test_export_collector_value(): LOGGER.warning('test_export_collector_value requesting') - response = TelemetryBackendServiceImpl.export_collector_value( - create_collector_request('1') - ) + TelemetryBackendServiceObj = TelemetryBackendServiceImpl() + response = TelemetryBackendServiceObj.export_collector_value(create_collector_request('1')) LOGGER.debug(str(response)) assert isinstance(response, Tuple) def test_write_to_kafka(): LOGGER.warning('test_write_to_kafka requesting') - collector_value = TelemetryBackendServiceImpl.export_collector_value(create_collector_request('1')) - response = TelemetryBackendServiceImpl.write_to_kafka(collector_value) # type: ignore (don't know why warning here) + TelemetryBackendServiceObj = TelemetryBackendServiceImpl() + _collector_value = TelemetryBackendServiceObj.export_collector_value(create_collector_request('1')) + response = TelemetryBackendServiceObj.write_to_kafka(_collector_value) LOGGER.debug(str(response)) - assert isinstance(response, Empty) + assert isinstance(response, KafkaProducer) + +def test_stop_producer(): + LOGGER.warning('test_write_to_kafka requesting') + _kafka_configs = {'bootstrap.servers': '127.0.0.1:9092'} + TelemetryBackendServiceObj = TelemetryBackendServiceImpl() + response = TelemetryBackendServiceObj.stop_producer(KafkaProducer(_kafka_configs)) + LOGGER.debug(str(response)) + assert isinstance(response, Empty) \ No newline at end of file -- GitLab From 89e73d9b83c6b018512334613f5cfc0476918ffa Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 9 May 2024 12:52:57 +0000 Subject: [PATCH 209/602] Service component - L3NM OpenConfig Service Handler: - intermediate step towards supporting configuration of OcNOS devices --- .../l3nm_openconfig/ConfigRules.py | 23 ++++++++++++++----- .../l3nm_openconfig/ConfigRules_test_ocnos.py | 8 +++---- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py index 716d0413a..752793287 100644 --- a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py +++ b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py @@ -12,10 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Dict, List, Tuple +from typing import Any, Dict, List, Optional, Tuple from common.tools.object_factory.ConfigRule import json_config_rule_delete, json_config_rule_set from service.service.service_handler_api.AnyTreeTools import TreeNode +def get_value(field_name : str, *containers, default=None) -> Optional[Any]: + if len(containers) == 0: raise Exception('No containers specified') + for container in containers: + if field_name not in container: continue + return container[field_name] + return default + def setup_config_rules( service_uuid : str, connection_uuid : str, device_uuid : str, endpoint_uuid : str, endpoint_name : str, service_settings : TreeNode, device_settings : TreeNode, endpoint_settings : TreeNode, endpoint_acls : List [Tuple] @@ -29,9 +36,11 @@ def setup_config_rules( json_device_settings : Dict = device_settings.value json_endpoint_settings : Dict = endpoint_settings.value - mtu = json_settings.get('mtu', 1450 ) # 1512 + settings = (json_settings, json_endpoint_settings, json_device_settings) + + mtu = get_value('mtu', *settings, default=1450) # 1512 #address_families = json_settings.get('address_families', [] ) # ['IPV4'] - bgp_as = json_settings.get('bgp_as', 65000 ) # 65000 + bgp_as = get_value('bgp_as', *settings, default=65000) # 65000 router_id = json_endpoint_settings.get('router_id', '0.0.0.0') # '10.95.0.10' route_distinguisher = json_settings.get('route_distinguisher', '65000:101' ) # '60001:801' @@ -199,21 +208,23 @@ def teardown_config_rules( ) -> List[Dict]: if service_settings is None: return [] - if device_settings is None: return [] + if device_settings is None: return [] if endpoint_settings is None: return [] json_settings : Dict = service_settings.value json_device_settings : Dict = device_settings.value json_endpoint_settings : Dict = endpoint_settings.value + settings = (json_settings, json_endpoint_settings, json_device_settings) + service_short_uuid = service_uuid.split('-')[-1] network_instance_name = '{:s}-NetInst'.format(service_short_uuid) #network_interface_desc = '{:s}-NetIf'.format(service_uuid) #network_subinterface_desc = '{:s}-NetSubIf'.format(service_uuid) - #mtu = json_settings.get('mtu', 1450 ) # 1512 + #mtu = get_value('mtu', *settings, default=1450) # 1512 #address_families = json_settings.get('address_families', [] ) # ['IPV4'] - #bgp_as = json_settings.get('bgp_as', 65000 ) # 65000 + #bgp_as = get_value('bgp_as', *settings, default=65000) # 65000 route_distinguisher = json_settings.get('route_distinguisher', '0:0' ) # '60001:801' #sub_interface_index = json_endpoint_settings.get('sub_interface_index', 0 ) # 1 #router_id = json_endpoint_settings.get('router_id', '0.0.0.0') # '10.95.0.10' diff --git a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules_test_ocnos.py b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules_test_ocnos.py index 1f2593b0d..5fa1d0b5b 100644 --- a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules_test_ocnos.py +++ b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules_test_ocnos.py @@ -22,12 +22,12 @@ def setup_config_rules( ) -> List[Dict]: if service_settings is None: return [] + if device_settings is None: return [] if endpoint_settings is None: return [] - if device_settings is None: return [] json_settings : Dict = service_settings.value - json_endpoint_settings : Dict = endpoint_settings.value json_device_settings : Dict = device_settings.value + json_endpoint_settings : Dict = endpoint_settings.value mtu = json_settings.get('mtu', 1450 ) # 1512 #address_families = json_settings.get('address_families', [] ) # ['IPV4'] @@ -233,12 +233,12 @@ def teardown_config_rules( ) -> List[Dict]: if service_settings is None: return [] + if device_settings is None: return [] if endpoint_settings is None: return [] - if device_settings is None: return [] json_settings : Dict = service_settings.value - json_endpoint_settings : Dict = endpoint_settings.value json_device_settings : Dict = device_settings.value + json_endpoint_settings : Dict = endpoint_settings.value service_short_uuid = service_uuid.split('-')[-1] # network_instance_name = '{:s}-NetInst'.format(service_short_uuid) -- GitLab From 6ebc4d54fb504c79fa7e0217e7f3b7630555536b Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 9 May 2024 12:53:35 +0000 Subject: [PATCH 210/602] Device - OpenConfig SBI driver: - Updated test for IPInfusion OcNOS --- .../tests/test_unitary_openconfig_ocnos.py | 106 +++++++++--------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/src/device/tests/test_unitary_openconfig_ocnos.py b/src/device/tests/test_unitary_openconfig_ocnos.py index 5e02accdd..87d951581 100644 --- a/src/device/tests/test_unitary_openconfig_ocnos.py +++ b/src/device/tests/test_unitary_openconfig_ocnos.py @@ -143,49 +143,49 @@ def test_configure(drivers : Dict[str, OpenConfigDriver]): #results_getconfig = driver.GetConfig(resources_to_get) #LOGGER.info('results_getconfig = {:s}'.format(str(results_getconfig))) - #csgw1_resources_to_set = [ - # network_instance('ecoc24', 'L3VRF', '192.168.150.1', '65001:1'), - # network_instance_add_protocol_direct('ecoc24', 'L3VRF'), - # network_instance_add_protocol_static('ecoc24', 'L3VRF'), - # network_instance_add_protocol_bgp('ecoc24', 'L3VRF', '192.168.150.1', '65001', neighbors=[ - # ('192.168.150.2', '65001') - # ]), - # network_instance_add_table_connection('ecoc24', 'DIRECTLY_CONNECTED', 'BGP', 'IPV4', 'ACCEPT_ROUTE', bgp_as='65001'), - # network_instance_add_table_connection('ecoc24', 'STATIC', 'BGP', 'IPV4', 'ACCEPT_ROUTE', bgp_as='65001'), - # - # interface('ce1', 0, if_type='ethernetCsmacd', mtu=1500), - # network_instance_interface('ecoc24', 'L3VRF', 'ce1', 0), - # interface('ce1', 0, if_type='ethernetCsmacd', mtu=1500, ipv4_address_prefix=('192.168.10.1', 24), enabled=True), - # - # interface('xe5', 0, if_type='ethernetCsmacd', mtu=1500), - # network_instance_interface('ecoc24', 'L3VRF', 'xe5', 0), - # interface('xe5', 0, if_type='ethernetCsmacd', mtu=1500, ipv4_address_prefix=('192.168.150.1', 24), enabled=True), - #] - #LOGGER.info('CSGW1 resources_to_set = {:s}'.format(str(csgw1_resources_to_set))) - #results_setconfig = drivers['CSGW1'].SetConfig(csgw1_resources_to_set) - #LOGGER.info('CSGW1 results_setconfig = {:s}'.format(str(results_setconfig))) - - #csgw2_resources_to_set = [ - # network_instance('ecoc24', 'L3VRF', '192.168.150.2', '65001:1'), - # network_instance_add_protocol_direct('ecoc24', 'L3VRF'), - # network_instance_add_protocol_static('ecoc24', 'L3VRF'), - # network_instance_add_protocol_bgp('ecoc24', 'L3VRF', '192.168.150.2', '65001', neighbors=[ - # ('192.168.150.1', '65001') - # ]), - # network_instance_add_table_connection('ecoc24', 'DIRECTLY_CONNECTED', 'BGP', 'IPV4', 'ACCEPT_ROUTE', bgp_as='65001'), - # network_instance_add_table_connection('ecoc24', 'STATIC', 'BGP', 'IPV4', 'ACCEPT_ROUTE', bgp_as='65001'), - # - # interface('ce1', 0, if_type='ethernetCsmacd', mtu=1500), - # network_instance_interface('ecoc24', 'L3VRF', 'ce1', 0), - # interface('ce1', 0, if_type='ethernetCsmacd', mtu=1500, ipv4_address_prefix=('192.168.20.1', 24), enabled=True), - # - # interface('xe5', 0, if_type='ethernetCsmacd', mtu=1500), - # network_instance_interface('ecoc24', 'L3VRF', 'xe5', 0), - # interface('xe5', 0, if_type='ethernetCsmacd', mtu=1500, ipv4_address_prefix=('192.168.150.2', 24), enabled=True), - #] - #LOGGER.info('CSGW2 resources_to_set = {:s}'.format(str(csgw2_resources_to_set))) - #results_setconfig = drivers['CSGW2'].SetConfig(csgw2_resources_to_set) - #LOGGER.info('CSGW2 results_setconfig = {:s}'.format(str(results_setconfig))) + csgw1_resources_to_set = [ + network_instance('ecoc24', 'L3VRF', '192.168.150.1', '65001:1'), + network_instance_add_protocol_direct('ecoc24', 'L3VRF'), + network_instance_add_protocol_static('ecoc24', 'L3VRF'), + network_instance_add_protocol_bgp('ecoc24', 'L3VRF', '192.168.150.1', '65001', neighbors=[ + ('192.168.150.2', '65001') + ]), + network_instance_add_table_connection('ecoc24', 'DIRECTLY_CONNECTED', 'BGP', 'IPV4', 'ACCEPT_ROUTE', bgp_as='65001'), + network_instance_add_table_connection('ecoc24', 'STATIC', 'BGP', 'IPV4', 'ACCEPT_ROUTE', bgp_as='65001'), + + interface('ce1', 0, if_type='ethernetCsmacd', mtu=1500), + network_instance_interface('ecoc24', 'L3VRF', 'ce1', 0), + interface('ce1', 0, if_type='ethernetCsmacd', mtu=1500, ipv4_address_prefix=('192.168.10.1', 24), enabled=True), + + interface('xe5', 0, if_type='ethernetCsmacd', mtu=1500), + network_instance_interface('ecoc24', 'L3VRF', 'xe5', 0), + interface('xe5', 0, if_type='ethernetCsmacd', mtu=1500, ipv4_address_prefix=('192.168.150.1', 24), enabled=True), + ] + LOGGER.info('CSGW1 resources_to_set = {:s}'.format(str(csgw1_resources_to_set))) + results_setconfig = drivers['CSGW1'].SetConfig(csgw1_resources_to_set) + LOGGER.info('CSGW1 results_setconfig = {:s}'.format(str(results_setconfig))) + + csgw2_resources_to_set = [ + network_instance('ecoc24', 'L3VRF', '192.168.150.2', '65001:1'), + network_instance_add_protocol_direct('ecoc24', 'L3VRF'), + network_instance_add_protocol_static('ecoc24', 'L3VRF'), + network_instance_add_protocol_bgp('ecoc24', 'L3VRF', '192.168.150.2', '65001', neighbors=[ + ('192.168.150.1', '65001') + ]), + network_instance_add_table_connection('ecoc24', 'DIRECTLY_CONNECTED', 'BGP', 'IPV4', 'ACCEPT_ROUTE', bgp_as='65001'), + network_instance_add_table_connection('ecoc24', 'STATIC', 'BGP', 'IPV4', 'ACCEPT_ROUTE', bgp_as='65001'), + + interface('ce1', 0, if_type='ethernetCsmacd', mtu=1500), + network_instance_interface('ecoc24', 'L3VRF', 'ce1', 0), + interface('ce1', 0, if_type='ethernetCsmacd', mtu=1500, ipv4_address_prefix=('192.168.20.1', 24), enabled=True), + + interface('xe5', 0, if_type='ethernetCsmacd', mtu=1500), + network_instance_interface('ecoc24', 'L3VRF', 'xe5', 0), + interface('xe5', 0, if_type='ethernetCsmacd', mtu=1500, ipv4_address_prefix=('192.168.150.2', 24), enabled=True), + ] + LOGGER.info('CSGW2 resources_to_set = {:s}'.format(str(csgw2_resources_to_set))) + results_setconfig = drivers['CSGW2'].SetConfig(csgw2_resources_to_set) + LOGGER.info('CSGW2 results_setconfig = {:s}'.format(str(results_setconfig))) csgw1_resources_to_delete = [ network_instance_interface('ecoc24', 'L3VRF', 'ce1', 0), @@ -198,13 +198,13 @@ def test_configure(drivers : Dict[str, OpenConfigDriver]): results_deleteconfig = drivers['CSGW1'].DeleteConfig(csgw1_resources_to_delete) LOGGER.info('CSGW1 results_deleteconfig = {:s}'.format(str(results_deleteconfig))) - #csgw2_resources_to_delete = [ - # network_instance_interface('ecoc24', 'L3VRF', 'ce1', 0), - # network_instance_interface('ecoc24', 'L3VRF', 'xe5', 0), - # #interface('ce1', 0), - # #interface('xe5', 0), - # network_instance('ecoc24', 'L3VRF'), - #] - #LOGGER.info('CSGW2 resources_to_delete = {:s}'.format(str(csgw2_resources_to_delete))) - #results_deleteconfig = drivers['CSGW2'].DeleteConfig(csgw2_resources_to_delete) - #LOGGER.info('CSGW2 results_deleteconfig = {:s}'.format(str(results_deleteconfig))) + csgw2_resources_to_delete = [ + network_instance_interface('ecoc24', 'L3VRF', 'ce1', 0), + network_instance_interface('ecoc24', 'L3VRF', 'xe5', 0), + #interface('ce1', 0), + #interface('xe5', 0), + network_instance('ecoc24', 'L3VRF'), + ] + LOGGER.info('CSGW2 resources_to_delete = {:s}'.format(str(csgw2_resources_to_delete))) + results_deleteconfig = drivers['CSGW2'].DeleteConfig(csgw2_resources_to_delete) + LOGGER.info('CSGW2 results_deleteconfig = {:s}'.format(str(results_deleteconfig))) -- GitLab From 02aade12c4800deaa80e81c6ab3eb8ebf736f3af Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 9 May 2024 12:57:16 +0000 Subject: [PATCH 211/602] Scripts: - Updated header of test launcher for IPInfusion OcNOS SBI driver --- scripts/run_tests_locally-device-openconfig-ocnos.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/run_tests_locally-device-openconfig-ocnos.sh b/scripts/run_tests_locally-device-openconfig-ocnos.sh index 413691b85..60af6768d 100755 --- a/scripts/run_tests_locally-device-openconfig-ocnos.sh +++ b/scripts/run_tests_locally-device-openconfig-ocnos.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. -- GitLab From 388708ff213efdebd2e579aebd07908e002279c8 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 10 May 2024 11:24:36 +0000 Subject: [PATCH 212/602] New code added to Telemetry Backend to read from Kafka --- .../service/TelemetryBackendService.py | 215 +++++++++++++++++- 1 file changed, 203 insertions(+), 12 deletions(-) diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 8e6fb243e..4c76917c8 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -1,3 +1,4 @@ + # Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,26 +13,216 @@ # See the License for the specific language governing permissions and # limitations under the License. +import time +import logging +import requests +import threading +from typing import Tuple +from common.proto.context_pb2 import Empty +from confluent_kafka import Producer as KafkaProducer +from confluent_kafka import Consumer as KafkaConsumer +from confluent_kafka import KafkaException +from confluent_kafka import KafkaError +from confluent_kafka.admin import AdminClient, NewTopic +from common.proto.telemetry_frontend_pb2 import Collector, CollectorId +from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method + +LOGGER = logging.getLogger(__name__) +METRICS_POOL = MetricsPool('Telemetry', 'TelemetryBackend') +KAFKA_SERVER_IP = '127.0.0.1:9092' + class TelemetryBackendService: """ - Class to control Kafka producer functionality. + Class to fetch metrics from Exporter and produce them to Kafka. """ - def __init__(self): - pass + def __init__(self, bootstrap_servers='127.0.0.1:9092', exporter_endpoint=None, + kafka_topic=None, run_duration=None, fetch_interval=None): + """ + Constructor to initialize Kafka producer parameters. + Args: + bootstrap_servers (str): Kafka broker address. + exporter_endpoint (str): Node Exporter metrics endpoint. + kafka_topic (str): Kafka topic to produce metrics to. + run_interval (int): Time interval in seconds to run the producer. + """ + LOGGER.info('Init TelemetryBackendService') - def generate_kafka_configs(self): + self.bootstrap_servers = bootstrap_servers + self.exporter_endpoint = exporter_endpoint + self.kafka_topic = kafka_topic + self.run_duration = run_duration + self.fetch_interval = fetch_interval + + def receive_kafka_request(self, + ): # type: ignore """ - Method to generate Kafka configurations + Method to receive collector request on Kafka topic. """ - create_kafka_configs = { - 'bootstrap_servers' : "test_server", # Kafka broker address - Replace with your Kafka broker address - 'exporter_endpoint' : "test_exporter", # Node Exporter metrics endpoint - Replace with your Node Exporter endpoint - 'kafka_topic' : "test_kafka_topic", # Kafka topic to produce to - 'run_duration' : 10, # Total duration to execute the producer - 'fetch_interval' : 2 # Time between two fetch requests + conusmer_configs = { + 'bootstrap.servers' : KAFKA_SERVER_IP, + 'group.id' : 'consumer', + 'auto.offset.reset' : 'earliest' } - return create_kafka_configs + topic_request = "topic_request" + + consumerObj = KafkaConsumer(conusmer_configs) + consumerObj.subscribe([topic_request]) + + start_time = time.time() + while True: + receive_msg = consumerObj.poll(1.0) + if receive_msg is None: + print ("nothing to read ...", time.time() - start_time) + if time.time() - start_time >= 10: # type: ignore + print("Timeout: consumer terminated") + break + continue + elif receive_msg.error(): + if receive_msg.error().code() == KafkaError._PARTITION_EOF: + continue + else: + print("Consumer error: {}".format(receive_msg.error())) + break + print ("Received Message: ", receive_msg.value().decode('utf-8')) + + def execute_receive_kafka_request(self + )->Empty: # type: ignore + threading.Thread(target=self.receive_kafka_request).start() + return True + + # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def export_collector_value(self, request : Collector) -> Tuple[str, str]: # type: ignore + response = Tuple[str, str] + collector_id = str('test collector Id') + collected_Value = str('test collected value') # Metric to be fetched from endpoint based on Collector message + response = (collector_id, collected_Value) + return response + + # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def write_to_kafka(self, request: Tuple[str, str]) -> KafkaProducer: + (collector_id, collector_value) = request + response = KafkaProducer({'bootstrap.servers': self.bootstrap_servers}) + # _collector_id, _collector_id_value = request + # write collector_id and collector_id value on the Kafka topic + + # get kafka bootstrap server and topic name + # write to kafka topic + + return response + + def stop_producer(self, request: KafkaProducer) -> Empty: # type: ignore + # flush and close kafka producer object + return Empty() + +# ----------- BELOW: Actual Implementation of Kafka Producer with Node Exporter ----------- + + def fetch_node_exporter_metrics(self): + """ + Method to fetch metrics from Node Exporter. + Returns: + str: Metrics fetched from Node Exporter. + """ + KPI = "node_network_receive_packets_total" + try: + response = requests.get(self.exporter_endpoint) # type: ignore + if response.status_code == 200: + # print(f"Metrics fetched sucessfully...") + metrics = response.text + # Check if the desired metric is available in the response + if KPI in metrics: + KPI_VALUE = self.extract_metric_value(metrics, KPI) + # Extract the metric value + if KPI_VALUE is not None: + print(f"KPI value: {KPI_VALUE}") + return KPI_VALUE + else: + print(f"Failed to fetch metrics. Status code: {response.status_code}") + return None + except Exception as e: + print(f"Failed to fetch metrics: {str(e)}") + return None + + def extract_metric_value(self, metrics, metric_name): + """ + Method to extract the value of a metric from the metrics string. + Args: + metrics (str): Metrics string fetched from Node Exporter. + metric_name (str): Name of the metric to extract. + Returns: + float: Value of the extracted metric, or None if not found. + """ + try: + # Find the metric line containing the desired metric name + metric_line = next(line for line in metrics.split('\n') if line.startswith(metric_name)) + # Split the line to extract the metric value + metric_value = float(metric_line.split()[1]) + return metric_value + except StopIteration: + print(f"Metric '{metric_name}' not found in the metrics.") + return None + + def delivery_callback(self, err, msg): + """ + Callback function to handle message delivery status. + Args: + err (KafkaError): Kafka error object. + msg (Message): Kafka message object. + """ + if err: + print(f'Message delivery failed: {err}') + else: + print(f'Message delivered to topic {msg.topic()}') + + def create_topic_if_not_exists(self, admin_client): + """ + Method to create Kafka topic if it does not exist. + Args: + admin_client (AdminClient): Kafka admin client. + """ + try: + topic_metadata = admin_client.list_topics(timeout=5) + if self.kafka_topic not in topic_metadata.topics: + # If the topic does not exist, create a new topic + print(f"Topic '{self.kafka_topic}' does not exist. Creating...") + new_topic = NewTopic(self.kafka_topic, num_partitions=1, replication_factor=1) + admin_client.create_topics([new_topic]) + except KafkaException as e: + print(f"Failed to create topic: {e}") + + def produce_metrics(self): + """ + Method to produce metrics to Kafka topic as per Kafka configs. + """ + conf = { + 'bootstrap.servers': self.bootstrap_servers, + } + + admin_client = AdminClient(conf) + self.create_topic_if_not_exists(admin_client) + + kafka_producer = KafkaProducer(conf) + + try: + start_time = time.time() + while True: + metrics = self.fetch_node_exporter_metrics() # select the function name based on the provided requirements + + if metrics: + kafka_producer.produce(self.kafka_topic, str(metrics), callback=self.delivery_callback) + kafka_producer.flush() + # print("Metrics produced to Kafka topic") + # Check if the specified run duration has elapsed + if time.time() - start_time >= self.run_duration: # type: ignore + break + # waiting time until next fetch + time.sleep(self.fetch_interval) # type: ignore + except KeyboardInterrupt: + print("Keyboard interrupt detected. Exiting...") + finally: + kafka_producer.flush() + # kafka_producer.close() # this command generates ERROR +# ----------- ABOVE: Actual Implementation of Kafka Producer with Node Exporter ----------- \ No newline at end of file -- GitLab From ba36d2f90aa16b587eb03cdaf23942b318387ae6 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 10 May 2024 11:25:15 +0000 Subject: [PATCH 213/602] Add to generate request on Kafka topic --- .../TelemetryFrontendServiceServicerImpl.py | 74 +++++++++++++++---- 1 file changed, 58 insertions(+), 16 deletions(-) diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index 498d07a91..518dd471d 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -12,42 +12,84 @@ # See the License for the specific language governing permissions and # limitations under the License. +from typing import Tuple import grpc import logging from common.proto.context_pb2 import Empty from monitoring.service.NameMapping import NameMapping +from confluent_kafka import Producer as KafkaProducer +from confluent_kafka import KafkaException from common.proto.telemetry_frontend_pb2 import CollectorId, Collector, CollectorFilter, CollectorList from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.proto.telemetry_frontend_pb2_grpc import TelemetryFrontendServiceServicer -LOGGER = logging.getLogger(__name__) -METRICS_POOL = MetricsPool('Monitoring', 'TelemetryFrontend') +LOGGER = logging.getLogger(__name__) +METRICS_POOL = MetricsPool('Monitoring', 'TelemetryFrontend') +KAFKA_SERVER_IP = '127.0.0.1:9092' class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): def __init__(self, name_mapping : NameMapping): LOGGER.info('Init TelemetryFrontendService') - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def StartCollector(self, request : Collector, grpc_context: grpc.ServicerContext # type: ignore - ) -> CollectorId: # type: ignore + # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def StartCollector(self, + request : Collector, grpc_context: grpc.ServicerContext # type: ignore + ) -> CollectorId: # type: ignore + # push info to frontend db response = CollectorId() - _collector_id = request.collector_id - # collector_kpi_id = request.kpi_id - # collector_duration = request.duration_s - # collector_interval = request.interval_s + _collector_id = request.collector_id + _collector_kpi_id = str(request.kpi_id.kpi_id.uuid) + _collector_duration = int(request.duration_s) + _collector_interval = int(request.interval_s) + activeCollObj = self.generate_kafka_request(str(_collector_id), _collector_kpi_id, _collector_duration, _collector_interval) response.collector_id.uuid = _collector_id.collector_id.uuid return response @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def StopCollector(self, request : CollectorId, grpc_context: grpc.ServicerContext # type: ignore - ) -> Empty: # type: ignore + def StopCollector(self, + request : CollectorId, grpc_context: grpc.ServicerContext # type: ignore + ) -> Empty: # type: ignore request.collector_id.uuid = "" return Empty() - - def SelectCollectors(self, request : CollectorFilter, contextgrpc_context: grpc.ServicerContext # type: ignore - ) -> CollectorList: # type: ignore + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def SelectCollectors(self, + request : CollectorFilter, contextgrpc_context: grpc.ServicerContext # type: ignore + ) -> CollectorList: # type: ignore response = CollectorList() - - return response \ No newline at end of file + return response + + # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def generate_kafka_request(self, + msg_key, kpi: str, duration : int, interval: int + ) -> KafkaProducer: + """ + Method to generate collector request to Kafka topic. + """ + producer_configs = { + 'bootstrap.servers': KAFKA_SERVER_IP, + 'group.id' : 'requester', + } + topic_request = "topic_request" + msg_value = Tuple [str, int, int] + msg_value = (kpi, duration, interval) + + producerObj = KafkaProducer(producer_configs) + producerObj.produce(topic_request, key=msg_key, value= str(msg_value), callback=self.delivery_callback) + producerObj.flush() + return producerObj + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def delivery_callback(self, err, msg): + """ + Callback function to handle message delivery status. + Args: + err (KafkaError): Kafka error object. + msg (Message): Kafka message object. + """ + if err: + print(f'Message delivery failed: {err}') + else: + print(f'Message delivered to topic {msg.topic()}') \ No newline at end of file -- GitLab From 2ee9d310ac63356c0ba928bb88ae1df9dc4b1912 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 10 May 2024 20:27:45 +0000 Subject: [PATCH 214/602] Test file path updated --- scripts/run_tests_locally-telemetry-frontend.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/run_tests_locally-telemetry-frontend.sh b/scripts/run_tests_locally-telemetry-frontend.sh index ac59f6dde..cccbcbc5b 100755 --- a/scripts/run_tests_locally-telemetry-frontend.sh +++ b/scripts/run_tests_locally-telemetry-frontend.sh @@ -25,4 +25,4 @@ cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc python3 -m pytest --log-level=INFO --verbose \ - telemetry_frontend/tests/test_unitary.py \ No newline at end of file + telemetry/frontend/tests/test_unitary.py \ No newline at end of file -- GitLab From 0e7ad11c32602efb5ca57fcc68d7b7dba7c8cb5f Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 10 May 2024 22:44:02 +0000 Subject: [PATCH 215/602] "Kafka_listener" is added --- .../service/TelemetryBackendService.py | 85 +++++++------------ 1 file changed, 30 insertions(+), 55 deletions(-) diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 4c76917c8..2e8478db1 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -13,6 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import ast import time import logging import requests @@ -33,31 +34,15 @@ KAFKA_SERVER_IP = '127.0.0.1:9092' class TelemetryBackendService: """ - Class to fetch metrics from Exporter and produce them to Kafka. + Class to listens for request on Kafka topic, fetches metrics and produces measured values to another Kafka topic. """ - def __init__(self, bootstrap_servers='127.0.0.1:9092', exporter_endpoint=None, - kafka_topic=None, run_duration=None, fetch_interval=None): - """ - Constructor to initialize Kafka producer parameters. - Args: - bootstrap_servers (str): Kafka broker address. - exporter_endpoint (str): Node Exporter metrics endpoint. - kafka_topic (str): Kafka topic to produce metrics to. - run_interval (int): Time interval in seconds to run the producer. - """ + def __init__(self): LOGGER.info('Init TelemetryBackendService') - - self.bootstrap_servers = bootstrap_servers - self.exporter_endpoint = exporter_endpoint - self.kafka_topic = kafka_topic - self.run_duration = run_duration - self.fetch_interval = fetch_interval - def receive_kafka_request(self, - ): # type: ignore + def kafka_listener(self): """ - Method to receive collector request on Kafka topic. + listener for requests on Kafka topic. """ conusmer_configs = { 'bootstrap.servers' : KAFKA_SERVER_IP, @@ -69,14 +54,10 @@ class TelemetryBackendService: consumerObj = KafkaConsumer(conusmer_configs) consumerObj.subscribe([topic_request]) - start_time = time.time() while True: - receive_msg = consumerObj.poll(1.0) + receive_msg = consumerObj.poll(2.0) if receive_msg is None: - print ("nothing to read ...", time.time() - start_time) - if time.time() - start_time >= 10: # type: ignore - print("Timeout: consumer terminated") - break + print ("Telemetry backend listener is active: Kafka Topic: ", topic_request) # added for debugging purposes continue elif receive_msg.error(): if receive_msg.error().code() == KafkaError._PARTITION_EOF: @@ -84,36 +65,30 @@ class TelemetryBackendService: else: print("Consumer error: {}".format(receive_msg.error())) break - print ("Received Message: ", receive_msg.value().decode('utf-8')) - - def execute_receive_kafka_request(self - )->Empty: # type: ignore - threading.Thread(target=self.receive_kafka_request).start() - return True - - # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def export_collector_value(self, request : Collector) -> Tuple[str, str]: # type: ignore - response = Tuple[str, str] - collector_id = str('test collector Id') - collected_Value = str('test collected value') # Metric to be fetched from endpoint based on Collector message - response = (collector_id, collected_Value) - return response - - # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def write_to_kafka(self, request: Tuple[str, str]) -> KafkaProducer: - (collector_id, collector_value) = request - response = KafkaProducer({'bootstrap.servers': self.bootstrap_servers}) - # _collector_id, _collector_id_value = request - # write collector_id and collector_id value on the Kafka topic - - # get kafka bootstrap server and topic name - # write to kafka topic - - return response + (kpi_id, duration, interval) = ast.literal_eval(receive_msg.value().decode('utf-8')) + self.execute_process_kafka_request(kpi_id, duration, interval) - def stop_producer(self, request: KafkaProducer) -> Empty: # type: ignore - # flush and close kafka producer object - return Empty() + def run_kafka_listener(self)->Empty: # type: ignore + threading.Thread(target=self.kafka_listener).start() + return True + + def process_kafka_request(self, kpi_id, duration, interval + ): # type: ignore + """ + Method to receive collector request attribues and initiates collecter backend. + """ + start_time = time.time() + while True: + if time.time() - start_time >= duration: # type: ignore + print("Timeout: consumer terminated", time.time() - start_time) + break + # print ("Received KPI: ", kpi_id, ", Duration: ", duration, ", Fetch Interval: ", interval) + print ("Telemetry Backend running for KPI: ", kpi_id, "after FETCH INTERVAL: ", interval) + time.sleep(interval) + + def execute_process_kafka_request(self, kpi_id: str, duration: int, interval: int): + threading.Thread(target=self.process_kafka_request, args=(kpi_id, duration, interval)).start() + # ----------- BELOW: Actual Implementation of Kafka Producer with Node Exporter ----------- -- GitLab From 1e56397e8cf1209b0e4a1058e1bb146052a85bd6 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 10 May 2024 22:44:33 +0000 Subject: [PATCH 216/602] name changed --- .../service/TelemetryBackendServiceImpl.py | 188 ------------------ 1 file changed, 188 deletions(-) delete mode 100755 src/telemetry/backend/service/TelemetryBackendServiceImpl.py diff --git a/src/telemetry/backend/service/TelemetryBackendServiceImpl.py b/src/telemetry/backend/service/TelemetryBackendServiceImpl.py deleted file mode 100755 index abcc30baf..000000000 --- a/src/telemetry/backend/service/TelemetryBackendServiceImpl.py +++ /dev/null @@ -1,188 +0,0 @@ - -# 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 time -import logging -import requests -from typing import Tuple -from common.proto.context_pb2 import Empty -from confluent_kafka import Producer as KafkaProducer -from confluent_kafka import KafkaException -from confluent_kafka.admin import AdminClient, NewTopic -from common.proto.telemetry_frontend_pb2 import Collector, CollectorId -from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method - -LOGGER = logging.getLogger(__name__) -METRICS_POOL = MetricsPool('Telemetry', 'TelemetryBackend') -ACTIVE_KAFKA_PRODUCERS = [] # list of active kafka producers - -class TelemetryBackendServiceImpl: - """ - Class to fetch metrics from Exporter and produce them to Kafka. - """ - - def __init__(self, bootstrap_servers=None, exporter_endpoint=None, - kafka_topic=None, run_duration=None, fetch_interval=None): - """ - Constructor to initialize Kafka producer parameters. - Args: - bootstrap_servers (str): Kafka broker address. - exporter_endpoint (str): Node Exporter metrics endpoint. - kafka_topic (str): Kafka topic to produce metrics to. - run_interval (int): Time interval in seconds to run the producer. - """ - LOGGER.info('Init TelemetryBackendService') - - self.bootstrap_servers = bootstrap_servers - self.exporter_endpoint = exporter_endpoint - self.kafka_topic = kafka_topic - self.run_duration = run_duration - self.fetch_interval = fetch_interval - - # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def export_collector_value(self, request : Collector) -> Tuple[str, str]: # type: ignore - response = Tuple[str, str] - collector_id = str('test collector Id') - collected_Value = str('test collected value') # Metric to be fetched from endpoint based on Collector message - response = (collector_id, collected_Value) - return response - - # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def write_to_kafka(self, request: Tuple[str, str]) -> KafkaProducer: - (collector_id, collector_value) = request - response = KafkaProducer({'bootstrap.servers': self.bootstrap_servers}) - # _collector_id, _collector_id_value = request - # write collector_id and collector_id value on the Kafka topic - - # get kafka bootstrap server and topic name - # write to kafka topic - - return response - - def stop_producer(self, request: KafkaProducer) -> Empty: # type: ignore - # flush and close kafka producer object - return Empty() - -# ----------- BELOW: Actual Implementation of Kafka Producer with Node Exporter ----------- - - def fetch_node_exporter_metrics(self): - """ - Method to fetch metrics from Node Exporter. - Returns: - str: Metrics fetched from Node Exporter. - """ - KPI = "node_network_receive_packets_total" - try: - response = requests.get(self.exporter_endpoint) # type: ignore - if response.status_code == 200: - # print(f"Metrics fetched sucessfully...") - metrics = response.text - # Check if the desired metric is available in the response - if KPI in metrics: - KPI_VALUE = self.extract_metric_value(metrics, KPI) - # Extract the metric value - if KPI_VALUE is not None: - print(f"KPI value: {KPI_VALUE}") - return KPI_VALUE - else: - print(f"Failed to fetch metrics. Status code: {response.status_code}") - return None - except Exception as e: - print(f"Failed to fetch metrics: {str(e)}") - return None - - def extract_metric_value(self, metrics, metric_name): - """ - Method to extract the value of a metric from the metrics string. - Args: - metrics (str): Metrics string fetched from Node Exporter. - metric_name (str): Name of the metric to extract. - Returns: - float: Value of the extracted metric, or None if not found. - """ - try: - # Find the metric line containing the desired metric name - metric_line = next(line for line in metrics.split('\n') if line.startswith(metric_name)) - # Split the line to extract the metric value - metric_value = float(metric_line.split()[1]) - return metric_value - except StopIteration: - print(f"Metric '{metric_name}' not found in the metrics.") - return None - - def delivery_callback(self, err, msg): - """ - Callback function to handle message delivery status. - Args: - err (KafkaError): Kafka error object. - msg (Message): Kafka message object. - """ - if err: - print(f'Message delivery failed: {err}') - else: - print(f'Message delivered to topic {msg.topic()}') - - def create_topic_if_not_exists(self, admin_client): - """ - Method to create Kafka topic if it does not exist. - Args: - admin_client (AdminClient): Kafka admin client. - """ - try: - topic_metadata = admin_client.list_topics(timeout=5) - if self.kafka_topic not in topic_metadata.topics: - # If the topic does not exist, create a new topic - print(f"Topic '{self.kafka_topic}' does not exist. Creating...") - new_topic = NewTopic(self.kafka_topic, num_partitions=1, replication_factor=1) - admin_client.create_topics([new_topic]) - except KafkaException as e: - print(f"Failed to create topic: {e}") - - def produce_metrics(self): - """ - Method to produce metrics to Kafka topic as per Kafka configs. - """ - conf = { - 'bootstrap.servers': self.bootstrap_servers, - } - - admin_client = AdminClient(conf) - self.create_topic_if_not_exists(admin_client) - - kafka_producer = KafkaProducer(conf) - - try: - start_time = time.time() - while True: - metrics = self.fetch_node_exporter_metrics() # select the function name based on the provided requirements - - if metrics: - kafka_producer.produce(self.kafka_topic, str(metrics), callback=self.delivery_callback) - kafka_producer.flush() - # print("Metrics produced to Kafka topic") - - # Check if the specified run duration has elapsed - if time.time() - start_time >= self.run_duration: # type: ignore - break - - # waiting time until next fetch - time.sleep(self.fetch_interval) # type: ignore - except KeyboardInterrupt: - print("Keyboard interrupt detected. Exiting...") - finally: - kafka_producer.flush() - # kafka_producer.close() # this command generates ERROR - -# ----------- ABOVE: Actual Implementation of Kafka Producer with Node Exporter ----------- \ No newline at end of file -- GitLab From ff79702a2685f6d20fba8f0fe4be1bb8c11523dd Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 10 May 2024 22:44:52 +0000 Subject: [PATCH 217/602] No need messages --- src/telemetry/backend/tests/messagesBackend.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/telemetry/backend/tests/messagesBackend.py b/src/telemetry/backend/tests/messagesBackend.py index ef1235383..10f5e099a 100644 --- a/src/telemetry/backend/tests/messagesBackend.py +++ b/src/telemetry/backend/tests/messagesBackend.py @@ -13,20 +13,3 @@ # limitations under the License. -def create_kafka_config_a(bootstrap_server: str, exporter_endpoint: str, kafka_topic: str, - run_duration: int, fetch_interval: int): - """ - Provide ... - Bootstrap_server IP address as String. - Exporter endpoint with port address as String. - Kafka topic name as String. - Total duration of the test as Int. - Fetch_interval as Int. - """ - _bootstrap_servers = bootstrap_server - _exporter_endpoint = exporter_endpoint - _kafka_topic = kafka_topic - _run_duration = run_duration - _fetch_interval = fetch_interval - - return _bootstrap_servers, _exporter_endpoint, _kafka_topic, _run_duration, _fetch_interval -- GitLab From 80baa7bb89f60cbfeec401b5dfb485a880106fb2 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 10 May 2024 22:45:35 +0000 Subject: [PATCH 218/602] No need to old tests --- .../backend/tests/testTelemetryBackend.py | 42 +++++-------------- 1 file changed, 10 insertions(+), 32 deletions(-) diff --git a/src/telemetry/backend/tests/testTelemetryBackend.py b/src/telemetry/backend/tests/testTelemetryBackend.py index 8c3fbd247..bdbb8526a 100644 --- a/src/telemetry/backend/tests/testTelemetryBackend.py +++ b/src/telemetry/backend/tests/testTelemetryBackend.py @@ -12,15 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -# import sys -# print (sys.path) +import sys +print (sys.path) +sys.path.append('/home/tfs/tfs-ctrl') import logging from typing import Tuple -from confluent_kafka import Producer as KafkaProducer from common.proto.context_pb2 import Empty -from src.telemetry.frontend.tests.Messages import create_collector_request, create_collector_id from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService -from src.telemetry.backend.service.TelemetryBackendServiceImpl import TelemetryBackendServiceImpl + + LOGGER = logging.getLogger(__name__) @@ -28,32 +28,10 @@ LOGGER = logging.getLogger(__name__) ########################### # Tests Implementation of Telemetry Backend ########################### -def test_get_kafka_configs(): - LOGGER.warning('test_get_kafka_configs requesting') - TelemetryBackendServiceObj = TelemetryBackendService() - response = TelemetryBackendServiceObj.generate_kafka_configs() - LOGGER.debug(str(response)) - assert isinstance(response, dict) -def test_export_collector_value(): - LOGGER.warning('test_export_collector_value requesting') - TelemetryBackendServiceObj = TelemetryBackendServiceImpl() - response = TelemetryBackendServiceObj.export_collector_value(create_collector_request('1')) - LOGGER.debug(str(response)) - assert isinstance(response, Tuple) - -def test_write_to_kafka(): - LOGGER.warning('test_write_to_kafka requesting') - TelemetryBackendServiceObj = TelemetryBackendServiceImpl() - _collector_value = TelemetryBackendServiceObj.export_collector_value(create_collector_request('1')) - response = TelemetryBackendServiceObj.write_to_kafka(_collector_value) - LOGGER.debug(str(response)) - assert isinstance(response, KafkaProducer) - -def test_stop_producer(): - LOGGER.warning('test_write_to_kafka requesting') - _kafka_configs = {'bootstrap.servers': '127.0.0.1:9092'} - TelemetryBackendServiceObj = TelemetryBackendServiceImpl() - response = TelemetryBackendServiceObj.stop_producer(KafkaProducer(_kafka_configs)) +def test_run_kafka_listener(): + LOGGER.warning('test_receive_kafka_request requesting') + TelemetryBackendServiceObj = TelemetryBackendService() + response = TelemetryBackendServiceObj.run_kafka_listener() LOGGER.debug(str(response)) - assert isinstance(response, Empty) \ No newline at end of file + assert isinstance(response, bool) -- GitLab From e07c5445b117a28066c0be7cafffa2ed6ff313e2 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 10 May 2024 22:46:36 +0000 Subject: [PATCH 219/602] "create_collector_request_b" return updated to "telemetry_frontend_pb2.Collector" --- src/telemetry/frontend/tests/Messages.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/telemetry/frontend/tests/Messages.py b/src/telemetry/frontend/tests/Messages.py index d323aa7fd..9e7b6c049 100644 --- a/src/telemetry/frontend/tests/Messages.py +++ b/src/telemetry/frontend/tests/Messages.py @@ -33,9 +33,10 @@ def create_collector_request_a(): _create_collector_request_a.collector_id.collector_id.uuid = "-1" return _create_collector_request_a -def create_collector_request_b(str_kpi_id, coll_duration_s, coll_interval_s): +def create_collector_request_b(str_kpi_id, coll_duration_s, coll_interval_s + ) -> telemetry_frontend_pb2.Collector: _create_collector_request_b = telemetry_frontend_pb2.Collector() - _create_collector_request_b.collector_id.collector_id.uuid = '-1' + _create_collector_request_b.collector_id.collector_id.uuid = '1' _create_collector_request_b.kpi_id.kpi_id.uuid = str_kpi_id _create_collector_request_b.duration_s = coll_duration_s _create_collector_request_b.interval_s = coll_interval_s -- GitLab From 8f4e98a99220fc991a73d25632e7befbaa816be0 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 10 May 2024 22:47:54 +0000 Subject: [PATCH 220/602] No need to old tests --- src/telemetry/frontend/tests/test_unitary.py | 37 +++++++------------- 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/src/telemetry/frontend/tests/test_unitary.py b/src/telemetry/frontend/tests/test_unitary.py index 312695659..77a94a07a 100644 --- a/src/telemetry/frontend/tests/test_unitary.py +++ b/src/telemetry/frontend/tests/test_unitary.py @@ -164,32 +164,21 @@ def telemetryFrontend_client( ########################### # Tests Implementation of Telemetry Frontend ########################### -def test_start_collector(telemetryFrontend_client): - LOGGER.warning('test_start_collector requesting') - response = telemetryFrontend_client.StartCollector(create_collector_request('1')) - LOGGER.debug(str(response)) - assert isinstance(response, CollectorId) - -def test_start_collector_a(telemetryFrontend_client): - LOGGER.warning('test_start_collector requesting') - response = telemetryFrontend_client.StartCollector(create_collector_request_a()) - LOGGER.debug(str(response)) - assert isinstance(response, CollectorId) -def test_start_collector_b(telemetryFrontend_client): +def test_start_collector(telemetryFrontend_client): LOGGER.warning('test_start_collector requesting') - response = telemetryFrontend_client.StartCollector(create_collector_request_b('1',10,2)) + response = telemetryFrontend_client.StartCollector(create_collector_request_b('11',10,2)) LOGGER.debug(str(response)) assert isinstance(response, CollectorId) -def test_stop_collector(telemetryFrontend_client): - LOGGER.warning('test_stop_collector requesting') - response = telemetryFrontend_client.StopCollector(create_collector_id("1")) - LOGGER.debug(str(response)) - assert isinstance(response, Empty) - -def test_select_collectors(telemetryFrontend_client): - LOGGER.warning('test_select_collector requesting') - response = telemetryFrontend_client.SelectCollectors(create_collector_filter()) - LOGGER.debug(str(response)) - assert isinstance(response, CollectorList) \ No newline at end of file +# def test_stop_collector(telemetryFrontend_client): +# LOGGER.warning('test_stop_collector requesting') +# response = telemetryFrontend_client.StopCollector(create_collector_id("1")) +# LOGGER.debug(str(response)) +# assert isinstance(response, Empty) + +# def test_select_collectors(telemetryFrontend_client): +# LOGGER.warning('test_select_collector requesting') +# response = telemetryFrontend_client.SelectCollectors(create_collector_filter()) +# LOGGER.debug(str(response)) +# assert isinstance(response, CollectorList) \ No newline at end of file -- GitLab From ce22504118b89dc4c069f5ef935915d6909dda42 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 14 May 2024 13:53:13 +0000 Subject: [PATCH 221/602] changes the names of frontend tests file --- scripts/run_tests_locally-telemetry-frontend.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/run_tests_locally-telemetry-frontend.sh b/scripts/run_tests_locally-telemetry-frontend.sh index cccbcbc5b..c6ab54a34 100755 --- a/scripts/run_tests_locally-telemetry-frontend.sh +++ b/scripts/run_tests_locally-telemetry-frontend.sh @@ -25,4 +25,4 @@ cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc python3 -m pytest --log-level=INFO --verbose \ - telemetry/frontend/tests/test_unitary.py \ No newline at end of file + telemetry/frontend/tests/test_frontend.py \ No newline at end of file -- GitLab From c213a7bc2c0fea25ab07394e58a8b295290ee4a3 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 14 May 2024 13:56:06 +0000 Subject: [PATCH 222/602] Added the implementation of "Kafka_listener", "Initiate_collector_backend" and "generate_kafka_reply" --- .../service/TelemetryBackendService.py | 138 +++++++++++------- 1 file changed, 85 insertions(+), 53 deletions(-) diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 2e8478db1..d5ba6ced4 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -15,6 +15,7 @@ import ast import time +import random import logging import requests import threading @@ -46,33 +47,33 @@ class TelemetryBackendService: """ conusmer_configs = { 'bootstrap.servers' : KAFKA_SERVER_IP, - 'group.id' : 'consumer', - 'auto.offset.reset' : 'earliest' + 'group.id' : 'backend', + 'auto.offset.reset' : 'latest' } topic_request = "topic_request" + if (self.create_topic_if_not_exists(topic_request)): + consumerObj = KafkaConsumer(conusmer_configs) + consumerObj.subscribe([topic_request]) - consumerObj = KafkaConsumer(conusmer_configs) - consumerObj.subscribe([topic_request]) - - while True: - receive_msg = consumerObj.poll(2.0) - if receive_msg is None: - print ("Telemetry backend listener is active: Kafka Topic: ", topic_request) # added for debugging purposes - continue - elif receive_msg.error(): - if receive_msg.error().code() == KafkaError._PARTITION_EOF: + while True: + receive_msg = consumerObj.poll(2.0) + if receive_msg is None: + print ("Telemetry backend is listening on Kafka Topic: ", topic_request) # added for debugging purposes continue - else: - print("Consumer error: {}".format(receive_msg.error())) - break - (kpi_id, duration, interval) = ast.literal_eval(receive_msg.value().decode('utf-8')) - self.execute_process_kafka_request(kpi_id, duration, interval) - - def run_kafka_listener(self)->Empty: # type: ignore + elif receive_msg.error(): + if receive_msg.error().code() == KafkaError._PARTITION_EOF: + continue + else: + print("Consumer error: {}".format(receive_msg.error())) + break + (kpi_id, duration, interval) = ast.literal_eval(receive_msg.value().decode('utf-8')) + self.execute_initiate_collector_backend(kpi_id, duration, interval) + + def run_kafka_listener(self)->bool: # type: ignore threading.Thread(target=self.kafka_listener).start() return True - def process_kafka_request(self, kpi_id, duration, interval + def initiate_collector_backend(self, kpi_id, duration, interval ): # type: ignore """ Method to receive collector request attribues and initiates collecter backend. @@ -80,15 +81,74 @@ class TelemetryBackendService: start_time = time.time() while True: if time.time() - start_time >= duration: # type: ignore - print("Timeout: consumer terminated", time.time() - start_time) + print("Requested Execution Time Completed: \n --- Consumer terminating: KPI ID: ", kpi_id, " - ", time.time() - start_time) break # print ("Received KPI: ", kpi_id, ", Duration: ", duration, ", Fetch Interval: ", interval) - print ("Telemetry Backend running for KPI: ", kpi_id, "after FETCH INTERVAL: ", interval) + self.extract_kpi_value(kpi_id) + # print ("Telemetry Backend running for KPI: ", kpi_id, "after FETCH INTERVAL: ", interval) time.sleep(interval) - def execute_process_kafka_request(self, kpi_id: str, duration: int, interval: int): - threading.Thread(target=self.process_kafka_request, args=(kpi_id, duration, interval)).start() - + def execute_initiate_collector_backend(self, kpi_id: str, duration: int, interval: int): + threading.Thread(target=self.initiate_collector_backend, args=(kpi_id, duration, interval)).start() + + + + def extract_kpi_value(self, kpi_id: str): + """ + Method to extract kpi value. + """ + measured_kpi_value = random.randint(1,100) + self.generate_kafka_reply(kpi_id , measured_kpi_value) + + def generate_kafka_reply(self, kpi_id: str, kpi_value: any): + """ + Method to write response on Kafka topic + """ + producer_configs = { + 'bootstrap.servers': KAFKA_SERVER_IP, + } + topic_response = "topic_response" + if (self.create_topic_if_not_exists(topic_response)): + msg_value = Tuple [str, any] + msg_value = (kpi_id, kpi_value) + msg_key = "111" # to be fetch from db??? + + producerObj = KafkaProducer(producer_configs) + producerObj.produce(topic_response, key=msg_key, value= str(msg_value), callback=self.delivery_callback) + producerObj.flush() + + def create_topic_if_not_exists(self, new_topic_name: str): + """ + Method to create Kafka topic if it does not exist. + Args: + admin_client (AdminClient): Kafka admin client. + """ + admin_kafka_client = AdminClient({'bootstrap.servers': KAFKA_SERVER_IP}) + try: + topic_metadata = admin_kafka_client.list_topics(timeout=5) + if new_topic_name not in topic_metadata.topics: + # If the topic does not exist, create a new topic + print(f"Topic '{new_topic_name}' does not exist. Creating...") + new_topic = NewTopic(new_topic_name, num_partitions=1, replication_factor=1) + admin_kafka_client.create_topics([new_topic]) + return True + except KafkaException as e: + print(f"Failed to create topic: {e}") + return False + + def delivery_callback(self, err, msg): + """ + Callback function to handle message delivery status. + Args: + err (KafkaError): Kafka error object. + msg (Message): Kafka message object. + """ + if err: + print(f'Message delivery failed: {err}') + else: + print(f'Message delivered to topic {msg.topic()}') + + # ----------- BELOW: Actual Implementation of Kafka Producer with Node Exporter ----------- @@ -137,34 +197,6 @@ class TelemetryBackendService: print(f"Metric '{metric_name}' not found in the metrics.") return None - def delivery_callback(self, err, msg): - """ - Callback function to handle message delivery status. - Args: - err (KafkaError): Kafka error object. - msg (Message): Kafka message object. - """ - if err: - print(f'Message delivery failed: {err}') - else: - print(f'Message delivered to topic {msg.topic()}') - - def create_topic_if_not_exists(self, admin_client): - """ - Method to create Kafka topic if it does not exist. - Args: - admin_client (AdminClient): Kafka admin client. - """ - try: - topic_metadata = admin_client.list_topics(timeout=5) - if self.kafka_topic not in topic_metadata.topics: - # If the topic does not exist, create a new topic - print(f"Topic '{self.kafka_topic}' does not exist. Creating...") - new_topic = NewTopic(self.kafka_topic, num_partitions=1, replication_factor=1) - admin_client.create_topics([new_topic]) - except KafkaException as e: - print(f"Failed to create topic: {e}") - def produce_metrics(self): """ Method to produce metrics to Kafka topic as per Kafka configs. -- GitLab From 1c15a21abb8cd144f20704b9a8e9ccfccf446f46 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 14 May 2024 13:57:10 +0000 Subject: [PATCH 223/602] Added "Kafka_listener" --- .../TelemetryFrontendServiceServicerImpl.py | 90 ++++++++++++++----- 1 file changed, 69 insertions(+), 21 deletions(-) diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index 518dd471d..045c56d5b 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -12,13 +12,19 @@ # See the License for the specific language governing permissions and # limitations under the License. +import ast +import threading +import time from typing import Tuple import grpc import logging + +from confluent_kafka import Consumer as KafkaConsumer from common.proto.context_pb2 import Empty from monitoring.service.NameMapping import NameMapping from confluent_kafka import Producer as KafkaProducer from confluent_kafka import KafkaException +from confluent_kafka import KafkaError from common.proto.telemetry_frontend_pb2 import CollectorId, Collector, CollectorFilter, CollectorList from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.proto.telemetry_frontend_pb2_grpc import TelemetryFrontendServiceServicer @@ -38,49 +44,77 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): ) -> CollectorId: # type: ignore # push info to frontend db response = CollectorId() - _collector_id = request.collector_id + _collector_id = str(request.collector_id.collector_id.uuid) _collector_kpi_id = str(request.kpi_id.kpi_id.uuid) _collector_duration = int(request.duration_s) _collector_interval = int(request.interval_s) - activeCollObj = self.generate_kafka_request(str(_collector_id), _collector_kpi_id, _collector_duration, _collector_interval) - - response.collector_id.uuid = _collector_id.collector_id.uuid + self.generate_kafka_request(_collector_id, _collector_kpi_id, _collector_duration, _collector_interval) + # self.run_generate_kafka_request(_collector_id, _collector_kpi_id, _collector_duration, _collector_interval) + response.collector_id.uuid = request.collector_id.collector_id.uuid return response - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def StopCollector(self, - request : CollectorId, grpc_context: grpc.ServicerContext # type: ignore - ) -> Empty: # type: ignore - request.collector_id.uuid = "" - return Empty() + def run_generate_kafka_request(self, msg_key: str, kpi: str, duration : int, interval: int): + threading.Thread(target=self.generate_kafka_request, args=(msg_key, kpi, duration, interval)).start() - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def SelectCollectors(self, - request : CollectorFilter, contextgrpc_context: grpc.ServicerContext # type: ignore - ) -> CollectorList: # type: ignore - response = CollectorList() - return response - # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def generate_kafka_request(self, - msg_key, kpi: str, duration : int, interval: int + msg_key: str, kpi: str, duration : int, interval: int ) -> KafkaProducer: """ Method to generate collector request to Kafka topic. """ + # time.sleep(5) producer_configs = { 'bootstrap.servers': KAFKA_SERVER_IP, - 'group.id' : 'requester', } topic_request = "topic_request" msg_value = Tuple [str, int, int] msg_value = (kpi, duration, interval) - + print ("Request generated: ", "Colletcor Id: ", msg_key, \ + ", \nKPI: ", kpi, ", Duration: ", duration, ", Interval: ", interval) producerObj = KafkaProducer(producer_configs) producerObj.produce(topic_request, key=msg_key, value= str(msg_value), callback=self.delivery_callback) producerObj.flush() return producerObj + def run_kafka_listener(self): + # print ("--- STARTED: run_kafka_listener ---") + threading.Thread(target=self.kafka_listener).start() + return True + + def kafka_listener(self): + """ + listener for response on Kafka topic. + """ + # print ("--- STARTED: kafka_listener ---") + conusmer_configs = { + 'bootstrap.servers' : KAFKA_SERVER_IP, + 'group.id' : 'frontend', + 'auto.offset.reset' : 'latest' + } + topic_response = "topic_response" + + consumerObj = KafkaConsumer(conusmer_configs) + consumerObj.subscribe([topic_response]) + # print (time.time()) + while True: + receive_msg = consumerObj.poll(2.0) + if receive_msg is None: + print (" - Telemetry frontend listening on Kafka Topic: ", topic_response) # added for debugging purposes + continue + elif receive_msg.error(): + if receive_msg.error().code() == KafkaError._PARTITION_EOF: + continue + else: + print("Consumer error: {}".format(receive_msg.error())) + break + (kpi_id, kpi_value) = ast.literal_eval(receive_msg.value().decode('utf-8')) + self.process_response(kpi_id, kpi_value) + # threading.Thread(target=self.process_response, args=(kpi_id, kpi_value)).start() + + def process_response(self, kpi_id: str, kpi_value: any): + print ("Frontend - KPI: ", kpi_id, ", VALUE: ", kpi_value) + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def delivery_callback(self, err, msg): """ @@ -92,4 +126,18 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): if err: print(f'Message delivery failed: {err}') else: - print(f'Message delivered to topic {msg.topic()}') \ No newline at end of file + print(f'Message delivered to topic {msg.topic()}') + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def StopCollector(self, + request : CollectorId, grpc_context: grpc.ServicerContext # type: ignore + ) -> Empty: # type: ignore + request.collector_id.uuid = "" + return Empty() + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def SelectCollectors(self, + request : CollectorFilter, contextgrpc_context: grpc.ServicerContext # type: ignore + ) -> CollectorList: # type: ignore + response = CollectorList() + return response \ No newline at end of file -- GitLab From ed77dac801e0e6e859980c92b3c52ca67eb22092 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 14 May 2024 13:57:49 +0000 Subject: [PATCH 224/602] Update the messages format --- src/telemetry/frontend/tests/Messages.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/telemetry/frontend/tests/Messages.py b/src/telemetry/frontend/tests/Messages.py index 9e7b6c049..93a6066ee 100644 --- a/src/telemetry/frontend/tests/Messages.py +++ b/src/telemetry/frontend/tests/Messages.py @@ -12,20 +12,27 @@ # See the License for the specific language governing permissions and # limitations under the License. +import uuid +import random from common.proto import telemetry_frontend_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType +def create_collector_id(): + _collector_id = telemetry_frontend_pb2.CollectorId() + _collector_id.collector_id.uuid = uuid.uuid4() + return _collector_id + def create_collector_id(coll_id_str : str): _collector_id = telemetry_frontend_pb2.CollectorId() _collector_id.collector_id.uuid = str(coll_id_str) return _collector_id -def create_collector_request(coll_id_str : str): +def create_collector_request(): _create_collector_request = telemetry_frontend_pb2.Collector() - _create_collector_request.collector_id.collector_id.uuid = str(coll_id_str) - _create_collector_request.kpi_id.kpi_id.uuid = 'KPIid' + str(coll_id_str) - _create_collector_request.duration_s = float(-1) - _create_collector_request.interval_s = float(-1) + _create_collector_request.collector_id.collector_id.uuid = str(uuid.uuid4()) + _create_collector_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) + _create_collector_request.duration_s = float(random.randint(8, 16)) + _create_collector_request.interval_s = float(random.randint(2, 3)) return _create_collector_request def create_collector_request_a(): -- GitLab From afc8ee6a71ee86a10c2713e28b7deaec8fb95666 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 14 May 2024 13:58:44 +0000 Subject: [PATCH 225/602] "test_unitary.py" to "test_frontend.py" --- src/telemetry/frontend/tests/test_frontend.py | 193 ++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 src/telemetry/frontend/tests/test_frontend.py diff --git a/src/telemetry/frontend/tests/test_frontend.py b/src/telemetry/frontend/tests/test_frontend.py new file mode 100644 index 000000000..4f59630d4 --- /dev/null +++ b/src/telemetry/frontend/tests/test_frontend.py @@ -0,0 +1,193 @@ +# 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 os +import pytest +import logging +from typing import Union + +from common.proto.context_pb2 import Empty +from common.Constants import ServiceNameEnum +from common.proto.telemetry_frontend_pb2 import CollectorId, CollectorList +from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server +from context.client.ContextClient import ContextClient +from common.tools.service.GenericGrpcService import GenericGrpcService +from common.tests.MockServicerImpl_Context import MockServicerImpl_Context +from common.Settings import ( + get_service_port_grpc, get_env_var_name, ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC) + +from telemetry.frontend.client.TelemetryFrontendClient import TelemetryFrontendClient +from telemetry.frontend.service.TelemetryFrontendService import TelemetryFrontendService +from telemetry.frontend.service.TelemetryFrontendServiceServicerImpl import TelemetryFrontendServiceServicerImpl +from telemetry.frontend.tests.Messages import ( create_collector_id, create_collector_request, + create_collector_filter, create_collector_request_a, create_collector_request_b) + +from device.client.DeviceClient import DeviceClient +from device.service.DeviceService import DeviceService +from device.service.driver_api.DriverFactory import DriverFactory +from device.service.driver_api.DriverInstanceCache import DriverInstanceCache + +from monitoring.service.NameMapping import NameMapping + +os.environ['DEVICE_EMULATED_ONLY'] = 'TRUE' +from device.service.drivers import DRIVERS + +########################### +# Tests Setup +########################### + +LOCAL_HOST = '127.0.0.1' +MOCKSERVICE_PORT = 10000 + +TELEMETRY_FRONTEND_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.TELEMETRYFRONTEND) +os.environ[get_env_var_name(ServiceNameEnum.TELEMETRYFRONTEND, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) +os.environ[get_env_var_name(ServiceNameEnum.TELEMETRYFRONTEND, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(TELEMETRY_FRONTEND_PORT) + +LOGGER = logging.getLogger(__name__) + +class MockContextService(GenericGrpcService): + # Mock Service implementing Context to simplify unitary tests of Monitoring + + def __init__(self, bind_port: Union[str, int]) -> None: + super().__init__(bind_port, LOCAL_HOST, enable_health_servicer=False, cls_name='MockService') + + # pylint: disable=attribute-defined-outside-init + def install_servicers(self): + self.context_servicer = MockServicerImpl_Context() + add_ContextServiceServicer_to_server(self.context_servicer, self.server) + +@pytest.fixture(scope='session') +def context_service(): + LOGGER.info('Initializing MockContextService...') + _service = MockContextService(MOCKSERVICE_PORT) + _service.start() + + LOGGER.info('Yielding MockContextService...') + yield _service + + LOGGER.info('Terminating MockContextService...') + _service.context_servicer.msg_broker.terminate() + _service.stop() + + LOGGER.info('Terminated MockContextService...') + +@pytest.fixture(scope='session') +def context_client(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument + LOGGER.info('Initializing ContextClient...') + _client = ContextClient() + + LOGGER.info('Yielding ContextClient...') + yield _client + + LOGGER.info('Closing ContextClient...') + _client.close() + + LOGGER.info('Closed ContextClient...') + +@pytest.fixture(scope='session') +def device_service(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument + LOGGER.info('Initializing DeviceService...') + driver_factory = DriverFactory(DRIVERS) + driver_instance_cache = DriverInstanceCache(driver_factory) + _service = DeviceService(driver_instance_cache) + _service.start() + + # yield the server, when test finishes, execution will resume to stop it + LOGGER.info('Yielding DeviceService...') + yield _service + + LOGGER.info('Terminating DeviceService...') + _service.stop() + + LOGGER.info('Terminated DeviceService...') + +@pytest.fixture(scope='session') +def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument + LOGGER.info('Initializing DeviceClient...') + _client = DeviceClient() + + LOGGER.info('Yielding DeviceClient...') + yield _client + + LOGGER.info('Closing DeviceClient...') + _client.close() + + LOGGER.info('Closed DeviceClient...') + +@pytest.fixture(scope='session') +def telemetryFrontend_service( + context_service : MockContextService, + device_service : DeviceService + ): + LOGGER.info('Initializing TelemetryFrontendService...') + name_mapping = NameMapping() + + _service = TelemetryFrontendService(name_mapping) + _service.start() + + # yield the server, when test finishes, execution will resume to stop it + LOGGER.info('Yielding TelemetryFrontendService...') + yield _service + + LOGGER.info('Terminating TelemetryFrontendService...') + _service.stop() + + LOGGER.info('Terminated TelemetryFrontendService...') + +@pytest.fixture(scope='session') +def telemetryFrontend_client( + telemetryFrontend_service : TelemetryFrontendService + ): + LOGGER.info('Initializing TelemetryFrontendClient...') + _client = TelemetryFrontendClient() + + # yield the server, when test finishes, execution will resume to stop it + LOGGER.info('Yielding TelemetryFrontendClient...') + yield _client + + LOGGER.info('Closing TelemetryFrontendClient...') + _client.close() + + LOGGER.info('Closed TelemetryFrontendClient...') + + +########################### +# Tests Implementation of Telemetry Frontend +########################### + +def test_start_collector(telemetryFrontend_client): + LOGGER.warning('test_start_collector requesting') + response = telemetryFrontend_client.StartCollector(create_collector_request()) + LOGGER.debug(str(response)) + assert isinstance(response, CollectorId) + +def test_run_kafka_listener(): + LOGGER.warning('test_receive_kafka_request requesting') + name_mapping = NameMapping() + TelemetryFrontendServiceObj = TelemetryFrontendServiceServicerImpl(name_mapping) + response = TelemetryFrontendServiceObj.run_kafka_listener() # Method "run_kafka_listener" is not define in frontend.proto + LOGGER.debug(str(response)) + assert isinstance(response, bool) + +def test_stop_collector(telemetryFrontend_client): + LOGGER.warning('test_stop_collector requesting') + response = telemetryFrontend_client.StopCollector(create_collector_id("1")) + LOGGER.debug(str(response)) + assert isinstance(response, Empty) + +# def test_select_collectors(telemetryFrontend_client): +# LOGGER.warning('test_select_collector requesting') +# response = telemetryFrontend_client.SelectCollectors(create_collector_filter()) +# LOGGER.debug(str(response)) +# assert isinstance(response, CollectorList) \ No newline at end of file -- GitLab From 0bcd283f978a91fc889873ad7e11c6a63092bda8 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 14 May 2024 13:59:05 +0000 Subject: [PATCH 226/602] file renamed --- src/telemetry/frontend/tests/test_unitary.py | 184 ------------------- 1 file changed, 184 deletions(-) delete mode 100644 src/telemetry/frontend/tests/test_unitary.py diff --git a/src/telemetry/frontend/tests/test_unitary.py b/src/telemetry/frontend/tests/test_unitary.py deleted file mode 100644 index 77a94a07a..000000000 --- a/src/telemetry/frontend/tests/test_unitary.py +++ /dev/null @@ -1,184 +0,0 @@ -# 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 os -import pytest -import logging -from typing import Union - -from common.proto.context_pb2 import Empty -from common.Constants import ServiceNameEnum -from common.proto.telemetry_frontend_pb2 import CollectorId, CollectorList -from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server -from context.client.ContextClient import ContextClient -from common.tools.service.GenericGrpcService import GenericGrpcService -from common.tests.MockServicerImpl_Context import MockServicerImpl_Context -from common.Settings import ( - get_service_port_grpc, get_env_var_name, ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC) - -from telemetry.frontend.client.TelemetryFrontendClient import TelemetryFrontendClient -from telemetry.frontend.service.TelemetryFrontendService import TelemetryFrontendService -from telemetry.frontend.tests.Messages import ( create_collector_id, create_collector_request, - create_collector_filter, create_collector_request_a, create_collector_request_b) - -from device.client.DeviceClient import DeviceClient -from device.service.DeviceService import DeviceService -from device.service.driver_api.DriverFactory import DriverFactory -from device.service.driver_api.DriverInstanceCache import DriverInstanceCache - -from monitoring.service.NameMapping import NameMapping - -os.environ['DEVICE_EMULATED_ONLY'] = 'TRUE' -from device.service.drivers import DRIVERS - -########################### -# Tests Setup -########################### - -LOCAL_HOST = '127.0.0.1' -MOCKSERVICE_PORT = 10000 - -TELEMETRY_FRONTEND_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.TELEMETRYFRONTEND) -os.environ[get_env_var_name(ServiceNameEnum.TELEMETRYFRONTEND, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) -os.environ[get_env_var_name(ServiceNameEnum.TELEMETRYFRONTEND, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(TELEMETRY_FRONTEND_PORT) - -LOGGER = logging.getLogger(__name__) - -class MockContextService(GenericGrpcService): - # Mock Service implementing Context to simplify unitary tests of Monitoring - - def __init__(self, bind_port: Union[str, int]) -> None: - super().__init__(bind_port, LOCAL_HOST, enable_health_servicer=False, cls_name='MockService') - - # pylint: disable=attribute-defined-outside-init - def install_servicers(self): - self.context_servicer = MockServicerImpl_Context() - add_ContextServiceServicer_to_server(self.context_servicer, self.server) - -@pytest.fixture(scope='session') -def context_service(): - LOGGER.info('Initializing MockContextService...') - _service = MockContextService(MOCKSERVICE_PORT) - _service.start() - - LOGGER.info('Yielding MockContextService...') - yield _service - - LOGGER.info('Terminating MockContextService...') - _service.context_servicer.msg_broker.terminate() - _service.stop() - - LOGGER.info('Terminated MockContextService...') - -@pytest.fixture(scope='session') -def context_client(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument - LOGGER.info('Initializing ContextClient...') - _client = ContextClient() - - LOGGER.info('Yielding ContextClient...') - yield _client - - LOGGER.info('Closing ContextClient...') - _client.close() - - LOGGER.info('Closed ContextClient...') - -@pytest.fixture(scope='session') -def device_service(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument - LOGGER.info('Initializing DeviceService...') - driver_factory = DriverFactory(DRIVERS) - driver_instance_cache = DriverInstanceCache(driver_factory) - _service = DeviceService(driver_instance_cache) - _service.start() - - # yield the server, when test finishes, execution will resume to stop it - LOGGER.info('Yielding DeviceService...') - yield _service - - LOGGER.info('Terminating DeviceService...') - _service.stop() - - LOGGER.info('Terminated DeviceService...') - -@pytest.fixture(scope='session') -def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument - LOGGER.info('Initializing DeviceClient...') - _client = DeviceClient() - - LOGGER.info('Yielding DeviceClient...') - yield _client - - LOGGER.info('Closing DeviceClient...') - _client.close() - - LOGGER.info('Closed DeviceClient...') - -@pytest.fixture(scope='session') -def telemetryFrontend_service( - context_service : MockContextService, - device_service : DeviceService - ): - LOGGER.info('Initializing TelemetryFrontendService...') - name_mapping = NameMapping() - - _service = TelemetryFrontendService(name_mapping) - _service.start() - - # yield the server, when test finishes, execution will resume to stop it - LOGGER.info('Yielding TelemetryFrontendService...') - yield _service - - LOGGER.info('Terminating TelemetryFrontendService...') - _service.stop() - - LOGGER.info('Terminated TelemetryFrontendService...') - -@pytest.fixture(scope='session') -def telemetryFrontend_client( - telemetryFrontend_service : TelemetryFrontendService - ): - LOGGER.info('Initializing TelemetryFrontendClient...') - _client = TelemetryFrontendClient() - - # yield the server, when test finishes, execution will resume to stop it - LOGGER.info('Yielding TelemetryFrontendClient...') - yield _client - - LOGGER.info('Closing TelemetryFrontendClient...') - _client.close() - - LOGGER.info('Closed TelemetryFrontendClient...') - - -########################### -# Tests Implementation of Telemetry Frontend -########################### - -def test_start_collector(telemetryFrontend_client): - LOGGER.warning('test_start_collector requesting') - response = telemetryFrontend_client.StartCollector(create_collector_request_b('11',10,2)) - LOGGER.debug(str(response)) - assert isinstance(response, CollectorId) - -# def test_stop_collector(telemetryFrontend_client): -# LOGGER.warning('test_stop_collector requesting') -# response = telemetryFrontend_client.StopCollector(create_collector_id("1")) -# LOGGER.debug(str(response)) -# assert isinstance(response, Empty) - -# def test_select_collectors(telemetryFrontend_client): -# LOGGER.warning('test_select_collector requesting') -# response = telemetryFrontend_client.SelectCollectors(create_collector_filter()) -# LOGGER.debug(str(response)) -# assert isinstance(response, CollectorList) \ No newline at end of file -- GitLab From 178b72d05ae92cd290a13108742d86705e7367e3 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 16 May 2024 13:53:00 +0000 Subject: [PATCH 227/602] StartCollector is working fine with unique communication identification logic. --- .../service/TelemetryBackendService.py | 100 +++++++++++------- .../TelemetryFrontendServiceServicerImpl.py | 28 +++-- src/telemetry/frontend/tests/Messages.py | 4 +- src/telemetry/frontend/tests/test_frontend.py | 25 +++-- 4 files changed, 99 insertions(+), 58 deletions(-) diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index d5ba6ced4..6cc3aab5f 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -19,7 +19,7 @@ import random import logging import requests import threading -from typing import Tuple +from typing import Any, Tuple from common.proto.context_pb2 import Empty from confluent_kafka import Producer as KafkaProducer from confluent_kafka import Consumer as KafkaConsumer @@ -32,6 +32,8 @@ from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_m LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('Telemetry', 'TelemetryBackend') KAFKA_SERVER_IP = '127.0.0.1:9092' +ADMIN_KAFKA_CLIENT = AdminClient({'bootstrap.servers': KAFKA_SERVER_IP}) +ACTIVE_COLLECTORS = [] class TelemetryBackendService: """ @@ -41,6 +43,10 @@ class TelemetryBackendService: def __init__(self): LOGGER.info('Init TelemetryBackendService') + def run_kafka_listener(self)->bool: # type: ignore + threading.Thread(target=self.kafka_listener).start() + return True + def kafka_listener(self): """ listener for requests on Kafka topic. @@ -51,14 +57,14 @@ class TelemetryBackendService: 'auto.offset.reset' : 'latest' } topic_request = "topic_request" - if (self.create_topic_if_not_exists(topic_request)): + if (self.create_topic_if_not_exists([topic_request])): consumerObj = KafkaConsumer(conusmer_configs) consumerObj.subscribe([topic_request]) while True: receive_msg = consumerObj.poll(2.0) if receive_msg is None: - print ("Telemetry backend is listening on Kafka Topic: ", topic_request) # added for debugging purposes + print (time.time(), " - Telemetry backend is listening on Kafka Topic: ", topic_request) # added for debugging purposes continue elif receive_msg.error(): if receive_msg.error().code() == KafkaError._PARTITION_EOF: @@ -67,40 +73,38 @@ class TelemetryBackendService: print("Consumer error: {}".format(receive_msg.error())) break (kpi_id, duration, interval) = ast.literal_eval(receive_msg.value().decode('utf-8')) - self.execute_initiate_collector_backend(kpi_id, duration, interval) + collector_id = receive_msg.key().decode('utf-8') + self.run_initiate_collector_backend(collector_id, kpi_id, duration, interval) - def run_kafka_listener(self)->bool: # type: ignore - threading.Thread(target=self.kafka_listener).start() - return True - def initiate_collector_backend(self, kpi_id, duration, interval + + def run_initiate_collector_backend(self, collector_id: str, kpi_id: str, duration: int, interval: int): + threading.Thread(target=self.initiate_collector_backend, args=(collector_id, kpi_id, duration, interval)).start() + + def initiate_collector_backend(self, collector_id, kpi_id, duration, interval ): # type: ignore """ Method to receive collector request attribues and initiates collecter backend. """ start_time = time.time() while True: + ACTIVE_COLLECTORS.append(collector_id) if time.time() - start_time >= duration: # type: ignore print("Requested Execution Time Completed: \n --- Consumer terminating: KPI ID: ", kpi_id, " - ", time.time() - start_time) break # print ("Received KPI: ", kpi_id, ", Duration: ", duration, ", Fetch Interval: ", interval) - self.extract_kpi_value(kpi_id) + self.extract_kpi_value(collector_id, kpi_id) # print ("Telemetry Backend running for KPI: ", kpi_id, "after FETCH INTERVAL: ", interval) time.sleep(interval) - - def execute_initiate_collector_backend(self, kpi_id: str, duration: int, interval: int): - threading.Thread(target=self.initiate_collector_backend, args=(kpi_id, duration, interval)).start() - - - def extract_kpi_value(self, kpi_id: str): + def extract_kpi_value(self, collector_id: str, kpi_id: str): """ Method to extract kpi value. """ measured_kpi_value = random.randint(1,100) - self.generate_kafka_reply(kpi_id , measured_kpi_value) + self.generate_kafka_response(collector_id, kpi_id , measured_kpi_value) - def generate_kafka_reply(self, kpi_id: str, kpi_value: any): + def generate_kafka_response(self, collector_id: str, kpi_id: str, kpi_value: Any): """ Method to write response on Kafka topic """ @@ -108,33 +112,32 @@ class TelemetryBackendService: 'bootstrap.servers': KAFKA_SERVER_IP, } topic_response = "topic_response" - if (self.create_topic_if_not_exists(topic_response)): - msg_value = Tuple [str, any] - msg_value = (kpi_id, kpi_value) - msg_key = "111" # to be fetch from db??? + msg_value : Tuple [str, Any] = (kpi_id, kpi_value) + msg_key = collector_id + producerObj = KafkaProducer(producer_configs) + producerObj.produce(topic_response, key=msg_key, value= str(msg_value), callback=self.delivery_callback) + producerObj.flush() - producerObj = KafkaProducer(producer_configs) - producerObj.produce(topic_response, key=msg_key, value= str(msg_value), callback=self.delivery_callback) - producerObj.flush() - - def create_topic_if_not_exists(self, new_topic_name: str): + def create_topic_if_not_exists(self, new_topics: list): """ Method to create Kafka topic if it does not exist. Args: admin_client (AdminClient): Kafka admin client. """ - admin_kafka_client = AdminClient({'bootstrap.servers': KAFKA_SERVER_IP}) - try: - topic_metadata = admin_kafka_client.list_topics(timeout=5) - if new_topic_name not in topic_metadata.topics: - # If the topic does not exist, create a new topic - print(f"Topic '{new_topic_name}' does not exist. Creating...") - new_topic = NewTopic(new_topic_name, num_partitions=1, replication_factor=1) - admin_kafka_client.create_topics([new_topic]) - return True - except KafkaException as e: - print(f"Failed to create topic: {e}") - return False + for topic in new_topics: + try: + topic_metadata = ADMIN_KAFKA_CLIENT.list_topics(timeout=5) + if topic not in topic_metadata.topics: + # If the topic does not exist, create a new topic + print(f"Topic '{topic}' does not exist. Creating...") + new_topic = NewTopic(topic, num_partitions=1, replication_factor=1) + ADMIN_KAFKA_CLIENT.create_topics([new_topic]) + return True + except KafkaException as e: + print(f"Failed to create topic: {e}") + return False + + self.verify_required_kafka_topics() def delivery_callback(self, err, msg): """ @@ -148,7 +151,21 @@ class TelemetryBackendService: else: print(f'Message delivered to topic {msg.topic()}') + # Function to create a list of topics + # Function to list all topics in the Kafka cluster + def verify_required_kafka_topics(self) -> list: + """List all topics in the Kafka cluster.""" + try: + # Fetch metadata from the broker + metadata = ADMIN_KAFKA_CLIENT.list_topics(timeout=10) + topics = list(metadata.topics.keys()) + print("Topics in the cluster:", topics) + return topics + except Exception as e: + print(f"Failed to list topics: {e}") + return [] + # ----------- BELOW: Actual Implementation of Kafka Producer with Node Exporter ----------- @@ -159,8 +176,9 @@ class TelemetryBackendService: str: Metrics fetched from Node Exporter. """ KPI = "node_network_receive_packets_total" + EXPORTER_ENDPOINT = "http://node-exporter-7465c69b87-b6ks5.telebackend:9100/metrics" try: - response = requests.get(self.exporter_endpoint) # type: ignore + response = requests.get(EXPORTER_ENDPOINT) # type: ignore if response.status_code == 200: # print(f"Metrics fetched sucessfully...") metrics = response.text @@ -202,7 +220,7 @@ class TelemetryBackendService: Method to produce metrics to Kafka topic as per Kafka configs. """ conf = { - 'bootstrap.servers': self.bootstrap_servers, + 'bootstrap.servers': KAFKA_SERVER_IP, } admin_client = AdminClient(conf) @@ -216,7 +234,7 @@ class TelemetryBackendService: metrics = self.fetch_node_exporter_metrics() # select the function name based on the provided requirements if metrics: - kafka_producer.produce(self.kafka_topic, str(metrics), callback=self.delivery_callback) + kafka_producer.produce("topic_raw", str(metrics), callback=self.delivery_callback) kafka_producer.flush() # print("Metrics produced to Kafka topic") diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index 045c56d5b..ebd0db4ac 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -15,7 +15,7 @@ import ast import threading import time -from typing import Tuple +from typing import Tuple, Any import grpc import logging @@ -30,9 +30,10 @@ from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_m from common.proto.telemetry_frontend_pb2_grpc import TelemetryFrontendServiceServicer -LOGGER = logging.getLogger(__name__) -METRICS_POOL = MetricsPool('Monitoring', 'TelemetryFrontend') -KAFKA_SERVER_IP = '127.0.0.1:9092' +LOGGER = logging.getLogger(__name__) +METRICS_POOL = MetricsPool('Monitoring', 'TelemetryFrontend') +KAFKA_SERVER_IP = '127.0.0.1:9092' +ACTIVE_COLLECTORS = [] class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): def __init__(self, name_mapping : NameMapping): @@ -50,7 +51,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): _collector_interval = int(request.interval_s) self.generate_kafka_request(_collector_id, _collector_kpi_id, _collector_duration, _collector_interval) # self.run_generate_kafka_request(_collector_id, _collector_kpi_id, _collector_duration, _collector_interval) - response.collector_id.uuid = request.collector_id.collector_id.uuid + response.collector_id.uuid = request.collector_id.collector_id.uuid # type: ignore return response def run_generate_kafka_request(self, msg_key: str, kpi: str, duration : int, interval: int): @@ -74,6 +75,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): ", \nKPI: ", kpi, ", Duration: ", duration, ", Interval: ", interval) producerObj = KafkaProducer(producer_configs) producerObj.produce(topic_request, key=msg_key, value= str(msg_value), callback=self.delivery_callback) + ACTIVE_COLLECTORS.append(msg_key) producerObj.flush() return producerObj @@ -108,11 +110,19 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): else: print("Consumer error: {}".format(receive_msg.error())) break - (kpi_id, kpi_value) = ast.literal_eval(receive_msg.value().decode('utf-8')) - self.process_response(kpi_id, kpi_value) - # threading.Thread(target=self.process_response, args=(kpi_id, kpi_value)).start() + try: + collector_id = receive_msg.key().decode('utf-8') + if collector_id in ACTIVE_COLLECTORS: + (kpi_id, kpi_value) = ast.literal_eval(receive_msg.value().decode('utf-8')) + self.process_response(kpi_id, kpi_value) + else: + print(f"collector id does not match.\nRespone ID: '{collector_id}' --- Active IDs: '{ACTIVE_COLLECTORS}' ") + except Exception as e: + print(f"No message key found: {str(e)}") + continue + # return None - def process_response(self, kpi_id: str, kpi_value: any): + def process_response(self, kpi_id: str, kpi_value: Any): print ("Frontend - KPI: ", kpi_id, ", VALUE: ", kpi_value) @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) diff --git a/src/telemetry/frontend/tests/Messages.py b/src/telemetry/frontend/tests/Messages.py index 93a6066ee..2dea48c88 100644 --- a/src/telemetry/frontend/tests/Messages.py +++ b/src/telemetry/frontend/tests/Messages.py @@ -22,7 +22,7 @@ def create_collector_id(): _collector_id.collector_id.uuid = uuid.uuid4() return _collector_id -def create_collector_id(coll_id_str : str): +def create_collector_id_a(coll_id_str : str): _collector_id = telemetry_frontend_pb2.CollectorId() _collector_id.collector_id.uuid = str(coll_id_str) return _collector_id @@ -32,7 +32,7 @@ def create_collector_request(): _create_collector_request.collector_id.collector_id.uuid = str(uuid.uuid4()) _create_collector_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) _create_collector_request.duration_s = float(random.randint(8, 16)) - _create_collector_request.interval_s = float(random.randint(2, 3)) + _create_collector_request.interval_s = float(random.randint(2, 4)) return _create_collector_request def create_collector_request_a(): diff --git a/src/telemetry/frontend/tests/test_frontend.py b/src/telemetry/frontend/tests/test_frontend.py index 4f59630d4..a531ed617 100644 --- a/src/telemetry/frontend/tests/test_frontend.py +++ b/src/telemetry/frontend/tests/test_frontend.py @@ -13,6 +13,7 @@ # limitations under the License. import os +import time import pytest import logging from typing import Union @@ -50,7 +51,7 @@ from device.service.drivers import DRIVERS LOCAL_HOST = '127.0.0.1' MOCKSERVICE_PORT = 10000 -TELEMETRY_FRONTEND_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.TELEMETRYFRONTEND) +TELEMETRY_FRONTEND_PORT = str(MOCKSERVICE_PORT) + str(get_service_port_grpc(ServiceNameEnum.TELEMETRYFRONTEND)) os.environ[get_env_var_name(ServiceNameEnum.TELEMETRYFRONTEND, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) os.environ[get_env_var_name(ServiceNameEnum.TELEMETRYFRONTEND, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(TELEMETRY_FRONTEND_PORT) @@ -172,6 +173,18 @@ def test_start_collector(telemetryFrontend_client): LOGGER.debug(str(response)) assert isinstance(response, CollectorId) +def test_start_collector_a(telemetryFrontend_client): + LOGGER.warning('test_start_collector requesting') + response = telemetryFrontend_client.StartCollector(create_collector_request()) + LOGGER.debug(str(response)) + assert isinstance(response, CollectorId) + +def test_start_collector_b(telemetryFrontend_client): + LOGGER.warning('test_start_collector requesting') + response = telemetryFrontend_client.StartCollector(create_collector_request()) + LOGGER.debug(str(response)) + assert isinstance(response, CollectorId) + def test_run_kafka_listener(): LOGGER.warning('test_receive_kafka_request requesting') name_mapping = NameMapping() @@ -180,11 +193,11 @@ def test_run_kafka_listener(): LOGGER.debug(str(response)) assert isinstance(response, bool) -def test_stop_collector(telemetryFrontend_client): - LOGGER.warning('test_stop_collector requesting') - response = telemetryFrontend_client.StopCollector(create_collector_id("1")) - LOGGER.debug(str(response)) - assert isinstance(response, Empty) +# def test_stop_collector(telemetryFrontend_client): +# LOGGER.warning('test_stop_collector requesting') +# response = telemetryFrontend_client.StopCollector(create_collector_id("1")) +# LOGGER.debug(str(response)) +# assert isinstance(response, Empty) # def test_select_collectors(telemetryFrontend_client): # LOGGER.warning('test_select_collector requesting') -- GitLab From 8ce11c893f923cd86d12468e973bef8e0c4c6de4 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 24 May 2024 09:05:20 +0000 Subject: [PATCH 228/602] improvements in Telemetry backend and Frontend service functionalities. --- .../service/TelemetryBackendService.py | 125 ++++++------------ .../backend/tests/testTelemetryBackend.py | 8 ++ .../TelemetryFrontendServiceServicerImpl.py | 16 ++- 3 files changed, 57 insertions(+), 92 deletions(-) diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 6cc3aab5f..9d393b1ad 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -29,11 +29,14 @@ from confluent_kafka.admin import AdminClient, NewTopic from common.proto.telemetry_frontend_pb2 import Collector, CollectorId from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method -LOGGER = logging.getLogger(__name__) -METRICS_POOL = MetricsPool('Telemetry', 'TelemetryBackend') -KAFKA_SERVER_IP = '127.0.0.1:9092' +LOGGER = logging.getLogger(__name__) +METRICS_POOL = MetricsPool('Telemetry', 'TelemetryBackend') +KAFKA_SERVER_IP = '127.0.0.1:9092' ADMIN_KAFKA_CLIENT = AdminClient({'bootstrap.servers': KAFKA_SERVER_IP}) -ACTIVE_COLLECTORS = [] +ACTIVE_COLLECTORS = [] +KAFKA_TOPICS = {'request' : 'topic_request', + 'response': 'topic_response'} +EXPORTER_ENDPOINT = "http://node-exporter-7465c69b87-b6ks5.telebackend:9100/metrics" class TelemetryBackendService: """ @@ -43,7 +46,7 @@ class TelemetryBackendService: def __init__(self): LOGGER.info('Init TelemetryBackendService') - def run_kafka_listener(self)->bool: # type: ignore + def run_kafka_listener(self)->bool: threading.Thread(target=self.kafka_listener).start() return True @@ -56,26 +59,26 @@ class TelemetryBackendService: 'group.id' : 'backend', 'auto.offset.reset' : 'latest' } - topic_request = "topic_request" - if (self.create_topic_if_not_exists([topic_request])): - consumerObj = KafkaConsumer(conusmer_configs) - consumerObj.subscribe([topic_request]) - - while True: - receive_msg = consumerObj.poll(2.0) - if receive_msg is None: - print (time.time(), " - Telemetry backend is listening on Kafka Topic: ", topic_request) # added for debugging purposes - continue - elif receive_msg.error(): - if receive_msg.error().code() == KafkaError._PARTITION_EOF: - continue - else: - print("Consumer error: {}".format(receive_msg.error())) - break - (kpi_id, duration, interval) = ast.literal_eval(receive_msg.value().decode('utf-8')) - collector_id = receive_msg.key().decode('utf-8') - self.run_initiate_collector_backend(collector_id, kpi_id, duration, interval) + # topic_request = "topic_request" + consumerObj = KafkaConsumer(conusmer_configs) + # consumerObj.subscribe([topic_request]) + consumerObj.subscribe([KAFKA_TOPICS['request']]) + while True: + receive_msg = consumerObj.poll(2.0) + if receive_msg is None: + # print (time.time(), " - Telemetry backend is listening on Kafka Topic: ", topic_request) # added for debugging purposes + print (time.time(), " - Telemetry backend is listening on Kafka Topic: ", KAFKA_TOPICS['request']) # added for debugging purposes + continue + elif receive_msg.error(): + if receive_msg.error().code() == KafkaError._PARTITION_EOF: + continue + else: + print("Consumer error: {}".format(receive_msg.error())) + break + (kpi_id, duration, interval) = ast.literal_eval(receive_msg.value().decode('utf-8')) + collector_id = receive_msg.key().decode('utf-8') + self.run_initiate_collector_backend(collector_id, kpi_id, duration, interval) def run_initiate_collector_backend(self, collector_id: str, kpi_id: str, duration: int, interval: int): @@ -89,8 +92,10 @@ class TelemetryBackendService: start_time = time.time() while True: ACTIVE_COLLECTORS.append(collector_id) - if time.time() - start_time >= duration: # type: ignore - print("Requested Execution Time Completed: \n --- Consumer terminating: KPI ID: ", kpi_id, " - ", time.time() - start_time) + if time.time() - start_time >= duration: # condition to terminate backend + print("Execution Time Completed: \n --- Consumer terminating: KPI ID: ", kpi_id, " - ", time.time() - start_time) + self.generate_kafka_response(collector_id, "NULL", False) + # write to Kafka break # print ("Received KPI: ", kpi_id, ", Duration: ", duration, ", Fetch Interval: ", interval) self.extract_kpi_value(collector_id, kpi_id) @@ -101,7 +106,8 @@ class TelemetryBackendService: """ Method to extract kpi value. """ - measured_kpi_value = random.randint(1,100) + measured_kpi_value = random.randint(1,100) # Should be extracted from exporter/stream + # measured_kpi_value = self.fetch_node_exporter_metrics() # exporter extracted metric value against default KPI self.generate_kafka_response(collector_id, kpi_id , measured_kpi_value) def generate_kafka_response(self, collector_id: str, kpi_id: str, kpi_value: Any): @@ -111,14 +117,15 @@ class TelemetryBackendService: producer_configs = { 'bootstrap.servers': KAFKA_SERVER_IP, } - topic_response = "topic_response" + # topic_response = "topic_response" msg_value : Tuple [str, Any] = (kpi_id, kpi_value) msg_key = collector_id producerObj = KafkaProducer(producer_configs) - producerObj.produce(topic_response, key=msg_key, value= str(msg_value), callback=self.delivery_callback) + # producerObj.produce(topic_response, key=msg_key, value= str(msg_value), callback=self.delivery_callback) + producerObj.produce(KAFKA_TOPICS['response'], key=msg_key, value= str(msg_value), callback=self.delivery_callback) producerObj.flush() - def create_topic_if_not_exists(self, new_topics: list): + def create_topic_if_not_exists(self, new_topics: list) -> bool: """ Method to create Kafka topic if it does not exist. Args: @@ -132,12 +139,10 @@ class TelemetryBackendService: print(f"Topic '{topic}' does not exist. Creating...") new_topic = NewTopic(topic, num_partitions=1, replication_factor=1) ADMIN_KAFKA_CLIENT.create_topics([new_topic]) - return True except KafkaException as e: print(f"Failed to create topic: {e}") return False - - self.verify_required_kafka_topics() + return True def delivery_callback(self, err, msg): """ @@ -151,22 +156,6 @@ class TelemetryBackendService: else: print(f'Message delivered to topic {msg.topic()}') - # Function to create a list of topics - - # Function to list all topics in the Kafka cluster - def verify_required_kafka_topics(self) -> list: - """List all topics in the Kafka cluster.""" - try: - # Fetch metadata from the broker - metadata = ADMIN_KAFKA_CLIENT.list_topics(timeout=10) - topics = list(metadata.topics.keys()) - print("Topics in the cluster:", topics) - return topics - except Exception as e: - print(f"Failed to list topics: {e}") - return [] - - # ----------- BELOW: Actual Implementation of Kafka Producer with Node Exporter ----------- def fetch_node_exporter_metrics(self): @@ -176,7 +165,6 @@ class TelemetryBackendService: str: Metrics fetched from Node Exporter. """ KPI = "node_network_receive_packets_total" - EXPORTER_ENDPOINT = "http://node-exporter-7465c69b87-b6ks5.telebackend:9100/metrics" try: response = requests.get(EXPORTER_ENDPOINT) # type: ignore if response.status_code == 200: @@ -200,7 +188,7 @@ class TelemetryBackendService: """ Method to extract the value of a metric from the metrics string. Args: - metrics (str): Metrics string fetched from Node Exporter. + metrics (str): Metrics string fetched from Exporter. metric_name (str): Name of the metric to extract. Returns: float: Value of the extracted metric, or None if not found. @@ -215,39 +203,4 @@ class TelemetryBackendService: print(f"Metric '{metric_name}' not found in the metrics.") return None - def produce_metrics(self): - """ - Method to produce metrics to Kafka topic as per Kafka configs. - """ - conf = { - 'bootstrap.servers': KAFKA_SERVER_IP, - } - - admin_client = AdminClient(conf) - self.create_topic_if_not_exists(admin_client) - - kafka_producer = KafkaProducer(conf) - - try: - start_time = time.time() - while True: - metrics = self.fetch_node_exporter_metrics() # select the function name based on the provided requirements - - if metrics: - kafka_producer.produce("topic_raw", str(metrics), callback=self.delivery_callback) - kafka_producer.flush() - # print("Metrics produced to Kafka topic") - - # Check if the specified run duration has elapsed - if time.time() - start_time >= self.run_duration: # type: ignore - break - - # waiting time until next fetch - time.sleep(self.fetch_interval) # type: ignore - except KeyboardInterrupt: - print("Keyboard interrupt detected. Exiting...") - finally: - kafka_producer.flush() - # kafka_producer.close() # this command generates ERROR - # ----------- ABOVE: Actual Implementation of Kafka Producer with Node Exporter ----------- \ No newline at end of file diff --git a/src/telemetry/backend/tests/testTelemetryBackend.py b/src/telemetry/backend/tests/testTelemetryBackend.py index bdbb8526a..e3e8bbc4b 100644 --- a/src/telemetry/backend/tests/testTelemetryBackend.py +++ b/src/telemetry/backend/tests/testTelemetryBackend.py @@ -29,6 +29,14 @@ LOGGER = logging.getLogger(__name__) # Tests Implementation of Telemetry Backend ########################### +def test_verify_kafka_topics(): + LOGGER.warning('test_receive_kafka_request requesting') + TelemetryBackendServiceObj = TelemetryBackendService() + KafkaTopics = ['topic_request', 'topic_response'] + response = TelemetryBackendServiceObj.create_topic_if_not_exists(KafkaTopics) + LOGGER.debug(str(response)) + assert isinstance(response, bool) + def test_run_kafka_listener(): LOGGER.warning('test_receive_kafka_request requesting') TelemetryBackendServiceObj = TelemetryBackendService() diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index ebd0db4ac..f940ccd65 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -34,6 +34,9 @@ LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('Monitoring', 'TelemetryFrontend') KAFKA_SERVER_IP = '127.0.0.1:9092' ACTIVE_COLLECTORS = [] +KAFKA_TOPICS = {'request' : 'topic_request', + 'response': 'topic_response'} + class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): def __init__(self, name_mapping : NameMapping): @@ -51,7 +54,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): _collector_interval = int(request.interval_s) self.generate_kafka_request(_collector_id, _collector_kpi_id, _collector_duration, _collector_interval) # self.run_generate_kafka_request(_collector_id, _collector_kpi_id, _collector_duration, _collector_interval) - response.collector_id.uuid = request.collector_id.collector_id.uuid # type: ignore + response.collector_id.uuid = request.collector_id.collector_id.uuid # type: ignore return response def run_generate_kafka_request(self, msg_key: str, kpi: str, duration : int, interval: int): @@ -68,13 +71,14 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): producer_configs = { 'bootstrap.servers': KAFKA_SERVER_IP, } - topic_request = "topic_request" + # topic_request = "topic_request" msg_value = Tuple [str, int, int] msg_value = (kpi, duration, interval) print ("Request generated: ", "Colletcor Id: ", msg_key, \ ", \nKPI: ", kpi, ", Duration: ", duration, ", Interval: ", interval) producerObj = KafkaProducer(producer_configs) - producerObj.produce(topic_request, key=msg_key, value= str(msg_value), callback=self.delivery_callback) + producerObj.produce(KAFKA_TOPICS['request'], key=msg_key, value= str(msg_value), callback=self.delivery_callback) + # producerObj.produce(topic_request, key=msg_key, value= str(msg_value), callback=self.delivery_callback) ACTIVE_COLLECTORS.append(msg_key) producerObj.flush() return producerObj @@ -94,15 +98,15 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): 'group.id' : 'frontend', 'auto.offset.reset' : 'latest' } - topic_response = "topic_response" + # topic_response = "topic_response" consumerObj = KafkaConsumer(conusmer_configs) - consumerObj.subscribe([topic_response]) + consumerObj.subscribe([KAFKA_TOPICS['response']]) # print (time.time()) while True: receive_msg = consumerObj.poll(2.0) if receive_msg is None: - print (" - Telemetry frontend listening on Kafka Topic: ", topic_response) # added for debugging purposes + print (" - Telemetry frontend listening on Kafka Topic: ", KAFKA_TOPICS['response']) # added for debugging purposes continue elif receive_msg.error(): if receive_msg.error().code() == KafkaError._PARTITION_EOF: -- GitLab From f2c91300c1ebbe90299328d6106c52209581ebcc Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 25 May 2024 02:51:06 +0000 Subject: [PATCH 229/602] Telemetry crDB creation, basic operation and test --- scripts/run_tests_locally-telemetry-DB.sh | 26 ++++ scripts/show_logs_telemetry-DB.sh | 27 ++++ src/telemetry/database/TelemetryDB.py | 122 ++++++++++++++++++ src/telemetry/database/TelemetryEngine.py | 57 ++++++++ src/telemetry/database/TelemetryModel.py | 59 +++++++++ src/telemetry/database/__init__.py | 14 ++ src/telemetry/database/__main__.py | 15 +++ src/telemetry/database/tests/__init__.py | 13 ++ src/telemetry/database/tests/messages.py | 25 ++++ .../database/tests/telemetryDBtests.py | 40 ++++++ src/telemetry/telemetry_virenv.txt | 5 + 11 files changed, 403 insertions(+) create mode 100755 scripts/run_tests_locally-telemetry-DB.sh create mode 100755 scripts/show_logs_telemetry-DB.sh create mode 100644 src/telemetry/database/TelemetryDB.py create mode 100644 src/telemetry/database/TelemetryEngine.py create mode 100644 src/telemetry/database/TelemetryModel.py create mode 100644 src/telemetry/database/__init__.py create mode 100644 src/telemetry/database/__main__.py create mode 100644 src/telemetry/database/tests/__init__.py create mode 100644 src/telemetry/database/tests/messages.py create mode 100644 src/telemetry/database/tests/telemetryDBtests.py diff --git a/scripts/run_tests_locally-telemetry-DB.sh b/scripts/run_tests_locally-telemetry-DB.sh new file mode 100755 index 000000000..0a896d92c --- /dev/null +++ b/scripts/run_tests_locally-telemetry-DB.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# 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. + + +PROJECTDIR=`pwd` + +cd $PROJECTDIR/src +# RCFILE=$PROJECTDIR/coverage/.coveragerc +# coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \ +# kpi_manager/tests/test_unitary.py + +RCFILE=$PROJECTDIR/coverage/.coveragerc +python3 -m pytest --log-cli-level=INFO --verbose \ + telemetry/database/tests/telemetryDBtests.py \ No newline at end of file diff --git a/scripts/show_logs_telemetry-DB.sh b/scripts/show_logs_telemetry-DB.sh new file mode 100755 index 000000000..0f57a36af --- /dev/null +++ b/scripts/show_logs_telemetry-DB.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# 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. + +######################################################################################################################## +# Define your deployment settings here +######################################################################################################################## + +# If not already set, set the name of the Kubernetes namespace to deploy to. +export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"crdb"} + +######################################################################################################################## +# Automated steps start here +######################################################################################################################## + +kubectl --namespace $TFS_K8S_NAMESPACE logs cockroachdb-0 diff --git a/src/telemetry/database/TelemetryDB.py b/src/telemetry/database/TelemetryDB.py new file mode 100644 index 000000000..5ce722af5 --- /dev/null +++ b/src/telemetry/database/TelemetryDB.py @@ -0,0 +1,122 @@ +# 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 logging, time +from sqlalchemy import engine +from sqlalchemy.orm import sessionmaker +from telemetry.database.TelemetryModel import Collector as CollectorModel +from telemetry.database.TelemetryModel import Kpi as KpiModel +from sqlalchemy.ext.declarative import declarative_base +from telemetry.database.TelemetryEngine import TelemetryEngine + +LOGGER = logging.getLogger(__name__) + +# Create a base class for declarative models +Base = declarative_base() + +class TelemetryDB: + def __init__(self): + self.db_engine = TelemetryEngine.get_engine() + if self.db_engine is None: + LOGGER.error('Unable to get SQLAlchemy DB Engine...') + return False + LOGGER.info('test_telemetry_DB_connection -- Engine created sucessfully') + + def create_database(self): + try: + TelemetryEngine.create_database(self.db_engine) + LOGGER.info('test_telemetry_DB_connection -- DB created sucessfully') + return True + except: # pylint: disable=bare-except # pragma: no cover + LOGGER.exception('Failed to check/create the database: {:s}'.format(str(self.db_engine.url))) + return False + + # Function to create the collector and KPI tables in the database + def create_tables(self): + try: + Base.metadata.create_all(self.db_engine) # type: ignore + LOGGER.info("Collector and KPI tables created in the TelemetryFrontend database") + except Exception as e: + LOGGER.info("Tables cannot be created in the TelemetryFrontend database. {:s}".format(str(e))) + + # Function to insert a row into the Collector model + def insert_collector(self, kpi_id: int, collector: str, duration_s: float, interval_s: float): + # Create a session + Session = sessionmaker(bind=self.db_engine) + session = Session() + try: + # Create a new Collector instance + collectorObj = CollectorModel() + collectorObj.kpi_id = kpi_id + collectorObj.collector = collector + collectorObj.sampling_duration_s = duration_s + collectorObj.sampling_interval_s = interval_s + collectorObj.start_timestamp = time.time() + collectorObj.end_timestamp = time.time() + + # Add the instance to the session + session.add(collectorObj) + + # Commit the session + session.commit() + LOGGER.info("New collector inserted successfully") + except Exception as e: + session.rollback() + LOGGER.info("Failed to insert new collector. {:s}".format(str(e))) + finally: + # Close the session + session.close() + + def inser_kpi(self, kpi_id, kpi_descriptor): + # Create a session + Session = sessionmaker(bind=self.db_engine) + session = Session() + try: + # Create a new Collector instance + KpiObj = KpiModel() + KpiObj.kpi_id = kpi_id + KpiObj.kpi_description = kpi_descriptor + + # Add the instance to the session + session.add(KpiObj) + + # Commit the session + session.commit() + LOGGER.info("New collector inserted successfully") + except Exception as e: + session.rollback() + LOGGER.info("Failed to insert new collector. {:s}".format(str(e))) + finally: + # Close the session + session.close() + + def get_kpi(self, kpi_id): + # Create a session + Session = sessionmaker(bind=self.db_engine) + session = Session() + try: + kpi = session.query(KpiModel).filter_by(kpi_id=kpi_id).first() + + if kpi: + LOGGER.info("kpi ID found: {:s}".format(str(kpi))) + return kpi + else: + LOGGER.info("Kpi ID not found") + return None + except Exception as e: + LOGGER.info("Failed to retrieve KPI ID. {:s}".format(str(e))) + raise + finally: + # Close the session + session.close() \ No newline at end of file diff --git a/src/telemetry/database/TelemetryEngine.py b/src/telemetry/database/TelemetryEngine.py new file mode 100644 index 000000000..1884368bd --- /dev/null +++ b/src/telemetry/database/TelemetryEngine.py @@ -0,0 +1,57 @@ +# 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 logging, sqlalchemy, sqlalchemy_utils +# from common.Settings import get_setting + +LOGGER = logging.getLogger(__name__) + +APP_NAME = 'tfs' +ECHO = False # False: No dump SQL commands and transactions executed +CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' +# CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' +# CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' + +class TelemetryEngine: + # def __init__(self): + # self.engine = self.get_engine() + @staticmethod + def get_engine() -> sqlalchemy.engine.Engine: + CRDB_NAMESPACE = "crdb" + CRDB_SQL_PORT = "26257" + CRDB_DATABASE = "TelemetryFrontend" + CRDB_USERNAME = "tfs" + CRDB_PASSWORD = "tfs123" + CRDB_SSLMODE = "require" + crdb_uri = CRDB_URI_TEMPLATE.format( + CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) + # crdb_uri = CRDB_URI_TEMPLATE.format( + # CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) + try: + 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(str(crdb_uri))) + return None # type: ignore + return engine # type: ignore + + @staticmethod + def create_database(engine : sqlalchemy.engine.Engine) -> None: + if not sqlalchemy_utils.database_exists(engine.url): + sqlalchemy_utils.create_database(engine.url) + + @staticmethod + def drop_database(engine : sqlalchemy.engine.Engine) -> None: + if sqlalchemy_utils.database_exists(engine.url): + sqlalchemy_utils.drop_database(engine.url) diff --git a/src/telemetry/database/TelemetryModel.py b/src/telemetry/database/TelemetryModel.py new file mode 100644 index 000000000..1f40bad56 --- /dev/null +++ b/src/telemetry/database/TelemetryModel.py @@ -0,0 +1,59 @@ +# 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 logging +from sqlalchemy import Column, Integer, String, Float, Text, ForeignKey +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker, relationship + + +logging.basicConfig(level=logging.INFO) +LOGGER = logging.getLogger(__name__) + +# Create a base class for declarative models +Base = declarative_base() + +class Kpi(Base): + __tablename__ = 'KPI' + + kpi_id = Column(Integer, primary_key=True, autoincrement=True) + kpi_description = Column(Text) + 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) + monitor_flag = Column(String) + + # Relationship to Collector model: allows access to related Collector objects from a Kpi object + collectors = relationship('Collector', back_populates='kpi') + +class Collector(Base): + __tablename__ = 'collector' + + collector_id = Column(Integer, primary_key=True, autoincrement=True) + kpi_id = Column(Integer, ForeignKey('KPI.kpi_id')) + collector = Column(String) + sampling_duration_s = Column(Float) + sampling_interval_s = Column(Float) + start_timestamp = Column(Float) + end_timestamp = Column(Float) + + # Relationship to Kpi model: allows access to the related Kpi object from a Collector object + kpi = relationship('Kpi', back_populates='collectors') + + + diff --git a/src/telemetry/database/__init__.py b/src/telemetry/database/__init__.py new file mode 100644 index 000000000..1549d9811 --- /dev/null +++ b/src/telemetry/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/telemetry/database/__main__.py b/src/telemetry/database/__main__.py new file mode 100644 index 000000000..10f5e099a --- /dev/null +++ b/src/telemetry/database/__main__.py @@ -0,0 +1,15 @@ +# 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/telemetry/database/tests/__init__.py b/src/telemetry/database/tests/__init__.py new file mode 100644 index 000000000..f80ccfd52 --- /dev/null +++ b/src/telemetry/database/tests/__init__.py @@ -0,0 +1,13 @@ +# 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. \ No newline at end of file diff --git a/src/telemetry/database/tests/messages.py b/src/telemetry/database/tests/messages.py new file mode 100644 index 000000000..911abcdc9 --- /dev/null +++ b/src/telemetry/database/tests/messages.py @@ -0,0 +1,25 @@ +# 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 +import random +from common.proto import telemetry_frontend_pb2 + +def create_collector_request(): + _create_collector_request = telemetry_frontend_pb2.Collector() + _create_collector_request.collector_id.collector_id.uuid = str(uuid.uuid4()) + _create_collector_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) + _create_collector_request.duration_s = float(random.randint(8, 16)) + _create_collector_request.interval_s = float(random.randint(2, 4)) + return _create_collector_request \ No newline at end of file diff --git a/src/telemetry/database/tests/telemetryDBtests.py b/src/telemetry/database/tests/telemetryDBtests.py new file mode 100644 index 000000000..0d0977bce --- /dev/null +++ b/src/telemetry/database/tests/telemetryDBtests.py @@ -0,0 +1,40 @@ + +# 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 logging +from telemetry.database.TelemetryDB import TelemetryDB +from .messages import create_collector_request + +logging.basicConfig(level=logging.INFO) +LOGGER = logging.getLogger(__name__) + +def test_telemetry_DB_connection(): + LOGGER.info('test_telemetry_DB_connection begin') + TelemetryDBobj = TelemetryDB() + if(TelemetryDBobj.create_database()): + LOGGER.info('test_telemetry_DB_connection -----DB----') + TelemetryDBobj.create_tables() # type: ignore + LOGGER.info('test_telemetry_DB_connection -----Table----') + TelemetryDBobj.inser_kpi(4, 'this is test kpi') + LOGGER.info('test_telemetry_DB_connection -----INSERT KPI----') + TelemetryDBobj.insert_collector(4, "this is test collector", 3.0, 12.0) + LOGGER.info('test_telemetry_DB_connection -----INSERT COL----') + TelemetryDBobj.get_kpi(1) + LOGGER.info('test_telemetry_DB_connection -----GET KPI----') + + + + + \ No newline at end of file diff --git a/src/telemetry/telemetry_virenv.txt b/src/telemetry/telemetry_virenv.txt index 0ce9b803a..e39f80b65 100644 --- a/src/telemetry/telemetry_virenv.txt +++ b/src/telemetry/telemetry_virenv.txt @@ -7,6 +7,7 @@ colorama==0.4.6 confluent-kafka==2.3.0 coverage==6.3 future-fstrings==1.2.0 +greenlet==3.0.3 grpcio==1.47.5 grpcio-health-checking==1.47.5 grpcio-tools==1.47.5 @@ -37,7 +38,11 @@ pytz==2024.1 questdb==1.0.1 requests==2.27.1 six==1.16.0 +SQLAlchemy==1.4.52 +sqlalchemy-cockroachdb==1.4.4 +SQLAlchemy-Utils==0.38.3 toml==0.10.2 +typing_extensions==4.12.0 tzlocal==5.2 urllib3==1.26.18 wcwidth==0.2.13 -- GitLab From d0ee5beac3eb0eccfbb921588178dc7980ea24a4 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 27 May 2024 12:21:42 +0000 Subject: [PATCH 230/602] CRDB working example of all operations --- src/telemetry/database/tests/temp_DB.py | 284 ++++++++++++++++++++++++ 1 file changed, 284 insertions(+) create mode 100644 src/telemetry/database/tests/temp_DB.py diff --git a/src/telemetry/database/tests/temp_DB.py b/src/telemetry/database/tests/temp_DB.py new file mode 100644 index 000000000..5d3c3b1bd --- /dev/null +++ b/src/telemetry/database/tests/temp_DB.py @@ -0,0 +1,284 @@ +from sqlalchemy import create_engine, Column, String, Integer, Text, Float, ForeignKey +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker, relationship +from sqlalchemy.dialects.postgresql import UUID +import logging + +LOGGER = logging.getLogger(__name__) +Base = declarative_base() + +class Kpi(Base): + __tablename__ = 'kpi' + + kpi_id = Column(UUID(as_uuid=False), primary_key=True) + kpi_description = Column(Text) + 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) + + collectors = relationship('Collector', back_populates='kpi') + + def __repr__(self): + return (f"") + +class Collector(Base): + __tablename__ = 'collector' + + collector_id = Column(UUID(as_uuid=False), primary_key=True) + kpi_id = Column(UUID(as_uuid=False), ForeignKey('kpi.kpi_id')) + collector = Column(String) + sampling_duration_s = Column(Float) + sampling_interval_s = Column(Float) + start_timestamp = Column(Float) + end_timestamp = Column(Float) + + kpi = relationship('Kpi', back_populates='collectors') + + def __repr__(self): + return (f"") + +class DatabaseManager: + def __init__(self, db_url, db_name): + self.engine = create_engine(db_url) + self.db_name = db_name + self.Session = sessionmaker(bind=self.engine) + LOGGER.info("DatabaseManager initialized with DB URL: %s and DB Name: %s", db_url, db_name) + + def create_database(self): + try: + with self.engine.connect() as connection: + connection.execute(f"CREATE DATABASE {self.db_name};") + LOGGER.info("Database '%s' created successfully.", self.db_name) + except Exception as e: + LOGGER.error("Error creating database '%s': %s", self.db_name, e) + finally: + LOGGER.info("create_database method execution finished.") + + def create_tables(self): + try: + Base.metadata.create_all(self.engine) + LOGGER.info("Tables created successfully.") + except Exception as e: + LOGGER.error("Error creating tables: %s", e) + finally: + LOGGER.info("create_tables method execution finished.") + + def verify_table_creation(self): + try: + with self.engine.connect() as connection: + result = connection.execute("SHOW TABLES;") + tables = result.fetchall() + LOGGER.info("Tables verified: %s", tables) + return tables + except Exception as e: + LOGGER.error("Error verifying table creation: %s", e) + return [] + finally: + LOGGER.info("verify_table_creation method execution finished.") + + def insert_row_kpi(self, kpi_data): + session = self.Session() + try: + new_kpi = Kpi(**kpi_data) + session.add(new_kpi) + session.commit() + LOGGER.info("Inserted row into KPI table: %s", kpi_data) + except Exception as e: + session.rollback() + LOGGER.error("Error inserting row into KPI table: %s", e) + finally: + session.close() + LOGGER.info("insert_row_kpi method execution finished.") + + def insert_row_collector(self, collector_data): + session = self.Session() + try: + new_collector = Collector(**collector_data) + session.add(new_collector) + session.commit() + LOGGER.info("Inserted row into Collector table: %s", collector_data) + except Exception as e: + session.rollback() + LOGGER.error("Error inserting row into Collector table: %s", e) + finally: + session.close() + LOGGER.info("insert_row_collector method execution finished.") + + def verify_insertion_kpi(self, kpi_id): + session = self.Session() + try: + kpi = session.query(Kpi).filter_by(kpi_id=kpi_id).first() + LOGGER.info("Verified insertion in KPI table for kpi_id: %s, Result: %s", kpi_id, kpi) + return kpi + except Exception as e: + LOGGER.error("Error verifying insertion in KPI table for kpi_id %s: %s", kpi_id, e) + return None + finally: + session.close() + LOGGER.info("verify_insertion_kpi method execution finished.") + + def verify_insertion_collector(self, collector_id): + session = self.Session() + try: + collector = session.query(Collector).filter_by(collector_id=collector_id).first() + LOGGER.info("Verified insertion in Collector table for collector_id: %s, Result: %s", collector_id, collector) + return collector + except Exception as e: + LOGGER.error("Error verifying insertion in Collector table for collector_id %s: %s", collector_id, e) + return None + finally: + session.close() + LOGGER.info("verify_insertion_collector method execution finished.") + + def get_all_kpi_rows(self): + session = self.Session() + try: + kpi_rows = session.query(Kpi).all() + LOGGER.info("Fetched all rows from KPI table: %s", kpi_rows) + return kpi_rows + except Exception as e: + LOGGER.error("Error fetching all rows from KPI table: %s", e) + return [] + finally: + session.close() + LOGGER.info("get_all_kpi_rows method execution finished.") + + def get_all_collector_rows(self): + session = self.Session() + try: + collector_rows = session.query(Collector).all() + LOGGER.info("Fetched all rows from Collector table: %s", collector_rows) + return collector_rows + except Exception as e: + LOGGER.error("Error fetching all rows from Collector table: %s", e) + return [] + finally: + session.close() + LOGGER.info("get_all_collector_rows method execution finished.") + + def get_filtered_kpi_rows(self, **filters): + session = self.Session() + try: + query = session.query(Kpi) + for column, value in filters.items(): + query = query.filter(getattr(Kpi, column) == value) + result = query.all() + LOGGER.info("Fetched filtered rows from KPI table with filters ---------- : {:s}".format(str(result))) + return result + except NoResultFound: + LOGGER.warning("No results found in KPI table with filters %s", filters) + return [] + except Exception as e: + LOGGER.error("Error fetching filtered rows from KPI table with filters %s: %s", filters, e) + return [] + finally: + session.close() + LOGGER.info("get_filtered_kpi_rows method execution finished.") + + def get_filtered_collector_rows(self, **filters): + session = self.Session() + try: + query = session.query(Collector) + for column, value in filters.items(): + query = query.filter(getattr(Collector, column) == value) + result = query.all() + LOGGER.info("Fetched filtered rows from Collector table with filters %s: %s", filters, result) + return result + except NoResultFound: + LOGGER.warning("No results found in Collector table with filters %s", filters) + return [] + except Exception as e: + LOGGER.error("Error fetching filtered rows from Collector table with filters %s: %s", filters, e) + return [] + finally: + session.close() + LOGGER.info("get_filtered_collector_rows method execution finished.") + +# Example Usage +def main(): + CRDB_SQL_PORT = "26257" + CRDB_DATABASE = "TelemetryFrontend" + CRDB_USERNAME = "tfs" + CRDB_PASSWORD = "tfs123" + CRDB_SSLMODE = "require" + CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' + crdb_uri = CRDB_URI_TEMPLATE.format( + CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) + # db_url = "cockroachdb://username:password@localhost:26257/" + # db_name = "yourdatabase" + db_manager = DatabaseManager(crdb_uri, CRDB_DATABASE) + + # Create database + # db_manager.create_database() + + # Update db_url to include the new database name + db_manager.engine = create_engine(f"{crdb_uri}") + db_manager.Session = sessionmaker(bind=db_manager.engine) + + # Create tables + db_manager.create_tables() + + # Verify table creation + tables = db_manager.verify_table_creation() + LOGGER.info('Tables in the database: {:s}'.format(str(tables))) + + # Insert a row into the KPI table + kpi_data = { + 'kpi_id': '123e4567-e89b-12d3-a456-426614174100', + 'kpi_description': 'Sample KPI', + 'kpi_sample_type': 1, + 'device_id': 'device_1', + 'endpoint_id': 'endpoint_1', + 'service_id': 'service_1', + 'slice_id': 'slice_1', + 'connection_id': 'conn_1', + 'link_id': 'link_1' + } + db_manager.insert_row_kpi(kpi_data) + + # Insert a row into the Collector table + collector_data = { + 'collector_id': '123e4567-e89b-12d3-a456-426614174101', + 'kpi_id': '123e4567-e89b-12d3-a456-426614174000', + 'collector': 'Collector 1', + 'sampling_duration_s': 60.0, + 'sampling_interval_s': 10.0, + 'start_timestamp': 1625247600.0, + 'end_timestamp': 1625247660.0 + } + db_manager.insert_row_collector(collector_data) + + # Verify insertion into KPI table + kpi = db_manager.verify_insertion_kpi('123e4567-e89b-12d3-a456-426614174000') + print("Inserted KPI:", kpi) + + # Verify insertion into Collector table + collector = db_manager.verify_insertion_collector('123e4567-e89b-12d3-a456-426614174001') + print("Inserted Collector:", collector) + + # Get all rows from KPI table + all_kpi_rows = db_manager.get_all_kpi_rows() + LOGGER.info("All KPI Rows: %s", all_kpi_rows) + + # Get all rows from Collector table + all_collector_rows = db_manager.get_all_collector_rows() + LOGGER.info("All Collector Rows: %s", all_collector_rows) + + # Get filtered rows from KPI table + filtered_kpi_rows = db_manager.get_filtered_kpi_rows(kpi_description='Sample KPI') + LOGGER.info("Filtered KPI Rows: %s", filtered_kpi_rows) + + # Get filtered rows from Collector table + filtered_collector_rows = db_manager.get_filtered_collector_rows(collector='Collector 1') + LOGGER.info("Filtered Collector Rows: %s", filtered_collector_rows) \ No newline at end of file -- GitLab From c816a439e7256f1b283ca48b3d1484eae591dae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Tue, 30 Apr 2024 14:56:12 +0100 Subject: [PATCH 231/602] Final working version containerlab pre-configured lab Configuration files --- hackfest/containerlab/commands.txt | 20 +++++++++--------- hackfest/containerlab/srl1.cli | 16 ++++++++++++++ hackfest/containerlab/srl2.cli | 16 ++++++++++++++ hackfest/containerlab/tfs-scenario.clab.yml | 23 +++++++++++++-------- 4 files changed, 56 insertions(+), 19 deletions(-) create mode 100644 hackfest/containerlab/srl1.cli create mode 100644 hackfest/containerlab/srl2.cli diff --git a/hackfest/containerlab/commands.txt b/hackfest/containerlab/commands.txt index df5fbc0ce..ac91d4b08 100644 --- a/hackfest/containerlab/commands.txt +++ b/hackfest/containerlab/commands.txt @@ -83,19 +83,19 @@ $ssh admin@clab-tfs-scenario-srl1 # Check configurations done: -gnmic -a 172.100.100.101 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/network-instances' > srl1-nis.json -gnmic -a 172.100.100.101 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/interfaces' > srl1-ifs.json -gnmic -a 172.100.100.102 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/network-instances' > srl2-nis.json -gnmic -a 172.100.100.102 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/interfaces' > srl2-ifs.json +gnmic -a clab-tfs-scenario-srl1 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/network-instances' > srl1-nis.json +gnmic -a clab-tfs-scenario-srl1 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/interfaces' > srl1-ifs.json +gnmic -a clab-tfs-scenario-srl2 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/network-instances' > srl2-nis.json +gnmic -a clab-tfs-scenario-srl2 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/interfaces' > srl2-ifs.json # Delete elements: -gnmic -a 172.100.100.101 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/network-instances/network-instance[name=b19229e8]' -gnmic -a 172.100.100.101 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/1]/subinterfaces/subinterface[index=0]' -gnmic -a 172.100.100.101 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/2]/subinterfaces/subinterface[index=0]' -gnmic -a 172.100.100.102 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/network-instances/network-instance[name=b19229e8]' -gnmic -a 172.100.100.102 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/1]/subinterfaces/subinterface[index=0]' -gnmic -a 172.100.100.102 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/2]/subinterfaces/subinterface[index=0]' +gnmic -a clab-tfs-scenario-srl1 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/network-instances/network-instance[name=b19229e8]' +gnmic -a clab-tfs-scenario-srl1 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/1]/subinterfaces/subinterface[index=0]' +gnmic -a clab-tfs-scenario-srl1 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/2]/subinterfaces/subinterface[index=0]' +gnmic -a clab-tfs-scenario-srl2 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/network-instances/network-instance[name=b19229e8]' +gnmic -a clab-tfs-scenario-srl2 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/1]/subinterfaces/subinterface[index=0]' +gnmic -a clab-tfs-scenario-srl2 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/2]/subinterfaces/subinterface[index=0]' # Run gNMI Driver in standalone mode (advanced) PYTHONPATH=./src python -m src.device.tests.test_gnmi diff --git a/hackfest/containerlab/srl1.cli b/hackfest/containerlab/srl1.cli new file mode 100644 index 000000000..088a85eac --- /dev/null +++ b/hackfest/containerlab/srl1.cli @@ -0,0 +1,16 @@ +set / interface ethernet-1/2 admin-state enable +set / interface ethernet-1/2 subinterface 0 ipv4 admin-state enable +set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.1.1/24 + +set / interface ethernet-1/1 admin-state enable +set / interface ethernet-1/1 subinterface 0 ipv4 admin-state enable +set / interface ethernet-1/1 subinterface 0 ipv4 address 172.0.0.1/30 + +set / network-instance default interface ethernet-1/1.0 +set / network-instance default interface ethernet-1/2.0 + +set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.2 admin-state enable +set / network-instance default static-routes route 172.16.2.0/24 next-hop-group group1 admin-state enable + +set / system management openconfig admin-state enable +set / system gnmi-server network-instance mgmt yang-models openconfig \ No newline at end of file diff --git a/hackfest/containerlab/srl2.cli b/hackfest/containerlab/srl2.cli new file mode 100644 index 000000000..1a71a7169 --- /dev/null +++ b/hackfest/containerlab/srl2.cli @@ -0,0 +1,16 @@ +set / interface ethernet-1/2 admin-state enable +set / interface ethernet-1/2 subinterface 0 ipv4 admin-state enable +set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.2.1/24 + +set / interface ethernet-1/1 admin-state enable +set / interface ethernet-1/1 subinterface 0 ipv4 admin-state enable +set / interface ethernet-1/1 subinterface 0 ipv4 address 172.0.0.2/30 + +set / network-instance default interface ethernet-1/1.0 +set / network-instance default interface ethernet-1/2.0 + +set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.1 admin-state enable +set / network-instance default static-routes route 172.16.1.0/24 next-hop-group group1 admin-state enable + +set / system management openconfig admin-state enable +set / system gnmi-server network-instance mgmt yang-models openconfig \ No newline at end of file diff --git a/hackfest/containerlab/tfs-scenario.clab.yml b/hackfest/containerlab/tfs-scenario.clab.yml index f79378757..8b0ca6130 100644 --- a/hackfest/containerlab/tfs-scenario.clab.yml +++ b/hackfest/containerlab/tfs-scenario.clab.yml @@ -20,38 +20,43 @@ name: tfs-scenario mgmt: network: mgmt-net ipv4-subnet: 172.100.100.0/24 - topology: kinds: - srl: - image: ghcr.io/nokia/srlinux:23.3.1 + nokia_srlinux: + image: ghcr.io/nokia/srlinux:23.10.3 linux: image: ghcr.io/hellt/network-multitool nodes: srl1: - kind: srl + kind: nokia_srlinux type: ixr6 cpu: 0.5 - memory: 1GB + memory: 2GB mgmt-ipv4: 172.100.100.101 - #startup-config: srl1.cli + startup-config: srl1.cli srl2: - kind: srl + kind: nokia_srlinux type: ixr6 cpu: 0.5 - memory: 1GB + memory: 2GB mgmt-ipv4: 172.100.100.102 - #startup-config: srl2.cli + startup-config: srl2.cli client1: kind: linux cpu: 0.1 memory: 100MB mgmt-ipv4: 172.100.100.201 + exec: + - ip address add 172.16.1.10/24 dev eth1 + - ip route add 172.16.2.0/24 via 172.16.1.1 client2: kind: linux cpu: 0.1 memory: 100MB mgmt-ipv4: 172.100.100.202 + exec: + - ip address add 172.16.2.10/24 dev eth1 + - ip route add 172.16.1.0/24 via 172.16.2.1 links: - endpoints: ["srl1:e1-1", "srl2:e1-1"] -- GitLab From fdeccb2b759b742064b8e40e6e5cfc3dff6de3d3 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 27 May 2024 17:07:37 +0000 Subject: [PATCH 232/602] Kpi and Telemetry Basic operation: (Add, filter and select) --- src/telemetry/database/TelemetryDB.py | 122 --------------- src/telemetry/database/TelemetryDBmanager.py | 148 ++++++++++++++++++ src/telemetry/database/TelemetryEngine.py | 6 +- src/telemetry/database/TelemetryModel.py | 44 ++++-- src/telemetry/database/tests/messages.py | 33 +++- .../database/tests/telemetryDBtests.py | 46 +++--- 6 files changed, 239 insertions(+), 160 deletions(-) delete mode 100644 src/telemetry/database/TelemetryDB.py create mode 100644 src/telemetry/database/TelemetryDBmanager.py diff --git a/src/telemetry/database/TelemetryDB.py b/src/telemetry/database/TelemetryDB.py deleted file mode 100644 index 5ce722af5..000000000 --- a/src/telemetry/database/TelemetryDB.py +++ /dev/null @@ -1,122 +0,0 @@ -# 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 logging, time -from sqlalchemy import engine -from sqlalchemy.orm import sessionmaker -from telemetry.database.TelemetryModel import Collector as CollectorModel -from telemetry.database.TelemetryModel import Kpi as KpiModel -from sqlalchemy.ext.declarative import declarative_base -from telemetry.database.TelemetryEngine import TelemetryEngine - -LOGGER = logging.getLogger(__name__) - -# Create a base class for declarative models -Base = declarative_base() - -class TelemetryDB: - def __init__(self): - self.db_engine = TelemetryEngine.get_engine() - if self.db_engine is None: - LOGGER.error('Unable to get SQLAlchemy DB Engine...') - return False - LOGGER.info('test_telemetry_DB_connection -- Engine created sucessfully') - - def create_database(self): - try: - TelemetryEngine.create_database(self.db_engine) - LOGGER.info('test_telemetry_DB_connection -- DB created sucessfully') - return True - except: # pylint: disable=bare-except # pragma: no cover - LOGGER.exception('Failed to check/create the database: {:s}'.format(str(self.db_engine.url))) - return False - - # Function to create the collector and KPI tables in the database - def create_tables(self): - try: - Base.metadata.create_all(self.db_engine) # type: ignore - LOGGER.info("Collector and KPI tables created in the TelemetryFrontend database") - except Exception as e: - LOGGER.info("Tables cannot be created in the TelemetryFrontend database. {:s}".format(str(e))) - - # Function to insert a row into the Collector model - def insert_collector(self, kpi_id: int, collector: str, duration_s: float, interval_s: float): - # Create a session - Session = sessionmaker(bind=self.db_engine) - session = Session() - try: - # Create a new Collector instance - collectorObj = CollectorModel() - collectorObj.kpi_id = kpi_id - collectorObj.collector = collector - collectorObj.sampling_duration_s = duration_s - collectorObj.sampling_interval_s = interval_s - collectorObj.start_timestamp = time.time() - collectorObj.end_timestamp = time.time() - - # Add the instance to the session - session.add(collectorObj) - - # Commit the session - session.commit() - LOGGER.info("New collector inserted successfully") - except Exception as e: - session.rollback() - LOGGER.info("Failed to insert new collector. {:s}".format(str(e))) - finally: - # Close the session - session.close() - - def inser_kpi(self, kpi_id, kpi_descriptor): - # Create a session - Session = sessionmaker(bind=self.db_engine) - session = Session() - try: - # Create a new Collector instance - KpiObj = KpiModel() - KpiObj.kpi_id = kpi_id - KpiObj.kpi_description = kpi_descriptor - - # Add the instance to the session - session.add(KpiObj) - - # Commit the session - session.commit() - LOGGER.info("New collector inserted successfully") - except Exception as e: - session.rollback() - LOGGER.info("Failed to insert new collector. {:s}".format(str(e))) - finally: - # Close the session - session.close() - - def get_kpi(self, kpi_id): - # Create a session - Session = sessionmaker(bind=self.db_engine) - session = Session() - try: - kpi = session.query(KpiModel).filter_by(kpi_id=kpi_id).first() - - if kpi: - LOGGER.info("kpi ID found: {:s}".format(str(kpi))) - return kpi - else: - LOGGER.info("Kpi ID not found") - return None - except Exception as e: - LOGGER.info("Failed to retrieve KPI ID. {:s}".format(str(e))) - raise - finally: - # Close the session - session.close() \ No newline at end of file diff --git a/src/telemetry/database/TelemetryDBmanager.py b/src/telemetry/database/TelemetryDBmanager.py new file mode 100644 index 000000000..42d647e0d --- /dev/null +++ b/src/telemetry/database/TelemetryDBmanager.py @@ -0,0 +1,148 @@ +# 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 logging, time +from sqlalchemy import inspect +from sqlalchemy.orm import sessionmaker +from telemetry.database.TelemetryModel import Collector as CollectorModel +from telemetry.database.TelemetryModel import Kpi as KpiModel +from sqlalchemy.ext.declarative import declarative_base +from telemetry.database.TelemetryEngine import TelemetryEngine +from common.proto.kpi_manager_pb2 import KpiDescriptor, KpiId +from common.proto.telemetry_frontend_pb2 import Collector +from sqlalchemy.exc import SQLAlchemyError + + +LOGGER = logging.getLogger(__name__) +DB_NAME = "TelemetryFrontend" + +# Create a base class for declarative models +Base = declarative_base() + +class TelemetryDBmanager: + def __init__(self): + self.db_engine = TelemetryEngine.get_engine() + if self.db_engine is None: + LOGGER.error('Unable to get SQLAlchemy DB Engine...') + return False + self.db_name = DB_NAME + self.Session = sessionmaker(bind=self.db_engine) + + def create_database(self): + try: + with self.db_engine.connect() as connection: + connection.execute(f"CREATE DATABASE {self.db_name};") + LOGGER.info('TelemetryDBmanager initalized DB Name: {self.db_name}') + return True + except: # pylint: disable=bare-except # pragma: no cover + LOGGER.exception('Failed to check/create the database: {:s}'.format(str(self.db_engine.url))) + return False + + def create_tables(self): + try: + Base.metadata.create_all(self.db_engine) # type: ignore + LOGGER.info("Tables created in the DB Name: {:}".format(self.db_name)) + except Exception as e: + LOGGER.info("Tables cannot be created in the TelemetryFrontend database. {:s}".format(str(e))) + + def verify_tables(self): + try: + with self.db_engine.connect() as connection: + result = connection.execute("SHOW TABLES;") + tables = result.fetchall() + LOGGER.info("Tables verified: {:}".format(tables)) + except Exception as e: + LOGGER.info("Unable to fetch Table names. {:s}".format(str(e))) + + def inser_kpi(self, request: KpiDescriptor): + session = self.Session() + try: + # Create a new Collector instance + 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.service_id.service_uuid.uuid + kpi_to_insert.endpoint_id = request.device_id.device_uuid.uuid + kpi_to_insert.service_id = request.slice_id.slice_uuid.uuid + kpi_to_insert.slice_id = request.endpoint_id.endpoint_uuid.uuid + kpi_to_insert.connection_id = request.connection_id.connection_uuid.uuid + # kpi_to_insert.link_id = request.link_id.link_id.uuid + # Add the instance to the session + session.add(kpi_to_insert) + session.commit() + LOGGER.info("Row inserted into kpi table: {:}".format(kpi_to_insert)) + except Exception as e: + session.rollback() + LOGGER.info("Failed to insert new kpi. {:s}".format(str(e))) + finally: + # Close the session + session.close() + + # Function to insert a row into the Collector model + def insert_collector(self, request: Collector): + session = self.Session() + try: + # Create a new Collector instance + collector_to_insert = CollectorModel() + collector_to_insert.collector_id = request.collector_id.collector_id.uuid + collector_to_insert.kpi_id = request.kpi_id.kpi_id.uuid + collector_to_insert.collector = "Test collector description" + collector_to_insert.sampling_duration_s = request.duration_s + collector_to_insert.sampling_interval_s = request.interval_s + collector_to_insert.start_timestamp = time.time() + collector_to_insert.end_timestamp = time.time() + + session.add(collector_to_insert) + session.commit() + LOGGER.info("Row inserted into collector table: {:}".format(collector_to_insert)) + except Exception as e: + session.rollback() + LOGGER.info("Failed to insert new collector. {:s}".format(str(e))) + finally: + # Close the session + session.close() + + def get_kpi_descriptor(self, kpi_id: KpiId): + session = self.Session() + try: + kpi_id_to_get = kpi_id.kpi_id.uuid + kpi = session.query(KpiModel).filter_by(kpi_id=kpi_id_to_get).first() + if kpi: + LOGGER.info("kpi ID found: {:s}".format(str(kpi))) + return kpi + else: + LOGGER.info("Kpi ID not found{:s}".format(str(kpi_id_to_get))) + return None + except Exception as e: + session.rollback() + LOGGER.info("Failed to retrieve KPI ID. {:s}".format(str(e))) + raise + finally: + session.close() + + def select_kpi_descriptor(self, **filters): + session = self.Session() + try: + query = session.query(KpiModel) + for column, value in filters.items(): + query = query.filter(getattr(KpiModel, column) == value) + result = query.all() + LOGGER.info("Fetched filtered rows from KPI table with filters ---------- : {:s}".format(str(result))) + return result + except SQLAlchemyError as e: + LOGGER.error("Error fetching filtered rows from KPI table with filters {:}: {:}".format(filters, e)) + return [] + finally: + session.close() \ No newline at end of file diff --git a/src/telemetry/database/TelemetryEngine.py b/src/telemetry/database/TelemetryEngine.py index 1884368bd..d6e54cc2f 100644 --- a/src/telemetry/database/TelemetryEngine.py +++ b/src/telemetry/database/TelemetryEngine.py @@ -39,8 +39,10 @@ class TelemetryEngine: # crdb_uri = CRDB_URI_TEMPLATE.format( # CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) try: - engine = sqlalchemy.create_engine( - crdb_uri, connect_args={'application_name': APP_NAME}, echo=ECHO, future=True) + # engine = sqlalchemy.create_engine( + # crdb_uri, connect_args={'application_name': APP_NAME}, echo=ECHO, future=True) + engine = sqlalchemy.create_engine(crdb_uri) + LOGGER.info(' --- TelemetryDBmanager initalized with DB URL: {:}'.format(crdb_uri)) except: # pylint: disable=bare-except # pragma: no cover LOGGER.exception('Failed to connect to database: {:s}'.format(str(crdb_uri))) return None # type: ignore diff --git a/src/telemetry/database/TelemetryModel.py b/src/telemetry/database/TelemetryModel.py index 1f40bad56..8defdd2e8 100644 --- a/src/telemetry/database/TelemetryModel.py +++ b/src/telemetry/database/TelemetryModel.py @@ -13,6 +13,7 @@ # limitations under the License. import logging +from sqlalchemy.dialects.postgresql import UUID from sqlalchemy import Column, Integer, String, Float, Text, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, relationship @@ -25,35 +26,46 @@ LOGGER = logging.getLogger(__name__) Base = declarative_base() class Kpi(Base): - __tablename__ = 'KPI' + __tablename__ = 'kpi' - kpi_id = Column(Integer, primary_key=True, autoincrement=True) + kpi_id = Column(UUID(as_uuid=False), primary_key=True) kpi_description = Column(Text) 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) - monitor_flag = Column(String) + device_id = Column(String) + endpoint_id = Column(String) + service_id = Column(String) + slice_id = Column(String) + connection_id = Column(String) + link_id = Column(String) + # monitor_flag = Column(String) # Relationship to Collector model: allows access to related Collector objects from a Kpi object collectors = relationship('Collector', back_populates='kpi') + # helps in logging the information + def __repr__(self): + return (f"") + class Collector(Base): __tablename__ = 'collector' - collector_id = Column(Integer, primary_key=True, autoincrement=True) - kpi_id = Column(Integer, ForeignKey('KPI.kpi_id')) - collector = Column(String) + collector_id = Column(UUID(as_uuid=False), primary_key=True) + kpi_id = Column(UUID(as_uuid=False), ForeignKey('kpi.kpi_id')) + collector = Column(String) sampling_duration_s = Column(Float) sampling_interval_s = Column(Float) - start_timestamp = Column(Float) - end_timestamp = Column(Float) + start_timestamp = Column(Float) + end_timestamp = Column(Float) # Relationship to Kpi model: allows access to the related Kpi object from a Collector object kpi = relationship('Kpi', back_populates='collectors') - - + def __repr__(self): + return (f"") \ No newline at end of file diff --git a/src/telemetry/database/tests/messages.py b/src/telemetry/database/tests/messages.py index 911abcdc9..ea59d0925 100644 --- a/src/telemetry/database/tests/messages.py +++ b/src/telemetry/database/tests/messages.py @@ -15,11 +15,40 @@ import uuid import random from common.proto import telemetry_frontend_pb2 +from common.proto import kpi_manager_pb2 +from common.proto.kpi_sample_types_pb2 import KpiSampleType + def create_collector_request(): _create_collector_request = telemetry_frontend_pb2.Collector() _create_collector_request.collector_id.collector_id.uuid = str(uuid.uuid4()) - _create_collector_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) + _create_collector_request.kpi_id.kpi_id.uuid = '2a779f04-77a6-4b32-b020-893e0e1e656f' # must be primary key in kpi table + # _create_collector_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) _create_collector_request.duration_s = float(random.randint(8, 16)) _create_collector_request.interval_s = float(random.randint(2, 4)) - return _create_collector_request \ No newline at end of file + return _create_collector_request + +def create_kpi_request(): + _create_kpi_request = kpi_manager_pb2.KpiDescriptor() + _create_kpi_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) + _create_kpi_request.kpi_description = 'KPI Description Test' + _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED + _create_kpi_request.service_id.service_uuid.uuid = 'SERV' + _create_kpi_request.device_id.device_uuid.uuid = 'DEV' + _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC' + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END' + _create_kpi_request.connection_id.connection_uuid.uuid = 'CON' + # _create_kpi_request.link_id.link_id.uuid = 'LNK' + return _create_kpi_request + +def create_kpi_id_request(): + _create_kpi_id_request = kpi_manager_pb2.KpiId() + _create_kpi_id_request.kpi_id.uuid = '11e2c6c6-b507-40aa-ab3a-ffd41e7125f0' + return _create_kpi_id_request + +def create_kpi_filter_request(): + # create a dict as follows: 'Key' = 'KpiModel' column name and 'Value' = filter to apply. + _create_kpi_filter_request = dict() + _create_kpi_filter_request['kpi_sample_type'] = 102 + _create_kpi_filter_request['kpi_id'] = '11e2c6c6-b507-40aa-ab3a-ffd41e7125f0' + return _create_kpi_filter_request \ No newline at end of file diff --git a/src/telemetry/database/tests/telemetryDBtests.py b/src/telemetry/database/tests/telemetryDBtests.py index 0d0977bce..217bdcfd4 100644 --- a/src/telemetry/database/tests/telemetryDBtests.py +++ b/src/telemetry/database/tests/telemetryDBtests.py @@ -14,27 +14,37 @@ # limitations under the License. import logging -from telemetry.database.TelemetryDB import TelemetryDB -from .messages import create_collector_request +from typing import Any +from telemetry.database.TelemetryDBmanager import TelemetryDBmanager +from telemetry.database.TelemetryEngine import TelemetryEngine +from telemetry.database.tests import temp_DB +from .messages import create_kpi_request, create_collector_request, \ + create_kpi_id_request, create_kpi_filter_request logging.basicConfig(level=logging.INFO) LOGGER = logging.getLogger(__name__) -def test_telemetry_DB_connection(): - LOGGER.info('test_telemetry_DB_connection begin') - TelemetryDBobj = TelemetryDB() - if(TelemetryDBobj.create_database()): - LOGGER.info('test_telemetry_DB_connection -----DB----') - TelemetryDBobj.create_tables() # type: ignore - LOGGER.info('test_telemetry_DB_connection -----Table----') - TelemetryDBobj.inser_kpi(4, 'this is test kpi') - LOGGER.info('test_telemetry_DB_connection -----INSERT KPI----') - TelemetryDBobj.insert_collector(4, "this is test collector", 3.0, 12.0) - LOGGER.info('test_telemetry_DB_connection -----INSERT COL----') - TelemetryDBobj.get_kpi(1) - LOGGER.info('test_telemetry_DB_connection -----GET KPI----') - - - +# def test_temp_DB(): +# temp_DB.main() + +def test_telemetry_object_creation(): + LOGGER.info('--- test_telemetry_object_creation: START') + LOGGER.info('>>> Creating TelemetryDBmanager Object: ') + TelemetryDBmanagerObj = TelemetryDBmanager() + # LOGGER.info('>>> Creating Tables: ') + # TelemetryDBmanagerObj.create_tables() + # LOGGER.info('>>> Verifing Table creation: ') + # TelemetryDBmanagerObj.verify_tables() + LOGGER.info('>>> Row Insertion Operation: kpi Table') + kpi_obj = create_kpi_request() + TelemetryDBmanagerObj.inser_kpi(kpi_obj) + LOGGER.info('>>> Row Insertion Operation: collector Table') + collector_obj = create_collector_request() + TelemetryDBmanagerObj.insert_collector(collector_obj) + LOGGER.info('>>> Get KpiDescriptor ') + kpi_id_obj = create_kpi_id_request() + TelemetryDBmanagerObj.get_kpi_descriptor(kpi_id_obj) + kpi_filter : dict[str, Any] = create_kpi_filter_request() + TelemetryDBmanagerObj.select_kpi_descriptor(**kpi_filter) \ No newline at end of file -- GitLab From cd73d36ed715357bfadb6ba770746a4409b97678 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 27 May 2024 18:21:46 +0000 Subject: [PATCH 233/602] All DB operation for KPI Manager and Telemetry FrontEnd (Add, delete, filter, all) --- src/telemetry/database/TelemetryDBmanager.py | 85 +++++++++++++++++-- src/telemetry/database/tests/messages.py | 12 +++ .../database/tests/telemetryDBtests.py | 32 ++++++- src/telemetry/database/tests/temp_DB.py | 47 +++++++++- 4 files changed, 165 insertions(+), 11 deletions(-) diff --git a/src/telemetry/database/TelemetryDBmanager.py b/src/telemetry/database/TelemetryDBmanager.py index 42d647e0d..0380bc8ee 100644 --- a/src/telemetry/database/TelemetryDBmanager.py +++ b/src/telemetry/database/TelemetryDBmanager.py @@ -20,7 +20,7 @@ from telemetry.database.TelemetryModel import Kpi as KpiModel from sqlalchemy.ext.declarative import declarative_base from telemetry.database.TelemetryEngine import TelemetryEngine from common.proto.kpi_manager_pb2 import KpiDescriptor, KpiId -from common.proto.telemetry_frontend_pb2 import Collector +from common.proto.telemetry_frontend_pb2 import Collector, CollectorId from sqlalchemy.exc import SQLAlchemyError @@ -65,6 +65,8 @@ class TelemetryDBmanager: except Exception as e: LOGGER.info("Unable to fetch Table names. {:s}".format(str(e))) +# ------------------ INSERT METHODs -------------------------------------- + def inser_kpi(self, request: KpiDescriptor): session = self.Session() try: @@ -114,16 +116,18 @@ class TelemetryDBmanager: # Close the session session.close() - def get_kpi_descriptor(self, kpi_id: KpiId): +# ------------------ GET METHODs -------------------------------------- + + def get_kpi_descriptor(self, request: KpiId): session = self.Session() try: - kpi_id_to_get = kpi_id.kpi_id.uuid - kpi = session.query(KpiModel).filter_by(kpi_id=kpi_id_to_get).first() + kpi_id_to_search = request.kpi_id.uuid + kpi = session.query(KpiModel).filter_by(kpi_id=kpi_id_to_search).first() if kpi: LOGGER.info("kpi ID found: {:s}".format(str(kpi))) return kpi else: - LOGGER.info("Kpi ID not found{:s}".format(str(kpi_id_to_get))) + LOGGER.warning("Kpi ID not found{:s}".format(str(kpi_id_to_search))) return None except Exception as e: session.rollback() @@ -131,7 +135,27 @@ class TelemetryDBmanager: raise finally: session.close() + + def get_collector(self, request: CollectorId): + session = self.Session() + try: + collector_id_to_search = request.collector_id.uuid + collector = session.query(CollectorModel).filter_by(collector_id=collector_id_to_search).first() + if collector: + LOGGER.info("collector ID found: {:s}".format(str(collector))) + return collector + else: + LOGGER.warning("collector ID not found{:s}".format(str(collector_id_to_search))) + return None + except Exception as e: + session.rollback() + LOGGER.info("Failed to retrieve collector ID. {:s}".format(str(e))) + raise + finally: + session.close() + # ------------------ SELECT METHODs -------------------------------------- + def select_kpi_descriptor(self, **filters): session = self.Session() try: @@ -144,5 +168,56 @@ class TelemetryDBmanager: except SQLAlchemyError as e: LOGGER.error("Error fetching filtered rows from KPI table with filters {:}: {:}".format(filters, e)) return [] + finally: + session.close() + + def select_collector(self, **filters): + session = self.Session() + try: + query = session.query(CollectorModel) + for column, value in filters.items(): + query = query.filter(getattr(CollectorModel, column) == value) + result = query.all() + LOGGER.info("Fetched filtered rows from KPI table with filters ---------- : {:s}".format(str(result))) + return result + except SQLAlchemyError as e: + LOGGER.error("Error fetching filtered rows from KPI table with filters {:}: {:}".format(filters, e)) + return [] + finally: + session.close() + +# ------------------ DELETE METHODs -------------------------------------- + + def delete_kpi_descriptor(self, request: KpiId): + session = self.Session() + try: + kpi_id_to_delete = request.kpi_id.uuid + kpi = session.query(KpiModel).filter_by(kpi_id=kpi_id_to_delete).first() + if kpi: + session.delete(kpi) + session.commit() + LOGGER.info("Deleted KPI with kpi_id: %s", kpi_id_to_delete) + else: + LOGGER.warning("KPI with kpi_id %s not found", kpi_id_to_delete) + except SQLAlchemyError as e: + session.rollback() + LOGGER.error("Error deleting KPI with kpi_id %s: %s", kpi_id_to_delete, e) + finally: + session.close() + + def delete_collector(self, request: CollectorId): + session = self.Session() + try: + collector_id_to_delete = request.collector_id.uuid + collector = session.query(CollectorModel).filter_by(collector_id=collector_id_to_delete).first() + if collector: + session.delete(collector) + session.commit() + LOGGER.info("Deleted KPI with kpi_id: %s", collector_id_to_delete) + else: + LOGGER.warning("KPI with kpi_id %s not found", collector_id_to_delete) + except SQLAlchemyError as e: + session.rollback() + LOGGER.error("Error deleting KPI with kpi_id %s: %s", collector_id_to_delete, e) finally: session.close() \ No newline at end of file diff --git a/src/telemetry/database/tests/messages.py b/src/telemetry/database/tests/messages.py index ea59d0925..258d4a844 100644 --- a/src/telemetry/database/tests/messages.py +++ b/src/telemetry/database/tests/messages.py @@ -46,9 +46,21 @@ def create_kpi_id_request(): _create_kpi_id_request.kpi_id.uuid = '11e2c6c6-b507-40aa-ab3a-ffd41e7125f0' return _create_kpi_id_request +def create_collector_id_request(): + _create_collector_id_request = telemetry_frontend_pb2.CollectorId() + _create_collector_id_request.collector_id.uuid = '50ba9199-7e9d-45b5-a2fc-3f97917bad65' + return _create_collector_id_request + def create_kpi_filter_request(): # create a dict as follows: 'Key' = 'KpiModel' column name and 'Value' = filter to apply. _create_kpi_filter_request = dict() _create_kpi_filter_request['kpi_sample_type'] = 102 _create_kpi_filter_request['kpi_id'] = '11e2c6c6-b507-40aa-ab3a-ffd41e7125f0' + return _create_kpi_filter_request + +def create_collector_filter_request(): + # create a dict as follows: 'Key' = 'KpiModel' column name and 'Value' = filter to apply. + _create_kpi_filter_request = dict() + _create_kpi_filter_request['sampling_interval_s'] = 3.0 + # _create_kpi_filter_request['kpi_id'] = '11e2c6c6-b507-40aa-ab3a-ffd41e7125f0' return _create_kpi_filter_request \ No newline at end of file diff --git a/src/telemetry/database/tests/telemetryDBtests.py b/src/telemetry/database/tests/telemetryDBtests.py index 217bdcfd4..81431beb7 100644 --- a/src/telemetry/database/tests/telemetryDBtests.py +++ b/src/telemetry/database/tests/telemetryDBtests.py @@ -19,7 +19,8 @@ from telemetry.database.TelemetryDBmanager import TelemetryDBmanager from telemetry.database.TelemetryEngine import TelemetryEngine from telemetry.database.tests import temp_DB from .messages import create_kpi_request, create_collector_request, \ - create_kpi_id_request, create_kpi_filter_request + create_kpi_id_request, create_kpi_filter_request, \ + create_collector_id_request, create_collector_filter_request logging.basicConfig(level=logging.INFO) LOGGER = logging.getLogger(__name__) @@ -29,22 +30,45 @@ LOGGER = logging.getLogger(__name__) def test_telemetry_object_creation(): LOGGER.info('--- test_telemetry_object_creation: START') + LOGGER.info('>>> Creating TelemetryDBmanager Object: ') TelemetryDBmanagerObj = TelemetryDBmanager() + # LOGGER.info('>>> Creating Tables: ') # TelemetryDBmanagerObj.create_tables() + # LOGGER.info('>>> Verifing Table creation: ') # TelemetryDBmanagerObj.verify_tables() - LOGGER.info('>>> Row Insertion Operation: kpi Table') + + LOGGER.info('>>> TESTING: Row Insertion Operation: kpi Table') kpi_obj = create_kpi_request() TelemetryDBmanagerObj.inser_kpi(kpi_obj) - LOGGER.info('>>> Row Insertion Operation: collector Table') + + LOGGER.info('>>> TESTING: Row Insertion Operation: collector Table') collector_obj = create_collector_request() TelemetryDBmanagerObj.insert_collector(collector_obj) - LOGGER.info('>>> Get KpiDescriptor ') + + LOGGER.info('>>> TESTING: Get KpiDescriptor ') kpi_id_obj = create_kpi_id_request() TelemetryDBmanagerObj.get_kpi_descriptor(kpi_id_obj) + + LOGGER.info('>>> TESTING: Select Collector ') + collector_id_obj = create_collector_id_request() + TelemetryDBmanagerObj.get_collector(collector_id_obj) + + LOGGER.info('>>> TESTING: Applying kpi filter ') kpi_filter : dict[str, Any] = create_kpi_filter_request() TelemetryDBmanagerObj.select_kpi_descriptor(**kpi_filter) + LOGGER.info('>>> TESTING: Applying collector filter ') + collector_filter : dict[str, Any] = create_collector_filter_request() + TelemetryDBmanagerObj.select_collector(**collector_filter) + + LOGGER.info('>>> TESTING: Delete KpiDescriptor ') + kpi_id_obj = create_kpi_id_request() + TelemetryDBmanagerObj.delete_kpi_descriptor(kpi_id_obj) + + LOGGER.info('>>> TESTING: Delete Collector ') + collector_id_obj = create_collector_id_request() + TelemetryDBmanagerObj.delete_collector(collector_id_obj) \ No newline at end of file diff --git a/src/telemetry/database/tests/temp_DB.py b/src/telemetry/database/tests/temp_DB.py index 5d3c3b1bd..7c1074fcf 100644 --- a/src/telemetry/database/tests/temp_DB.py +++ b/src/telemetry/database/tests/temp_DB.py @@ -204,7 +204,42 @@ class DatabaseManager: finally: session.close() LOGGER.info("get_filtered_collector_rows method execution finished.") - + + def delete_kpi_by_id(self, kpi_id): + session = self.Session() + try: + kpi = session.query(Kpi).filter_by(kpi_id=kpi_id).first() + if kpi: + session.delete(kpi) + session.commit() + LOGGER.info("Deleted KPI with kpi_id: %s", kpi_id) + else: + LOGGER.warning("KPI with kpi_id %s not found", kpi_id) + except SQLAlchemyError as e: + session.rollback() + LOGGER.error("Error deleting KPI with kpi_id %s: %s", kpi_id, e) + finally: + session.close() + LOGGER.info("delete_kpi_by_id method execution finished.") + + def delete_collector_by_id(self, collector_id): + session = self.Session() + try: + collector = session.query(Collector).filter_by(collector_id=collector_id).first() + if collector: + session.delete(collector) + session.commit() + LOGGER.info("Deleted Collector with collector_id: %s", collector_id) + else: + LOGGER.warning("Collector with collector_id %s not found", collector_id) + except SQLAlchemyError as e: + session.rollback() + LOGGER.error("Error deleting Collector with collector_id %s: %s", collector_id, e) + finally: + session.close() + LOGGER.info("delete_collector_by_id method execution finished.") + + # Example Usage def main(): CRDB_SQL_PORT = "26257" @@ -281,4 +316,12 @@ def main(): # Get filtered rows from Collector table filtered_collector_rows = db_manager.get_filtered_collector_rows(collector='Collector 1') - LOGGER.info("Filtered Collector Rows: %s", filtered_collector_rows) \ No newline at end of file + LOGGER.info("Filtered Collector Rows: %s", filtered_collector_rows) + + # Delete a KPI by kpi_id + kpi_id_to_delete = '123e4567-e89b-12d3-a456-426614174000' + db_manager.delete_kpi_by_id(kpi_id_to_delete) + + # Delete a Collector by collector_id + collector_id_to_delete = '123e4567-e89b-12d3-a456-426614174001' + db_manager.delete_collector_by_id(collector_id_to_delete) -- GitLab From 6617dd10c7195932d03c50fa1022363528c6ea8f Mon Sep 17 00:00:00 2001 From: armingol Date: Tue, 28 May 2024 12:14:04 +0200 Subject: [PATCH 234/602] First version --- quick_deploy.sh | 438 + .../drivers/openconfig/templates/Inventory.py | 7 +- src/nbi/service/__main__.py | 2 + .../nbi_plugins/ietf_hardware/Hardware.py | 40 + .../nbi_plugins/ietf_hardware/Untitled-5.json | 37305 ++++++++++++++++ .../nbi_plugins/ietf_hardware/YangHandler.py | 116 + .../nbi_plugins/ietf_hardware/__init__.py | 7 + .../yang/iana-hardware@2018-03-13.yang | 189 + .../yang/ietf-hardware@2018-03-13.yang | 1194 + .../yang/ietf-inet-types@2013-07-15.yang | 458 + .../yang/ietf-yang-types@2013-07-15.yang | 474 + .../nbi_plugins/tfs_api/Resources.py | 12 + .../nbi_plugins/tfs_api/__init__.py | 8 +- src/tests/ecoc22/tests/Objects.py | 2 +- .../descriptors/real/dc-2-dc-service.json | 2 +- test.py | 291 + 16 files changed, 40539 insertions(+), 6 deletions(-) create mode 100755 quick_deploy.sh create mode 100644 src/nbi/service/rest_server/nbi_plugins/ietf_hardware/Hardware.py create mode 100644 src/nbi/service/rest_server/nbi_plugins/ietf_hardware/Untitled-5.json create mode 100644 src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py create mode 100644 src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py create mode 100644 src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/iana-hardware@2018-03-13.yang create mode 100644 src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/ietf-hardware@2018-03-13.yang create mode 100644 src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/ietf-inet-types@2013-07-15.yang create mode 100644 src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/ietf-yang-types@2013-07-15.yang create mode 100644 test.py diff --git a/quick_deploy.sh b/quick_deploy.sh new file mode 100755 index 000000000..79846559b --- /dev/null +++ b/quick_deploy.sh @@ -0,0 +1,438 @@ +#!/bin/bash +# 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. + + +######################################################################################################################## +# Read deployment settings +######################################################################################################################## + + +# ----- TeraFlowSDN ------------------------------------------------------------ + +# If not already set, set the URL of the Docker registry where the images will be uploaded to. +# By default, assume internal MicroK8s registry is used. +export TFS_REGISTRY_IMAGES=${TFS_REGISTRY_IMAGES:-"http://localhost:32000/tfs/"} + +# If not already set, set the list of components, separated by spaces, you want to build images for, and deploy. +# By default, only basic components are deployed +export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device pathcomp service slice nbi webui load_generator"} + +# If not already set, set the tag you want to use for your images. +export TFS_IMAGE_TAG=${TFS_IMAGE_TAG:-"dev"} + +# If not already set, set the name of the Kubernetes namespace to deploy TFS to. +export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"} + +# If not already set, set additional manifest files to be applied after the deployment +export TFS_EXTRA_MANIFESTS=${TFS_EXTRA_MANIFESTS:-""} + +# If not already set, set the new Grafana admin password +export TFS_GRAFANA_PASSWORD=${TFS_GRAFANA_PASSWORD:-"admin123+"} + +# If not already set, disable skip-build flag to rebuild the Docker images. +# If TFS_SKIP_BUILD is "YES", the containers are not rebuilt-retagged-repushed and existing ones are used. +export TFS_SKIP_BUILD=${TFS_SKIP_BUILD:-"YES"} + +# If TFS_SKIP_BUILD is "YES", select the containers to be build +# Any other container will use previous docker images +export TFS_QUICK_COMPONENTS="slice" + +# ----- CockroachDB ------------------------------------------------------------ + +# If not already set, set the namespace where CockroackDB will be deployed. +export CRDB_NAMESPACE=${CRDB_NAMESPACE:-"crdb"} + +# If not already set, set the database username to be used by Context. +export CRDB_USERNAME=${CRDB_USERNAME:-"tfs"} + +# If not already set, set the database user's password to be used by Context. +export CRDB_PASSWORD=${CRDB_PASSWORD:-"tfs123"} + +# If not already set, set the database name to be used by Context. +export CRDB_DATABASE=${CRDB_DATABASE:-"tfs"} + + +# ----- NATS ------------------------------------------------------------------- + +# If not already set, set the namespace where NATS will be deployed. +export NATS_NAMESPACE=${NATS_NAMESPACE:-"nats"} + + +# ----- QuestDB ---------------------------------------------------------------- + +# If not already set, set the namespace where QuestDB will be deployed. +export QDB_NAMESPACE=${QDB_NAMESPACE:-"qdb"} + +# If not already set, set the database username to be used for QuestDB. +export QDB_USERNAME=${QDB_USERNAME:-"admin"} + +# If not already set, set the database user's password to be used for QuestDB. +export QDB_PASSWORD=${QDB_PASSWORD:-"quest"} + +# If not already set, set the table name to be used by Monitoring for KPIs. +export QDB_TABLE_MONITORING_KPIS=${QDB_TABLE_MONITORING_KPIS:-"tfs_monitoring_kpis"} + +# If not already set, set the table name to be used by Slice for plotting groups. +export QDB_TABLE_SLICE_GROUPS=${QDB_TABLE_SLICE_GROUPS:-"tfs_slice_groups"} + + +######################################################################################################################## +# Automated steps start here +######################################################################################################################## + +# Constants +GITLAB_REPO_URL="labs.etsi.org:5050/tfs/controller" +TMP_FOLDER="./tmp" + +# Create a tmp folder for files modified during the deployment +TMP_MANIFESTS_FOLDER="$TMP_FOLDER/manifests" +mkdir -p $TMP_MANIFESTS_FOLDER +TMP_LOGS_FOLDER="$TMP_FOLDER/logs" +mkdir -p $TMP_LOGS_FOLDER + +echo "Deleting and Creating a new namespace..." +kubectl delete namespace $TFS_K8S_NAMESPACE --ignore-not-found +kubectl create namespace $TFS_K8S_NAMESPACE +printf "\n" + +echo "Create secret with CockroachDB data" +CRDB_SQL_PORT=$(kubectl --namespace ${CRDB_NAMESPACE} get service cockroachdb-public -o 'jsonpath={.spec.ports[?(@.name=="sql")].port}') +kubectl create secret generic crdb-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ + --from-literal=CRDB_NAMESPACE=${CRDB_NAMESPACE} \ + --from-literal=CRDB_SQL_PORT=${CRDB_SQL_PORT} \ + --from-literal=CRDB_DATABASE=${CRDB_DATABASE} \ + --from-literal=CRDB_USERNAME=${CRDB_USERNAME} \ + --from-literal=CRDB_PASSWORD=${CRDB_PASSWORD} \ + --from-literal=CRDB_SSLMODE=require +printf "\n" + +echo "Create secret with NATS data" +NATS_CLIENT_PORT=$(kubectl --namespace ${NATS_NAMESPACE} get service nats -o 'jsonpath={.spec.ports[?(@.name=="client")].port}') +kubectl create secret generic nats-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ + --from-literal=NATS_NAMESPACE=${NATS_NAMESPACE} \ + --from-literal=NATS_CLIENT_PORT=${NATS_CLIENT_PORT} +printf "\n" + +echo "Create secret with QuestDB data" +QDB_HTTP_PORT=$(kubectl --namespace ${QDB_NAMESPACE} get service questdb-public -o 'jsonpath={.spec.ports[?(@.name=="http")].port}') +QDB_ILP_PORT=$(kubectl --namespace ${QDB_NAMESPACE} get service questdb-public -o 'jsonpath={.spec.ports[?(@.name=="ilp")].port}') +QDB_SQL_PORT=$(kubectl --namespace ${QDB_NAMESPACE} get service questdb-public -o 'jsonpath={.spec.ports[?(@.name=="sql")].port}') +METRICSDB_HOSTNAME="questdb-public.${QDB_NAMESPACE}.svc.cluster.local" +kubectl create secret generic qdb-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ + --from-literal=QDB_NAMESPACE=${QDB_NAMESPACE} \ + --from-literal=METRICSDB_HOSTNAME=${METRICSDB_HOSTNAME} \ + --from-literal=METRICSDB_REST_PORT=${QDB_HTTP_PORT} \ + --from-literal=METRICSDB_ILP_PORT=${QDB_ILP_PORT} \ + --from-literal=METRICSDB_SQL_PORT=${QDB_SQL_PORT} \ + --from-literal=METRICSDB_TABLE_MONITORING_KPIS=${QDB_TABLE_MONITORING_KPIS} \ + --from-literal=METRICSDB_TABLE_SLICE_GROUPS=${QDB_TABLE_SLICE_GROUPS} \ + --from-literal=METRICSDB_USERNAME=${QDB_USERNAME} \ + --from-literal=METRICSDB_PASSWORD=${QDB_PASSWORD} +printf "\n" + +echo "Deploying components and collecting environment variables..." +ENV_VARS_SCRIPT=tfs_runtime_env_vars.sh +echo "# Environment variables for TeraFlowSDN deployment" > $ENV_VARS_SCRIPT +PYTHONPATH=$(pwd)/src +echo "export PYTHONPATH=${PYTHONPATH}" >> $ENV_VARS_SCRIPT + +for COMPONENT in $TFS_COMPONENTS; do + echo "Processing '$COMPONENT' component..." + + if [ "$TFS_SKIP_BUILD" != "YES" ]; then + echo " Building Docker image..." + BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}.log" + + if [ "$COMPONENT" == "automation" ] || [ "$COMPONENT" == "policy" ]; then + docker build -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile ./src/"$COMPONENT"/ > "$BUILD_LOG" + elif [ "$COMPONENT" == "pathcomp" ]; then + BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-frontend.log" + docker build -t "$COMPONENT-frontend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/frontend/Dockerfile . > "$BUILD_LOG" + + BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-backend.log" + docker build -t "$COMPONENT-backend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/backend/Dockerfile . > "$BUILD_LOG" + # next command is redundant, but helpful to keep cache updated between rebuilds + IMAGE_NAME="$COMPONENT-backend:$TFS_IMAGE_TAG-builder" + docker build -t "$IMAGE_NAME" --target builder -f ./src/"$COMPONENT"/backend/Dockerfile . >> "$BUILD_LOG" + elif [ "$COMPONENT" == "dlt" ]; then + BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-connector.log" + docker build -t "$COMPONENT-connector:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/connector/Dockerfile . > "$BUILD_LOG" + + BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-gateway.log" + docker build -t "$COMPONENT-gateway:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/gateway/Dockerfile . > "$BUILD_LOG" + else + docker build -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile . > "$BUILD_LOG" + fi + + echo " Pushing Docker image to '$TFS_REGISTRY_IMAGES'..." + + if [ "$COMPONENT" == "pathcomp" ]; then + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-frontend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + + TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-frontend.log" + docker tag "$COMPONENT-frontend:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + + PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-frontend.log" + docker push "$IMAGE_URL" > "$PUSH_LOG" + + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-backend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + + TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-backend.log" + docker tag "$COMPONENT-backend:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + + PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-backend.log" + docker push "$IMAGE_URL" > "$PUSH_LOG" + elif [ "$COMPONENT" == "dlt" ]; then + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-connector:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + + TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-connector.log" + docker tag "$COMPONENT-connector:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + + PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-connector.log" + docker push "$IMAGE_URL" > "$PUSH_LOG" + + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-gateway:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + + TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-gateway.log" + docker tag "$COMPONENT-gateway:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + + PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-gateway.log" + docker push "$IMAGE_URL" > "$PUSH_LOG" + else + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + + TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}.log" + docker tag "$COMPONENT:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + + PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}.log" + docker push "$IMAGE_URL" > "$PUSH_LOG" + fi + else + for QUICK_COMPONENT in $TFS_QUICK_COMPONENTS; do + if [ "$COMPONENT" == "$QUICK_COMPONENT" ]; then + + echo " Building Docker image..." + BUILD_LOG="$TMP_LOGS_FOLDER/build_${QUICK_COMPONENT}.log" + + docker build -t "$QUICK_COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$QUICK_COMPONENT"/Dockerfile . > "$BUILD_LOG" + echo " Pushing Docker image to '$TFS_REGISTRY_IMAGES'..." + + + + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$QUICK_COMPONENT:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + + TAG_LOG="$TMP_LOGS_FOLDER/tag_${QUICK_COMPONENT}.log" + docker tag "$QUICK_COMPONENT:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + + PUSH_LOG="$TMP_LOGS_FOLDER/push_${QUICK_COMPONENT}.log" + docker push "$IMAGE_URL" > "$PUSH_LOG" + fi + done + fi + + echo " Adapting '$COMPONENT' manifest file..." + MANIFEST="$TMP_MANIFESTS_FOLDER/${COMPONENT}service.yaml" + cp ./manifests/"${COMPONENT}"service.yaml "$MANIFEST" + + if [ "$COMPONENT" == "pathcomp" ]; then + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-frontend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}-frontend:" "$MANIFEST" | cut -d ":" -f4) + sed -E -i "s#image: $GITLAB_REPO_URL/$COMPONENT-frontend:${VERSION}#image: $IMAGE_URL#g" "$MANIFEST" + + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-backend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}-backend:" "$MANIFEST" | cut -d ":" -f4) + sed -E -i "s#image: $GITLAB_REPO_URL/$COMPONENT-backend:${VERSION}#image: $IMAGE_URL#g" "$MANIFEST" + elif [ "$COMPONENT" == "dlt" ]; then + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-connector:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}-connector:" "$MANIFEST" | cut -d ":" -f4) + sed -E -i "s#image: $GITLAB_REPO_URL/$COMPONENT-connector:${VERSION}#image: $IMAGE_URL#g" "$MANIFEST" + + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-gateway:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}-gateway:" "$MANIFEST" | cut -d ":" -f4) + sed -E -i "s#image: $GITLAB_REPO_URL/$COMPONENT-gateway:${VERSION}#image: $IMAGE_URL#g" "$MANIFEST" + else + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}:" "$MANIFEST" | cut -d ":" -f4) + sed -E -i "s#image: $GITLAB_REPO_URL/$COMPONENT:${VERSION}#image: $IMAGE_URL#g" "$MANIFEST" + fi + + sed -E -i "s#imagePullPolicy: .*#imagePullPolicy: Always#g" "$MANIFEST" + + # TODO: harmonize names of the monitoring component + + echo " Deploying '$COMPONENT' component to Kubernetes..." + DEPLOY_LOG="$TMP_LOGS_FOLDER/deploy_${COMPONENT}.log" + kubectl --namespace $TFS_K8S_NAMESPACE apply -f "$MANIFEST" > "$DEPLOY_LOG" + COMPONENT_OBJNAME=$(echo "${COMPONENT}" | sed "s/\_/-/") + #kubectl --namespace $TFS_K8S_NAMESPACE scale deployment --replicas=0 ${COMPONENT_OBJNAME}service >> "$DEPLOY_LOG" + #kubectl --namespace $TFS_K8S_NAMESPACE scale deployment --replicas=1 ${COMPONENT_OBJNAME}service >> "$DEPLOY_LOG" + + echo " Collecting env-vars for '$COMPONENT' component..." + + SERVICE_DATA=$(kubectl get service ${COMPONENT_OBJNAME}service --namespace $TFS_K8S_NAMESPACE -o json) + if [ -z "${SERVICE_DATA}" ]; then continue; fi + + # Env vars for service's host address + SERVICE_HOST=$(echo ${SERVICE_DATA} | jq -r '.spec.clusterIP') + if [ -z "${SERVICE_HOST}" ]; then continue; fi + ENVVAR_HOST=$(echo "${COMPONENT}service_SERVICE_HOST" | tr '[:lower:]' '[:upper:]') + echo "export ${ENVVAR_HOST}=${SERVICE_HOST}" >> $ENV_VARS_SCRIPT + + # Env vars for service's 'grpc' port (if any) + SERVICE_PORT_GRPC=$(echo ${SERVICE_DATA} | jq -r '.spec.ports[] | select(.name=="grpc") | .port') + if [ -n "${SERVICE_PORT_GRPC}" ]; then + ENVVAR_PORT_GRPC=$(echo "${COMPONENT}service_SERVICE_PORT_GRPC" | tr '[:lower:]' '[:upper:]') + echo "export ${ENVVAR_PORT_GRPC}=${SERVICE_PORT_GRPC}" >> $ENV_VARS_SCRIPT + fi + + # Env vars for service's 'http' port (if any) + SERVICE_PORT_HTTP=$(echo ${SERVICE_DATA} | jq -r '.spec.ports[] | select(.name=="http") | .port') + if [ -n "${SERVICE_PORT_HTTP}" ]; then + ENVVAR_PORT_HTTP=$(echo "${COMPONENT}service_SERVICE_PORT_HTTP" | tr '[:lower:]' '[:upper:]') + echo "export ${ENVVAR_PORT_HTTP}=${SERVICE_PORT_HTTP}" >> $ENV_VARS_SCRIPT + fi + + printf "\n" +done + +echo "Deploying extra manifests..." +for EXTRA_MANIFEST in $TFS_EXTRA_MANIFESTS; do + echo "Processing manifest '$EXTRA_MANIFEST'..." + if [[ "$EXTRA_MANIFEST" == *"servicemonitor"* ]]; then + kubectl apply -f $EXTRA_MANIFEST + else + kubectl --namespace $TFS_K8S_NAMESPACE apply -f $EXTRA_MANIFEST + fi + printf "\n" +done +printf "\n" + +for COMPONENT in $TFS_COMPONENTS; do + echo "Waiting for '$COMPONENT' component..." + COMPONENT_OBJNAME=$(echo "${COMPONENT}" | sed "s/\_/-/") + kubectl wait --namespace $TFS_K8S_NAMESPACE \ + --for='condition=available' --timeout=300s deployment/${COMPONENT_OBJNAME}service + printf "\n" +done + +if [[ "$TFS_COMPONENTS" == *"webui"* ]] && [[ "$TFS_COMPONENTS" == *"monitoring"* ]]; then + echo "Configuring WebUI DataStores and Dashboards..." + sleep 5 + + # Exposed through the ingress controller "tfs-ingress" + GRAFANA_URL="127.0.0.1:80/grafana" + + # Default Grafana credentials + GRAFANA_USERNAME="admin" + GRAFANA_PASSWORD="admin" + + # Configure Grafana Admin Password + # Ref: https://grafana.com/docs/grafana/latest/http_api/user/#change-password + GRAFANA_URL_DEFAULT="http://${GRAFANA_USERNAME}:${GRAFANA_PASSWORD}@${GRAFANA_URL}" + + echo ">> Updating Grafana 'admin' password..." + curl -X PUT -H "Content-Type: application/json" -d '{ + "oldPassword": "'${GRAFANA_PASSWORD}'", + "newPassword": "'${TFS_GRAFANA_PASSWORD}'", + "confirmNew" : "'${TFS_GRAFANA_PASSWORD}'" + }' ${GRAFANA_URL_DEFAULT}/api/user/password + echo + echo + + # Updated Grafana API URL + GRAFANA_URL_UPDATED="http://${GRAFANA_USERNAME}:${TFS_GRAFANA_PASSWORD}@${GRAFANA_URL}" + echo "export GRAFANA_URL_UPDATED=${GRAFANA_URL_UPDATED}" >> $ENV_VARS_SCRIPT + + echo ">> Installing Scatter Plot plugin..." + curl -X POST -H "Content-Type: application/json" -H "Content-Length: 0" \ + ${GRAFANA_URL_UPDATED}/api/plugins/michaeldmoore-scatter-panel/install + echo + + # Ref: https://grafana.com/docs/grafana/latest/http_api/data_source/ + QDB_HOST_PORT="${METRICSDB_HOSTNAME}:${QDB_SQL_PORT}" + echo ">> Creating datasources..." + curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d '{ + "access" : "proxy", + "type" : "postgres", + "name" : "questdb-mon-kpi", + "url" : "'${QDB_HOST_PORT}'", + "database" : "'${QDB_TABLE_MONITORING_KPIS}'", + "user" : "'${QDB_USERNAME}'", + "basicAuth": false, + "isDefault": true, + "jsonData" : { + "sslmode" : "disable", + "postgresVersion" : 1100, + "maxOpenConns" : 0, + "maxIdleConns" : 2, + "connMaxLifetime" : 14400, + "tlsAuth" : false, + "tlsAuthWithCACert" : false, + "timescaledb" : false, + "tlsConfigurationMethod": "file-path", + "tlsSkipVerify" : true + }, + "secureJsonData": {"password": "'${QDB_PASSWORD}'"} + }' ${GRAFANA_URL_UPDATED}/api/datasources + echo + + curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d '{ + "access" : "proxy", + "type" : "postgres", + "name" : "questdb-slc-grp", + "url" : "'${QDB_HOST_PORT}'", + "database" : "'${QDB_TABLE_SLICE_GROUPS}'", + "user" : "'${QDB_USERNAME}'", + "basicAuth": false, + "isDefault": false, + "jsonData" : { + "sslmode" : "disable", + "postgresVersion" : 1100, + "maxOpenConns" : 0, + "maxIdleConns" : 2, + "connMaxLifetime" : 14400, + "tlsAuth" : false, + "tlsAuthWithCACert" : false, + "timescaledb" : false, + "tlsConfigurationMethod": "file-path", + "tlsSkipVerify" : true + }, + "secureJsonData": {"password": "'${QDB_PASSWORD}'"} + }' ${GRAFANA_URL_UPDATED}/api/datasources + printf "\n\n" + + echo ">> Creating dashboards..." + # Ref: https://grafana.com/docs/grafana/latest/http_api/dashboard/ + curl -X POST -H "Content-Type: application/json" -d '@src/webui/grafana_db_mon_kpis_psql.json' \ + ${GRAFANA_URL_UPDATED}/api/dashboards/db + echo + + curl -X POST -H "Content-Type: application/json" -d '@src/webui/grafana_db_slc_grps_psql.json' \ + ${GRAFANA_URL_UPDATED}/api/dashboards/db + printf "\n\n" + + echo ">> Staring dashboards..." + DASHBOARD_URL="${GRAFANA_URL_UPDATED}/api/dashboards/uid/tfs-l3-monit" + DASHBOARD_ID=$(curl -s "${DASHBOARD_URL}" | jq '.dashboard.id') + curl -X POST ${GRAFANA_URL_UPDATED}/api/user/stars/dashboard/${DASHBOARD_ID} + echo + + DASHBOARD_URL="${GRAFANA_URL_UPDATED}/api/dashboards/uid/tfs-slice-grps" + DASHBOARD_ID=$(curl -s "${DASHBOARD_URL}" | jq '.dashboard.id') + curl -X POST ${GRAFANA_URL_UPDATED}/api/user/stars/dashboard/${DASHBOARD_ID} + echo + + printf "\n\n" +fi diff --git a/src/device/service/drivers/openconfig/templates/Inventory.py b/src/device/service/drivers/openconfig/templates/Inventory.py index 9897f04f9..d06f0ab89 100644 --- a/src/device/service/drivers/openconfig/templates/Inventory.py +++ b/src/device/service/drivers/openconfig/templates/Inventory.py @@ -75,6 +75,11 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: component_location = xml_component.find('ocp:state/ocp:location', namespaces=NAMESPACES) if not component_location is None: add_value_from_tag(inventory['attributes'], 'location', component_location) + + + component_id = xml_component.find('ocp:state/ocp:id', namespaces=NAMESPACES) + if not component_id is None: + add_value_from_tag(inventory['attributes'], 'id', component_id) component_type = xml_component.find('ocp:state/ocp:type', namespaces=NAMESPACES) if component_type is not None: @@ -109,7 +114,7 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: component_mfg_name = xml_component.find('ocp:state/ocp:mfg-name', namespaces=NAMESPACES) if not component_mfg_name is None: - add_value_from_tag(inventory['attributes'], 'manufacturer-name', component_mfg_name) + add_value_from_tag(inventory['attributes'], 'mfg-name', component_mfg_name) component_removable = xml_component.find('ocp:state/ocp:removable', namespaces=NAMESPACES) if not component_removable is None: diff --git a/src/nbi/service/__main__.py b/src/nbi/service/__main__.py index 362b0116d..7f3cec19d 100644 --- a/src/nbi/service/__main__.py +++ b/src/nbi/service/__main__.py @@ -18,6 +18,7 @@ from common.Constants import ServiceNameEnum from common.Settings import ( ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_log_level, get_metrics_port, wait_for_environment_variables) +from src.nbi.service.rest_server.nbi_plugins.ietf_hardware import register_ietf_hardware from .NbiService import NbiService from .rest_server.RestServer import RestServer from .rest_server.nbi_plugins.etsi_bwm import register_etsi_bwm_api @@ -68,6 +69,7 @@ def main(): register_ietf_network(rest_server) register_ietf_nss(rest_server) # Registering NSS entrypoint register_tfs_api(rest_server) + register_ietf_hardware(rest_server) rest_server.start() # Wait for Ctrl+C or termination signal diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/Hardware.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/Hardware.py new file mode 100644 index 000000000..ca8f4064f --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/Hardware.py @@ -0,0 +1,40 @@ + +import logging +from flask import request +from flask.json import jsonify +from flask_restful import Resource +from common.tools.context_queries.Device import get_device +from context.client.ContextClient import ContextClient +from ..tools.Authentication import HTTP_AUTH +from ..tools.HttpStatusCodes import HTTP_OK, HTTP_SERVERERROR +from .YangHandler import YangHandler + +LOGGER = logging.getLogger(__name__) + +class Hardware(Resource): + @HTTP_AUTH.login_required + def get(self, device_uuid : str): + LOGGER.debug('Device UUID: {:s}'.format(str(device_uuid))) + LOGGER.debug('Request: {:s}'.format(str(request))) + + try: + context_client = ContextClient() + device = get_device( + context_client, device_uuid, rw_copy=False, + include_endpoints=False, include_config_rules=False, include_components=True + ) + if device is None: + raise Exception('Device({:s}) not found in database'.format(str(device_uuid))) + + yang_handler = YangHandler('ietf-hardware') + hardware_reply = yang_handler.compose(device) + yang_handler.destroy() + + response = jsonify(hardware_reply) + response.status_code = HTTP_OK + except Exception as e: # pylint: disable=broad-except + MSG = 'Something went wrong Retrieving Hardware of Device({:s})' + LOGGER.exception(MSG.format(str(device_uuid))) + response = jsonify({'error': str(e)}) + response.status_code = HTTP_SERVERERROR + return response \ No newline at end of file diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/Untitled-5.json b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/Untitled-5.json new file mode 100644 index 000000000..e310632fa --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/Untitled-5.json @@ -0,0 +1,37305 @@ +{ + "devices": [ + { + "components": [], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "127.0.0.1" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "0" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"endpoints\": [\n{\n\"uuid\": \"1/3\"\n},\n{\n\"uuid\": \"1/4\"\n},\n{\n\"uuid\": \"1/8\"\n},\n{\n\"uuid\": \"2/1\"\n},\n{\n\"uuid\": \"2/2\"\n},\n{\n\"uuid\": \"2/3\"\n},\n{\n\"uuid\": \"2/4\"\n},\n{\n\"uuid\": \"2/5\"\n},\n{\n\"uuid\": \"2/6\"\n},\n{\n\"uuid\": \"2/7\"\n},\n{\n\"uuid\": \"2/8\"\n},\n{\n\"uuid\": \"2/9\"\n},\n{\n\"uuid\": \"2/10\"\n},\n{\n\"uuid\": \"2/11\"\n},\n{\n\"uuid\": \"2/12\"\n},\n{\n\"uuid\": \"2/13\"\n},\n{\n\"uuid\": \"2/14\"\n},\n{\n\"uuid\": \"2/15\"\n},\n{\n\"uuid\": \"2/16\"\n},\n{\n\"uuid\": \"2/17\"\n},\n{\n\"uuid\": \"2/18\"\n},\n{\n\"uuid\": \"2/19\"\n},\n{\n\"uuid\": \"2/20\"\n},\n{\n\"uuid\": \"2/21\"\n},\n{\n\"uuid\": \"2/22\"\n},\n{\n\"uuid\": \"2/23\"\n},\n{\n\"uuid\": \"2/24\"\n},\n{\n\"uuid\": \"2/25\"\n},\n{\n\"uuid\": \"2/26\"\n},\n{\n\"uuid\": \"2/27\"\n},\n{\n\"uuid\": \"2/28\"\n},\n{\n\"uuid\": \"2/29\"\n},\n{\n\"uuid\": \"2/30\"\n},\n{\n\"uuid\": \"2/31\"\n},\n{\n\"uuid\": \"2/32\"\n},\n{\n\"uuid\": \"2/33\"\n},\n{\n\"uuid\": \"2/34\"\n},\n{\n\"uuid\": \"2/35\"\n},\n{\n\"uuid\": \"2/36\"\n},\n{\n\"uuid\": \"2/37\"\n},\n{\n\"uuid\": \"2/38\"\n},\n{\n\"uuid\": \"2/39\"\n},\n{\n\"uuid\": \"2/40\"\n},\n{\n\"uuid\": \"2/41\"\n},\n{\n\"uuid\": \"2/42\"\n},\n{\n\"uuid\": \"2/43\"\n},\n{\n\"uuid\": \"2/44\"\n},\n{\n\"uuid\": \"2/45\"\n},\n{\n\"uuid\": \"2/46\"\n},\n{\n\"uuid\": \"2/47\"\n},\n{\n\"uuid\": \"2/48\"\n},\n{\n\"uuid\": \"2/49\"\n},\n{\n\"uuid\": \"2/50\"\n}\n]\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/3]", + "resource_value": "{\"uuid\": \"1/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/4]", + "resource_value": "{\"uuid\": \"1/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/8]", + "resource_value": "{\"uuid\": \"1/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/1]", + "resource_value": "{\"uuid\": \"2/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/2]", + "resource_value": "{\"uuid\": \"2/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/3]", + "resource_value": "{\"uuid\": \"2/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/4]", + "resource_value": "{\"uuid\": \"2/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/5]", + "resource_value": "{\"uuid\": \"2/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/6]", + "resource_value": "{\"uuid\": \"2/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/7]", + "resource_value": "{\"uuid\": \"2/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/8]", + "resource_value": "{\"uuid\": \"2/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/9]", + "resource_value": "{\"uuid\": \"2/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/10]", + "resource_value": "{\"uuid\": \"2/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/11]", + "resource_value": "{\"uuid\": \"2/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/12]", + "resource_value": "{\"uuid\": \"2/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/13]", + "resource_value": "{\"uuid\": \"2/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/14]", + "resource_value": "{\"uuid\": \"2/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/15]", + "resource_value": "{\"uuid\": \"2/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/16]", + "resource_value": "{\"uuid\": \"2/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/17]", + "resource_value": "{\"uuid\": \"2/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/18]", + "resource_value": "{\"uuid\": \"2/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/19]", + "resource_value": "{\"uuid\": \"2/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/20]", + "resource_value": "{\"uuid\": \"2/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/21]", + "resource_value": "{\"uuid\": \"2/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/22]", + "resource_value": "{\"uuid\": \"2/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/23]", + "resource_value": "{\"uuid\": \"2/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/24]", + "resource_value": "{\"uuid\": \"2/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/25]", + "resource_value": "{\"uuid\": \"2/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/26]", + "resource_value": "{\"uuid\": \"2/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/27]", + "resource_value": "{\"uuid\": \"2/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/28]", + "resource_value": "{\"uuid\": \"2/28\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/29]", + "resource_value": "{\"uuid\": \"2/29\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/30]", + "resource_value": "{\"uuid\": \"2/30\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/31]", + "resource_value": "{\"uuid\": \"2/31\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/32]", + "resource_value": "{\"uuid\": \"2/32\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/33]", + "resource_value": "{\"uuid\": \"2/33\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/34]", + "resource_value": "{\"uuid\": \"2/34\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/35]", + "resource_value": "{\"uuid\": \"2/35\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/36]", + "resource_value": "{\"uuid\": \"2/36\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/37]", + "resource_value": "{\"uuid\": \"2/37\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/38]", + "resource_value": "{\"uuid\": \"2/38\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/39]", + "resource_value": "{\"uuid\": \"2/39\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/40]", + "resource_value": "{\"uuid\": \"2/40\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/41]", + "resource_value": "{\"uuid\": \"2/41\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/42]", + "resource_value": "{\"uuid\": \"2/42\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/43]", + "resource_value": "{\"uuid\": \"2/43\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/44]", + "resource_value": "{\"uuid\": \"2/44\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/45]", + "resource_value": "{\"uuid\": \"2/45\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/46]", + "resource_value": "{\"uuid\": \"2/46\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/47]", + "resource_value": "{\"uuid\": \"2/47\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/48]", + "resource_value": "{\"uuid\": \"2/48\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/49]", + "resource_value": "{\"uuid\": \"2/49\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/50]", + "resource_value": "{\"uuid\": \"2/50\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_UNDEFINED" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "008d9515-4174-5ef5-947f-10521d4c5afb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/36" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "0286058e-d5b2-5470-812c-700ee841763b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/48" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "0799c5b6-f94b-53c2-8136-4cc9c7cd7122" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "0acf7879-56ac-51d9-9030-8e62fb4951e7" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/29" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "0ed3e9f2-2281-5b1e-a2b5-8000e0b0796a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "1446f716-e87a-5120-8652-93e7954dcffe" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "216d66e9-13e5-50dd-ace5-c2ee7adcb08d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/43" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "2c395317-8081-517d-9c29-4e502e277f8f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "352b6e37-d3e0-5cae-baf2-7e7422d60fed" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "36433475-17c6-56fa-afe8-411f4f505e66" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "3e6668ae-34b0-5802-a425-d8052e5b98ab" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/35" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "403f3e35-3581-5b3d-9ae6-2bebcc877a7a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "40a764b6-a89f-5673-b85b-c1602ee5e8c1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/42" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "448c1d22-bd32-5a7d-b8bd-101085de14e1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/37" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "498ad6ec-b283-56e2-a029-01332940066b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "49bb3010-d22a-5e88-93fe-773439e9e9b5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/39" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "55ec3f20-3631-5619-8aa8-2146ca8963f3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/33" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "59e9967a-9f20-5ab7-8085-3bf65f2fef14" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "5c973fa3-f6da-544e-bb63-6e2dfafa0bb8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "5e61474e-0278-51fe-9213-11c563a079d1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "6135e462-47f7-5a2a-9415-4d606a6c1636" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "661bdcf6-71d0-5c79-b999-057f5041af2a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "69ea76be-b363-58bd-8062-bc0c8ef4ccac" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/28" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "6a20f2de-dc11-5789-80ed-7b7a30d2f18a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "6ac7f8a6-8d7d-5ba3-8ac3-ffca89517a4c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/32" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "6f61e7da-6fa5-5305-9ab9-835f1e3e4dc0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/41" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "72ebcc64-eb48-5d8a-9523-f0f947a8a115" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/40" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "77330b46-f237-56c8-9f60-3da0ec2c4a55" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "77569bc1-90ec-5b3f-bc49-414dcd9c3834" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/46" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "782cbe5e-c31b-5845-80f5-b078a70f9ea0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "7d3652f0-3396-59e7-b8bb-4fd1c1482ee6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "81194f7f-7278-5375-96cb-a4bf671a4bfc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "8ed9276d-d0d6-54bc-a83c-c2f98cc951f2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/47" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "97faf862-54cc-5c56-a97b-b28898916de3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "9d3cd75b-6141-58ce-9ada-e9e6188dcba9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/21" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "9f7ceae8-cb1c-50c2-8381-dec7e2f9831c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "a2038e0a-c4b6-5009-bdf2-dc6c53554282" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/49" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "a335df94-788a-5d76-8fff-be9eb02f601b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "ab1e16cb-3465-5474-98d6-4320a09d5334" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/50" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "ac5e7f86-11dd-5475-aedc-21e3fd06bf4a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/31" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "b0cb74a9-1e64-5ef0-9fed-a56f47baa89c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/34" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "b3ce7fb1-6f98-5a5c-bfed-1802eedb54ed" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "b6711860-a240-59aa-928a-61c6791dc6ca" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/38" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "bd2b8065-ef71-54b8-99f6-11dc06944847" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "d164bd81-2f0b-53a5-b46e-381180423bda" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "dbac5c81-4de1-5bc6-b319-9cbf00cbfb22" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/30" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "e10e3c22-0309-502a-b633-9fe0477774dc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "e13f1da9-556c-5d37-992f-cdc06378629a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "e95d3616-7224-5364-bda7-28a38cc42d01" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "eb5e3d6e-8044-5e0e-a9e3-5af5801d03a2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/45" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "f3cd040d-f8cf-5b68-888e-79c0a3d87b8b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/44" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "f4824c23-67f1-5396-b7b4-8dee426a839a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "endpoint_uuid": { + "uuid": "f6d8fa4c-ddeb-5425-86bc-1529fed0a2e2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/12" + } + ], + "device_id": { + "device_uuid": { + "uuid": "030eb3a2-41ab-5ec8-b81d-82f715d34f9d" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "emu-packet-router", + "name": "R9" + }, + { + "components": [], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "127.0.0.1" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "0" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"endpoints\": [\n{\n\"uuid\": \"1/9\"\n},\n{\n\"uuid\": \"1/10\"\n},\n{\n\"uuid\": \"1/11\"\n},\n{\n\"uuid\": \"2/1\"\n},\n{\n\"uuid\": \"2/2\"\n},\n{\n\"uuid\": \"2/3\"\n},\n{\n\"uuid\": \"2/4\"\n},\n{\n\"uuid\": \"2/5\"\n},\n{\n\"uuid\": \"2/6\"\n},\n{\n\"uuid\": \"2/7\"\n},\n{\n\"uuid\": \"2/8\"\n},\n{\n\"uuid\": \"2/9\"\n},\n{\n\"uuid\": \"2/10\"\n},\n{\n\"uuid\": \"2/11\"\n},\n{\n\"uuid\": \"2/12\"\n},\n{\n\"uuid\": \"2/13\"\n},\n{\n\"uuid\": \"2/14\"\n},\n{\n\"uuid\": \"2/15\"\n},\n{\n\"uuid\": \"2/16\"\n},\n{\n\"uuid\": \"2/17\"\n},\n{\n\"uuid\": \"2/18\"\n},\n{\n\"uuid\": \"2/19\"\n},\n{\n\"uuid\": \"2/20\"\n},\n{\n\"uuid\": \"2/21\"\n},\n{\n\"uuid\": \"2/22\"\n},\n{\n\"uuid\": \"2/23\"\n},\n{\n\"uuid\": \"2/24\"\n},\n{\n\"uuid\": \"2/25\"\n},\n{\n\"uuid\": \"2/26\"\n},\n{\n\"uuid\": \"2/27\"\n},\n{\n\"uuid\": \"2/28\"\n},\n{\n\"uuid\": \"2/29\"\n},\n{\n\"uuid\": \"2/30\"\n},\n{\n\"uuid\": \"2/31\"\n},\n{\n\"uuid\": \"2/32\"\n},\n{\n\"uuid\": \"2/33\"\n},\n{\n\"uuid\": \"2/34\"\n},\n{\n\"uuid\": \"2/35\"\n},\n{\n\"uuid\": \"2/36\"\n},\n{\n\"uuid\": \"2/37\"\n},\n{\n\"uuid\": \"2/38\"\n},\n{\n\"uuid\": \"2/39\"\n},\n{\n\"uuid\": \"2/40\"\n},\n{\n\"uuid\": \"2/41\"\n},\n{\n\"uuid\": \"2/42\"\n},\n{\n\"uuid\": \"2/43\"\n},\n{\n\"uuid\": \"2/44\"\n},\n{\n\"uuid\": \"2/45\"\n},\n{\n\"uuid\": \"2/46\"\n},\n{\n\"uuid\": \"2/47\"\n},\n{\n\"uuid\": \"2/48\"\n},\n{\n\"uuid\": \"2/49\"\n},\n{\n\"uuid\": \"2/50\"\n}\n]\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/9]", + "resource_value": "{\"uuid\": \"1/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/10]", + "resource_value": "{\"uuid\": \"1/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/11]", + "resource_value": "{\"uuid\": \"1/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/1]", + "resource_value": "{\"uuid\": \"2/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/2]", + "resource_value": "{\"uuid\": \"2/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/3]", + "resource_value": "{\"uuid\": \"2/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/4]", + "resource_value": "{\"uuid\": \"2/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/5]", + "resource_value": "{\"uuid\": \"2/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/6]", + "resource_value": "{\"uuid\": \"2/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/7]", + "resource_value": "{\"uuid\": \"2/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/8]", + "resource_value": "{\"uuid\": \"2/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/9]", + "resource_value": "{\"uuid\": \"2/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/10]", + "resource_value": "{\"uuid\": \"2/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/11]", + "resource_value": "{\"uuid\": \"2/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/12]", + "resource_value": "{\"uuid\": \"2/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/13]", + "resource_value": "{\"uuid\": \"2/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/14]", + "resource_value": "{\"uuid\": \"2/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/15]", + "resource_value": "{\"uuid\": \"2/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/16]", + "resource_value": "{\"uuid\": \"2/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/17]", + "resource_value": "{\"uuid\": \"2/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/18]", + "resource_value": "{\"uuid\": \"2/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/19]", + "resource_value": "{\"uuid\": \"2/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/20]", + "resource_value": "{\"uuid\": \"2/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/21]", + "resource_value": "{\"uuid\": \"2/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/22]", + "resource_value": "{\"uuid\": \"2/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/23]", + "resource_value": "{\"uuid\": \"2/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/24]", + "resource_value": "{\"uuid\": \"2/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/25]", + "resource_value": "{\"uuid\": \"2/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/26]", + "resource_value": "{\"uuid\": \"2/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/27]", + "resource_value": "{\"uuid\": \"2/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/28]", + "resource_value": "{\"uuid\": \"2/28\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/29]", + "resource_value": "{\"uuid\": \"2/29\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/30]", + "resource_value": "{\"uuid\": \"2/30\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/31]", + "resource_value": "{\"uuid\": \"2/31\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/32]", + "resource_value": "{\"uuid\": \"2/32\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/33]", + "resource_value": "{\"uuid\": \"2/33\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/34]", + "resource_value": "{\"uuid\": \"2/34\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/35]", + "resource_value": "{\"uuid\": \"2/35\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/36]", + "resource_value": "{\"uuid\": \"2/36\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/37]", + "resource_value": "{\"uuid\": \"2/37\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/38]", + "resource_value": "{\"uuid\": \"2/38\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/39]", + "resource_value": "{\"uuid\": \"2/39\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/40]", + "resource_value": "{\"uuid\": \"2/40\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/41]", + "resource_value": "{\"uuid\": \"2/41\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/42]", + "resource_value": "{\"uuid\": \"2/42\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/43]", + "resource_value": "{\"uuid\": \"2/43\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/44]", + "resource_value": "{\"uuid\": \"2/44\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/45]", + "resource_value": "{\"uuid\": \"2/45\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/46]", + "resource_value": "{\"uuid\": \"2/46\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/47]", + "resource_value": "{\"uuid\": \"2/47\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/48]", + "resource_value": "{\"uuid\": \"2/48\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/49]", + "resource_value": "{\"uuid\": \"2/49\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/50]", + "resource_value": "{\"uuid\": \"2/50\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_UNDEFINED" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "00f6aa6c-5788-5274-bc5f-7496cef3112f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/45" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "01bf7c0d-ec50-58d0-955a-4e968eb2de0e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/46" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "0350a28a-464f-51d9-9085-bdea7ef79ac2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "07251cd0-67b4-5e21-a4d6-3f3b089dcbcc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "115291b8-d6b1-5611-bcd8-9471814e643b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "11bbeac7-1648-5c9c-a4f8-779431030925" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "1de97406-ad9e-5ead-a7d9-fe44a43a0093" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/33" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "2f3e6481-caaf-596e-a948-55dfe5f1b894" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/44" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "3e045a1d-c9b1-5cd0-bddb-2d91570395ff" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "449225a7-9dee-5f5e-904f-84ad889a0913" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "46164501-1ca8-5811-bf4e-3f111f4dd832" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "4b01fbc3-a6a6-5f4c-b321-3b2478a36e3e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/49" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "4e7edd07-74b9-56e8-9f12-b1b33eb13c00" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "52947e65-183d-5f0e-be59-cd3ca1f70f7e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "59c6e3a8-69a2-5473-93d6-f74441b21e4d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "5b1c64fe-9dcd-5bca-a049-4b6f1afe3d0b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "5cc15e1c-37cf-5926-b119-8ecb61b112d3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "5e00e431-fdea-5443-b425-50655124cf25" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "61489364-2df5-528d-bc35-cc022daf3045" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "69520fec-e520-57d9-aa95-c5d99ddb5be0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/47" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "722ad097-5287-5088-b071-98e5a23427fe" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/29" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "748c165e-3bbd-59bf-9329-dd9fe25f78bb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "75121ae7-d93a-5aa2-9888-5c13c0effdbc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/41" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "81cb5dba-adf9-524e-9ddf-cad5dd567f5c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/35" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "8726e2ba-c159-5dc6-a016-c15c02c629ea" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/43" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "9c562cea-011b-5088-bc5f-d4728274bd05" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "a0b0a10e-bfa6-5bd3-9a13-ae44fd86a19b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/48" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "a7041317-98fb-554f-9ce7-703252d17153" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/28" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "a8379176-f9a3-5b31-a26d-9419dcaad050" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "ab6eede8-a7d2-57a3-bbe3-8d85b16b9241" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "ac15c02d-0850-507c-b449-ea4c619ccd0a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/37" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "ac8a2cf1-4b5e-5464-be25-3c5fee3655be" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "ad63feb7-336e-50be-843b-a39bc49d578d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "af9fcc39-8302-5b7e-9290-9251a2533802" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/40" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "c0159c06-e88d-585b-a1a0-545402141518" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "c64e5269-4f60-5e2b-a837-4197919e0bd4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/42" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "cda4bbe8-23b6-5e77-a5a1-ca1f54c44ef3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "d1333097-eb53-56e5-bf35-3feca03463f9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "d3a81109-dd52-5df4-95ac-4c7dd828b696" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/50" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "d55e5aca-e17e-5769-a85b-6ef2c7628635" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/36" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "daa8c9bb-7715-547b-a2f2-9ce6ce02fd6c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/34" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "dd72a728-9ad5-578d-b49b-dfe9995d1ba8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/39" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "e1cb88f4-4966-56f5-9865-f7d45feb3518" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "e4129616-9d1b-55c7-98d8-b436bf4ef018" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "e795638b-9e90-5fba-9d1a-35d9d66c28f2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "e84d895a-54f8-5387-b59d-b4efba5e9b17" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/32" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "e8ddb0dc-c992-5e14-a410-533bc50b08e6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "eaf9a1ef-3911-5a2e-8995-389e12526109" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "f4dd6290-69b0-54c8-b4fd-19fe6929aacf" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/30" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "f6196751-8005-5902-9ebd-fade19aee5d0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/38" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "fcfb64a3-2233-5f6e-bef1-84312e9b19ed" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/31" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "fd324f8f-897a-546c-bb96-a12d220c01a3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "endpoint_uuid": { + "uuid": "fe3a31c1-cffd-524f-bb05-30baabde2460" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/21" + } + ], + "device_id": { + "device_uuid": { + "uuid": "0dff8c06-873b-5799-ac54-c0452252bae1" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "emu-packet-router", + "name": "R3" + }, + { + "components": [ + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "00778c55-e1f1-5801-b9b7-25815c65cb1b" + }, + "name": "eth-1/0/10", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "01310680-37b7-58bf-914a-1ba4583a16c2" + }, + "name": "eth-1/0/17", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"100G/40G Fiber\"" + }, + "component_uuid": { + "uuid": "01b7daf5-f25e-51da-96b8-d14f7249f6b4" + }, + "name": "eth-1/0/1", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "08b718c1-5523-5c70-8699-9e7cc11ac171" + }, + "name": "Transceiver#10", + "parent": "eth-1/0/10", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "14c2bb4e-7d9c-5e32-a53a-0bbbdcd720c3" + }, + "name": "eth-1/0/8", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "15411cf7-182d-5dbe-89e7-260d95798ec7" + }, + "name": "Transceiver#14", + "parent": "eth-1/0/14", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "1574d8e0-900f-5047-87f6-dc1f09883836" + }, + "name": "eth-1/0/24", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "1b97500c-f4d6-57fc-b8dd-259c150aa33d" + }, + "name": "eth-1/0/13", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "1c8e6596-1eb7-517e-8324-c74875efb9cc" + }, + "name": "Transceiver#25", + "parent": "eth-1/0/25", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "2057d491-54e2-52f3-be89-7e8453af1956" + }, + "name": "eth-1/0/25", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"false\"", + "location": "\"Power Supplies tray\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "211c3af7-d69a-5c23-b911-2dc522afbf1d" + }, + "name": "Power-Supply#2", + "parent": "chassis", + "type": "POWER_SUPPLY" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "21cbcc2b-4750-5476-8df6-2ba67470b336" + }, + "name": "eth-1/0/20", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "22de51e1-0a09-59b3-864e-8fd379931bb6" + }, + "name": "Fan#1", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "24639859-aa84-532a-ac92-d7fc91db0a22" + }, + "name": "eth-1/0/15", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "2815040e-3a39-545e-9799-4f223014dbfc" + }, + "name": "eth-1/0/18", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "2cc805ae-4959-5c53-8d21-98314a61bdfb" + }, + "name": "eth-1/0/11", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"QSFP28\"", + "removable": "\"true\"", + "serial-num": "\"INCNCNLAZA01015\"", + "vendor": "\"INNOLIGHT \"" + }, + "component_uuid": { + "uuid": "323bb3fe-391d-5cc2-8cf0-0b99ec874045" + }, + "name": "Transceiver#2", + "parent": "eth-1/0/2", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "39498531-80a9-5660-9018-04e215ffe618" + }, + "name": "Transceiver#20", + "parent": "eth-1/0/20", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "3b8c5d33-58ab-5403-80fa-395bbf8e91a0" + }, + "name": "eth-1/0/4", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"false\"" + }, + "component_uuid": { + "uuid": "400555ff-395a-54c0-a8e6-6702c0505dbe" + }, + "name": "Transceiver#30", + "parent": "eth-1/0/30", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "43455150-4a95-58d8-bf84-d0e83095431b" + }, + "name": "eth-1/0/9", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "49a31219-0e33-5d0f-a45a-3bf285f9e2fd" + }, + "name": "Transceiver#9", + "parent": "eth-1/0/9", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "4c860a8b-e262-5d27-8f98-0b0be6562a4d" + }, + "name": "Transceiver#26", + "parent": "eth-1/0/26", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "52aaa9ea-61f7-5052-b988-2fac4afe4172" + }, + "name": "Fan#5", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "54a2e18e-edfc-5b65-a5c3-20c7bd7e3593" + }, + "name": "eth-1/0/22", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "55937b2f-19d0-52e6-ac51-3ca68d5ba047" + }, + "name": "eth-1/0/6", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"1G Copper\"" + }, + "component_uuid": { + "uuid": "58ea7baa-3ac1-5501-9fdf-a1310881fe83" + }, + "name": "eth-1/0/30", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"QSFP28\"", + "removable": "\"true\"", + "serial-num": "\"INCNCNLBIA94000\"", + "vendor": "\"INNOLIGHT \"" + }, + "component_uuid": { + "uuid": "6ba73403-f894-5781-8a83-a906649b26be" + }, + "name": "Transceiver#1", + "parent": "eth-1/0/1", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "6e5b78c9-869a-5fbe-90b2-0cd287b2e4be" + }, + "name": "eth-1/0/26", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"ACW1747006N4 \"", + "vendor": "\"Arista Networks\"" + }, + "component_uuid": { + "uuid": "6fe099f7-0b6d-5fdb-bdf5-72046ec4c6b4" + }, + "name": "Transceiver#11", + "parent": "eth-1/0/11", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"AD1331A02S9 \"", + "vendor": "\"Intel Corp \"" + }, + "component_uuid": { + "uuid": "72f4bcf3-d7c7-59e8-80c6-a8cd2971f17d" + }, + "name": "Transceiver#13", + "parent": "eth-1/0/13", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"CRXT-T0T12B\"", + "empty": "\"false\"", + "location": "\"Power Supplies tray\"", + "manufacturer-name": "\"CRXT-T0T12B\"", + "removable": "\"true\"", + "serial-num": "\"21030005\"" + }, + "component_uuid": { + "uuid": "7905b083-401b-5685-8ec2-ad2ba21f716b" + }, + "name": "Power-Supply#1", + "parent": "chassis", + "type": "POWER_SUPPLY" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "7dbf69ba-707e-54b6-98fc-f907f40234b4" + }, + "name": "eth-1/0/23", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"CN04HG00184001E\"", + "vendor": "\"DELL EMC \"" + }, + "component_uuid": { + "uuid": "7f5c81bf-e019-58d4-96a3-9fbb9edc22f8" + }, + "name": "Transceiver#16", + "parent": "eth-1/0/16", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"1G Copper\"" + }, + "component_uuid": { + "uuid": "8ae15e57-f162-567c-a619-df5b548c0902" + }, + "name": "eth-1/0/29", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"false\"" + }, + "component_uuid": { + "uuid": "8e3677d0-42a7-5942-9b09-e86657cbcd41" + }, + "name": "Transceiver#27", + "parent": "eth-1/0/27", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"F162250012 \"", + "vendor": "\"Edgecore \"" + }, + "component_uuid": { + "uuid": "9b42bf35-e457-5303-b765-523009f7a5a4" + }, + "name": "Transceiver#12", + "parent": "eth-1/0/12", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "9beab43b-9bb4-5672-adc3-f6329e4ba827" + }, + "name": "eth-1/0/21", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "a3154e0c-8fb7-5cda-b245-4be61a10b220" + }, + "name": "eth-1/0/19", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "a40ba96e-db02-502f-b8e7-c4ce60e6a681" + }, + "name": "Transceiver#4", + "parent": "eth-1/0/4", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "a4cfdc29-bcaa-57ec-8c83-126e0e77c2ec" + }, + "name": "eth-1/0/5", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "a9e9c4ec-265a-5039-848c-2ebf578855f3" + }, + "name": "eth-1/0/3", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"AD0911A00C2 \"", + "vendor": "\"Intel Corp \"" + }, + "component_uuid": { + "uuid": "aae72351-d863-5c58-b76b-bba4b2075ef9" + }, + "name": "Transceiver#19", + "parent": "eth-1/0/19", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"false\"" + }, + "component_uuid": { + "uuid": "aaf4e1d8-b1fe-5864-a1ce-ae8d6b188293" + }, + "name": "Transceiver#28", + "parent": "eth-1/0/28", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "ad294931-6af3-51dd-a869-77b0737e8d2c" + }, + "name": "Transceiver#5", + "parent": "eth-1/0/5", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "b49ce3de-b5f9-5f02-b2f6-aa9e0c4ab9c0" + }, + "name": "Transceiver#18", + "parent": "eth-1/0/18", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"7315-30X-O-48V-S\"", + "empty": "\"false\"", + "hardware-rev": "\"R0B\"", + "manufacturer-name": "\"7315-30X-O-48V-S\"", + "mfg-date": "\"2021-10-25\"", + "removable": "\"false\"", + "serial-num": "\"731530X2143013\"", + "software-rev": "\"21.5.1 (9799)\"" + }, + "component_uuid": { + "uuid": "bae372e1-9b13-5f5e-aed0-0dfe87d9c9b7" + }, + "name": "chassis", + "parent": "chassis", + "type": "CHASSIS" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "c4a286b4-14bc-508c-94d5-3210d5a4670d" + }, + "name": "Fan#3", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "c9a857e4-736c-54a1-abe8-bd5768f556b4" + }, + "name": "Transceiver#6", + "parent": "eth-1/0/6", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"ACW1747006MV \"", + "vendor": "\"Arista Networks\"" + }, + "component_uuid": { + "uuid": "ca78897e-e256-5a57-91e8-792e92280c30" + }, + "name": "Transceiver#23", + "parent": "eth-1/0/23", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "cb6fb97c-fe8f-528f-b34e-c7c9ee52e485" + }, + "name": "Transceiver#17", + "parent": "eth-1/0/17", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "cce67881-0cf8-5778-83fc-099e4dddfa50" + }, + "name": "eth-1/0/14", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "ce3fb53f-c07c-5b1d-b8b3-8c08da8800b9" + }, + "name": "Fan#4", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "description": "\"100G/40G Fiber\"" + }, + "component_uuid": { + "uuid": "d0757c2c-8d4b-57aa-8f17-c5fab40551d4" + }, + "name": "eth-1/0/2", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "d54a9b97-d671-5c84-988d-1d0bc3a62f55" + }, + "name": "Transceiver#7", + "parent": "eth-1/0/7", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "d6e15727-40bd-51f6-a7c4-7356358a60b6" + }, + "name": "eth-1/0/16", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "d7d2e358-3203-5e6b-a23b-eecc4f866fa9" + }, + "name": "Transceiver#22", + "parent": "eth-1/0/22", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "da6e0382-5ca3-5f23-8ae6-1c8ccc897c65" + }, + "name": "Transceiver#24", + "parent": "eth-1/0/24", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "db647a95-a6e8-5ad3-8d9a-0842517fe27d" + }, + "name": "eth-1/0/7", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "de36dafb-2d66-54ef-9351-54ee4a1b0f9b" + }, + "name": "Transceiver#3", + "parent": "eth-1/0/3", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"1G Copper\"" + }, + "component_uuid": { + "uuid": "df37f614-ec9f-5181-8c41-c322f31586ea" + }, + "name": "eth-1/0/27", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"1G Copper\"" + }, + "component_uuid": { + "uuid": "df910973-1c02-53ff-8dde-3bce8955a73a" + }, + "name": "eth-1/0/28", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"false\"" + }, + "component_uuid": { + "uuid": "e43d275a-e710-5a00-b1c9-6b964f4214f2" + }, + "name": "Transceiver#29", + "parent": "eth-1/0/29", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"CN04HG0018P13RE\"", + "vendor": "\"DELL EMC \"" + }, + "component_uuid": { + "uuid": "ecf4c207-e36b-52cb-a34a-2cecc4030d25" + }, + "name": "Transceiver#15", + "parent": "eth-1/0/15", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "f3e2636c-c742-5542-8586-7a7d516e8544" + }, + "name": "Fan#2", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "fb5d6c6d-edf2-5d17-b39f-62a889797be3" + }, + "name": "Transceiver#8", + "parent": "eth-1/0/8", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"ACW1747006MZ \"", + "vendor": "\"Arista Networks\"" + }, + "component_uuid": { + "uuid": "fe86ab62-509d-513a-b378-2bc18a794542" + }, + "name": "Transceiver#21", + "parent": "eth-1/0/21", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "ffb8587d-ddb3-5eec-ba78-bb5be047def2" + }, + "name": "eth-1/0/12", + "parent": "", + "type": "PORT" + } + ], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "10.95.90.127" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "830" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"allow_agent\": false,\n\"commit_per_rule\": true,\n\"device_params\": {\n\"name\": \"huaweiyang\"\n},\n\"force_running\": false,\n\"hostkey_verify\": false,\n\"look_for_keys\": false,\n\"manager_params\": {\n\"timeout\": 120\n},\n\"message_renderer\": \"pyangbind\",\n\"password\": \"admin\",\n\"username\": \"admin\",\n\"vendor\": \"ADVA\"\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/chassis", + "resource_value": "{\"attributes\": {\"description\": \"7315-30X-O-48V-S\", \"empty\": \"false\", \"hardware-rev\": \"R0B\", \"manufacturer-name\": \"7315-30X-O-48V-S\", \"mfg-date\": \"2021-10-25\", \"removable\": \"false\", \"serial-num\": \"731530X2143013\", \"software-rev\": \"21.5.1 (9799)\"}, \"class\": \"CHASSIS\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"chassis\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#1", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#1\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#2", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#2\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#3", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#3\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#4", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#4\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#5", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#5\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Power-Supply#1", + "resource_value": "{\"attributes\": {\"description\": \"CRXT-T0T12B\", \"empty\": \"false\", \"location\": \"Power Supplies tray\", \"manufacturer-name\": \"CRXT-T0T12B\", \"removable\": \"true\", \"serial-num\": \"21030005\"}, \"class\": \"POWER_SUPPLY\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Power-Supply#1\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Power-Supply#2", + "resource_value": "{\"attributes\": {\"empty\": \"false\", \"location\": \"Power Supplies tray\", \"removable\": \"true\"}, \"class\": \"POWER_SUPPLY\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Power-Supply#2\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/1", + "resource_value": "{\"attributes\": {\"description\": \"100G/40G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\"], \"name\": \"eth-1/0/1\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#1", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"QSFP28\", \"removable\": \"true\", \"serial-num\": \"INCNCNLBIA94000\", \"vendor\": \"INNOLIGHT \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [3, \"PORT\"], \"name\": \"Transceiver#1\", \"parent-component-references\": \"eth-1/0/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/2", + "resource_value": "{\"attributes\": {\"description\": \"100G/40G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/2\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#2", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"QSFP28\", \"removable\": \"true\", \"serial-num\": \"INCNCNLAZA01015\", \"vendor\": \"INNOLIGHT \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [4, \"PORT\"], \"name\": \"Transceiver#2\", \"parent-component-references\": \"eth-1/0/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/3", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/3\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#3", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [5, \"PORT\"], \"name\": \"Transceiver#3\", \"parent-component-references\": \"eth-1/0/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/4", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/4\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#4", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [6, \"PORT\"], \"name\": \"Transceiver#4\", \"parent-component-references\": \"eth-1/0/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/5", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/5\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#5", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [7, \"PORT\"], \"name\": \"Transceiver#5\", \"parent-component-references\": \"eth-1/0/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/6", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/6\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#6", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [8, \"PORT\"], \"name\": \"Transceiver#6\", \"parent-component-references\": \"eth-1/0/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/7", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/7\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#7", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [9, \"PORT\"], \"name\": \"Transceiver#7\", \"parent-component-references\": \"eth-1/0/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/8", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/8\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#8", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [10, \"PORT\"], \"name\": \"Transceiver#8\", \"parent-component-references\": \"eth-1/0/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/9", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/9\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#9", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [11, \"PORT\"], \"name\": \"Transceiver#9\", \"parent-component-references\": \"eth-1/0/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/10", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/10\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#10", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [12, \"PORT\"], \"name\": \"Transceiver#10\", \"parent-component-references\": \"eth-1/0/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/11", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/11\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#11", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"ACW1747006N4 \", \"vendor\": \"Arista Networks\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [13, \"PORT\"], \"name\": \"Transceiver#11\", \"parent-component-references\": \"eth-1/0/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/12", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/12\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#12", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"F162250012 \", \"vendor\": \"Edgecore \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [14, \"PORT\"], \"name\": \"Transceiver#12\", \"parent-component-references\": \"eth-1/0/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/13", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/13\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#13", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"AD1331A02S9 \", \"vendor\": \"Intel Corp \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [15, \"PORT\"], \"name\": \"Transceiver#13\", \"parent-component-references\": \"eth-1/0/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/14", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/14\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#14", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [16, \"PORT\"], \"name\": \"Transceiver#14\", \"parent-component-references\": \"eth-1/0/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/15", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/15\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#15", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"CN04HG0018P13RE\", \"vendor\": \"DELL EMC \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [17, \"PORT\"], \"name\": \"Transceiver#15\", \"parent-component-references\": \"eth-1/0/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/16", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/16\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#16", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"CN04HG00184001E\", \"vendor\": \"DELL EMC \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [18, \"PORT\"], \"name\": \"Transceiver#16\", \"parent-component-references\": \"eth-1/0/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/17", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/17\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#17", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [19, \"PORT\"], \"name\": \"Transceiver#17\", \"parent-component-references\": \"eth-1/0/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/18", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/18\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#18", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [20, \"PORT\"], \"name\": \"Transceiver#18\", \"parent-component-references\": \"eth-1/0/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/19", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/19\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#19", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"AD0911A00C2 \", \"vendor\": \"Intel Corp \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [21, \"PORT\"], \"name\": \"Transceiver#19\", \"parent-component-references\": \"eth-1/0/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/20", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/20\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#20", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [22, \"PORT\"], \"name\": \"Transceiver#20\", \"parent-component-references\": \"eth-1/0/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/21", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/21\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#21", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"ACW1747006MZ \", \"vendor\": \"Arista Networks\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [23, \"PORT\"], \"name\": \"Transceiver#21\", \"parent-component-references\": \"eth-1/0/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/22", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/22\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#22", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [24, \"PORT\"], \"name\": \"Transceiver#22\", \"parent-component-references\": \"eth-1/0/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/23", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/23\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#23", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"ACW1747006MV \", \"vendor\": \"Arista Networks\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [25, \"PORT\"], \"name\": \"Transceiver#23\", \"parent-component-references\": \"eth-1/0/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/24", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/24\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#24", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [26, \"PORT\"], \"name\": \"Transceiver#24\", \"parent-component-references\": \"eth-1/0/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/25", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/25\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#25", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [27, \"PORT\"], \"name\": \"Transceiver#25\", \"parent-component-references\": \"eth-1/0/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/26", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/26\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#26", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [28, \"PORT\"], \"name\": \"Transceiver#26\", \"parent-component-references\": \"eth-1/0/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/27", + "resource_value": "{\"attributes\": {\"description\": \"1G Copper\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/27\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#27", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"false\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [29, \"PORT\"], \"name\": \"Transceiver#27\", \"parent-component-references\": \"eth-1/0/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/28", + "resource_value": "{\"attributes\": {\"description\": \"1G Copper\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/28\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#28", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"false\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [30, \"PORT\"], \"name\": \"Transceiver#28\", \"parent-component-references\": \"eth-1/0/28\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/29", + "resource_value": "{\"attributes\": {\"description\": \"1G Copper\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/29\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#29", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"false\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [31, \"PORT\"], \"name\": \"Transceiver#29\", \"parent-component-references\": \"eth-1/0/29\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/30", + "resource_value": "{\"attributes\": {\"description\": \"1G Copper\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/30\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#30", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"false\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [32, \"PORT\"], \"name\": \"Transceiver#30\", \"parent-component-references\": \"eth-1/0/30\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/1]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/1']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/1']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/1']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/1']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/2]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/2']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/2']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/2']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/2']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/3]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/3']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/3']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/3']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/3']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/4]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/4']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/4']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/4']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/4']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/5]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/5']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/5']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/5']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/5']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/6]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/6']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/6']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/6']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/6']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/7]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/7']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/7']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/7']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/7']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/8]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/8']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/8']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/8']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/8']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/9]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/9']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/9']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/9']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/9']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/10]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/10']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/10']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/10']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/10']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/11]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/11']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/11']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/11']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/11']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/12]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/12']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/12']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/12']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/12']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/13]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/13']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/13']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/13']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/13']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/14]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/14']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/14']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/14']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/14']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/15]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/15']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/15']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/15']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/15']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/16]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/16']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/16']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/16']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/16']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/17]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/17']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/17']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/17']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/17']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/18]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/18']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/18']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/18']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/18']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/19]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/19']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/19']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/19']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/19']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/20]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/20']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/20']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/20']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/20']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/21]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/21']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/21']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/21']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/21']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/22]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/22']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/22']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/22']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/22']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/23]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/23']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/23']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/23']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/23']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/24]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/24']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/24']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/24']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/24']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/25]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/25']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/25']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/25']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/25']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/26]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/26']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/26']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/26']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/26']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/27]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/27']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/27']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/27']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/27']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/28]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/28']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/28']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/28']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/28']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/28\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/29]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/29']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/29']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/29']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/29']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/29\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/30]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/30']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/30']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/30']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/30']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/30\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/1]", + "resource_value": "{\"description\": \"\\\"Conexion con XR\\\"\", \"mtu\": 1522, \"name\": \"eth-1/0/1\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/2]", + "resource_value": "{\"name\": \"eth-1/0/2\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/3]", + "resource_value": "{\"name\": \"eth-1/0/3\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/4]", + "resource_value": "{\"name\": \"eth-1/0/4\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/5]", + "resource_value": "{\"name\": \"eth-1/0/5\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/6]", + "resource_value": "{\"name\": \"eth-1/0/6\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/7]", + "resource_value": "{\"name\": \"eth-1/0/7\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/8]", + "resource_value": "{\"name\": \"eth-1/0/8\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/9]", + "resource_value": "{\"name\": \"eth-1/0/9\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/10]", + "resource_value": "{\"name\": \"eth-1/0/10\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/11]", + "resource_value": "{\"description\": \"\\\"Conexion con HL4-2-1\\\"\", \"name\": \"eth-1/0/11\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/12]", + "resource_value": "{\"description\": \"\\\"Conexion con HL5-3-1\\\"\", \"name\": \"eth-1/0/12\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/13]", + "resource_value": "{\"name\": \"eth-1/0/13\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/14]", + "resource_value": "{\"name\": \"eth-1/0/14\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/15]", + "resource_value": "{\"name\": \"eth-1/0/15\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/16]", + "resource_value": "{\"description\": \"\\\"Conexion con IPM\\\"\", \"mtu\": 1522, \"name\": \"eth-1/0/16\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/17]", + "resource_value": "{\"name\": \"eth-1/0/17\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/18]", + "resource_value": "{\"name\": \"eth-1/0/18\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/19]", + "resource_value": "{\"name\": \"eth-1/0/19\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/20]", + "resource_value": "{\"name\": \"eth-1/0/20\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/21]", + "resource_value": "{\"description\": \"\\\"TeraFlow\\\"\", \"name\": \"eth-1/0/21\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/22]", + "resource_value": "{\"name\": \"eth-1/0/22\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/23]", + "resource_value": "{\"name\": \"eth-1/0/23\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/24]", + "resource_value": "{\"name\": \"eth-1/0/24\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/25]", + "resource_value": "{\"name\": \"eth-1/0/25\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/26]", + "resource_value": "{\"name\": \"eth-1/0/26\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/27]", + "resource_value": "{\"name\": \"eth-1/0/27\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/28]", + "resource_value": "{\"name\": \"eth-1/0/28\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/29]", + "resource_value": "{\"name\": \"eth-1/0/29\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/30]", + "resource_value": "{\"name\": \"eth-1/0/30\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth0]/subinterface[0]", + "resource_value": "{\"address_ip\": \"10.95.90.127\", \"address_prefix\": 24, \"index\": 0, \"name\": \"eth0\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth0]", + "resource_value": "{\"name\": \"eth0\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[dummy1]/subinterface[0]", + "resource_value": "{\"address_ip\": \"5.5.5.6\", \"address_prefix\": 32, \"index\": 0, \"name\": \"dummy1\", \"type\": \"softwareLoopback\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[dummy1]", + "resource_value": "{\"name\": \"dummy1\", \"type\": \"softwareLoopback\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/1.246]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.2.1\", \"address_prefix\": 24, \"index\": 0, \"mtu\": \"1522\", \"name\": \"eth-1/0/1.246\", \"type\": \"l3ipvlan\", \"vlan_id\": 246}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/1.246]", + "resource_value": "{\"description\": \"Pruebas XR\", \"mtu\": 1522, \"name\": \"eth-1/0/1.246\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/2.357]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.3.1\", \"address_prefix\": 24, \"index\": 0, \"name\": \"eth-1/0/2.357\", \"type\": \"l3ipvlan\", \"vlan_id\": 357}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/2.357]", + "resource_value": "{\"description\": \"Pruebas XR\", \"name\": \"eth-1/0/2.357\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/11.55]/subinterface[0]", + "resource_value": "{\"address_ip\": \"98.5.55.4\", \"address_ipv6\": \"2001::98:5:55:4\", \"address_prefix\": 24, \"address_prefix_v6\": 112, \"index\": 0, \"mtu\": \"1555\", \"name\": \"eth-1/0/11.55\", \"type\": \"l3ipvlan\", \"vlan_id\": 55}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/11.55]", + "resource_value": "{\"mtu\": 1555, \"name\": \"eth-1/0/11.55\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/12.42]/subinterface[0]", + "resource_value": "{\"address_ip\": \"98.4.42.5\", \"address_ipv6\": \"2001::98:4:42:5\", \"address_prefix\": 24, \"address_prefix_v6\": 112, \"index\": 0, \"name\": \"eth-1/0/12.42\", \"type\": \"l3ipvlan\", \"vlan_id\": 42}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/12.42]", + "resource_value": "{\"name\": \"eth-1/0/12.42\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/13.13]/subinterface[0]", + "resource_value": "{\"index\": 0, \"name\": \"eth-1/0/13.13\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/13.13]", + "resource_value": "{\"name\": \"eth-1/0/13.13\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/14.70]/subinterface[0]", + "resource_value": "{\"index\": 0, \"name\": \"eth-1/0/14.70\", \"type\": \"l3ipvlan\", \"vlan_id\": 70}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/14.70]", + "resource_value": "{\"name\": \"eth-1/0/14.70\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/15.203]/subinterface[0]", + "resource_value": "{\"address_ip\": \"150.2.203.5\", \"address_ipv6\": \"2001::150:2:203:5\", \"address_prefix\": 24, \"address_prefix_v6\": 112, \"index\": 0, \"name\": \"eth-1/0/15.203\", \"type\": \"l3ipvlan\", \"vlan_id\": 203}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/15.203]", + "resource_value": "{\"name\": \"eth-1/0/15.203\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/16.69]/subinterface[0]", + "resource_value": "{\"address_ip\": \"192.168.69.1\", \"address_prefix\": 24, \"index\": 0, \"mtu\": \"1522\", \"name\": \"eth-1/0/16.69\", \"type\": \"l3ipvlan\", \"vlan_id\": 69}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/16.69]", + "resource_value": "{\"mtu\": 1522, \"name\": \"eth-1/0/16.69\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/17.205]/subinterface[0]", + "resource_value": "{\"index\": 0, \"name\": \"eth-1/0/17.205\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/17.205]", + "resource_value": "{\"name\": \"eth-1/0/17.205\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/19.55]/subinterface[0]", + "resource_value": "{\"address_ip\": \"99.5.19.1\", \"address_ipv6\": \"2001::99:5:19:5\", \"address_prefix\": 24, \"address_prefix_v6\": 112, \"index\": 0, \"name\": \"eth-1/0/19.55\", \"type\": \"l3ipvlan\", \"vlan_id\": 19}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/19.55]", + "resource_value": "{\"description\": \"\\\"Conexion con HL5-1-2\\\"\", \"name\": \"eth-1/0/19.55\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/20.55]/subinterface[0]", + "resource_value": "{\"address_ip\": \"99.5.20.1\", \"address_ipv6\": \"2001::99:5:20:5\", \"address_prefix\": 24, \"address_prefix_v6\": 112, \"index\": 0, \"name\": \"eth-1/0/20.55\", \"type\": \"l3ipvlan\", \"vlan_id\": 20}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/20.55]", + "resource_value": "{\"description\": \"\\\"Conexion con HL5-2-2\\\"\", \"name\": \"eth-1/0/20.55\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/21.111]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.1.1\", \"address_prefix\": 24, \"index\": 0, \"mtu\": \"3000\", \"name\": \"eth-1/0/21.111\", \"type\": \"l3ipvlan\", \"vlan_id\": 111}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/21.111]", + "resource_value": "{\"mtu\": 3000, \"name\": \"eth-1/0/21.111\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/23.40]/subinterface[0]", + "resource_value": "{\"address_ip\": \"10.3.55.40\", \"address_ipv6\": \"2001::99:4:40:5\", \"address_prefix\": 24, \"address_prefix_v6\": 112, \"index\": 0, \"name\": \"eth-1/0/23.40\", \"type\": \"l3ipvlan\", \"vlan_id\": 55}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/23.40]", + "resource_value": "{\"description\": \"\\\"Conexion con HL3-1-2\\\"\", \"name\": \"eth-1/0/23.40\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[OSCAR]", + "resource_value": "{\"policy_name\": \"OSCAR\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[OTRO_AS_PATH_SET]", + "resource_value": "{\"policy_name\": \"OTRO_AS_PATH_SET\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]", + "resource_value": "{\"name\": \"default\", \"router_id\": \"5.5.5.6\", \"type\": \"DEFAULT_INSTANCE\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[ISIS]", + "resource_value": "{\"identifier\": \"ISIS\", \"name\": \"default\", \"protocol_name\": \"ISIS\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[BGP]", + "resource_value": "{\"as\": 65001, \"identifier\": \"BGP\", \"name\": \"default\", \"protocol_name\": \"BGP\", \"router_id\": \"5.5.5.6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[DIRECTLY_CONNECTED]", + "resource_value": "{\"identifier\": \"DIRECTLY_CONNECTED\", \"name\": \"default\", \"protocol_name\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[STATIC]", + "resource_value": "{\"identifier\": \"STATIC\", \"name\": \"default\", \"protocol_name\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/table_connections[DIRECTLY_CONNECTED][BGP][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"BGP\", \"name\": \"default\", \"src_protocol\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/table_connections[DIRECTLY_CONNECTED][ISIS][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"ISIS\", \"name\": \"default\", \"src_protocol\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[XR]", + "resource_value": "{\"name\": \"XR\", \"type\": \"L3VRF\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_OPENCONFIG" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "1b773a03-f3d0-53e6-98ad-cb3f6c5983da" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "1b836541-0cee-5a4c-96f5-3104dc97444c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "201efb36-bd05-583a-84eb-329dfdcdddd0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/28" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "265cdc1e-d358-5cc4-bd50-2e1b78781b1f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "2be6e8ad-b9f9-50d8-89d4-6963969ea4d4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "2e9ff47a-6577-5c39-9e71-ada12fe09080" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "3677c1c1-6b87-5478-8fd6-997deeddc5c0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "3f535fc7-2848-51bd-b243-b2e24bf805a3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "4266450a-4f29-59d6-b0b8-4b3e08851410" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "45da321c-790a-5924-999c-17335b99ad6e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/30" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "4cf72ad5-b3ca-5a8c-b3fd-95c8ae773cdb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "5d4a9940-eecb-540c-9e07-d947727195b6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "6a6e8af4-77c8-578f-a307-7708db102385" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "6aa76d3a-d85b-588b-8abe-58a31d965446" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "6c90dd43-86bb-5b5e-a6c4-ddb532c098bc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "7a76d8f8-fbf6-5286-aab1-d7c7862bce20" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "83ac84c2-f83b-5746-8c45-a8f0cfa6c6cc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "90e49e40-7174-54f6-aa7d-ebfc9d604106" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "916536c2-7e74-5e8a-8311-09817b1885a4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "9b426a30-b6da-509c-9693-b10f91ac1cfb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "9c773f1e-1254-55a9-ac14-4784df24a278" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "a6d5c32c-d5fc-5481-b41b-f0bd9dd9a18b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "ab60d672-d742-5747-8cc0-ef68f3dfdb39" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "aebc391d-371a-519a-8bc7-48416528a4c9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "b10a0a5b-2ac4-5a5d-a230-698aceb871a8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "b5cbabde-9096-5d4d-846e-ea732e3a9942" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "c0209652-ee27-53d5-876e-2379f5e31d88" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "c64ddfdf-a7fb-557d-a5da-a5457faf3c65" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/29" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "e85ff816-2ba0-55ff-97ce-c5e5887238e6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "endpoint_uuid": { + "uuid": "fc4a92bf-49a8-546c-9cb8-4182492da1a5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/21" + } + ], + "device_id": { + "device_uuid": { + "uuid": "2a672db3-9ac5-5124-b9b2-12c9fc9dd4a8" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "packet-router", + "name": "R199" + }, + { + "components": [], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "127.0.0.1" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "0" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"endpoints\": [\n{\n\"uuid\": \"1/2\"\n},\n{\n\"uuid\": \"1/4\"\n},\n{\n\"uuid\": \"1/14\"\n},\n{\n\"uuid\": \"2/1\"\n},\n{\n\"uuid\": \"2/2\"\n},\n{\n\"uuid\": \"2/3\"\n},\n{\n\"uuid\": \"2/4\"\n},\n{\n\"uuid\": \"2/5\"\n},\n{\n\"uuid\": \"2/6\"\n},\n{\n\"uuid\": \"2/7\"\n},\n{\n\"uuid\": \"2/8\"\n},\n{\n\"uuid\": \"2/9\"\n},\n{\n\"uuid\": \"2/10\"\n},\n{\n\"uuid\": \"2/11\"\n},\n{\n\"uuid\": \"2/12\"\n},\n{\n\"uuid\": \"2/13\"\n},\n{\n\"uuid\": \"2/14\"\n},\n{\n\"uuid\": \"2/15\"\n},\n{\n\"uuid\": \"2/16\"\n},\n{\n\"uuid\": \"2/17\"\n},\n{\n\"uuid\": \"2/18\"\n},\n{\n\"uuid\": \"2/19\"\n},\n{\n\"uuid\": \"2/20\"\n},\n{\n\"uuid\": \"2/21\"\n},\n{\n\"uuid\": \"2/22\"\n},\n{\n\"uuid\": \"2/23\"\n},\n{\n\"uuid\": \"2/24\"\n},\n{\n\"uuid\": \"2/25\"\n},\n{\n\"uuid\": \"2/26\"\n},\n{\n\"uuid\": \"2/27\"\n},\n{\n\"uuid\": \"2/28\"\n},\n{\n\"uuid\": \"2/29\"\n},\n{\n\"uuid\": \"2/30\"\n},\n{\n\"uuid\": \"2/31\"\n},\n{\n\"uuid\": \"2/32\"\n},\n{\n\"uuid\": \"2/33\"\n},\n{\n\"uuid\": \"2/34\"\n},\n{\n\"uuid\": \"2/35\"\n},\n{\n\"uuid\": \"2/36\"\n},\n{\n\"uuid\": \"2/37\"\n},\n{\n\"uuid\": \"2/38\"\n},\n{\n\"uuid\": \"2/39\"\n},\n{\n\"uuid\": \"2/40\"\n},\n{\n\"uuid\": \"2/41\"\n},\n{\n\"uuid\": \"2/42\"\n},\n{\n\"uuid\": \"2/43\"\n},\n{\n\"uuid\": \"2/44\"\n},\n{\n\"uuid\": \"2/45\"\n},\n{\n\"uuid\": \"2/46\"\n},\n{\n\"uuid\": \"2/47\"\n},\n{\n\"uuid\": \"2/48\"\n},\n{\n\"uuid\": \"2/49\"\n},\n{\n\"uuid\": \"2/50\"\n}\n]\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/2]", + "resource_value": "{\"uuid\": \"1/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/4]", + "resource_value": "{\"uuid\": \"1/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/14]", + "resource_value": "{\"uuid\": \"1/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/1]", + "resource_value": "{\"uuid\": \"2/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/2]", + "resource_value": "{\"uuid\": \"2/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/3]", + "resource_value": "{\"uuid\": \"2/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/4]", + "resource_value": "{\"uuid\": \"2/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/5]", + "resource_value": "{\"uuid\": \"2/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/6]", + "resource_value": "{\"uuid\": \"2/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/7]", + "resource_value": "{\"uuid\": \"2/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/8]", + "resource_value": "{\"uuid\": \"2/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/9]", + "resource_value": "{\"uuid\": \"2/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/10]", + "resource_value": "{\"uuid\": \"2/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/11]", + "resource_value": "{\"uuid\": \"2/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/12]", + "resource_value": "{\"uuid\": \"2/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/13]", + "resource_value": "{\"uuid\": \"2/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/14]", + "resource_value": "{\"uuid\": \"2/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/15]", + "resource_value": "{\"uuid\": \"2/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/16]", + "resource_value": "{\"uuid\": \"2/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/17]", + "resource_value": "{\"uuid\": \"2/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/18]", + "resource_value": "{\"uuid\": \"2/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/19]", + "resource_value": "{\"uuid\": \"2/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/20]", + "resource_value": "{\"uuid\": \"2/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/21]", + "resource_value": "{\"uuid\": \"2/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/22]", + "resource_value": "{\"uuid\": \"2/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/23]", + "resource_value": "{\"uuid\": \"2/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/24]", + "resource_value": "{\"uuid\": \"2/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/25]", + "resource_value": "{\"uuid\": \"2/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/26]", + "resource_value": "{\"uuid\": \"2/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/27]", + "resource_value": "{\"uuid\": \"2/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/28]", + "resource_value": "{\"uuid\": \"2/28\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/29]", + "resource_value": "{\"uuid\": \"2/29\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/30]", + "resource_value": "{\"uuid\": \"2/30\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/31]", + "resource_value": "{\"uuid\": \"2/31\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/32]", + "resource_value": "{\"uuid\": \"2/32\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/33]", + "resource_value": "{\"uuid\": \"2/33\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/34]", + "resource_value": "{\"uuid\": \"2/34\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/35]", + "resource_value": "{\"uuid\": \"2/35\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/36]", + "resource_value": "{\"uuid\": \"2/36\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/37]", + "resource_value": "{\"uuid\": \"2/37\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/38]", + "resource_value": "{\"uuid\": \"2/38\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/39]", + "resource_value": "{\"uuid\": \"2/39\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/40]", + "resource_value": "{\"uuid\": \"2/40\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/41]", + "resource_value": "{\"uuid\": \"2/41\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/42]", + "resource_value": "{\"uuid\": \"2/42\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/43]", + "resource_value": "{\"uuid\": \"2/43\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/44]", + "resource_value": "{\"uuid\": \"2/44\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/45]", + "resource_value": "{\"uuid\": \"2/45\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/46]", + "resource_value": "{\"uuid\": \"2/46\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/47]", + "resource_value": "{\"uuid\": \"2/47\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/48]", + "resource_value": "{\"uuid\": \"2/48\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/49]", + "resource_value": "{\"uuid\": \"2/49\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/50]", + "resource_value": "{\"uuid\": \"2/50\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_UNDEFINED" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "00118309-6edb-5dc5-aceb-97ae37816910" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/28" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "0675ff9b-42ed-5216-8b12-2776f1da30ea" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "07367b74-2b7f-55d5-a910-f7ddb5dbcbe8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/40" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "0f8a40d9-7c24-5444-b399-be085cde9017" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "15da3804-8635-5212-9d10-f24a3d11f677" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/46" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "162e1061-4a21-52be-88bd-ed4fbddd5d63" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/39" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "165990a2-7755-52cb-af51-7ceba005a453" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "179c986d-db43-5c9f-9cfb-3919f42deb22" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "1d059e64-7bfa-532e-85d5-b911e75b9d00" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "22bacecd-c3b9-5359-baf6-d06178e13d49" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "2e7302bf-2553-5d87-80f6-84acbf045e0d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "404db7aa-59d7-5063-b078-596d25d2d4c6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "632edc18-d6ba-5ee9-9973-d0838234540c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/32" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "63b8f2aa-3636-58f6-b86f-1ef05be9f901" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/41" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "66f63c6e-1bcc-5b3b-861f-0ab72f008f82" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/43" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "696655c3-f604-5a99-89ed-7281295cb1de" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "6c498da3-67d3-5710-b9bb-820aa8579b61" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "6e6e7473-54ad-5c3e-b86a-017e4dd5b0cd" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/45" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "76234d0c-5ae8-5fa1-9060-afb803f1ad6d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "95d55f2f-a591-5156-891b-f45888d7d755" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "96bdbc64-fcfe-5983-bdb3-7c1ddafa4965" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "9a92de93-f5f7-50e5-bf75-e8a687e48bbb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "9b38c1ed-c2d1-5eab-ae10-ccac9325fa58" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "a1790464-c78d-5258-9dbe-0bfd60909da6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/48" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "aa30ff67-23d2-52ec-b405-46531c9510f2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/30" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "ac6ee438-49f0-536d-b082-0d874bda33d5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "acbbd5fe-c8bf-54b8-a4ca-9f3d9dc410f2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/21" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "af6760db-b952-58f7-8d91-7c776c7750f7" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "b41152a1-428c-51de-a42d-d51d5d3fb156" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "b57ed803-ee20-586f-959e-1a42d51dfc6c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/49" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "bcfc99bf-5d32-5fab-95ab-56d6ea374926" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/37" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "bdc6d7f4-5f1d-56ae-a87e-c74bd8e50ebc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/50" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "c035fdf7-704b-5854-8b52-906a8d173f41" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "c57bef02-b9a2-56c2-83de-eafa3b96a057" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "c61930b9-c952-5df0-a4c5-23bce6e35fdb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/38" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "ca8238df-049d-5b4f-9f01-372d2d7f910d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "cab7d834-a793-5929-9684-0657814007b1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/34" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "cb36d1d2-61bc-52dd-b528-8091d33ba9bf" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "cbf47e7e-2f11-5a9b-88db-028d6f3a4fa6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "cc67c658-0c27-5356-b71c-b76ddf11a25a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/44" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "ce18fd93-ddb2-5cb4-8e49-9fd33f164c91" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "d5c8a9a3-aaa0-5c8b-852f-58ae0c99dbad" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/31" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "d9db9ad5-5265-5ab1-b72c-48b411349b28" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/35" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "dafe5096-2042-5dda-8600-0a2f27ec1be6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "dd366feb-3074-5a95-a5ab-b2aff730db09" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/29" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "e04e39e1-e903-5b9a-b9b0-16eac20c46f8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/42" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "e437d5c7-5153-5820-b251-4ede69c0d54e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/36" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "e4717974-a13e-57ee-a004-8ef022aa2934" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "f84b3867-8b6d-5526-b7c7-513eaf3d5dac" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "fb14035e-73fa-5c0e-ae78-f7220dce33e0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "fc5050f9-f7cf-5a47-8495-9b50596df9be" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/33" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "fc97a4cc-f374-54dc-b8fc-2bab6e9be644" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/47" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "endpoint_uuid": { + "uuid": "fd461209-8977-50d4-bbf5-aef775e7445a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/10" + } + ], + "device_id": { + "device_uuid": { + "uuid": "46189420-5879-563c-b5a1-2fc5ff6f8915" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "emu-packet-router", + "name": "R5" + }, + { + "components": [], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "127.0.0.1" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "0" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"endpoints\": [\n{\n\"uuid\": \"1/3\"\n},\n{\n\"uuid\": \"1/4\"\n},\n{\n\"uuid\": \"1/10\"\n},\n{\n\"uuid\": \"2/1\"\n},\n{\n\"uuid\": \"2/2\"\n},\n{\n\"uuid\": \"2/3\"\n},\n{\n\"uuid\": \"2/4\"\n},\n{\n\"uuid\": \"2/5\"\n},\n{\n\"uuid\": \"2/6\"\n},\n{\n\"uuid\": \"2/7\"\n},\n{\n\"uuid\": \"2/8\"\n},\n{\n\"uuid\": \"2/9\"\n},\n{\n\"uuid\": \"2/10\"\n},\n{\n\"uuid\": \"2/11\"\n},\n{\n\"uuid\": \"2/12\"\n},\n{\n\"uuid\": \"2/13\"\n},\n{\n\"uuid\": \"2/14\"\n},\n{\n\"uuid\": \"2/15\"\n},\n{\n\"uuid\": \"2/16\"\n},\n{\n\"uuid\": \"2/17\"\n},\n{\n\"uuid\": \"2/18\"\n},\n{\n\"uuid\": \"2/19\"\n},\n{\n\"uuid\": \"2/20\"\n},\n{\n\"uuid\": \"2/21\"\n},\n{\n\"uuid\": \"2/22\"\n},\n{\n\"uuid\": \"2/23\"\n},\n{\n\"uuid\": \"2/24\"\n},\n{\n\"uuid\": \"2/25\"\n},\n{\n\"uuid\": \"2/26\"\n},\n{\n\"uuid\": \"2/27\"\n},\n{\n\"uuid\": \"2/28\"\n},\n{\n\"uuid\": \"2/29\"\n},\n{\n\"uuid\": \"2/30\"\n},\n{\n\"uuid\": \"2/31\"\n},\n{\n\"uuid\": \"2/32\"\n},\n{\n\"uuid\": \"2/33\"\n},\n{\n\"uuid\": \"2/34\"\n},\n{\n\"uuid\": \"2/35\"\n},\n{\n\"uuid\": \"2/36\"\n},\n{\n\"uuid\": \"2/37\"\n},\n{\n\"uuid\": \"2/38\"\n},\n{\n\"uuid\": \"2/39\"\n},\n{\n\"uuid\": \"2/40\"\n},\n{\n\"uuid\": \"2/41\"\n},\n{\n\"uuid\": \"2/42\"\n},\n{\n\"uuid\": \"2/43\"\n},\n{\n\"uuid\": \"2/44\"\n},\n{\n\"uuid\": \"2/45\"\n},\n{\n\"uuid\": \"2/46\"\n},\n{\n\"uuid\": \"2/47\"\n},\n{\n\"uuid\": \"2/48\"\n},\n{\n\"uuid\": \"2/49\"\n},\n{\n\"uuid\": \"2/50\"\n}\n]\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/3]", + "resource_value": "{\"uuid\": \"1/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/4]", + "resource_value": "{\"uuid\": \"1/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/10]", + "resource_value": "{\"uuid\": \"1/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/1]", + "resource_value": "{\"uuid\": \"2/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/2]", + "resource_value": "{\"uuid\": \"2/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/3]", + "resource_value": "{\"uuid\": \"2/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/4]", + "resource_value": "{\"uuid\": \"2/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/5]", + "resource_value": "{\"uuid\": \"2/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/6]", + "resource_value": "{\"uuid\": \"2/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/7]", + "resource_value": "{\"uuid\": \"2/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/8]", + "resource_value": "{\"uuid\": \"2/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/9]", + "resource_value": "{\"uuid\": \"2/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/10]", + "resource_value": "{\"uuid\": \"2/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/11]", + "resource_value": "{\"uuid\": \"2/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/12]", + "resource_value": "{\"uuid\": \"2/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/13]", + "resource_value": "{\"uuid\": \"2/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/14]", + "resource_value": "{\"uuid\": \"2/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/15]", + "resource_value": "{\"uuid\": \"2/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/16]", + "resource_value": "{\"uuid\": \"2/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/17]", + "resource_value": "{\"uuid\": \"2/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/18]", + "resource_value": "{\"uuid\": \"2/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/19]", + "resource_value": "{\"uuid\": \"2/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/20]", + "resource_value": "{\"uuid\": \"2/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/21]", + "resource_value": "{\"uuid\": \"2/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/22]", + "resource_value": "{\"uuid\": \"2/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/23]", + "resource_value": "{\"uuid\": \"2/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/24]", + "resource_value": "{\"uuid\": \"2/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/25]", + "resource_value": "{\"uuid\": \"2/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/26]", + "resource_value": "{\"uuid\": \"2/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/27]", + "resource_value": "{\"uuid\": \"2/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/28]", + "resource_value": "{\"uuid\": \"2/28\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/29]", + "resource_value": "{\"uuid\": \"2/29\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/30]", + "resource_value": "{\"uuid\": \"2/30\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/31]", + "resource_value": "{\"uuid\": \"2/31\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/32]", + "resource_value": "{\"uuid\": \"2/32\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/33]", + "resource_value": "{\"uuid\": \"2/33\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/34]", + "resource_value": "{\"uuid\": \"2/34\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/35]", + "resource_value": "{\"uuid\": \"2/35\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/36]", + "resource_value": "{\"uuid\": \"2/36\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/37]", + "resource_value": "{\"uuid\": \"2/37\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/38]", + "resource_value": "{\"uuid\": \"2/38\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/39]", + "resource_value": "{\"uuid\": \"2/39\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/40]", + "resource_value": "{\"uuid\": \"2/40\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/41]", + "resource_value": "{\"uuid\": \"2/41\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/42]", + "resource_value": "{\"uuid\": \"2/42\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/43]", + "resource_value": "{\"uuid\": \"2/43\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/44]", + "resource_value": "{\"uuid\": \"2/44\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/45]", + "resource_value": "{\"uuid\": \"2/45\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/46]", + "resource_value": "{\"uuid\": \"2/46\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/47]", + "resource_value": "{\"uuid\": \"2/47\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/48]", + "resource_value": "{\"uuid\": \"2/48\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/49]", + "resource_value": "{\"uuid\": \"2/49\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/50]", + "resource_value": "{\"uuid\": \"2/50\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_UNDEFINED" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "017c24bf-4144-51ad-9a26-1a1356ff3051" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "01e79575-7490-500e-af6c-621d4c4d4e56" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/47" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "022719ab-196f-57f5-9808-70cdcfc85f1c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/43" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "08533354-a239-5471-9061-e641111f0318" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/31" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "105a6647-ac66-5d14-9009-9c3bf6e062ba" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/45" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "148eab23-774b-5394-bcb7-b73a2e2202a9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/39" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "1dafb84a-c35d-5257-b617-565526e04a95" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/44" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "25ec16ef-6742-563e-9353-bb1c0dc4a235" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/42" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "2816feb2-9115-50a7-bb5f-e8fdffd65c84" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/30" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "29879d55-4407-565d-bafe-5c86cba8b1d6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/32" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "2cbfeb47-5806-5574-8f2c-ebc83c1d3e48" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/49" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "3582ed7f-d910-5ce2-8302-063bf4d12a59" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "3599e882-1850-5b38-93f9-6fc623a90d6e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "39cfee0b-7e36-5965-8ab1-715141f09095" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/34" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "3e30088f-33ee-5042-8d12-89224cdf2211" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "40dbc288-d110-5f9c-926f-ed4026498066" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "415057ba-e597-5649-b8ac-a6dd204dcc72" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "43188953-0cc4-51db-a3be-f302344645af" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "486a7e29-b363-5536-9965-a341c8b035a5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "50469087-daec-5483-b0da-acdbd14a2c1b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/38" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "51e5097c-11b7-5640-bcad-00d7e16b3805" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "52bf84a4-ae0d-5b85-b936-11eb08052f43" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "535dc8fb-3667-5cbc-89e9-71131b139f69" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/50" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "584206c7-b3be-5e81-9213-76bd2166ed12" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/29" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "5845a3eb-7b1c-5bf8-a7aa-2bf7b1956e5d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "64937eb6-9b8b-5fae-b766-ea38c8ff548b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "6e096f6a-a56b-5238-8a21-320a3fff5dde" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "74b8d19e-7946-5ae3-96c2-718ce878e9e5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "8500d490-2856-5542-8dee-770603f76c64" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "86ea6a1b-1286-5af8-a844-db6e3e37846d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "887ef483-1321-5df6-8a09-b44f4906bc11" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/33" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "8dfa757f-8599-5183-b943-4abf380c700c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "9028ba88-b887-50e2-8e7c-ec31cce860d9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/46" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "9e1c361c-b6b1-5627-a373-9cc86a61e665" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "a1646fd5-b4f8-5bdb-9694-c2260f952537" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/35" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "aa7c851b-8c56-5ba6-8199-65ebcc98eff4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "ae10c384-7306-5354-b4a0-594d2e1cd814" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "b5da020d-0366-5ea5-8c0e-bff806ae50d1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/48" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "bf55ee38-34e9-5276-8274-6549de6748ef" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "c5b7386c-6ab8-5bd3-806a-19bd358656f9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/41" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "c733f5f0-0c03-57d2-a497-1553dc338050" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/21" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "cc1d9252-30e3-5df6-a53b-4cd09815298e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "d7f623cc-9aba-5dc4-9a47-5faffc8dda4c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "dd61a79f-69c9-50e3-8cf0-492ed796aa1c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "dddd4958-1e72-5471-8ebc-e44319ae5d15" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "df03b81a-a51e-5d45-8455-dc404f20e1a8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "e464f0ed-9c4e-5f6c-9932-d2f1372c8140" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/40" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "e83d3dd2-e5b9-50bb-a4e2-8634bac90500" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "eb892805-a5c3-51eb-9973-41799546412a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/37" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "f04aba18-4b16-53aa-8467-70e6d52ac632" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/28" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "f3747804-fa37-5ee4-8cb7-2cf9daa705ca" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "f4263bd8-52c7-5176-9c1a-148d8ba8f112" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "endpoint_uuid": { + "uuid": "fe6e9303-9941-5959-acec-e263ede31377" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/36" + } + ], + "device_id": { + "device_uuid": { + "uuid": "4c3a1eab-ea04-59f8-82d4-f8fdec0b2e96" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "emu-packet-router", + "name": "R11" + }, + { + "components": [ + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "02d7b07c-7552-5c2d-b6dd-9b1aa07087e1" + }, + "name": "Fan#3", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "07207602-d029-5cc1-83af-4a243166c7bc" + }, + "name": "eth-1/0/12", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "0f9a7a09-eb52-5a70-a2f7-94fff68f4510" + }, + "name": "eth-1/0/3", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "0fb1b102-0ac4-5de3-8e16-117b2f5e12a9" + }, + "name": "Transceiver#9", + "parent": "eth-1/0/9", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"100G/40G Fiber\"" + }, + "component_uuid": { + "uuid": "1343ac3a-c765-5c10-a04c-eb43e4093a46" + }, + "name": "eth-1/0/1", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "145ba61e-7112-5eec-b41c-91978b80d77f" + }, + "name": "eth-1/0/7", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "1cd5416f-a2cd-5615-9ab9-aae1560bf39a" + }, + "name": "Transceiver#3", + "parent": "eth-1/0/3", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "201b08ac-5107-577b-85c9-4cc742ece6ce" + }, + "name": "Transceiver#1", + "parent": "eth-1/0/1", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"100G/40G Fiber\"" + }, + "component_uuid": { + "uuid": "22d12bd5-f2b1-545c-a2a1-58c59defc2e0" + }, + "name": "eth-1/0/26", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "4015a0f7-a90e-53fa-a8e9-e97d58854f24" + }, + "name": "eth-1/0/5", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"QSFP28\"", + "removable": "\"true\"", + "serial-num": "\"BH210809329 \"", + "vendor": "\"PRECISION \"" + }, + "component_uuid": { + "uuid": "40aaac2b-be53-530b-8fb9-4dc4240dad2b" + }, + "name": "Transceiver#27", + "parent": "eth-1/0/27", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "43423068-88f4-5780-9186-a840031a5562" + }, + "name": "Transceiver#20", + "parent": "eth-1/0/20", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "448f2156-8dc4-5fb8-9671-be17c6054b44" + }, + "name": "Transceiver#13", + "parent": "eth-1/0/13", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "50a04d98-5873-5e5a-b725-c41b04c91ea4" + }, + "name": "Fan#4", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "54186200-dac6-57cf-a84c-f2b1ebe4f5fc" + }, + "name": "Transceiver#7", + "parent": "eth-1/0/7", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "5655d66f-a362-57e2-9a9c-ab4bcdb863d5" + }, + "name": "eth-1/0/4", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "5beb5441-c807-59c1-8535-1c2eb4f9cee8" + }, + "name": "Transceiver#12", + "parent": "eth-1/0/12", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "5d3dafdb-43a9-5745-9d9e-b07cea2e719b" + }, + "name": "eth-1/0/13", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "61a96138-48de-56e4-bc8b-355967ca944f" + }, + "name": "Transceiver#10", + "parent": "eth-1/0/10", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"CRXT-T0T12A\"", + "empty": "\"false\"", + "location": "\"Power Supplies tray\"", + "manufacturer-name": "\"CRXT-T0T12A\"", + "removable": "\"true\"", + "serial-num": "\"19430061\"" + }, + "component_uuid": { + "uuid": "677ce193-eabe-5c99-be1d-87e5d8a735bc" + }, + "name": "Power-Supply#1", + "parent": "chassis", + "type": "POWER_SUPPLY" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"F1930015671 \"", + "vendor": "\"FS \"" + }, + "component_uuid": { + "uuid": "6838ea30-544e-5188-af7e-7a21e4bc4012" + }, + "name": "Transceiver#19", + "parent": "eth-1/0/19", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "728c024d-336b-5657-b0aa-6968704c534a" + }, + "name": "Transceiver#25", + "parent": "eth-1/0/25", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "75b6bf48-155c-5b2d-b94c-3a022d2ee7b3" + }, + "name": "eth-1/0/16", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "7bcb17de-7b39-53c2-a383-8ff2508c194e" + }, + "name": "Transceiver#21", + "parent": "eth-1/0/21", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "7fbe001d-9cd5-55cf-9b2d-1e2198c4d8e1" + }, + "name": "Transceiver#5", + "parent": "eth-1/0/5", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "810184e8-051d-5366-bb5c-ebed97590fb4" + }, + "name": "Transceiver#11", + "parent": "eth-1/0/11", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "81e12350-5582-5d28-8f89-8bec87ddfcf5" + }, + "name": "eth-1/0/21", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "8214b7cb-bbc3-5b69-805d-ed35128f796f" + }, + "name": "eth-1/0/6", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "8452da86-83c6-5f59-942b-0d59a08e60b8" + }, + "name": "eth-1/0/17", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "8669c5b6-c6a4-526f-bed1-9c0d24146739" + }, + "name": "eth-1/0/10", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "8a37750c-b5ef-510b-80cd-f4eb7d938b8c" + }, + "name": "eth-1/0/2", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "8db38f44-4e57-5621-9801-b7683b19ff56" + }, + "name": "Fan#5", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "8ec6edce-4522-597d-88c8-37697cb154fe" + }, + "name": "Transceiver#15", + "parent": "eth-1/0/15", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "8f802e29-1885-55d2-9122-9a1fffc3ec46" + }, + "name": "Transceiver#8", + "parent": "eth-1/0/8", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "90248895-6cdf-55cc-ba47-07208aec7561" + }, + "name": "eth-1/0/11", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"false\"", + "location": "\"Power Supplies tray\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "93c9b45e-7574-5fb6-b0b1-6574f823b46a" + }, + "name": "Power-Supply#2", + "parent": "chassis", + "type": "POWER_SUPPLY" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "946ea635-16d3-531e-ac0a-0f70f0d38e08" + }, + "name": "eth-1/0/20", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "96874de4-51d9-5c68-9700-042d4263cdd8" + }, + "name": "Transceiver#6", + "parent": "eth-1/0/6", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "99258fb4-22e3-5516-bc2e-c1f50f238d31" + }, + "name": "Transceiver#23", + "parent": "eth-1/0/23", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "a0166f5f-7f55-5880-9231-48624cda031c" + }, + "name": "Transceiver#17", + "parent": "eth-1/0/17", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "a52bac7b-0b70-5a5b-9066-99ed66e09cbb" + }, + "name": "eth-1/0/22", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "a67341ee-0313-58aa-b416-7d698d3877be" + }, + "name": "eth-1/0/15", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "a8b55643-e432-5a14-b34b-9f0824d1ae66" + }, + "name": "Transceiver#14", + "parent": "eth-1/0/14", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "ab710745-3989-5e4d-8b70-7048bd437d0e" + }, + "name": "eth-1/0/18", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"QSFP28\"", + "removable": "\"true\"", + "serial-num": "\"VE214710233 \"", + "vendor": "\"Arista Networks\"" + }, + "component_uuid": { + "uuid": "ab9c4611-0ad8-5f9a-8848-c97a8829e693" + }, + "name": "Transceiver#26", + "parent": "eth-1/0/26", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "b0451047-ff08-5bc6-8bc8-bf21b0d70049" + }, + "name": "Transceiver#2", + "parent": "eth-1/0/2", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "b3cdb834-c93e-5029-9dd6-21cb3696c84c" + }, + "name": "eth-1/0/24", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "b3ed689a-f997-59d6-9b3d-aff511a0e253" + }, + "name": "eth-1/0/14", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "b606eb8f-079e-5039-936f-e1fa8c8bbc22" + }, + "name": "Transceiver#24", + "parent": "eth-1/0/24", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "ba77d752-b621-598b-91e3-c80c13109fb8" + }, + "name": "Transceiver#18", + "parent": "eth-1/0/18", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "c28279e3-4dae-5af8-b8be-99ccc1cda2f1" + }, + "name": "eth-1/0/23", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "c2d9a8ff-a854-50d8-8550-dc1f60ef9261" + }, + "name": "eth-1/0/8", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "c9756d8f-a333-528e-99f5-fa8bbb73301d" + }, + "name": "Transceiver#16", + "parent": "eth-1/0/16", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "ce8079db-7521-592f-95bc-459a05b95483" + }, + "name": "eth-1/0/25", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"100G/40G Fiber\"" + }, + "component_uuid": { + "uuid": "d470e8ce-f044-54f6-9dd8-05fad9bc0b34" + }, + "name": "eth-1/0/27", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "d4c56b9d-d131-55c5-8536-1aece8087ffb" + }, + "name": "eth-1/0/9", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "d637794b-b553-59b9-9d85-115d151e94e7" + }, + "name": "Fan#2", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "e2cd6e88-e40c-5f39-91f0-646fdb3f14fb" + }, + "name": "eth-1/0/19", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "eae9dff7-3885-5640-8348-c91ce05543c6" + }, + "name": "Transceiver#4", + "parent": "eth-1/0/4", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "f1568cd5-a694-57a5-b233-8d21f11fb5bc" + }, + "name": "Transceiver#22", + "parent": "eth-1/0/22", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"DRX-30\"", + "empty": "\"false\"", + "hardware-rev": "\"R0D\"", + "manufacturer-name": "\"DRX-30\"", + "mfg-date": "\"2020-01-09\"", + "removable": "\"false\"", + "serial-num": "\"731527XB1952198\"", + "software-rev": "\"21.5.1 (9799)\"" + }, + "component_uuid": { + "uuid": "f53bf8e4-17f2-5dbb-8247-5f42c97340bb" + }, + "name": "chassis", + "parent": "chassis", + "type": "CHASSIS" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "f8acb54f-f88a-59d0-9a59-f3460f19c706" + }, + "name": "Fan#1", + "parent": "chassis", + "type": "FAN" + } + ], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "10.95.90.126" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "830" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"allow_agent\": false,\n\"commit_per_rule\": true,\n\"device_params\": {\n\"name\": \"huaweiyang\"\n},\n\"force_running\": false,\n\"hostkey_verify\": false,\n\"look_for_keys\": false,\n\"manager_params\": {\n\"timeout\": 120\n},\n\"message_renderer\": \"pyangbind\",\n\"password\": \"admin\",\n\"username\": \"admin\",\n\"vendor\": \"ADVA\"\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/chassis", + "resource_value": "{\"attributes\": {\"description\": \"DRX-30\", \"empty\": \"false\", \"hardware-rev\": \"R0D\", \"manufacturer-name\": \"DRX-30\", \"mfg-date\": \"2020-01-09\", \"removable\": \"false\", \"serial-num\": \"731527XB1952198\", \"software-rev\": \"21.5.1 (9799)\"}, \"class\": \"CHASSIS\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"chassis\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#1", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#1\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#2", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#2\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#3", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#3\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#4", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#4\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#5", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#5\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Power-Supply#1", + "resource_value": "{\"attributes\": {\"description\": \"CRXT-T0T12A\", \"empty\": \"false\", \"location\": \"Power Supplies tray\", \"manufacturer-name\": \"CRXT-T0T12A\", \"removable\": \"true\", \"serial-num\": \"19430061\"}, \"class\": \"POWER_SUPPLY\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Power-Supply#1\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Power-Supply#2", + "resource_value": "{\"attributes\": {\"empty\": \"false\", \"location\": \"Power Supplies tray\", \"removable\": \"true\"}, \"class\": \"POWER_SUPPLY\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Power-Supply#2\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/1", + "resource_value": "{\"attributes\": {\"description\": \"100G/40G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\"], \"name\": \"eth-1/0/1\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#1", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [3, \"PORT\"], \"name\": \"Transceiver#1\", \"parent-component-references\": \"eth-1/0/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/2", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/2\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#2", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [4, \"PORT\"], \"name\": \"Transceiver#2\", \"parent-component-references\": \"eth-1/0/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/3", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/3\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#3", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [5, \"PORT\"], \"name\": \"Transceiver#3\", \"parent-component-references\": \"eth-1/0/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/4", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/4\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#4", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [6, \"PORT\"], \"name\": \"Transceiver#4\", \"parent-component-references\": \"eth-1/0/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/5", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/5\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#5", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [7, \"PORT\"], \"name\": \"Transceiver#5\", \"parent-component-references\": \"eth-1/0/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/6", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/6\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#6", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [8, \"PORT\"], \"name\": \"Transceiver#6\", \"parent-component-references\": \"eth-1/0/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/7", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/7\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#7", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [9, \"PORT\"], \"name\": \"Transceiver#7\", \"parent-component-references\": \"eth-1/0/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/8", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/8\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#8", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [10, \"PORT\"], \"name\": \"Transceiver#8\", \"parent-component-references\": \"eth-1/0/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/9", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/9\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#9", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [11, \"PORT\"], \"name\": \"Transceiver#9\", \"parent-component-references\": \"eth-1/0/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/10", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/10\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#10", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [12, \"PORT\"], \"name\": \"Transceiver#10\", \"parent-component-references\": \"eth-1/0/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/11", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/11\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#11", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [13, \"PORT\"], \"name\": \"Transceiver#11\", \"parent-component-references\": \"eth-1/0/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/12", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/12\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#12", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [14, \"PORT\"], \"name\": \"Transceiver#12\", \"parent-component-references\": \"eth-1/0/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/13", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/13\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#13", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [15, \"PORT\"], \"name\": \"Transceiver#13\", \"parent-component-references\": \"eth-1/0/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/14", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/14\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#14", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [16, \"PORT\"], \"name\": \"Transceiver#14\", \"parent-component-references\": \"eth-1/0/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/15", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/15\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#15", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [17, \"PORT\"], \"name\": \"Transceiver#15\", \"parent-component-references\": \"eth-1/0/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/16", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/16\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#16", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [18, \"PORT\"], \"name\": \"Transceiver#16\", \"parent-component-references\": \"eth-1/0/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/17", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/17\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#17", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [19, \"PORT\"], \"name\": \"Transceiver#17\", \"parent-component-references\": \"eth-1/0/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/18", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/18\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#18", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [20, \"PORT\"], \"name\": \"Transceiver#18\", \"parent-component-references\": \"eth-1/0/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/19", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/19\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#19", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"F1930015671 \", \"vendor\": \"FS \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [21, \"PORT\"], \"name\": \"Transceiver#19\", \"parent-component-references\": \"eth-1/0/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/20", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/20\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#20", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [22, \"PORT\"], \"name\": \"Transceiver#20\", \"parent-component-references\": \"eth-1/0/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/21", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/21\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#21", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [23, \"PORT\"], \"name\": \"Transceiver#21\", \"parent-component-references\": \"eth-1/0/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/22", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/22\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#22", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [24, \"PORT\"], \"name\": \"Transceiver#22\", \"parent-component-references\": \"eth-1/0/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/23", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/23\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#23", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [25, \"PORT\"], \"name\": \"Transceiver#23\", \"parent-component-references\": \"eth-1/0/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/24", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/24\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#24", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [26, \"PORT\"], \"name\": \"Transceiver#24\", \"parent-component-references\": \"eth-1/0/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/25", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/25\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#25", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [27, \"PORT\"], \"name\": \"Transceiver#25\", \"parent-component-references\": \"eth-1/0/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/26", + "resource_value": "{\"attributes\": {\"description\": \"100G/40G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/26\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#26", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"QSFP28\", \"removable\": \"true\", \"serial-num\": \"VE214710233 \", \"vendor\": \"Arista Networks\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [28, \"PORT\"], \"name\": \"Transceiver#26\", \"parent-component-references\": \"eth-1/0/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/27", + "resource_value": "{\"attributes\": {\"description\": \"100G/40G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/27\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#27", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"QSFP28\", \"removable\": \"true\", \"serial-num\": \"BH210809329 \", \"vendor\": \"PRECISION \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [29, \"PORT\"], \"name\": \"Transceiver#27\", \"parent-component-references\": \"eth-1/0/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/1]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/1']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/1']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/1']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/1']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/2]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/2']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/2']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/2']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/2']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/3]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/3']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/3']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/3']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/3']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/4]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/4']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/4']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/4']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/4']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/5]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/5']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/5']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/5']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/5']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/6]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/6']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/6']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/6']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/6']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/7]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/7']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/7']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/7']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/7']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/8]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/8']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/8']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/8']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/8']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/9]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/9']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/9']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/9']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/9']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/10]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/10']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/10']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/10']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/10']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/11]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/11']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/11']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/11']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/11']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/12]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/12']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/12']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/12']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/12']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/13]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/13']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/13']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/13']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/13']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/14]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/14']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/14']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/14']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/14']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/15]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/15']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/15']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/15']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/15']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/16]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/16']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/16']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/16']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/16']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/17]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/17']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/17']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/17']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/17']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/18]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/18']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/18']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/18']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/18']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/19]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/19']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/19']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/19']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/19']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/20]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/20']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/20']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/20']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/20']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/21]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/21']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/21']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/21']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/21']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/22]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/22']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/22']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/22']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/22']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/23]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/23']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/23']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/23']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/23']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/24]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/24']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/24']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/24']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/24']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/25]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/25']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/25']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/25']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/25']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/26]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/26']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/26']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/26']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/26']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/27]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/27']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/27']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/27']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/27']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/1]", + "resource_value": "{\"description\": \"testing\", \"name\": \"eth-1/0/1\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/2]", + "resource_value": "{\"name\": \"eth-1/0/2\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/3]", + "resource_value": "{\"name\": \"eth-1/0/3\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/4]", + "resource_value": "{\"name\": \"eth-1/0/4\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/5]", + "resource_value": "{\"description\": \"\\\"Conexion con Spirent\\\"\", \"name\": \"eth-1/0/5\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/6]", + "resource_value": "{\"name\": \"eth-1/0/6\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/7]", + "resource_value": "{\"name\": \"eth-1/0/7\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/8]", + "resource_value": "{\"name\": \"eth-1/0/8\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/9]", + "resource_value": "{\"description\": \"\\\"Conexion con AGS_20-1\\\"\", \"name\": \"eth-1/0/9\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/10]", + "resource_value": "{\"description\": \"\\\"Conexion con HL3-1-2\\\"\", \"name\": \"eth-1/0/10\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/11]", + "resource_value": "{\"name\": \"eth-1/0/11\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/12]", + "resource_value": "{\"name\": \"eth-1/0/12\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/13]", + "resource_value": "{\"name\": \"eth-1/0/13\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/14]", + "resource_value": "{\"name\": \"eth-1/0/14\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/15]", + "resource_value": "{\"name\": \"eth-1/0/15\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/16]", + "resource_value": "{\"name\": \"eth-1/0/16\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/17]", + "resource_value": "{\"name\": \"eth-1/0/17\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/18]", + "resource_value": "{\"name\": \"eth-1/0/18\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/19]", + "resource_value": "{\"description\": \"\\\"Conexion con HL5-4-1\\\"\", \"name\": \"eth-1/0/19\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/20]", + "resource_value": "{\"description\": \"\\\"Conexion con HL5-2-2\\\"\", \"name\": \"eth-1/0/20\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/21]", + "resource_value": "{\"name\": \"eth-1/0/21\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/22]", + "resource_value": "{\"description\": \"\\\"TeraFlow\\\"\", \"name\": \"eth-1/0/22\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/23]", + "resource_value": "{\"name\": \"eth-1/0/23\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/24]", + "resource_value": "{\"description\": \"\\\"TeraFlow\\\"\", \"name\": \"eth-1/0/24\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/25]", + "resource_value": "{\"description\": \"\\\"TeraFlow\\\"\", \"name\": \"eth-1/0/25\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/26]", + "resource_value": "{\"name\": \"eth-1/0/26\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/27]", + "resource_value": "{\"mtu\": 1500, \"name\": \"eth-1/0/27\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth0]/subinterface[0]", + "resource_value": "{\"address_ip\": \"10.95.90.126\", \"address_prefix\": 24, \"index\": 0, \"name\": \"eth0\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth0]", + "resource_value": "{\"name\": \"eth0\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[dummy1]/subinterface[0]", + "resource_value": "{\"address_ip\": \"5.5.5.1\", \"address_prefix\": 32, \"index\": 0, \"name\": \"dummy1\", \"type\": \"softwareLoopback\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[dummy1]", + "resource_value": "{\"name\": \"dummy1\", \"type\": \"softwareLoopback\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/5.1]/subinterface[0]", + "resource_value": "{\"address_ip\": \"192.85.1.1\", \"address_prefix\": 30, \"index\": 0, \"name\": \"eth-1/0/5.1\", \"type\": \"l3ipvlan\", \"vlan_id\": 666}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/5.1]", + "resource_value": "{\"name\": \"eth-1/0/5.1\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/9.33]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.3.1\", \"address_prefix\": 24, \"index\": 0, \"mtu\": \"3000\", \"name\": \"eth-1/0/9.33\", \"type\": \"l3ipvlan\", \"vlan_id\": 33}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/9.33]", + "resource_value": "{\"mtu\": 3000, \"name\": \"eth-1/0/9.33\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/10.41]/subinterface[0]", + "resource_value": "{\"address_ip\": \"99.4.41.5\", \"address_ipv6\": \"2001::99:4:41:5\", \"address_prefix\": 24, \"address_prefix_v6\": 112, \"index\": 0, \"name\": \"eth-1/0/10.41\", \"type\": \"l3ipvlan\", \"vlan_id\": 41}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/10.41]", + "resource_value": "{\"description\": \"\\\"Conexion con HL3-1-2\\\"\", \"name\": \"eth-1/0/10.41\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/19.55]/subinterface[0]", + "resource_value": "{\"address_ip\": \"99.5.19.2\", \"address_ipv6\": \"2001::99:5:19:2\", \"address_prefix\": 24, \"address_prefix_v6\": 112, \"index\": 0, \"name\": \"eth-1/0/19.55\", \"type\": \"l3ipvlan\", \"vlan_id\": 19}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/19.55]", + "resource_value": "{\"description\": \"\\\"Conexion con HL5-4-1\\\"\", \"name\": \"eth-1/0/19.55\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/22.111]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.2.1\", \"address_prefix\": 24, \"index\": 0, \"mtu\": \"3000\", \"name\": \"eth-1/0/22.111\", \"type\": \"l3ipvlan\", \"vlan_id\": 111}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/22.111]", + "resource_value": "{\"mtu\": 3000, \"name\": \"eth-1/0/22.111\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/25.55]/subinterface[0]", + "resource_value": "{\"address_ip\": \"99.5.55.1\", \"address_ipv6\": \"2001::99:5:55:1\", \"address_prefix\": 24, \"address_prefix_v6\": 112, \"index\": 0, \"name\": \"eth-1/0/25.55\", \"type\": \"l3ipvlan\", \"vlan_id\": 55}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/25.55]", + "resource_value": "{\"description\": \"\\\"Conexion con HL5-2-2\\\"\", \"name\": \"eth-1/0/25.55\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/26.357]/subinterface[0]", + "resource_value": "{\"address_ip\": \"5.3.3.1\", \"address_prefix\": 24, \"index\": 0, \"name\": \"eth-1/0/26.357\", \"type\": \"l3ipvlan\", \"vlan_id\": 357}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/26.357]", + "resource_value": "{\"description\": \"Pruebas energia\", \"name\": \"eth-1/0/26.357\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/27.246]/subinterface[0]", + "resource_value": "{\"address_ip\": \"4.3.2.3\", \"address_prefix\": 24, \"index\": 0, \"name\": \"eth-1/0/27.246\", \"type\": \"l3ipvlan\", \"vlan_id\": 246}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/27.246]", + "resource_value": "{\"description\": \"Pruebas energia\", \"name\": \"eth-1/0/27.246\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/23.996]/subinterface[0]", + "resource_value": "{\"index\": 0, \"name\": \"eth-1/0/23.996\", \"type\": \"l2vlan\", \"vlan_id\": 996}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/23.996]", + "resource_value": "{\"name\": \"eth-1/0/23.996\", \"type\": \"l2vlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/20.534]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.131.202\", \"address_prefix\": 16, \"index\": 0, \"mtu\": \"1450\", \"name\": \"eth-1/0/20.534\", \"type\": \"l3ipvlan\", \"vlan_id\": 534}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/20.534]", + "resource_value": "{\"mtu\": 1450, \"name\": \"eth-1/0/20.534\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/3.1]/subinterface[0]", + "resource_value": "{\"index\": 0, \"name\": \"eth-1/0/3.1\", \"type\": \"l3ipvlan\", \"vlan_id\": 101}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/3.1]", + "resource_value": "{\"description\": \"test A1_2\", \"name\": \"eth-1/0/3.1\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/15.456]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.61.49\", \"address_prefix\": 30, \"index\": 0, \"name\": \"eth-1/0/15.456\", \"type\": \"l3ipvlan\", \"vlan_id\": 456}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/15.456]", + "resource_value": "{\"description\": \"subinterface_description\", \"name\": \"eth-1/0/15.456\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/16.476]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.65.49\", \"address_prefix\": 30, \"index\": 0, \"name\": \"eth-1/0/16.476\", \"type\": \"l3ipvlan\", \"vlan_id\": 476}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/16.476]", + "resource_value": "{\"description\": \"subinterface_description\", \"name\": \"eth-1/0/16.476\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/15.656]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.61.49\", \"address_prefix\": 30, \"index\": 0, \"name\": \"eth-1/0/15.656\", \"type\": \"l3ipvlan\", \"vlan_id\": 656}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/15.656]", + "resource_value": "{\"description\": \"subinterface_description\", \"name\": \"eth-1/0/15.656\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/16.676]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.65.49\", \"address_prefix\": 30, \"index\": 0, \"name\": \"eth-1/0/16.676\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/16.676]", + "resource_value": "{\"description\": \"subinterface_description\", \"name\": \"eth-1/0/16.676\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[srv_ACLr]", + "resource_value": "{\"policy_name\": \"srv_ACLr\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[srv_ACL]", + "resource_value": "{\"policy_name\": \"srv_ACL\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[import_export_1_import_policy]", + "resource_value": "{\"policy_name\": \"import_export_1_import_policy\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[import_export_1_export_policy]", + "resource_value": "{\"policy_name\": \"import_export_1_export_policy\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_srv_ACLr]", + "resource_value": "{\"ext_community_set_name\": \"set_srv_ACLr\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_srv_ACLr][65000:533]", + "resource_value": "{\"ext_community_member\": \"65000:533\", \"ext_community_set_name\": \"set_srv_ACLr\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_srv_ACL]", + "resource_value": "{\"ext_community_set_name\": \"set_srv_ACL\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_srv_ACL][65000:533]", + "resource_value": "{\"ext_community_member\": \"65000:533\", \"ext_community_set_name\": \"set_srv_ACL\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_import_export_1_import_policy]", + "resource_value": "{\"ext_community_set_name\": \"set_import_export_1_import_policy\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_import_export_1_import_policy][65001:301]", + "resource_value": "{\"ext_community_member\": \"65001:301\", \"ext_community_set_name\": \"set_import_export_1_import_policy\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_import_export_1_export_policy]", + "resource_value": "{\"ext_community_set_name\": \"set_import_export_1_export_policy\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_import_export_1_export_policy][65001:301]", + "resource_value": "{\"ext_community_member\": \"65001:301\", \"ext_community_set_name\": \"set_import_export_1_export_policy\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]", + "resource_value": "{\"name\": \"default\", \"router_id\": \"5.5.5.1\", \"type\": \"DEFAULT_INSTANCE\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[OSPF]", + "resource_value": "{\"identifier\": \"OSPF\", \"name\": \"default\", \"protocol_name\": \"OSPF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[ISIS]", + "resource_value": "{\"identifier\": \"ISIS\", \"name\": \"default\", \"protocol_name\": \"ISIS\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[BGP]", + "resource_value": "{\"as\": 65001, \"identifier\": \"BGP\", \"name\": \"default\", \"protocol_name\": \"BGP\", \"router_id\": \"5.5.5.1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[DIRECTLY_CONNECTED]", + "resource_value": "{\"identifier\": \"DIRECTLY_CONNECTED\", \"name\": \"default\", \"protocol_name\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[STATIC]", + "resource_value": "{\"identifier\": \"STATIC\", \"name\": \"default\", \"protocol_name\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/table_connections[DIRECTLY_CONNECTED][BGP][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"BGP\", \"name\": \"default\", \"src_protocol\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/table_connections[DIRECTLY_CONNECTED][ISIS][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"ISIS\", \"name\": \"default\", \"src_protocol\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[ELAN-AC:996]", + "resource_value": "{\"name\": \"ELAN-AC:996\", \"type\": \"L2VSI\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]", + "resource_value": "{\"name\": \"5603d4487d23\", \"route_distinguisher\": \"65000:101\", \"type\": \"L3VRF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/protocols[BGP]", + "resource_value": "{\"as\": 65000, \"identifier\": \"BGP\", \"name\": \"5603d4487d23\", \"protocol_name\": \"BGP\", \"router_id\": \"5.5.5.1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/protocols[DIRECTLY_CONNECTED]", + "resource_value": "{\"identifier\": \"DIRECTLY_CONNECTED\", \"name\": \"5603d4487d23\", \"protocol_name\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/protocols[STATIC]", + "resource_value": "{\"identifier\": \"STATIC\", \"name\": \"5603d4487d23\", \"protocol_name\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/table_connections[DIRECTLY_CONNECTED][BGP][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"BGP\", \"name\": \"5603d4487d23\", \"src_protocol\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/table_connections[STATIC][BGP][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"BGP\", \"name\": \"5603d4487d23\", \"src_protocol\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/inter_instance_policies[srv_ACLr]", + "resource_value": "{\"import_policy\": \"srv_ACLr\", \"name\": \"5603d4487d23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/inter_instance_policies[srv_ACL]", + "resource_value": "{\"export_policy\": \"srv_ACL\", \"name\": \"5603d4487d23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[Movistar_4G_1]", + "resource_value": "{\"name\": \"Movistar_4G_1\", \"route_distinguisher\": \"65001:1\", \"type\": \"L3VRF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[Movistar_4G_1]/protocols[BGP]", + "resource_value": "{\"as\": 65000, \"identifier\": \"BGP\", \"name\": \"Movistar_4G_1\", \"protocol_name\": \"BGP\", \"router_id\": \"10.95.85.155\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[Movistar_4G_1]/inter_instance_policies[import_export_1_import_policy]", + "resource_value": "{\"import_policy\": \"import_export_1_import_policy\", \"name\": \"Movistar_4G_1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[Movistar_4G_1]/inter_instance_policies[import_export_1_export_policy]", + "resource_value": "{\"export_policy\": \"import_export_1_export_policy\", \"name\": \"Movistar_4G_1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[TestOscarVPN]", + "resource_value": "{\"name\": \"TestOscarVPN\", \"route_distinguisher\": \"65000:934\", \"type\": \"L3VRF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[TestOscarVPN]/protocols[BGP]", + "resource_value": "{\"as\": 65000, \"identifier\": \"BGP\", \"name\": \"TestOscarVPN\", \"protocol_name\": \"BGP\", \"router_id\": \"5.5.5.1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[cisco_test_4_adva]", + "resource_value": "{\"name\": \"cisco_test_4_adva\", \"route_distinguisher\": \"65001:573\", \"type\": \"L3VRF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[cisco_test_4_adva]/protocols[BGP]", + "resource_value": "{\"as\": 65001, \"identifier\": \"BGP\", \"name\": \"cisco_test_4_adva\", \"protocol_name\": \"BGP\", \"router_id\": \"10.226.0.20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[cisco_test_5_adva]", + "resource_value": "{\"name\": \"cisco_test_5_adva\", \"route_distinguisher\": \"65001:673\", \"type\": \"L3VRF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[cisco_test_5_adva]/protocols[BGP]", + "resource_value": "{\"as\": 65001, \"identifier\": \"BGP\", \"name\": \"cisco_test_5_adva\", \"protocol_name\": \"BGP\", \"router_id\": \"10.226.0.20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[cisco_test_6_adva]", + "resource_value": "{\"name\": \"cisco_test_6_adva\", \"route_distinguisher\": \"65001:873\", \"type\": \"L3VRF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[cisco_test_6_adva]/protocols[BGP]", + "resource_value": "{\"as\": 65001, \"identifier\": \"BGP\", \"name\": \"cisco_test_6_adva\", \"protocol_name\": \"BGP\", \"router_id\": \"10.226.0.20\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_OPENCONFIG" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "06203096-d1a2-5042-94a9-3a45fce6fad0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "11956a34-12a2-5ea3-838b-d8a42eb23f4a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "11e2e022-baa3-5543-83a4-6e08670cb18f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "12462dbb-5500-5c72-aeba-f4b9ed747620" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "14a10230-b666-55bf-b699-6f7e13f3589c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "26b07b0a-1824-5fa2-997c-6f32a27bf806" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "3652e1aa-05fd-5fae-90fd-091066b3c50c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "36b3fc08-090a-53b3-855d-754b3bd5a135" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "3c641d5e-214a-5a55-a074-5318ba72fe8b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "41c07daf-e299-53f4-81c8-4d2b3b34ef8b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/21" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "428db709-3740-5c0c-8d2c-5e7b8bb17e44" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "61795f8e-5bbb-589b-9f36-546d2216dbc2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "6a1e223f-39aa-5285-9c1a-e8eee55ea8ee" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "77905600-b1dc-5920-9d8a-d2aaed83a1b1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "7a24fce6-5ef0-56d8-b301-c2afa8dd4437" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "7e7c4419-3c33-574d-83ff-9dff2efe106f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "91c0d600-96ce-5c15-a203-2c9f7977a84f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "9e9d1423-c2af-545b-b3c8-b331eae0be3f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "a3f73568-69a4-5f3f-8093-77817d788ecd" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "b714b328-0141-5dc3-ae91-6da1cd1b5546" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "ca47b664-63c9-5ec0-952d-581720dffaee" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "d2177bf3-2ff4-5473-b5ff-e70038d0c0af" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "d5a1219d-e053-528a-8566-58b13e8f42b0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "dd3f7f32-afed-5f73-98ba-dd807abab1ea" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "e71e6809-dd43-5c1b-8cc8-cc9aba0b558b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "f8912999-562e-56a8-8d57-b8adb68f34bc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "endpoint_uuid": { + "uuid": "fbc2518c-71bd-55c4-9e73-d1a53eaeb9bc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/5" + } + ], + "device_id": { + "device_uuid": { + "uuid": "50f6fe52-9cbd-5e7b-b4ad-082a264c4452" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "packet-router", + "name": "R155" + }, + { + "components": [], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "127.0.0.1" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "0" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"endpoints\": [\n{\n\"uuid\": \"1/13\"\n},\n{\n\"uuid\": \"1/8\"\n},\n{\n\"uuid\": \"2/1\"\n},\n{\n\"uuid\": \"2/2\"\n},\n{\n\"uuid\": \"2/3\"\n},\n{\n\"uuid\": \"2/4\"\n},\n{\n\"uuid\": \"2/5\"\n},\n{\n\"uuid\": \"2/6\"\n},\n{\n\"uuid\": \"2/7\"\n},\n{\n\"uuid\": \"2/8\"\n},\n{\n\"uuid\": \"2/9\"\n},\n{\n\"uuid\": \"2/10\"\n},\n{\n\"uuid\": \"2/11\"\n},\n{\n\"uuid\": \"2/12\"\n},\n{\n\"uuid\": \"2/13\"\n},\n{\n\"uuid\": \"2/14\"\n},\n{\n\"uuid\": \"2/15\"\n},\n{\n\"uuid\": \"2/16\"\n},\n{\n\"uuid\": \"2/17\"\n},\n{\n\"uuid\": \"2/18\"\n},\n{\n\"uuid\": \"2/19\"\n},\n{\n\"uuid\": \"2/20\"\n},\n{\n\"uuid\": \"2/21\"\n},\n{\n\"uuid\": \"2/22\"\n},\n{\n\"uuid\": \"2/23\"\n},\n{\n\"uuid\": \"2/24\"\n},\n{\n\"uuid\": \"2/25\"\n},\n{\n\"uuid\": \"2/26\"\n},\n{\n\"uuid\": \"2/27\"\n},\n{\n\"uuid\": \"2/28\"\n},\n{\n\"uuid\": \"2/29\"\n},\n{\n\"uuid\": \"2/30\"\n},\n{\n\"uuid\": \"2/31\"\n},\n{\n\"uuid\": \"2/32\"\n},\n{\n\"uuid\": \"2/33\"\n},\n{\n\"uuid\": \"2/34\"\n},\n{\n\"uuid\": \"2/35\"\n},\n{\n\"uuid\": \"2/36\"\n},\n{\n\"uuid\": \"2/37\"\n},\n{\n\"uuid\": \"2/38\"\n},\n{\n\"uuid\": \"2/39\"\n},\n{\n\"uuid\": \"2/40\"\n},\n{\n\"uuid\": \"2/41\"\n},\n{\n\"uuid\": \"2/42\"\n},\n{\n\"uuid\": \"2/43\"\n},\n{\n\"uuid\": \"2/44\"\n},\n{\n\"uuid\": \"2/45\"\n},\n{\n\"uuid\": \"2/46\"\n},\n{\n\"uuid\": \"2/47\"\n},\n{\n\"uuid\": \"2/48\"\n},\n{\n\"uuid\": \"2/49\"\n},\n{\n\"uuid\": \"2/50\"\n}\n]\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/13]", + "resource_value": "{\"uuid\": \"1/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/8]", + "resource_value": "{\"uuid\": \"1/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/1]", + "resource_value": "{\"uuid\": \"2/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/2]", + "resource_value": "{\"uuid\": \"2/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/3]", + "resource_value": "{\"uuid\": \"2/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/4]", + "resource_value": "{\"uuid\": \"2/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/5]", + "resource_value": "{\"uuid\": \"2/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/6]", + "resource_value": "{\"uuid\": \"2/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/7]", + "resource_value": "{\"uuid\": \"2/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/8]", + "resource_value": "{\"uuid\": \"2/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/9]", + "resource_value": "{\"uuid\": \"2/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/10]", + "resource_value": "{\"uuid\": \"2/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/11]", + "resource_value": "{\"uuid\": \"2/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/12]", + "resource_value": "{\"uuid\": \"2/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/13]", + "resource_value": "{\"uuid\": \"2/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/14]", + "resource_value": "{\"uuid\": \"2/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/15]", + "resource_value": "{\"uuid\": \"2/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/16]", + "resource_value": "{\"uuid\": \"2/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/17]", + "resource_value": "{\"uuid\": \"2/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/18]", + "resource_value": "{\"uuid\": \"2/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/19]", + "resource_value": "{\"uuid\": \"2/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/20]", + "resource_value": "{\"uuid\": \"2/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/21]", + "resource_value": "{\"uuid\": \"2/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/22]", + "resource_value": "{\"uuid\": \"2/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/23]", + "resource_value": "{\"uuid\": \"2/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/24]", + "resource_value": "{\"uuid\": \"2/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/25]", + "resource_value": "{\"uuid\": \"2/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/26]", + "resource_value": "{\"uuid\": \"2/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/27]", + "resource_value": "{\"uuid\": \"2/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/28]", + "resource_value": "{\"uuid\": \"2/28\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/29]", + "resource_value": "{\"uuid\": \"2/29\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/30]", + "resource_value": "{\"uuid\": \"2/30\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/31]", + "resource_value": "{\"uuid\": \"2/31\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/32]", + "resource_value": "{\"uuid\": \"2/32\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/33]", + "resource_value": "{\"uuid\": \"2/33\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/34]", + "resource_value": "{\"uuid\": \"2/34\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/35]", + "resource_value": "{\"uuid\": \"2/35\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/36]", + "resource_value": "{\"uuid\": \"2/36\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/37]", + "resource_value": "{\"uuid\": \"2/37\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/38]", + "resource_value": "{\"uuid\": \"2/38\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/39]", + "resource_value": "{\"uuid\": \"2/39\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/40]", + "resource_value": "{\"uuid\": \"2/40\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/41]", + "resource_value": "{\"uuid\": \"2/41\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/42]", + "resource_value": "{\"uuid\": \"2/42\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/43]", + "resource_value": "{\"uuid\": \"2/43\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/44]", + "resource_value": "{\"uuid\": \"2/44\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/45]", + "resource_value": "{\"uuid\": \"2/45\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/46]", + "resource_value": "{\"uuid\": \"2/46\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/47]", + "resource_value": "{\"uuid\": \"2/47\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/48]", + "resource_value": "{\"uuid\": \"2/48\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/49]", + "resource_value": "{\"uuid\": \"2/49\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/50]", + "resource_value": "{\"uuid\": \"2/50\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[ELAN-AC:000]", + "resource_value": "{\"name\": \"ELAN-AC:000\", \"type\": \"L2VSI\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[1/13.000]/subinterface[0]", + "resource_value": "{\"index\": 0, \"name\": \"1/13.000\", \"type\": \"l2vlan\", \"vlan_id\": \"100\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[ELAN-AC:000]/interface[1/13.000]", + "resource_value": "{\"id\": \"1/13.000\", \"interface\": \"1/13.000\", \"name\": \"ELAN-AC:000\", \"subinterface\": 0}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[ELAN-AC:000]/connection_point[VC-1]", + "resource_value": "{\"VC_ID\": \"000\", \"connection_point\": \"VC-1\", \"name\": \"ELAN-AC:000\", \"remote_system\": \"0.0.0.0\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_UNDEFINED" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "01f41ada-41d6-5357-b0b2-bda7c4fb6d51" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "0332bf40-60b0-572c-80be-5d7d81e463e5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "0818e669-ad3d-55f7-8168-b88762d9cada" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/40" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "0ebcfe23-90bb-5455-8677-266b42cd2f50" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "0f041b4b-4352-572e-a150-bc2530d52386" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/44" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "154053d1-2b20-5818-927d-573ec9d3b3c0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "17e35cb1-59ff-5668-a4f8-8d57c043f205" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/31" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "19b3e21c-4ae5-5938-be55-62e8c61ba895" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "2308c508-aa60-5f81-88a8-63b276785d91" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/28" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "3adb7588-9954-53e1-abdc-b167c142bac5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/34" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "3ec0ef7b-137b-5731-a03c-9acdd3d5b576" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/50" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "4120d2fe-234c-5642-ba08-601eff46a69c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/32" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "4b48114d-7a63-592a-918f-b7c28c347510" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/36" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "4ee649cc-2944-56d3-b0fa-e769c7f8d8b2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "541ebb94-c8cd-52fc-9bd0-1a3cd24ed42b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "569dabcf-f93c-5daa-8228-3f43c008c36b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/37" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "5adad74b-5342-590a-b1d2-4c932ddf132b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "658e53d1-b535-572d-8fa1-37a90909c488" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "724d2a0d-a296-5ebd-b897-fd422afb8705" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/46" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "73b7d900-62b7-5c04-a4e2-c4d94cd09fd4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "74d92d66-eb69-5c09-a33f-a0a21b83b4a7" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/29" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "7864fe32-1fe1-5d75-8c4c-f9db539599b6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/42" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "7aa3f3be-4326-595e-90a9-91e3a5077fd9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/35" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "7ced749e-92a2-5af8-a507-2921dbead6b8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "89464148-2e36-51d0-b733-d1fe848cd771" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "8dccee7d-0327-5f37-b371-fd6f14d35cb9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/47" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "9706d7ed-2e96-52d1-a3cf-06c01e76d9f7" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/43" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "971493de-a1a5-5bf7-b7c8-12bac8889fdb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "a6ac58c0-a8ab-5653-b777-cd18b6f8c039" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "a70dc146-0cbe-5874-8f5e-d4e35e2bc477" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/48" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "a93515cf-18d0-5baa-9e7d-b09497915b4b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "ae38224d-319b-5c8e-b6ca-996f52e84de6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/33" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "af89c4bb-3b12-52c1-a21a-8520cf6847f1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "b2920376-ca6b-5e40-9391-513fb2ce0119" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "b63b8f25-4be0-57fc-849a-d0408f9608d2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "bc3e34b9-c222-55ac-bc37-cfbe10a936a5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "c470e793-f6f2-5d39-9ca0-fc2ec990c51f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/39" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "cebb90ea-8531-5057-8ef7-bd71dde17051" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "d46ff624-2e51-5d8c-a7dd-13e17f2422c4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/41" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "d6687583-fa44-5eff-a88f-18f837064548" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/21" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "d8ba43ff-00d9-5470-b71a-4530f799ad3b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/30" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "dcd46dfc-f16d-5fd4-a03f-b66579218771" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "e22b02e6-824f-5798-9487-4bcd3da67e61" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "e23484ad-0b6c-54fa-ac90-550b30dd32fd" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "e61abff6-775a-5b5d-9bee-aea6e4cda2c5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "e6cd6c26-5a5c-5a5d-973b-3b6fa7289c57" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "ed8f19ac-8da5-56b7-b80e-cc70105ee94a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "f373d220-1696-5bfd-8dc3-42a51c965523" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/45" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "f5c2fd04-67bb-53a4-a4b9-ed3de25ef075" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "f832a3d7-e5b9-50a5-aa71-ee6bc4f79e32" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/38" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "fefa1c8c-d48c-54da-8aea-f4b48ec0ecf5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "endpoint_uuid": { + "uuid": "ff0079d5-aa90-573c-889c-e7a04588b859" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/49" + } + ], + "device_id": { + "device_uuid": { + "uuid": "68741528-2e94-5274-ab3c-fddcd8dc05ef" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "emu-packet-router", + "name": "R1" + }, + { + "components": [], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "127.0.0.1" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "0" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"endpoints\": [\n{\n\"uuid\": \"1/1\"\n},\n{\n\"uuid\": \"1/14\"\n},\n{\n\"uuid\": \"2/1\"\n},\n{\n\"uuid\": \"2/2\"\n},\n{\n\"uuid\": \"2/3\"\n},\n{\n\"uuid\": \"2/4\"\n},\n{\n\"uuid\": \"2/5\"\n},\n{\n\"uuid\": \"2/6\"\n},\n{\n\"uuid\": \"2/7\"\n},\n{\n\"uuid\": \"2/8\"\n},\n{\n\"uuid\": \"2/9\"\n},\n{\n\"uuid\": \"2/10\"\n},\n{\n\"uuid\": \"2/11\"\n},\n{\n\"uuid\": \"2/12\"\n},\n{\n\"uuid\": \"2/13\"\n},\n{\n\"uuid\": \"2/14\"\n},\n{\n\"uuid\": \"2/15\"\n},\n{\n\"uuid\": \"2/16\"\n},\n{\n\"uuid\": \"2/17\"\n},\n{\n\"uuid\": \"2/18\"\n},\n{\n\"uuid\": \"2/19\"\n},\n{\n\"uuid\": \"2/20\"\n},\n{\n\"uuid\": \"2/21\"\n},\n{\n\"uuid\": \"2/22\"\n},\n{\n\"uuid\": \"2/23\"\n},\n{\n\"uuid\": \"2/24\"\n},\n{\n\"uuid\": \"2/25\"\n},\n{\n\"uuid\": \"2/26\"\n},\n{\n\"uuid\": \"2/27\"\n},\n{\n\"uuid\": \"2/28\"\n},\n{\n\"uuid\": \"2/29\"\n},\n{\n\"uuid\": \"2/30\"\n},\n{\n\"uuid\": \"2/31\"\n},\n{\n\"uuid\": \"2/32\"\n},\n{\n\"uuid\": \"2/33\"\n},\n{\n\"uuid\": \"2/34\"\n},\n{\n\"uuid\": \"2/35\"\n},\n{\n\"uuid\": \"2/36\"\n},\n{\n\"uuid\": \"2/37\"\n},\n{\n\"uuid\": \"2/38\"\n},\n{\n\"uuid\": \"2/39\"\n},\n{\n\"uuid\": \"2/40\"\n},\n{\n\"uuid\": \"2/41\"\n},\n{\n\"uuid\": \"2/42\"\n},\n{\n\"uuid\": \"2/43\"\n},\n{\n\"uuid\": \"2/44\"\n},\n{\n\"uuid\": \"2/45\"\n},\n{\n\"uuid\": \"2/46\"\n},\n{\n\"uuid\": \"2/47\"\n},\n{\n\"uuid\": \"2/48\"\n},\n{\n\"uuid\": \"2/49\"\n},\n{\n\"uuid\": \"2/50\"\n}\n]\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/1]", + "resource_value": "{\"uuid\": \"1/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/14]", + "resource_value": "{\"uuid\": \"1/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/1]", + "resource_value": "{\"uuid\": \"2/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/2]", + "resource_value": "{\"uuid\": \"2/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/3]", + "resource_value": "{\"uuid\": \"2/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/4]", + "resource_value": "{\"uuid\": \"2/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/5]", + "resource_value": "{\"uuid\": \"2/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/6]", + "resource_value": "{\"uuid\": \"2/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/7]", + "resource_value": "{\"uuid\": \"2/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/8]", + "resource_value": "{\"uuid\": \"2/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/9]", + "resource_value": "{\"uuid\": \"2/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/10]", + "resource_value": "{\"uuid\": \"2/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/11]", + "resource_value": "{\"uuid\": \"2/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/12]", + "resource_value": "{\"uuid\": \"2/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/13]", + "resource_value": "{\"uuid\": \"2/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/14]", + "resource_value": "{\"uuid\": \"2/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/15]", + "resource_value": "{\"uuid\": \"2/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/16]", + "resource_value": "{\"uuid\": \"2/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/17]", + "resource_value": "{\"uuid\": \"2/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/18]", + "resource_value": "{\"uuid\": \"2/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/19]", + "resource_value": "{\"uuid\": \"2/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/20]", + "resource_value": "{\"uuid\": \"2/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/21]", + "resource_value": "{\"uuid\": \"2/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/22]", + "resource_value": "{\"uuid\": \"2/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/23]", + "resource_value": "{\"uuid\": \"2/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/24]", + "resource_value": "{\"uuid\": \"2/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/25]", + "resource_value": "{\"uuid\": \"2/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/26]", + "resource_value": "{\"uuid\": \"2/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/27]", + "resource_value": "{\"uuid\": \"2/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/28]", + "resource_value": "{\"uuid\": \"2/28\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/29]", + "resource_value": "{\"uuid\": \"2/29\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/30]", + "resource_value": "{\"uuid\": \"2/30\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/31]", + "resource_value": "{\"uuid\": \"2/31\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/32]", + "resource_value": "{\"uuid\": \"2/32\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/33]", + "resource_value": "{\"uuid\": \"2/33\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/34]", + "resource_value": "{\"uuid\": \"2/34\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/35]", + "resource_value": "{\"uuid\": \"2/35\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/36]", + "resource_value": "{\"uuid\": \"2/36\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/37]", + "resource_value": "{\"uuid\": \"2/37\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/38]", + "resource_value": "{\"uuid\": \"2/38\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/39]", + "resource_value": "{\"uuid\": \"2/39\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/40]", + "resource_value": "{\"uuid\": \"2/40\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/41]", + "resource_value": "{\"uuid\": \"2/41\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/42]", + "resource_value": "{\"uuid\": \"2/42\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/43]", + "resource_value": "{\"uuid\": \"2/43\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/44]", + "resource_value": "{\"uuid\": \"2/44\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/45]", + "resource_value": "{\"uuid\": \"2/45\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/46]", + "resource_value": "{\"uuid\": \"2/46\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/47]", + "resource_value": "{\"uuid\": \"2/47\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/48]", + "resource_value": "{\"uuid\": \"2/48\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/49]", + "resource_value": "{\"uuid\": \"2/49\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/50]", + "resource_value": "{\"uuid\": \"2/50\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_UNDEFINED" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "018ebdab-d158-5cb3-b41e-a160b55438d8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/50" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "0abc6b7e-c271-5d20-9168-4b3a37f8d4eb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/33" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "0b7986ba-a9a1-50aa-86e2-8e566045ccb8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "17946fd9-d9d6-5a42-ba22-5542cbe95669" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "17c94715-4830-5afe-9fbc-d3aab1618b77" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "18e8eeca-53b0-5138-80c0-9aebba321784" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "1d9475a5-2d10-5410-ab3b-001483516898" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "33329b80-6a4d-5003-9ef6-54b6dfa5bdd1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/40" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "3c7d4c16-9a8e-51b6-bc57-bb839c39cd69" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/32" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "4769458a-5717-5ca6-a1df-d08e23f2eb7e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/49" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "4e053b28-f30a-5c1e-8219-6cb68f7bc9d0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/38" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "5173ba44-28c2-58c2-85ed-500337f8e6d9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/42" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "528fead6-a24d-5061-bccb-69ed05260212" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "626aa4c7-2b0d-5e8a-869b-ce451b323a88" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/35" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "663b201a-4830-5cf2-a000-608ca396c23a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/31" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "675c5bae-8022-5711-8acb-c415906a01d0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "69fafaea-04c4-5c0f-ab49-2f66c5c31bb2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "6b7a971c-1657-58ca-b840-718c2f4488d5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/21" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "6c6081e4-fea1-5659-bab1-7a7ad469cb1a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "72328059-46ec-5166-8858-bfeab170cee4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "82369f59-7a85-58cf-ba02-a2a9b496276d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "85c94d08-5cf1-5156-9edf-e12f8cb4a1ea" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/37" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "91a70026-a9d3-5f04-a4bf-686ac921759b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "921fce8f-115b-5ff8-8d5c-f8a8d0e67ce3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "9504e17c-9336-570b-ae02-fffa57a59f04" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "951d45b0-d992-597d-a9e0-68d8a08dacb9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/30" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "953a65fe-f670-5080-b310-6fefa462b87d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "9a81ba59-0516-5829-8308-8df47e9fd0fa" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/48" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "a39fd537-dab1-5e6b-a51b-f5edd42d9f36" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/43" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "a81f26ad-a512-582a-8033-1141595470b4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "adcd30e3-b909-5f73-b91d-3bbdeda91d88" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "b0d6cfb2-6678-525c-aef6-85ae04edb441" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/46" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "b138d345-fe74-51a7-b045-f4eae2178f4c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "bb8b025e-0d73-5b6f-9211-8e1670dd08bb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/29" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "bc911f16-89e3-569c-bc11-8d11a6228d7a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "c128b66d-2397-5a10-9a5b-4ab39e45e6bd" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/47" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "c555a773-6abd-5c93-89a8-b950bac9f566" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/36" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "c614ac4e-d59e-57ce-9538-e2725797c4fe" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "c7469b54-740d-5e6a-865e-2325c227bf75" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "c86042ce-c922-50ef-b4f4-812d794b5306" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/28" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "cc313af2-2818-51af-abb3-532845d6b962" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "cc4c4e97-6aea-5618-a140-b8e0b65f5b21" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/45" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "cda9d2dd-aa6b-54a4-9aa9-a0e86f8e5543" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/44" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "d2204b61-a05e-5299-b2c0-2743bdcf01ba" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "d6f6321a-226a-5db3-8da9-595ab28f021a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "d8b3a7d3-9f7e-5d9f-8f56-38d0f53f4621" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/39" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "d9f5a36c-17a3-513c-8c7a-bc9f2719f757" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "dbcac948-e8a0-50f1-886f-b025bf26467f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "ea6a3a32-5fd8-553c-b807-d8db3de32648" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/34" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "ec0c6f9b-ab4a-5b4a-9a68-7963afbe467e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "ee9ac774-bd73-5b9c-8e66-f5a6607a289c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/41" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "endpoint_uuid": { + "uuid": "f346aed6-30d5-56bf-a558-5bff5e258c04" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/7" + } + ], + "device_id": { + "device_uuid": { + "uuid": "98604ff0-6b41-56df-aed1-3dad31530661" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "emu-packet-router", + "name": "R13" + }, + { + "components": [], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "127.0.0.1" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "0" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"endpoints\": [\n{\n\"uuid\": \"1/2\"\n},\n{\n\"uuid\": \"1/4\"\n},\n{\n\"uuid\": \"1/12\"\n},\n{\n\"uuid\": \"2/1\"\n},\n{\n\"uuid\": \"2/2\"\n},\n{\n\"uuid\": \"2/3\"\n},\n{\n\"uuid\": \"2/4\"\n},\n{\n\"uuid\": \"2/5\"\n},\n{\n\"uuid\": \"2/6\"\n},\n{\n\"uuid\": \"2/7\"\n},\n{\n\"uuid\": \"2/8\"\n},\n{\n\"uuid\": \"2/9\"\n},\n{\n\"uuid\": \"2/10\"\n},\n{\n\"uuid\": \"2/11\"\n},\n{\n\"uuid\": \"2/12\"\n},\n{\n\"uuid\": \"2/13\"\n},\n{\n\"uuid\": \"2/14\"\n},\n{\n\"uuid\": \"2/15\"\n},\n{\n\"uuid\": \"2/16\"\n},\n{\n\"uuid\": \"2/17\"\n},\n{\n\"uuid\": \"2/18\"\n},\n{\n\"uuid\": \"2/19\"\n},\n{\n\"uuid\": \"2/20\"\n},\n{\n\"uuid\": \"2/21\"\n},\n{\n\"uuid\": \"2/22\"\n},\n{\n\"uuid\": \"2/23\"\n},\n{\n\"uuid\": \"2/24\"\n},\n{\n\"uuid\": \"2/25\"\n},\n{\n\"uuid\": \"2/26\"\n},\n{\n\"uuid\": \"2/27\"\n},\n{\n\"uuid\": \"2/28\"\n},\n{\n\"uuid\": \"2/29\"\n},\n{\n\"uuid\": \"2/30\"\n},\n{\n\"uuid\": \"2/31\"\n},\n{\n\"uuid\": \"2/32\"\n},\n{\n\"uuid\": \"2/33\"\n},\n{\n\"uuid\": \"2/34\"\n},\n{\n\"uuid\": \"2/35\"\n},\n{\n\"uuid\": \"2/36\"\n},\n{\n\"uuid\": \"2/37\"\n},\n{\n\"uuid\": \"2/38\"\n},\n{\n\"uuid\": \"2/39\"\n},\n{\n\"uuid\": \"2/40\"\n},\n{\n\"uuid\": \"2/41\"\n},\n{\n\"uuid\": \"2/42\"\n},\n{\n\"uuid\": \"2/43\"\n},\n{\n\"uuid\": \"2/44\"\n},\n{\n\"uuid\": \"2/45\"\n},\n{\n\"uuid\": \"2/46\"\n},\n{\n\"uuid\": \"2/47\"\n},\n{\n\"uuid\": \"2/48\"\n},\n{\n\"uuid\": \"2/49\"\n},\n{\n\"uuid\": \"2/50\"\n}\n]\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/2]", + "resource_value": "{\"uuid\": \"1/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/4]", + "resource_value": "{\"uuid\": \"1/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/12]", + "resource_value": "{\"uuid\": \"1/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/1]", + "resource_value": "{\"uuid\": \"2/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/2]", + "resource_value": "{\"uuid\": \"2/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/3]", + "resource_value": "{\"uuid\": \"2/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/4]", + "resource_value": "{\"uuid\": \"2/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/5]", + "resource_value": "{\"uuid\": \"2/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/6]", + "resource_value": "{\"uuid\": \"2/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/7]", + "resource_value": "{\"uuid\": \"2/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/8]", + "resource_value": "{\"uuid\": \"2/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/9]", + "resource_value": "{\"uuid\": \"2/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/10]", + "resource_value": "{\"uuid\": \"2/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/11]", + "resource_value": "{\"uuid\": \"2/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/12]", + "resource_value": "{\"uuid\": \"2/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/13]", + "resource_value": "{\"uuid\": \"2/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/14]", + "resource_value": "{\"uuid\": \"2/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/15]", + "resource_value": "{\"uuid\": \"2/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/16]", + "resource_value": "{\"uuid\": \"2/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/17]", + "resource_value": "{\"uuid\": \"2/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/18]", + "resource_value": "{\"uuid\": \"2/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/19]", + "resource_value": "{\"uuid\": \"2/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/20]", + "resource_value": "{\"uuid\": \"2/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/21]", + "resource_value": "{\"uuid\": \"2/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/22]", + "resource_value": "{\"uuid\": \"2/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/23]", + "resource_value": "{\"uuid\": \"2/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/24]", + "resource_value": "{\"uuid\": \"2/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/25]", + "resource_value": "{\"uuid\": \"2/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/26]", + "resource_value": "{\"uuid\": \"2/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/27]", + "resource_value": "{\"uuid\": \"2/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/28]", + "resource_value": "{\"uuid\": \"2/28\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/29]", + "resource_value": "{\"uuid\": \"2/29\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/30]", + "resource_value": "{\"uuid\": \"2/30\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/31]", + "resource_value": "{\"uuid\": \"2/31\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/32]", + "resource_value": "{\"uuid\": \"2/32\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/33]", + "resource_value": "{\"uuid\": \"2/33\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/34]", + "resource_value": "{\"uuid\": \"2/34\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/35]", + "resource_value": "{\"uuid\": \"2/35\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/36]", + "resource_value": "{\"uuid\": \"2/36\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/37]", + "resource_value": "{\"uuid\": \"2/37\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/38]", + "resource_value": "{\"uuid\": \"2/38\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/39]", + "resource_value": "{\"uuid\": \"2/39\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/40]", + "resource_value": "{\"uuid\": \"2/40\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/41]", + "resource_value": "{\"uuid\": \"2/41\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/42]", + "resource_value": "{\"uuid\": \"2/42\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/43]", + "resource_value": "{\"uuid\": \"2/43\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/44]", + "resource_value": "{\"uuid\": \"2/44\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/45]", + "resource_value": "{\"uuid\": \"2/45\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/46]", + "resource_value": "{\"uuid\": \"2/46\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/47]", + "resource_value": "{\"uuid\": \"2/47\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/48]", + "resource_value": "{\"uuid\": \"2/48\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/49]", + "resource_value": "{\"uuid\": \"2/49\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/50]", + "resource_value": "{\"uuid\": \"2/50\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_UNDEFINED" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "0100b911-3ff2-574a-bac1-b344e66ae4fd" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "05fef69b-eea0-56f8-9e5f-ddedc2f59046" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/44" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "0728cdfa-7b47-58ef-b2fa-61e6bbbcaab2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/37" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "12001721-1dd6-5074-90f7-e0a7b983227f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "1f0a1c43-d054-5b9d-b482-23f634326c06" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/38" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "24185268-4a1b-50dd-a510-e7ec57986452" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/32" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "2450545a-71be-528a-8f42-d06b3531c754" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "261b5dbb-67b5-58b3-b14b-c5e06af58115" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/49" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "26ec78e1-b571-5fb6-a12d-c24e43711c3b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/50" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "2f7b882e-d663-58c0-92ec-28caa6c2a4f7" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/34" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "37e4d7eb-d692-5648-8f14-0ccbf372fea6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "3dc52f5f-de10-56a5-8b7c-687d25e85aa0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "434d0a50-54b1-5ea8-aba9-5d911ab7816d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "4f0de7e6-0252-54f1-8ab9-eddcf47f8d5e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/35" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "5b13b5e0-b119-5438-bb99-41170cc1f905" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "65e93427-1cef-59dc-aafe-cde51d27394d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "69b8c328-0bfc-5639-a81a-dee2e40254f4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/46" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "6e687452-2589-590c-a956-fc8b7f0b3dc8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "705e7a7c-b993-5036-b3eb-3d0314a9a439" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/21" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "7454611d-5bfd-5565-8d34-0dc26be0785e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/39" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "79029371-552b-588c-a44d-0e7c23da3689" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "81092288-6bc6-57fd-976c-abf4231a7045" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "8575d5db-6606-5b53-9f4b-355653d468b7" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "8633437b-bdbb-5853-a395-0a610c9e2a22" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "8a3b77b3-d99c-5cb0-bf07-2805dbe838c8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/33" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "8aba5b87-513c-50fd-86f1-379f3628c6ad" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/42" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "8f02a53d-26ca-508e-a170-9d3c1300d8fd" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "93f116ed-8230-5a3b-82cc-3944953405bd" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "9bf12ada-ddeb-578b-b262-1e38ac856efb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "a0d17fbe-5ebe-5f54-89c1-009af0463e91" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/40" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "a45246f2-ec5f-5183-9889-d49ec017c893" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/47" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "b69f7d95-d2e5-5346-99ff-8a2fbf436616" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/29" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "b6c626b7-7c4e-5cc7-9e40-d0e0116f0703" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/41" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "bb864631-103e-5ad9-a47f-6b76c370cf29" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "bfd53bc6-4342-5536-9c8e-d10497855dcd" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "c0aa592e-73cf-56fb-83fc-83d6a04920fe" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "c0c7ab1a-ba3d-518b-a962-3d6c210af0b5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "c1103b9a-b4dd-568a-9161-c7558c408a29" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/48" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "c5baf78c-2228-5bfc-a019-caf22a919c0c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/43" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "c89c09b8-9438-5bf6-bfe8-bc6aad485e8e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "c9267f4d-8945-5e87-a4e9-74aa9c819288" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "dbd9519a-958c-5298-be43-09298210143a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "dbf6e995-d279-5a11-9dcc-5e8c3f6de39c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/28" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "dca802a2-aa18-5f77-90f7-ede63b736163" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "e256fd9a-f3ea-58f2-8510-40dd57bec7fb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/36" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "e92fb063-bdc2-5790-862d-1b1663ddeb7d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "ec53a22f-45c1-5a5c-930f-413caae0484c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "ee3b74b8-a3bf-5857-b454-a447f0d00b59" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "ef5a251d-d1a6-53e1-9b6e-00d1fd30e09c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/30" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "f0d1b697-08c2-55a9-b6ab-77f99642b746" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/31" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "f33d8256-88b5-571f-9776-8d72120508ba" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/45" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "f4e2c3c7-629d-54c1-b33b-2cca1d8c20aa" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "endpoint_uuid": { + "uuid": "f791b6ad-bbdc-516c-99bc-87ccc78379b6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/11" + } + ], + "device_id": { + "device_uuid": { + "uuid": "a94061d6-ac13-575e-8f2b-ee2944a9cfda" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "emu-packet-router", + "name": "R6" + }, + { + "components": [ + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"11\"", + "physical-index": "28" + }, + "component_uuid": { + "uuid": "03b032f2-4b72-5896-9dd4-f13be2001e7d" + }, + "name": "eth-1/0/11", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"13\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "33", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "09584cac-c450-5f6a-8af1-e974dcd24ed3" + }, + "name": "Transceiver#13", + "parent": "eth-1/0/13", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"6\"", + "physical-index": "18" + }, + "component_uuid": { + "uuid": "097ede89-58fe-5145-9107-0d74361b199d" + }, + "name": "eth-1/0/6", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"", + "id": "\"2\"", + "physical-index": "10" + }, + "component_uuid": { + "uuid": "0e89add5-2723-5a87-a517-31ccfac5a655" + }, + "name": "eth-1/0/2", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"23\"", + "physical-index": "52" + }, + "component_uuid": { + "uuid": "104969a8-5b63-595f-85ab-9852bac1e107" + }, + "name": "eth-1/0/23", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"10\"", + "physical-index": "26" + }, + "component_uuid": { + "uuid": "1635baf3-692e-5501-bcf3-c4aeef2adaab" + }, + "name": "eth-1/0/10", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "id": "\"2\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "oper-status": "\"oc-platform-types:ACTIVE\"", + "physical-index": "2", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "1a100a0e-ff91-59c4-8fea-687b42bc2340" + }, + "name": "Fan#2", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"8\"", + "physical-index": "22" + }, + "component_uuid": { + "uuid": "1e982e21-7771-5261-b224-0916548425e0" + }, + "name": "eth-1/0/8", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"3\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "13", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "22b8ef57-09d2-55d4-817c-df51270846dd" + }, + "name": "Transceiver#3", + "parent": "eth-1/0/3", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"100G/40G Fiber\"", + "id": "\"26\"", + "physical-index": "58" + }, + "component_uuid": { + "uuid": "28d127f5-0393-59bf-a800-c52d4da9be8e" + }, + "name": "eth-1/0/26", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "id": "\"18\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "43", + "removable": "\"true\"", + "serial-num": "\"P22224B0261 \"", + "vendor": "\"PDDG \"" + }, + "component_uuid": { + "uuid": "2c704852-101e-53da-9a41-bef2a545f38d" + }, + "name": "Transceiver#18", + "parent": "eth-1/0/18", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"12\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "31", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "3007bdde-d017-55d3-ad78-8d8c364e7cff" + }, + "name": "Transceiver#12", + "parent": "eth-1/0/12", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "id": "\"22\"", + "oper-status": "\"oc-platform-types:ACTIVE\"", + "physical-index": "51", + "removable": "\"true\"", + "serial-num": "\"F162250019 \"", + "vendor": "\"Edgecore \"" + }, + "component_uuid": { + "uuid": "304ca86e-8d75-522d-a762-4a67c25f037b" + }, + "name": "Transceiver#22", + "parent": "eth-1/0/22", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"2\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "11", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "31657863-fc8f-5137-9aae-a7b41ec89743" + }, + "name": "Transceiver#2", + "parent": "eth-1/0/2", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"10\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "27", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "3357d41b-5692-5139-9f39-9d0ed1f52b37" + }, + "name": "Transceiver#10", + "parent": "eth-1/0/10", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"15\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "37", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "3422d734-9ffd-54ee-83f8-745ee0020664" + }, + "name": "Transceiver#15", + "parent": "eth-1/0/15", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"21\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "49", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "37690040-0118-534d-ac42-a6ced5d75158" + }, + "name": "Transceiver#21", + "parent": "eth-1/0/21", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"4\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "15", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "38b28d0c-90eb-57ad-9a83-eeb1780084c2" + }, + "name": "Transceiver#4", + "parent": "eth-1/0/4", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"24\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "55", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "40de468d-b3fc-5410-ace7-db172c7f021b" + }, + "name": "Transceiver#24", + "parent": "eth-1/0/24", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"14\"", + "physical-index": "34" + }, + "component_uuid": { + "uuid": "45007027-e554-5a49-967e-548676ab465e" + }, + "name": "eth-1/0/14", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"26\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "59", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "4e106974-8c3d-59da-8d64-734a9e9baa20" + }, + "name": "Transceiver#26", + "parent": "eth-1/0/26", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"7\"", + "physical-index": "20" + }, + "component_uuid": { + "uuid": "53bf950a-8537-5d6d-82d4-17c419ad6457" + }, + "name": "eth-1/0/7", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "id": "\"5\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "oper-status": "\"oc-platform-types:ACTIVE\"", + "physical-index": "5", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "5671c64a-0cdf-5f17-bf85-69fa9d38bd47" + }, + "name": "Fan#5", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"25\"", + "physical-index": "56" + }, + "component_uuid": { + "uuid": "5a3361ff-a070-50d8-b2b1-23c4b06eced8" + }, + "name": "eth-1/0/25", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"false\"", + "id": "\"2\"", + "location": "\"Power Supplies tray\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "7", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "5e51a804-860a-5309-b139-fa785ed2008d" + }, + "name": "Power-Supply#2", + "parent": "chassis", + "type": "POWER_SUPPLY" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"18\"", + "physical-index": "42" + }, + "component_uuid": { + "uuid": "6280b11d-ef2e-5d97-a339-76651dd6ff64" + }, + "name": "eth-1/0/18", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"", + "id": "\"5\"", + "physical-index": "16" + }, + "component_uuid": { + "uuid": "62cee201-2c2c-5d87-837f-5addb6ee5f75" + }, + "name": "eth-1/0/5", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"100G/40G Fiber\"", + "id": "\"27\"", + "physical-index": "60" + }, + "component_uuid": { + "uuid": "63d9efd2-fe86-5261-abd0-0f06ba1c8897" + }, + "name": "eth-1/0/27", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"CRXT-T0T12A\"", + "empty": "\"false\"", + "id": "\"1\"", + "location": "\"Power Supplies tray\"", + "manufacturer-name": "\"CRXT-T0T12A\"", + "oper-status": "\"oc-platform-types:ACTIVE\"", + "physical-index": "6", + "removable": "\"true\"", + "serial-num": "\"19330053\"" + }, + "component_uuid": { + "uuid": "64e6f03d-29b1-5db1-a0d5-6a177aab75a0" + }, + "name": "Power-Supply#1", + "parent": "chassis", + "type": "POWER_SUPPLY" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "id": "\"4\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "oper-status": "\"oc-platform-types:ACTIVE\"", + "physical-index": "4", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "686f20b5-b1e3-510c-b7f8-2a7a4a5c6ae5" + }, + "name": "Fan#4", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"", + "id": "\"3\"", + "physical-index": "12" + }, + "component_uuid": { + "uuid": "6f2a5723-5955-5fd7-8e88-b4e84a2838f5" + }, + "name": "eth-1/0/3", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"DRX-30\"", + "empty": "\"false\"", + "hardware-rev": "\"R0D\"", + "id": "\"DRX-30\"", + "manufacturer-name": "\"DRX-30\"", + "mfg-date": "\"2020-01-08\"", + "oper-status": "\"oc-platform-types:ACTIVE\"", + "physical-index": "0", + "removable": "\"false\"", + "serial-num": "\"731527XB1952144\"", + "software-rev": "\"21.5.1 (9799)\"" + }, + "component_uuid": { + "uuid": "70ae874d-0cf4-58d0-9e2c-dce947835e02" + }, + "name": "chassis", + "parent": "chassis", + "type": "CHASSIS" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"9\"", + "physical-index": "24" + }, + "component_uuid": { + "uuid": "7b36d66b-a7f3-52cb-a10e-85a23aeeb813" + }, + "name": "eth-1/0/9", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "id": "\"25\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "57", + "removable": "\"true\"", + "serial-num": "\"F162250016 \"", + "vendor": "\"Edgecore \"" + }, + "component_uuid": { + "uuid": "8be56fb0-3b72-5f6d-ac0a-99945bd39e25" + }, + "name": "Transceiver#25", + "parent": "eth-1/0/25", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "id": "\"3\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "oper-status": "\"oc-platform-types:ACTIVE\"", + "physical-index": "3", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "8d14a19d-c957-5bd8-b511-0d94ae05b7f8" + }, + "name": "Fan#3", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"15\"", + "physical-index": "36" + }, + "component_uuid": { + "uuid": "91bb1526-a701-5e79-9157-da0f97dab78f" + }, + "name": "eth-1/0/15", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"20\"", + "physical-index": "46" + }, + "component_uuid": { + "uuid": "973bc58c-cde5-5f3f-9354-d59f6c290eca" + }, + "name": "eth-1/0/20", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"19\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "45", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "9c3046a1-419b-57a6-9637-18ebb7141d91" + }, + "name": "Transceiver#19", + "parent": "eth-1/0/19", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "id": "\"23\"", + "oper-status": "\"oc-platform-types:ACTIVE\"", + "physical-index": "53", + "removable": "\"true\"", + "serial-num": "\"PYA2FD5 \"", + "vendor": "\"FINISAR CORP. \"" + }, + "component_uuid": { + "uuid": "9e76e34e-f337-5490-ae6b-d85f47137e3e" + }, + "name": "Transceiver#23", + "parent": "eth-1/0/23", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "id": "\"17\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "41", + "removable": "\"true\"", + "serial-num": "\"CN04HG00183038D\"", + "vendor": "\"DELL EMC \"" + }, + "component_uuid": { + "uuid": "9ecb4039-5041-5f2a-9f94-6a51f29514e0" + }, + "name": "Transceiver#17", + "parent": "eth-1/0/17", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "id": "\"16\"", + "oper-status": "\"oc-platform-types:ACTIVE\"", + "physical-index": "39", + "removable": "\"true\"", + "serial-num": "\"030SBF6TH661789\"", + "vendor": "\"HISILICON \"" + }, + "component_uuid": { + "uuid": "a4d52f50-99e8-516c-83a6-879c13178504" + }, + "name": "Transceiver#16", + "parent": "eth-1/0/16", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "id": "\"20\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "47", + "removable": "\"true\"", + "serial-num": "\"CN04HG0018P1452\"", + "vendor": "\"DELL EMC \"" + }, + "component_uuid": { + "uuid": "a5b44bbd-0f03-5177-bb9f-203d98af6add" + }, + "name": "Transceiver#20", + "parent": "eth-1/0/20", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"", + "id": "\"4\"", + "physical-index": "14" + }, + "component_uuid": { + "uuid": "ab46ecab-c0fd-5696-a616-e46ad0cd0960" + }, + "name": "eth-1/0/4", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"17\"", + "physical-index": "40" + }, + "component_uuid": { + "uuid": "af6aab36-090a-53db-ab06-183bb97edf21" + }, + "name": "eth-1/0/17", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"16\"", + "physical-index": "38" + }, + "component_uuid": { + "uuid": "b5862c5c-3087-583d-8603-787e5050637a" + }, + "name": "eth-1/0/16", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "id": "\"6\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "19", + "removable": "\"true\"", + "serial-num": "\"AZG28W2 \"", + "vendor": "\"FINISAR CORP. \"" + }, + "component_uuid": { + "uuid": "b6bc2e57-dc3e-519a-97f8-889e2bd849d0" + }, + "name": "Transceiver#6", + "parent": "eth-1/0/6", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"8\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "23", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "babb0fd9-70e3-5f5f-a4c4-3e6f40abfccb" + }, + "name": "Transceiver#8", + "parent": "eth-1/0/8", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"14\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "35", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "bbeb4cf8-3a3c-5ebd-a44f-c9b78a962114" + }, + "name": "Transceiver#14", + "parent": "eth-1/0/14", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"22\"", + "physical-index": "50" + }, + "component_uuid": { + "uuid": "bcc111db-cfdf-5444-9a89-a21bf906b1cb" + }, + "name": "eth-1/0/22", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"27\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "61", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "bd6b179c-8e3a-58a9-bdf3-3fbeba753dae" + }, + "name": "Transceiver#27", + "parent": "eth-1/0/27", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "id": "\"1\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "oper-status": "\"oc-platform-types:ACTIVE\"", + "physical-index": "1", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "bfe4a9b8-1a67-5883-b18e-1a7bfd46fca2" + }, + "name": "Fan#1", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"9\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "25", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "c0a8adc7-906c-521b-922e-40cb7018814c" + }, + "name": "Transceiver#9", + "parent": "eth-1/0/9", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"13\"", + "physical-index": "32" + }, + "component_uuid": { + "uuid": "c95eb4cc-a9f5-5d73-a564-04dda718059e" + }, + "name": "eth-1/0/13", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"1\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "9", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "d111f7a6-4810-56cf-99e5-57dd8343687b" + }, + "name": "Transceiver#1", + "parent": "eth-1/0/1", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"5\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "17", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "da3ed3f4-d21a-5cd6-9480-bea3c7adfcdc" + }, + "name": "Transceiver#5", + "parent": "eth-1/0/5", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"7\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "21", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "e251662d-582c-5956-9e6f-a4427c06c0cd" + }, + "name": "Transceiver#7", + "parent": "eth-1/0/7", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "id": "\"11\"", + "oper-status": "\"oc-platform-types:INACTIVE\"", + "physical-index": "29", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "e3e1c32d-298f-59f0-975d-bffdc1c344f9" + }, + "name": "Transceiver#11", + "parent": "eth-1/0/11", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"24\"", + "physical-index": "54" + }, + "component_uuid": { + "uuid": "e5e0812c-ff1a-5c1a-8b29-988bf5306be0" + }, + "name": "eth-1/0/24", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"19\"", + "physical-index": "44" + }, + "component_uuid": { + "uuid": "e9268a00-1b19-5c3e-a17f-3ffd08f08fd1" + }, + "name": "eth-1/0/19", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"100G/40G Fiber\"", + "id": "\"1\"", + "physical-index": "8" + }, + "component_uuid": { + "uuid": "ea0eb62c-5928-50a6-b0c2-16bd35e97684" + }, + "name": "eth-1/0/1", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"21\"", + "physical-index": "48" + }, + "component_uuid": { + "uuid": "f1c80cb7-9ac4-5459-aded-ac008b6acadc" + }, + "name": "eth-1/0/21", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"", + "id": "\"12\"", + "physical-index": "30" + }, + "component_uuid": { + "uuid": "febcf719-09bb-5cb7-91a6-50ee7a9b5990" + }, + "name": "eth-1/0/12", + "parent": "", + "type": "PORT" + } + ], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "10.95.90.125" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "830" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"allow_agent\": false,\n\"commit_per_rule\": true,\n\"device_params\": {\n\"name\": \"huaweiyang\"\n},\n\"force_running\": false,\n\"hostkey_verify\": false,\n\"look_for_keys\": false,\n\"manager_params\": {\n\"timeout\": 120\n},\n\"message_renderer\": \"pyangbind\",\n\"password\": \"admin\",\n\"username\": \"admin\",\n\"vendor\": \"ADVA\"\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/chassis", + "resource_value": "{\"attributes\": {\"description\": \"DRX-30\", \"empty\": \"false\", \"hardware-rev\": \"R0D\", \"id\": \"DRX-30\", \"manufacturer-name\": \"DRX-30\", \"mfg-date\": \"2020-01-08\", \"oper-status\": \"oc-platform-types:ACTIVE\", \"physical-index\": 0, \"removable\": \"false\", \"serial-num\": \"731527XB1952144\", \"software-rev\": \"21.5.1 (9799)\"}, \"class\": \"CHASSIS\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"chassis\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#1", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"id\": \"1\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"oper-status\": \"oc-platform-types:ACTIVE\", \"physical-index\": 1, \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#1\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#2", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"id\": \"2\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"oper-status\": \"oc-platform-types:ACTIVE\", \"physical-index\": 2, \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#2\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#3", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"id\": \"3\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"oper-status\": \"oc-platform-types:ACTIVE\", \"physical-index\": 3, \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#3\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#4", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"id\": \"4\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"oper-status\": \"oc-platform-types:ACTIVE\", \"physical-index\": 4, \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#4\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#5", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"id\": \"5\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"oper-status\": \"oc-platform-types:ACTIVE\", \"physical-index\": 5, \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#5\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Power-Supply#1", + "resource_value": "{\"attributes\": {\"description\": \"CRXT-T0T12A\", \"empty\": \"false\", \"id\": \"1\", \"location\": \"Power Supplies tray\", \"manufacturer-name\": \"CRXT-T0T12A\", \"oper-status\": \"oc-platform-types:ACTIVE\", \"physical-index\": 6, \"removable\": \"true\", \"serial-num\": \"19330053\"}, \"class\": \"POWER_SUPPLY\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Power-Supply#1\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Power-Supply#2", + "resource_value": "{\"attributes\": {\"empty\": \"false\", \"id\": \"2\", \"location\": \"Power Supplies tray\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 7, \"removable\": \"true\"}, \"class\": \"POWER_SUPPLY\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Power-Supply#2\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/1", + "resource_value": "{\"attributes\": {\"description\": \"100G/40G Fiber\", \"id\": \"1\", \"physical-index\": 8}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\"], \"name\": \"eth-1/0/1\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#1", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"1\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 9, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [3, \"PORT\"], \"name\": \"Transceiver#1\", \"parent-component-references\": \"eth-1/0/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/2", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\", \"id\": \"2\", \"physical-index\": 10}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/2\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#2", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"2\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 11, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [4, \"PORT\"], \"name\": \"Transceiver#2\", \"parent-component-references\": \"eth-1/0/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/3", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\", \"id\": \"3\", \"physical-index\": 12}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/3\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#3", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"3\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 13, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [5, \"PORT\"], \"name\": \"Transceiver#3\", \"parent-component-references\": \"eth-1/0/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/4", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\", \"id\": \"4\", \"physical-index\": 14}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/4\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#4", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"4\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 15, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [6, \"PORT\"], \"name\": \"Transceiver#4\", \"parent-component-references\": \"eth-1/0/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/5", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\", \"id\": \"5\", \"physical-index\": 16}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/5\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#5", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"5\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 17, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [7, \"PORT\"], \"name\": \"Transceiver#5\", \"parent-component-references\": \"eth-1/0/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/6", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"6\", \"physical-index\": 18}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/6\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#6", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"id\": \"6\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 19, \"removable\": \"true\", \"serial-num\": \"AZG28W2 \", \"vendor\": \"FINISAR CORP. \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [8, \"PORT\"], \"name\": \"Transceiver#6\", \"parent-component-references\": \"eth-1/0/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/7", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"7\", \"physical-index\": 20}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/7\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#7", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"7\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 21, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [9, \"PORT\"], \"name\": \"Transceiver#7\", \"parent-component-references\": \"eth-1/0/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/8", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"8\", \"physical-index\": 22}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/8\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#8", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"8\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 23, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [10, \"PORT\"], \"name\": \"Transceiver#8\", \"parent-component-references\": \"eth-1/0/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/9", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"9\", \"physical-index\": 24}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/9\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#9", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"9\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 25, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [11, \"PORT\"], \"name\": \"Transceiver#9\", \"parent-component-references\": \"eth-1/0/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/10", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"10\", \"physical-index\": 26}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/10\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#10", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"10\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 27, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [12, \"PORT\"], \"name\": \"Transceiver#10\", \"parent-component-references\": \"eth-1/0/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/11", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"11\", \"physical-index\": 28}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/11\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#11", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"11\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 29, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [13, \"PORT\"], \"name\": \"Transceiver#11\", \"parent-component-references\": \"eth-1/0/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/12", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"12\", \"physical-index\": 30}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/12\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#12", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"12\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 31, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [14, \"PORT\"], \"name\": \"Transceiver#12\", \"parent-component-references\": \"eth-1/0/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/13", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"13\", \"physical-index\": 32}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/13\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#13", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"13\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 33, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [15, \"PORT\"], \"name\": \"Transceiver#13\", \"parent-component-references\": \"eth-1/0/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/14", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"14\", \"physical-index\": 34}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/14\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#14", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"14\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 35, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [16, \"PORT\"], \"name\": \"Transceiver#14\", \"parent-component-references\": \"eth-1/0/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/15", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"15\", \"physical-index\": 36}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/15\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#15", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"15\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 37, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [17, \"PORT\"], \"name\": \"Transceiver#15\", \"parent-component-references\": \"eth-1/0/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/16", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"16\", \"physical-index\": 38}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/16\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#16", + "resource_value": "{\"attributes\": {\"empty\": \"false\", \"form-factor\": \"SFP\", \"id\": \"16\", \"oper-status\": \"oc-platform-types:ACTIVE\", \"physical-index\": 39, \"removable\": \"true\", \"serial-num\": \"030SBF6TH661789\", \"vendor\": \"HISILICON \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [18, \"PORT\"], \"name\": \"Transceiver#16\", \"parent-component-references\": \"eth-1/0/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/17", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"17\", \"physical-index\": 40}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/17\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#17", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"id\": \"17\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 41, \"removable\": \"true\", \"serial-num\": \"CN04HG00183038D\", \"vendor\": \"DELL EMC \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [19, \"PORT\"], \"name\": \"Transceiver#17\", \"parent-component-references\": \"eth-1/0/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/18", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"18\", \"physical-index\": 42}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/18\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#18", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"id\": \"18\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 43, \"removable\": \"true\", \"serial-num\": \"P22224B0261 \", \"vendor\": \"PDDG \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [20, \"PORT\"], \"name\": \"Transceiver#18\", \"parent-component-references\": \"eth-1/0/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/19", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"19\", \"physical-index\": 44}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/19\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#19", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"19\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 45, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [21, \"PORT\"], \"name\": \"Transceiver#19\", \"parent-component-references\": \"eth-1/0/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/20", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"20\", \"physical-index\": 46}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/20\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#20", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"id\": \"20\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 47, \"removable\": \"true\", \"serial-num\": \"CN04HG0018P1452\", \"vendor\": \"DELL EMC \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [22, \"PORT\"], \"name\": \"Transceiver#20\", \"parent-component-references\": \"eth-1/0/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/21", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"21\", \"physical-index\": 48}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/21\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#21", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"21\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 49, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [23, \"PORT\"], \"name\": \"Transceiver#21\", \"parent-component-references\": \"eth-1/0/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/22", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"22\", \"physical-index\": 50}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/22\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#22", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"id\": \"22\", \"oper-status\": \"oc-platform-types:ACTIVE\", \"physical-index\": 51, \"removable\": \"true\", \"serial-num\": \"F162250019 \", \"vendor\": \"Edgecore \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [24, \"PORT\"], \"name\": \"Transceiver#22\", \"parent-component-references\": \"eth-1/0/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/23", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"23\", \"physical-index\": 52}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/23\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#23", + "resource_value": "{\"attributes\": {\"empty\": \"false\", \"form-factor\": \"SFP\", \"id\": \"23\", \"oper-status\": \"oc-platform-types:ACTIVE\", \"physical-index\": 53, \"removable\": \"true\", \"serial-num\": \"PYA2FD5 \", \"vendor\": \"FINISAR CORP. \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [25, \"PORT\"], \"name\": \"Transceiver#23\", \"parent-component-references\": \"eth-1/0/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/24", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"24\", \"physical-index\": 54}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/24\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#24", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"24\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 55, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [26, \"PORT\"], \"name\": \"Transceiver#24\", \"parent-component-references\": \"eth-1/0/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/25", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\", \"id\": \"25\", \"physical-index\": 56}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/25\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#25", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"id\": \"25\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 57, \"removable\": \"true\", \"serial-num\": \"F162250016 \", \"vendor\": \"Edgecore \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [27, \"PORT\"], \"name\": \"Transceiver#25\", \"parent-component-references\": \"eth-1/0/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/26", + "resource_value": "{\"attributes\": {\"description\": \"100G/40G Fiber\", \"id\": \"26\", \"physical-index\": 58}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/26\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#26", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"26\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 59, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [28, \"PORT\"], \"name\": \"Transceiver#26\", \"parent-component-references\": \"eth-1/0/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/27", + "resource_value": "{\"attributes\": {\"description\": \"100G/40G Fiber\", \"id\": \"27\", \"physical-index\": 60}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/27\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#27", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"id\": \"27\", \"oper-status\": \"oc-platform-types:INACTIVE\", \"physical-index\": 61, \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [29, \"PORT\"], \"name\": \"Transceiver#27\", \"parent-component-references\": \"eth-1/0/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/1]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/1']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/1']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/1']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/1']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/2]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/2']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/2']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/2']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/2']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/3]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/3']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/3']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/3']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/3']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/4]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/4']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/4']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/4']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/4']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/5]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/5']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/5']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/5']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/5']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/6]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/6']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/6']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/6']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/6']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/7]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/7']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/7']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/7']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/7']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/8]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/8']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/8']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/8']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/8']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/9]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/9']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/9']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/9']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/9']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/10]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/10']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/10']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/10']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/10']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/11]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/11']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/11']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/11']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/11']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/12]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/12']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/12']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/12']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/12']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/13]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/13']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/13']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/13']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/13']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/14]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/14']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/14']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/14']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/14']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/15]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/15']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/15']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/15']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/15']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/16]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/16']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/16']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/16']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/16']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/17]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/17']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/17']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/17']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/17']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/18]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/18']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/18']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/18']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/18']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/19]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/19']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/19']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/19']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/19']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/20]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/20']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/20']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/20']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/20']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/21]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/21']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/21']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/21']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/21']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/22]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/22']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/22']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/22']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/22']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/23]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/23']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/23']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/23']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/23']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/24]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/24']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/24']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/24']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/24']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/25]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/25']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/25']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/25']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/25']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/26]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/26']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/26']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/26']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/26']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/27]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/27']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/27']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/27']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/27']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/1]", + "resource_value": "{\"name\": \"eth-1/0/1\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/2]", + "resource_value": "{\"name\": \"eth-1/0/2\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/3]", + "resource_value": "{\"name\": \"eth-1/0/3\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/4]", + "resource_value": "{\"name\": \"eth-1/0/4\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/5]", + "resource_value": "{\"description\": \"\\\"TeraFlow\\\"\", \"name\": \"eth-1/0/5\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/6]", + "resource_value": "{\"name\": \"eth-1/0/6\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/7]", + "resource_value": "{\"name\": \"eth-1/0/7\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/8]", + "resource_value": "{\"name\": \"eth-1/0/8\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/9]", + "resource_value": "{\"name\": \"eth-1/0/9\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/10]", + "resource_value": "{\"name\": \"eth-1/0/10\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/11]", + "resource_value": "{\"name\": \"eth-1/0/11\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/12]", + "resource_value": "{\"name\": \"eth-1/0/12\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/13]", + "resource_value": "{\"name\": \"eth-1/0/13\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/14]", + "resource_value": "{\"name\": \"eth-1/0/14\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/15]", + "resource_value": "{\"name\": \"eth-1/0/15\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/16]", + "resource_value": "{\"name\": \"eth-1/0/16\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/17]", + "resource_value": "{\"name\": \"eth-1/0/17\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/18]", + "resource_value": "{\"description\": \"\\\"Conexion con HL5-1-2\\\"\", \"name\": \"eth-1/0/18\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/19]", + "resource_value": "{\"name\": \"eth-1/0/19\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/20]", + "resource_value": "{\"description\": \"\\\"TeraFlow\\\"\", \"name\": \"eth-1/0/20\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/21]", + "resource_value": "{\"name\": \"eth-1/0/21\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/22]", + "resource_value": "{\"description\": \"\\\"TeraFlow\\\"\", \"name\": \"eth-1/0/22\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/23]", + "resource_value": "{\"name\": \"eth-1/0/23\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/24]", + "resource_value": "{\"description\": \"\\\"TeraFlow\\\"\", \"name\": \"eth-1/0/24\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/25]", + "resource_value": "{\"description\": \"\\\"TeraFlow\\\"\", \"name\": \"eth-1/0/25\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/26]", + "resource_value": "{\"name\": \"eth-1/0/26\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/27]", + "resource_value": "{\"name\": \"eth-1/0/27\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth0]/subinterface[0]", + "resource_value": "{\"address_ip\": \"10.95.90.125\", \"address_prefix\": 24, \"index\": 0, \"name\": \"eth0\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth0]", + "resource_value": "{\"name\": \"eth0\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[dummy1]/subinterface[0]", + "resource_value": "{\"address_ip\": \"5.5.5.5\", \"address_prefix\": 32, \"index\": 0, \"name\": \"dummy1\", \"type\": \"softwareLoopback\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[dummy1]", + "resource_value": "{\"name\": \"dummy1\", \"type\": \"softwareLoopback\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/10.42]/subinterface[0]", + "resource_value": "{\"address_ip\": \"99.4.42.5\", \"address_ipv6\": \"2001::99:4:42:5\", \"address_prefix\": 24, \"address_prefix_v6\": 112, \"index\": 0, \"name\": \"eth-1/0/10.42\", \"type\": \"l3ipvlan\", \"vlan_id\": 42}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/10.42]", + "resource_value": "{\"description\": \"\\\"Conexion con HL4-2-2\\\"\", \"name\": \"eth-1/0/10.42\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/16.125]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.16.1\", \"address_prefix\": 24, \"index\": 0, \"name\": \"eth-1/0/16.125\", \"type\": \"l3ipvlan\", \"vlan_id\": 125}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/16.125]", + "resource_value": "{\"name\": \"eth-1/0/16.125\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/20.55]/subinterface[0]", + "resource_value": "{\"address_ip\": \"99.5.20.3\", \"address_ipv6\": \"2001::99:5:20:2\", \"address_prefix\": 24, \"address_prefix_v6\": 112, \"index\": 0, \"name\": \"eth-1/0/20.55\", \"type\": \"l3ipvlan\", \"vlan_id\": 20}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/20.55]", + "resource_value": "{\"description\": \"\\\"Conexion con HL5-4-1\\\"\", \"name\": \"eth-1/0/20.55\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/22.111]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.4.1\", \"address_prefix\": 24, \"index\": 0, \"name\": \"eth-1/0/22.111\", \"type\": \"l3ipvlan\", \"vlan_id\": 111}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/22.111]", + "resource_value": "{\"name\": \"eth-1/0/22.111\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/23.125]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.61.1\", \"address_prefix\": 24, \"index\": 0, \"name\": \"eth-1/0/23.125\", \"type\": \"l3ipvlan\", \"vlan_id\": 125}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/23.125]", + "resource_value": "{\"name\": \"eth-1/0/23.125\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/25.55]/subinterface[0]", + "resource_value": "{\"address_ip\": \"99.5.55.2\", \"address_ipv6\": \"2001::99:5:55:2\", \"address_prefix\": 24, \"address_prefix_v6\": 112, \"index\": 0, \"name\": \"eth-1/0/25.55\", \"type\": \"l3ipvlan\", \"vlan_id\": 55}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/25.55]", + "resource_value": "{\"description\": \"\\\"Conexion con HL5-1-2\\\"\", \"name\": \"eth-1/0/25.55\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/23.996]/subinterface[0]", + "resource_value": "{\"index\": 0, \"name\": \"eth-1/0/23.996\", \"type\": \"l2vlan\", \"vlan_id\": 996}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/23.996]", + "resource_value": "{\"name\": \"eth-1/0/23.996\", \"type\": \"l2vlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/20.533]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.12.12\", \"address_prefix\": 16, \"index\": 0, \"mtu\": \"1450\", \"name\": \"eth-1/0/20.533\", \"type\": \"l3ipvlan\", \"vlan_id\": 533}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/20.533]", + "resource_value": "{\"mtu\": 1450, \"name\": \"eth-1/0/20.533\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/21.534]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.17.47\", \"address_prefix\": 16, \"index\": 0, \"mtu\": \"1450\", \"name\": \"eth-1/0/21.534\", \"type\": \"l3ipvlan\", \"vlan_id\": 534}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/21.534]", + "resource_value": "{\"mtu\": 1450, \"name\": \"eth-1/0/21.534\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[MY_POLICY_BGP]", + "resource_value": "{\"policy_name\": \"MY_POLICY_BGP\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[MY_AS_PATH]", + "resource_value": "{\"policy_name\": \"MY_AS_PATH\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[MY_STANDARD_COMMUNITY]", + "resource_value": "{\"policy_name\": \"MY_STANDARD_COMMUNITY\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[MY_EXTENDED_COMMUNITY]", + "resource_value": "{\"policy_name\": \"MY_EXTENDED_COMMUNITY\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[MY_POLICY]", + "resource_value": "{\"policy_name\": \"MY_POLICY\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[srv_ACL]", + "resource_value": "{\"policy_name\": \"srv_ACL\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[srv_ACLr]", + "resource_value": "{\"policy_name\": \"srv_ACLr\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[RT_POLICY]", + "resource_value": "{\"policy_name\": \"RT_POLICY\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_srv_ACL]", + "resource_value": "{\"ext_community_set_name\": \"set_srv_ACL\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_srv_ACL][65000:533]", + "resource_value": "{\"ext_community_member\": \"65000:533\", \"ext_community_set_name\": \"set_srv_ACL\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_srv_ACLr]", + "resource_value": "{\"ext_community_set_name\": \"set_srv_ACLr\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_srv_ACLr][65000:533]", + "resource_value": "{\"ext_community_member\": \"65000:533\", \"ext_community_set_name\": \"set_srv_ACLr\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_RT_POLICY]", + "resource_value": "{\"ext_community_set_name\": \"set_RT_POLICY\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_RT_POLICY][65001:456]", + "resource_value": "{\"ext_community_member\": \"65001:456\", \"ext_community_set_name\": \"set_RT_POLICY\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]", + "resource_value": "{\"name\": \"default\", \"router_id\": \"5.5.5.5\", \"type\": \"DEFAULT_INSTANCE\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[OSPF]", + "resource_value": "{\"identifier\": \"OSPF\", \"name\": \"default\", \"protocol_name\": \"OSPF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[ISIS]", + "resource_value": "{\"identifier\": \"ISIS\", \"name\": \"default\", \"protocol_name\": \"ISIS\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[BGP]", + "resource_value": "{\"as\": 65001, \"identifier\": \"BGP\", \"name\": \"default\", \"protocol_name\": \"BGP\", \"router_id\": \"5.5.5.5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[STATIC]", + "resource_value": "{\"identifier\": \"STATIC\", \"name\": \"default\", \"protocol_name\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[DIRECTLY_CONNECTED]", + "resource_value": "{\"identifier\": \"DIRECTLY_CONNECTED\", \"name\": \"default\", \"protocol_name\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/table_connections[STATIC][BGP][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"BGP\", \"name\": \"default\", \"src_protocol\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/table_connections[DIRECTLY_CONNECTED][ISIS][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"ISIS\", \"name\": \"default\", \"src_protocol\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[ELAN-AC:996]", + "resource_value": "{\"name\": \"ELAN-AC:996\", \"type\": \"L2VSI\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23-NetInst]", + "resource_value": "{\"name\": \"5603d4487d23-NetInst\", \"route_distinguisher\": \"65000:533\", \"type\": \"L3VRF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23-NetInst]/protocols[BGP]", + "resource_value": "{\"as\": 65000, \"identifier\": \"BGP\", \"name\": \"5603d4487d23-NetInst\", \"protocol_name\": \"BGP\", \"router_id\": \"5.5.5.5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23-NetInst]/protocols[DIRECTLY_CONNECTED]", + "resource_value": "{\"identifier\": \"DIRECTLY_CONNECTED\", \"name\": \"5603d4487d23-NetInst\", \"protocol_name\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23-NetInst]/protocols[STATIC]", + "resource_value": "{\"identifier\": \"STATIC\", \"name\": \"5603d4487d23-NetInst\", \"protocol_name\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23-NetInst]/table_connections[DIRECTLY_CONNECTED][BGP][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"BGP\", \"name\": \"5603d4487d23-NetInst\", \"src_protocol\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23-NetInst]/table_connections[STATIC][BGP][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"BGP\", \"name\": \"5603d4487d23-NetInst\", \"src_protocol\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23-NetInst]/inter_instance_policies[srv_ACL]", + "resource_value": "{\"import_policy\": \"srv_ACL\", \"name\": \"5603d4487d23-NetInst\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23-NetInst]/inter_instance_policies[srv_ACLr]", + "resource_value": "{\"export_policy\": \"srv_ACLr\", \"name\": \"5603d4487d23-NetInst\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[TestPablo]", + "resource_value": "{\"name\": \"TestPablo\", \"route_distinguisher\": \"65000:934\", \"type\": \"L3VRF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[TestPablo]/protocols[BGP]", + "resource_value": "{\"as\": 65000, \"identifier\": \"BGP\", \"name\": \"TestPablo\", \"protocol_name\": \"BGP\", \"router_id\": \"5.5.5.5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[VRF_TEST]", + "resource_value": "{\"name\": \"VRF_TEST\", \"route_distinguisher\": \"65000:11\", \"type\": \"L3VRF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[VRF_TEST]/protocols[BGP]", + "resource_value": "{\"as\": 100, \"identifier\": \"BGP\", \"name\": \"VRF_TEST\", \"protocol_name\": \"BGP\", \"router_id\": \"5.5.5.5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[VRF_TEST]/protocols[STATIC]", + "resource_value": "{\"identifier\": \"STATIC\", \"name\": \"VRF_TEST\", \"protocol_name\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[VRF_TEST]/table_connections[STATIC][BGP][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"BGP\", \"name\": \"VRF_TEST\", \"src_protocol\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[VRF_TEST]/inter_instance_policies[RT_POLICY]", + "resource_value": "{\"export_policy\": \"RT_POLICY\", \"import_policy\": \"RT_POLICY\", \"name\": \"VRF_TEST\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]", + "resource_value": "{\"name\": \"5603d4487d23\", \"route_distinguisher\": \"65000:101\", \"type\": \"L3VRF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/protocols[BGP]", + "resource_value": "{\"as\": 65000, \"identifier\": \"BGP\", \"name\": \"5603d4487d23\", \"protocol_name\": \"BGP\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/protocols[DIRECTLY_CONNECTED]", + "resource_value": "{\"identifier\": \"DIRECTLY_CONNECTED\", \"name\": \"5603d4487d23\", \"protocol_name\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/protocols[STATIC]", + "resource_value": "{\"identifier\": \"STATIC\", \"name\": \"5603d4487d23\", \"protocol_name\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/table_connections[DIRECTLY_CONNECTED][BGP][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"BGP\", \"name\": \"5603d4487d23\", \"src_protocol\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/table_connections[STATIC][BGP][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"BGP\", \"name\": \"5603d4487d23\", \"src_protocol\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/inter_instance_policies[srv_ACL]", + "resource_value": "{\"import_policy\": \"srv_ACL\", \"name\": \"5603d4487d23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/inter_instance_policies[srv_ACLr]", + "resource_value": "{\"export_policy\": \"srv_ACLr\", \"name\": \"5603d4487d23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/acl/interfaces/ingress[udp][oc-acl:ACL_IPV4]", + "resource_value": "{\"id\": \"eth-1/0/16.125\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_OPENCONFIG" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "17d02669-86db-543e-b91b-f6159af1a6a0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "1b988154-78ec-5da2-b174-39898da62244" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "1dcec577-ac69-53e4-a72b-f5f1871043d9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "224fb033-10b8-55a8-8f52-7234b1327833" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "2448396a-ff1d-500c-8c51-993a138cf5dd" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "29a8fe73-556b-5410-9a61-750846fcfe54" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "2afbfd30-8777-57e9-abae-9172f6df384a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "2f5bfa77-d0c8-548b-8444-7455276efebb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "3a401361-75ef-591f-8ff3-23505170735a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "468107a5-0bcd-537b-b60a-6c191cd148e6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "480037b4-e62a-5ab5-abf2-0a3c53db288f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "4aa2606b-85de-5366-85ce-77a2ed3b74ee" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "4e86de78-3926-5050-aae8-0de5c27461ba" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "5812a4d9-dff2-5e30-9abc-a5060767c7f3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "6fb6e6f9-ce33-5be3-9512-fdaebf84c6c3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "798e885d-2ec5-549b-8e61-4215a1b0f6ec" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "851bdc12-af64-54d3-af8d-42e433810dfe" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "90a511d8-39e5-541e-bc05-c32712c89ac5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "a5eeaebb-6583-5204-8ba2-e9ddc03bc2d3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/21" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "acb2cf16-b7c5-58bd-bffc-a76298691da2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "b18c0cfd-c702-50da-b85c-c37f5025518f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "bf308228-ecab-5a13-bd60-33560173306f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "ce7a28be-fded-5bde-af47-889798e8658b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "daebc390-ab9b-52a4-b83f-5211b6a85df1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "dfdebf8e-2ef5-5f6f-8ce3-005d5ef537d1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "e2eda1cb-5771-5b3f-bf48-a3ee9f426424" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "endpoint_uuid": { + "uuid": "fdcce611-b4e1-5c2c-97df-89cbb45e472d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/8" + } + ], + "device_id": { + "device_uuid": { + "uuid": "a97ed48c-8dc0-599c-9ca7-c3ab0aac6a6e" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "packet-router", + "name": "R125" + }, + { + "components": [], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "127.0.0.1" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "0" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"endpoints\": [\n{\n\"uuid\": \"1/1\"\n},\n{\n\"uuid\": \"1/7\"\n},\n{\n\"uuid\": \"1/9\"\n},\n{\n\"uuid\": \"2/1\"\n},\n{\n\"uuid\": \"2/2\"\n},\n{\n\"uuid\": \"2/3\"\n},\n{\n\"uuid\": \"2/4\"\n},\n{\n\"uuid\": \"2/5\"\n},\n{\n\"uuid\": \"2/6\"\n},\n{\n\"uuid\": \"2/7\"\n},\n{\n\"uuid\": \"2/8\"\n},\n{\n\"uuid\": \"2/9\"\n},\n{\n\"uuid\": \"2/10\"\n},\n{\n\"uuid\": \"2/11\"\n},\n{\n\"uuid\": \"2/12\"\n},\n{\n\"uuid\": \"2/13\"\n},\n{\n\"uuid\": \"2/14\"\n},\n{\n\"uuid\": \"2/15\"\n},\n{\n\"uuid\": \"2/16\"\n},\n{\n\"uuid\": \"2/17\"\n},\n{\n\"uuid\": \"2/18\"\n},\n{\n\"uuid\": \"2/19\"\n},\n{\n\"uuid\": \"2/20\"\n},\n{\n\"uuid\": \"2/21\"\n},\n{\n\"uuid\": \"2/22\"\n},\n{\n\"uuid\": \"2/23\"\n},\n{\n\"uuid\": \"2/24\"\n},\n{\n\"uuid\": \"2/25\"\n},\n{\n\"uuid\": \"2/26\"\n},\n{\n\"uuid\": \"2/27\"\n},\n{\n\"uuid\": \"2/28\"\n},\n{\n\"uuid\": \"2/29\"\n},\n{\n\"uuid\": \"2/30\"\n},\n{\n\"uuid\": \"2/31\"\n},\n{\n\"uuid\": \"2/32\"\n},\n{\n\"uuid\": \"2/33\"\n},\n{\n\"uuid\": \"2/34\"\n},\n{\n\"uuid\": \"2/35\"\n},\n{\n\"uuid\": \"2/36\"\n},\n{\n\"uuid\": \"2/37\"\n},\n{\n\"uuid\": \"2/38\"\n},\n{\n\"uuid\": \"2/39\"\n},\n{\n\"uuid\": \"2/40\"\n},\n{\n\"uuid\": \"2/41\"\n},\n{\n\"uuid\": \"2/42\"\n},\n{\n\"uuid\": \"2/43\"\n},\n{\n\"uuid\": \"2/44\"\n},\n{\n\"uuid\": \"2/45\"\n},\n{\n\"uuid\": \"2/46\"\n},\n{\n\"uuid\": \"2/47\"\n},\n{\n\"uuid\": \"2/48\"\n},\n{\n\"uuid\": \"2/49\"\n},\n{\n\"uuid\": \"2/50\"\n}\n]\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/1]", + "resource_value": "{\"uuid\": \"1/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/7]", + "resource_value": "{\"uuid\": \"1/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/9]", + "resource_value": "{\"uuid\": \"1/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/1]", + "resource_value": "{\"uuid\": \"2/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/2]", + "resource_value": "{\"uuid\": \"2/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/3]", + "resource_value": "{\"uuid\": \"2/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/4]", + "resource_value": "{\"uuid\": \"2/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/5]", + "resource_value": "{\"uuid\": \"2/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/6]", + "resource_value": "{\"uuid\": \"2/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/7]", + "resource_value": "{\"uuid\": \"2/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/8]", + "resource_value": "{\"uuid\": \"2/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/9]", + "resource_value": "{\"uuid\": \"2/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/10]", + "resource_value": "{\"uuid\": \"2/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/11]", + "resource_value": "{\"uuid\": \"2/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/12]", + "resource_value": "{\"uuid\": \"2/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/13]", + "resource_value": "{\"uuid\": \"2/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/14]", + "resource_value": "{\"uuid\": \"2/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/15]", + "resource_value": "{\"uuid\": \"2/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/16]", + "resource_value": "{\"uuid\": \"2/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/17]", + "resource_value": "{\"uuid\": \"2/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/18]", + "resource_value": "{\"uuid\": \"2/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/19]", + "resource_value": "{\"uuid\": \"2/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/20]", + "resource_value": "{\"uuid\": \"2/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/21]", + "resource_value": "{\"uuid\": \"2/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/22]", + "resource_value": "{\"uuid\": \"2/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/23]", + "resource_value": "{\"uuid\": \"2/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/24]", + "resource_value": "{\"uuid\": \"2/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/25]", + "resource_value": "{\"uuid\": \"2/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/26]", + "resource_value": "{\"uuid\": \"2/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/27]", + "resource_value": "{\"uuid\": \"2/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/28]", + "resource_value": "{\"uuid\": \"2/28\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/29]", + "resource_value": "{\"uuid\": \"2/29\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/30]", + "resource_value": "{\"uuid\": \"2/30\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/31]", + "resource_value": "{\"uuid\": \"2/31\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/32]", + "resource_value": "{\"uuid\": \"2/32\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/33]", + "resource_value": "{\"uuid\": \"2/33\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/34]", + "resource_value": "{\"uuid\": \"2/34\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/35]", + "resource_value": "{\"uuid\": \"2/35\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/36]", + "resource_value": "{\"uuid\": \"2/36\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/37]", + "resource_value": "{\"uuid\": \"2/37\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/38]", + "resource_value": "{\"uuid\": \"2/38\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/39]", + "resource_value": "{\"uuid\": \"2/39\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/40]", + "resource_value": "{\"uuid\": \"2/40\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/41]", + "resource_value": "{\"uuid\": \"2/41\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/42]", + "resource_value": "{\"uuid\": \"2/42\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/43]", + "resource_value": "{\"uuid\": \"2/43\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/44]", + "resource_value": "{\"uuid\": \"2/44\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/45]", + "resource_value": "{\"uuid\": \"2/45\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/46]", + "resource_value": "{\"uuid\": \"2/46\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/47]", + "resource_value": "{\"uuid\": \"2/47\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/48]", + "resource_value": "{\"uuid\": \"2/48\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/49]", + "resource_value": "{\"uuid\": \"2/49\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/50]", + "resource_value": "{\"uuid\": \"2/50\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_UNDEFINED" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "037f7430-f5ab-5053-ac02-de41457c5a17" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "0a379200-ae33-5577-be8a-d60f45309d00" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/32" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "0a762890-e214-58b1-9228-57ec345030fc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "154fcd4d-73e7-54f1-9c05-47693f3faa01" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "1552ae79-9b32-5494-9c8e-db27d155abaf" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "15a1ac97-a829-5c29-a8a2-91caab138138" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "19e45693-9e93-5b36-a76e-f7fcfdf90ce2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/28" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "268d6497-c646-5db4-a520-8a17065ebabc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "364b4d72-cb11-59fb-9ba3-4fcdcbf1cfcd" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/34" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "37ccf393-ba82-51cf-8ee8-b16b8269b1e4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/48" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "386e4b93-4bd3-5ff6-b225-9324ef5f71f9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "39bda16d-fce5-58c8-9045-7a7e5c4d09ce" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/30" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "3dc6c727-c503-52bd-ad1c-fb96f5dbd708" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "41f9da47-4836-5eed-b1fd-bd91f68ee073" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/45" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "44029518-4863-557d-9541-dbcbcdd85640" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "4b074c39-cf2b-53bc-8db8-f587f3802647" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/21" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "52578371-33c9-5911-b0c4-eaa23f3a4e6b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "52a67a14-0196-502a-9c37-54c5dd2833d4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/38" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "5932aa92-75ad-55f5-9e0d-f0af02ad365c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "5ba0880c-8163-5db9-86e5-af27820a531e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "5c86108b-4b64-5da7-93b2-52a318a43713" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/49" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "5d47d75a-0722-56b9-888f-74dfa117fb61" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "60ffcfcb-83fd-5c9e-ac47-81145221ac66" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "650d5af8-50bf-5300-a7da-4ea6a451caf5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/41" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "6a2b55a3-6fe2-5164-a804-dff2715c8562" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "6b552eca-f001-5bca-91e5-dcbe448bbf94" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "6d31fee2-29cc-5cbc-a6e0-a8f0ce5fdba9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "708b2080-5c74-5e7e-ba58-44cae1ca7a2a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "788ca42f-7735-549c-aa3a-8d250c27e272" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/33" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "7d77f735-0bd7-5e72-8816-ced7a60f5dc8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "94a83c56-7970-5df7-9e3b-bc9f6c228aac" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "97d7fc2c-42f2-580a-ba26-9da11f079bd5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/47" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "97fe1ccd-70f1-5459-a31a-f16c173dc230" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/39" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "98c9fa61-11c7-5374-8e36-2c8955d172d5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "a8954fa0-60dc-5249-848d-4b44f73bd335" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "abac7bd2-30fe-535d-a48a-6ebb67d43476" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/50" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "ac5d6716-1be8-560e-a0c7-f8c8a198d417" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/46" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "baaedd5a-580b-5a61-89db-6803da9ee8b9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/37" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "bc92b7f6-fc30-5f94-b91b-0a92fd66475e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "be647b29-9138-50ca-99e0-1446fcbc3012" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/36" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "c5d48627-6be1-5793-8cde-267758ac5eb1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/43" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "ca7a06e1-e71b-58ea-ba35-eb710ef5f8f5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/35" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "d1779939-a1b2-55bd-98cf-d59da0fa5aa6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/31" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "d55e10ad-2953-5704-a880-e2f21b55c0cd" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "dd924310-5dbe-5fa9-a591-b348ca37e04b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/29" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "de5ea8e9-2d02-5d19-9e2b-d6c9d43db1a3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/44" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "e5a77c27-31c3-54a9-87f9-0d6d179f2fc5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "e98055ca-c229-5dfa-91ba-aeaca70f4871" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "eaeab62e-23c9-5a28-86f5-988e3d8d16e1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/40" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "ec0ed2ed-3f0e-51cd-a077-9f26f946cd72" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "f26a1731-2a94-5a8a-8fdc-a5d47bbae721" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "f4f834aa-c147-538e-8610-fbd8186914fc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "endpoint_uuid": { + "uuid": "ff15c130-3b49-5f8a-bba6-9fcb1777570f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/42" + } + ], + "device_id": { + "device_uuid": { + "uuid": "b193099b-612f-5592-90f5-9e33bbaa5892" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "emu-packet-router", + "name": "R8" + }, + { + "components": [], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "127.0.0.1" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "0" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"endpoints\": [\n{\n\"uuid\": \"1/4\"\n},\n{\n\"uuid\": \"1/8\"\n},\n{\n\"uuid\": \"1/14\"\n},\n{\n\"uuid\": \"2/1\"\n},\n{\n\"uuid\": \"2/2\"\n},\n{\n\"uuid\": \"2/3\"\n},\n{\n\"uuid\": \"2/4\"\n},\n{\n\"uuid\": \"2/5\"\n},\n{\n\"uuid\": \"2/6\"\n},\n{\n\"uuid\": \"2/7\"\n},\n{\n\"uuid\": \"2/8\"\n},\n{\n\"uuid\": \"2/9\"\n},\n{\n\"uuid\": \"2/10\"\n},\n{\n\"uuid\": \"2/11\"\n},\n{\n\"uuid\": \"2/12\"\n},\n{\n\"uuid\": \"2/13\"\n},\n{\n\"uuid\": \"2/14\"\n},\n{\n\"uuid\": \"2/15\"\n},\n{\n\"uuid\": \"2/16\"\n},\n{\n\"uuid\": \"2/17\"\n},\n{\n\"uuid\": \"2/18\"\n},\n{\n\"uuid\": \"2/19\"\n},\n{\n\"uuid\": \"2/20\"\n},\n{\n\"uuid\": \"2/21\"\n},\n{\n\"uuid\": \"2/22\"\n},\n{\n\"uuid\": \"2/23\"\n},\n{\n\"uuid\": \"2/24\"\n},\n{\n\"uuid\": \"2/25\"\n},\n{\n\"uuid\": \"2/26\"\n},\n{\n\"uuid\": \"2/27\"\n},\n{\n\"uuid\": \"2/28\"\n},\n{\n\"uuid\": \"2/29\"\n},\n{\n\"uuid\": \"2/30\"\n},\n{\n\"uuid\": \"2/31\"\n},\n{\n\"uuid\": \"2/32\"\n},\n{\n\"uuid\": \"2/33\"\n},\n{\n\"uuid\": \"2/34\"\n},\n{\n\"uuid\": \"2/35\"\n},\n{\n\"uuid\": \"2/36\"\n},\n{\n\"uuid\": \"2/37\"\n},\n{\n\"uuid\": \"2/38\"\n},\n{\n\"uuid\": \"2/39\"\n},\n{\n\"uuid\": \"2/40\"\n},\n{\n\"uuid\": \"2/41\"\n},\n{\n\"uuid\": \"2/42\"\n},\n{\n\"uuid\": \"2/43\"\n},\n{\n\"uuid\": \"2/44\"\n},\n{\n\"uuid\": \"2/45\"\n},\n{\n\"uuid\": \"2/46\"\n},\n{\n\"uuid\": \"2/47\"\n},\n{\n\"uuid\": \"2/48\"\n},\n{\n\"uuid\": \"2/49\"\n},\n{\n\"uuid\": \"2/50\"\n}\n]\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/4]", + "resource_value": "{\"uuid\": \"1/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/8]", + "resource_value": "{\"uuid\": \"1/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/14]", + "resource_value": "{\"uuid\": \"1/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/1]", + "resource_value": "{\"uuid\": \"2/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/2]", + "resource_value": "{\"uuid\": \"2/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/3]", + "resource_value": "{\"uuid\": \"2/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/4]", + "resource_value": "{\"uuid\": \"2/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/5]", + "resource_value": "{\"uuid\": \"2/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/6]", + "resource_value": "{\"uuid\": \"2/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/7]", + "resource_value": "{\"uuid\": \"2/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/8]", + "resource_value": "{\"uuid\": \"2/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/9]", + "resource_value": "{\"uuid\": \"2/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/10]", + "resource_value": "{\"uuid\": \"2/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/11]", + "resource_value": "{\"uuid\": \"2/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/12]", + "resource_value": "{\"uuid\": \"2/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/13]", + "resource_value": "{\"uuid\": \"2/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/14]", + "resource_value": "{\"uuid\": \"2/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/15]", + "resource_value": "{\"uuid\": \"2/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/16]", + "resource_value": "{\"uuid\": \"2/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/17]", + "resource_value": "{\"uuid\": \"2/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/18]", + "resource_value": "{\"uuid\": \"2/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/19]", + "resource_value": "{\"uuid\": \"2/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/20]", + "resource_value": "{\"uuid\": \"2/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/21]", + "resource_value": "{\"uuid\": \"2/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/22]", + "resource_value": "{\"uuid\": \"2/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/23]", + "resource_value": "{\"uuid\": \"2/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/24]", + "resource_value": "{\"uuid\": \"2/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/25]", + "resource_value": "{\"uuid\": \"2/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/26]", + "resource_value": "{\"uuid\": \"2/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/27]", + "resource_value": "{\"uuid\": \"2/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/28]", + "resource_value": "{\"uuid\": \"2/28\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/29]", + "resource_value": "{\"uuid\": \"2/29\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/30]", + "resource_value": "{\"uuid\": \"2/30\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/31]", + "resource_value": "{\"uuid\": \"2/31\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/32]", + "resource_value": "{\"uuid\": \"2/32\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/33]", + "resource_value": "{\"uuid\": \"2/33\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/34]", + "resource_value": "{\"uuid\": \"2/34\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/35]", + "resource_value": "{\"uuid\": \"2/35\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/36]", + "resource_value": "{\"uuid\": \"2/36\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/37]", + "resource_value": "{\"uuid\": \"2/37\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/38]", + "resource_value": "{\"uuid\": \"2/38\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/39]", + "resource_value": "{\"uuid\": \"2/39\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/40]", + "resource_value": "{\"uuid\": \"2/40\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/41]", + "resource_value": "{\"uuid\": \"2/41\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/42]", + "resource_value": "{\"uuid\": \"2/42\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/43]", + "resource_value": "{\"uuid\": \"2/43\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/44]", + "resource_value": "{\"uuid\": \"2/44\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/45]", + "resource_value": "{\"uuid\": \"2/45\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/46]", + "resource_value": "{\"uuid\": \"2/46\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/47]", + "resource_value": "{\"uuid\": \"2/47\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/48]", + "resource_value": "{\"uuid\": \"2/48\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/49]", + "resource_value": "{\"uuid\": \"2/49\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/50]", + "resource_value": "{\"uuid\": \"2/50\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_UNDEFINED" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "0100690e-3895-52c1-8a21-7b3f60c7f66c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/32" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "079a99ac-c1c3-5c5c-9c62-37aa2898cc1b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "0cc7df0f-9f6c-509f-a53c-69eaf93f6806" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "146f9064-0115-5c16-8d03-6baf42e5c3e4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/42" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "19496a31-be7c-57d9-97e7-801eb3d95904" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/43" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "1c871316-106b-5f38-85fd-20fdb63b0d6b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/41" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "1f036258-17bb-52af-9a22-45d2bbe2396e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "2068cd00-bc64-5708-9e1c-571ab79b48e2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/48" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "212753f8-a4f7-50c6-9664-847cf74514e3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "28bf479f-dcb6-5688-ae2a-b2ee5bef5e0e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/30" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "2be53199-b9dd-5d70-b5d8-696a18196cab" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/28" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "2d084e2f-2519-51d4-8c46-3e85ac9d5f72" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/29" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "354aceeb-5ef3-562c-9361-f697da38304c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/40" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "45fc7226-0545-585a-966d-6f66297f9e44" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/35" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "615fbf3a-b9e5-5257-af89-f0f94fa29543" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "639a020e-1b97-5ebc-827e-764667418879" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "678c17de-c52a-56ac-bac8-6b4ba43e4401" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/45" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "781f25f0-a6aa-50ff-9c21-b5041e90f2dc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "80f5d49e-df94-562e-ae4d-acb1033f4e14" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/38" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "84f6d7c0-0429-560e-9272-6ad942c02764" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/37" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "85e3af6f-d013-55d7-b669-00641b936fcd" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "85fa2e32-1a9a-54e1-9e10-323052ebd15b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/47" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "8c9fc634-7618-5b13-a19d-c94dc5b6f869" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/49" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "8f798e45-b64e-5f0c-a0d3-6b722bd441ff" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/44" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "962c3886-73f6-51b2-983b-3dfa7d56a7f4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "9f767898-eaea-52ff-90b4-7d81d765402a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "a42337bf-7831-5f6c-8904-537e10f07f95" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "a7eacb1f-27b3-59ca-b9fd-d46856edd254" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "a8252100-ed12-5285-86d5-3952e9ac5889" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "a8b9e525-7a34-5995-9433-0503c352b842" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "aa706ca3-6a74-5b13-8c85-80424c29ae1a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/31" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "aa8169c6-06ec-503a-81f0-9cb9fa811ef4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "aa8d4e36-ebec-5ffe-aa02-69522cd06081" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/21" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "ac836b09-bbe7-5598-a900-9dfa1b2134bb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "acf56414-a2f0-5e0c-a7b3-d3086eed6e44" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "b3818e0c-9837-5a24-9621-0d3f4ff1f531" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/33" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "b72e8207-9864-5be9-8137-dedae06e2ad6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "b95e07c2-c5b9-50f8-ba97-22278550040a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "c73cf5dc-9cae-53cc-8457-a7b9df417275" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "cb427ac2-10d8-5ee3-987a-b12dcb3244b6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/34" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "cef2a510-7d30-53a4-a512-c84f37bc4318" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "d149af55-6b39-5ac9-8cfd-e61d5a31ef43" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "d2d84901-1b9f-5432-ac64-9d6cc23d5250" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "d61bc584-a267-556a-a2fa-39dd8f6d62a5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "d8d6ef46-6890-5c4c-a3f7-5914e6e85317" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "e0e44a18-328b-5296-810d-a0be0f5dad42" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "e10afe74-90da-5675-9b9d-8179b5921c3b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "e51d12e5-d4a2-5930-8595-c784c888ef2e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/39" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "e75cde7d-83db-566c-a8c0-0bdbd79b650d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/36" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "ef57d42c-165f-5c30-adea-be1d47b1c007" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/46" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "f4d123a2-094f-5d32-a051-2a7ec4ef3e29" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "f9332cb6-604e-5bfa-81ce-5e2fd9aa0ef2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "endpoint_uuid": { + "uuid": "f93e41a9-e384-5eb3-ac73-02a62b747123" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/50" + } + ], + "device_id": { + "device_uuid": { + "uuid": "bc58922a-4cc2-59e9-bfb1-3bfe76023ba5" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "emu-packet-router", + "name": "R7" + }, + { + "components": [], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "127.0.0.1" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "0" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"endpoints\": [\n{\n\"uuid\": \"1/5\"\n},\n{\n\"uuid\": \"1/6\"\n},\n{\n\"uuid\": \"1/14\"\n},\n{\n\"uuid\": \"2/1\"\n},\n{\n\"uuid\": \"2/2\"\n},\n{\n\"uuid\": \"2/3\"\n},\n{\n\"uuid\": \"2/4\"\n},\n{\n\"uuid\": \"2/5\"\n},\n{\n\"uuid\": \"2/6\"\n},\n{\n\"uuid\": \"2/7\"\n},\n{\n\"uuid\": \"2/8\"\n},\n{\n\"uuid\": \"2/9\"\n},\n{\n\"uuid\": \"2/10\"\n},\n{\n\"uuid\": \"2/11\"\n},\n{\n\"uuid\": \"2/12\"\n},\n{\n\"uuid\": \"2/13\"\n},\n{\n\"uuid\": \"2/14\"\n},\n{\n\"uuid\": \"2/15\"\n},\n{\n\"uuid\": \"2/16\"\n},\n{\n\"uuid\": \"2/17\"\n},\n{\n\"uuid\": \"2/18\"\n},\n{\n\"uuid\": \"2/19\"\n},\n{\n\"uuid\": \"2/20\"\n},\n{\n\"uuid\": \"2/21\"\n},\n{\n\"uuid\": \"2/22\"\n},\n{\n\"uuid\": \"2/23\"\n},\n{\n\"uuid\": \"2/24\"\n},\n{\n\"uuid\": \"2/25\"\n},\n{\n\"uuid\": \"2/26\"\n},\n{\n\"uuid\": \"2/27\"\n},\n{\n\"uuid\": \"2/28\"\n},\n{\n\"uuid\": \"2/29\"\n},\n{\n\"uuid\": \"2/30\"\n},\n{\n\"uuid\": \"2/31\"\n},\n{\n\"uuid\": \"2/32\"\n},\n{\n\"uuid\": \"2/33\"\n},\n{\n\"uuid\": \"2/34\"\n},\n{\n\"uuid\": \"2/35\"\n},\n{\n\"uuid\": \"2/36\"\n},\n{\n\"uuid\": \"2/37\"\n},\n{\n\"uuid\": \"2/38\"\n},\n{\n\"uuid\": \"2/39\"\n},\n{\n\"uuid\": \"2/40\"\n},\n{\n\"uuid\": \"2/41\"\n},\n{\n\"uuid\": \"2/42\"\n},\n{\n\"uuid\": \"2/43\"\n},\n{\n\"uuid\": \"2/44\"\n},\n{\n\"uuid\": \"2/45\"\n},\n{\n\"uuid\": \"2/46\"\n},\n{\n\"uuid\": \"2/47\"\n},\n{\n\"uuid\": \"2/48\"\n},\n{\n\"uuid\": \"2/49\"\n},\n{\n\"uuid\": \"2/50\"\n}\n]\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/5]", + "resource_value": "{\"uuid\": \"1/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/6]", + "resource_value": "{\"uuid\": \"1/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/14]", + "resource_value": "{\"uuid\": \"1/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/1]", + "resource_value": "{\"uuid\": \"2/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/2]", + "resource_value": "{\"uuid\": \"2/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/3]", + "resource_value": "{\"uuid\": \"2/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/4]", + "resource_value": "{\"uuid\": \"2/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/5]", + "resource_value": "{\"uuid\": \"2/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/6]", + "resource_value": "{\"uuid\": \"2/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/7]", + "resource_value": "{\"uuid\": \"2/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/8]", + "resource_value": "{\"uuid\": \"2/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/9]", + "resource_value": "{\"uuid\": \"2/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/10]", + "resource_value": "{\"uuid\": \"2/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/11]", + "resource_value": "{\"uuid\": \"2/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/12]", + "resource_value": "{\"uuid\": \"2/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/13]", + "resource_value": "{\"uuid\": \"2/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/14]", + "resource_value": "{\"uuid\": \"2/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/15]", + "resource_value": "{\"uuid\": \"2/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/16]", + "resource_value": "{\"uuid\": \"2/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/17]", + "resource_value": "{\"uuid\": \"2/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/18]", + "resource_value": "{\"uuid\": \"2/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/19]", + "resource_value": "{\"uuid\": \"2/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/20]", + "resource_value": "{\"uuid\": \"2/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/21]", + "resource_value": "{\"uuid\": \"2/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/22]", + "resource_value": "{\"uuid\": \"2/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/23]", + "resource_value": "{\"uuid\": \"2/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/24]", + "resource_value": "{\"uuid\": \"2/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/25]", + "resource_value": "{\"uuid\": \"2/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/26]", + "resource_value": "{\"uuid\": \"2/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/27]", + "resource_value": "{\"uuid\": \"2/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/28]", + "resource_value": "{\"uuid\": \"2/28\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/29]", + "resource_value": "{\"uuid\": \"2/29\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/30]", + "resource_value": "{\"uuid\": \"2/30\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/31]", + "resource_value": "{\"uuid\": \"2/31\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/32]", + "resource_value": "{\"uuid\": \"2/32\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/33]", + "resource_value": "{\"uuid\": \"2/33\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/34]", + "resource_value": "{\"uuid\": \"2/34\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/35]", + "resource_value": "{\"uuid\": \"2/35\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/36]", + "resource_value": "{\"uuid\": \"2/36\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/37]", + "resource_value": "{\"uuid\": \"2/37\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/38]", + "resource_value": "{\"uuid\": \"2/38\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/39]", + "resource_value": "{\"uuid\": \"2/39\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/40]", + "resource_value": "{\"uuid\": \"2/40\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/41]", + "resource_value": "{\"uuid\": \"2/41\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/42]", + "resource_value": "{\"uuid\": \"2/42\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/43]", + "resource_value": "{\"uuid\": \"2/43\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/44]", + "resource_value": "{\"uuid\": \"2/44\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/45]", + "resource_value": "{\"uuid\": \"2/45\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/46]", + "resource_value": "{\"uuid\": \"2/46\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/47]", + "resource_value": "{\"uuid\": \"2/47\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/48]", + "resource_value": "{\"uuid\": \"2/48\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/49]", + "resource_value": "{\"uuid\": \"2/49\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/50]", + "resource_value": "{\"uuid\": \"2/50\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[ELAN-AC:000]", + "resource_value": "{\"name\": \"ELAN-AC:000\", \"type\": \"L2VSI\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[1/5.000]/subinterface[0]", + "resource_value": "{\"index\": 0, \"name\": \"1/5.000\", \"type\": \"l2vlan\", \"vlan_id\": \"111\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[ELAN-AC:000]/interface[1/5.000]", + "resource_value": "{\"id\": \"1/5.000\", \"interface\": \"1/5.000\", \"name\": \"ELAN-AC:000\", \"subinterface\": 0}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[ELAN-AC:000]/connection_point[VC-1]", + "resource_value": "{\"VC_ID\": \"000\", \"connection_point\": \"VC-1\", \"name\": \"ELAN-AC:000\", \"remote_system\": \"0.0.0.0\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_UNDEFINED" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "0084615d-9ee8-5c20-9d90-b39919d29e41" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "0b2a9589-abc6-594b-82ec-9f78abe62ee8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "13bb84e0-840c-5c33-a49c-90b6a3ed42e7" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "13f577e6-22d1-5e74-87bf-a4637070ca66" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/43" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "1db66d37-657a-5e6f-b041-8b06b98d7acc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "1f9dda95-ce9c-521c-b266-78ef2fa7f4c2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/34" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "22aa739b-9c97-5b16-8b0a-b20e23b99c3f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "28a1229c-6605-5887-9b5d-71cc797735a8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "2d0dc070-f7c4-57ae-b591-772e52a9c6ad" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "31d345a2-79fe-57b1-a5d0-7f6cc2b9ce7f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "357f8504-89bc-5de7-b9ca-2c844902c433" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "381bac1d-e967-541a-919d-c0bcaafe42b4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "3a313405-5a41-5c76-a320-8197740a098c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "3db0a124-c38e-5618-ac0a-2fca33b384f2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "41291f42-94ff-55f1-a497-5197d7d8cdb5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/46" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "43b0c971-7239-5345-b079-d590582f83c2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "45081e48-0505-513f-b1f0-6b21a5005b44" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/44" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "4eeb9876-4ef8-5e33-9711-bf317bc8d432" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/47" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "506d8a04-f42c-50a6-9105-593feb3e12fa" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/42" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "5534e9bb-eac0-59b9-a5c7-3e6991a93bed" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/28" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "55c1c4ae-6430-5a1f-95df-05cf1c6b92e8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "566b9c46-d7fd-5d84-99e0-1f60b0efc4a3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "5ce767d8-2c33-54cb-bfad-6b034a806f4e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "675c0b5c-430b-51f3-9af6-f6aea569332b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "7011cd9a-c0ed-587f-a5ab-12574c3be5c3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/48" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "7aaf3ea9-1599-5494-9505-8a4e051b8c6c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/35" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "7ac6bbaa-8a09-57d4-a0b1-855725ba4182" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/41" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "8ae1c361-f3d5-56b6-acb9-c895c7a3cd88" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/37" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "8ec7d9ca-831b-5915-aa4b-dc34aec0c410" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/38" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "9298b921-f122-5eee-9056-87a20e26b60f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "966cd010-8153-5cec-aa23-27a71d3ff751" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "97ac3b56-cf17-501a-9036-69a13ca765a8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "9add37aa-b443-5401-a462-6d445ea932d2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/30" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "9bcfa964-bb10-5236-84a3-df5b164abbf0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/33" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "9e14fa09-52ca-557d-bf16-cf42e0389d1f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/39" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "a7d9714c-72fb-5b72-930c-8d2b6784b283" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "a8cf2848-336e-5c46-ba54-0bf5ba3f7f18" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "adce05cd-a9df-5e82-aa1b-ec5e39c8bffa" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "ae22cace-e779-53ee-b62f-f1d6e45b7f7e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "ae708852-0637-523a-80c5-f7189203e6eb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/50" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "c0eb57ad-3794-5074-8719-3b9e60887457" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/21" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "c3431acf-ec73-54b2-8819-306361e42c77" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/40" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "c87fa96a-4c63-5a04-b056-6e64bb6c852d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "ca171433-75f4-57b8-94f5-13f3427df375" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/36" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "d5ad7003-2f5b-5bad-9f13-786361255217" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/29" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "e3f124b0-29d2-5a95-a756-0464a58a9874" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/45" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "e63d7bc0-289f-5c7b-82f0-5e3144ec6b79" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/49" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "e6e19828-37d4-55fc-bac8-d82923a1e757" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/32" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "e9f29af9-a987-5758-91cf-1d145522f2ea" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "eae2b879-812a-5d03-945f-9a459ee46ffa" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "eeaa592c-3593-58b6-a074-4b6f24b719be" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "ef6f5552-25a5-5a47-97ff-ae9e6790d1ff" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/31" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "endpoint_uuid": { + "uuid": "f3720b6f-2a59-5a60-98c9-cf91109b317b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/27" + } + ], + "device_id": { + "device_uuid": { + "uuid": "c944aaeb-bbdf-5f2d-b31c-8cc8903045b6" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "emu-packet-router", + "name": "R2" + }, + { + "components": [], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "127.0.0.1" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "0" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"endpoints\": [\n{\n\"uuid\": \"1/4\"\n},\n{\n\"uuid\": \"1/6\"\n},\n{\n\"uuid\": \"1/10\"\n},\n{\n\"uuid\": \"2/1\"\n},\n{\n\"uuid\": \"2/2\"\n},\n{\n\"uuid\": \"2/3\"\n},\n{\n\"uuid\": \"2/4\"\n},\n{\n\"uuid\": \"2/5\"\n},\n{\n\"uuid\": \"2/6\"\n},\n{\n\"uuid\": \"2/7\"\n},\n{\n\"uuid\": \"2/8\"\n},\n{\n\"uuid\": \"2/9\"\n},\n{\n\"uuid\": \"2/10\"\n},\n{\n\"uuid\": \"2/11\"\n},\n{\n\"uuid\": \"2/12\"\n},\n{\n\"uuid\": \"2/13\"\n},\n{\n\"uuid\": \"2/14\"\n},\n{\n\"uuid\": \"2/15\"\n},\n{\n\"uuid\": \"2/16\"\n},\n{\n\"uuid\": \"2/17\"\n},\n{\n\"uuid\": \"2/18\"\n},\n{\n\"uuid\": \"2/19\"\n},\n{\n\"uuid\": \"2/20\"\n},\n{\n\"uuid\": \"2/21\"\n},\n{\n\"uuid\": \"2/22\"\n},\n{\n\"uuid\": \"2/23\"\n},\n{\n\"uuid\": \"2/24\"\n},\n{\n\"uuid\": \"2/25\"\n},\n{\n\"uuid\": \"2/26\"\n},\n{\n\"uuid\": \"2/27\"\n},\n{\n\"uuid\": \"2/28\"\n},\n{\n\"uuid\": \"2/29\"\n},\n{\n\"uuid\": \"2/30\"\n},\n{\n\"uuid\": \"2/31\"\n},\n{\n\"uuid\": \"2/32\"\n},\n{\n\"uuid\": \"2/33\"\n},\n{\n\"uuid\": \"2/34\"\n},\n{\n\"uuid\": \"2/35\"\n},\n{\n\"uuid\": \"2/36\"\n},\n{\n\"uuid\": \"2/37\"\n},\n{\n\"uuid\": \"2/38\"\n},\n{\n\"uuid\": \"2/39\"\n},\n{\n\"uuid\": \"2/40\"\n},\n{\n\"uuid\": \"2/41\"\n},\n{\n\"uuid\": \"2/42\"\n},\n{\n\"uuid\": \"2/43\"\n},\n{\n\"uuid\": \"2/44\"\n},\n{\n\"uuid\": \"2/45\"\n},\n{\n\"uuid\": \"2/46\"\n},\n{\n\"uuid\": \"2/47\"\n},\n{\n\"uuid\": \"2/48\"\n},\n{\n\"uuid\": \"2/49\"\n},\n{\n\"uuid\": \"2/50\"\n}\n]\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/4]", + "resource_value": "{\"uuid\": \"1/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/6]", + "resource_value": "{\"uuid\": \"1/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/10]", + "resource_value": "{\"uuid\": \"1/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/1]", + "resource_value": "{\"uuid\": \"2/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/2]", + "resource_value": "{\"uuid\": \"2/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/3]", + "resource_value": "{\"uuid\": \"2/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/4]", + "resource_value": "{\"uuid\": \"2/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/5]", + "resource_value": "{\"uuid\": \"2/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/6]", + "resource_value": "{\"uuid\": \"2/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/7]", + "resource_value": "{\"uuid\": \"2/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/8]", + "resource_value": "{\"uuid\": \"2/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/9]", + "resource_value": "{\"uuid\": \"2/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/10]", + "resource_value": "{\"uuid\": \"2/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/11]", + "resource_value": "{\"uuid\": \"2/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/12]", + "resource_value": "{\"uuid\": \"2/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/13]", + "resource_value": "{\"uuid\": \"2/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/14]", + "resource_value": "{\"uuid\": \"2/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/15]", + "resource_value": "{\"uuid\": \"2/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/16]", + "resource_value": "{\"uuid\": \"2/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/17]", + "resource_value": "{\"uuid\": \"2/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/18]", + "resource_value": "{\"uuid\": \"2/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/19]", + "resource_value": "{\"uuid\": \"2/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/20]", + "resource_value": "{\"uuid\": \"2/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/21]", + "resource_value": "{\"uuid\": \"2/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/22]", + "resource_value": "{\"uuid\": \"2/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/23]", + "resource_value": "{\"uuid\": \"2/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/24]", + "resource_value": "{\"uuid\": \"2/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/25]", + "resource_value": "{\"uuid\": \"2/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/26]", + "resource_value": "{\"uuid\": \"2/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/27]", + "resource_value": "{\"uuid\": \"2/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/28]", + "resource_value": "{\"uuid\": \"2/28\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/29]", + "resource_value": "{\"uuid\": \"2/29\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/30]", + "resource_value": "{\"uuid\": \"2/30\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/31]", + "resource_value": "{\"uuid\": \"2/31\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/32]", + "resource_value": "{\"uuid\": \"2/32\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/33]", + "resource_value": "{\"uuid\": \"2/33\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/34]", + "resource_value": "{\"uuid\": \"2/34\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/35]", + "resource_value": "{\"uuid\": \"2/35\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/36]", + "resource_value": "{\"uuid\": \"2/36\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/37]", + "resource_value": "{\"uuid\": \"2/37\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/38]", + "resource_value": "{\"uuid\": \"2/38\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/39]", + "resource_value": "{\"uuid\": \"2/39\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/40]", + "resource_value": "{\"uuid\": \"2/40\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/41]", + "resource_value": "{\"uuid\": \"2/41\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/42]", + "resource_value": "{\"uuid\": \"2/42\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/43]", + "resource_value": "{\"uuid\": \"2/43\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/44]", + "resource_value": "{\"uuid\": \"2/44\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/45]", + "resource_value": "{\"uuid\": \"2/45\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/46]", + "resource_value": "{\"uuid\": \"2/46\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/47]", + "resource_value": "{\"uuid\": \"2/47\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/48]", + "resource_value": "{\"uuid\": \"2/48\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/49]", + "resource_value": "{\"uuid\": \"2/49\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/50]", + "resource_value": "{\"uuid\": \"2/50\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_UNDEFINED" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "03eff8fd-7cd6-5c17-bc04-027d8184f9e8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "09e10417-951d-5c7c-91b1-9dce994f3d58" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/41" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "10de7378-62ba-5b11-b9de-f74142827224" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/44" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "128709cf-0fed-50ad-9329-0bbcc4e28d61" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "13ebd77c-55a7-5a40-a5fe-442f7b2b1071" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "14e44da2-a3bc-5c98-9b44-4275f0be6484" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "1e4cf7b4-60a4-5a13-aef1-5399d3d062b6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "20ab8e79-1099-5cb1-a957-2dc9889f14e6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/38" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "224647f3-683b-5cfe-b641-21cb1cd9cc1a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/48" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "2cd45b0a-36a6-523a-8b6e-7a3deb67de37" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "3cb074d0-5ee3-5790-b9f9-9f76c3aea143" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "3f554f40-68a3-5b8d-9979-658a11970cb5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "432abfe6-927c-5085-9111-3a95f9ebd218" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "49d88e1a-b91a-5fda-bcdf-930b69c25787" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "4b3d6bbd-3ea3-56a6-8b50-5c152cba93a5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "4d5956bc-8a98-52b2-a1b2-b6a172a85314" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "5e25b4b5-fe42-548c-a839-5edd214f8e76" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "6756b6f2-0157-5084-afa8-d5fa6993ad4c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/35" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "68af6907-fbc3-5bc4-8207-2dcc7a87a1fd" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/46" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "712bff5c-b7ad-5871-9462-0a25f5c5d20b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "71662469-a8ee-5764-891a-420f25086c15" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/43" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "7a3235cd-d8dd-5be4-a984-710906843dd4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/39" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "7ed377cc-7df6-5922-9b4e-7d65ac5fe442" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "812c93a6-95ae-550f-82d3-7b12914b0f74" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "83479b0e-929d-5be7-a12e-ffcb91eddf64" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "8496f85b-7e4e-59be-b467-2983d2069c1e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "8addb2d0-3f3f-5a06-bdb6-08fdb572555d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/42" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "98479548-4d3a-57e0-854e-badb61675c0e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/50" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "9e01a7c7-b408-5f36-9b8c-1faa87d66730" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/28" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "9f1fecc8-c29e-539f-803c-0b491bb89f80" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/49" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "a1383e4c-97c2-55c9-9bcc-4bec854d81aa" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/40" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "aa08da93-23dd-57ed-82c2-669cd77c9c35" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/34" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "aeacd3d9-b961-51b7-b26b-14f81b9afca0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/45" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "b441b8ab-da87-5fca-87f1-869b7a716e04" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "b5ab414c-a510-5ce5-91b0-82f3c67bdc1f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/32" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "bf2bca6f-f662-5f4a-a690-f5b4438ba86f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "c1808b35-b562-5bd6-ab08-e3b8905b8f2d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "c34823f6-ca28-58e4-8517-fd8c99ce0b6d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "c5c40c28-1b6f-528e-afec-d1326eca4cc8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "c6437ab5-6e5b-5f5a-8ea6-5b901f09b43c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/30" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "d1deef50-0782-5feb-80ba-78ed6d9a6e3b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/36" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "d2ce8b55-d1d1-5e97-965a-5ba607ae33fc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "d35343cd-2d91-5e8e-9560-ad439996c5eb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "d471ae0a-b7c3-5883-a597-bf076b9b335c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/47" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "dc979840-e6ef-5a4c-9a79-ed52e2c8069c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/37" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "dd1b9b1d-51b3-5a97-96e3-5c83d739db98" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/29" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "e54fa1f6-08ec-5623-9235-70e977d9d287" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "e820464d-7d21-5fa9-95e4-94e9e2b69d7a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "e8ffce6a-0bd2-5939-b923-de9e883f8d6e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/33" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "eb934cc2-89aa-54ae-8116-6c28f3d25516" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/31" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "f30f66e0-9f39-584e-ae9e-5657df5f7abc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "f81506a6-48fb-5b91-882c-3fb508f7f477" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/21" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "endpoint_uuid": { + "uuid": "fa42214f-5919-5e4d-81bd-62873f9fae53" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/9" + } + ], + "device_id": { + "device_uuid": { + "uuid": "cb20a7ad-5b7f-54c0-869b-5a2aa6c9ea5c" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "emu-packet-router", + "name": "R12" + }, + { + "components": [], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "127.0.0.1" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "0" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"endpoints\": [\n{\n\"uuid\": \"1/5\"\n},\n{\n\"uuid\": \"1/6\"\n},\n{\n\"uuid\": \"1/7\"\n},\n{\n\"uuid\": \"1/9\"\n},\n{\n\"uuid\": \"1/11\"\n},\n{\n\"uuid\": \"1/12\"\n},\n{\n\"uuid\": \"2/1\"\n},\n{\n\"uuid\": \"2/2\"\n},\n{\n\"uuid\": \"2/3\"\n},\n{\n\"uuid\": \"2/4\"\n},\n{\n\"uuid\": \"2/5\"\n},\n{\n\"uuid\": \"2/6\"\n},\n{\n\"uuid\": \"2/7\"\n},\n{\n\"uuid\": \"2/8\"\n},\n{\n\"uuid\": \"2/9\"\n},\n{\n\"uuid\": \"2/10\"\n},\n{\n\"uuid\": \"2/11\"\n},\n{\n\"uuid\": \"2/12\"\n},\n{\n\"uuid\": \"2/13\"\n},\n{\n\"uuid\": \"2/14\"\n},\n{\n\"uuid\": \"2/15\"\n},\n{\n\"uuid\": \"2/16\"\n},\n{\n\"uuid\": \"2/17\"\n},\n{\n\"uuid\": \"2/18\"\n},\n{\n\"uuid\": \"2/19\"\n},\n{\n\"uuid\": \"2/20\"\n},\n{\n\"uuid\": \"2/21\"\n},\n{\n\"uuid\": \"2/22\"\n},\n{\n\"uuid\": \"2/23\"\n},\n{\n\"uuid\": \"2/24\"\n},\n{\n\"uuid\": \"2/25\"\n},\n{\n\"uuid\": \"2/26\"\n},\n{\n\"uuid\": \"2/27\"\n},\n{\n\"uuid\": \"2/28\"\n},\n{\n\"uuid\": \"2/29\"\n},\n{\n\"uuid\": \"2/30\"\n},\n{\n\"uuid\": \"2/31\"\n},\n{\n\"uuid\": \"2/32\"\n},\n{\n\"uuid\": \"2/33\"\n},\n{\n\"uuid\": \"2/34\"\n},\n{\n\"uuid\": \"2/35\"\n},\n{\n\"uuid\": \"2/36\"\n},\n{\n\"uuid\": \"2/37\"\n},\n{\n\"uuid\": \"2/38\"\n},\n{\n\"uuid\": \"2/39\"\n},\n{\n\"uuid\": \"2/40\"\n},\n{\n\"uuid\": \"2/41\"\n},\n{\n\"uuid\": \"2/42\"\n},\n{\n\"uuid\": \"2/43\"\n},\n{\n\"uuid\": \"2/44\"\n},\n{\n\"uuid\": \"2/45\"\n},\n{\n\"uuid\": \"2/46\"\n},\n{\n\"uuid\": \"2/47\"\n},\n{\n\"uuid\": \"2/48\"\n},\n{\n\"uuid\": \"2/49\"\n},\n{\n\"uuid\": \"2/50\"\n}\n]\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/5]", + "resource_value": "{\"uuid\": \"1/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/6]", + "resource_value": "{\"uuid\": \"1/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/7]", + "resource_value": "{\"uuid\": \"1/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/9]", + "resource_value": "{\"uuid\": \"1/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/11]", + "resource_value": "{\"uuid\": \"1/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/12]", + "resource_value": "{\"uuid\": \"1/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/1]", + "resource_value": "{\"uuid\": \"2/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/2]", + "resource_value": "{\"uuid\": \"2/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/3]", + "resource_value": "{\"uuid\": \"2/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/4]", + "resource_value": "{\"uuid\": \"2/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/5]", + "resource_value": "{\"uuid\": \"2/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/6]", + "resource_value": "{\"uuid\": \"2/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/7]", + "resource_value": "{\"uuid\": \"2/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/8]", + "resource_value": "{\"uuid\": \"2/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/9]", + "resource_value": "{\"uuid\": \"2/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/10]", + "resource_value": "{\"uuid\": \"2/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/11]", + "resource_value": "{\"uuid\": \"2/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/12]", + "resource_value": "{\"uuid\": \"2/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/13]", + "resource_value": "{\"uuid\": \"2/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/14]", + "resource_value": "{\"uuid\": \"2/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/15]", + "resource_value": "{\"uuid\": \"2/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/16]", + "resource_value": "{\"uuid\": \"2/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/17]", + "resource_value": "{\"uuid\": \"2/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/18]", + "resource_value": "{\"uuid\": \"2/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/19]", + "resource_value": "{\"uuid\": \"2/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/20]", + "resource_value": "{\"uuid\": \"2/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/21]", + "resource_value": "{\"uuid\": \"2/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/22]", + "resource_value": "{\"uuid\": \"2/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/23]", + "resource_value": "{\"uuid\": \"2/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/24]", + "resource_value": "{\"uuid\": \"2/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/25]", + "resource_value": "{\"uuid\": \"2/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/26]", + "resource_value": "{\"uuid\": \"2/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/27]", + "resource_value": "{\"uuid\": \"2/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/28]", + "resource_value": "{\"uuid\": \"2/28\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/29]", + "resource_value": "{\"uuid\": \"2/29\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/30]", + "resource_value": "{\"uuid\": \"2/30\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/31]", + "resource_value": "{\"uuid\": \"2/31\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/32]", + "resource_value": "{\"uuid\": \"2/32\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/33]", + "resource_value": "{\"uuid\": \"2/33\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/34]", + "resource_value": "{\"uuid\": \"2/34\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/35]", + "resource_value": "{\"uuid\": \"2/35\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/36]", + "resource_value": "{\"uuid\": \"2/36\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/37]", + "resource_value": "{\"uuid\": \"2/37\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/38]", + "resource_value": "{\"uuid\": \"2/38\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/39]", + "resource_value": "{\"uuid\": \"2/39\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/40]", + "resource_value": "{\"uuid\": \"2/40\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/41]", + "resource_value": "{\"uuid\": \"2/41\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/42]", + "resource_value": "{\"uuid\": \"2/42\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/43]", + "resource_value": "{\"uuid\": \"2/43\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/44]", + "resource_value": "{\"uuid\": \"2/44\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/45]", + "resource_value": "{\"uuid\": \"2/45\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/46]", + "resource_value": "{\"uuid\": \"2/46\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/47]", + "resource_value": "{\"uuid\": \"2/47\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/48]", + "resource_value": "{\"uuid\": \"2/48\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/49]", + "resource_value": "{\"uuid\": \"2/49\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/50]", + "resource_value": "{\"uuid\": \"2/50\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_UNDEFINED" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "05661ed1-3e9d-5fa0-9373-9ed4eb5ab3bc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "11c69adf-559e-5534-9233-bf70df2748cb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "13d6baa1-009e-5abb-a510-0046213c49d6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/42" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "18b7ea84-9a40-5969-9663-7c5a5cf12e37" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "2131c85a-44e4-5cdb-8651-20ab0736117c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "24210426-b86e-53c1-a3fd-b143eadc9717" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/32" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "27dc9cd6-4375-5067-9be2-904cd283cec0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "2b76b851-ebf9-5e90-adde-67d4f86f722c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "2f972610-1dd8-578b-b724-ab9158ef8f7e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "30fe8a90-681c-5964-918d-5fa0ba83183d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/50" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "33b1e706-e68e-5b1b-97d7-ed32f40e64b2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/29" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "39643748-adf4-5258-9603-3987f4ef9a4e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/45" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "39985bbe-3fa1-5827-b010-3cb67fa68067" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "3e15b4df-5b29-560f-99e1-961f88512c77" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "4114ad6a-8488-530a-8149-3d9c08fd2aea" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/21" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "47bb825a-892d-5764-804c-ba82fe4a1ef6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "58792e02-ec97-53db-880e-7da6e8acd9ba" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/40" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "5b934da6-2f79-55de-b592-48b86e336b28" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "5dd48c55-cc16-53d5-91ad-90d405964d13" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "693fce09-3d31-5efe-9d93-274cb3f5e981" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "7349ec90-121a-5a0c-bb17-ae34ae0b1243" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "78552442-91f4-5479-986c-97e69defb056" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "7b82279e-791c-5a52-ac86-8c8198922e59" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "81e87ce4-62cb-59f4-b2d7-5165038a4b6e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/35" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "828fee99-f0ff-5fca-b531-97f8e0e14a51" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "846d1ffa-c868-5000-90cc-2f5749b0c553" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/39" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "84faa49c-e3cc-5d60-9599-f0d2029d9df7" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "8b036261-5965-54ca-92dd-23c2a9c48859" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "8cc1349e-3a12-5f04-bb57-951191756b03" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "8d12e4e4-d407-587f-b859-9bb2b0c6767c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/46" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "902733fb-61de-5bc9-8d9d-a49de1569ce1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/49" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "9b4f8481-1fb1-5e72-bd7b-ef9f09fbd035" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "9d1a54b7-cf7c-553f-a827-20c69ed24a27" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "aa6ba73a-462f-55be-ba5f-c07aa76e75d5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/31" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "ab3a7b0e-89e0-5297-8787-3416118f8274" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "af898720-14f6-55e3-baf0-4cecf1c18531" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "b7371df6-39bc-5cbf-8fc0-a760fcf3e50e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/44" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "bbf23ce1-a56f-5c9a-b46f-1d82f5e78e59" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/47" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "c48f5af0-ff48-50de-ba87-c7d908361458" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "ca729bde-b5de-5e0f-b8dd-916b27ff17d8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/41" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "ca92ca24-5a5d-5cc6-8e00-932f3efaacb1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/43" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "d64cca05-2f6e-5ddd-a9eb-dee064fd1676" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/38" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "daacf08c-4ca9-538f-ac3d-1bf7c7b9bc0a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "dbc84f66-7c04-57a2-9cb5-56ec2c598127" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "de2e77ea-caf2-5a8b-836a-ba44a09e75d6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/34" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "e0863a90-2e41-553b-8df6-7f834aae8cfd" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "e12d9832-e64a-5bad-851f-c503ceecbbc0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/33" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "e1fc5ca3-08a8-55ae-8001-020d2d85c829" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "e3fa040b-21e5-5bc6-91c3-9505956d3c07" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "e41107ff-90a4-5d7b-afb3-9ba6885f3ed9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/30" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "e86d3b79-08eb-5734-b0cf-1f0c98767856" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "ebae031f-0001-516d-9408-5905d7fe58c3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/36" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "fa0cf8e5-1890-56bb-98a3-64721f655b00" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/28" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "fb42b232-bfcb-5331-83f2-1064bdd1084f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "fc784924-f2e2-58b5-8993-a04f52829439" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/37" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "endpoint_uuid": { + "uuid": "febed417-0137-50c1-9050-c2118fe85463" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/48" + } + ], + "device_id": { + "device_uuid": { + "uuid": "df5dbb93-a154-5587-8195-f74f12bbcdf9" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "emu-packet-router", + "name": "R4" + }, + { + "components": [], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "127.0.0.1" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "0" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"endpoints\": [\n{\n\"uuid\": \"1/3\"\n},\n{\n\"uuid\": \"1/11\"\n},\n{\n\"uuid\": \"1/12\"\n},\n{\n\"uuid\": \"2/1\"\n},\n{\n\"uuid\": \"2/2\"\n},\n{\n\"uuid\": \"2/3\"\n},\n{\n\"uuid\": \"2/4\"\n},\n{\n\"uuid\": \"2/5\"\n},\n{\n\"uuid\": \"2/6\"\n},\n{\n\"uuid\": \"2/7\"\n},\n{\n\"uuid\": \"2/8\"\n},\n{\n\"uuid\": \"2/9\"\n},\n{\n\"uuid\": \"2/10\"\n},\n{\n\"uuid\": \"2/11\"\n},\n{\n\"uuid\": \"2/12\"\n},\n{\n\"uuid\": \"2/13\"\n},\n{\n\"uuid\": \"2/14\"\n},\n{\n\"uuid\": \"2/15\"\n},\n{\n\"uuid\": \"2/16\"\n},\n{\n\"uuid\": \"2/17\"\n},\n{\n\"uuid\": \"2/18\"\n},\n{\n\"uuid\": \"2/19\"\n},\n{\n\"uuid\": \"2/20\"\n},\n{\n\"uuid\": \"2/21\"\n},\n{\n\"uuid\": \"2/22\"\n},\n{\n\"uuid\": \"2/23\"\n},\n{\n\"uuid\": \"2/24\"\n},\n{\n\"uuid\": \"2/25\"\n},\n{\n\"uuid\": \"2/26\"\n},\n{\n\"uuid\": \"2/27\"\n},\n{\n\"uuid\": \"2/28\"\n},\n{\n\"uuid\": \"2/29\"\n},\n{\n\"uuid\": \"2/30\"\n},\n{\n\"uuid\": \"2/31\"\n},\n{\n\"uuid\": \"2/32\"\n},\n{\n\"uuid\": \"2/33\"\n},\n{\n\"uuid\": \"2/34\"\n},\n{\n\"uuid\": \"2/35\"\n},\n{\n\"uuid\": \"2/36\"\n},\n{\n\"uuid\": \"2/37\"\n},\n{\n\"uuid\": \"2/38\"\n},\n{\n\"uuid\": \"2/39\"\n},\n{\n\"uuid\": \"2/40\"\n},\n{\n\"uuid\": \"2/41\"\n},\n{\n\"uuid\": \"2/42\"\n},\n{\n\"uuid\": \"2/43\"\n},\n{\n\"uuid\": \"2/44\"\n},\n{\n\"uuid\": \"2/45\"\n},\n{\n\"uuid\": \"2/46\"\n},\n{\n\"uuid\": \"2/47\"\n},\n{\n\"uuid\": \"2/48\"\n},\n{\n\"uuid\": \"2/49\"\n},\n{\n\"uuid\": \"2/50\"\n}\n]\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/3]", + "resource_value": "{\"uuid\": \"1/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/11]", + "resource_value": "{\"uuid\": \"1/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/12]", + "resource_value": "{\"uuid\": \"1/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/1]", + "resource_value": "{\"uuid\": \"2/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/2]", + "resource_value": "{\"uuid\": \"2/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/3]", + "resource_value": "{\"uuid\": \"2/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/4]", + "resource_value": "{\"uuid\": \"2/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/5]", + "resource_value": "{\"uuid\": \"2/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/6]", + "resource_value": "{\"uuid\": \"2/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/7]", + "resource_value": "{\"uuid\": \"2/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/8]", + "resource_value": "{\"uuid\": \"2/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/9]", + "resource_value": "{\"uuid\": \"2/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/10]", + "resource_value": "{\"uuid\": \"2/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/11]", + "resource_value": "{\"uuid\": \"2/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/12]", + "resource_value": "{\"uuid\": \"2/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/13]", + "resource_value": "{\"uuid\": \"2/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/14]", + "resource_value": "{\"uuid\": \"2/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/15]", + "resource_value": "{\"uuid\": \"2/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/16]", + "resource_value": "{\"uuid\": \"2/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/17]", + "resource_value": "{\"uuid\": \"2/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/18]", + "resource_value": "{\"uuid\": \"2/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/19]", + "resource_value": "{\"uuid\": \"2/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/20]", + "resource_value": "{\"uuid\": \"2/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/21]", + "resource_value": "{\"uuid\": \"2/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/22]", + "resource_value": "{\"uuid\": \"2/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/23]", + "resource_value": "{\"uuid\": \"2/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/24]", + "resource_value": "{\"uuid\": \"2/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/25]", + "resource_value": "{\"uuid\": \"2/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/26]", + "resource_value": "{\"uuid\": \"2/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/27]", + "resource_value": "{\"uuid\": \"2/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/28]", + "resource_value": "{\"uuid\": \"2/28\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/29]", + "resource_value": "{\"uuid\": \"2/29\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/30]", + "resource_value": "{\"uuid\": \"2/30\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/31]", + "resource_value": "{\"uuid\": \"2/31\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/32]", + "resource_value": "{\"uuid\": \"2/32\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/33]", + "resource_value": "{\"uuid\": \"2/33\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/34]", + "resource_value": "{\"uuid\": \"2/34\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/35]", + "resource_value": "{\"uuid\": \"2/35\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/36]", + "resource_value": "{\"uuid\": \"2/36\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/37]", + "resource_value": "{\"uuid\": \"2/37\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/38]", + "resource_value": "{\"uuid\": \"2/38\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/39]", + "resource_value": "{\"uuid\": \"2/39\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/40]", + "resource_value": "{\"uuid\": \"2/40\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/41]", + "resource_value": "{\"uuid\": \"2/41\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/42]", + "resource_value": "{\"uuid\": \"2/42\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/43]", + "resource_value": "{\"uuid\": \"2/43\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/44]", + "resource_value": "{\"uuid\": \"2/44\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/45]", + "resource_value": "{\"uuid\": \"2/45\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/46]", + "resource_value": "{\"uuid\": \"2/46\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/47]", + "resource_value": "{\"uuid\": \"2/47\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/48]", + "resource_value": "{\"uuid\": \"2/48\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/49]", + "resource_value": "{\"uuid\": \"2/49\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/50]", + "resource_value": "{\"uuid\": \"2/50\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_UNDEFINED" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "077e15f9-76fe-5333-9408-968c2b41cdae" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "0efd6983-cb30-5b44-a70f-aea7eef73ee7" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/39" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "180e0e89-c31a-59a4-ba51-78f8808b0142" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/28" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "1b12d0c3-6525-5c59-b0fc-a8767d5a234b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "205c228a-6d13-5dd9-a096-3d0f32aa623e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/35" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "2107946e-8ba6-590b-b46a-ae4657ef40d7" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/47" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "2356dc7c-cbdf-591d-b0ee-6c7ce833875d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "25f2edc5-6d82-5ed2-9e45-116d25832ecc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/29" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "2666e58b-6cee-5e1c-a88d-00e2905b0f32" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "271733ae-018f-54fc-88bf-0632f3cdb7f9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/44" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "27e611ee-5dc2-5029-8e57-5ca6ee2cfc2f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "2a108849-e226-508f-994e-8361591fb5a6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "316b145e-aa6c-5df4-af66-715d6b4e5a17" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/45" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "33442303-1f87-5232-884f-edb5d9e3ffd5" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/37" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "36fe1f19-dba3-51d2-9e1b-2e3c704a6b19" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "37ab9a53-2ef7-5dc0-920f-52cbf126a560" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "3fe69c47-9ee9-5aeb-bf00-b18e82fc99b1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/46" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "40587a07-793f-5b4e-aa55-72b927b07438" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/48" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "49acea8d-74bd-55db-90bd-cc2103782103" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "56f7a8f0-1333-52d9-9b8d-4f193c0eae50" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "58f5c4e9-bd47-538a-b165-835c17f8fb22" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "5a769adf-c6e8-5f56-9283-7e5b89c1eb7c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/21" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "5ceb2ff8-cf7a-5a98-a0ea-c8db55539cd3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/31" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "65941ce9-090b-5eb0-92e2-159d8fa7be6b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/40" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "66d6ee8a-d31f-52f3-a543-d065a1d8f230" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "70a11827-5f5f-5fd8-bc4e-625b96f49cfa" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "761f413c-e81f-5ef3-906e-15ee7a7cf979" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "7899ce16-bbf9-5aec-860b-03b632b2415e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/32" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "79dcdbdd-295c-5cc5-8bc5-b9e3f5781259" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "7c88df78-ac8b-5b21-9d4a-9fb5cb9b2ab7" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/41" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "86e1d7d9-8196-501d-89e0-81a29ab329c1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/42" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "8f371d4d-437f-5dcd-8da5-49aed0a10591" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "9114b7f3-d37d-5c06-b836-fe9ae5be5e31" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "95535457-347b-5087-9334-34e9c3108a14" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "9584839b-c968-555b-b365-7d45b158da93" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "a4601696-fbf8-5542-93bc-1a0b1a584290" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "a5937e81-da6e-5c10-b112-632c91c59c80" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/34" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "a6e3def0-24dd-58ce-8dc2-3b76a7e59a54" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/49" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "ae66e1f3-388e-50a6-84dd-ab3011abd7c8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "bf37f73c-1d04-5502-bbcd-b0c774f5321d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "c2323639-cc62-51c0-824d-d407f021487e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "c7867a3e-6777-5da4-86e6-b3f8cfcc2206" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/50" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "df10edad-6e34-5e21-b3df-b707d1996152" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/33" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "e474474e-736d-50f5-a67c-6c64fc1ecbb0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "e872518a-7b5d-5ddc-b32b-537f0eb448ce" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "ed3ab9eb-7d0e-5af0-8bc6-20e09c9244d9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/43" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "eecd6a9e-3f25-53d4-aaaf-86c9233f3e00" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "f899702b-ea5a-56f8-ab09-6084ab8cdafb" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/36" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "f973a042-5400-5b24-8dd4-cc74392e30f7" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "fbdb17d1-78a5-50dc-bb9e-c1e74dfa1e88" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/38" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "fd9dfc42-9756-5efb-8198-e5c6906bf347" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "fe88e415-7414-5870-ba3d-b08f31840680" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/30" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "endpoint_uuid": { + "uuid": "ffff2d64-d04c-54e2-a006-9a5fa0d7ab84" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/12" + } + ], + "device_id": { + "device_uuid": { + "uuid": "e7d82ee1-dcef-50b8-b390-ea419df26b02" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "emu-packet-router", + "name": "R10" + }, + { + "components": [ + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "015374ab-9cae-58c3-8e0e-a438482511d1" + }, + "name": "eth-1/0/6", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "030e2ea4-7cdf-5212-9a28-88dc24c52629" + }, + "name": "eth-1/0/20", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "11e08bd6-770d-55a0-a635-e54cf3dbccc7" + }, + "name": "eth-1/0/17", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "1c93cb2d-2c23-50df-95d8-f32fe26e1373" + }, + "name": "Transceiver#15", + "parent": "eth-1/0/15", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "1feb16b7-ccd9-5cd6-a958-56400aafb910" + }, + "name": "Fan#4", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "description": "\"100G/40G Fiber\"" + }, + "component_uuid": { + "uuid": "2033bacd-7ca6-5226-ad88-e05f3b36881b" + }, + "name": "eth-1/0/1", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "2058b20d-6517-5380-8b20-e1ebda347ff1" + }, + "name": "eth-1/0/22", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "2733b361-a1e5-5a22-b0ff-f20346c233b7" + }, + "name": "eth-1/0/14", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "2ca154b0-4e4b-5024-92b0-b7cf4bcc4fac" + }, + "name": "eth-1/0/8", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "2dc02c86-6a77-5767-9c6f-07b20d09bcc5" + }, + "name": "Transceiver#8", + "parent": "eth-1/0/8", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "2e08a6e2-10f9-5b61-b358-a46e5d2168c7" + }, + "name": "eth-1/0/10", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "2febcb3d-0afa-594e-9ebe-c6f23c8b7e8a" + }, + "name": "eth-1/0/16", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"PYA2FD5 \"", + "vendor": "\"FINISAR CORP. \"" + }, + "component_uuid": { + "uuid": "330654aa-1136-58c7-9836-dce23b03e84b" + }, + "name": "Transceiver#23", + "parent": "eth-1/0/23", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "36c2ad7f-3191-5d73-ba5b-a90eee210e28" + }, + "name": "eth-1/0/2", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"AZG28W2 \"", + "vendor": "\"FINISAR CORP. \"" + }, + "component_uuid": { + "uuid": "380c56d9-4da7-52a0-8902-17e44d84182d" + }, + "name": "Transceiver#6", + "parent": "eth-1/0/6", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "383a5fda-c038-5273-919e-e2fdebec614a" + }, + "name": "eth-1/0/5", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "389fa34a-d04c-5328-af4b-f3d825907e11" + }, + "name": "Transceiver#5", + "parent": "eth-1/0/5", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "399007c8-f6c1-5b1e-9c88-19d5815b447f" + }, + "name": "Transceiver#9", + "parent": "eth-1/0/9", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"F162250019 \"", + "vendor": "\"Edgecore \"" + }, + "component_uuid": { + "uuid": "4f052094-76bf-57e9-8c50-ab087f7585fc" + }, + "name": "Transceiver#22", + "parent": "eth-1/0/22", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"CRXT-T0T12A\"", + "empty": "\"false\"", + "location": "\"Power Supplies tray\"", + "manufacturer-name": "\"CRXT-T0T12A\"", + "removable": "\"true\"", + "serial-num": "\"19330053\"" + }, + "component_uuid": { + "uuid": "52494162-56ba-5362-84c2-de654f647fd4" + }, + "name": "Power-Supply#1", + "parent": "chassis", + "type": "POWER_SUPPLY" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "60bd77bf-2c0e-5058-ac6a-f4b107888668" + }, + "name": "eth-1/0/23", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "638f45d1-e274-5c90-bd6c-6d0b43354705" + }, + "name": "eth-1/0/7", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "6548a5c7-3dc3-56d3-9521-3b8f1bcd00f5" + }, + "name": "Transceiver#3", + "parent": "eth-1/0/3", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "669a0888-e577-511f-8bb1-a78854d21236" + }, + "name": "eth-1/0/4", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "66f3fad6-f259-558c-87cb-85c267bf872d" + }, + "name": "eth-1/0/18", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "68748f18-ee2c-5650-9476-375489dcf90c" + }, + "name": "Transceiver#14", + "parent": "eth-1/0/14", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "6c5296eb-eeaa-5d24-b274-3cc24095ebfe" + }, + "name": "eth-1/0/19", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "6f156244-93a8-5b24-8300-3bcb1d390ec5" + }, + "name": "eth-1/0/11", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "7317a965-f981-59e8-87ca-0aa8c87634b1" + }, + "name": "Transceiver#21", + "parent": "eth-1/0/21", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "7a57c318-8e6c-5b45-89e5-fae2c611fb03" + }, + "name": "Transceiver#19", + "parent": "eth-1/0/19", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "7c8a8160-a11b-588d-8302-c2fa37b7acd3" + }, + "name": "Fan#5", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "86b7296f-1bc6-5ed6-9019-89776c5e624c" + }, + "name": "Transceiver#24", + "parent": "eth-1/0/24", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "88619a40-3670-5447-8264-a5a44e75f8ea" + }, + "name": "eth-1/0/12", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "8ba82a4b-08cc-5f84-89da-ce532af55224" + }, + "name": "Transceiver#11", + "parent": "eth-1/0/11", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "8cd2af8e-072a-56e3-88d0-dd3a73b14ca3" + }, + "name": "Transceiver#4", + "parent": "eth-1/0/4", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"100G/40G Fiber\"" + }, + "component_uuid": { + "uuid": "8dab697e-efe0-5818-b072-841bcd57340e" + }, + "name": "eth-1/0/27", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "9f20d73a-2898-5bcb-8dcf-09441dcaaa14" + }, + "name": "Transceiver#10", + "parent": "eth-1/0/10", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"DRX-30\"", + "empty": "\"false\"", + "hardware-rev": "\"R0D\"", + "manufacturer-name": "\"DRX-30\"", + "mfg-date": "\"2020-01-08\"", + "removable": "\"false\"", + "serial-num": "\"731527XB1952144\"", + "software-rev": "\"21.5.1 (9799)\"" + }, + "component_uuid": { + "uuid": "a0307926-d58c-51ef-aeaf-a8587065ddb2" + }, + "name": "chassis", + "parent": "chassis", + "type": "CHASSIS" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"CN04HG0018P1452\"", + "vendor": "\"DELL EMC \"" + }, + "component_uuid": { + "uuid": "a537dd75-55ed-5f80-bbe0-a5fcec8fe992" + }, + "name": "Transceiver#20", + "parent": "eth-1/0/20", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "a548914d-f039-5463-a7cf-e3a2d0e970ce" + }, + "name": "Fan#3", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"030SBF6TH661789\"", + "vendor": "\"HISILICON \"" + }, + "component_uuid": { + "uuid": "a86ad9f3-d5f7-5e4b-911a-89e15cf56cbb" + }, + "name": "Transceiver#16", + "parent": "eth-1/0/16", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "abb4254a-f8fc-5c88-a884-cba09af44e2f" + }, + "name": "Transceiver#2", + "parent": "eth-1/0/2", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "b1fe3b03-236d-509f-9738-0863a0051cc0" + }, + "name": "eth-1/0/24", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "b9326b3e-4bfd-5334-8205-17964ca521d3" + }, + "name": "Transceiver#1", + "parent": "eth-1/0/1", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "bddb5da3-8ca6-50a8-91e2-4ab1d7bca8b1" + }, + "name": "Transceiver#27", + "parent": "eth-1/0/27", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "cae5f45f-0442-5ea1-ba3f-beac8c1e2e55" + }, + "name": "eth-1/0/21", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "cbb8d2b5-a57f-508b-a054-509ace91bc88" + }, + "name": "Fan#2", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"CN04HG00183038D\"", + "vendor": "\"DELL EMC \"" + }, + "component_uuid": { + "uuid": "cdcb47b3-3fe9-5db0-a70a-df607933c68b" + }, + "name": "Transceiver#17", + "parent": "eth-1/0/17", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "d20d0c2a-5cbd-5602-b54b-a44134b391b7" + }, + "name": "eth-1/0/13", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"false\"", + "location": "\"Power Supplies tray\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "d35ae2b7-88e8-5f8e-bb1c-6b1b04c41652" + }, + "name": "Power-Supply#2", + "parent": "chassis", + "type": "POWER_SUPPLY" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "d3cbf635-9c86-542b-b169-53a77dea2d75" + }, + "name": "eth-1/0/25", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "d425d98d-4f08-5519-a754-63fa109ba13b" + }, + "name": "eth-1/0/15", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"100G/40G Fiber\"" + }, + "component_uuid": { + "uuid": "d71a754a-1d95-5fa9-956a-fba4da2e9841" + }, + "name": "eth-1/0/26", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "description": "\"25G/10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "d976f4a3-6490-5006-8452-65d8b80af1b6" + }, + "name": "eth-1/0/3", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"F162250016 \"", + "vendor": "\"Edgecore \"" + }, + "component_uuid": { + "uuid": "d9a36c03-d934-5ca3-ab94-047b6114ce5a" + }, + "name": "Transceiver#25", + "parent": "eth-1/0/25", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "connector-type": "\"LC_CONNECTOR\"", + "empty": "\"false\"", + "form-factor": "\"SFP\"", + "removable": "\"true\"", + "serial-num": "\"P22224B0261 \"", + "vendor": "\"PDDG \"" + }, + "component_uuid": { + "uuid": "e2dc2aaf-afea-5356-8ea5-c77e9895da0b" + }, + "name": "Transceiver#18", + "parent": "eth-1/0/18", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "e3a4825b-62c2-5119-bed1-9c4b7edeb0bf" + }, + "name": "Transceiver#12", + "parent": "eth-1/0/12", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "e7c4e4dc-5f70-53a8-9680-6d1d1f382611" + }, + "name": "Transceiver#26", + "parent": "eth-1/0/26", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"10G/1G Fiber\"" + }, + "component_uuid": { + "uuid": "f0c6922f-c0bb-5f69-920b-0d8ebc3f7c63" + }, + "name": "eth-1/0/9", + "parent": "", + "type": "PORT" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "f441b766-d83b-51f0-bb87-9feacbaa222e" + }, + "name": "Transceiver#13", + "parent": "eth-1/0/13", + "type": "TRANSCEIVER" + }, + { + "attributes": { + "description": "\"AS7315\"", + "empty": "\"false\"", + "location": "\"Fans tray\"", + "manufacturer-name": "\"AS7315\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "fbee5498-f04b-543b-b0df-054b8ddcdab5" + }, + "name": "Fan#1", + "parent": "chassis", + "type": "FAN" + }, + { + "attributes": { + "empty": "\"true\"", + "removable": "\"true\"" + }, + "component_uuid": { + "uuid": "ff8fc959-332f-5e3d-8b4b-ad52935ab386" + }, + "name": "Transceiver#7", + "parent": "eth-1/0/7", + "type": "TRANSCEIVER" + } + ], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "10.95.90.125" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "830" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"allow_agent\": false,\n\"commit_per_rule\": true,\n\"device_params\": {\n\"name\": \"huaweiyang\"\n},\n\"force_running\": false,\n\"hostkey_verify\": false,\n\"look_for_keys\": false,\n\"manager_params\": {\n\"timeout\": 120\n},\n\"message_renderer\": \"pyangbind\",\n\"password\": \"admin\",\n\"username\": \"admin\",\n\"vendor\": \"ADVA\"\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/chassis", + "resource_value": "{\"attributes\": {\"description\": \"DRX-30\", \"empty\": \"false\", \"hardware-rev\": \"R0D\", \"manufacturer-name\": \"DRX-30\", \"mfg-date\": \"2020-01-08\", \"removable\": \"false\", \"serial-num\": \"731527XB1952144\", \"software-rev\": \"21.5.1 (9799)\"}, \"class\": \"CHASSIS\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"chassis\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#1", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#1\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#2", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#2\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#3", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#3\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#4", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#4\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Fan#5", + "resource_value": "{\"attributes\": {\"description\": \"AS7315\", \"empty\": \"false\", \"location\": \"Fans tray\", \"manufacturer-name\": \"AS7315\", \"removable\": \"true\"}, \"class\": \"FAN\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Fan#5\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Power-Supply#1", + "resource_value": "{\"attributes\": {\"description\": \"CRXT-T0T12A\", \"empty\": \"false\", \"location\": \"Power Supplies tray\", \"manufacturer-name\": \"CRXT-T0T12A\", \"removable\": \"true\", \"serial-num\": \"19330053\"}, \"class\": \"POWER_SUPPLY\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Power-Supply#1\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Power-Supply#2", + "resource_value": "{\"attributes\": {\"empty\": \"false\", \"location\": \"Power Supplies tray\", \"removable\": \"true\"}, \"class\": \"POWER_SUPPLY\", \"component-reference\": [1, \"CHASSIS\"], \"name\": \"Power-Supply#2\", \"parent-component-references\": \"chassis\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/1", + "resource_value": "{\"attributes\": {\"description\": \"100G/40G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\"], \"name\": \"eth-1/0/1\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#1", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [3, \"PORT\"], \"name\": \"Transceiver#1\", \"parent-component-references\": \"eth-1/0/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/2", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/2\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#2", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [4, \"PORT\"], \"name\": \"Transceiver#2\", \"parent-component-references\": \"eth-1/0/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/3", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/3\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#3", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [5, \"PORT\"], \"name\": \"Transceiver#3\", \"parent-component-references\": \"eth-1/0/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/4", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/4\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#4", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [6, \"PORT\"], \"name\": \"Transceiver#4\", \"parent-component-references\": \"eth-1/0/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/5", + "resource_value": "{\"attributes\": {\"description\": \"25G/10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/5\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#5", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [7, \"PORT\"], \"name\": \"Transceiver#5\", \"parent-component-references\": \"eth-1/0/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/6", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/6\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#6", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"AZG28W2 \", \"vendor\": \"FINISAR CORP. \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [8, \"PORT\"], \"name\": \"Transceiver#6\", \"parent-component-references\": \"eth-1/0/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/7", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/7\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#7", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [9, \"PORT\"], \"name\": \"Transceiver#7\", \"parent-component-references\": \"eth-1/0/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/8", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/8\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#8", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [10, \"PORT\"], \"name\": \"Transceiver#8\", \"parent-component-references\": \"eth-1/0/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/9", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/9\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#9", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [11, \"PORT\"], \"name\": \"Transceiver#9\", \"parent-component-references\": \"eth-1/0/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/10", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/10\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#10", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [12, \"PORT\"], \"name\": \"Transceiver#10\", \"parent-component-references\": \"eth-1/0/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/11", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/11\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#11", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [13, \"PORT\"], \"name\": \"Transceiver#11\", \"parent-component-references\": \"eth-1/0/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/12", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/12\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#12", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [14, \"PORT\"], \"name\": \"Transceiver#12\", \"parent-component-references\": \"eth-1/0/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/13", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/13\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#13", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [15, \"PORT\"], \"name\": \"Transceiver#13\", \"parent-component-references\": \"eth-1/0/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/14", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/14\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#14", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [16, \"PORT\"], \"name\": \"Transceiver#14\", \"parent-component-references\": \"eth-1/0/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/15", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/15\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#15", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [17, \"PORT\"], \"name\": \"Transceiver#15\", \"parent-component-references\": \"eth-1/0/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/16", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/16\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#16", + "resource_value": "{\"attributes\": {\"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"030SBF6TH661789\", \"vendor\": \"HISILICON \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [18, \"PORT\"], \"name\": \"Transceiver#16\", \"parent-component-references\": \"eth-1/0/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/17", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/17\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#17", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"CN04HG00183038D\", \"vendor\": \"DELL EMC \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [19, \"PORT\"], \"name\": \"Transceiver#17\", \"parent-component-references\": \"eth-1/0/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/18", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/18\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#18", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"P22224B0261 \", \"vendor\": \"PDDG \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [20, \"PORT\"], \"name\": \"Transceiver#18\", \"parent-component-references\": \"eth-1/0/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/19", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/19\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#19", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [21, \"PORT\"], \"name\": \"Transceiver#19\", \"parent-component-references\": \"eth-1/0/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/20", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/20\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#20", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"CN04HG0018P1452\", \"vendor\": \"DELL EMC \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [22, \"PORT\"], \"name\": \"Transceiver#20\", \"parent-component-references\": \"eth-1/0/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/21", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/21\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#21", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [23, \"PORT\"], \"name\": \"Transceiver#21\", \"parent-component-references\": \"eth-1/0/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/22", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/22\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#22", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"F162250019 \", \"vendor\": \"Edgecore \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [24, \"PORT\"], \"name\": \"Transceiver#22\", \"parent-component-references\": \"eth-1/0/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/23", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/23\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#23", + "resource_value": "{\"attributes\": {\"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"PYA2FD5 \", \"vendor\": \"FINISAR CORP. \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [25, \"PORT\"], \"name\": \"Transceiver#23\", \"parent-component-references\": \"eth-1/0/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/24", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/24\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#24", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [26, \"PORT\"], \"name\": \"Transceiver#24\", \"parent-component-references\": \"eth-1/0/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/25", + "resource_value": "{\"attributes\": {\"description\": \"10G/1G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/25\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#25", + "resource_value": "{\"attributes\": {\"connector-type\": \"LC_CONNECTOR\", \"empty\": \"false\", \"form-factor\": \"SFP\", \"removable\": \"true\", \"serial-num\": \"F162250016 \", \"vendor\": \"Edgecore \"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [27, \"PORT\"], \"name\": \"Transceiver#25\", \"parent-component-references\": \"eth-1/0/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/26", + "resource_value": "{\"attributes\": {\"description\": \"100G/40G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/26\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#26", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [28, \"PORT\"], \"name\": \"Transceiver#26\", \"parent-component-references\": \"eth-1/0/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/eth-1/0/27", + "resource_value": "{\"attributes\": {\"description\": \"100G/40G Fiber\"}, \"class\": \"PORT\", \"component-reference\": [2, \"CHASSIS\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"FAN\", \"POWER_SUPPLY\", \"POWER_SUPPLY\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\", \"TRANSCEIVER\", \"PORT\"], \"name\": \"eth-1/0/27\", \"parent-component-references\": \"\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/inventory/Transceiver#27", + "resource_value": "{\"attributes\": {\"empty\": \"true\", \"removable\": \"true\"}, \"class\": \"TRANSCEIVER\", \"component-reference\": [29, \"PORT\"], \"name\": \"Transceiver#27\", \"parent-component-references\": \"eth-1/0/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/1]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/1']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/1']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/1']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/1']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/2]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/2']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/2']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/2']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/2']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/3]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/3']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/3']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/3']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/3']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/4]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/4']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/4']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/4']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/4']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/5]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/5']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/5']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/5']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/5']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/6]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/6']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/6']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/6']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/6']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/7]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/7']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/7']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/7']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/7']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/8]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/8']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/8']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/8']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/8']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/9]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/9']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/9']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/9']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/9']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/10]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/10']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/10']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/10']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/10']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/11]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/11']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/11']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/11']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/11']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/12]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/12']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/12']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/12']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/12']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/13]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/13']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/13']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/13']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/13']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/14]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/14']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/14']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/14']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/14']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/15]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/15']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/15']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/15']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/15']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/16]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/16']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/16']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/16']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/16']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/17]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/17']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/17']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/17']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/17']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/18]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/18']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/18']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/18']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/18']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/19]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/19']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/19']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/19']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/19']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/20]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/20']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/20']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/20']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/20']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/21]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/21']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/21']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/21']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/21']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/22]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/22']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/22']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/22']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/22']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/23]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/23']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/23']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/23']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/23']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/24]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/24']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/24']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/24']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/24']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/25]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/25']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/25']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/25']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/25']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/26]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/26']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/26']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/26']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/26']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[eth-1/0/27]", + "resource_value": "{\"sample_types\": {\"101\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/27']/state/counters/out-pkts\", \"102\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/27']/state/counters/in-pkts\", \"201\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/27']/state/counters/out-octets\", \"202\": \"//oci:interfaces/oci:interface[oci:name='eth-1/0/27']/state/counters/in-octets\"}, \"type\": \"-\", \"uuid\": \"eth-1/0/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/1]", + "resource_value": "{\"name\": \"eth-1/0/1\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/2]", + "resource_value": "{\"name\": \"eth-1/0/2\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/3]", + "resource_value": "{\"name\": \"eth-1/0/3\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/4]", + "resource_value": "{\"name\": \"eth-1/0/4\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/5]", + "resource_value": "{\"description\": \"\\\"TeraFlow\\\"\", \"name\": \"eth-1/0/5\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/6]", + "resource_value": "{\"name\": \"eth-1/0/6\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/7]", + "resource_value": "{\"name\": \"eth-1/0/7\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/8]", + "resource_value": "{\"name\": \"eth-1/0/8\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/9]", + "resource_value": "{\"name\": \"eth-1/0/9\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/10]", + "resource_value": "{\"name\": \"eth-1/0/10\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/11]", + "resource_value": "{\"name\": \"eth-1/0/11\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/12]", + "resource_value": "{\"name\": \"eth-1/0/12\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/13]", + "resource_value": "{\"name\": \"eth-1/0/13\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/14]", + "resource_value": "{\"name\": \"eth-1/0/14\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/15]", + "resource_value": "{\"name\": \"eth-1/0/15\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/16]", + "resource_value": "{\"name\": \"eth-1/0/16\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/17]", + "resource_value": "{\"name\": \"eth-1/0/17\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/18]", + "resource_value": "{\"description\": \"\\\"Conexion con HL5-1-2\\\"\", \"name\": \"eth-1/0/18\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/19]", + "resource_value": "{\"name\": \"eth-1/0/19\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/20]", + "resource_value": "{\"description\": \"\\\"TeraFlow\\\"\", \"name\": \"eth-1/0/20\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/21]", + "resource_value": "{\"name\": \"eth-1/0/21\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/22]", + "resource_value": "{\"description\": \"\\\"TeraFlow\\\"\", \"name\": \"eth-1/0/22\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/23]", + "resource_value": "{\"name\": \"eth-1/0/23\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/24]", + "resource_value": "{\"description\": \"\\\"TeraFlow\\\"\", \"name\": \"eth-1/0/24\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/25]", + "resource_value": "{\"description\": \"\\\"TeraFlow\\\"\", \"name\": \"eth-1/0/25\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/26]", + "resource_value": "{\"name\": \"eth-1/0/26\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/27]", + "resource_value": "{\"name\": \"eth-1/0/27\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth0]/subinterface[0]", + "resource_value": "{\"address_ip\": \"10.95.90.125\", \"address_prefix\": 24, \"index\": 0, \"name\": \"eth0\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth0]", + "resource_value": "{\"name\": \"eth0\", \"type\": \"ethernetCsmacd\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[dummy1]/subinterface[0]", + "resource_value": "{\"address_ip\": \"5.5.5.5\", \"address_prefix\": 32, \"index\": 0, \"name\": \"dummy1\", \"type\": \"softwareLoopback\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[dummy1]", + "resource_value": "{\"name\": \"dummy1\", \"type\": \"softwareLoopback\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/10.42]/subinterface[0]", + "resource_value": "{\"address_ip\": \"99.4.42.5\", \"address_ipv6\": \"2001::99:4:42:5\", \"address_prefix\": 24, \"address_prefix_v6\": 112, \"index\": 0, \"name\": \"eth-1/0/10.42\", \"type\": \"l3ipvlan\", \"vlan_id\": 42}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/10.42]", + "resource_value": "{\"description\": \"\\\"Conexion con HL4-2-2\\\"\", \"name\": \"eth-1/0/10.42\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/16.125]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.16.1\", \"address_prefix\": 24, \"index\": 0, \"name\": \"eth-1/0/16.125\", \"type\": \"l3ipvlan\", \"vlan_id\": 125}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/16.125]", + "resource_value": "{\"name\": \"eth-1/0/16.125\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/20.55]/subinterface[0]", + "resource_value": "{\"address_ip\": \"99.5.20.3\", \"address_ipv6\": \"2001::99:5:20:2\", \"address_prefix\": 24, \"address_prefix_v6\": 112, \"index\": 0, \"name\": \"eth-1/0/20.55\", \"type\": \"l3ipvlan\", \"vlan_id\": 20}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/20.55]", + "resource_value": "{\"description\": \"\\\"Conexion con HL5-4-1\\\"\", \"name\": \"eth-1/0/20.55\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/22.111]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.4.1\", \"address_prefix\": 24, \"index\": 0, \"name\": \"eth-1/0/22.111\", \"type\": \"l3ipvlan\", \"vlan_id\": 111}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/22.111]", + "resource_value": "{\"name\": \"eth-1/0/22.111\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/23.125]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.61.1\", \"address_prefix\": 24, \"index\": 0, \"name\": \"eth-1/0/23.125\", \"type\": \"l3ipvlan\", \"vlan_id\": 125}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/23.125]", + "resource_value": "{\"name\": \"eth-1/0/23.125\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/25.55]/subinterface[0]", + "resource_value": "{\"address_ip\": \"99.5.55.2\", \"address_ipv6\": \"2001::99:5:55:2\", \"address_prefix\": 24, \"address_prefix_v6\": 112, \"index\": 0, \"name\": \"eth-1/0/25.55\", \"type\": \"l3ipvlan\", \"vlan_id\": 55}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/25.55]", + "resource_value": "{\"description\": \"\\\"Conexion con HL5-1-2\\\"\", \"name\": \"eth-1/0/25.55\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/23.996]/subinterface[0]", + "resource_value": "{\"index\": 0, \"name\": \"eth-1/0/23.996\", \"type\": \"l2vlan\", \"vlan_id\": 996}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/23.996]", + "resource_value": "{\"name\": \"eth-1/0/23.996\", \"type\": \"l2vlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/20.533]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.12.12\", \"address_prefix\": 16, \"index\": 0, \"mtu\": \"1450\", \"name\": \"eth-1/0/20.533\", \"type\": \"l3ipvlan\", \"vlan_id\": 533}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/20.533]", + "resource_value": "{\"mtu\": 1450, \"name\": \"eth-1/0/20.533\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/21.534]/subinterface[0]", + "resource_value": "{\"address_ip\": \"172.16.17.47\", \"address_prefix\": 16, \"index\": 0, \"mtu\": \"1450\", \"name\": \"eth-1/0/21.534\", \"type\": \"l3ipvlan\", \"vlan_id\": 534}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/21.534]", + "resource_value": "{\"mtu\": 1450, \"name\": \"eth-1/0/21.534\", \"type\": \"l3ipvlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/21.999]/subinterface[0]", + "resource_value": "{\"index\": 0, \"name\": \"eth-1/0/21.999\", \"type\": \"l2vlan\", \"vlan_id\": 999}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/interface[eth-1/0/21.999]", + "resource_value": "{\"name\": \"eth-1/0/21.999\", \"type\": \"l2vlan\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[MY_POLICY_BGP]", + "resource_value": "{\"policy_name\": \"MY_POLICY_BGP\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[MY_AS_PATH]", + "resource_value": "{\"policy_name\": \"MY_AS_PATH\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[MY_STANDARD_COMMUNITY]", + "resource_value": "{\"policy_name\": \"MY_STANDARD_COMMUNITY\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[MY_EXTENDED_COMMUNITY]", + "resource_value": "{\"policy_name\": \"MY_EXTENDED_COMMUNITY\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[MY_POLICY]", + "resource_value": "{\"policy_name\": \"MY_POLICY\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[srv_ACL]", + "resource_value": "{\"policy_name\": \"srv_ACL\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[srv_ACLr]", + "resource_value": "{\"policy_name\": \"srv_ACLr\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[RT_POLICY]", + "resource_value": "{\"policy_name\": \"RT_POLICY\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[srv11_ACL]", + "resource_value": "{\"policy_name\": \"srv11_ACL\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/policy_definition[srv11_ACLr]", + "resource_value": "{\"policy_name\": \"srv11_ACLr\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_srv_ACL]", + "resource_value": "{\"ext_community_set_name\": \"set_srv_ACL\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_srv_ACL][65000:533]", + "resource_value": "{\"ext_community_member\": \"65000:533\", \"ext_community_set_name\": \"set_srv_ACL\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_srv_ACLr]", + "resource_value": "{\"ext_community_set_name\": \"set_srv_ACLr\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_srv_ACLr][65000:533]", + "resource_value": "{\"ext_community_member\": \"65000:533\", \"ext_community_set_name\": \"set_srv_ACLr\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_RT_POLICY]", + "resource_value": "{\"ext_community_set_name\": \"set_RT_POLICY\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_RT_POLICY][65001:456]", + "resource_value": "{\"ext_community_member\": \"65001:456\", \"ext_community_set_name\": \"set_RT_POLICY\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_srv11_ACL]", + "resource_value": "{\"ext_community_set_name\": \"set_srv11_ACL\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_srv11_ACL][65000:101]", + "resource_value": "{\"ext_community_member\": \"65000:101\", \"ext_community_set_name\": \"set_srv11_ACL\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_srv11_ACLr]", + "resource_value": "{\"ext_community_set_name\": \"set_srv11_ACLr\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/routing_policy/bgp_defined_set[set_srv11_ACLr][65000:101]", + "resource_value": "{\"ext_community_member\": \"65000:101\", \"ext_community_set_name\": \"set_srv11_ACLr\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]", + "resource_value": "{\"name\": \"default\", \"router_id\": \"5.5.5.5\", \"type\": \"DEFAULT_INSTANCE\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[OSPF]", + "resource_value": "{\"identifier\": \"OSPF\", \"name\": \"default\", \"protocol_name\": \"OSPF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[ISIS]", + "resource_value": "{\"identifier\": \"ISIS\", \"name\": \"default\", \"protocol_name\": \"ISIS\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[BGP]", + "resource_value": "{\"as\": 65001, \"identifier\": \"BGP\", \"name\": \"default\", \"protocol_name\": \"BGP\", \"router_id\": \"5.5.5.5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[STATIC]", + "resource_value": "{\"identifier\": \"STATIC\", \"name\": \"default\", \"protocol_name\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/protocols[DIRECTLY_CONNECTED]", + "resource_value": "{\"identifier\": \"DIRECTLY_CONNECTED\", \"name\": \"default\", \"protocol_name\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/table_connections[STATIC][BGP][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"BGP\", \"name\": \"default\", \"src_protocol\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[default]/table_connections[DIRECTLY_CONNECTED][ISIS][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"ISIS\", \"name\": \"default\", \"src_protocol\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[ELAN-AC:996]", + "resource_value": "{\"name\": \"ELAN-AC:996\", \"type\": \"L2VSI\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23-NetInst]", + "resource_value": "{\"name\": \"5603d4487d23-NetInst\", \"route_distinguisher\": \"65000:533\", \"type\": \"L3VRF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23-NetInst]/protocols[BGP]", + "resource_value": "{\"as\": 65000, \"identifier\": \"BGP\", \"name\": \"5603d4487d23-NetInst\", \"protocol_name\": \"BGP\", \"router_id\": \"5.5.5.5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23-NetInst]/protocols[DIRECTLY_CONNECTED]", + "resource_value": "{\"identifier\": \"DIRECTLY_CONNECTED\", \"name\": \"5603d4487d23-NetInst\", \"protocol_name\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23-NetInst]/protocols[STATIC]", + "resource_value": "{\"identifier\": \"STATIC\", \"name\": \"5603d4487d23-NetInst\", \"protocol_name\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23-NetInst]/table_connections[DIRECTLY_CONNECTED][BGP][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"BGP\", \"name\": \"5603d4487d23-NetInst\", \"src_protocol\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23-NetInst]/table_connections[STATIC][BGP][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"BGP\", \"name\": \"5603d4487d23-NetInst\", \"src_protocol\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23-NetInst]/inter_instance_policies[srv_ACL]", + "resource_value": "{\"import_policy\": \"srv_ACL\", \"name\": \"5603d4487d23-NetInst\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23-NetInst]/inter_instance_policies[srv_ACLr]", + "resource_value": "{\"export_policy\": \"srv_ACLr\", \"name\": \"5603d4487d23-NetInst\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[TestPablo]", + "resource_value": "{\"name\": \"TestPablo\", \"route_distinguisher\": \"65000:934\", \"type\": \"L3VRF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[TestPablo]/protocols[BGP]", + "resource_value": "{\"as\": 65000, \"identifier\": \"BGP\", \"name\": \"TestPablo\", \"protocol_name\": \"BGP\", \"router_id\": \"5.5.5.5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[VRF_TEST]", + "resource_value": "{\"name\": \"VRF_TEST\", \"route_distinguisher\": \"65000:11\", \"type\": \"L3VRF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[VRF_TEST]/protocols[BGP]", + "resource_value": "{\"as\": 100, \"identifier\": \"BGP\", \"name\": \"VRF_TEST\", \"protocol_name\": \"BGP\", \"router_id\": \"5.5.5.5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[VRF_TEST]/protocols[STATIC]", + "resource_value": "{\"identifier\": \"STATIC\", \"name\": \"VRF_TEST\", \"protocol_name\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[VRF_TEST]/table_connections[STATIC][BGP][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"BGP\", \"name\": \"VRF_TEST\", \"src_protocol\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[VRF_TEST]/inter_instance_policies[RT_POLICY]", + "resource_value": "{\"export_policy\": \"RT_POLICY\", \"import_policy\": \"RT_POLICY\", \"name\": \"VRF_TEST\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]", + "resource_value": "{\"name\": \"5603d4487d23\", \"route_distinguisher\": \"65000:101\", \"type\": \"L3VRF\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/protocols[BGP]", + "resource_value": "{\"as\": 65000, \"identifier\": \"BGP\", \"name\": \"5603d4487d23\", \"protocol_name\": \"BGP\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/protocols[DIRECTLY_CONNECTED]", + "resource_value": "{\"identifier\": \"DIRECTLY_CONNECTED\", \"name\": \"5603d4487d23\", \"protocol_name\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/protocols[STATIC]", + "resource_value": "{\"identifier\": \"STATIC\", \"name\": \"5603d4487d23\", \"protocol_name\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/table_connections[DIRECTLY_CONNECTED][BGP][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"BGP\", \"name\": \"5603d4487d23\", \"src_protocol\": \"DIRECTLY_CONNECTED\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/table_connections[STATIC][BGP][IPV4]", + "resource_value": "{\"address_family\": \"IPV4\", \"default_import_policy\": \"ACCEPT_ROUTE\", \"dst_protocol\": \"BGP\", \"name\": \"5603d4487d23\", \"src_protocol\": \"STATIC\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/inter_instance_policies[srv_ACL]", + "resource_value": "{\"import_policy\": \"srv_ACL\", \"name\": \"5603d4487d23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/inter_instance_policies[srv11_ACL]", + "resource_value": "{\"import_policy\": \"srv11_ACL\", \"name\": \"5603d4487d23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/inter_instance_policies[srv_ACLr]", + "resource_value": "{\"export_policy\": \"srv_ACLr\", \"name\": \"5603d4487d23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[5603d4487d23]/inter_instance_policies[srv11_ACLr]", + "resource_value": "{\"export_policy\": \"srv11_ACLr\", \"name\": \"5603d4487d23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/network_instance[ELAN-AC:999]", + "resource_value": "{\"name\": \"ELAN-AC:999\", \"type\": \"L2VSI\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/acl/interfaces/ingress[udp][oc-acl:ACL_IPV4]", + "resource_value": "{\"id\": \"eth-1/0/16.125\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_OPENCONFIG" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "041a75da-c050-5ca3-b146-42b0f00ee29d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "0b2a4334-b88b-5309-b405-58e12f2b50af" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "15acb931-1879-5b9a-9b03-7a55af809ee8" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "1840078d-cbf3-5da7-bf6a-362af86c3348" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "2db099e4-8ed6-560e-a711-b9740d8c2207" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "3ea44221-bdb4-5d7f-a9d3-72fdca6bd157" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "49f0a9c8-2a92-5d99-9130-1e5fe78a54d6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "54c77c3f-74f8-51e7-9327-1cc58966dd49" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "5bf6d901-a375-5c10-9c50-e3b32245384c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "61b1b61a-2a81-5726-b9f8-4e12aa9e8f0b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/21" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "704521ab-79dc-5816-a349-326ec9105dad" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "748eaf56-dd46-57fb-b174-b2e5118ef595" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "749fb7f2-6090-5b1b-ab34-85bb81dc8839" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "85ed1309-aa02-5f4e-8895-39a1bc3b2a0d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "90af834b-3150-5f29-8d64-3f32e1b06cc3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "98217d3a-063e-5700-8baf-42194da9876d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "be264f6e-2526-5396-8816-7ef83ac0283f" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "c52d4511-cc44-57bd-aa81-c1a10666686b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "c68adeba-a5cd-54b5-9cce-a697f994ac4a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "d91dd1c7-cc89-5c3a-bc35-7ba60d3deb7d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "dca3594e-3e72-5880-a7d9-cde710bd010c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "ddc92c2d-5548-5056-9cfc-ad6cafb56d82" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "e3f8a96f-b3fa-5eb5-9ff4-1a823794c82e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "e6143da8-29b4-57ed-b2df-436ceeb966cc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "ec930b06-c6f5-5be1-aac0-655d31655782" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "f1e57176-aaca-594a-b0ff-c0fc609554b6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "endpoint_uuid": { + "uuid": "fc8dc95c-f59d-56a3-ac4c-989b3748bc3d" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [ + "KPISAMPLETYPE_BYTES_RECEIVED", + "KPISAMPLETYPE_BYTES_TRANSMITTED", + "KPISAMPLETYPE_PACKETS_RECEIVED", + "KPISAMPLETYPE_PACKETS_TRANSMITTED" + ], + "name": "eth-1/0/20" + } + ], + "device_id": { + "device_uuid": { + "uuid": "fd28848d-18e7-5cb5-bb02-4085d088eede" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "packet-router", + "name": "R149" + }, + { + "components": [], + "controller_id": {}, + "device_config": { + "config_rules": [ + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/address", + "resource_value": "127.0.0.1" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/port", + "resource_value": "0" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "_connect/settings", + "resource_value": "{\n\"endpoints\": [\n{\n\"uuid\": \"1/2\"\n},\n{\n\"uuid\": \"1/5\"\n},\n{\n\"uuid\": \"1/7\"\n},\n{\n\"uuid\": \"1/13\"\n},\n{\n\"uuid\": \"2/1\"\n},\n{\n\"uuid\": \"2/2\"\n},\n{\n\"uuid\": \"2/3\"\n},\n{\n\"uuid\": \"2/4\"\n},\n{\n\"uuid\": \"2/5\"\n},\n{\n\"uuid\": \"2/6\"\n},\n{\n\"uuid\": \"2/7\"\n},\n{\n\"uuid\": \"2/8\"\n},\n{\n\"uuid\": \"2/9\"\n},\n{\n\"uuid\": \"2/10\"\n},\n{\n\"uuid\": \"2/11\"\n},\n{\n\"uuid\": \"2/12\"\n},\n{\n\"uuid\": \"2/13\"\n},\n{\n\"uuid\": \"2/14\"\n},\n{\n\"uuid\": \"2/15\"\n},\n{\n\"uuid\": \"2/16\"\n},\n{\n\"uuid\": \"2/17\"\n},\n{\n\"uuid\": \"2/18\"\n},\n{\n\"uuid\": \"2/19\"\n},\n{\n\"uuid\": \"2/20\"\n},\n{\n\"uuid\": \"2/21\"\n},\n{\n\"uuid\": \"2/22\"\n},\n{\n\"uuid\": \"2/23\"\n},\n{\n\"uuid\": \"2/24\"\n},\n{\n\"uuid\": \"2/25\"\n},\n{\n\"uuid\": \"2/26\"\n},\n{\n\"uuid\": \"2/27\"\n},\n{\n\"uuid\": \"2/28\"\n},\n{\n\"uuid\": \"2/29\"\n},\n{\n\"uuid\": \"2/30\"\n},\n{\n\"uuid\": \"2/31\"\n},\n{\n\"uuid\": \"2/32\"\n},\n{\n\"uuid\": \"2/33\"\n},\n{\n\"uuid\": \"2/34\"\n},\n{\n\"uuid\": \"2/35\"\n},\n{\n\"uuid\": \"2/36\"\n},\n{\n\"uuid\": \"2/37\"\n},\n{\n\"uuid\": \"2/38\"\n},\n{\n\"uuid\": \"2/39\"\n},\n{\n\"uuid\": \"2/40\"\n},\n{\n\"uuid\": \"2/41\"\n},\n{\n\"uuid\": \"2/42\"\n},\n{\n\"uuid\": \"2/43\"\n},\n{\n\"uuid\": \"2/44\"\n},\n{\n\"uuid\": \"2/45\"\n},\n{\n\"uuid\": \"2/46\"\n},\n{\n\"uuid\": \"2/47\"\n},\n{\n\"uuid\": \"2/48\"\n},\n{\n\"uuid\": \"2/49\"\n},\n{\n\"uuid\": \"2/50\"\n}\n]\n}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/2]", + "resource_value": "{\"uuid\": \"1/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/5]", + "resource_value": "{\"uuid\": \"1/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/7]", + "resource_value": "{\"uuid\": \"1/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[1/13]", + "resource_value": "{\"uuid\": \"1/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/1]", + "resource_value": "{\"uuid\": \"2/1\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/2]", + "resource_value": "{\"uuid\": \"2/2\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/3]", + "resource_value": "{\"uuid\": \"2/3\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/4]", + "resource_value": "{\"uuid\": \"2/4\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/5]", + "resource_value": "{\"uuid\": \"2/5\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/6]", + "resource_value": "{\"uuid\": \"2/6\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/7]", + "resource_value": "{\"uuid\": \"2/7\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/8]", + "resource_value": "{\"uuid\": \"2/8\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/9]", + "resource_value": "{\"uuid\": \"2/9\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/10]", + "resource_value": "{\"uuid\": \"2/10\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/11]", + "resource_value": "{\"uuid\": \"2/11\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/12]", + "resource_value": "{\"uuid\": \"2/12\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/13]", + "resource_value": "{\"uuid\": \"2/13\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/14]", + "resource_value": "{\"uuid\": \"2/14\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/15]", + "resource_value": "{\"uuid\": \"2/15\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/16]", + "resource_value": "{\"uuid\": \"2/16\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/17]", + "resource_value": "{\"uuid\": \"2/17\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/18]", + "resource_value": "{\"uuid\": \"2/18\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/19]", + "resource_value": "{\"uuid\": \"2/19\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/20]", + "resource_value": "{\"uuid\": \"2/20\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/21]", + "resource_value": "{\"uuid\": \"2/21\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/22]", + "resource_value": "{\"uuid\": \"2/22\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/23]", + "resource_value": "{\"uuid\": \"2/23\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/24]", + "resource_value": "{\"uuid\": \"2/24\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/25]", + "resource_value": "{\"uuid\": \"2/25\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/26]", + "resource_value": "{\"uuid\": \"2/26\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/27]", + "resource_value": "{\"uuid\": \"2/27\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/28]", + "resource_value": "{\"uuid\": \"2/28\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/29]", + "resource_value": "{\"uuid\": \"2/29\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/30]", + "resource_value": "{\"uuid\": \"2/30\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/31]", + "resource_value": "{\"uuid\": \"2/31\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/32]", + "resource_value": "{\"uuid\": \"2/32\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/33]", + "resource_value": "{\"uuid\": \"2/33\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/34]", + "resource_value": "{\"uuid\": \"2/34\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/35]", + "resource_value": "{\"uuid\": \"2/35\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/36]", + "resource_value": "{\"uuid\": \"2/36\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/37]", + "resource_value": "{\"uuid\": \"2/37\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/38]", + "resource_value": "{\"uuid\": \"2/38\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/39]", + "resource_value": "{\"uuid\": \"2/39\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/40]", + "resource_value": "{\"uuid\": \"2/40\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/41]", + "resource_value": "{\"uuid\": \"2/41\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/42]", + "resource_value": "{\"uuid\": \"2/42\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/43]", + "resource_value": "{\"uuid\": \"2/43\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/44]", + "resource_value": "{\"uuid\": \"2/44\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/45]", + "resource_value": "{\"uuid\": \"2/45\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/46]", + "resource_value": "{\"uuid\": \"2/46\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/47]", + "resource_value": "{\"uuid\": \"2/47\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/48]", + "resource_value": "{\"uuid\": \"2/48\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/49]", + "resource_value": "{\"uuid\": \"2/49\"}" + } + }, + { + "action": "CONFIGACTION_SET", + "custom": { + "resource_key": "/endpoints/endpoint[2/50]", + "resource_value": "{\"uuid\": \"2/50\"}" + } + } + ] + }, + "device_drivers": [ + "DEVICEDRIVER_UNDEFINED" + ], + "device_endpoints": [ + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "107c1980-770a-54de-a36f-58208f12d5ee" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/23" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "111054e4-0200-5962-97db-ce23ab2656e7" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/20" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "13a7345f-59be-50eb-a25a-de341d11fa78" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/25" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "14b95c1c-6a3a-5593-8cac-e1caf4e99f43" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/40" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "14dbd8fb-0a03-59c1-8d4a-2efb53dc50e4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "168aff21-f1c7-5770-a134-9c486ff3aed6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/48" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "1a0a53dc-83a8-558a-8514-bcdbea18bf8a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/6" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "1ce4b25c-d70b-5328-b452-3ba2665d26a2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/36" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "1d8d733b-3992-5196-8900-89bbfd6813c6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/45" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "217daacf-5908-5daf-93a8-ed5f57f5d033" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/12" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "240b2035-d953-5306-abcb-bb43fd721768" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/27" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "36dc4ac9-2617-5592-b6ce-e80ea5e7a128" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/15" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "3a0ff6b7-6c46-5e9c-a2ce-baf0aef8d9be" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/8" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "3b60b8d8-2cf1-5221-a4b4-ef44d995a5bd" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/24" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "3bde5d04-c6be-5a4c-beda-426ab3f51f6c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/2" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "3d3dd83b-7ff0-5ed8-a927-741c975b06d1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "40d5f4fe-1d0a-5cc8-9c5c-65777fb26009" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/5" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "45fbac46-1ed3-5176-a49f-64faa53f0dbc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/47" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "4632048f-707a-5f2f-b6de-4fc943cb06e1" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/26" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "4bdcbfc1-b3b1-5900-9a8f-309ebe99838e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "549cac05-4c03-5d37-9a48-0da872901daf" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/49" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "6025a0cd-8881-5589-a120-572663c05882" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/1" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "6190825d-3688-5d85-839b-d8b5bc5cea93" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/34" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "6fdf1a44-796a-5e96-91f5-325ae3df2453" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/29" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "6fdf2a1b-6767-5d40-ad24-9a081d59522b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/50" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "761dd4b9-c6ec-5388-8edc-b667f767c98a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/41" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "82dc2b4c-89d9-5e20-9b92-c2868ab0847a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/19" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "8a37fce2-a3a3-52d0-9901-b7c04cd15afc" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/43" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "8c07cc9a-7f0b-5bb4-bd30-d6327b253df3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/11" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "8c1005fd-4b0a-50ad-b2db-ae5aba7bd36e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/39" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "8c586d70-13ce-546e-8dc1-6a5f37cd5c82" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/31" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "8cc2f60f-783c-52cd-a1e9-82568bc16212" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "8d26040f-ee92-5f07-a179-f159bd5a04ec" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/37" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "90672de3-0560-5d15-8111-b6f84c8fa61b" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "1/7" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "94d75508-97b0-5f7c-af3e-6feacffeb956" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/13" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "a7bd0c6b-6303-51fc-85d2-2234c85eb7b6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/44" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "aa033a4b-3c94-5652-a819-d73c52ed7c84" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/33" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "ab1f0d53-bc56-5838-94d0-60f0f6cb73c9" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/46" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "acdd2c22-7cf0-57ad-8fb8-11998781f64c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/21" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "adfe16f5-c52e-583c-b1a3-c392afdb2754" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/22" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "b39be508-bf21-52bc-9452-e9e72ed0ce7c" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/32" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "b53cf34e-e6c5-5622-9287-a7309796ccc4" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/35" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "b6f85cb2-0818-5c9e-b2e2-dcea08a13b87" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/38" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "b75fb81a-c009-5a90-bd1e-3e367196d2ba" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/3" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "bb6439d7-d9ca-5266-856f-2241f3aa792a" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/17" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "ce50639f-3614-5a81-9591-c62da0d8ec61" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/18" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "d8fccb2a-2b5c-53fd-a3a9-03a12d7518b7" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/42" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "dc804210-aff8-539d-ae72-e66c096d9361" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/16" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "ea531797-4b90-5ced-9539-7052bfafd408" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/10" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "f89ac9c4-e7c2-5720-ad54-fb2cc651fca3" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/28" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "f8f14f28-040d-5c4e-90f3-821e0bb733f6" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/9" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "f981bc30-0d0f-5165-b8d9-a0c749ae7dc2" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/14" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "fcab81c5-76dc-59a8-9a2b-eee0570704a0" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/4" + }, + { + "endpoint_id": { + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "endpoint_uuid": { + "uuid": "fff7a2d8-4510-5cbd-9119-62c9603c0a3e" + }, + "topology_id": { + "context_id": { + "context_uuid": { + "uuid": "43813baf-195e-5da6-af20-b3d0922e71a7" + } + }, + "topology_uuid": { + "uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8" + } + } + }, + "endpoint_location": {}, + "endpoint_type": "-", + "kpi_sample_types": [], + "name": "2/30" + } + ], + "device_id": { + "device_uuid": { + "uuid": "fe3b48de-7a4d-5d5c-b2e1-93cd445bdbd5" + } + }, + "device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED", + "device_type": "emu-packet-router", + "name": "R14" + } + ] +} \ No newline at end of file diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py new file mode 100644 index 000000000..31a7e8ffb --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py @@ -0,0 +1,116 @@ +import libyang, os +from common.proto.context_pb2 import Device +from typing import Dict, Optional + +YANG_DIR = os.path.join(os.path.dirname(__file__), 'yang') +MODULE_NAME = 'ietf-hardware' + +class YangHandler: + def __init__(self) -> None: + self._yang_context = libyang.Context(YANG_DIR) + self._yang_module = self._yang_context.load_module(MODULE_NAME) + self._yang_module.feature_enable_all() + + def parse_to_dict(self, message : Dict) -> Dict: + dnode : Optional[libyang.DNode] = self._yang_module.parse_data_dict( + message, validate_present=True, validate=True, strict=True + ) + if dnode is None: raise Exception('Unable to parse Message({:s})'.format(str(message))) + message = dnode.print_dict() + dnode.free() + return message + + def compose(self, device : Device) -> Dict: + # compose device iterating through the components + + hardware = self._yang_context.create_data_path('/ietf-hardware:hardware') + physical_index = 0 + + for component in device.components: + attributes = component.attributes + + component_new = hardware.create_path('component[name="{:s}"]'.format(component.name)) + component_new.create_path('name', component.name) + + #Cambiar las clases especiales, su formato y añadir isfru + component_type = component.type + if component_type == "TRANSCEIVER" : + component_type = "module" + + if component_type == "FRU" : + component_type = "slack" + component_new.create_path('isfru', True) + else : + component_new.create_path('isfru', False) + + component_type = component_type.replace("_", "-").lower() + + component_new.create_path('class', component_type) + + #Añadir resto de atributos en IETF + + physical_index += physical_index + component_new.create_path('physical-index', physical_index) + + component_new.create_path('description', attributes["description"]) + + component_new.create_path('parent', component.parent) + + component_new.create_path('hardware-rev', attributes["hardware-rev"]) + component_new.create_path('software-rev', attributes["software-rev"]) + component_new.create_path('firmware-rev', attributes["firmware-version"]) + component_new.create_path('serial-num', attributes["serial-num"]) + component_new.create_path('mfg-name', attributes["mfg-name"]) + component_new.create_path('mfg-date', attributes["mfg-date"]) + component_new.create_path('parent-rel-pos', attributes["id"]) + + component_new.create_path('uri', component.name) + + + component_new.create_path('uuid', component.component_uuid.uuid) + + contains_child = [] + for component2 in device.components: + if component.name == component2.parent : + contains_child.append(component2.name) + + component_new.create_path('contains-child', contains_child) + + return hardware.print_mem('json') + + + + '''# example methods (based on openconfig, to be adapted): + #str_path = '/interfaces/interface[name={:s}]'.format(if_name) + if_name = 'my-if' + interfaces = self._yang_context.create_data_path('/openconfig-interfaces:interfaces') + my_if = interfaces.create_path('interface[name="{:s}"]'.format(if_name)) + my_if.create_path('config/name', if_name) + my_if.create_path('config/enabled', True) + + my_subifs = my_if.create_path('subinterfaces') + + subif_index = 3 + my_subif = my_subifs.create_path('subinterface[index="{:d}"]'.format(subif_index)) + my_subif.create_path('config/index', subif_index) + my_subif.create_path('config/enabled', True) + + vlan_id = 123 + my_subif_vlan = my_subif.create_path('openconfig-vlan:vlan') + my_subif_vlan.create_path('match/single-tagged/config/vlan-id', vlan_id) + + my_subif_ipv4 = my_subif.create_path('openconfig-if-ip:ipv4') + my_subif_ipv4.create_path('config/enabled', True) + + my_subif_ipv4_addrs = my_subif_ipv4.create_path('addresses') + my_ipv4_addr_ip = '10.0.1.10' + my_ipv4_addr_prefix = 24 + my_subif_ipv4_addr = my_subif_ipv4_addrs.create_path('address[ip="{:s}"]'.format(my_ipv4_addr_ip)) + my_subif_ipv4_addr.create_path('config/ip', my_ipv4_addr_ip) + my_subif_ipv4_addr.create_path('config/prefix-length', my_ipv4_addr_prefix) + + return my_if.print_mem('json')''' + + + def destroy(self) -> None: + self._yang_context.destroy() \ No newline at end of file diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py new file mode 100644 index 000000000..b69cdc837 --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py @@ -0,0 +1,7 @@ +from nbi.service.rest_server.nbi_plugins.ietf_hardware.Hardware import Hardware +from nbi.service.rest_server.RestServer import RestServer + +URL_PREFIX = "/restconf/data/device=/ietf-hardware:hardware" + +def register_ietf_hardware(rest_server: RestServer): + rest_server.add_resource(Hardware, URL_PREFIX) \ No newline at end of file diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/iana-hardware@2018-03-13.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/iana-hardware@2018-03-13.yang new file mode 100644 index 000000000..5cd52648f --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/iana-hardware@2018-03-13.yang @@ -0,0 +1,189 @@ +module iana-hardware { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:iana-hardware"; + prefix ianahw; + + organization "IANA"; + contact + " Internet Assigned Numbers Authority + + Postal: ICANN + 12025 Waterfront Drive, Suite 300 + Los Angeles, CA 90094-2536 + United States of America + + Tel: +1 310 301 5800 + E-Mail: iana@iana.org>"; + + description + "IANA-defined identities for hardware class. + + The latest revision of this YANG module can be obtained from + the IANA website. + + Requests for new values should be made to IANA via + email (iana@iana.org). + + Copyright (c) 2018 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + The initial version of this YANG module is part of RFC 8348; + see the RFC itself for full legal notices."; + reference + "https://www.iana.org/assignments/yang-parameters"; + + revision 2018-03-13 { + description + "Initial revision."; + reference + "RFC 8348: A YANG Data Model for Hardware Management"; + } + + /* + * Identities + */ + + identity hardware-class { + description + "This identity is the base for all hardware class + identifiers."; + } + + identity unknown { + base ianahw:hardware-class; + description + "This identity is applicable if the hardware class is unknown + to the server."; + } + + identity chassis { + base ianahw:hardware-class; + description + "This identity is applicable if the hardware class is an + overall container for networking equipment. Any class of + physical component, except a stack, may be contained within a + chassis; a chassis may only be contained within a stack."; + } + + identity backplane { + base ianahw:hardware-class; + description + "This identity is applicable if the hardware class is some sort + of device for aggregating and forwarding networking traffic, + such as a shared backplane in a modular ethernet switch. Note + that an implementation may model a backplane as a single + physical component, which is actually implemented as multiple + discrete physical components (within a chassis or stack)."; + } + + identity container { + base ianahw:hardware-class; + description + "This identity is applicable if the hardware class is capable + of containing one or more removable physical entities, + possibly of different types. For example, each (empty or + full) slot in a chassis will be modeled as a container. Note + that all removable physical components should be modeled + within a container component, such as field-replaceable + modules, fans, or power supplies. Note that all known + containers should be modeled by the agent, including empty + containers."; + } + + identity power-supply { + base ianahw:hardware-class; + description + "This identity is applicable if the hardware class is a + power-supplying component."; + } + + identity fan { + base ianahw:hardware-class; + description + "This identity is applicable if the hardware class is a fan or + other heat-reduction component."; + } + + identity sensor { + base ianahw:hardware-class; + description + "This identity is applicable if the hardware class is some sort + of sensor, such as a temperature sensor within a router + chassis."; + } + + identity module { + base ianahw:hardware-class; + description + "This identity is applicable if the hardware class is some sort + of self-contained sub-system. If a module component is + removable, then it should be modeled within a container + + component; otherwise, it should be modeled directly within + another physical component (e.g., a chassis or another + module)."; + } + + identity port { + base ianahw:hardware-class; + description + "This identity is applicable if the hardware class is some sort + of networking port capable of receiving and/or transmitting + networking traffic."; + } + + identity stack { + base ianahw:hardware-class; + description + "This identity is applicable if the hardware class is some sort + of super-container (possibly virtual) intended to group + together multiple chassis entities. A stack may be realized + by a virtual cable, a real interconnect cable attached to + multiple chassis, or multiple interconnect cables. A stack + should not be modeled within any other physical components, + but a stack may be contained within another stack. Only + chassis components should be contained within a stack."; + } + + identity cpu { + base ianahw:hardware-class; + description + "This identity is applicable if the hardware class is some sort + of central processing unit."; + } + + identity energy-object { + base ianahw:hardware-class; + description + "This identity is applicable if the hardware class is some sort + of energy object, i.e., it is a piece of equipment that is + part of or attached to a communications network that is + monitored, it is controlled, or it aids in the management of + another device for Energy Management."; + } + + identity battery { + base ianahw:hardware-class; + description + "This identity is applicable if the hardware class is some sort + of battery."; + } + + identity storage-drive { + base ianahw:hardware-class; + description + "This identity is applicable if the hardware class is some sort + of component with data storage capability as its main + functionality, e.g., hard disk drive (HDD), solid-state device + (SSD), solid-state hybrid drive (SSHD), object storage device + (OSD), or other."; + } +} diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/ietf-hardware@2018-03-13.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/ietf-hardware@2018-03-13.yang new file mode 100644 index 000000000..4f984b616 --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/ietf-hardware@2018-03-13.yang @@ -0,0 +1,1194 @@ +module ietf-hardware { + yang-version 1.1; + namespace "urn:ietf:params:xml:ns:yang:ietf-hardware"; + prefix hw; + + import ietf-inet-types { + prefix inet; + } + import ietf-yang-types { + prefix yang; + } + import iana-hardware { + prefix ianahw; + } + + organization + "IETF NETMOD (Network Modeling) Working Group"; + + contact + "WG Web: + WG List: + + Editor: Andy Bierman + + + Editor: Martin Bjorklund + + + Editor: Jie Dong + + + Editor: Dan Romascanu + "; + + description + "This module contains a collection of YANG definitions for + managing hardware. + + This data model is designed for the Network Management Datastore + Architecture (NMDA) defined in RFC 8342. + Copyright (c) 2018 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 8348; see + the RFC itself for full legal notices."; + + revision 2018-03-13 { + description + "Initial revision."; + reference + "RFC 8348: A YANG Data Model for Hardware Management"; + } + + /* + * Features + */ + + feature entity-mib { + description + "This feature indicates that the device implements + the ENTITY-MIB."; + reference + "RFC 6933: Entity MIB (Version 4)"; + } + + feature hardware-state { + description + "Indicates that ENTITY-STATE-MIB objects are supported"; + reference + "RFC 4268: Entity State MIB"; + } + + feature hardware-sensor { + description + "Indicates that ENTITY-SENSOR-MIB objects are supported"; + reference + "RFC 3433: Entity Sensor Management Information Base"; + } + + /* + * Typedefs + */ + + typedef admin-state { + type enumeration { + enum unknown { + value 1; + description + "The resource is unable to report administrative state."; + } + enum locked { + value 2; + description + "The resource is administratively prohibited from use."; + } + enum shutting-down { + value 3; + description + "The resource usage is administratively limited to current + instances of use."; + } + enum unlocked { + value 4; + description + "The resource is not administratively prohibited from + use."; + } + } + description + "Represents the various possible administrative states."; + reference + "RFC 4268: Entity State MIB - EntityAdminState"; + } + + typedef oper-state { + type enumeration { + enum unknown { + value 1; + description + "The resource is unable to report its operational state."; + } + enum disabled { + value 2; + description + "The resource is totally inoperable."; + } + enum enabled { + value 3; + + description + "The resource is partially or fully operable."; + } + enum testing { + value 4; + description + "The resource is currently being tested and cannot + therefore report whether or not it is operational."; + } + } + description + "Represents the possible values of operational states."; + reference + "RFC 4268: Entity State MIB - EntityOperState"; + } + + typedef usage-state { + type enumeration { + enum unknown { + value 1; + description + "The resource is unable to report usage state."; + } + enum idle { + value 2; + description + "The resource is servicing no users."; + } + enum active { + value 3; + description + "The resource is currently in use, and it has sufficient + spare capacity to provide for additional users."; + } + enum busy { + value 4; + description + "The resource is currently in use, but it currently has no + spare capacity to provide for additional users."; + } + } + description + "Represents the possible values of usage states."; + reference + "RFC 4268: Entity State MIB - EntityUsageState"; + } + + typedef alarm-state { + type bits { + bit unknown { + position 0; + description + "The resource is unable to report alarm state."; + } + bit under-repair { + position 1; + description + "The resource is currently being repaired, which, depending + on the implementation, may make the other values in this + bit string not meaningful."; + } + bit critical { + position 2; + description + "One or more critical alarms are active against the + resource."; + } + bit major { + position 3; + description + "One or more major alarms are active against the + resource."; + } + bit minor { + position 4; + description + "One or more minor alarms are active against the + resource."; + } + bit warning { + position 5; + description + "One or more warning alarms are active against the + resource."; + } + bit indeterminate { + position 6; + description + "One or more alarms of whose perceived severity cannot be + determined are active against this resource."; + } + } + description + "Represents the possible values of alarm states. An alarm is a + persistent indication of an error or warning condition. + + When no bits of this attribute are set, then no active alarms + are known against this component and it is not under repair."; + reference + "RFC 4268: Entity State MIB - EntityAlarmStatus"; + } + + typedef standby-state { + type enumeration { + enum unknown { + value 1; + description + "The resource is unable to report standby state."; + } + enum hot-standby { + value 2; + description + "The resource is not providing service, but it will be + immediately able to take over the role of the resource to + be backed up, without the need for initialization + activity, and will contain the same information as the + resource to be backed up."; + } + enum cold-standby { + value 3; + description + "The resource is to back up another resource, but it will + not be immediately able to take over the role of a + resource to be backed up and will require some + initialization activity."; + } + enum providing-service { + value 4; + description + "The resource is providing service."; + } + } + description + "Represents the possible values of standby states."; + reference + "RFC 4268: Entity State MIB - EntityStandbyStatus"; + } + + typedef sensor-value-type { + type enumeration { + enum other { + value 1; + description + "A measure other than those listed below."; + } + enum unknown { + value 2; + description + "An unknown measurement or arbitrary, relative numbers"; + } + enum volts-AC { + value 3; + description + "A measure of electric potential (alternating current)."; + } + enum volts-DC { + value 4; + description + "A measure of electric potential (direct current)."; + } + enum amperes { + value 5; + description + "A measure of electric current."; + } + enum watts { + value 6; + description + "A measure of power."; + } + enum hertz { + value 7; + description + "A measure of frequency."; + } + enum celsius { + value 8; + description + "A measure of temperature."; + } + enum percent-RH { + value 9; + description + "A measure of percent relative humidity."; + } + enum rpm { + value 10; + description + "A measure of shaft revolutions per minute."; + } + enum cmm { + value 11; + description + "A measure of cubic meters per minute (airflow)."; + } + enum truth-value { + value 12; + description + "Value is one of 1 (true) or 2 (false)"; + } + } + description + "A node using this data type represents the sensor measurement + data type associated with a physical sensor value. The actual + data units are determined by examining a node of this type + together with the associated sensor-value-scale node. + + A node of this type SHOULD be defined together with nodes of + type sensor-value-scale and type sensor-value-precision. + These three types are used to identify the semantics of a node + of type sensor-value."; + reference + "RFC 3433: Entity Sensor Management Information Base - + EntitySensorDataType"; + } + + typedef sensor-value-scale { + type enumeration { + enum yocto { + value 1; + description + "Data scaling factor of 10^-24."; + } + enum zepto { + value 2; + description + "Data scaling factor of 10^-21."; + } + enum atto { + value 3; + description + "Data scaling factor of 10^-18."; + } + enum femto { + value 4; + description + "Data scaling factor of 10^-15."; + } + enum pico { + value 5; + description + "Data scaling factor of 10^-12."; + } + enum nano { + value 6; + description + "Data scaling factor of 10^-9."; + } + enum micro { + value 7; + description + "Data scaling factor of 10^-6."; + } + enum milli { + value 8; + description + "Data scaling factor of 10^-3."; + } + enum units { + value 9; + description + "Data scaling factor of 10^0."; + } + enum kilo { + value 10; + description + "Data scaling factor of 10^3."; + } + enum mega { + value 11; + description + "Data scaling factor of 10^6."; + } + enum giga { + value 12; + description + "Data scaling factor of 10^9."; + } + enum tera { + value 13; + description + "Data scaling factor of 10^12."; + } + enum peta { + value 14; + description + "Data scaling factor of 10^15."; + } + enum exa { + value 15; + description + "Data scaling factor of 10^18."; + } + enum zetta { + value 16; + description + "Data scaling factor of 10^21."; + } + enum yotta { + value 17; + description + "Data scaling factor of 10^24."; + } + } + description + "A node using this data type represents a data scaling factor, + represented with an International System of Units (SI) prefix. + The actual data units are determined by examining a node of + this type together with the associated sensor-value-type. + + A node of this type SHOULD be defined together with nodes of + type sensor-value-type and type sensor-value-precision. + Together, associated nodes of these three types are used to + identify the semantics of a node of type sensor-value."; + reference + "RFC 3433: Entity Sensor Management Information Base - + EntitySensorDataScale"; + } + + typedef sensor-value-precision { + type int8 { + range "-8 .. 9"; + } + description + "A node using this data type represents a sensor value + precision range. + + A node of this type SHOULD be defined together with nodes of + type sensor-value-type and type sensor-value-scale. Together, + associated nodes of these three types are used to identify the + semantics of a node of type sensor-value. + + If a node of this type contains a value in the range 1 to 9, + it represents the number of decimal places in the fractional + part of an associated sensor-value fixed-point number. + + If a node of this type contains a value in the range -8 to -1, + it represents the number of accurate digits in the associated + sensor-value fixed-point number. + + The value zero indicates the associated sensor-value node is + not a fixed-point number. + + Server implementers must choose a value for the associated + sensor-value-precision node so that the precision and accuracy + of the associated sensor-value node is correctly indicated. + + For example, a component representing a temperature sensor + that can measure 0 to 100 degrees C in 0.1 degree + increments, +/- 0.05 degrees, would have a + sensor-value-precision value of '1', a sensor-value-scale + value of 'units', and a sensor-value ranging from '0' to + '1000'. The sensor-value would be interpreted as + 'degrees C * 10'."; + reference + "RFC 3433: Entity Sensor Management Information Base - + EntitySensorPrecision"; + } + + typedef sensor-value { + type int32 { + range "-1000000000 .. 1000000000"; + } + description + "A node using this data type represents a sensor value. + + A node of this type SHOULD be defined together with nodes of + type sensor-value-type, type sensor-value-scale, and + type sensor-value-precision. Together, associated nodes of + those three types are used to identify the semantics of a node + of this data type. + + The semantics of a node using this data type are determined by + the value of the associated sensor-value-type node. + + If the associated sensor-value-type node is equal to 'voltsAC', + 'voltsDC', 'amperes', 'watts', 'hertz', 'celsius', or 'cmm', + then a node of this type MUST contain a fixed-point number + ranging from -999,999,999 to +999,999,999. The value + -1000000000 indicates an underflow error. The value + +1000000000 indicates an overflow error. The + sensor-value-precision indicates how many fractional digits + are represented in the associated sensor-value node. + + If the associated sensor-value-type node is equal to + 'percentRH', then a node of this type MUST contain a number + ranging from 0 to 100. + + If the associated sensor-value-type node is equal to 'rpm', + then a node of this type MUST contain a number ranging from + -999,999,999 to +999,999,999. + + If the associated sensor-value-type node is equal to + 'truth-value', then a node of this type MUST contain either the + value 1 (true) or the value 2 (false). + + If the associated sensor-value-type node is equal to 'other' or + 'unknown', then a node of this type MUST contain a number + ranging from -1000000000 to 1000000000."; + reference + "RFC 3433: Entity Sensor Management Information Base - + EntitySensorValue"; + } + + typedef sensor-status { + type enumeration { + enum ok { + value 1; + description + "Indicates that the server can obtain the sensor value."; + } + enum unavailable { + value 2; + description + "Indicates that the server presently cannot obtain the + sensor value."; + } + enum nonoperational { + value 3; + description + "Indicates that the server believes the sensor is broken. + The sensor could have a hard failure (disconnected wire) + or a soft failure such as out-of-range, jittery, or wildly + fluctuating readings."; + } + } + description + "A node using this data type represents the operational status + of a physical sensor."; + reference + "RFC 3433: Entity Sensor Management Information Base - + EntitySensorStatus"; + } + + /* + * Data nodes + */ + + container hardware { + description + "Data nodes representing components. + + If the server supports configuration of hardware components, + then this data model is instantiated in the configuration + datastores supported by the server. The leaf-list 'datastore' + for the module 'ietf-hardware' in the YANG library provides + this information."; + + leaf last-change { + type yang:date-and-time; + config false; + description + "The time the '/hardware/component' list changed in the + operational state."; + } + + list component { + key name; + description + "List of components. + + When the server detects a new hardware component, it + initializes a list entry in the operational state. + + If the server does not support configuration of hardware + components, list entries in the operational state are + initialized with values for all nodes as detected by the + implementation. + + Otherwise, this procedure is followed: + + 1. If there is an entry in the '/hardware/component' list + in the intended configuration with values for the nodes + 'class', 'parent', and 'parent-rel-pos' that are equal + to the detected values, then the list entry in the + operational state is initialized with the configured + values, including the 'name'. + + 2. Otherwise (i.e., there is no matching configuration + entry), the list entry in the operational state is + initialized with values for all nodes as detected by + the implementation. + + If the '/hardware/component' list in the intended + configuration is modified, then the system MUST behave as if + it re-initializes itself and follow the procedure in (1)."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalEntry"; + + leaf name { + type string; + description + "The name assigned to this component. + + This name is not required to be the same as + entPhysicalName."; + } + + leaf class { + type identityref { + base ianahw:hardware-class; + } + mandatory true; + description + "An indication of the general hardware type of the + component."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalClass"; + } + + leaf physical-index { + if-feature entity-mib; + type int32 { + range "1..2147483647"; + } + config false; + description + "The entPhysicalIndex for the entPhysicalEntry represented + by this list entry."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalIndex"; + } + + leaf description { + type string; + config false; + description + "A textual description of the component. This node should + contain a string that identifies the manufacturer's name + for the component and should be set to a distinct value + for each version or model of the component."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalDescr"; + } + + leaf parent { + type leafref { + path "../../component/name"; + require-instance false; + } + description + "The name of the component that physically contains this + component. + + If this leaf is not instantiated, it indicates that this + component is not contained in any other component. + + In the event that a physical component is contained by + more than one physical component (e.g., double-wide + modules), this node contains the name of one of these + components. An implementation MUST use the same name + every time this node is instantiated."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalContainedIn"; + } + + leaf parent-rel-pos { + type int32 { + range "0 .. 2147483647"; + } + description + "An indication of the relative position of this child + component among all its sibling components. Sibling + components are defined as components that: + + o share the same value of the 'parent' node and + + o share a common base identity for the 'class' node. + + Note that the last rule gives implementations flexibility + in how components are numbered. For example, some + implementations might have a single number series for all + components derived from 'ianahw:port', while some others + might have different number series for different + components with identities derived from 'ianahw:port' (for + example, one for registered jack 45 (RJ45) and one for + small form-factor pluggable (SFP))."; + + reference + "RFC 6933: Entity MIB (Version 4) - + entPhysicalParentRelPos"; + } + + leaf-list contains-child { + type leafref { + path "../../component/name"; + } + config false; + description + "The name of the contained component."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalChildIndex"; + } + + leaf hardware-rev { + type string; + config false; + description + "The vendor-specific hardware revision string for the + component. The preferred value is the hardware revision + identifier actually printed on the component itself (if + present)."; + reference + "RFC 6933: Entity MIB (Version 4) - + entPhysicalHardwareRev"; + } + + leaf firmware-rev { + type string; + config false; + description + "The vendor-specific firmware revision string for the + component."; + reference + "RFC 6933: Entity MIB (Version 4) - + entPhysicalFirmwareRev"; + } + + leaf software-rev { + type string; + config false; + + description + "The vendor-specific software revision string for the + component."; + reference + "RFC 6933: Entity MIB (Version 4) - + entPhysicalSoftwareRev"; + } + + leaf serial-num { + type string; + config false; + description + "The vendor-specific serial number string for the + component. The preferred value is the serial number + string actually printed on the component itself (if + present)."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalSerialNum"; + } + + leaf mfg-name { + type string; + config false; + description + "The name of the manufacturer of this physical component. + The preferred value is the manufacturer name string + actually printed on the component itself (if present). + + Note that comparisons between instances of the + 'model-name', 'firmware-rev', 'software-rev', and + 'serial-num' nodes are only meaningful amongst components + with the same value of 'mfg-name'. + + If the manufacturer name string associated with the + physical component is unknown to the server, then this + node is not instantiated."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalMfgName"; + } + + leaf model-name { + type string; + config false; + description + "The vendor-specific model name identifier string + associated with this physical component. The preferred + value is the customer-visible part number, which may be + printed on the component itself. + If the model name string associated with the physical + component is unknown to the server, then this node is not + instantiated."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalModelName"; + } + + leaf alias { + type string; + description + "An 'alias' name for the component, as specified by a + network manager, that provides a non-volatile 'handle' for + the component. + + If no configured value exists, the server MAY set the + value of this node to a locally unique value in the + operational state. + + A server implementation MAY map this leaf to the + entPhysicalAlias MIB object. Such an implementation needs + to use some mechanism to handle the differences in size + and characters allowed between this leaf and + entPhysicalAlias. The definition of such a mechanism is + outside the scope of this document."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalAlias"; + } + + leaf asset-id { + type string; + description + "This node is a user-assigned asset tracking identifier for + the component. + + A server implementation MAY map this leaf to the + entPhysicalAssetID MIB object. Such an implementation + needs to use some mechanism to handle the differences in + size and characters allowed between this leaf and + entPhysicalAssetID. The definition of such a mechanism is + outside the scope of this document."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalAssetID"; + } + + leaf is-fru { + type boolean; + config false; + + description + "This node indicates whether or not this component is + considered a 'field-replaceable unit' by the vendor. If + this node contains the value 'true', then this component + identifies a field-replaceable unit. For all components + that are permanently contained within a field-replaceable + unit, the value 'false' should be returned for this + node."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalIsFRU"; + } + + leaf mfg-date { + type yang:date-and-time; + config false; + description + "The date of manufacturing of the managed component."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalMfgDate"; + } + + leaf-list uri { + type inet:uri; + description + "This node contains identification information about the + component."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalUris"; + } + + leaf uuid { + type yang:uuid; + config false; + description + "A Universally Unique Identifier of the component."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalUUID"; + } + + container state { + if-feature hardware-state; + description + "State-related nodes"; + reference + "RFC 4268: Entity State MIB"; + + leaf state-last-changed { + type yang:date-and-time; + config false; + description + "The date and time when the value of any of the + admin-state, oper-state, usage-state, alarm-state, or + standby-state changed for this component. + + If there has been no change since the last + re-initialization of the local system, this node + contains the date and time of local system + initialization. If there has been no change since the + component was added to the local system, this node + contains the date and time of the insertion."; + reference + "RFC 4268: Entity State MIB - entStateLastChanged"; + } + + leaf admin-state { + type admin-state; + description + "The administrative state for this component. + + This node refers to a component's administrative + permission to service both other components within its + containment hierarchy as well other users of its + services defined by means outside the scope of this + module. + + Some components exhibit only a subset of the remaining + administrative state values. Some components cannot be + locked; hence, this node exhibits only the 'unlocked' + state. Other components cannot be shut down gracefully; + hence, this node does not exhibit the 'shutting-down' + state."; + reference + "RFC 4268: Entity State MIB - entStateAdmin"; + } + + leaf oper-state { + type oper-state; + config false; + description + "The operational state for this component. + + Note that this node does not follow the administrative + state. An administrative state of 'down' does not + predict an operational state of 'disabled'. + + Note that some implementations may not be able to + accurately report oper-state while the admin-state node + has a value other than 'unlocked'. In these cases, this + node MUST have a value of 'unknown'."; + reference + "RFC 4268: Entity State MIB - entStateOper"; + } + + leaf usage-state { + type usage-state; + config false; + description + "The usage state for this component. + + This node refers to a component's ability to service + more components in a containment hierarchy. + + Some components will exhibit only a subset of the usage + state values. Components that are unable to ever + service any components within a containment hierarchy + will always have a usage state of 'busy'. In some + cases, a component will be able to support only one + other component within its containment hierarchy and + will therefore only exhibit values of 'idle' and + 'busy'."; + reference + "RFC 4268: Entity State MIB - entStateUsage"; + } + + leaf alarm-state { + type alarm-state; + config false; + description + "The alarm state for this component. It does not + include the alarms raised on child components within its + containment hierarchy."; + reference + "RFC 4268: Entity State MIB - entStateAlarm"; + } + + leaf standby-state { + type standby-state; + config false; + description + "The standby state for this component. + + Some components will exhibit only a subset of the + remaining standby state values. If this component + cannot operate in a standby role, the value of this node + will always be 'providing-service'."; + reference + "RFC 4268: Entity State MIB - entStateStandby"; + } + } + + container sensor-data { + when 'derived-from-or-self(../class, + "ianahw:sensor")' { + description + "Sensor data nodes present for any component of type + 'sensor'"; + } + if-feature hardware-sensor; + config false; + + description + "Sensor-related nodes."; + reference + "RFC 3433: Entity Sensor Management Information Base"; + + leaf value { + type sensor-value; + description + "The most recent measurement obtained by the server + for this sensor. + + A client that periodically fetches this node should also + fetch the nodes 'value-type', 'value-scale', and + 'value-precision', since they may change when the value + is changed."; + reference + "RFC 3433: Entity Sensor Management Information Base - + entPhySensorValue"; + } + + leaf value-type { + type sensor-value-type; + description + "The type of data units associated with the + sensor value"; + reference + "RFC 3433: Entity Sensor Management Information Base - + entPhySensorType"; + } + leaf value-scale { + type sensor-value-scale; + description + "The (power of 10) scaling factor associated + with the sensor value"; + reference + "RFC 3433: Entity Sensor Management Information Base - + entPhySensorScale"; + } + + leaf value-precision { + type sensor-value-precision; + description + "The number of decimal places of precision + associated with the sensor value"; + reference + "RFC 3433: Entity Sensor Management Information Base - + entPhySensorPrecision"; + } + + leaf oper-status { + type sensor-status; + description + "The operational status of the sensor."; + reference + "RFC 3433: Entity Sensor Management Information Base - + entPhySensorOperStatus"; + } + + leaf units-display { + type string; + description + "A textual description of the data units that should be + used in the display of the sensor value."; + reference + "RFC 3433: Entity Sensor Management Information Base - + entPhySensorUnitsDisplay"; + } + + leaf value-timestamp { + type yang:date-and-time; + description + "The time the status and/or value of this sensor was last + obtained by the server."; + reference + "RFC 3433: Entity Sensor Management Information Base - + entPhySensorValueTimeStamp"; + } + leaf value-update-rate { + type uint32; + units "milliseconds"; + description + "An indication of the frequency that the server updates + the associated 'value' node, represented in + milliseconds. The value zero indicates: + + - the sensor value is updated on demand (e.g., + when polled by the server for a get-request), + + - the sensor value is updated when the sensor + value changes (event-driven), or + + - the server does not know the update rate."; + reference + "RFC 3433: Entity Sensor Management Information Base - + entPhySensorValueUpdateRate"; + } + } + } + } + + /* + * Notifications + */ + + notification hardware-state-change { + description + "A hardware-state-change notification is generated when the + value of /hardware/last-change changes in the operational + state."; + reference + "RFC 6933: Entity MIB (Version 4) - entConfigChange"; + } + + notification hardware-state-oper-enabled { + if-feature hardware-state; + description + "A hardware-state-oper-enabled notification signifies that a + component has transitioned into the 'enabled' state."; + + leaf name { + type leafref { + path "/hardware/component/name"; + } + + description + "The name of the component that has transitioned into the + 'enabled' state."; + } + leaf admin-state { + type leafref { + path "/hardware/component/state/admin-state"; + } + description + "The administrative state for the component."; + } + leaf alarm-state { + type leafref { + path "/hardware/component/state/alarm-state"; + } + description + "The alarm state for the component."; + } + reference + "RFC 4268: Entity State MIB - entStateOperEnabled"; + } + + notification hardware-state-oper-disabled { + if-feature hardware-state; + description + "A hardware-state-oper-disabled notification signifies that a + component has transitioned into the 'disabled' state."; + + leaf name { + type leafref { + path "/hardware/component/name"; + } + description + "The name of the component that has transitioned into the + 'disabled' state."; + } + leaf admin-state { + type leafref { + path "/hardware/component/state/admin-state"; + } + description + "The administrative state for the component."; + } + leaf alarm-state { + type leafref { + path "/hardware/component/state/alarm-state"; + } + + description + "The alarm state for the component."; + } + reference + "RFC 4268: Entity State MIB - entStateOperDisabled"; + } + +} diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/ietf-inet-types@2013-07-15.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/ietf-inet-types@2013-07-15.yang new file mode 100644 index 000000000..eacefb636 --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/ietf-inet-types@2013-07-15.yang @@ -0,0 +1,458 @@ +module ietf-inet-types { + + namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types"; + prefix "inet"; + + organization + "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; + + contact + "WG Web: + WG List: + + WG Chair: David Kessens + + + WG Chair: Juergen Schoenwaelder + + + Editor: Juergen Schoenwaelder + "; + + description + "This module contains a collection of generally useful derived + YANG data types for Internet addresses and related things. + + Copyright (c) 2013 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6991; see + the RFC itself for full legal notices."; + + revision 2013-07-15 { + description + "This revision adds the following new data types: + - ip-address-no-zone + - ipv4-address-no-zone + - ipv6-address-no-zone"; + reference + "RFC 6991: Common YANG Data Types"; + } + + revision 2010-09-24 { + description + "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + } + + /*** collection of types related to protocol fields ***/ + + typedef ip-version { + type enumeration { + enum unknown { + value "0"; + description + "An unknown or unspecified version of the Internet + protocol."; + } + enum ipv4 { + value "1"; + description + "The IPv4 protocol as defined in RFC 791."; + } + enum ipv6 { + value "2"; + description + "The IPv6 protocol as defined in RFC 2460."; + } + } + description + "This value represents the version of the IP protocol. + + In the value set and its semantics, this type is equivalent + to the InetVersion textual convention of the SMIv2."; + reference + "RFC 791: Internet Protocol + RFC 2460: Internet Protocol, Version 6 (IPv6) Specification + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + typedef dscp { + type uint8 { + range "0..63"; + } + description + "The dscp type represents a Differentiated Services Code Point + that may be used for marking packets in a traffic stream. + In the value set and its semantics, this type is equivalent + to the Dscp textual convention of the SMIv2."; + reference + "RFC 3289: Management Information Base for the Differentiated + Services Architecture + RFC 2474: Definition of the Differentiated Services Field + (DS Field) in the IPv4 and IPv6 Headers + RFC 2780: IANA Allocation Guidelines For Values In + the Internet Protocol and Related Headers"; + } + + typedef ipv6-flow-label { + type uint32 { + range "0..1048575"; + } + description + "The ipv6-flow-label type represents the flow identifier or Flow + Label in an IPv6 packet header that may be used to + discriminate traffic flows. + + In the value set and its semantics, this type is equivalent + to the IPv6FlowLabel textual convention of the SMIv2."; + reference + "RFC 3595: Textual Conventions for IPv6 Flow Label + RFC 2460: Internet Protocol, Version 6 (IPv6) Specification"; + } + + typedef port-number { + type uint16 { + range "0..65535"; + } + description + "The port-number type represents a 16-bit port number of an + Internet transport-layer protocol such as UDP, TCP, DCCP, or + SCTP. Port numbers are assigned by IANA. A current list of + all assignments is available from . + + Note that the port number value zero is reserved by IANA. In + situations where the value zero does not make sense, it can + be excluded by subtyping the port-number type. + In the value set and its semantics, this type is equivalent + to the InetPortNumber textual convention of the SMIv2."; + reference + "RFC 768: User Datagram Protocol + RFC 793: Transmission Control Protocol + RFC 4960: Stream Control Transmission Protocol + RFC 4340: Datagram Congestion Control Protocol (DCCP) + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + /*** collection of types related to autonomous systems ***/ + + typedef as-number { + type uint32; + description + "The as-number type represents autonomous system numbers + which identify an Autonomous System (AS). An AS is a set + of routers under a single technical administration, using + an interior gateway protocol and common metrics to route + packets within the AS, and using an exterior gateway + protocol to route packets to other ASes. IANA maintains + the AS number space and has delegated large parts to the + regional registries. + + Autonomous system numbers were originally limited to 16 + bits. BGP extensions have enlarged the autonomous system + number space to 32 bits. This type therefore uses an uint32 + base type without a range restriction in order to support + a larger autonomous system number space. + + In the value set and its semantics, this type is equivalent + to the InetAutonomousSystemNumber textual convention of + the SMIv2."; + reference + "RFC 1930: Guidelines for creation, selection, and registration + of an Autonomous System (AS) + RFC 4271: A Border Gateway Protocol 4 (BGP-4) + RFC 4001: Textual Conventions for Internet Network Addresses + RFC 6793: BGP Support for Four-Octet Autonomous System (AS) + Number Space"; + } + + /*** collection of types related to IP addresses and hostnames ***/ + + typedef ip-address { + type union { + type inet:ipv4-address; + type inet:ipv6-address; + } + description + "The ip-address type represents an IP address and is IP + version neutral. The format of the textual representation + implies the IP version. This type supports scoped addresses + by allowing zone identifiers in the address format."; + reference + "RFC 4007: IPv6 Scoped Address Architecture"; + } + + typedef ipv4-address { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '(%[\p{N}\p{L}]+)?'; + } + description + "The ipv4-address type represents an IPv4 address in + dotted-quad notation. The IPv4 address may include a zone + index, separated by a % sign. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format for the zone index is the numerical + format"; + } + + typedef ipv6-address { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(%[\p{N}\p{L}]+)?'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(%.+)?'; + } + description + "The ipv6-address type represents an IPv6 address in full, + mixed, shortened, and shortened-mixed notation. The IPv6 + address may include a zone index, separated by a % sign. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format of IPv6 addresses uses the textual + representation defined in Section 4 of RFC 5952. The + canonical format for the zone index is the numerical + format as described in Section 11.2 of RFC 4007."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + typedef ip-address-no-zone { + type union { + type inet:ipv4-address-no-zone; + type inet:ipv6-address-no-zone; + } + description + "The ip-address-no-zone type represents an IP address and is + IP version neutral. The format of the textual representation + implies the IP version. This type does not support scoped + addresses since it does not allow zone identifiers in the + address format."; + reference + "RFC 4007: IPv6 Scoped Address Architecture"; + } + + typedef ipv4-address-no-zone { + type inet:ipv4-address { + pattern '[0-9\.]*'; + } + description + "An IPv4 address without a zone index. This type, derived from + ipv4-address, may be used in situations where the zone is + known from the context and hence no zone index is needed."; + } + + typedef ipv6-address-no-zone { + type inet:ipv6-address { + pattern '[0-9a-fA-F:\.]*'; + } + description + "An IPv6 address without a zone index. This type, derived from + ipv6-address, may be used in situations where the zone is + known from the context and hence no zone index is needed."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + typedef ip-prefix { + type union { + type inet:ipv4-prefix; + type inet:ipv6-prefix; + } + description + "The ip-prefix type represents an IP prefix and is IP + version neutral. The format of the textual representations + implies the IP version."; + } + + typedef ipv4-prefix { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '/(([0-9])|([1-2][0-9])|(3[0-2]))'; + } + description + "The ipv4-prefix type represents an IPv4 address prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 32. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The canonical format of an IPv4 prefix has all bits of + the IPv4 address set to zero that are not part of the + IPv4 prefix."; + } + + typedef ipv6-prefix { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(/.+)'; + } + + description + "The ipv6-prefix type represents an IPv6 address prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 128. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The IPv6 address should have all bits that do not belong + to the prefix set to zero. + + The canonical format of an IPv6 prefix has all bits of + the IPv6 address set to zero that are not part of the + IPv6 prefix. Furthermore, the IPv6 address is represented + as defined in Section 4 of RFC 5952."; + reference + "RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + /*** collection of domain name and URI types ***/ + + typedef domain-name { + type string { + pattern + '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' + + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' + + '|\.'; + length "1..253"; + } + description + "The domain-name type represents a DNS domain name. The + name SHOULD be fully qualified whenever possible. + + Internet domain names are only loosely specified. Section + 3.5 of RFC 1034 recommends a syntax (modified in Section + 2.1 of RFC 1123). The pattern above is intended to allow + for current practice in domain name use, and some possible + future expansion. It is designed to hold various types of + domain names, including names used for A or AAAA records + (host names) and other records, such as SRV records. Note + that Internet host names have a stricter syntax (described + in RFC 952) than the DNS recommendations in RFCs 1034 and + 1123, and that systems that want to store host names in + schema nodes using the domain-name type are recommended to + adhere to this stricter standard to ensure interoperability. + + The encoding of DNS names in the DNS protocol is limited + to 255 characters. Since the encoding consists of labels + prefixed by a length bytes and there is a trailing NULL + byte, only 253 characters can appear in the textual dotted + notation. + + The description clause of schema nodes using the domain-name + type MUST describe when and how these names are resolved to + IP addresses. Note that the resolution of a domain-name value + may require to query multiple DNS records (e.g., A for IPv4 + and AAAA for IPv6). The order of the resolution process and + which DNS record takes precedence can either be defined + explicitly or may depend on the configuration of the + resolver. + + Domain-name values use the US-ASCII encoding. Their canonical + format uses lowercase US-ASCII characters. Internationalized + domain names MUST be A-labels as per RFC 5890."; + reference + "RFC 952: DoD Internet Host Table Specification + RFC 1034: Domain Names - Concepts and Facilities + RFC 1123: Requirements for Internet Hosts -- Application + and Support + RFC 2782: A DNS RR for specifying the location of services + (DNS SRV) + RFC 5890: Internationalized Domain Names in Applications + (IDNA): Definitions and Document Framework"; + } + + typedef host { + type union { + type inet:ip-address; + type inet:domain-name; + } + description + "The host type represents either an IP address or a DNS + domain name."; + } + + typedef uri { + type string; + description + "The uri type represents a Uniform Resource Identifier + (URI) as defined by STD 66. + + Objects using the uri type MUST be in US-ASCII encoding, + and MUST be normalized as described by RFC 3986 Sections + 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary + percent-encoding is removed, and all case-insensitive + characters are set to lowercase except for hexadecimal + digits, which are normalized to uppercase as described in + Section 6.2.2.1. + + The purpose of this normalization is to help provide + unique URIs. Note that this normalization is not + sufficient to provide uniqueness. Two URIs that are + textually distinct after this normalization may still be + equivalent. + + Objects using the uri type may restrict the schemes that + they permit. For example, 'data:' and 'urn:' schemes + might not be appropriate. + + A zero-length URI is not a valid URI. This can be used to + express 'URI absent' where required. + + In the value set and its semantics, this type is equivalent + to the Uri SMIv2 textual convention defined in RFC 5017."; + reference + "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax + RFC 3305: Report from the Joint W3C/IETF URI Planning Interest + Group: Uniform Resource Identifiers (URIs), URLs, + and Uniform Resource Names (URNs): Clarifications + and Recommendations + RFC 5017: MIB Textual Conventions for Uniform Resource + Identifiers (URIs)"; + } + +} diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/ietf-yang-types@2013-07-15.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/ietf-yang-types@2013-07-15.yang new file mode 100644 index 000000000..ee58fa3ab --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/ietf-yang-types@2013-07-15.yang @@ -0,0 +1,474 @@ +module ietf-yang-types { + + namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types"; + prefix "yang"; + + organization + "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; + + contact + "WG Web: + WG List: + + WG Chair: David Kessens + + + WG Chair: Juergen Schoenwaelder + + + Editor: Juergen Schoenwaelder + "; + + description + "This module contains a collection of generally useful derived + YANG data types. + + Copyright (c) 2013 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6991; see + the RFC itself for full legal notices."; + + revision 2013-07-15 { + description + "This revision adds the following new data types: + - yang-identifier + - hex-string + - uuid + - dotted-quad"; + reference + "RFC 6991: Common YANG Data Types"; + } + + revision 2010-09-24 { + description + "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + } + + /*** collection of counter and gauge types ***/ + + typedef counter32 { + type uint32; + description + "The counter32 type represents a non-negative integer + that monotonically increases until it reaches a + maximum value of 2^32-1 (4294967295 decimal), when it + wraps around and starts increasing again from zero. + + Counters have no defined 'initial' value, and thus, a + single value of a counter has (in general) no information + content. Discontinuities in the monotonically increasing + value normally occur at re-initialization of the + management system, and at other times as specified in the + description of a schema node using this type. If such + other times can occur, for example, the creation of + a schema node of type counter32 at times other than + re-initialization, then a corresponding schema node + should be defined, with an appropriate type, to indicate + the last discontinuity. + + The counter32 type should not be used for configuration + schema nodes. A default statement SHOULD NOT be used in + combination with the type counter32. + + In the value set and its semantics, this type is equivalent + to the Counter32 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef zero-based-counter32 { + type yang:counter32; + default "0"; + description + "The zero-based-counter32 type represents a counter32 + that has the defined 'initial' value zero. + + A schema node of this type will be set to zero (0) on creation + and will thereafter increase monotonically until it reaches + a maximum value of 2^32-1 (4294967295 decimal), when it + wraps around and starts increasing again from zero. + + Provided that an application discovers a new schema node + of this type within the minimum time to wrap, it can use the + 'initial' value as a delta. It is important for a management + station to be aware of this minimum time and the actual time + between polls, and to discard data if the actual time is too + long or there is no defined minimum time. + + In the value set and its semantics, this type is equivalent + to the ZeroBasedCounter32 textual convention of the SMIv2."; + reference + "RFC 4502: Remote Network Monitoring Management Information + Base Version 2"; + } + + typedef counter64 { + type uint64; + description + "The counter64 type represents a non-negative integer + that monotonically increases until it reaches a + maximum value of 2^64-1 (18446744073709551615 decimal), + when it wraps around and starts increasing again from zero. + + Counters have no defined 'initial' value, and thus, a + single value of a counter has (in general) no information + content. Discontinuities in the monotonically increasing + value normally occur at re-initialization of the + management system, and at other times as specified in the + description of a schema node using this type. If such + other times can occur, for example, the creation of + a schema node of type counter64 at times other than + re-initialization, then a corresponding schema node + should be defined, with an appropriate type, to indicate + the last discontinuity. + + The counter64 type should not be used for configuration + schema nodes. A default statement SHOULD NOT be used in + combination with the type counter64. + + In the value set and its semantics, this type is equivalent + to the Counter64 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef zero-based-counter64 { + type yang:counter64; + default "0"; + description + "The zero-based-counter64 type represents a counter64 that + has the defined 'initial' value zero. + + A schema node of this type will be set to zero (0) on creation + and will thereafter increase monotonically until it reaches + a maximum value of 2^64-1 (18446744073709551615 decimal), + when it wraps around and starts increasing again from zero. + + Provided that an application discovers a new schema node + of this type within the minimum time to wrap, it can use the + 'initial' value as a delta. It is important for a management + station to be aware of this minimum time and the actual time + between polls, and to discard data if the actual time is too + long or there is no defined minimum time. + + In the value set and its semantics, this type is equivalent + to the ZeroBasedCounter64 textual convention of the SMIv2."; + reference + "RFC 2856: Textual Conventions for Additional High Capacity + Data Types"; + } + + typedef gauge32 { + type uint32; + description + "The gauge32 type represents a non-negative integer, which + may increase or decrease, but shall never exceed a maximum + value, nor fall below a minimum value. The maximum value + cannot be greater than 2^32-1 (4294967295 decimal), and + the minimum value cannot be smaller than 0. The value of + a gauge32 has its maximum value whenever the information + being modeled is greater than or equal to its maximum + value, and has its minimum value whenever the information + being modeled is smaller than or equal to its minimum value. + If the information being modeled subsequently decreases + below (increases above) the maximum (minimum) value, the + gauge32 also decreases (increases). + + In the value set and its semantics, this type is equivalent + to the Gauge32 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef gauge64 { + type uint64; + description + "The gauge64 type represents a non-negative integer, which + may increase or decrease, but shall never exceed a maximum + value, nor fall below a minimum value. The maximum value + cannot be greater than 2^64-1 (18446744073709551615), and + the minimum value cannot be smaller than 0. The value of + a gauge64 has its maximum value whenever the information + being modeled is greater than or equal to its maximum + value, and has its minimum value whenever the information + being modeled is smaller than or equal to its minimum value. + If the information being modeled subsequently decreases + below (increases above) the maximum (minimum) value, the + gauge64 also decreases (increases). + + In the value set and its semantics, this type is equivalent + to the CounterBasedGauge64 SMIv2 textual convention defined + in RFC 2856"; + reference + "RFC 2856: Textual Conventions for Additional High Capacity + Data Types"; + } + + /*** collection of identifier-related types ***/ + + typedef object-identifier { + type string { + pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))' + + '(\.(0|([1-9]\d*)))*'; + } + description + "The object-identifier type represents administratively + assigned names in a registration-hierarchical-name tree. + + Values of this type are denoted as a sequence of numerical + non-negative sub-identifier values. Each sub-identifier + value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers + are separated by single dots and without any intermediate + whitespace. + + The ASN.1 standard restricts the value space of the first + sub-identifier to 0, 1, or 2. Furthermore, the value space + of the second sub-identifier is restricted to the range + 0 to 39 if the first sub-identifier is 0 or 1. Finally, + the ASN.1 standard requires that an object identifier + has always at least two sub-identifiers. The pattern + captures these restrictions. + + Although the number of sub-identifiers is not limited, + module designers should realize that there may be + implementations that stick with the SMIv2 limit of 128 + sub-identifiers. + + This type is a superset of the SMIv2 OBJECT IDENTIFIER type + since it is not restricted to 128 sub-identifiers. Hence, + this type SHOULD NOT be used to represent the SMIv2 OBJECT + IDENTIFIER type; the object-identifier-128 type SHOULD be + used instead."; + reference + "ISO9834-1: Information technology -- Open Systems + Interconnection -- Procedures for the operation of OSI + Registration Authorities: General procedures and top + arcs of the ASN.1 Object Identifier tree"; + } + + typedef object-identifier-128 { + type object-identifier { + pattern '\d*(\.\d*){1,127}'; + } + description + "This type represents object-identifiers restricted to 128 + sub-identifiers. + + In the value set and its semantics, this type is equivalent + to the OBJECT IDENTIFIER type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef yang-identifier { + type string { + length "1..max"; + pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*'; + pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*'; + } + description + "A YANG identifier string as defined by the 'identifier' + rule in Section 12 of RFC 6020. An identifier must + start with an alphabetic character or an underscore + followed by an arbitrary sequence of alphabetic or + numeric characters, underscores, hyphens, or dots. + + A YANG identifier MUST NOT start with any possible + combination of the lowercase or uppercase character + sequence 'xml'."; + reference + "RFC 6020: YANG - A Data Modeling Language for the Network + Configuration Protocol (NETCONF)"; + } + + /*** collection of types related to date and time***/ + + typedef date-and-time { + type string { + pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?' + + '(Z|[\+\-]\d{2}:\d{2})'; + } + description + "The date-and-time type is a profile of the ISO 8601 + standard for representation of dates and times using the + Gregorian calendar. The profile is defined by the + date-time production in Section 5.6 of RFC 3339. + + The date-and-time type is compatible with the dateTime XML + schema type with the following notable exceptions: + + (a) The date-and-time type does not allow negative years. + + (b) The date-and-time time-offset -00:00 indicates an unknown + time zone (see RFC 3339) while -00:00 and +00:00 and Z + all represent the same time zone in dateTime. + + (c) The canonical format (see below) of data-and-time values + differs from the canonical format used by the dateTime XML + schema type, which requires all times to be in UTC using + the time-offset 'Z'. + + This type is not equivalent to the DateAndTime textual + convention of the SMIv2 since RFC 3339 uses a different + separator between full-date and full-time and provides + higher resolution of time-secfrac. + + The canonical format for date-and-time values with a known time + zone uses a numeric time zone offset that is calculated using + the device's configured known offset to UTC time. A change of + the device's offset to UTC time will cause date-and-time values + to change accordingly. Such changes might happen periodically + in case a server follows automatically daylight saving time + (DST) time zone offset changes. The canonical format for + date-and-time values with an unknown time zone (usually + referring to the notion of local time) uses the time-offset + -00:00."; + reference + "RFC 3339: Date and Time on the Internet: Timestamps + RFC 2579: Textual Conventions for SMIv2 + XSD-TYPES: XML Schema Part 2: Datatypes Second Edition"; + } + + typedef timeticks { + type uint32; + description + "The timeticks type represents a non-negative integer that + represents the time, modulo 2^32 (4294967296 decimal), in + hundredths of a second between two epochs. When a schema + node is defined that uses this type, the description of + the schema node identifies both of the reference epochs. + + In the value set and its semantics, this type is equivalent + to the TimeTicks type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef timestamp { + type yang:timeticks; + description + "The timestamp type represents the value of an associated + timeticks schema node at which a specific occurrence + happened. The specific occurrence must be defined in the + description of any schema node defined using this type. When + the specific occurrence occurred prior to the last time the + associated timeticks attribute was zero, then the timestamp + value is zero. Note that this requires all timestamp values + to be reset to zero when the value of the associated timeticks + attribute reaches 497+ days and wraps around to zero. + + The associated timeticks schema node must be specified + in the description of any schema node using this type. + + In the value set and its semantics, this type is equivalent + to the TimeStamp textual convention of the SMIv2."; + reference + "RFC 2579: Textual Conventions for SMIv2"; + } + + /*** collection of generic address types ***/ + + typedef phys-address { + type string { + pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + } + + description + "Represents media- or physical-level addresses represented + as a sequence octets, each octet represented by two hexadecimal + numbers. Octets are separated by colons. The canonical + representation uses lowercase characters. + + In the value set and its semantics, this type is equivalent + to the PhysAddress textual convention of the SMIv2."; + reference + "RFC 2579: Textual Conventions for SMIv2"; + } + + typedef mac-address { + type string { + pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'; + } + description + "The mac-address type represents an IEEE 802 MAC address. + The canonical representation uses lowercase characters. + + In the value set and its semantics, this type is equivalent + to the MacAddress textual convention of the SMIv2."; + reference + "IEEE 802: IEEE Standard for Local and Metropolitan Area + Networks: Overview and Architecture + RFC 2579: Textual Conventions for SMIv2"; + } + + /*** collection of XML-specific types ***/ + + typedef xpath1.0 { + type string; + description + "This type represents an XPATH 1.0 expression. + + When a schema node is defined that uses this type, the + description of the schema node MUST specify the XPath + context in which the XPath expression is evaluated."; + reference + "XPATH: XML Path Language (XPath) Version 1.0"; + } + + /*** collection of string types ***/ + + typedef hex-string { + type string { + pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + } + description + "A hexadecimal string with octets represented as hex digits + separated by colons. The canonical representation uses + lowercase characters."; + } + + typedef uuid { + type string { + pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' + + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'; + } + description + "A Universally Unique IDentifier in the string representation + defined in RFC 4122. The canonical representation uses + lowercase characters. + + The following is an example of a UUID in string representation: + f81d4fae-7dec-11d0-a765-00a0c91e6bf6 + "; + reference + "RFC 4122: A Universally Unique IDentifier (UUID) URN + Namespace"; + } + + typedef dotted-quad { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'; + } + description + "An unsigned 32-bit number expressed in the dotted-quad + notation, i.e., four octets written as decimal numbers + and separated with the '.' (full stop) character."; + } +} diff --git a/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py b/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py index ce60bdea3..b5fd18971 100644 --- a/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py +++ b/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py @@ -23,6 +23,9 @@ from .Tools import ( format_grpc_to_json, grpc_connection_id, grpc_context_id, grpc_device_id, grpc_link_id, grpc_policy_rule_id, grpc_service_id, grpc_service, grpc_slice_id, grpc_topology_id) +from nbi.service.rest_server.nbi_plugins.ietf_hardware import YangHandler + + class _Resource(Resource): def __init__(self) -> None: super().__init__() @@ -173,7 +176,16 @@ class Devices(_Resource): class Device(_Resource): def get(self, device_uuid : str): return format_grpc_to_json(self.client.GetDevice(grpc_device_id(device_uuid))) +class Deviceshw(_Resource): + def get(self, device_uuid : str): + device =format_grpc_to_json(self.client.GetDevice(grpc_device_id(device_uuid))) + yang_handler = YangHandler('ietf-hardware') + + hardware_reply = yang_handler.compose(device) + device = jsonify(hardware_reply) + return device + class LinkIds(_Resource): def get(self): return format_grpc_to_json(self.client.ListLinkIds(Empty())) diff --git a/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py b/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py index 41e8ff1ea..67391debf 100644 --- a/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py +++ b/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py @@ -16,7 +16,7 @@ from nbi.service.rest_server.RestServer import RestServer from .Resources import ( Connection, ConnectionIds, Connections, Context, ContextIds, Contexts, - Device, DeviceIds, Devices, + Device, DeviceIds, Deviceshw, DummyContexts, Link, LinkIds, Links, PolicyRule, PolicyRuleIds, PolicyRules, @@ -46,11 +46,13 @@ RESOURCES = [ ('api.slice_ids', SliceIds, '/context//slice_ids'), ('api.slices', Slices, '/context//slices'), ('api.slice', Slice, '/context//slice/'), - +''' ('api.device_ids', DeviceIds, '/device_ids'), ('api.devices', Devices, '/devices'), ('api.device', Device, '/device/'), - + ''' + ('api.deviceshw', Deviceshw, '/device//hardware'), + ('api.link_ids', LinkIds, '/link_ids'), ('api.links', Links, '/links'), ('api.link', Link, '/link/'), diff --git a/src/tests/ecoc22/tests/Objects.py b/src/tests/ecoc22/tests/Objects.py index 3a96e6625..9daac3265 100644 --- a/src/tests/ecoc22/tests/Objects.py +++ b/src/tests/ecoc22/tests/Objects.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from common.tools.object_factory.Device import json_device_id +from common.tools.object_factory.t json_device_id from common.tools.object_factory.EndPoint import json_endpoint_id from tests.tools.mock_osm.Tools import connection_point, wim_mapping diff --git a/src/tests/ofc23/descriptors/real/dc-2-dc-service.json b/src/tests/ofc23/descriptors/real/dc-2-dc-service.json index 3a83afa6d..beabd44e5 100644 --- a/src/tests/ofc23/descriptors/real/dc-2-dc-service.json +++ b/src/tests/ofc23/descriptors/real/dc-2-dc-service.json @@ -20,7 +20,7 @@ "mtu": 1512, "vlan_id": 111 }}}, {"action": 1, "custom": {"resource_key": "/device[R149]/endpoint[eth-1/0/22]/settings", "resource_value": { - "route_distinguisher": "65000:123", "router_id": "5.5.5.5", + "route_distinguisher": "65000:123", "router_id": "", "address_ip": "172.16.4.1", "address_prefix": 24, "sub_interface_index": 0, "vlan_id": 111 }}}, {"action": 1, "custom": {"resource_key": "/device[R155]/endpoint[eth-1/0/22]/settings", "resource_value": { diff --git a/test.py b/test.py new file mode 100644 index 000000000..49dff75f9 --- /dev/null +++ b/test.py @@ -0,0 +1,291 @@ + +import concurrent.futures, json, logging, operator +import sys +from typing import Any, Dict, List, Optional, Tuple, Union + +TypeResults = List[Tuple[str, str, int, List[str]]] # entity_name, action, num_ok, list[error] + +class DescriptorLoader: + def __init__( + self, descriptors : Optional[Union[str, Dict]] = None, descriptors_file : Optional[str] = None, + num_workers : int = 1, + ) -> None: + print('holaa') + descriptors = { + "ietf-network-slice-service:network-slice-services": { + "slo-sle-templates": { + "slo-sle-template": [ + { + "id": "high-BW-template", + "description": "take the highest BW forwarding path" + }, + { + "id": "low-latency-template", + "description": "lowest possible latency forwarding behavior" + } + ] + }, + "slice-service": [ + { + "id": "slice_d1_d2", + "description": "example slice p2p between two devices", + "slo-sle-template": "low-latency-template", + "status": {}, + "sdps": { + "sdp": [ + { + "id": "1", + "node-id": "4.4.4.4", + "service-match-criteria": { + "match-criterion": [ + { + "index": 1, + "match-type": "ietf-nss:service-any-match", + "target-connection-group-id": "matrix1" + } + ] + }, + "attachment-circuits": { + "attachment-circuit": [ + { + "id": "ac1", + "description": "AC1 connected to device 1", + "ac-node-id": "4.4.4.4", + "ac-tp-id": "to_HL3-1-2", + "ac-tags": { + "ac-tags": [ + { + "tag-type": "ietf-nss:vlan-id", + "value": [ + "100" + ] + } + ] + }, + "status": {} + } + ] + }, + "status": {} + }, + { + "id": "2", + "node-id": "5.5.5.5", + "service-match-criteria": { + "match-criterion": [ + { + "index": 1, + "match-type": "ietf-nss:service-any-match", + "target-connection-group-id": "matrix1" + } + ] + }, + "attachment-circuits": { + "attachment-circuit": [ + { + "id": "ac2", + "description": "AC2 connected to device 2", + "ac-node-id": "5.5.5.5", + "ac-tp-id": "eth-1/0/22.111", + "ac-tags": { + "ac-tags": [ + { + "tag-type": "ietf-nss:vlan-id", + "value": [ + "111" + ] + } + ] + }, + "status": {} + } + ] + }, + "status": {} + } + ] + }, + "connection-groups": { + "connection-group": [ + { + "id": "matrix1", + "connectivity-type": "ietf-nss:point-to-point", + "service-slo-sle-policy": { + "slo-policy": { + "metric-bound": [ + { + "metric-type": "ietf-nss:one-way-delay-maximum", + "metric-unit": "milliseconds", + "bound": "10" + } + ] + } + }, + "connectivity-construct": [ + { + "id": 1, + "p2p-sender-sdp": "1", + "p2p-receiver-sdp": "2", + "status": {} + }, + { + "id": 2, + "p2p-sender-sdp": "2", + "p2p-receiver-sdp": "1", + "status": {} + } + ] + } + ] + } + } + ] + } + } + + self.__descriptors = json.loads(descriptors) if isinstance(descriptors, str) else descriptors + + self.__slices = self.__descriptors.get('slices' , []) + #data = self.__descriptors.get('data' , {}) #Coge de la file el campo slices + #ns_slice_service = data.get('ietf-network-slice-service:network-slice-services', {}) + #self.__slices= ns_slice_service.get('slice-service', []) #nuevas slices + self.__slices = self.__descriptors.get('ietf-network-slice-service:network-slice-services', {}) + #hasta aqui bien + + print(type(self.__slices)) + print(type(self.__slices["slice-service"])) + + + json_out = {"slices": [ + { + "slice_id": { + "context_id": {"context_uuid": {"uuid": "admin"}}, + "slice_uuid": {} + }, + "name": {}, + "slice_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "/settings", "resource_value": { + "address_families": ["IPV4"], "bgp_as": 65000, "bgp_route_target": "65000:333", "mtu": 1512 + }}} + + ]}, + "slice_constraints": [ + {"sla_capacity": {"capacity_gbps": 20.0}}, + {"sla_availability": {"availability": 20.0, "num_disjoint_paths": 1, "all_active": True}}, + {"sla_isolation": {"isolation_level": [0]}} + ], + "slice_endpoint_ids": [ + + ], + "slice_status": {"slice_status": 1} + } + ]} + + for slice_service in self.__slices["slice-service"]: + for slice in json_out["slices"]: + slice["slice_id"]["slice_uuid"] = { "uuid": slice_service["id"]} + slice["name"] = slice_service["description"] + sdp = slice_service["sdps"]["sdp"] + print(sdp) + for elemento in sdp: + slice["slice_config"]["config_rules"].append( {"action": 1, "custom": {"resource_key": "/device[R1]/endpoint[1/2]/settings", "resource_value": { + "router_id": elemento.get("node-id",[]), "sub_interface_index": 0, "vlan_id": 111 + }}}) + slice["slice_endpoint_ids"].append({ + "device_id": {"device_uuid": {"uuid": elemento["id"]}}, + "endpoint_uuid": {"uuid": "1/2"}, + "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, + "topology_uuid": {"uuid": "admin"}} + }) + attcircuits = elemento["attachment-circuits"]["attachment-circuit"] + for attcircuit in attcircuits: + slice["slice_constraints"].append({"endpoint_location": { + "endpoint_id": {"device_id": {"device_uuid": {"uuid": attcircuit["id"]}}, "endpoint_uuid": {"uuid": attcircuit["ac-tp-id"]}}, + "location": {"region": "4"} + }}) + + # Convertir a JSON de salida + #json_output = json.dumps(json_out, indent=2) + self.__slices = json_out.get('slices' , []) + print(self.__slices) + self.__results : TypeResults = list() + + + @property + def slices(self) -> Dict[str, List[Dict]]: + _slices = {} + for slice_ in self.__slices: + context_uuid = "admin" + _slices.setdefault(context_uuid, []).append(slice_) #no tenemos context_uuid en este formato, lo meto a mano? + self.__slices = [format_slice_custom_config_rules (slice_ ) for slice_ in self.__slices ] + return _slices + + @property + def num_slices(self) -> Dict[str, int]: + _num_slices = {} + for slice_ in self.__slices: + context_uuid = slice_['slice_id']['context_id']['context_uuid']['uuid'] + _num_slices[context_uuid] = _num_slices.get(context_uuid, 0) + 1 + return _num_slices + + # Format CustomConfigRules in Devices, Services and Slices provided in JSON format + + def process(self) -> TypeResults: + # Format CustomConfigRules in Devices, Services and Slices provided in JSON format + self.__slices = [format_slice_custom_config_rules (slice_ ) for slice_ in self.__slices ] + + # Context and Topology require to create the entity first, and add devices, links, services, + # slices, etc. in a second stage. + + print(self.__results) + return self.__results + + #UTILIZA LA FUNCION FORMAT_CUSTOM_CONFIG_RULES +#cambio + +TypeResourceValue = Union[str, int, bool, float, dict, list] +''' +def format_custom_config_rules(config_rules : List[Dict]) -> List[Dict]: + for config_rule in config_rules: + # if 'custom' not in config_rule: continue #suponemos que siempre son custom, quitamos esta linea + custom_resource_value : TypeResourceValue = config_rule['attachment-circuits']['attachment-circuit'] + if isinstance(custom_resource_value, (dict, list)): + custom_resource_value = json.dumps(custom_resource_value, sort_keys=True, indent=0) + config_rule['attachment-circuits']['attachment-circuit'] = custom_resource_value + elif not isinstance(custom_resource_value, str): + config_rule['attachment-circuits']['attachment-circuit'] = str(custom_resource_value) + return config_rules + +def format_slice_custom_config_rules(slice_ : Dict) -> Dict: + #donde cojo los config_rules + #las config_rules parecen estar en ACs? + sdps = slice_.get('sdps', {}) + config_rules = sdps.get('sdp', {}) + print("Tipo de sdp:", type(config_rules)) + print("sdps:", config_rules) + #Despues de mucho revisar, el campo sdp es List[Dict] asique voy a pasar directamente sdp a la funcion format_custom_config_rules(config_rules) + + config_rules = format_custom_config_rules(config_rules) + slice_['sdps']['sdp'] = config_rules + return slice_ +''' +def format_custom_config_rules(config_rules : List[Dict]) -> List[Dict]: + for config_rule in config_rules: + if 'custom' not in config_rule: continue + custom_resource_value : TypeResourceValue = config_rule['custom']['resource_value'] + if isinstance(custom_resource_value, (dict, list)): + custom_resource_value = json.dumps(custom_resource_value, sort_keys=True, indent=0) + config_rule['custom']['resource_value'] = custom_resource_value + return config_rules + +def format_slice_custom_config_rules(slice_ : Dict) -> Dict: + config_rules = slice_.get('slice_config', {}).get('config_rules', []) + config_rules = format_custom_config_rules(config_rules) + slice_['slice_config']['config_rules'] = config_rules + return slice_ + +# Crear una instancia de la clase +mi_cargador = DescriptorLoader() +results = mi_cargador.process() + + -- GitLab From 5d3979fa1fec61e3f0851b6fe55cfbe3e5379101 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 29 May 2024 08:23:51 +0000 Subject: [PATCH 235/602] ManagementDB.py is created to manage DB operation of 'KPImanager' and 'TelemetryManager'. --- .../run_tests_locally-telemetry-frontend.sh | 2 +- scripts/run_tests_locally-telemetry-mgtDB.sh | 26 +++++++ src/telemetry/database/TelemetryDBmanager.py | 67 +++++++++++------ src/telemetry/database/TelemetryEngine.py | 6 +- src/telemetry/database/managementDB.py | 72 +++++++++++++++++++ .../database/tests/managementDBtests.py | 22 ++++++ src/telemetry/database/tests/messages.py | 24 +++++-- .../database/tests/telemetryDBtests.py | 31 +++++--- src/telemetry/database/tests/temp_DB.py | 4 +- .../TelemetryFrontendServiceServicerImpl.py | 26 ++++++- src/telemetry/frontend/tests/test_frontend.py | 39 +++++----- 11 files changed, 257 insertions(+), 62 deletions(-) create mode 100755 scripts/run_tests_locally-telemetry-mgtDB.sh create mode 100644 src/telemetry/database/managementDB.py create mode 100644 src/telemetry/database/tests/managementDBtests.py diff --git a/scripts/run_tests_locally-telemetry-frontend.sh b/scripts/run_tests_locally-telemetry-frontend.sh index c6ab54a34..673104af6 100755 --- a/scripts/run_tests_locally-telemetry-frontend.sh +++ b/scripts/run_tests_locally-telemetry-frontend.sh @@ -24,5 +24,5 @@ cd $PROJECTDIR/src # python3 kpi_manager/tests/test_unitary.py RCFILE=$PROJECTDIR/coverage/.coveragerc -python3 -m pytest --log-level=INFO --verbose \ +python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ telemetry/frontend/tests/test_frontend.py \ No newline at end of file diff --git a/scripts/run_tests_locally-telemetry-mgtDB.sh b/scripts/run_tests_locally-telemetry-mgtDB.sh new file mode 100755 index 000000000..02a449abf --- /dev/null +++ b/scripts/run_tests_locally-telemetry-mgtDB.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# 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. + + +PROJECTDIR=`pwd` + +cd $PROJECTDIR/src +# RCFILE=$PROJECTDIR/coverage/.coveragerc +# coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \ +# kpi_manager/tests/test_unitary.py + +RCFILE=$PROJECTDIR/coverage/.coveragerc +python3 -m pytest --log-cli-level=INFO --verbose \ + telemetry/database/tests/managementDBtests.py \ No newline at end of file diff --git a/src/telemetry/database/TelemetryDBmanager.py b/src/telemetry/database/TelemetryDBmanager.py index 0380bc8ee..6dc2868a1 100644 --- a/src/telemetry/database/TelemetryDBmanager.py +++ b/src/telemetry/database/TelemetryDBmanager.py @@ -13,7 +13,8 @@ # limitations under the License. import logging, time -from sqlalchemy import inspect +import sqlalchemy +from sqlalchemy import inspect, MetaData, Table from sqlalchemy.orm import sessionmaker from telemetry.database.TelemetryModel import Collector as CollectorModel from telemetry.database.TelemetryModel import Kpi as KpiModel @@ -22,13 +23,10 @@ from telemetry.database.TelemetryEngine import TelemetryEngine from common.proto.kpi_manager_pb2 import KpiDescriptor, KpiId from common.proto.telemetry_frontend_pb2 import Collector, CollectorId from sqlalchemy.exc import SQLAlchemyError - +from telemetry.database.TelemetryModel import Base LOGGER = logging.getLogger(__name__) -DB_NAME = "TelemetryFrontend" - -# Create a base class for declarative models -Base = declarative_base() +DB_NAME = "telemetryfrontend" class TelemetryDBmanager: def __init__(self): @@ -41,18 +39,19 @@ class TelemetryDBmanager: def create_database(self): try: - with self.db_engine.connect() as connection: - connection.execute(f"CREATE DATABASE {self.db_name};") - LOGGER.info('TelemetryDBmanager initalized DB Name: {self.db_name}') + # with self.db_engine.connect() as connection: + # connection.execute(f"CREATE DATABASE {self.db_name};") + TelemetryEngine.create_database(self.db_engine) + LOGGER.info('TelemetryDBmanager initalized DB Name: {:}'.format(self.db_name)) return True - except: # pylint: disable=bare-except # pragma: no cover - LOGGER.exception('Failed to check/create the database: {:s}'.format(str(self.db_engine.url))) + except Exception as e: # pylint: disable=bare-except # pragma: no cover + LOGGER.exception('Failed to check/create the database: {:s}'.format(str(e))) return False def create_tables(self): try: Base.metadata.create_all(self.db_engine) # type: ignore - LOGGER.info("Tables created in the DB Name: {:}".format(self.db_name)) + LOGGER.info("Tables created in database ({:}) the as per Models".format(self.db_name)) except Exception as e: LOGGER.info("Tables cannot be created in the TelemetryFrontend database. {:s}".format(str(e))) @@ -61,10 +60,30 @@ class TelemetryDBmanager: with self.db_engine.connect() as connection: result = connection.execute("SHOW TABLES;") tables = result.fetchall() - LOGGER.info("Tables verified: {:}".format(tables)) + LOGGER.info("Tables in DB: {:}".format(tables)) except Exception as e: LOGGER.info("Unable to fetch Table names. {:s}".format(str(e))) + def drop_table(self, table_to_drop: str): + try: + inspector = inspect(self.db_engine) + existing_tables = inspector.get_table_names() + if table_to_drop in existing_tables: + table = Table(table_to_drop, MetaData(), autoload_with=self.db_engine) + table.drop(self.db_engine) + LOGGER.info("Tables delete in the DB Name: {:}".format(self.db_name)) + else: + LOGGER.warning("No table {:} in database {:} ".format(table_to_drop, DB_NAME)) + except Exception as e: + LOGGER.info("Tables cannot be deleted in the {:} database. {:s}".format(DB_NAME, str(e))) + + def list_databases(self): + query = "SHOW DATABASES" + with self.db_engine.connect() as connection: + result = connection.execute(query) + databases = [row[0] for row in result] + LOGGER.info("List of available DBs: {:}".format(databases)) + # ------------------ INSERT METHODs -------------------------------------- def inser_kpi(self, request: KpiDescriptor): @@ -84,7 +103,7 @@ class TelemetryDBmanager: # Add the instance to the session session.add(kpi_to_insert) session.commit() - LOGGER.info("Row inserted into kpi table: {:}".format(kpi_to_insert)) + LOGGER.info("Row inserted into kpi table: {:}".format(kpi_to_insert.kpi_id)) except Exception as e: session.rollback() LOGGER.info("Failed to insert new kpi. {:s}".format(str(e))) @@ -108,7 +127,7 @@ class TelemetryDBmanager: session.add(collector_to_insert) session.commit() - LOGGER.info("Row inserted into collector table: {:}".format(collector_to_insert)) + LOGGER.info("Row inserted into collector table: {:}".format(collector_to_insert.collector_id)) except Exception as e: session.rollback() LOGGER.info("Failed to insert new collector. {:s}".format(str(e))) @@ -127,7 +146,7 @@ class TelemetryDBmanager: LOGGER.info("kpi ID found: {:s}".format(str(kpi))) return kpi else: - LOGGER.warning("Kpi ID not found{:s}".format(str(kpi_id_to_search))) + LOGGER.warning("Kpi ID not found {:s}".format(str(kpi_id_to_search))) return None except Exception as e: session.rollback() @@ -163,7 +182,10 @@ class TelemetryDBmanager: for column, value in filters.items(): query = query.filter(getattr(KpiModel, column) == value) result = query.all() - LOGGER.info("Fetched filtered rows from KPI table with filters ---------- : {:s}".format(str(result))) + if len(result) != 0: + LOGGER.info("Fetched filtered rows from KPI table with filters : {:s}".format(str(result))) + else: + LOGGER.warning("No matching row found : {:s}".format(str(result))) return result except SQLAlchemyError as e: LOGGER.error("Error fetching filtered rows from KPI table with filters {:}: {:}".format(filters, e)) @@ -178,7 +200,10 @@ class TelemetryDBmanager: for column, value in filters.items(): query = query.filter(getattr(CollectorModel, column) == value) result = query.all() - LOGGER.info("Fetched filtered rows from KPI table with filters ---------- : {:s}".format(str(result))) + if len(result) != 0: + LOGGER.info("Fetched filtered rows from KPI table with filters : {:s}".format(str(result))) + else: + LOGGER.warning("No matching row found : {:s}".format(str(result))) return result except SQLAlchemyError as e: LOGGER.error("Error fetching filtered rows from KPI table with filters {:}: {:}".format(filters, e)) @@ -213,11 +238,11 @@ class TelemetryDBmanager: if collector: session.delete(collector) session.commit() - LOGGER.info("Deleted KPI with kpi_id: %s", collector_id_to_delete) + LOGGER.info("Deleted collector with collector_id: %s", collector_id_to_delete) else: - LOGGER.warning("KPI with kpi_id %s not found", collector_id_to_delete) + LOGGER.warning("collector with collector_id %s not found", collector_id_to_delete) except SQLAlchemyError as e: session.rollback() - LOGGER.error("Error deleting KPI with kpi_id %s: %s", collector_id_to_delete, e) + LOGGER.error("Error deleting collector with collector_id %s: %s", collector_id_to_delete, e) finally: session.close() \ No newline at end of file diff --git a/src/telemetry/database/TelemetryEngine.py b/src/telemetry/database/TelemetryEngine.py index d6e54cc2f..ebeaf3787 100644 --- a/src/telemetry/database/TelemetryEngine.py +++ b/src/telemetry/database/TelemetryEngine.py @@ -30,7 +30,7 @@ class TelemetryEngine: def get_engine() -> sqlalchemy.engine.Engine: CRDB_NAMESPACE = "crdb" CRDB_SQL_PORT = "26257" - CRDB_DATABASE = "TelemetryFrontend" + CRDB_DATABASE = "telemetryfrontend" CRDB_USERNAME = "tfs" CRDB_PASSWORD = "tfs123" CRDB_SSLMODE = "require" @@ -41,8 +41,8 @@ class TelemetryEngine: try: # engine = sqlalchemy.create_engine( # crdb_uri, connect_args={'application_name': APP_NAME}, echo=ECHO, future=True) - engine = sqlalchemy.create_engine(crdb_uri) - LOGGER.info(' --- TelemetryDBmanager initalized with DB URL: {:}'.format(crdb_uri)) + engine = sqlalchemy.create_engine(crdb_uri, echo=False) + LOGGER.info(' TelemetryDBmanager initalized with DB URL: {:}'.format(crdb_uri)) except: # pylint: disable=bare-except # pragma: no cover LOGGER.exception('Failed to connect to database: {:s}'.format(str(crdb_uri))) return None # type: ignore diff --git a/src/telemetry/database/managementDB.py b/src/telemetry/database/managementDB.py new file mode 100644 index 000000000..f8d0ef9cb --- /dev/null +++ b/src/telemetry/database/managementDB.py @@ -0,0 +1,72 @@ +# 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 logging, time +from sqlalchemy.orm import sessionmaker +from sqlalchemy.ext.declarative import declarative_base +from telemetry.database.TelemetryEngine import TelemetryEngine + + +LOGGER = logging.getLogger(__name__) +TELEMETRY_DB_NAME = "telemetryfrontend" + +# Create a base class for declarative models +Base = declarative_base() + +class managementDB: + def __init__(self): + self.db_engine = TelemetryEngine.get_engine() + if self.db_engine is None: + LOGGER.error('Unable to get SQLAlchemy DB Engine...') + return False + self.db_name = TELEMETRY_DB_NAME + self.Session = sessionmaker(bind=self.db_engine) + + def create_database(self): + try: + with self.db_engine.connect() as connection: + connection.execute(f"CREATE DATABASE {self.db_name};") + LOGGER.info('managementDB initalizes database. Name: {self.db_name}') + return True + except: + LOGGER.exception('Failed to check/create the database: {:s}'.format(str(self.db_engine.url))) + return False + + def create_tables(self): + try: + Base.metadata.create_all(self.db_engine) # type: ignore + LOGGER.info("Tables created in the DB Name: {:}".format(self.db_name)) + except Exception as e: + LOGGER.info("Tables cannot be created in the TelemetryFrontend database. {:s}".format(str(e))) + + def verify_tables(self): + try: + with self.db_engine.connect() as connection: + result = connection.execute("SHOW TABLES;") + tables = result.fetchall() # type: ignore + LOGGER.info("Tables verified: {:}".format(tables)) + except Exception as e: + LOGGER.info("Unable to fetch Table names. {:s}".format(str(e))) + + def add_row_to_db(self, row): + session = self.Session() + try: + session.add(row) + session.commit() + LOGGER.info(f"Row inserted into {row.__class__.__name__} table. {row.__class__.__name__} Id: : {row.collector_id}") + except Exception as e: + session.rollback() + LOGGER.error(f"Failed to insert new row into {row.__class__.__name__} table. {str(e)}") + finally: + session.close() \ No newline at end of file diff --git a/src/telemetry/database/tests/managementDBtests.py b/src/telemetry/database/tests/managementDBtests.py new file mode 100644 index 000000000..3d7ef6615 --- /dev/null +++ b/src/telemetry/database/tests/managementDBtests.py @@ -0,0 +1,22 @@ +# 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. + + +from telemetry.database.managementDB import managementDB +from telemetry.database.tests.messages import create_collector_model_object + + +def test_add_row_to_db(): + managementDBobj = managementDB() + managementDBobj.add_row_to_db(create_collector_model_object()) \ No newline at end of file diff --git a/src/telemetry/database/tests/messages.py b/src/telemetry/database/tests/messages.py index 258d4a844..6452e79e7 100644 --- a/src/telemetry/database/tests/messages.py +++ b/src/telemetry/database/tests/messages.py @@ -12,17 +12,19 @@ # See the License for the specific language governing permissions and # limitations under the License. +import time import uuid import random from common.proto import telemetry_frontend_pb2 from common.proto import kpi_manager_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType +from telemetry.database.TelemetryModel import Collector as CollectorModel def create_collector_request(): _create_collector_request = telemetry_frontend_pb2.Collector() _create_collector_request.collector_id.collector_id.uuid = str(uuid.uuid4()) - _create_collector_request.kpi_id.kpi_id.uuid = '2a779f04-77a6-4b32-b020-893e0e1e656f' # must be primary key in kpi table + _create_collector_request.kpi_id.kpi_id.uuid = '71d58648-bf47-49ac-996f-e63a9fbfead4' # must be primary key in kpi table # _create_collector_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) _create_collector_request.duration_s = float(random.randint(8, 16)) _create_collector_request.interval_s = float(random.randint(2, 4)) @@ -43,19 +45,19 @@ def create_kpi_request(): def create_kpi_id_request(): _create_kpi_id_request = kpi_manager_pb2.KpiId() - _create_kpi_id_request.kpi_id.uuid = '11e2c6c6-b507-40aa-ab3a-ffd41e7125f0' + _create_kpi_id_request.kpi_id.uuid = '71d58648-bf47-49ac-996f-e63a9fbfead4' return _create_kpi_id_request def create_collector_id_request(): _create_collector_id_request = telemetry_frontend_pb2.CollectorId() - _create_collector_id_request.collector_id.uuid = '50ba9199-7e9d-45b5-a2fc-3f97917bad65' + _create_collector_id_request.collector_id.uuid = '71d58648-bf47-49ac-996f-e63a9fbfead4' return _create_collector_id_request def create_kpi_filter_request(): # create a dict as follows: 'Key' = 'KpiModel' column name and 'Value' = filter to apply. _create_kpi_filter_request = dict() _create_kpi_filter_request['kpi_sample_type'] = 102 - _create_kpi_filter_request['kpi_id'] = '11e2c6c6-b507-40aa-ab3a-ffd41e7125f0' + _create_kpi_filter_request['kpi_id'] = '3a17230d-8e95-4afb-8b21-6965481aee5a' return _create_kpi_filter_request def create_collector_filter_request(): @@ -63,4 +65,16 @@ def create_collector_filter_request(): _create_kpi_filter_request = dict() _create_kpi_filter_request['sampling_interval_s'] = 3.0 # _create_kpi_filter_request['kpi_id'] = '11e2c6c6-b507-40aa-ab3a-ffd41e7125f0' - return _create_kpi_filter_request \ No newline at end of file + return _create_kpi_filter_request + +def create_collector_model_object(): + # Create a new Collector instance + collector_to_insert = CollectorModel() + collector_to_insert.collector_id = str(uuid.uuid4()) + collector_to_insert.kpi_id = '3a17230d-8e95-4afb-8b21-6965481aee5a' + collector_to_insert.collector = "Test collector description" + collector_to_insert.sampling_duration_s = 15 + collector_to_insert.sampling_interval_s = 3 + collector_to_insert.start_timestamp = time.time() + collector_to_insert.end_timestamp = time.time() + return collector_to_insert \ No newline at end of file diff --git a/src/telemetry/database/tests/telemetryDBtests.py b/src/telemetry/database/tests/telemetryDBtests.py index 81431beb7..14def9ef2 100644 --- a/src/telemetry/database/tests/telemetryDBtests.py +++ b/src/telemetry/database/tests/telemetryDBtests.py @@ -15,6 +15,7 @@ import logging from typing import Any +from sqlalchemy.ext.declarative import declarative_base from telemetry.database.TelemetryDBmanager import TelemetryDBmanager from telemetry.database.TelemetryEngine import TelemetryEngine from telemetry.database.tests import temp_DB @@ -25,42 +26,52 @@ from .messages import create_kpi_request, create_collector_request, \ logging.basicConfig(level=logging.INFO) LOGGER = logging.getLogger(__name__) + # def test_temp_DB(): # temp_DB.main() def test_telemetry_object_creation(): LOGGER.info('--- test_telemetry_object_creation: START') - LOGGER.info('>>> Creating TelemetryDBmanager Object: ') + LOGGER.info('>>> Creating TelemetryDBmanager Object <<< ') TelemetryDBmanagerObj = TelemetryDBmanager() - # LOGGER.info('>>> Creating Tables: ') + # LOGGER.info('>>> Creating database <<< ') + # TelemetryDBmanagerObj.create_database() + + # LOGGER.info('>>> verifing database <<< ') + # TelemetryDBmanagerObj.list_databases() + + # # LOGGER.info('>>> Droping Tables: ') + # # TelemetryDBmanagerObj.drop_table("table_naem_here") + + # LOGGER.info('>>> Creating Tables <<< ') # TelemetryDBmanagerObj.create_tables() - # LOGGER.info('>>> Verifing Table creation: ') - # TelemetryDBmanagerObj.verify_tables() + LOGGER.info('>>> Verifing Table creation <<< ') + TelemetryDBmanagerObj.verify_tables() - LOGGER.info('>>> TESTING: Row Insertion Operation: kpi Table') + LOGGER.info('>>> TESTING: Row Insertion Operation: kpi Table <<<') kpi_obj = create_kpi_request() TelemetryDBmanagerObj.inser_kpi(kpi_obj) - LOGGER.info('>>> TESTING: Row Insertion Operation: collector Table') + LOGGER.info('>>> TESTING: Row Insertion Operation: collector Table <<<') collector_obj = create_collector_request() TelemetryDBmanagerObj.insert_collector(collector_obj) - LOGGER.info('>>> TESTING: Get KpiDescriptor ') + LOGGER.info('>>> TESTING: Get KpiDescriptor <<<') kpi_id_obj = create_kpi_id_request() TelemetryDBmanagerObj.get_kpi_descriptor(kpi_id_obj) - LOGGER.info('>>> TESTING: Select Collector ') + LOGGER.info('>>> TESTING: Select Collector <<<') collector_id_obj = create_collector_id_request() TelemetryDBmanagerObj.get_collector(collector_id_obj) - LOGGER.info('>>> TESTING: Applying kpi filter ') + LOGGER.info('>>> TESTING: Applying kpi filter <<< ') kpi_filter : dict[str, Any] = create_kpi_filter_request() TelemetryDBmanagerObj.select_kpi_descriptor(**kpi_filter) - LOGGER.info('>>> TESTING: Applying collector filter ') + LOGGER.info('>>> TESTING: Applying collector filter <<<') collector_filter : dict[str, Any] = create_collector_filter_request() TelemetryDBmanagerObj.select_collector(**collector_filter) diff --git a/src/telemetry/database/tests/temp_DB.py b/src/telemetry/database/tests/temp_DB.py index 7c1074fcf..089d35424 100644 --- a/src/telemetry/database/tests/temp_DB.py +++ b/src/telemetry/database/tests/temp_DB.py @@ -243,7 +243,7 @@ class DatabaseManager: # Example Usage def main(): CRDB_SQL_PORT = "26257" - CRDB_DATABASE = "TelemetryFrontend" + CRDB_DATABASE = "telemetryfrontend" CRDB_USERNAME = "tfs" CRDB_PASSWORD = "tfs123" CRDB_SSLMODE = "require" @@ -255,7 +255,7 @@ def main(): db_manager = DatabaseManager(crdb_uri, CRDB_DATABASE) # Create database - # db_manager.create_database() + db_manager.create_database() # Update db_url to include the new database name db_manager.engine = create_engine(f"{crdb_uri}") diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index f940ccd65..62a8969f9 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -29,6 +29,8 @@ from common.proto.telemetry_frontend_pb2 import CollectorId, Collector, Collecto from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.proto.telemetry_frontend_pb2_grpc import TelemetryFrontendServiceServicer +from telemetry.database.TelemetryModel import Collector as CollectorModel +from telemetry.database.managementDB import managementDB LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('Monitoring', 'TelemetryFrontend') @@ -41,6 +43,23 @@ KAFKA_TOPICS = {'request' : 'topic_request', class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): def __init__(self, name_mapping : NameMapping): LOGGER.info('Init TelemetryFrontendService') + self.managementDBobj = managementDB() + + + def add_collector_to_db(self, request: Collector ): + try: + # Create a new Collector instance + collector_to_insert = CollectorModel() + collector_to_insert.collector_id = request.collector_id.collector_id.uuid + collector_to_insert.kpi_id = '3a17230d-8e95-4afb-8b21-6965481aee5a' + collector_to_insert.collector = "Test collector description" + collector_to_insert.sampling_duration_s = request.duration_s + collector_to_insert.sampling_interval_s = request.interval_s + collector_to_insert.start_timestamp = time.time() + collector_to_insert.end_timestamp = time.time() + self.managementDBobj.add_row_to_db(collector_to_insert) + except Exception as e: + LOGGER.info("Unable to create collectorModel class object. {:}".format(e)) # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StartCollector(self, @@ -52,6 +71,8 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): _collector_kpi_id = str(request.kpi_id.kpi_id.uuid) _collector_duration = int(request.duration_s) _collector_interval = int(request.interval_s) + # pushing Collector to DB + self.add_collector_to_db(request) self.generate_kafka_request(_collector_id, _collector_kpi_id, _collector_duration, _collector_interval) # self.run_generate_kafka_request(_collector_id, _collector_kpi_id, _collector_duration, _collector_interval) response.collector_id.uuid = request.collector_id.collector_id.uuid # type: ignore @@ -74,10 +95,11 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): # topic_request = "topic_request" msg_value = Tuple [str, int, int] msg_value = (kpi, duration, interval) - print ("Request generated: ", "Colletcor Id: ", msg_key, \ - ", \nKPI: ", kpi, ", Duration: ", duration, ", Interval: ", interval) + # print ("Request generated: ", "Colletcor Id: ", msg_key, \ + # ", \nKPI: ", kpi, ", Duration: ", duration, ", Interval: ", interval) producerObj = KafkaProducer(producer_configs) producerObj.produce(KAFKA_TOPICS['request'], key=msg_key, value= str(msg_value), callback=self.delivery_callback) + LOGGER.info("Collector Request Generated: {:} -- {:} -- {:} -- {:}".format(msg_key, kpi, duration, interval)) # producerObj.produce(topic_request, key=msg_key, value= str(msg_value), callback=self.delivery_callback) ACTIVE_COLLECTORS.append(msg_key) producerObj.flush() diff --git a/src/telemetry/frontend/tests/test_frontend.py b/src/telemetry/frontend/tests/test_frontend.py index a531ed617..230122a2d 100644 --- a/src/telemetry/frontend/tests/test_frontend.py +++ b/src/telemetry/frontend/tests/test_frontend.py @@ -168,30 +168,33 @@ def telemetryFrontend_client( ########################### def test_start_collector(telemetryFrontend_client): - LOGGER.warning('test_start_collector requesting') + LOGGER.info('test_start_collector requesting') response = telemetryFrontend_client.StartCollector(create_collector_request()) LOGGER.debug(str(response)) assert isinstance(response, CollectorId) -def test_start_collector_a(telemetryFrontend_client): - LOGGER.warning('test_start_collector requesting') - response = telemetryFrontend_client.StartCollector(create_collector_request()) - LOGGER.debug(str(response)) - assert isinstance(response, CollectorId) +# def test_start_collector_a(telemetryFrontend_client): +# LOGGER.warning('test_start_collector requesting') +# response = telemetryFrontend_client.StartCollector(create_collector_request()) +# LOGGER.debug(str(response)) +# assert isinstance(response, CollectorId) + +# def test_start_collector_b(telemetryFrontend_client): +# LOGGER.warning('test_start_collector requesting') +# response = telemetryFrontend_client.StartCollector(create_collector_request()) +# LOGGER.debug(str(response)) +# assert isinstance(response, CollectorId) + +# def test_run_kafka_listener(): +# LOGGER.warning('test_receive_kafka_request requesting') +# name_mapping = NameMapping() +# TelemetryFrontendServiceObj = TelemetryFrontendServiceServicerImpl(name_mapping) +# response = TelemetryFrontendServiceObj.run_kafka_listener() # Method "run_kafka_listener" is not define in frontend.proto +# LOGGER.debug(str(response)) +# assert isinstance(response, bool) + -def test_start_collector_b(telemetryFrontend_client): - LOGGER.warning('test_start_collector requesting') - response = telemetryFrontend_client.StartCollector(create_collector_request()) - LOGGER.debug(str(response)) - assert isinstance(response, CollectorId) -def test_run_kafka_listener(): - LOGGER.warning('test_receive_kafka_request requesting') - name_mapping = NameMapping() - TelemetryFrontendServiceObj = TelemetryFrontendServiceServicerImpl(name_mapping) - response = TelemetryFrontendServiceObj.run_kafka_listener() # Method "run_kafka_listener" is not define in frontend.proto - LOGGER.debug(str(response)) - assert isinstance(response, bool) # def test_stop_collector(telemetryFrontend_client): # LOGGER.warning('test_stop_collector requesting') -- GitLab From 1ef912c591b2ec37555ead02794667ee45b65e2c Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 30 May 2024 10:29:24 +0000 Subject: [PATCH 236/602] KpiManager with monitoringDB working fine --- scripts/run_tests_locally-kpi_manager.sh | 2 +- .../service/KpiManagerServiceServicerImpl.py | 198 ++++++++++++------ src/kpi_manager/tests/test_messages.py | 44 +++- src/kpi_manager/tests/test_unitary.py | 109 ++++++---- src/telemetry/database/TelemetryDBmanager.py | 2 +- src/telemetry/database/TelemetryEngine.py | 2 +- src/telemetry/database/managementDB.py | 53 ++++- .../database/tests/telemetryDBtests.py | 61 +++--- 8 files changed, 328 insertions(+), 143 deletions(-) diff --git a/scripts/run_tests_locally-kpi_manager.sh b/scripts/run_tests_locally-kpi_manager.sh index 8ed855a8e..e56716dea 100755 --- a/scripts/run_tests_locally-kpi_manager.sh +++ b/scripts/run_tests_locally-kpi_manager.sh @@ -24,5 +24,5 @@ cd $PROJECTDIR/src # python3 kpi_manager/tests/test_unitary.py RCFILE=$PROJECTDIR/coverage/.coveragerc -python3 -m pytest --log-level=INFO --verbose \ +python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ kpi_manager/tests/test_unitary.py \ No newline at end of file diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py index f1d370f30..c37bf373f 100644 --- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -19,8 +19,12 @@ 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 monitoring.service.NameMapping import NameMapping -from monitoring.service import ManagementDBTools +# from monitoring.service import ManagementDBTools +from telemetry.database.managementDB import managementDB +from telemetry.database.TelemetryModel import Kpi as KpiModel +from common.proto.context_pb2 import DeviceId, LinkId, ServiceId, SliceId,\ + ConnectionId, EndPointId LOGGER = logging.getLogger(__name__) @@ -29,77 +33,139 @@ METRICS_POOL = MetricsPool('Monitoring', 'KpiManager') class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): def __init__(self, name_mapping : NameMapping): LOGGER.info('Init KpiManagerService') - - # Init sqlite monitoring db - self.management_db = ManagementDBTools.ManagementDB('monitoring.db') # why monitoring.db here??? - LOGGER.info('MetricsDB initialized --- KPI Manager Service') + self.managementDBobj = managementDB() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def SetKpiDescriptor( - self, request: KpiDescriptor, grpc_context: grpc.ServicerContext # type: ignore - ) -> KpiId: # type: ignore + def SetKpiDescriptor(self, request: KpiDescriptor, grpc_context: grpc.ServicerContext # type: ignore + ) -> KpiId: # type: ignore response = KpiId() - kpi_description = request.kpi_description - kpi_sample_type = request.kpi_sample_type - kpi_device_id = request.device_id.device_uuid.uuid - kpi_endpoint_id = request.endpoint_id.endpoint_uuid.uuid - kpi_service_id = request.service_id.service_uuid.uuid - kpi_slice_id = request.slice_id.slice_uuid.uuid - kpi_connection_id = request.connection_id.connection_uuid.uuid - kpi_link_id = request.link_id.link_uuid.uuid - if request.kpi_id.kpi_id.uuid != "": + + 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.service_id.service_uuid.uuid + kpi_to_insert.endpoint_id = request.device_id.device_uuid.uuid + kpi_to_insert.service_id = request.slice_id.slice_uuid.uuid + kpi_to_insert.slice_id = request.endpoint_id.endpoint_uuid.uuid + kpi_to_insert.connection_id = request.connection_id.connection_uuid.uuid + # kpi_to_insert.link_id = request.link_id.link_id.uuid + self.managementDBobj.add_row_to_db(kpi_to_insert) response.kpi_id.uuid = request.kpi_id.kpi_id.uuid - # Here the code to modify an existing kpi - else: - data = self.management_db.insert_KPI( - kpi_description, kpi_sample_type, kpi_device_id, kpi_endpoint_id, - kpi_service_id, kpi_slice_id, kpi_connection_id, kpi_link_id) - response.kpi_id.uuid = str(data) - return response + LOGGER.info("Added Row: {:}".format(response)) + return response + except Exception as e: + LOGGER.info("Unable to create KpiModel class object. {:}".format(e)) + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext # type: ignore + ) -> KpiDescriptor: # type: ignore + response = KpiDescriptor() - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> Empty: # type: ignore - kpi_id = int(request.kpi_id.uuid) - kpi = self.management_db.get_KPI(kpi_id) - if kpi: - self.management_db.delete_KPI(kpi_id) - else: - LOGGER.info('DeleteKpi error: KpiID({:s}): not found in database'.format(str(kpi_id))) - return Empty() + try: + kpi_id_to_search = request.kpi_id.uuid + row = self.managementDBobj.search_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) + if row is not None: + response.kpi_id.kpi_id.uuid = row.kpi_id + response.kpi_description = row.kpi_description + response.kpi_sample_type = row.kpi_sample_type + response.service_id.service_uuid.uuid = row.service_id + response.device_id.device_uuid.uuid = row.device_id + response.slice_id.slice_uuid.uuid = row.slice_id + response.endpoint_id.endpoint_uuid.uuid = row.endpoint_id + response.connection_id.connection_uuid.uuid = row.connection_id + return response + except Exception as e: + LOGGER.info('Unable to search kpi id. {:}'.format(e)) @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> KpiDescriptor: # type: ignore - kpi_id = request.kpi_id.uuid - kpi_db = self.management_db.get_KPI(int(kpi_id)) - kpiDescriptor = KpiDescriptor() - if kpi_db is None: - LOGGER.info('GetKpiDescriptor error: KpiID({:s}): not found in database'.format(str(kpi_id))) - else: - kpiDescriptor.kpi_description = kpi_db[1] - kpiDescriptor.kpi_sample_type = kpi_db[2] - kpiDescriptor.device_id.device_uuid.uuid = str(kpi_db[3]) - kpiDescriptor.endpoint_id.endpoint_uuid.uuid = str(kpi_db[4]) - kpiDescriptor.service_id.service_uuid.uuid = str(kpi_db[5]) - kpiDescriptor.slice_id.slice_uuid.uuid = str(kpi_db[6]) - kpiDescriptor.connection_id.connection_uuid.uuid = str(kpi_db[7]) - kpiDescriptor.link_id.link_uuid.uuid = str(kpi_db[8]) - return kpiDescriptor + def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext + ) -> Empty: # type: ignore + try: + kpi_id_to_search = request.kpi_id.uuid + self.managementDBobj.delete_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) + except Exception as e: + LOGGER.info('Unable to search kpi id. {:}'.format(e)) + finally: + return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def SelectKpiDescriptor(self, request: KpiDescriptorFilter, grpc_context: grpc.ServicerContext) -> KpiDescriptorList: # type: ignore - kpi_descriptor_list = KpiDescriptorList() - data = self.management_db.get_KPIS() - LOGGER.debug(f"data: {data}") - for item in data: - kpi_descriptor = KpiDescriptor() - kpi_descriptor.kpi_id.kpi_id.uuid = str(item[0]) - kpi_descriptor.kpi_description = item[1] - kpi_descriptor.kpi_sample_type = item[2] - kpi_descriptor.device_id.device_uuid.uuid = str(item[3]) - kpi_descriptor.endpoint_id.endpoint_uuid.uuid = str(item[4]) - kpi_descriptor.service_id.service_uuid.uuid = str(item[5]) - kpi_descriptor.slice_id.slice_uuid.uuid = str(item[6]) - kpi_descriptor.connection_id.connection_uuid.uuid = str(item[7]) - kpi_descriptor.link_id.link_uuid.uuid = str(item[8]) - kpi_descriptor_list.kpi_descriptor_list.append(kpi_descriptor) - return kpi_descriptor_list \ No newline at end of file + def SelectKpiDescriptor(self, request: KpiDescriptorFilter, grpc_context: grpc.ServicerContext # type: ignore + ) -> KpiDescriptorList: # type: ignore + response = KpiDescriptorList() + # LOGGER.info("Recevied requested Object: {:}".format(request)) + # re-structre the filter. create dynamic filter + filter_to_apply = dict() + filter_to_apply['device_id'] = request.device_id[0].device_uuid.uuid + filter_to_apply['kpi_sample_type'] = request.kpi_sample_type[0] + try: + rows = self.managementDBobj.select_with_filter(KpiModel, **filter_to_apply) + except Exception as e: + LOGGER.info('Unable to apply filter on kpi descriptor. {:}'.format(e)) + try: + if len(rows) != 0: + kpi_id_obj = KpiId() + device_id_obj = DeviceId() + endpoint_id_obj = EndPointId() + service_id_obj = ServiceId() + slice_id_obj = SliceId() + link_id_obj = LinkId() + + for row in rows: + kpiDescriptor_obj = KpiDescriptor() + kpiDescriptor_obj.kpi_id.kpi_id.uuid = row.kpi_id + # kpiDescriptor_obj.kpi_description = row.kpi_description + + response.kpi_descriptor_list.append(kpiDescriptor_obj) + return response + except Exception as e: + LOGGER.info('Unable to process response {:}'.format(e)) + + + # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + # def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> Empty: # type: ignore + # kpi_id = int(request.kpi_id.uuid) + # kpi = self.management_db.get_KPI(kpi_id) + # if kpi: + # self.management_db.delete_KPI(kpi_id) + # else: + # LOGGER.info('DeleteKpi error: KpiID({:s}): not found in database'.format(str(kpi_id))) + # return Empty() + + # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + # def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> KpiDescriptor: # type: ignore + # kpi_id = request.kpi_id.uuid + # kpi_db = self.management_db.get_KPI(int(kpi_id)) + # kpiDescriptor = KpiDescriptor() + # if kpi_db is None: + # LOGGER.info('GetKpiDescriptor error: KpiID({:s}): not found in database'.format(str(kpi_id))) + # else: + # kpiDescriptor.kpi_description = kpi_db[1] + # kpiDescriptor.kpi_sample_type = kpi_db[2] + # kpiDescriptor.device_id.device_uuid.uuid = str(kpi_db[3]) + # kpiDescriptor.endpoint_id.endpoint_uuid.uuid = str(kpi_db[4]) + # kpiDescriptor.service_id.service_uuid.uuid = str(kpi_db[5]) + # kpiDescriptor.slice_id.slice_uuid.uuid = str(kpi_db[6]) + # kpiDescriptor.connection_id.connection_uuid.uuid = str(kpi_db[7]) + # kpiDescriptor.link_id.link_uuid.uuid = str(kpi_db[8]) + # return kpiDescriptor + + # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + # def SelectKpiDescriptor(self, request: KpiDescriptorFilter, grpc_context: grpc.ServicerContext) -> KpiDescriptorList: # type: ignore + # kpi_descriptor_list = KpiDescriptorList() + # data = self.management_db.get_KPIS() + # LOGGER.debug(f"data: {data}") + # for item in data: + # kpi_descriptor = KpiDescriptor() + # kpi_descriptor.kpi_id.kpi_id.uuid = str(item[0]) + # kpi_descriptor.kpi_description = item[1] + # kpi_descriptor.kpi_sample_type = item[2] + # kpi_descriptor.device_id.device_uuid.uuid = str(item[3]) + # kpi_descriptor.endpoint_id.endpoint_uuid.uuid = str(item[4]) + # kpi_descriptor.service_id.service_uuid.uuid = str(item[5]) + # kpi_descriptor.slice_id.slice_uuid.uuid = str(item[6]) + # kpi_descriptor.connection_id.connection_uuid.uuid = str(item[7]) + # kpi_descriptor.link_id.link_uuid.uuid = str(item[8]) + # kpi_descriptor_list.kpi_descriptor_list.append(kpi_descriptor) + # return kpi_descriptor_list \ No newline at end of file diff --git a/src/kpi_manager/tests/test_messages.py b/src/kpi_manager/tests/test_messages.py index 72ff74c16..db6160be5 100755 --- a/src/kpi_manager/tests/test_messages.py +++ b/src/kpi_manager/tests/test_messages.py @@ -12,14 +12,53 @@ # See the License for the specific language governing permissions and # limitations under the License. +import uuid from common.proto import kpi_manager_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType +from common.proto.context_pb2 import DeviceId, LinkId, ServiceId, SliceId,\ + ConnectionId, EndPointId -def kpi_id(): +# ---------------------- New Test Messages --------------------------------- +def create_kpi_id_request(): _kpi_id = kpi_manager_pb2.KpiId() - _kpi_id.kpi_id.uuid = str(1) # pylint: disable=maybe-no-member + _kpi_id.kpi_id.uuid = "34f73604-eca6-424f-9995-18b519ad0978" return _kpi_id +def create_kpi_descriptor_request(): + _create_kpi_request = kpi_manager_pb2.KpiDescriptor() + _create_kpi_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) + _create_kpi_request.kpi_description = 'KPI Description Test' + _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED + _create_kpi_request.device_id.device_uuid.uuid = 'DEV4' # pylint: disable=maybe-no-member + _create_kpi_request.service_id.service_uuid.uuid = 'SERV3' # pylint: disable=maybe-no-member + _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC3' # pylint: disable=maybe-no-member + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END2' # pylint: disable=maybe-no-member + _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2' # pylint: disable=maybe-no-member + return _create_kpi_request + +def create_kpi_filter_request_a(): + _create_kpi_filter_request = kpi_manager_pb2.KpiDescriptorFilter() + _create_kpi_filter_request.kpi_sample_type.append(102) + + device_id_obj = DeviceId() + device_id_obj.device_uuid.uuid = "SERV3" + _create_kpi_filter_request.device_id.append(device_id_obj) + + # new_device_id = _create_kpi_filter_request.device_id.add() + # new_device_id.device_uuid.uuid = 'DEV3' + # new_service_id = _create_kpi_filter_request.service_id.add() + # new_service_id.service_uuid.uuid = 'SERV1' + # new_slice_id = _create_kpi_filter_request.slice_id.add() + # new_slice_id.slice_uuid.uuid = 'SLC1' + # new_endpoint_id = _create_kpi_filter_request.endpoint_id.add() + # new_endpoint_id.endpoint_uuid.uuid = 'END1' + # new_connection_id = _create_kpi_filter_request.connection_id.add() + # new_connection_id.connection_uuid.uuid = 'CON1' + + return _create_kpi_filter_request + +# -------------------- Initial Test messages ------------------------------------- + def create_kpi_request(kpi_id_str): _create_kpi_request = kpi_manager_pb2.KpiDescriptor() _create_kpi_request.kpi_description = 'KPI Description Test' @@ -33,6 +72,7 @@ def create_kpi_request(kpi_id_str): def create_kpi_request_b(): _create_kpi_request = kpi_manager_pb2.KpiDescriptor() + _create_kpi_request = str(uuid.uuid4()) _create_kpi_request.kpi_description = 'KPI Description Test' _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED _create_kpi_request.device_id.device_uuid.uuid = 'DEV2' # pylint: disable=maybe-no-member diff --git a/src/kpi_manager/tests/test_unitary.py b/src/kpi_manager/tests/test_unitary.py index 75987a5f4..e60d2104e 100755 --- a/src/kpi_manager/tests/test_unitary.py +++ b/src/kpi_manager/tests/test_unitary.py @@ -43,7 +43,9 @@ 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_request, create_kpi_request_b, create_kpi_request_c, create_kpi_request_d, create_kpi_filter_request +from kpi_manager.tests.test_messages import create_kpi_request, create_kpi_request_b, \ + create_kpi_request_c, create_kpi_request_d, create_kpi_filter_request, \ + create_kpi_descriptor_request, create_kpi_id_request, create_kpi_filter_request_a # from monitoring.service.MonitoringService import MonitoringService from kpi_manager.service.KpiManagerService import KpiManagerService # from monitoring.client.MonitoringClient import MonitoringClient @@ -63,7 +65,7 @@ from device.service.drivers import DRIVERS LOCAL_HOST = '127.0.0.1' MOCKSERVICE_PORT = 10000 -KPIMANAGER_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # avoid privileged ports +KPIMANAGER_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # type: ignore os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(KPIMANAGER_SERVICE_PORT) @@ -127,18 +129,18 @@ def device_service(context_service : MockContextService): # pylint: disable=rede LOGGER.info('Terminated DeviceService...') -@pytest.fixture(scope='session') -def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument - LOGGER.info('Initializing DeviceClient...') - _client = DeviceClient() +# @pytest.fixture(scope='session') +# def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument +# LOGGER.info('Initializing DeviceClient...') +# _client = DeviceClient() - LOGGER.info('Yielding DeviceClient...') - yield _client +# LOGGER.info('Yielding DeviceClient...') +# yield _client - LOGGER.info('Closing DeviceClient...') - _client.close() +# LOGGER.info('Closing DeviceClient...') +# _client.close() - LOGGER.info('Closed DeviceClient...') +# LOGGER.info('Closed DeviceClient...') @pytest.fixture(scope='session') def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument @@ -195,39 +197,64 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab # Prepare Environment, should be the first test ################################################## -# ERROR on this test --- -def test_prepare_environment( - context_client : ContextClient, # pylint: disable=redefined-outer-name,unused-argument -): - context_id = json_context_id(DEFAULT_CONTEXT_NAME) - context_client.SetContext(Context(**json_context(DEFAULT_CONTEXT_NAME))) - context_client.SetTopology(Topology(**json_topology(DEFAULT_TOPOLOGY_NAME, context_id=context_id))) +# # ERROR on this test --- +# def test_prepare_environment( +# context_client : ContextClient, # pylint: disable=redefined-outer-name,unused-argument +# ): +# context_id = json_context_id(DEFAULT_CONTEXT_NAME) +# context_client.SetContext(Context(**json_context(DEFAULT_CONTEXT_NAME))) +# context_client.SetTopology(Topology(**json_topology(DEFAULT_TOPOLOGY_NAME, context_id=context_id))) ########################### # Tests Implementation of Kpi Manager ########################### -# Test case that makes use of client fixture to test server's CreateKpi method -def test_set_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name - # make call to server - LOGGER.warning('test_create_kpi requesting') - for i in range(3): - response = kpi_manager_client.SetKpiDescriptor(create_kpi_request(str(i+1))) - LOGGER.debug(str(response)) - assert isinstance(response, KpiId) - -# Test case that makes use of client fixture to test server's DeleteKpi method -def test_delete_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name - # make call to server - LOGGER.warning('delete_kpi requesting') - response = kpi_manager_client.SetKpiDescriptor(create_kpi_request('4')) - response = kpi_manager_client.DeleteKpiDescriptor(response) - LOGGER.debug(str(response)) - assert isinstance(response, Empty) - -# Test case that makes use of client fixture to test server's GetKpiDescriptor method -def test_select_kpi_descriptor(kpi_manager_client): # pylint: disable=redefined-outer-name - LOGGER.warning('test_selectkpidescritor begin') - response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request()) - LOGGER.debug(str(response)) +# ---------- 2nd Iteration Tests ----------------- +def test_SetKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ") + response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + assert isinstance(response, KpiId) + +def test_GetKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") + response = kpi_manager_client.GetKpiDescriptor(create_kpi_id_request()) + assert isinstance(response, KpiDescriptor) + +def test_DeleteKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ") + response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + kpi_manager_client.DeleteKpiDescriptor(response) + kpi_manager_client.GetKpiDescriptor(response) + assert isinstance(response, KpiId) + +def test_SelectKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ") + response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request_a()) + # LOGGER.info(" >>> test_SelectKpiDescriptor: END <<< {:}".format(response)) assert isinstance(response, KpiDescriptorList) + +# ------------- INITIAL TESTs ---------------- +# Test case that makes use of client fixture to test server's CreateKpi method +# def test_set_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name +# # make call to server +# LOGGER.warning('test_create_kpi requesting') +# for i in range(3): +# response = kpi_manager_client.SetKpiDescriptor(create_kpi_request(str(i+1))) +# LOGGER.debug(str(response)) +# assert isinstance(response, KpiId) + +# # Test case that makes use of client fixture to test server's DeleteKpi method +# def test_delete_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name +# # make call to server +# LOGGER.warning('delete_kpi requesting') +# response = kpi_manager_client.SetKpiDescriptor(create_kpi_request('4')) +# response = kpi_manager_client.DeleteKpiDescriptor(response) +# LOGGER.debug(str(response)) +# assert isinstance(response, Empty) + +# # Test case that makes use of client fixture to test server's GetKpiDescriptor method +# def test_select_kpi_descriptor(kpi_manager_client): # pylint: disable=redefined-outer-name +# LOGGER.warning('test_selectkpidescritor begin') +# response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request()) +# LOGGER.debug(str(response)) +# assert isinstance(response, KpiDescriptorList) diff --git a/src/telemetry/database/TelemetryDBmanager.py b/src/telemetry/database/TelemetryDBmanager.py index 6dc2868a1..e2b1f63a2 100644 --- a/src/telemetry/database/TelemetryDBmanager.py +++ b/src/telemetry/database/TelemetryDBmanager.py @@ -89,7 +89,7 @@ class TelemetryDBmanager: def inser_kpi(self, request: KpiDescriptor): session = self.Session() try: - # Create a new Collector instance + # Create a new Kpi instance kpi_to_insert = KpiModel() kpi_to_insert.kpi_id = request.kpi_id.kpi_id.uuid kpi_to_insert.kpi_description = request.kpi_description diff --git a/src/telemetry/database/TelemetryEngine.py b/src/telemetry/database/TelemetryEngine.py index ebeaf3787..2b47e4ec8 100644 --- a/src/telemetry/database/TelemetryEngine.py +++ b/src/telemetry/database/TelemetryEngine.py @@ -21,7 +21,6 @@ APP_NAME = 'tfs' ECHO = False # False: No dump SQL commands and transactions executed CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' # CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' -# CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' class TelemetryEngine: # def __init__(self): @@ -51,6 +50,7 @@ class TelemetryEngine: @staticmethod def create_database(engine : sqlalchemy.engine.Engine) -> None: if not sqlalchemy_utils.database_exists(engine.url): + LOGGER.info("Database created. {:}".format(engine.url)) sqlalchemy_utils.create_database(engine.url) @staticmethod diff --git a/src/telemetry/database/managementDB.py b/src/telemetry/database/managementDB.py index f8d0ef9cb..706133477 100644 --- a/src/telemetry/database/managementDB.py +++ b/src/telemetry/database/managementDB.py @@ -64,9 +64,60 @@ class managementDB: try: session.add(row) session.commit() - LOGGER.info(f"Row inserted into {row.__class__.__name__} table. {row.__class__.__name__} Id: : {row.collector_id}") + LOGGER.info(f"Row inserted into {row.__class__.__name__} table.") except Exception as e: session.rollback() LOGGER.error(f"Failed to insert new row into {row.__class__.__name__} table. {str(e)}") + finally: + session.close() + + def search_db_row_by_id(self, model, col_name, id_to_search): + session = self.Session() + try: + entity = session.query(model).filter_by(**{col_name: id_to_search}).first() + if entity: + LOGGER.info(f"{model.__name__} ID found: {str(entity)}") + return entity + else: + LOGGER.warning(f"{model.__name__} ID not found: {str(id_to_search)}") + return None + except Exception as e: + session.rollback() + LOGGER.info(f"Failed to retrieve {model.__name__} ID. {str(e)}") + raise + finally: + session.close() + + def delete_db_row_by_id(self, model, col_name, id_to_search): + session = self.Session() + try: + record = session.query(model).filter_by(**{col_name: id_to_search}).first() + if record: + session.delete(record) + session.commit() + LOGGER.info("Deleted %s with %s: %s", model.__name__, col_name, id_to_search) + else: + LOGGER.warning("%s with %s %s not found", model.__name__, col_name, id_to_search) + except Exception as e: + session.rollback() + LOGGER.error("Error deleting %s with %s %s: %s", model.__name__, col_name, id_to_search, e) + finally: + session.close() + + def select_with_filter(self, model, **filters): + session = self.Session() + try: + query = session.query(model) + for column, value in filters.items(): + query = query.filter(getattr(model, column) == value) # type: ignore + result = query.all() + if result: + LOGGER.info(f"Fetched filtered rows from {model.__name__} table with filters: {filters}- Results: {result}") # + else: + LOGGER.warning(f"No matching row found in {model.__name__} table with filters: {filters}") + return result + except Exception as e: + LOGGER.error(f"Error fetching filtered rows from {model.__name__} table with filters {filters} ::: {e}") + return [] finally: session.close() \ No newline at end of file diff --git a/src/telemetry/database/tests/telemetryDBtests.py b/src/telemetry/database/tests/telemetryDBtests.py index 14def9ef2..9cb856a3d 100644 --- a/src/telemetry/database/tests/telemetryDBtests.py +++ b/src/telemetry/database/tests/telemetryDBtests.py @@ -35,51 +35,52 @@ def test_telemetry_object_creation(): LOGGER.info('>>> Creating TelemetryDBmanager Object <<< ') TelemetryDBmanagerObj = TelemetryDBmanager() + TelemetryEngine.create_database(TelemetryDBmanagerObj.db_engine) - # LOGGER.info('>>> Creating database <<< ') - # TelemetryDBmanagerObj.create_database() + LOGGER.info('>>> Creating database <<< ') + TelemetryDBmanagerObj.create_database() - # LOGGER.info('>>> verifing database <<< ') - # TelemetryDBmanagerObj.list_databases() + LOGGER.info('>>> verifing database <<< ') + TelemetryDBmanagerObj.list_databases() # # LOGGER.info('>>> Droping Tables: ') # # TelemetryDBmanagerObj.drop_table("table_naem_here") - # LOGGER.info('>>> Creating Tables <<< ') - # TelemetryDBmanagerObj.create_tables() + LOGGER.info('>>> Creating Tables <<< ') + TelemetryDBmanagerObj.create_tables() LOGGER.info('>>> Verifing Table creation <<< ') TelemetryDBmanagerObj.verify_tables() - LOGGER.info('>>> TESTING: Row Insertion Operation: kpi Table <<<') - kpi_obj = create_kpi_request() - TelemetryDBmanagerObj.inser_kpi(kpi_obj) + # LOGGER.info('>>> TESTING: Row Insertion Operation: kpi Table <<<') + # kpi_obj = create_kpi_request() + # TelemetryDBmanagerObj.inser_kpi(kpi_obj) - LOGGER.info('>>> TESTING: Row Insertion Operation: collector Table <<<') - collector_obj = create_collector_request() - TelemetryDBmanagerObj.insert_collector(collector_obj) + # LOGGER.info('>>> TESTING: Row Insertion Operation: collector Table <<<') + # collector_obj = create_collector_request() + # TelemetryDBmanagerObj.insert_collector(collector_obj) - LOGGER.info('>>> TESTING: Get KpiDescriptor <<<') - kpi_id_obj = create_kpi_id_request() - TelemetryDBmanagerObj.get_kpi_descriptor(kpi_id_obj) + # LOGGER.info('>>> TESTING: Get KpiDescriptor <<<') + # kpi_id_obj = create_kpi_id_request() + # TelemetryDBmanagerObj.get_kpi_descriptor(kpi_id_obj) - LOGGER.info('>>> TESTING: Select Collector <<<') - collector_id_obj = create_collector_id_request() - TelemetryDBmanagerObj.get_collector(collector_id_obj) + # LOGGER.info('>>> TESTING: Select Collector <<<') + # collector_id_obj = create_collector_id_request() + # TelemetryDBmanagerObj.get_collector(collector_id_obj) - LOGGER.info('>>> TESTING: Applying kpi filter <<< ') - kpi_filter : dict[str, Any] = create_kpi_filter_request() - TelemetryDBmanagerObj.select_kpi_descriptor(**kpi_filter) + # LOGGER.info('>>> TESTING: Applying kpi filter <<< ') + # kpi_filter : dict[str, Any] = create_kpi_filter_request() + # TelemetryDBmanagerObj.select_kpi_descriptor(**kpi_filter) - LOGGER.info('>>> TESTING: Applying collector filter <<<') - collector_filter : dict[str, Any] = create_collector_filter_request() - TelemetryDBmanagerObj.select_collector(**collector_filter) + # LOGGER.info('>>> TESTING: Applying collector filter <<<') + # collector_filter : dict[str, Any] = create_collector_filter_request() + # TelemetryDBmanagerObj.select_collector(**collector_filter) - LOGGER.info('>>> TESTING: Delete KpiDescriptor ') - kpi_id_obj = create_kpi_id_request() - TelemetryDBmanagerObj.delete_kpi_descriptor(kpi_id_obj) + # LOGGER.info('>>> TESTING: Delete KpiDescriptor ') + # kpi_id_obj = create_kpi_id_request() + # TelemetryDBmanagerObj.delete_kpi_descriptor(kpi_id_obj) - LOGGER.info('>>> TESTING: Delete Collector ') - collector_id_obj = create_collector_id_request() - TelemetryDBmanagerObj.delete_collector(collector_id_obj) + # LOGGER.info('>>> TESTING: Delete Collector ') + # collector_id_obj = create_collector_id_request() + # TelemetryDBmanagerObj.delete_collector(collector_id_obj) \ No newline at end of file -- GitLab From 23e6f6e8410641121435f034793b8bd82451d99c Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 30 May 2024 11:12:55 +0000 Subject: [PATCH 237/602] Logs are added to log gRPC messages. --- .../service/KpiManagerServiceServicerImpl.py | 15 +++++---------- src/kpi_manager/tests/test_unitary.py | 7 +++++-- src/telemetry/database/managementDB.py | 2 +- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py index c37bf373f..c5127a2de 100644 --- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -# do tests to verify the "grpc.ServicerContext" is required or not. + import logging, grpc from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.proto.context_pb2 import Empty @@ -39,7 +39,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): def SetKpiDescriptor(self, request: KpiDescriptor, grpc_context: grpc.ServicerContext # type: ignore ) -> KpiId: # type: ignore 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 @@ -62,7 +62,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext # type: ignore ) -> KpiDescriptor: # type: ignore response = KpiDescriptor() - + LOGGER.info("Received gRPC message object: {:}".format(request)) try: kpi_id_to_search = request.kpi_id.uuid row = self.managementDBobj.search_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) @@ -82,6 +82,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext ) -> Empty: # type: ignore + LOGGER.info("Received gRPC message object: {:}".format(request)) try: kpi_id_to_search = request.kpi_id.uuid self.managementDBobj.delete_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) @@ -93,6 +94,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SelectKpiDescriptor(self, request: KpiDescriptorFilter, grpc_context: grpc.ServicerContext # type: ignore ) -> KpiDescriptorList: # type: ignore + LOGGER.info("Received gRPC message object: {:}".format(request)) response = KpiDescriptorList() # LOGGER.info("Recevied requested Object: {:}".format(request)) # re-structre the filter. create dynamic filter @@ -105,13 +107,6 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): LOGGER.info('Unable to apply filter on kpi descriptor. {:}'.format(e)) try: if len(rows) != 0: - kpi_id_obj = KpiId() - device_id_obj = DeviceId() - endpoint_id_obj = EndPointId() - service_id_obj = ServiceId() - slice_id_obj = SliceId() - link_id_obj = LinkId() - for row in rows: kpiDescriptor_obj = KpiDescriptor() kpiDescriptor_obj.kpi_id.kpi_id.uuid = row.kpi_id diff --git a/src/kpi_manager/tests/test_unitary.py b/src/kpi_manager/tests/test_unitary.py index e60d2104e..84cf44497 100755 --- a/src/kpi_manager/tests/test_unitary.py +++ b/src/kpi_manager/tests/test_unitary.py @@ -213,24 +213,27 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab def test_SetKpiDescriptor(kpi_manager_client): LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ") response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + 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()) + LOGGER.info("Response gRPC message object: {:}".format(response)) assert isinstance(response, KpiDescriptor) def test_DeleteKpiDescriptor(kpi_manager_client): LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ") response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) - kpi_manager_client.DeleteKpiDescriptor(response) + del_response = kpi_manager_client.DeleteKpiDescriptor(response) kpi_manager_client.GetKpiDescriptor(response) + LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response)) assert isinstance(response, KpiId) def test_SelectKpiDescriptor(kpi_manager_client): LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ") response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request_a()) - # LOGGER.info(" >>> test_SelectKpiDescriptor: END <<< {:}".format(response)) + LOGGER.info("Response gRPC message object: {:}".format(response)) assert isinstance(response, KpiDescriptorList) # ------------- INITIAL TESTs ---------------- diff --git a/src/telemetry/database/managementDB.py b/src/telemetry/database/managementDB.py index 706133477..0a94c6c25 100644 --- a/src/telemetry/database/managementDB.py +++ b/src/telemetry/database/managementDB.py @@ -112,7 +112,7 @@ class managementDB: query = query.filter(getattr(model, column) == value) # type: ignore result = query.all() if result: - LOGGER.info(f"Fetched filtered rows from {model.__name__} table with filters: {filters}- Results: {result}") # + LOGGER.info(f"Fetched filtered rows from {model.__name__} table with filters: {filters}") # - Results: {result} else: LOGGER.warning(f"No matching row found in {model.__name__} table with filters: {filters}") return result -- GitLab From 4f2374f6bc51d771c3cc261455706eeff5f400eb Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 30 May 2024 13:16:15 +0000 Subject: [PATCH 238/602] Minor changes in Telemetry package --- src/telemetry/backend/service/TelemetryBackendService.py | 2 +- src/telemetry/database/tests/telemetryDBtests.py | 2 +- .../frontend/service/TelemetryFrontendServiceServicerImpl.py | 4 ++-- src/telemetry/frontend/tests/Messages.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 9d393b1ad..b8888bf8b 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -95,7 +95,7 @@ class TelemetryBackendService: if time.time() - start_time >= duration: # condition to terminate backend print("Execution Time Completed: \n --- Consumer terminating: KPI ID: ", kpi_id, " - ", time.time() - start_time) self.generate_kafka_response(collector_id, "NULL", False) - # write to Kafka + # write to Kafka to send the termination confirmation. break # print ("Received KPI: ", kpi_id, ", Duration: ", duration, ", Fetch Interval: ", interval) self.extract_kpi_value(collector_id, kpi_id) diff --git a/src/telemetry/database/tests/telemetryDBtests.py b/src/telemetry/database/tests/telemetryDBtests.py index 9cb856a3d..59043b33f 100644 --- a/src/telemetry/database/tests/telemetryDBtests.py +++ b/src/telemetry/database/tests/telemetryDBtests.py @@ -35,7 +35,7 @@ def test_telemetry_object_creation(): LOGGER.info('>>> Creating TelemetryDBmanager Object <<< ') TelemetryDBmanagerObj = TelemetryDBmanager() - TelemetryEngine.create_database(TelemetryDBmanagerObj.db_engine) + TelemetryEngine.create_database(TelemetryDBmanagerObj.db_engine) # creates 'frontend' db, if it doesnot exists. LOGGER.info('>>> Creating database <<< ') TelemetryDBmanagerObj.create_database() diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index 62a8969f9..245f92f81 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -51,8 +51,8 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): # Create a new Collector instance collector_to_insert = CollectorModel() collector_to_insert.collector_id = request.collector_id.collector_id.uuid - collector_to_insert.kpi_id = '3a17230d-8e95-4afb-8b21-6965481aee5a' - collector_to_insert.collector = "Test collector description" + collector_to_insert.kpi_id = request.kpi_id.kpi_id.uuid + collector_to_insert.collector = "DESC 1" collector_to_insert.sampling_duration_s = request.duration_s collector_to_insert.sampling_interval_s = request.interval_s collector_to_insert.start_timestamp = time.time() diff --git a/src/telemetry/frontend/tests/Messages.py b/src/telemetry/frontend/tests/Messages.py index 2dea48c88..0a33de63e 100644 --- a/src/telemetry/frontend/tests/Messages.py +++ b/src/telemetry/frontend/tests/Messages.py @@ -30,7 +30,7 @@ def create_collector_id_a(coll_id_str : str): def create_collector_request(): _create_collector_request = telemetry_frontend_pb2.Collector() _create_collector_request.collector_id.collector_id.uuid = str(uuid.uuid4()) - _create_collector_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) + _create_collector_request.kpi_id.kpi_id.uuid = "165d20c5-a446-42fa-812f-e2b7ed283c6f" _create_collector_request.duration_s = float(random.randint(8, 16)) _create_collector_request.interval_s = float(random.randint(2, 4)) return _create_collector_request -- GitLab From 2f9bdc382bc3684bd0cf54de501f1ff89dfad001 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 30 May 2024 23:32:01 +0000 Subject: [PATCH 239/602] Telemetry Start,Stop and select Collector complete implementation --- .../run_tests_locally-telemetry-backend.sh | 2 +- .../service/TelemetryBackendService.py | 35 ++++-- .../backend/tests/testTelemetryBackend.py | 6 +- .../TelemetryFrontendServiceServicerImpl.py | 105 +++++++++++------- src/telemetry/frontend/tests/Messages.py | 76 +++++++------ src/telemetry/frontend/tests/test_frontend.py | 59 ++++------ 6 files changed, 158 insertions(+), 125 deletions(-) diff --git a/scripts/run_tests_locally-telemetry-backend.sh b/scripts/run_tests_locally-telemetry-backend.sh index 34e9e0542..8f72fb283 100755 --- a/scripts/run_tests_locally-telemetry-backend.sh +++ b/scripts/run_tests_locally-telemetry-backend.sh @@ -24,5 +24,5 @@ cd $PROJECTDIR/src # python3 kpi_manager/tests/test_unitary.py RCFILE=$PROJECTDIR/coverage/.coveragerc -python3 -m pytest --log-level=INFO --verbose \ +python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ telemetry/backend/tests/testTelemetryBackend.py \ No newline at end of file diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index b8888bf8b..f2e5ff3ac 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -33,7 +33,6 @@ LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('Telemetry', 'TelemetryBackend') KAFKA_SERVER_IP = '127.0.0.1:9092' ADMIN_KAFKA_CLIENT = AdminClient({'bootstrap.servers': KAFKA_SERVER_IP}) -ACTIVE_COLLECTORS = [] KAFKA_TOPICS = {'request' : 'topic_request', 'response': 'topic_response'} EXPORTER_ENDPOINT = "http://node-exporter-7465c69b87-b6ks5.telebackend:9100/metrics" @@ -45,6 +44,7 @@ class TelemetryBackendService: def __init__(self): LOGGER.info('Init TelemetryBackendService') + self.running_threads = {} def run_kafka_listener(self)->bool: threading.Thread(target=self.kafka_listener).start() @@ -68,7 +68,7 @@ class TelemetryBackendService: receive_msg = consumerObj.poll(2.0) if receive_msg is None: # print (time.time(), " - Telemetry backend is listening on Kafka Topic: ", topic_request) # added for debugging purposes - print (time.time(), " - Telemetry backend is listening on Kafka Topic: ", KAFKA_TOPICS['request']) # added for debugging purposes + # print (time.time(), " - Telemetry backend is listening on Kafka Topic: ", KAFKA_TOPICS['request']) # added for debugging purposes continue elif receive_msg.error(): if receive_msg.error().code() == KafkaError._PARTITION_EOF: @@ -78,23 +78,31 @@ class TelemetryBackendService: break (kpi_id, duration, interval) = ast.literal_eval(receive_msg.value().decode('utf-8')) collector_id = receive_msg.key().decode('utf-8') - self.run_initiate_collector_backend(collector_id, kpi_id, duration, interval) + if duration == -1 and interval == -1: + self.terminate_collector_backend(collector_id) + # threading.Thread(target=self.terminate_collector_backend, args=(collector_id)) + else: + self.run_initiate_collector_backend(collector_id, kpi_id, duration, interval) def run_initiate_collector_backend(self, collector_id: str, kpi_id: str, duration: int, interval: int): - threading.Thread(target=self.initiate_collector_backend, args=(collector_id, kpi_id, duration, interval)).start() + stop_event = threading.Event() + thread = threading.Thread(target=self.initiate_collector_backend, + args=(collector_id, kpi_id, duration, interval, stop_event)) + self.running_threads[collector_id] = (thread, stop_event) + thread.start() - def initiate_collector_backend(self, collector_id, kpi_id, duration, interval + def initiate_collector_backend(self, collector_id, kpi_id, duration, interval, stop_event ): # type: ignore """ Method to receive collector request attribues and initiates collecter backend. """ + print("Initiating backend for collector: ", collector_id) start_time = time.time() - while True: - ACTIVE_COLLECTORS.append(collector_id) + while not stop_event.is_set(): if time.time() - start_time >= duration: # condition to terminate backend - print("Execution Time Completed: \n --- Consumer terminating: KPI ID: ", kpi_id, " - ", time.time() - start_time) - self.generate_kafka_response(collector_id, "NULL", False) + print("Execuation duration completed: Terminating backend: Collector Id: ", collector_id, " - ", time.time() - start_time) + self.generate_kafka_response(collector_id, "-1", -1) # write to Kafka to send the termination confirmation. break # print ("Received KPI: ", kpi_id, ", Duration: ", duration, ", Fetch Interval: ", interval) @@ -125,6 +133,15 @@ class TelemetryBackendService: producerObj.produce(KAFKA_TOPICS['response'], key=msg_key, value= str(msg_value), callback=self.delivery_callback) producerObj.flush() + def terminate_collector_backend(self, collector_id): + if collector_id in self.running_threads: + thread, stop_event = self.running_threads[collector_id] + stop_event.set() + thread.join() + print ("Terminating backend (by StopCollector): Collector Id: ", collector_id) + del self.running_threads[collector_id] + self.generate_kafka_response(collector_id, "-1", -1) + def create_topic_if_not_exists(self, new_topics: list) -> bool: """ Method to create Kafka topic if it does not exist. diff --git a/src/telemetry/backend/tests/testTelemetryBackend.py b/src/telemetry/backend/tests/testTelemetryBackend.py index e3e8bbc4b..b8b29d04a 100644 --- a/src/telemetry/backend/tests/testTelemetryBackend.py +++ b/src/telemetry/backend/tests/testTelemetryBackend.py @@ -20,8 +20,6 @@ from typing import Tuple from common.proto.context_pb2 import Empty from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService - - LOGGER = logging.getLogger(__name__) @@ -30,7 +28,7 @@ LOGGER = logging.getLogger(__name__) ########################### def test_verify_kafka_topics(): - LOGGER.warning('test_receive_kafka_request requesting') + LOGGER.info('test_verify_kafka_topics requesting') TelemetryBackendServiceObj = TelemetryBackendService() KafkaTopics = ['topic_request', 'topic_response'] response = TelemetryBackendServiceObj.create_topic_if_not_exists(KafkaTopics) @@ -38,7 +36,7 @@ def test_verify_kafka_topics(): assert isinstance(response, bool) def test_run_kafka_listener(): - LOGGER.warning('test_receive_kafka_request requesting') + LOGGER.info('test_receive_kafka_request requesting') TelemetryBackendServiceObj = TelemetryBackendService() response = TelemetryBackendServiceObj.run_kafka_listener() LOGGER.debug(str(response)) diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index 245f92f81..2fab04b31 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -44,9 +44,12 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): def __init__(self, name_mapping : NameMapping): LOGGER.info('Init TelemetryFrontendService') self.managementDBobj = managementDB() + self.kafka_producer = KafkaProducer({'bootstrap.servers': KAFKA_SERVER_IP,}) + self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KAFKA_SERVER_IP, + 'group.id' : 'frontend', + 'auto.offset.reset' : 'latest'}) - - def add_collector_to_db(self, request: Collector ): + def add_collector_to_db(self, request: Collector ): # type: ignore try: # Create a new Collector instance collector_to_insert = CollectorModel() @@ -66,6 +69,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): request : Collector, grpc_context: grpc.ServicerContext # type: ignore ) -> CollectorId: # type: ignore # push info to frontend db + LOGGER.info ("gRPC message: {:}".format(request)) response = CollectorId() _collector_id = str(request.collector_id.collector_id.uuid) _collector_kpi_id = str(request.kpi_id.kpi_id.uuid) @@ -73,37 +77,36 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): _collector_interval = int(request.interval_s) # pushing Collector to DB self.add_collector_to_db(request) - self.generate_kafka_request(_collector_id, _collector_kpi_id, _collector_duration, _collector_interval) - # self.run_generate_kafka_request(_collector_id, _collector_kpi_id, _collector_duration, _collector_interval) + self.publish_to_kafka_request_topic(_collector_id, _collector_kpi_id, _collector_duration, _collector_interval) + # self.run_publish_to_kafka_request_topic(_collector_id, _collector_kpi_id, _collector_duration, _collector_interval) response.collector_id.uuid = request.collector_id.collector_id.uuid # type: ignore return response - def run_generate_kafka_request(self, msg_key: str, kpi: str, duration : int, interval: int): - threading.Thread(target=self.generate_kafka_request, args=(msg_key, kpi, duration, interval)).start() + def run_publish_to_kafka_request_topic(self, msg_key: str, kpi: str, duration : int, interval: int): + # Add threading.Thread() response to dictonary and call start() in the next statement + threading.Thread(target=self.publish_to_kafka_request_topic, args=(msg_key, kpi, duration, interval)).start() - # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def generate_kafka_request(self, - msg_key: str, kpi: str, duration : int, interval: int - ) -> KafkaProducer: + def publish_to_kafka_request_topic(self, + collector_id: str, kpi: str, duration : int, interval: int + ): """ Method to generate collector request to Kafka topic. """ # time.sleep(5) - producer_configs = { - 'bootstrap.servers': KAFKA_SERVER_IP, - } + # producer_configs = { + # 'bootstrap.servers': KAFKA_SERVER_IP, + # } # topic_request = "topic_request" - msg_value = Tuple [str, int, int] - msg_value = (kpi, duration, interval) - # print ("Request generated: ", "Colletcor Id: ", msg_key, \ + msg_value : Tuple [str, int, int] = (kpi, duration, interval) + # print ("Request generated: ", "Colletcor Id: ", collector_id, \ # ", \nKPI: ", kpi, ", Duration: ", duration, ", Interval: ", interval) - producerObj = KafkaProducer(producer_configs) - producerObj.produce(KAFKA_TOPICS['request'], key=msg_key, value= str(msg_value), callback=self.delivery_callback) - LOGGER.info("Collector Request Generated: {:} -- {:} -- {:} -- {:}".format(msg_key, kpi, duration, interval)) - # producerObj.produce(topic_request, key=msg_key, value= str(msg_value), callback=self.delivery_callback) - ACTIVE_COLLECTORS.append(msg_key) - producerObj.flush() - return producerObj + # producerObj = KafkaProducer(producer_configs) + self.kafka_producer.produce(KAFKA_TOPICS['request'], key=collector_id, value= str(msg_value), callback=self.delivery_callback) + # producerObj.produce(KAFKA_TOPICS['request'], key=collector_id, value= str(msg_value), callback=self.delivery_callback) + LOGGER.info("Collector Request Generated: {:}, {:}, {:}, {:}".format(collector_id, kpi, duration, interval)) + # producerObj.produce(topic_request, key=collector_id, value= str(msg_value), callback=self.delivery_callback) + ACTIVE_COLLECTORS.append(collector_id) + self.kafka_producer.flush() def run_kafka_listener(self): # print ("--- STARTED: run_kafka_listener ---") @@ -114,21 +117,21 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): """ listener for response on Kafka topic. """ - # print ("--- STARTED: kafka_listener ---") - conusmer_configs = { - 'bootstrap.servers' : KAFKA_SERVER_IP, - 'group.id' : 'frontend', - 'auto.offset.reset' : 'latest' - } - # topic_response = "topic_response" - - consumerObj = KafkaConsumer(conusmer_configs) - consumerObj.subscribe([KAFKA_TOPICS['response']]) + # # print ("--- STARTED: kafka_listener ---") + # conusmer_configs = { + # 'bootstrap.servers' : KAFKA_SERVER_IP, + # 'group.id' : 'frontend', + # 'auto.offset.reset' : 'latest' + # } + # # topic_response = "topic_response" + + # consumerObj = KafkaConsumer(conusmer_configs) + self.kafka_consumer.subscribe([KAFKA_TOPICS['response']]) # print (time.time()) while True: - receive_msg = consumerObj.poll(2.0) + receive_msg = self.kafka_consumer.poll(2.0) if receive_msg is None: - print (" - Telemetry frontend listening on Kafka Topic: ", KAFKA_TOPICS['response']) # added for debugging purposes + # print (" - Telemetry frontend listening on Kafka Topic: ", KAFKA_TOPICS['response']) # added for debugging purposes continue elif receive_msg.error(): if receive_msg.error().code() == KafkaError._PARTITION_EOF: @@ -140,7 +143,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): collector_id = receive_msg.key().decode('utf-8') if collector_id in ACTIVE_COLLECTORS: (kpi_id, kpi_value) = ast.literal_eval(receive_msg.value().decode('utf-8')) - self.process_response(kpi_id, kpi_value) + self.process_response(collector_id, kpi_id, kpi_value) else: print(f"collector id does not match.\nRespone ID: '{collector_id}' --- Active IDs: '{ACTIVE_COLLECTORS}' ") except Exception as e: @@ -148,8 +151,12 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): continue # return None - def process_response(self, kpi_id: str, kpi_value: Any): - print ("Frontend - KPI: ", kpi_id, ", VALUE: ", kpi_value) + def process_response(self, collector_id: str, kpi_id: str, kpi_value: Any): + if kpi_id == "-1" and kpi_value == -1: + # LOGGER.info("Sucessfully terminated Collector: {:}".format(collector_id)) + print ("Sucessfully terminated Collector: ", collector_id) + else: + print ("Frontend-Received values Collector Id:", collector_id, "-KPI:", kpi_id, "-VALUE:", kpi_value) @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def delivery_callback(self, err, msg): @@ -168,12 +175,30 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): def StopCollector(self, request : CollectorId, grpc_context: grpc.ServicerContext # type: ignore ) -> Empty: # type: ignore - request.collector_id.uuid = "" + LOGGER.info ("gRPC message: {:}".format(request)) + _collector_id = request.collector_id.uuid + self.publish_to_kafka_request_topic(_collector_id, "", -1, -1) return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SelectCollectors(self, request : CollectorFilter, contextgrpc_context: grpc.ServicerContext # type: ignore ) -> CollectorList: # type: ignore + LOGGER.info("gRPC message: {:}".format(request)) response = CollectorList() - return response \ No newline at end of file + filter_to_apply = dict() + filter_to_apply['kpi_id'] = request.kpi_id[0].kpi_id.uuid + # filter_to_apply['duration_s'] = request.duration_s[0] + try: + rows = self.managementDBobj.select_with_filter(CollectorModel, **filter_to_apply) + except Exception as e: + LOGGER.info('Unable to apply filter on kpi descriptor. {:}'.format(e)) + try: + if len(rows) != 0: + for row in rows: + collector_obj = Collector() + collector_obj.collector_id.collector_id.uuid = row.collector_id + response.collector_list.append(collector_obj) + return response + except Exception as e: + LOGGER.info('Unable to process response {:}'.format(e)) \ No newline at end of file diff --git a/src/telemetry/frontend/tests/Messages.py b/src/telemetry/frontend/tests/Messages.py index 0a33de63e..48668f7bf 100644 --- a/src/telemetry/frontend/tests/Messages.py +++ b/src/telemetry/frontend/tests/Messages.py @@ -22,10 +22,10 @@ def create_collector_id(): _collector_id.collector_id.uuid = uuid.uuid4() return _collector_id -def create_collector_id_a(coll_id_str : str): - _collector_id = telemetry_frontend_pb2.CollectorId() - _collector_id.collector_id.uuid = str(coll_id_str) - return _collector_id +# def create_collector_id_a(coll_id_str : str): +# _collector_id = telemetry_frontend_pb2.CollectorId() +# _collector_id.collector_id.uuid = str(coll_id_str) +# return _collector_id def create_collector_request(): _create_collector_request = telemetry_frontend_pb2.Collector() @@ -35,39 +35,45 @@ def create_collector_request(): _create_collector_request.interval_s = float(random.randint(2, 4)) return _create_collector_request -def create_collector_request_a(): - _create_collector_request_a = telemetry_frontend_pb2.Collector() - _create_collector_request_a.collector_id.collector_id.uuid = "-1" - return _create_collector_request_a - -def create_collector_request_b(str_kpi_id, coll_duration_s, coll_interval_s - ) -> telemetry_frontend_pb2.Collector: - _create_collector_request_b = telemetry_frontend_pb2.Collector() - _create_collector_request_b.collector_id.collector_id.uuid = '1' - _create_collector_request_b.kpi_id.kpi_id.uuid = str_kpi_id - _create_collector_request_b.duration_s = coll_duration_s - _create_collector_request_b.interval_s = coll_interval_s - return _create_collector_request_b - def create_collector_filter(): _create_collector_filter = telemetry_frontend_pb2.CollectorFilter() - new_collector_id = _create_collector_filter.collector_id.add() - new_collector_id.collector_id.uuid = "COLL1" new_kpi_id = _create_collector_filter.kpi_id.add() - new_kpi_id.kpi_id.uuid = "KPI1" - new_device_id = _create_collector_filter.device_id.add() - new_device_id.device_uuid.uuid = 'DEV1' - new_service_id = _create_collector_filter.service_id.add() - new_service_id.service_uuid.uuid = 'SERV1' - new_slice_id = _create_collector_filter.slice_id.add() - new_slice_id.slice_uuid.uuid = 'SLC1' - new_endpoint_id = _create_collector_filter.endpoint_id.add() - new_endpoint_id.endpoint_uuid.uuid = 'END1' - new_connection_id = _create_collector_filter.connection_id.add() - new_connection_id.connection_uuid.uuid = 'CON1' - _create_collector_filter.kpi_sample_type.append(KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED) + new_kpi_id.kpi_id.uuid = "165d20c5-a446-42fa-812f-e2b7ed283c6f" return _create_collector_filter -def create_collector_list(): - _create_collector_list = telemetry_frontend_pb2.CollectorList() - return _create_collector_list \ No newline at end of file +# def create_collector_request_a(): +# _create_collector_request_a = telemetry_frontend_pb2.Collector() +# _create_collector_request_a.collector_id.collector_id.uuid = "-1" +# return _create_collector_request_a + +# def create_collector_request_b(str_kpi_id, coll_duration_s, coll_interval_s +# ) -> telemetry_frontend_pb2.Collector: +# _create_collector_request_b = telemetry_frontend_pb2.Collector() +# _create_collector_request_b.collector_id.collector_id.uuid = '1' +# _create_collector_request_b.kpi_id.kpi_id.uuid = str_kpi_id +# _create_collector_request_b.duration_s = coll_duration_s +# _create_collector_request_b.interval_s = coll_interval_s +# return _create_collector_request_b + +# def create_collector_filter(): +# _create_collector_filter = telemetry_frontend_pb2.CollectorFilter() +# new_collector_id = _create_collector_filter.collector_id.add() +# new_collector_id.collector_id.uuid = "COLL1" +# new_kpi_id = _create_collector_filter.kpi_id.add() +# new_kpi_id.kpi_id.uuid = "KPI1" +# new_device_id = _create_collector_filter.device_id.add() +# new_device_id.device_uuid.uuid = 'DEV1' +# new_service_id = _create_collector_filter.service_id.add() +# new_service_id.service_uuid.uuid = 'SERV1' +# new_slice_id = _create_collector_filter.slice_id.add() +# new_slice_id.slice_uuid.uuid = 'SLC1' +# new_endpoint_id = _create_collector_filter.endpoint_id.add() +# new_endpoint_id.endpoint_uuid.uuid = 'END1' +# new_connection_id = _create_collector_filter.connection_id.add() +# new_connection_id.connection_uuid.uuid = 'CON1' +# _create_collector_filter.kpi_sample_type.append(KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED) +# return _create_collector_filter + +# def create_collector_list(): +# _create_collector_list = telemetry_frontend_pb2.CollectorList() +# return _create_collector_list \ No newline at end of file diff --git a/src/telemetry/frontend/tests/test_frontend.py b/src/telemetry/frontend/tests/test_frontend.py index 230122a2d..7d050349b 100644 --- a/src/telemetry/frontend/tests/test_frontend.py +++ b/src/telemetry/frontend/tests/test_frontend.py @@ -31,8 +31,7 @@ from common.Settings import ( from telemetry.frontend.client.TelemetryFrontendClient import TelemetryFrontendClient from telemetry.frontend.service.TelemetryFrontendService import TelemetryFrontendService from telemetry.frontend.service.TelemetryFrontendServiceServicerImpl import TelemetryFrontendServiceServicerImpl -from telemetry.frontend.tests.Messages import ( create_collector_id, create_collector_request, - create_collector_filter, create_collector_request_a, create_collector_request_b) +from telemetry.frontend.tests.Messages import ( create_collector_request, create_collector_filter) from device.client.DeviceClient import DeviceClient from device.service.DeviceService import DeviceService @@ -167,43 +166,31 @@ def telemetryFrontend_client( # Tests Implementation of Telemetry Frontend ########################### -def test_start_collector(telemetryFrontend_client): - LOGGER.info('test_start_collector requesting') +def test_StartCollector(telemetryFrontend_client): + LOGGER.info(' >>> test_StartCollector START: <<< ') response = telemetryFrontend_client.StartCollector(create_collector_request()) LOGGER.debug(str(response)) assert isinstance(response, CollectorId) -# def test_start_collector_a(telemetryFrontend_client): -# LOGGER.warning('test_start_collector requesting') -# response = telemetryFrontend_client.StartCollector(create_collector_request()) -# LOGGER.debug(str(response)) -# assert isinstance(response, CollectorId) - -# def test_start_collector_b(telemetryFrontend_client): -# LOGGER.warning('test_start_collector requesting') -# response = telemetryFrontend_client.StartCollector(create_collector_request()) -# LOGGER.debug(str(response)) -# assert isinstance(response, CollectorId) - -# def test_run_kafka_listener(): -# LOGGER.warning('test_receive_kafka_request requesting') -# name_mapping = NameMapping() -# TelemetryFrontendServiceObj = TelemetryFrontendServiceServicerImpl(name_mapping) -# response = TelemetryFrontendServiceObj.run_kafka_listener() # Method "run_kafka_listener" is not define in frontend.proto -# LOGGER.debug(str(response)) -# assert isinstance(response, bool) - - - +def test_run_kafka_listener(): + LOGGER.info(' >>> test_run_kafka_listener START: <<< ') + name_mapping = NameMapping() + TelemetryFrontendServiceObj = TelemetryFrontendServiceServicerImpl(name_mapping) + response = TelemetryFrontendServiceObj.run_kafka_listener() # Method "run_kafka_listener" is not define in frontend.proto + LOGGER.debug(str(response)) + assert isinstance(response, bool) -# def test_stop_collector(telemetryFrontend_client): -# LOGGER.warning('test_stop_collector requesting') -# response = telemetryFrontend_client.StopCollector(create_collector_id("1")) -# LOGGER.debug(str(response)) -# assert isinstance(response, Empty) +def test_StopCollector(telemetryFrontend_client): + LOGGER.info(' >>> test_StopCollector START: <<< ') + _collector_id = telemetryFrontend_client.StartCollector(create_collector_request()) + time.sleep(3) # wait for small amount before call the stopCollecter() + response = telemetryFrontend_client.StopCollector(_collector_id) + LOGGER.debug(str(response)) + assert isinstance(response, Empty) -# def test_select_collectors(telemetryFrontend_client): -# LOGGER.warning('test_select_collector requesting') -# response = telemetryFrontend_client.SelectCollectors(create_collector_filter()) -# LOGGER.debug(str(response)) -# assert isinstance(response, CollectorList) \ No newline at end of file +def test_select_collectors(telemetryFrontend_client): + LOGGER.info(' >>> test_select_collector requesting <<< ') + response = telemetryFrontend_client.SelectCollectors(create_collector_filter()) + LOGGER.info('Received Rows after applying Filter: {:} '.format(response)) + LOGGER.debug(str(response)) + assert isinstance(response, CollectorList) \ No newline at end of file -- GitLab From 3b8e35eea744878b51f8e3e8e7265c0088a1db23 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 3 Jun 2024 10:02:14 +0000 Subject: [PATCH 240/602] Modification made for tests (fetch_node_exporter_metrics and stream_node_export_metrics_to_raw_topic) --- .../service/TelemetryBackendService.py | 61 ++++++++++++++----- .../backend/tests/testTelemetryBackend.py | 39 +++++++----- 2 files changed, 70 insertions(+), 30 deletions(-) diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index f2e5ff3ac..2ce8ebf70 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -33,9 +33,11 @@ LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('Telemetry', 'TelemetryBackend') KAFKA_SERVER_IP = '127.0.0.1:9092' ADMIN_KAFKA_CLIENT = AdminClient({'bootstrap.servers': KAFKA_SERVER_IP}) -KAFKA_TOPICS = {'request' : 'topic_request', - 'response': 'topic_response'} -EXPORTER_ENDPOINT = "http://node-exporter-7465c69b87-b6ks5.telebackend:9100/metrics" +KAFKA_TOPICS = {'request' : 'topic_request', 'response': 'topic_response', + 'raw' : 'topic_raw' , 'labeled' : 'topic_labled'} +EXPORTER_ENDPOINT = "http://127.0.0.1:9100/metrics" +PRODUCER_CONFIG = {'bootstrap.servers': KAFKA_SERVER_IP,} + class TelemetryBackendService: """ @@ -122,15 +124,12 @@ class TelemetryBackendService: """ Method to write response on Kafka topic """ - producer_configs = { - 'bootstrap.servers': KAFKA_SERVER_IP, - } # topic_response = "topic_response" msg_value : Tuple [str, Any] = (kpi_id, kpi_value) msg_key = collector_id - producerObj = KafkaProducer(producer_configs) + producerObj = KafkaProducer(PRODUCER_CONFIG) # producerObj.produce(topic_response, key=msg_key, value= str(msg_value), callback=self.delivery_callback) - producerObj.produce(KAFKA_TOPICS['response'], key=msg_key, value= str(msg_value), callback=self.delivery_callback) + producerObj.produce(KAFKA_TOPICS['response'], key=msg_key, value= str(msg_value), callback=TelemetryBackendService.delivery_callback) producerObj.flush() def terminate_collector_backend(self, collector_id): @@ -161,7 +160,8 @@ class TelemetryBackendService: return False return True - def delivery_callback(self, err, msg): + @staticmethod + def delivery_callback( err, msg): """ Callback function to handle message delivery status. Args: @@ -174,8 +174,8 @@ class TelemetryBackendService: print(f'Message delivered to topic {msg.topic()}') # ----------- BELOW: Actual Implementation of Kafka Producer with Node Exporter ----------- - - def fetch_node_exporter_metrics(self): + @staticmethod + def fetch_single_node_exporter_metric(): """ Method to fetch metrics from Node Exporter. Returns: @@ -184,24 +184,29 @@ class TelemetryBackendService: KPI = "node_network_receive_packets_total" try: response = requests.get(EXPORTER_ENDPOINT) # type: ignore + LOGGER.info("Request status {:}".format(response)) if response.status_code == 200: # print(f"Metrics fetched sucessfully...") metrics = response.text # Check if the desired metric is available in the response if KPI in metrics: - KPI_VALUE = self.extract_metric_value(metrics, KPI) + KPI_VALUE = TelemetryBackendService.extract_metric_value(metrics, KPI) # Extract the metric value if KPI_VALUE is not None: - print(f"KPI value: {KPI_VALUE}") + LOGGER.info("Extracted value of {:} is {:}".format(KPI, KPI_VALUE)) + print(f"Extracted value of {KPI} is: {KPI_VALUE}") return KPI_VALUE else: - print(f"Failed to fetch metrics. Status code: {response.status_code}") + LOGGER.info("Failed to fetch metrics. Status code: {:}".format(response.status_code)) + # print(f"Failed to fetch metrics. Status code: {response.status_code}") return None except Exception as e: - print(f"Failed to fetch metrics: {str(e)}") + LOGGER.info("Failed to fetch metrics. Status code: {:}".format(e)) + # print(f"Failed to fetch metrics: {str(e)}") return None - def extract_metric_value(self, metrics, metric_name): + @staticmethod + def extract_metric_value(metrics, metric_name): """ Method to extract the value of a metric from the metrics string. Args: @@ -220,4 +225,28 @@ class TelemetryBackendService: print(f"Metric '{metric_name}' not found in the metrics.") return None + @staticmethod + def stream_node_export_metrics_to_raw_topic(): + try: + while True: + response = requests.get(EXPORTER_ENDPOINT) + LOGGER.info("Response Status {:} ".format(response)) + try: + if response.status_code == 200: + producerObj = KafkaProducer(PRODUCER_CONFIG) + producerObj.produce(KAFKA_TOPICS['raw'], key="raw", value= str(response.text), callback=TelemetryBackendService.delivery_callback) + producerObj.flush() + LOGGER.info("Produce to topic") + else: + LOGGER.info("Didn't received expected response. Status code: {:}".format(response.status_code)) + print(f"Didn't received expected response. Status code: {response.status_code}") + return None + time.sleep(5) + except Exception as e: + LOGGER.info("Failed to process response. Status code: {:}".format(e)) + return None + except Exception as e: + LOGGER.info("Failed to fetch metrics. Status code: {:}".format(e)) + print(f"Failed to fetch metrics: {str(e)}") + return None # ----------- ABOVE: Actual Implementation of Kafka Producer with Node Exporter ----------- \ No newline at end of file diff --git a/src/telemetry/backend/tests/testTelemetryBackend.py b/src/telemetry/backend/tests/testTelemetryBackend.py index b8b29d04a..bc64c473e 100644 --- a/src/telemetry/backend/tests/testTelemetryBackend.py +++ b/src/telemetry/backend/tests/testTelemetryBackend.py @@ -15,6 +15,7 @@ import sys print (sys.path) sys.path.append('/home/tfs/tfs-ctrl') +import threading import logging from typing import Tuple from common.proto.context_pb2 import Empty @@ -27,17 +28,27 @@ LOGGER = logging.getLogger(__name__) # Tests Implementation of Telemetry Backend ########################### -def test_verify_kafka_topics(): - LOGGER.info('test_verify_kafka_topics requesting') - TelemetryBackendServiceObj = TelemetryBackendService() - KafkaTopics = ['topic_request', 'topic_response'] - response = TelemetryBackendServiceObj.create_topic_if_not_exists(KafkaTopics) - LOGGER.debug(str(response)) - assert isinstance(response, bool) - -def test_run_kafka_listener(): - LOGGER.info('test_receive_kafka_request requesting') - TelemetryBackendServiceObj = TelemetryBackendService() - response = TelemetryBackendServiceObj.run_kafka_listener() - LOGGER.debug(str(response)) - assert isinstance(response, bool) +# def test_verify_kafka_topics(): +# LOGGER.info('test_verify_kafka_topics requesting') +# TelemetryBackendServiceObj = TelemetryBackendService() +# KafkaTopics = ['topic_request', 'topic_response'] +# response = TelemetryBackendServiceObj.create_topic_if_not_exists(KafkaTopics) +# LOGGER.debug(str(response)) +# assert isinstance(response, bool) + +# def test_run_kafka_listener(): +# LOGGER.info('test_receive_kafka_request requesting') +# TelemetryBackendServiceObj = TelemetryBackendService() +# response = TelemetryBackendServiceObj.run_kafka_listener() +# LOGGER.debug(str(response)) +# assert isinstance(response, bool) + + +def test_fetch_node_exporter_metrics(): + LOGGER.info(' >>> test_fetch_node_exporter_metrics START <<< ') + TelemetryBackendService.fetch_single_node_exporter_metric() + +def test_stream_node_export_metrics_to_raw_topic(): + LOGGER.info(' >>> test_stream_node_export_metrics_to_raw_topic START <<< ') + threading.Thread(target=TelemetryBackendService.stream_node_export_metrics_to_raw_topic, args=()).start() + -- GitLab From a4a63b5d81994262b29bba7e6c9e20ae0094656d Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 3 Jun 2024 12:10:32 +0000 Subject: [PATCH 241/602] KpiComposer: Read Kafka stream and extracts the metric value as per configured KPIs. --- scripts/run_tests_locally-kpi-composer.sh | 23 +++++ ...er.sh => run_tests_locally-kpi-manager.sh} | 0 src/kpi_manager/service/KpiValueComposer.py | 86 +++++++++++++++++++ src/kpi_manager/tests/test_kpi_composer.py | 23 +++++ .../service/TelemetryBackendService.py | 1 - .../backend/tests/testTelemetryBackend.py | 7 +- .../TelemetryFrontendServiceServicerImpl.py | 70 +++++++-------- 7 files changed, 170 insertions(+), 40 deletions(-) create mode 100755 scripts/run_tests_locally-kpi-composer.sh rename scripts/{run_tests_locally-kpi_manager.sh => run_tests_locally-kpi-manager.sh} (100%) create mode 100644 src/kpi_manager/service/KpiValueComposer.py create mode 100644 src/kpi_manager/tests/test_kpi_composer.py diff --git a/scripts/run_tests_locally-kpi-composer.sh b/scripts/run_tests_locally-kpi-composer.sh new file mode 100755 index 000000000..c61b25788 --- /dev/null +++ b/scripts/run_tests_locally-kpi-composer.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# 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. + + +PROJECTDIR=`pwd` + +cd $PROJECTDIR/src + +RCFILE=$PROJECTDIR/coverage/.coveragerc +python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ + kpi_manager/tests/test_kpi_composer.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 similarity index 100% rename from scripts/run_tests_locally-kpi_manager.sh rename to scripts/run_tests_locally-kpi-manager.sh diff --git a/src/kpi_manager/service/KpiValueComposer.py b/src/kpi_manager/service/KpiValueComposer.py new file mode 100644 index 000000000..2710aac81 --- /dev/null +++ b/src/kpi_manager/service/KpiValueComposer.py @@ -0,0 +1,86 @@ +# 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. + +# read Kafka stream from Kafka topic + +import re +import logging +import threading +from confluent_kafka import KafkaError +from confluent_kafka import Producer as KafkaProducer +from confluent_kafka import Consumer as KafkaConsumer + +LOGGER = logging.getLogger(__name__) +KAFKA_SERVER_IP = '127.0.0.1:9092' +# ADMIN_KAFKA_CLIENT = AdminClient({'bootstrap.servers': KAFKA_SERVER_IP}) +KAFKA_TOPICS = {'request' : 'topic_request', 'response': 'topic_response', + 'raw' : 'topic_raw' , 'labeled' : 'topic_labled'} +PRODUCER_CONFIG = {'bootstrap.servers': KAFKA_SERVER_IP,} +CONSUMER_CONFIG = {'bootstrap.servers' : KAFKA_SERVER_IP, + 'group.id' : 'kpi_composer', + 'auto.offset.reset' : 'latest'} +KPIs_TO_SEARCH = ["node_timex_status", "node_timex_sync_status", "node_udp_queues"] + +class KpiValueComposer: + def __init__(self) -> None: + pass + + @staticmethod + def compose_kpi(): + KpiValueComposer.run_kafka_listener() + + @staticmethod + def run_kafka_listener(): + threading.Thread(target=KpiValueComposer.kafka_listener, args=()).start() + + @staticmethod + def kafka_listener(): + """ + listener for events on Kafka topic. + """ + kafka_consumer = KafkaConsumer(CONSUMER_CONFIG) + kafka_consumer.subscribe([KAFKA_TOPICS['raw']]) + while True: + receive_msg = kafka_consumer.poll(2.0) + if receive_msg is None: + # print (" - Telemetry frontend listening on Kafka Topic: ", KAFKA_TOPICS['raw']) # added for debugging purposes + continue + elif receive_msg.error(): + if receive_msg.error().code() == KafkaError._PARTITION_EOF: + continue + else: + print("Consumer error: {}".format(receive_msg.error())) + continue + try: + new_event = receive_msg.value().decode('utf-8') + # print("New event on topic '{:}' is {:}".format(KAFKA_TOPICS['raw'], new_event)) + LOGGER.info("New event on topic '{:}' is {:}".format(KAFKA_TOPICS['raw'], new_event)) + KpiValueComposer.extract_kpi_values(new_event) + except Exception as e: + print(f"Error to consume event from topic: {KAFKA_TOPICS['raw']}. Error detail: {str(e)}") + continue + + @staticmethod + def extract_kpi_values(event): + pattern = re.compile("|".join(map(re.escape, KPIs_TO_SEARCH))) + lines = event.split('\n') + matching_rows = [] + for line in lines: + if pattern.search(line) and not line.startswith("# HELP") and not line.startswith("# TYPE"): + matching_rows.append(tuple(line.split(" "))) + print("Extracted Rows that match the KPIs {:}".format(matching_rows)) + # LOGGER.info("Extracted Rows that match the KPIs {:}".format(matching_rows)) + return matching_rows + + diff --git a/src/kpi_manager/tests/test_kpi_composer.py b/src/kpi_manager/tests/test_kpi_composer.py new file mode 100644 index 000000000..a4312ea53 --- /dev/null +++ b/src/kpi_manager/tests/test_kpi_composer.py @@ -0,0 +1,23 @@ +# 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 threading +import logging +from kpi_manager.service.KpiValueComposer import KpiValueComposer + +LOGGER = logging.getLogger(__name__) + +def test_compose_kpi(): + LOGGER.info(' >>> test_compose_kpi START <<< ') + KpiValueComposer.compose_kpi() \ No newline at end of file diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 2ce8ebf70..4cfee8dba 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -1,4 +1,3 @@ - # Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/telemetry/backend/tests/testTelemetryBackend.py b/src/telemetry/backend/tests/testTelemetryBackend.py index bc64c473e..7c3b7497b 100644 --- a/src/telemetry/backend/tests/testTelemetryBackend.py +++ b/src/telemetry/backend/tests/testTelemetryBackend.py @@ -43,10 +43,9 @@ LOGGER = logging.getLogger(__name__) # LOGGER.debug(str(response)) # assert isinstance(response, bool) - -def test_fetch_node_exporter_metrics(): - LOGGER.info(' >>> test_fetch_node_exporter_metrics START <<< ') - TelemetryBackendService.fetch_single_node_exporter_metric() +# def test_fetch_node_exporter_metrics(): +# LOGGER.info(' >>> test_fetch_node_exporter_metrics START <<< ') +# TelemetryBackendService.fetch_single_node_exporter_metric() def test_stream_node_export_metrics_to_raw_topic(): LOGGER.info(' >>> test_stream_node_export_metrics_to_raw_topic START <<< ') diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index 2fab04b31..d10e9dffd 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -114,42 +114,42 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): return True def kafka_listener(self): - """ - listener for response on Kafka topic. - """ - # # print ("--- STARTED: kafka_listener ---") - # conusmer_configs = { - # 'bootstrap.servers' : KAFKA_SERVER_IP, - # 'group.id' : 'frontend', - # 'auto.offset.reset' : 'latest' - # } - # # topic_response = "topic_response" - - # consumerObj = KafkaConsumer(conusmer_configs) - self.kafka_consumer.subscribe([KAFKA_TOPICS['response']]) - # print (time.time()) - while True: - receive_msg = self.kafka_consumer.poll(2.0) - if receive_msg is None: - # print (" - Telemetry frontend listening on Kafka Topic: ", KAFKA_TOPICS['response']) # added for debugging purposes - continue - elif receive_msg.error(): - if receive_msg.error().code() == KafkaError._PARTITION_EOF: - continue - else: - print("Consumer error: {}".format(receive_msg.error())) - break - try: - collector_id = receive_msg.key().decode('utf-8') - if collector_id in ACTIVE_COLLECTORS: - (kpi_id, kpi_value) = ast.literal_eval(receive_msg.value().decode('utf-8')) - self.process_response(collector_id, kpi_id, kpi_value) - else: - print(f"collector id does not match.\nRespone ID: '{collector_id}' --- Active IDs: '{ACTIVE_COLLECTORS}' ") - except Exception as e: - print(f"No message key found: {str(e)}") + """ + listener for response on Kafka topic. + """ + # # print ("--- STARTED: kafka_listener ---") + # conusmer_configs = { + # 'bootstrap.servers' : KAFKA_SERVER_IP, + # 'group.id' : 'frontend', + # 'auto.offset.reset' : 'latest' + # } + # # topic_response = "topic_response" + + # consumerObj = KafkaConsumer(conusmer_configs) + self.kafka_consumer.subscribe([KAFKA_TOPICS['response']]) + # print (time.time()) + while True: + receive_msg = self.kafka_consumer.poll(2.0) + if receive_msg is None: + # print (" - Telemetry frontend listening on Kafka Topic: ", KAFKA_TOPICS['response']) # added for debugging purposes + continue + elif receive_msg.error(): + if receive_msg.error().code() == KafkaError._PARTITION_EOF: continue - # return None + else: + print("Consumer error: {}".format(receive_msg.error())) + break + try: + collector_id = receive_msg.key().decode('utf-8') + if collector_id in ACTIVE_COLLECTORS: + (kpi_id, kpi_value) = ast.literal_eval(receive_msg.value().decode('utf-8')) + self.process_response(collector_id, kpi_id, kpi_value) + else: + print(f"collector id does not match.\nRespone ID: '{collector_id}' --- Active IDs: '{ACTIVE_COLLECTORS}' ") + except Exception as e: + print(f"No message key found: {str(e)}") + continue + # return None def process_response(self, collector_id: str, kpi_id: str, kpi_value: Any): if kpi_id == "-1" and kpi_value == -1: -- GitLab From 6a191bd306bfea36ac63a55a3d10da41bf28ce92 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 5 Jun 2024 14:53:34 +0000 Subject: [PATCH 242/602] after VM crash recovery. composer is able to mtach and read KPIs --- deploy/exporters.sh | 23 +++++++++++++++++++ deploy/kafka.sh | 4 ++-- ...ter.yaml => node_exporter_deployment.yaml} | 0 ...ervice.yaml => node_exporter_service.yaml} | 0 proto/telemetry_frontend.proto | 14 +++++------ src/kpi_manager/service/KpiValueComposer.py | 5 ++-- src/kpi_manager/tests/test_messages.py | 2 +- .../service/TelemetryBackendService.py | 10 ++++---- .../backend/tests/testTelemetryBackend.py | 4 ++-- 9 files changed, 44 insertions(+), 18 deletions(-) create mode 100644 deploy/exporters.sh rename manifests/{mock_nodeexporter.yaml => node_exporter_deployment.yaml} (100%) rename manifests/{mock_nodeexporterservice.yaml => node_exporter_service.yaml} (100%) diff --git a/deploy/exporters.sh b/deploy/exporters.sh new file mode 100644 index 000000000..6c56f25c9 --- /dev/null +++ b/deploy/exporters.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# 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. + +######################################################################################################################## +# Read deployment settings +######################################################################################################################## + +# If not already set, set the namespace where Apache Kafka will be deployed. +export KFK_NAMESPACE=${KFK_NAMESPACE:-"exporters"} + +# Add instruction of exporter automatic deployment here \ No newline at end of file diff --git a/deploy/kafka.sh b/deploy/kafka.sh index f2fb666b5..4be5ef6b2 100755 --- a/deploy/kafka.sh +++ b/deploy/kafka.sh @@ -60,10 +60,10 @@ echo ">>> Deploying Apache Kafka Broker" kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST" echo ">>> Verifing Apache Kafka deployment" -sleep 5 +sleep 10 KFK_PODS_STATUS=$(kubectl --namespace ${KFK_NAMESPACE} get pods) if echo "$KFK_PODS_STATUS" | grep -qEv 'STATUS|Running'; then - echo "Deployment Error: $KFK_PODS_STATUS" + echo "Deployment Error: \n $KFK_PODS_STATUS" else echo "$KFK_PODS_STATUS" fi \ No newline at end of file diff --git a/manifests/mock_nodeexporter.yaml b/manifests/node_exporter_deployment.yaml similarity index 100% rename from manifests/mock_nodeexporter.yaml rename to manifests/node_exporter_deployment.yaml diff --git a/manifests/mock_nodeexporterservice.yaml b/manifests/node_exporter_service.yaml similarity index 100% rename from manifests/mock_nodeexporterservice.yaml rename to manifests/node_exporter_service.yaml diff --git a/proto/telemetry_frontend.proto b/proto/telemetry_frontend.proto index 1f89a5d54..48bfd7a0e 100644 --- a/proto/telemetry_frontend.proto +++ b/proto/telemetry_frontend.proto @@ -28,13 +28,13 @@ message CollectorFilter { // 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 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; } message CollectorList { diff --git a/src/kpi_manager/service/KpiValueComposer.py b/src/kpi_manager/service/KpiValueComposer.py index 2710aac81..38c07a22a 100644 --- a/src/kpi_manager/service/KpiValueComposer.py +++ b/src/kpi_manager/service/KpiValueComposer.py @@ -22,7 +22,8 @@ from confluent_kafka import Producer as KafkaProducer from confluent_kafka import Consumer as KafkaConsumer LOGGER = logging.getLogger(__name__) -KAFKA_SERVER_IP = '127.0.0.1:9092' +KAFKA_SERVER_IP = '10.152.183.175:9092' +# KAFKA_SERVER_IP = '127.0.0.1:9092' # ADMIN_KAFKA_CLIENT = AdminClient({'bootstrap.servers': KAFKA_SERVER_IP}) KAFKA_TOPICS = {'request' : 'topic_request', 'response': 'topic_response', 'raw' : 'topic_raw' , 'labeled' : 'topic_labled'} @@ -65,7 +66,7 @@ class KpiValueComposer: try: new_event = receive_msg.value().decode('utf-8') # print("New event on topic '{:}' is {:}".format(KAFKA_TOPICS['raw'], new_event)) - LOGGER.info("New event on topic '{:}' is {:}".format(KAFKA_TOPICS['raw'], new_event)) + # LOGGER.info("New event on topic '{:}' is {:}".format(KAFKA_TOPICS['raw'], new_event)) KpiValueComposer.extract_kpi_values(new_event) except Exception as e: print(f"Error to consume event from topic: {KAFKA_TOPICS['raw']}. Error detail: {str(e)}") diff --git a/src/kpi_manager/tests/test_messages.py b/src/kpi_manager/tests/test_messages.py index db6160be5..83150c102 100755 --- a/src/kpi_manager/tests/test_messages.py +++ b/src/kpi_manager/tests/test_messages.py @@ -18,7 +18,7 @@ from common.proto.kpi_sample_types_pb2 import KpiSampleType from common.proto.context_pb2 import DeviceId, LinkId, ServiceId, SliceId,\ ConnectionId, EndPointId -# ---------------------- New Test Messages --------------------------------- +# ---------------------- 2nd iteration Test Messages --------------------------------- def create_kpi_id_request(): _kpi_id = kpi_manager_pb2.KpiId() _kpi_id.kpi_id.uuid = "34f73604-eca6-424f-9995-18b519ad0978" diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 4cfee8dba..60cfcc6e6 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -30,11 +30,12 @@ from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_m LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('Telemetry', 'TelemetryBackend') -KAFKA_SERVER_IP = '127.0.0.1:9092' +# KAFKA_SERVER_IP = '127.0.0.1:9092' +KAFKA_SERVER_IP = '10.152.183.175:9092' ADMIN_KAFKA_CLIENT = AdminClient({'bootstrap.servers': KAFKA_SERVER_IP}) KAFKA_TOPICS = {'request' : 'topic_request', 'response': 'topic_response', 'raw' : 'topic_raw' , 'labeled' : 'topic_labled'} -EXPORTER_ENDPOINT = "http://127.0.0.1:9100/metrics" +EXPORTER_ENDPOINT = "http://10.152.183.2:9100/metrics" PRODUCER_CONFIG = {'bootstrap.servers': KAFKA_SERVER_IP,} @@ -68,7 +69,6 @@ class TelemetryBackendService: while True: receive_msg = consumerObj.poll(2.0) if receive_msg is None: - # print (time.time(), " - Telemetry backend is listening on Kafka Topic: ", topic_request) # added for debugging purposes # print (time.time(), " - Telemetry backend is listening on Kafka Topic: ", KAFKA_TOPICS['request']) # added for debugging purposes continue elif receive_msg.error(): @@ -152,6 +152,7 @@ class TelemetryBackendService: if topic not in topic_metadata.topics: # If the topic does not exist, create a new topic print(f"Topic '{topic}' does not exist. Creating...") + LOGGER.info("Topic {:} does not exist. Creating...") new_topic = NewTopic(topic, num_partitions=1, replication_factor=1) ADMIN_KAFKA_CLIENT.create_topics([new_topic]) except KafkaException as e: @@ -229,7 +230,8 @@ class TelemetryBackendService: try: while True: response = requests.get(EXPORTER_ENDPOINT) - LOGGER.info("Response Status {:} ".format(response)) + # print("Response Status {:} ".format(response)) + # LOGGER.info("Response Status {:} ".format(response)) try: if response.status_code == 200: producerObj = KafkaProducer(PRODUCER_CONFIG) diff --git a/src/telemetry/backend/tests/testTelemetryBackend.py b/src/telemetry/backend/tests/testTelemetryBackend.py index 7c3b7497b..e81e98473 100644 --- a/src/telemetry/backend/tests/testTelemetryBackend.py +++ b/src/telemetry/backend/tests/testTelemetryBackend.py @@ -18,7 +18,7 @@ sys.path.append('/home/tfs/tfs-ctrl') import threading import logging from typing import Tuple -from common.proto.context_pb2 import Empty +# from common.proto.context_pb2 import Empty from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService LOGGER = logging.getLogger(__name__) @@ -31,7 +31,7 @@ LOGGER = logging.getLogger(__name__) # def test_verify_kafka_topics(): # LOGGER.info('test_verify_kafka_topics requesting') # TelemetryBackendServiceObj = TelemetryBackendService() -# KafkaTopics = ['topic_request', 'topic_response'] +# KafkaTopics = ['topic_request', 'topic_response', 'topic_raw', 'topic_labled'] # response = TelemetryBackendServiceObj.create_topic_if_not_exists(KafkaTopics) # LOGGER.debug(str(response)) # assert isinstance(response, bool) -- GitLab From 5bfe1990d0cdfd76a6302c984b54ba14c45a0ff9 Mon Sep 17 00:00:00 2001 From: armingol Date: Wed, 5 Jun 2024 17:36:40 +0200 Subject: [PATCH 243/602] HW inventroy NBI 1) Yang handler file 2) Hardware inventory file 3) Minor changes --- src/nbi/service/__main__.py | 3 +- .../nbi_plugins/ietf_hardware/Hardware.py | 2 +- .../nbi_plugins/ietf_hardware/YangHandler.py | 56 +++++++++++++++---- .../nbi_plugins/ietf_hardware/__init__.py | 2 +- .../nbi_plugins/tfs_api/__init__.py | 6 +- 5 files changed, 53 insertions(+), 16 deletions(-) diff --git a/src/nbi/service/__main__.py b/src/nbi/service/__main__.py index 7f3cec19d..d5bfdbb53 100644 --- a/src/nbi/service/__main__.py +++ b/src/nbi/service/__main__.py @@ -18,7 +18,7 @@ from common.Constants import ServiceNameEnum from common.Settings import ( ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_log_level, get_metrics_port, wait_for_environment_variables) -from src.nbi.service.rest_server.nbi_plugins.ietf_hardware import register_ietf_hardware + from .NbiService import NbiService from .rest_server.RestServer import RestServer from .rest_server.nbi_plugins.etsi_bwm import register_etsi_bwm_api @@ -27,6 +27,7 @@ from .rest_server.nbi_plugins.ietf_l3vpn import register_ietf_l3vpn from .rest_server.nbi_plugins.ietf_network import register_ietf_network from .rest_server.nbi_plugins.ietf_network_slice import register_ietf_nss from .rest_server.nbi_plugins.tfs_api import register_tfs_api +from .rest_server.nbi_plugins.ietf_hardware import register_ietf_hardware terminate = threading.Event() LOGGER = None diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/Hardware.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/Hardware.py index ca8f4064f..f12efe49b 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/Hardware.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/Hardware.py @@ -26,7 +26,7 @@ class Hardware(Resource): if device is None: raise Exception('Device({:s}) not found in database'.format(str(device_uuid))) - yang_handler = YangHandler('ietf-hardware') + yang_handler = YangHandler() hardware_reply = yang_handler.compose(device) yang_handler.destroy() diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py index 31a7e8ffb..88c9887c0 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py @@ -2,17 +2,27 @@ import libyang, os from common.proto.context_pb2 import Device from typing import Dict, Optional +import logging +import re +import datetime + +LOGGER = logging.getLogger(__name__) YANG_DIR = os.path.join(os.path.dirname(__file__), 'yang') -MODULE_NAME = 'ietf-hardware' +YANG_MODULES = [ + 'iana-hardware', + 'ietf-hardware' +] class YangHandler: def __init__(self) -> None: self._yang_context = libyang.Context(YANG_DIR) - self._yang_module = self._yang_context.load_module(MODULE_NAME) - self._yang_module.feature_enable_all() + for yang_module_name in YANG_MODULES: + LOGGER.info('Loading module: {:s}'.format(str(yang_module_name))) + self._yang_context.load_module(yang_module_name).feature_enable_all() def parse_to_dict(self, message : Dict) -> Dict: - dnode : Optional[libyang.DNode] = self._yang_module.parse_data_dict( + yang_module = self._yang_context.get_module('ietf-hardware') + dnode : Optional[libyang.DNode] = yang_module.parse_data_dict( message, validate_present=True, validate=True, strict=True ) if dnode is None: raise Exception('Unable to parse Message({:s})'.format(str(message))) @@ -20,11 +30,31 @@ class YangHandler: dnode.free() return message + + @staticmethod + def convert_to_iso_date(date_str: str) -> Optional[str]: + date_str = date_str.strip('"') + # Define the regex pattern for ISO 8601 date format + pattern = r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[\+\-]\d{2}:\d{2})" + # Check if the input date string matches the pattern + if re.match(pattern, date_str): + return date_str # Already in ISO format + else: + try: + # Parse the input date string as a datetime object + datetime_obj = datetime.datetime.strptime(date_str, "%Y-%m-%d") + # Convert to ISO format + iso_date = datetime_obj.isoformat() + "Z" + return iso_date + except ValueError: + return None # Invalid date format + + def compose(self, device : Device) -> Dict: # compose device iterating through the components hardware = self._yang_context.create_data_path('/ietf-hardware:hardware') - physical_index = 0 + physical_index = 1 for component in device.components: attributes = component.attributes @@ -39,30 +69,36 @@ class YangHandler: if component_type == "FRU" : component_type = "slack" - component_new.create_path('isfru', True) + component_new.create_path('is-fru', True) else : - component_new.create_path('isfru', False) + component_new.create_path('is-fru', False) component_type = component_type.replace("_", "-").lower() + component_type = 'iana-hardware:' + component_type component_new.create_path('class', component_type) #Añadir resto de atributos en IETF - physical_index += physical_index + physical_index += 1 component_new.create_path('physical-index', physical_index) component_new.create_path('description', attributes["description"]) component_new.create_path('parent', component.parent) + if attributes["mfg-date"] != "": + mfg_date = self.convert_to_iso_date(attributes["mfg-date"]) + LOGGER.info('component[name="{:s}"]'.format(attributes["mfg-date"])) + component_new.create_path('mfg-date', mfg_date) + component_new.create_path('hardware-rev', attributes["hardware-rev"]) component_new.create_path('software-rev', attributes["software-rev"]) component_new.create_path('firmware-rev', attributes["firmware-version"]) component_new.create_path('serial-num', attributes["serial-num"]) component_new.create_path('mfg-name', attributes["mfg-name"]) - component_new.create_path('mfg-date', attributes["mfg-date"]) - component_new.create_path('parent-rel-pos', attributes["id"]) + if attributes["id"]: + component_new.create_path('parent-rel-pos', attributes["id"]) component_new.create_path('uri', component.name) diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py index b69cdc837..7f4e219ff 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py @@ -1,7 +1,7 @@ from nbi.service.rest_server.nbi_plugins.ietf_hardware.Hardware import Hardware from nbi.service.rest_server.RestServer import RestServer -URL_PREFIX = "/restconf/data/device=/ietf-hardware:hardware" +URL_PREFIX = "/restconf/data/device=/ietf-hardware:hardware" def register_ietf_hardware(rest_server: RestServer): rest_server.add_resource(Hardware, URL_PREFIX) \ No newline at end of file diff --git a/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py b/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py index 67391debf..cbb38e6f2 100644 --- a/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py +++ b/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py @@ -16,7 +16,7 @@ from nbi.service.rest_server.RestServer import RestServer from .Resources import ( Connection, ConnectionIds, Connections, Context, ContextIds, Contexts, - Device, DeviceIds, Deviceshw, + Device, DeviceIds, Devices, Deviceshw, DummyContexts, Link, LinkIds, Links, PolicyRule, PolicyRuleIds, PolicyRules, @@ -46,11 +46,11 @@ RESOURCES = [ ('api.slice_ids', SliceIds, '/context//slice_ids'), ('api.slices', Slices, '/context//slices'), ('api.slice', Slice, '/context//slice/'), -''' + ('api.device_ids', DeviceIds, '/device_ids'), ('api.devices', Devices, '/devices'), ('api.device', Device, '/device/'), - ''' + ('api.deviceshw', Deviceshw, '/device//hardware'), ('api.link_ids', LinkIds, '/link_ids'), -- GitLab From 0859b4b2a48cee97bc3590570f5134aba535ab21 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 6 Jun 2024 14:40:25 +0000 Subject: [PATCH 244/602] KpiDescriptor with attributes inserted into the Kpi Table. Working --- scripts/run_tests_locally-kpi-DB.sh | 28 ++++ .../service/KpiManagerServiceServicerImpl.py | 32 +++-- src/kpi_manager/service/KpiValueComposer.py | 7 +- .../service/database/KpiDBtests.py | 30 +++++ src/kpi_manager/service/database/KpiEngine.py | 49 +++++++ src/kpi_manager/service/database/KpiModel.py | 49 +++++++ src/kpi_manager/service/database/Kpi_DB.py | 127 ++++++++++++++++++ src/kpi_manager/service/database/__init__.py | 14 ++ src/kpi_manager/service/database/__main__.py | 107 +++++++++++++++ src/kpi_manager/tests/test_messages.py | 14 ++ src/kpi_manager/tests/test_unitary.py | 51 +++---- 11 files changed, 471 insertions(+), 37 deletions(-) create mode 100755 scripts/run_tests_locally-kpi-DB.sh create mode 100644 src/kpi_manager/service/database/KpiDBtests.py create mode 100644 src/kpi_manager/service/database/KpiEngine.py create mode 100644 src/kpi_manager/service/database/KpiModel.py create mode 100644 src/kpi_manager/service/database/Kpi_DB.py create mode 100644 src/kpi_manager/service/database/__init__.py create mode 100644 src/kpi_manager/service/database/__main__.py diff --git a/scripts/run_tests_locally-kpi-DB.sh b/scripts/run_tests_locally-kpi-DB.sh new file mode 100755 index 000000000..aa9767620 --- /dev/null +++ b/scripts/run_tests_locally-kpi-DB.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# 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. + + +PROJECTDIR=`pwd` + +cd $PROJECTDIR/src +# RCFILE=$PROJECTDIR/coverage/.coveragerc +# coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \ +# kpi_manager/tests/test_unitary.py + +# python3 kpi_manager/tests/test_unitary.py + +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 diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py index c5127a2de..7f62280ff 100644 --- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -14,13 +14,14 @@ 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 monitoring.service.NameMapping import NameMapping # from monitoring.service import ManagementDBTools -from telemetry.database.managementDB import managementDB +from kpi_manager.service.database.Kpi_DB import Kpi_DB from telemetry.database.TelemetryModel import Kpi as KpiModel from common.proto.context_pb2 import DeviceId, LinkId, ServiceId, SliceId,\ @@ -33,8 +34,13 @@ METRICS_POOL = MetricsPool('Monitoring', 'KpiManager') class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): def __init__(self, name_mapping : NameMapping): LOGGER.info('Init KpiManagerService') - self.managementDBobj = managementDB() - + self.Kpi_DBobj = Kpi_DB() + + @staticmethod + def create_database_if_not_exist(engine: sqlalchemy.engine.Engine) -> None: + if not sqlalchemy_utils.database_exists(engine.url): + sqlalchemy_utils.create_database(engine.url) + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SetKpiDescriptor(self, request: KpiDescriptor, grpc_context: grpc.ServicerContext # type: ignore ) -> KpiId: # type: ignore @@ -45,15 +51,15 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): 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.service_id.service_uuid.uuid - kpi_to_insert.endpoint_id = request.device_id.device_uuid.uuid - kpi_to_insert.service_id = request.slice_id.slice_uuid.uuid - kpi_to_insert.slice_id = request.endpoint_id.endpoint_uuid.uuid + 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_id.uuid - self.managementDBobj.add_row_to_db(kpi_to_insert) - response.kpi_id.uuid = request.kpi_id.kpi_id.uuid - LOGGER.info("Added Row: {:}".format(response)) + 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)) return response except Exception as e: LOGGER.info("Unable to create KpiModel class object. {:}".format(e)) @@ -65,7 +71,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): LOGGER.info("Received gRPC message object: {:}".format(request)) try: kpi_id_to_search = request.kpi_id.uuid - row = self.managementDBobj.search_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) + row = self.Kpi_DBobj.search_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) if row is not None: response.kpi_id.kpi_id.uuid = row.kpi_id response.kpi_description = row.kpi_description @@ -85,7 +91,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): LOGGER.info("Received gRPC message object: {:}".format(request)) try: kpi_id_to_search = request.kpi_id.uuid - self.managementDBobj.delete_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) + self.Kpi_DBobj.delete_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) except Exception as e: LOGGER.info('Unable to search kpi id. {:}'.format(e)) finally: @@ -102,7 +108,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): filter_to_apply['device_id'] = request.device_id[0].device_uuid.uuid filter_to_apply['kpi_sample_type'] = request.kpi_sample_type[0] try: - rows = self.managementDBobj.select_with_filter(KpiModel, **filter_to_apply) + rows = self.Kpi_DBobj.select_with_filter(KpiModel, **filter_to_apply) except Exception as e: LOGGER.info('Unable to apply filter on kpi descriptor. {:}'.format(e)) try: diff --git a/src/kpi_manager/service/KpiValueComposer.py b/src/kpi_manager/service/KpiValueComposer.py index 38c07a22a..38b5b124a 100644 --- a/src/kpi_manager/service/KpiValueComposer.py +++ b/src/kpi_manager/service/KpiValueComposer.py @@ -20,6 +20,7 @@ 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 LOGGER = logging.getLogger(__name__) KAFKA_SERVER_IP = '10.152.183.175:9092' @@ -84,4 +85,8 @@ class KpiValueComposer: # LOGGER.info("Extracted Rows that match the KPIs {:}".format(matching_rows)) return matching_rows - + @staticmethod + def request_kpi_descriptor_from_db(): + col_name = "kpi_description" + kpi_name = KPIs_TO_SEARCH[0] + Kpi_DB.search_db_row_by_id() diff --git a/src/kpi_manager/service/database/KpiDBtests.py b/src/kpi_manager/service/database/KpiDBtests.py new file mode 100644 index 000000000..022a7633d --- /dev/null +++ b/src/kpi_manager/service/database/KpiDBtests.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 logging +from kpi_manager.service.database.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() + kpiDBobj.create_tables() + kpiDBobj.verify_tables() diff --git a/src/kpi_manager/service/database/KpiEngine.py b/src/kpi_manager/service/database/KpiEngine.py new file mode 100644 index 000000000..041784ff4 --- /dev/null +++ b/src/kpi_manager/service/database/KpiEngine.py @@ -0,0 +1,49 @@ +# 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 logging, sqlalchemy, sqlalchemy_utils +# from common.Settings import get_setting + +LOGGER = logging.getLogger(__name__) + +APP_NAME = 'tfs' +ECHO = False # False: No dump SQL commands and transactions executed +CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' +CRDB_NAMESPACE = "crdb" +CRDB_SQL_PORT = "26257" +CRDB_DATABASE = "kpi" +CRDB_USERNAME = "tfs" +CRDB_PASSWORD = "tfs123" +CRDB_SSLMODE = "require" +# CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' + +class KpiEngine: + # def __init__(self): + # self.engine = self.get_engine() + + @staticmethod + def get_engine() -> sqlalchemy.engine.Engine: + crdb_uri = CRDB_URI_TEMPLATE.format( + CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) + # crdb_uri = CRDB_URI_TEMPLATE.format( + # CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) + try: + # engine = sqlalchemy.create_engine( + # crdb_uri, connect_args={'application_name': APP_NAME}, echo=ECHO, future=True) + engine = sqlalchemy.create_engine(crdb_uri, echo=False) + LOGGER.info(' KpiDBmanager initalized with DB URL: {:}'.format(crdb_uri)) + except: # pylint: disable=bare-except # pragma: no cover + LOGGER.exception('Failed to connect to database: {:s}'.format(str(crdb_uri))) + return None # type: ignore + return engine # type: ignore diff --git a/src/kpi_manager/service/database/KpiModel.py b/src/kpi_manager/service/database/KpiModel.py new file mode 100644 index 000000000..16844fdc0 --- /dev/null +++ b/src/kpi_manager/service/database/KpiModel.py @@ -0,0 +1,49 @@ +# 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 logging +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy import Column, Integer, String, Float, Text, ForeignKey +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker, relationship + + +logging.basicConfig(level=logging.INFO) +LOGGER = logging.getLogger(__name__) + +# Create a base class for declarative models +Base = declarative_base() + +class Kpi(Base): + __tablename__ = 'kpi' + + kpi_id = Column(UUID(as_uuid=False), primary_key=True) + kpi_description = Column(Text) + 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) + # monitor_flag = Column(String) + + + # helps in logging the information + def __repr__(self): + return (f"") diff --git a/src/kpi_manager/service/database/Kpi_DB.py b/src/kpi_manager/service/database/Kpi_DB.py new file mode 100644 index 000000000..fd5a1c319 --- /dev/null +++ b/src/kpi_manager/service/database/Kpi_DB.py @@ -0,0 +1,127 @@ +# 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 logging, time +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 + +LOGGER = logging.getLogger(__name__) +DB_NAME = "kpi" + +class Kpi_DB: + def __init__(self): + self.db_engine = KpiEngine.get_engine() + if self.db_engine is None: + LOGGER.error('Unable to get SQLAlchemy DB Engine...') + return False + self.db_name = DB_NAME + # self.drop_database(self.db_engine) # added to test + self.create_database(self.db_engine) + self.Session = sessionmaker(bind=self.db_engine) + + @staticmethod + def create_database(engine : sqlalchemy.engine.Engine) -> None: + if not sqlalchemy_utils.database_exists(engine.url): + LOGGER.info("Database created. {:}".format(engine.url)) + sqlalchemy_utils.create_database(engine.url) + + @staticmethod + def drop_database(engine : sqlalchemy.engine.Engine) -> None: + if sqlalchemy_utils.database_exists(engine.url): + sqlalchemy_utils.drop_database(engine.url) + + def create_tables(self): + try: + Kpi.metadata.create_all(self.db_engine) # type: ignore + LOGGER.info("Tables created in the DB Name: {:}".format(self.db_name)) + except Exception as e: + LOGGER.info("Tables cannot be created in the TelemetryFrontend database. {:s}".format(str(e))) + + def verify_tables(self): + try: + with self.db_engine.connect() as connection: + result = connection.execute("SHOW TABLES;") + tables = result.fetchall() # type: ignore + LOGGER.info("Tables verified: {:}".format(tables)) + except Exception as e: + LOGGER.info("Unable to fetch Table names. {:s}".format(str(e))) + + def add_row_to_db(self, row): + session = self.Session() + try: + session.add(row) + session.commit() + LOGGER.info(f"Row inserted into {row.__class__.__name__} table.") + return True + except Exception as e: + session.rollback() + LOGGER.error(f"Failed to insert new row into {row.__class__.__name__} table. {str(e)}") + return False + finally: + session.close() + + def search_db_row_by_id(self, model, col_name, id_to_search): + session = self.Session() + try: + entity = session.query(model).filter_by(**{col_name: id_to_search}).first() + if entity: + LOGGER.info(f"{model.__name__} ID found: {str(entity)}") + return entity + else: + LOGGER.warning(f"{model.__name__} ID not found: {str(id_to_search)}") + return None + except Exception as e: + session.rollback() + LOGGER.info(f"Failed to retrieve {model.__name__} ID. {str(e)}") + raise + finally: + session.close() + + def delete_db_row_by_id(self, model, col_name, id_to_search): + session = self.Session() + try: + record = session.query(model).filter_by(**{col_name: id_to_search}).first() + if record: + session.delete(record) + session.commit() + LOGGER.info("Deleted %s with %s: %s", model.__name__, col_name, id_to_search) + else: + LOGGER.warning("%s with %s %s not found", model.__name__, col_name, id_to_search) + except Exception as e: + session.rollback() + LOGGER.error("Error deleting %s with %s %s: %s", model.__name__, col_name, id_to_search, e) + finally: + session.close() + + def select_with_filter(self, model, **filters): + session = self.Session() + try: + query = session.query(model) + for column, value in filters.items(): + query = query.filter(getattr(model, column) == value) # type: ignore + result = query.all() + if result: + LOGGER.info(f"Fetched filtered rows from {model.__name__} table with filters: {filters}") # - Results: {result} + else: + LOGGER.warning(f"No matching row found in {model.__name__} table with filters: {filters}") + return result + except Exception as e: + LOGGER.error(f"Error fetching filtered rows from {model.__name__} table with filters {filters} ::: {e}") + return [] + finally: + session.close() \ No newline at end of file diff --git a/src/kpi_manager/service/database/__init__.py b/src/kpi_manager/service/database/__init__.py new file mode 100644 index 000000000..1549d9811 --- /dev/null +++ b/src/kpi_manager/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_manager/service/database/__main__.py new file mode 100644 index 000000000..9f0e53246 --- /dev/null +++ b/src/kpi_manager/service/database/__main__.py @@ -0,0 +1,107 @@ +# 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 logging, signal, sys, threading, time +from prometheus_client import start_http_server +from common.Constants import ServiceNameEnum +from common.Settings import ( + ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_log_level, get_metrics_port, + wait_for_environment_variables) +from common.proto import monitoring_pb2 +from monitoring.service.EventTools import EventsDeviceCollector # import updated +from monitoring.service.NameMapping import NameMapping # import updated +# from .MonitoringService import MonitoringService +from .KpiManagerService import KpiManagerService + +terminate = threading.Event() +LOGGER = None + +def signal_handler(signal, frame): # pylint: disable=redefined-outer-name + LOGGER.warning('Terminate signal received') + terminate.set() + +def start_kpi_manager(name_mapping : NameMapping): + LOGGER.info('Start Monitoring...',) + + events_collector = EventsDeviceCollector(name_mapping) + events_collector.start() + + # TODO: redesign this method to be more clear and clean + + # Iterate while terminate is not set + while not terminate.is_set(): + list_new_kpi_ids = events_collector.listen_events() + + # Monitor Kpis + if bool(list_new_kpi_ids): + for kpi_id in list_new_kpi_ids: + # Create Monitor Kpi Requests + monitor_kpi_request = monitoring_pb2.MonitorKpiRequest() + monitor_kpi_request.kpi_id.CopyFrom(kpi_id) + monitor_kpi_request.monitoring_window_s = 86400 + monitor_kpi_request.sampling_rate_s = 10 + events_collector._monitoring_client.MonitorKpi(monitor_kpi_request) + + time.sleep(0.5) # let other tasks run; do not overload CPU + else: + # Terminate is set, looping terminates + LOGGER.warning("Stopping execution...") + + events_collector.start() + +def main(): + global LOGGER # pylint: disable=global-statement + + log_level = get_log_level() + logging.basicConfig(level=log_level) + LOGGER = logging.getLogger(__name__) + + wait_for_environment_variables([ + get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST ), + get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), + get_env_var_name(ServiceNameEnum.DEVICE, ENVVAR_SUFIX_SERVICE_HOST ), + get_env_var_name(ServiceNameEnum.DEVICE, ENVVAR_SUFIX_SERVICE_PORT_GRPC), + ]) + + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + + LOGGER.info('Starting...') + + # Start metrics server + metrics_port = get_metrics_port() + start_http_server(metrics_port) + + name_mapping = NameMapping() + # Starting monitoring service + # grpc_service = MonitoringService(name_mapping) + # grpc_service.start() + # start_monitoring(name_mapping) + + grpc_service = KpiManagerService(name_mapping) + grpc_service.start() + + start_kpi_manager(name_mapping) + + # Wait for Ctrl+C or termination signal + while not terminate.wait(timeout=1.0): pass + + LOGGER.info('Terminating...') + grpc_service.stop() + + LOGGER.info('Bye') + return 0 + +if __name__ == '__main__': + sys.exit(main()) diff --git a/src/kpi_manager/tests/test_messages.py b/src/kpi_manager/tests/test_messages.py index 83150c102..bc4c5b9d1 100755 --- a/src/kpi_manager/tests/test_messages.py +++ b/src/kpi_manager/tests/test_messages.py @@ -24,6 +24,19 @@ def create_kpi_id_request(): _kpi_id.kpi_id.uuid = "34f73604-eca6-424f-9995-18b519ad0978" return _kpi_id +def create_kpi_descriptor_request_a(descriptor_name: str): + _create_kpi_request = kpi_manager_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 + def create_kpi_descriptor_request(): _create_kpi_request = kpi_manager_pb2.KpiDescriptor() _create_kpi_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) @@ -34,6 +47,7 @@ def create_kpi_descriptor_request(): _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC3' # pylint: disable=maybe-no-member _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END2' # pylint: disable=maybe-no-member _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2' # pylint: disable=maybe-no-member + _create_kpi_request.link_id.link_uuid.uuid = 'LNK2' # pylint: disable=maybe-no-member return _create_kpi_request def create_kpi_filter_request_a(): diff --git a/src/kpi_manager/tests/test_unitary.py b/src/kpi_manager/tests/test_unitary.py index 84cf44497..8ac50a38b 100755 --- a/src/kpi_manager/tests/test_unitary.py +++ b/src/kpi_manager/tests/test_unitary.py @@ -19,7 +19,7 @@ import os, pytest import logging, json from typing import Union -from apscheduler.schedulers.background import BackgroundScheduler +# from apscheduler.schedulers.background import BackgroundScheduler from common.proto.context_pb2 import ConfigActionEnum, Context, ContextId, DeviceOperationalStatusEnum, EventTypeEnum, DeviceEvent, Device, Empty, Topology, TopologyId from common.Constants import ServiceNameEnum @@ -45,12 +45,15 @@ from device.client.DeviceClient import DeviceClient from kpi_manager.tests.test_messages import create_kpi_request, create_kpi_request_b, \ create_kpi_request_c, create_kpi_request_d, create_kpi_filter_request, \ - create_kpi_descriptor_request, create_kpi_id_request, create_kpi_filter_request_a + create_kpi_descriptor_request, create_kpi_id_request, create_kpi_filter_request_a, \ + create_kpi_descriptor_request_a # from monitoring.service.MonitoringService import MonitoringService from kpi_manager.service.KpiManagerService import KpiManagerService # from monitoring.client.MonitoringClient import MonitoringClient from kpi_manager.client.KpiManagerClient import KpiManagerClient +from kpi_manager.service.KpiManagerServiceServicerImpl import KpiManagerServiceServicerImpl + from monitoring.service.ManagementDBTools import ManagementDB from monitoring.service.MetricsDBTools import MetricsDB from monitoring.service.NameMapping import NameMapping @@ -212,29 +215,31 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab # ---------- 2nd Iteration Tests ----------------- def test_SetKpiDescriptor(kpi_manager_client): LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ") - response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) - 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()) - LOGGER.info("Response gRPC message object: {:}".format(response)) - assert isinstance(response, KpiDescriptor) - -def test_DeleteKpiDescriptor(kpi_manager_client): - LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ") - response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) - del_response = kpi_manager_client.DeleteKpiDescriptor(response) - kpi_manager_client.GetKpiDescriptor(response) - LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response)) + _descriptors = ["node_timex_status", "node_timex_sync_status", "node_udp_queues"] + 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_SelectKpiDescriptor(kpi_manager_client): - LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ") - response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request_a()) - LOGGER.info("Response gRPC message object: {:}".format(response)) - assert isinstance(response, KpiDescriptorList) +# def test_GetKpiDescriptor(kpi_manager_client): +# LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") +# response = kpi_manager_client.GetKpiDescriptor(create_kpi_id_request()) +# LOGGER.info("Response gRPC message object: {:}".format(response)) +# assert isinstance(response, KpiDescriptor) + +# def test_DeleteKpiDescriptor(kpi_manager_client): +# LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ") +# response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) +# del_response = kpi_manager_client.DeleteKpiDescriptor(response) +# kpi_manager_client.GetKpiDescriptor(response) +# LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response)) +# assert isinstance(response, KpiId) + +# def test_SelectKpiDescriptor(kpi_manager_client): +# LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ") +# response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request_a()) +# LOGGER.info("Response gRPC message object: {:}".format(response)) +# assert isinstance(response, KpiDescriptorList) # ------------- INITIAL TESTs ---------------- # Test case that makes use of client fixture to test server's CreateKpi method -- GitLab From c50b4191ca47093c5d141ba7afb1ae2dff092cb5 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 6 Jun 2024 15:36:07 +0000 Subject: [PATCH 245/602] Kpidescriptor extracted from db --- src/kpi_manager/service/KpiValueComposer.py | 6 +++++- src/kpi_manager/service/database/Kpi_DB.py | 2 +- src/kpi_manager/tests/test_kpi_composer.py | 10 +++++++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/kpi_manager/service/KpiValueComposer.py b/src/kpi_manager/service/KpiValueComposer.py index 38b5b124a..1bdae0e46 100644 --- a/src/kpi_manager/service/KpiValueComposer.py +++ b/src/kpi_manager/service/KpiValueComposer.py @@ -21,6 +21,7 @@ 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 LOGGER = logging.getLogger(__name__) KAFKA_SERVER_IP = '10.152.183.175:9092' @@ -89,4 +90,7 @@ class KpiValueComposer: def request_kpi_descriptor_from_db(): col_name = "kpi_description" kpi_name = KPIs_TO_SEARCH[0] - Kpi_DB.search_db_row_by_id() + kpiDBobj = Kpi_DB() + + row = kpiDBobj.search_db_row_by_id(KpiModel, col_name, kpi_name) + LOGGER.info("Extracted Row: {:}".format(row)) diff --git a/src/kpi_manager/service/database/Kpi_DB.py b/src/kpi_manager/service/database/Kpi_DB.py index fd5a1c319..06800605b 100644 --- a/src/kpi_manager/service/database/Kpi_DB.py +++ b/src/kpi_manager/service/database/Kpi_DB.py @@ -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) + # self.create_database(self.db_engine) # to add database self.Session = sessionmaker(bind=self.db_engine) @staticmethod diff --git a/src/kpi_manager/tests/test_kpi_composer.py b/src/kpi_manager/tests/test_kpi_composer.py index a4312ea53..5c1f7a265 100644 --- a/src/kpi_manager/tests/test_kpi_composer.py +++ b/src/kpi_manager/tests/test_kpi_composer.py @@ -18,6 +18,10 @@ from kpi_manager.service.KpiValueComposer import KpiValueComposer LOGGER = logging.getLogger(__name__) -def test_compose_kpi(): - LOGGER.info(' >>> test_compose_kpi START <<< ') - KpiValueComposer.compose_kpi() \ No newline at end of file +# def test_compose_kpi(): +# LOGGER.info(' >>> test_compose_kpi START <<< ') +# KpiValueComposer.compose_kpi() + +def test_request_kpi_descriptor_from_db(): + LOGGER.info(' >>> test_request_kpi_descriptor_from_db START <<< ') + KpiValueComposer.request_kpi_descriptor_from_db() \ No newline at end of file -- GitLab From 9da93bf75b88c6716fc6205b66965db0d60ab5a3 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 7 Jun 2024 09:31:57 +0000 Subject: [PATCH 246/602] link_id reference is added --- src/kpi_manager/service/KpiManagerServiceServicerImpl.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py index 7f62280ff..d099f8a5e 100644 --- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -21,9 +21,10 @@ from common.proto.kpi_manager_pb2_grpc import KpiManagerServiceServicer from common.proto.kpi_manager_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 telemetry.database.TelemetryModel import Kpi as KpiModel +from kpi_manager.service.database.Kpi_DB import Kpi_DB +from kpi_manager.service.database.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 @@ -56,7 +57,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): 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_id.uuid + kpi_to_insert.link_id = request.link_id.link_uuid.uuid 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)) -- GitLab From 7a4b0d19570cb75e203e083566a48f850dd7164d Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 7 Jun 2024 09:32:48 +0000 Subject: [PATCH 247/602] import of Base class of updated to newer version --- src/kpi_manager/service/database/KpiModel.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/kpi_manager/service/database/KpiModel.py b/src/kpi_manager/service/database/KpiModel.py index 16844fdc0..9ab98e4ef 100644 --- a/src/kpi_manager/service/database/KpiModel.py +++ b/src/kpi_manager/service/database/KpiModel.py @@ -15,7 +15,8 @@ import logging from sqlalchemy.dialects.postgresql import UUID from sqlalchemy import Column, Integer, String, Float, Text, ForeignKey -from sqlalchemy.ext.declarative import declarative_base +# from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import registry from sqlalchemy.orm import sessionmaker, relationship @@ -23,7 +24,8 @@ logging.basicConfig(level=logging.INFO) LOGGER = logging.getLogger(__name__) # Create a base class for declarative models -Base = declarative_base() +Base = registry().generate_base() +# Base = declarative_base() class Kpi(Base): __tablename__ = 'kpi' -- GitLab From fe6ced62e9c847551905fc80d87395bb98454f89 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 7 Jun 2024 17:30:45 +0000 Subject: [PATCH 248/602] Kpi Composer progress --- my_deploy.sh | 2 +- src/kpi_manager/service/KpiValueComposer.py | 81 ++++++++++++++++--- src/kpi_manager/service/database/KpiModel.py | 4 +- src/kpi_manager/service/database/Kpi_DB.py | 3 +- src/kpi_manager/tests/test_kpi_composer.py | 12 ++- src/kpi_manager/tests/test_unitary.py | 4 +- .../service/TelemetryBackendService.py | 6 +- 7 files changed, 86 insertions(+), 26 deletions(-) diff --git a/my_deploy.sh b/my_deploy.sh index 74c293619..403b3a6a4 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -93,7 +93,7 @@ export CRDB_DATABASE="tfs" export CRDB_DEPLOY_MODE="single" # Disable flag for dropping database, if it exists. -export CRDB_DROP_DATABASE_IF_EXISTS="YES" +export CRDB_DROP_DATABASE_IF_EXISTS="NO" # Disable flag for re-deploying CockroachDB from scratch. export CRDB_REDEPLOY="" diff --git a/src/kpi_manager/service/KpiValueComposer.py b/src/kpi_manager/service/KpiValueComposer.py index 1bdae0e46..8274c9fd1 100644 --- a/src/kpi_manager/service/KpiValueComposer.py +++ b/src/kpi_manager/service/KpiValueComposer.py @@ -24,8 +24,8 @@ from kpi_manager.service.database.Kpi_DB import Kpi_DB from kpi_manager.service.database.KpiModel import Kpi as KpiModel LOGGER = logging.getLogger(__name__) -KAFKA_SERVER_IP = '10.152.183.175:9092' -# KAFKA_SERVER_IP = '127.0.0.1:9092' +# KAFKA_SERVER_IP = '10.152.183.175:30092' +KAFKA_SERVER_IP = '127.0.0.1:9092' # ADMIN_KAFKA_CLIENT = AdminClient({'bootstrap.servers': KAFKA_SERVER_IP}) KAFKA_TOPICS = {'request' : 'topic_request', 'response': 'topic_response', 'raw' : 'topic_raw' , 'labeled' : 'topic_labled'} @@ -33,7 +33,11 @@ PRODUCER_CONFIG = {'bootstrap.servers': KAFKA_SERVER_IP,} CONSUMER_CONFIG = {'bootstrap.servers' : KAFKA_SERVER_IP, 'group.id' : 'kpi_composer', 'auto.offset.reset' : 'latest'} -KPIs_TO_SEARCH = ["node_timex_status", "node_timex_sync_status", "node_udp_queues"] +KPIs_TO_SEARCH = ["node_network_receive_packets_total", + "node_network_receive_bytes_total", + "node_network_transmit_bytes_total", + "process_open_fds"] +DB_TABLE_NAME = KpiModel class KpiValueComposer: def __init__(self) -> None: @@ -78,19 +82,70 @@ class KpiValueComposer: def extract_kpi_values(event): pattern = re.compile("|".join(map(re.escape, KPIs_TO_SEARCH))) lines = event.split('\n') - matching_rows = [] + # matching_rows = [] + sub_names = kpi_value = "" for line in lines: - if pattern.search(line) and not line.startswith("# HELP") and not line.startswith("# TYPE"): - matching_rows.append(tuple(line.split(" "))) - print("Extracted Rows that match the KPIs {:}".format(matching_rows)) - # LOGGER.info("Extracted Rows that match the KPIs {:}".format(matching_rows)) - return matching_rows + try: + if pattern.search(line) and not line.startswith("# HELP") and not line.startswith("# TYPE"): + (kpi_name, kpi_value) = line.split(" ") + if kpi_name.endswith('}'): + (kpi_name, sub_names) = kpi_name.replace('}','').split('{') + print("Extracted row that match the KPI {:}".format((kpi_name, sub_names, kpi_value))) + kpi_descriptor = KpiValueComposer.request_kpi_descriptor_from_db() + if kpi_descriptor is not None: + kpi_to_produce = KpiValueComposer.merge_kpi_descriptor_and_value(kpi_descriptor, kpi_value) + producerObj = KafkaProducer(PRODUCER_CONFIG) + producerObj.produce(KAFKA_TOPICS['labeled'], key="labeled", value= str(kpi_to_produce), callback=KpiValueComposer.delivery_callback) + producerObj.flush() + except Exception as e: + print("Unable to extract kpi name and value from raw data: ERROR Info: {:}".format(e)) @staticmethod - def request_kpi_descriptor_from_db(): + def request_kpi_descriptor_from_db(kpi_name: str = KPIs_TO_SEARCH[0]): col_name = "kpi_description" - kpi_name = KPIs_TO_SEARCH[0] kpiDBobj = Kpi_DB() + row = kpiDBobj.search_db_row_by_id(DB_TABLE_NAME, col_name, kpi_name) + if row is not None: + LOGGER.info("Extracted Row: {:}".format(row)) + return row + else: + return None + + @staticmethod + def merge_kpi_descriptor_and_value(kpi_descriptor, kpi_value): + # Creating a dictionary from the kpi_descriptor's attributes + kpi_dict = { + 'kpi_id' : kpi_descriptor.kpi_id, + 'kpi_description': kpi_descriptor.kpi_description, + 'kpi_sample_type': kpi_descriptor.kpi_sample_type, + 'device_id' : kpi_descriptor.device_id, + 'endpoint_id' : kpi_descriptor.endpoint_id, + 'service_id' : kpi_descriptor.service_id, + 'slice_id' : kpi_descriptor.slice_id, + 'connection_id' : kpi_descriptor.connection_id, + 'link_id' : kpi_descriptor.link_id, + 'kpi_value' : kpi_value + } + return kpi_dict + + @staticmethod + def delete_kpi_by_id(): + col_name = "link_id" + kpi_name = None + kpiDBobj = Kpi_DB() + row = kpiDBobj.delete_db_row_by_id(DB_TABLE_NAME, col_name, kpi_name) + if row is not None: + LOGGER.info("Deleted Row: {:}".format(row)) - row = kpiDBobj.search_db_row_by_id(KpiModel, col_name, kpi_name) - LOGGER.info("Extracted Row: {:}".format(row)) + @staticmethod + def delivery_callback( err, msg): + """ + Callback function to handle message delivery status. + Args: + err (KafkaError): Kafka error object. + msg (Message): Kafka message object. + """ + if err: + print(f'Message delivery failed: {err}') + else: + print(f'Message delivered to topic {msg.topic()}') \ No newline at end of file diff --git a/src/kpi_manager/service/database/KpiModel.py b/src/kpi_manager/service/database/KpiModel.py index 9ab98e4ef..5bfc5525b 100644 --- a/src/kpi_manager/service/database/KpiModel.py +++ b/src/kpi_manager/service/database/KpiModel.py @@ -31,7 +31,7 @@ class Kpi(Base): __tablename__ = 'kpi' kpi_id = Column(UUID(as_uuid=False), primary_key=True) - kpi_description = Column(Text) + kpi_description = Column(Text, unique=True) kpi_sample_type = Column(Integer) device_id = Column(String) endpoint_id = Column(String) @@ -39,8 +39,6 @@ class Kpi(Base): slice_id = Column(String) connection_id = Column(String) link_id = Column(String) - # monitor_flag = Column(String) - # helps in logging the information def __repr__(self): diff --git a/src/kpi_manager/service/database/Kpi_DB.py b/src/kpi_manager/service/database/Kpi_DB.py index 06800605b..68ac156c7 100644 --- a/src/kpi_manager/service/database/Kpi_DB.py +++ b/src/kpi_manager/service/database/Kpi_DB.py @@ -80,7 +80,7 @@ class Kpi_DB: try: entity = session.query(model).filter_by(**{col_name: id_to_search}).first() if entity: - LOGGER.info(f"{model.__name__} ID found: {str(entity)}") + # LOGGER.info(f"{model.__name__} ID found: {str(entity)}") return entity else: LOGGER.warning(f"{model.__name__} ID not found: {str(id_to_search)}") @@ -102,6 +102,7 @@ class Kpi_DB: LOGGER.info("Deleted %s with %s: %s", model.__name__, col_name, id_to_search) else: LOGGER.warning("%s with %s %s not found", model.__name__, col_name, id_to_search) + return None except Exception as e: session.rollback() LOGGER.error("Error deleting %s with %s %s: %s", model.__name__, col_name, id_to_search, e) diff --git a/src/kpi_manager/tests/test_kpi_composer.py b/src/kpi_manager/tests/test_kpi_composer.py index 5c1f7a265..6b96f4fc2 100644 --- a/src/kpi_manager/tests/test_kpi_composer.py +++ b/src/kpi_manager/tests/test_kpi_composer.py @@ -18,10 +18,14 @@ from kpi_manager.service.KpiValueComposer import KpiValueComposer LOGGER = logging.getLogger(__name__) -# def test_compose_kpi(): -# LOGGER.info(' >>> test_compose_kpi START <<< ') -# KpiValueComposer.compose_kpi() +def test_compose_kpi(): + LOGGER.info(' >>> test_compose_kpi START <<< ') + KpiValueComposer.compose_kpi() def test_request_kpi_descriptor_from_db(): LOGGER.info(' >>> test_request_kpi_descriptor_from_db START <<< ') - KpiValueComposer.request_kpi_descriptor_from_db() \ No newline at end of file + KpiValueComposer.request_kpi_descriptor_from_db() + +# def test_delete_kpi_by_id(): +# LOGGER.info(' >>> test_request_kpi_descriptor_from_db START <<< ') +# KpiValueComposer.delete_kpi_by_id() \ No newline at end of file diff --git a/src/kpi_manager/tests/test_unitary.py b/src/kpi_manager/tests/test_unitary.py index 8ac50a38b..f6d8460d9 100755 --- a/src/kpi_manager/tests/test_unitary.py +++ b/src/kpi_manager/tests/test_unitary.py @@ -215,7 +215,9 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab # ---------- 2nd Iteration Tests ----------------- def test_SetKpiDescriptor(kpi_manager_client): LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ") - _descriptors = ["node_timex_status", "node_timex_sync_status", "node_udp_queues"] + _descriptors = ["node_network_receive_packets_total", + "node_network_receive_bytes_total", + "node_network_transmit_bytes_total"] 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)) diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 60cfcc6e6..903945018 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -30,8 +30,8 @@ from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_m LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('Telemetry', 'TelemetryBackend') -# KAFKA_SERVER_IP = '127.0.0.1:9092' -KAFKA_SERVER_IP = '10.152.183.175:9092' +KAFKA_SERVER_IP = '127.0.0.1:9092' +# KAFKA_SERVER_IP = '10.152.183.175:30092' ADMIN_KAFKA_CLIENT = AdminClient({'bootstrap.servers': KAFKA_SERVER_IP}) KAFKA_TOPICS = {'request' : 'topic_request', 'response': 'topic_response', 'raw' : 'topic_raw' , 'labeled' : 'topic_labled'} @@ -242,7 +242,7 @@ class TelemetryBackendService: LOGGER.info("Didn't received expected response. Status code: {:}".format(response.status_code)) print(f"Didn't received expected response. Status code: {response.status_code}") return None - time.sleep(5) + time.sleep(15) except Exception as e: LOGGER.info("Failed to process response. Status code: {:}".format(e)) return None -- GitLab From 98039a9c20206c05707bc6075f83ee73830e5b4f Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sun, 9 Jun 2024 09:51:29 +0000 Subject: [PATCH 249/602] Kafka topic name changed from "labled" to "labeled" --- src/kpi_manager/service/KpiValueComposer.py | 16 +++++++++------- .../backend/service/TelemetryBackendService.py | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/kpi_manager/service/KpiValueComposer.py b/src/kpi_manager/service/KpiValueComposer.py index 8274c9fd1..9d703b233 100644 --- a/src/kpi_manager/service/KpiValueComposer.py +++ b/src/kpi_manager/service/KpiValueComposer.py @@ -28,7 +28,7 @@ LOGGER = logging.getLogger(__name__) KAFKA_SERVER_IP = '127.0.0.1:9092' # ADMIN_KAFKA_CLIENT = AdminClient({'bootstrap.servers': KAFKA_SERVER_IP}) KAFKA_TOPICS = {'request' : 'topic_request', 'response': 'topic_response', - 'raw' : 'topic_raw' , 'labeled' : 'topic_labled'} + 'raw' : 'topic_raw' , 'labeled' : 'topic_labeled'} PRODUCER_CONFIG = {'bootstrap.servers': KAFKA_SERVER_IP,} CONSUMER_CONFIG = {'bootstrap.servers' : KAFKA_SERVER_IP, 'group.id' : 'kpi_composer', @@ -45,12 +45,12 @@ class KpiValueComposer: @staticmethod def compose_kpi(): - KpiValueComposer.run_kafka_listener() - - @staticmethod - def run_kafka_listener(): threading.Thread(target=KpiValueComposer.kafka_listener, args=()).start() + # @staticmethod + # def run_kafka_listener(): + # threading.Thread(target=KpiValueComposer.kafka_listener, args=()).start() + @staticmethod def kafka_listener(): """ @@ -91,17 +91,19 @@ class KpiValueComposer: if kpi_name.endswith('}'): (kpi_name, sub_names) = kpi_name.replace('}','').split('{') print("Extracted row that match the KPI {:}".format((kpi_name, sub_names, kpi_value))) - kpi_descriptor = KpiValueComposer.request_kpi_descriptor_from_db() + kpi_descriptor = KpiValueComposer.request_kpi_descriptor_from_db(kpi_name) if kpi_descriptor is not None: kpi_to_produce = KpiValueComposer.merge_kpi_descriptor_and_value(kpi_descriptor, kpi_value) producerObj = KafkaProducer(PRODUCER_CONFIG) producerObj.produce(KAFKA_TOPICS['labeled'], key="labeled", value= str(kpi_to_produce), callback=KpiValueComposer.delivery_callback) producerObj.flush() + else: + print ("No matching of KPI ({:}) found in db".format(kpi_name)) except Exception as e: print("Unable to extract kpi name and value from raw data: ERROR Info: {:}".format(e)) @staticmethod - def request_kpi_descriptor_from_db(kpi_name: str = KPIs_TO_SEARCH[0]): + def request_kpi_descriptor_from_db(kpi_name: str = KPIs_TO_SEARCH[0]): # = KPIs_TO_SEARCH[0] is added for testing col_name = "kpi_description" kpiDBobj = Kpi_DB() row = kpiDBobj.search_db_row_by_id(DB_TABLE_NAME, col_name, kpi_name) diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 903945018..ad0132e47 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -34,7 +34,7 @@ KAFKA_SERVER_IP = '127.0.0.1:9092' # KAFKA_SERVER_IP = '10.152.183.175:30092' ADMIN_KAFKA_CLIENT = AdminClient({'bootstrap.servers': KAFKA_SERVER_IP}) KAFKA_TOPICS = {'request' : 'topic_request', 'response': 'topic_response', - 'raw' : 'topic_raw' , 'labeled' : 'topic_labled'} + 'raw' : 'topic_raw' , 'labeled' : 'topic_labeled'} EXPORTER_ENDPOINT = "http://10.152.183.2:9100/metrics" PRODUCER_CONFIG = {'bootstrap.servers': KAFKA_SERVER_IP,} -- GitLab From 25eb5f8bb4fc2531e0bc0a122a40c84bee0ca38e Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sun, 9 Jun 2024 13:28:08 +0000 Subject: [PATCH 250/602] KpiWriter is sucessfully able to read from Kafka "topic_labled". --- scripts/run_tests_locally-kpi-manager.sh | 2 +- scripts/run_tests_locally-kpi-writer.sh | 23 +++++ src/kpi_manager/service/KpiWriter.py | 87 +++++++++++++++++++ src/kpi_manager/service/database/Kpi_DB.py | 4 +- .../{test_unitary.py => test_kpi_manager.py} | 0 src/kpi_manager/tests/test_kpi_writer.py | 24 +++++ 6 files changed, 137 insertions(+), 3 deletions(-) create mode 100755 scripts/run_tests_locally-kpi-writer.sh create mode 100644 src/kpi_manager/service/KpiWriter.py rename src/kpi_manager/tests/{test_unitary.py => test_kpi_manager.py} (100%) create mode 100644 src/kpi_manager/tests/test_kpi_writer.py diff --git a/scripts/run_tests_locally-kpi-manager.sh b/scripts/run_tests_locally-kpi-manager.sh index e56716dea..be69980e0 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_unitary.py \ No newline at end of file + kpi_manager/tests/test_kpi_manager.py \ No newline at end of file diff --git a/scripts/run_tests_locally-kpi-writer.sh b/scripts/run_tests_locally-kpi-writer.sh new file mode 100755 index 000000000..2bc2e5130 --- /dev/null +++ b/scripts/run_tests_locally-kpi-writer.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# 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. + + +PROJECTDIR=`pwd` + +cd $PROJECTDIR/src + +RCFILE=$PROJECTDIR/coverage/.coveragerc +python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ + kpi_manager/tests/test_kpi_writer.py \ No newline at end of file diff --git a/src/kpi_manager/service/KpiWriter.py b/src/kpi_manager/service/KpiWriter.py new file mode 100644 index 000000000..3c8382c12 --- /dev/null +++ b/src/kpi_manager/service/KpiWriter.py @@ -0,0 +1,87 @@ +# 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. + +# read Kafka stream from Kafka topic + +import threading +from confluent_kafka import KafkaError +from prometheus_client import start_http_server, Gauge +from confluent_kafka import Consumer as KafkaConsumer + +KAFKA_SERVER_IP = '127.0.0.1:9092' +KAFKA_TOPICS = {'request' : 'topic_request', 'response': 'topic_response', + 'raw' : 'topic_raw' , 'labeled' : 'topic_labeled'} +CONSUMER_CONFIG = {'bootstrap.servers' : KAFKA_SERVER_IP, + 'group.id' : 'kpi_writer', + 'auto.offset.reset' : 'latest'} +KPIs_TO_SEARCH = ["node_network_receive_packets_total", + "node_network_receive_bytes_total", + "node_network_transmit_bytes_total", + "process_open_fds"] +PROM_METRICS = {} + + +class KpiWriter: + def __init__(self) -> None: + pass + + @staticmethod + def kpi_writer(): + threading.Thread(target=KpiWriter.kafka_listener, args=()).start() + + @staticmethod + def kafka_listener(): + """ + listener for events on Kafka topic. + """ + kafka_consumer = KafkaConsumer(CONSUMER_CONFIG) + kafka_consumer.subscribe([KAFKA_TOPICS['labeled']]) + while True: + receive_msg = kafka_consumer.poll(2.0) + if receive_msg is None: + # print (" - Telemetry frontend listening on Kafka Topic: ", KAFKA_TOPICS['raw']) # added for debugging purposes + continue + elif receive_msg.error(): + if receive_msg.error().code() == KafkaError._PARTITION_EOF: + continue + else: + print("Consumer error: {}".format(receive_msg.error())) + continue + try: + new_event = receive_msg.value().decode('utf-8') + # print("New event on topic '{:}' is {:}".format(KAFKA_TOPICS['raw'], new_event)) + # LOGGER.info("New event on topic '{:}' is {:}".format(KAFKA_TOPICS['raw'], new_event)) + KpiWriter.write_metric_to_promtheus(new_event) + except Exception as e: + print(f"Error to consume event from topic: {KAFKA_TOPICS['labeled']}. Error detail: {str(e)}") + continue + + @staticmethod + # send metric to Prometheus + def write_metric_to_promtheus(event): + print("New recevied event: {:}".format(event)) + + # # create Prometheus metrics + # for metric_key in KPIs_TO_SEARCH: + # metric_name = metric_key + # metric_description = "description of " + str(metric_key) + # metric_tags = "tags of " + str(metric_key) + # PROM_METRICS[metric_key] = Gauge( metric_name, metric_description,metric_tags ) + + # NN_REC_PKTS_TOTAL = PROM_METRICS["node_network_receive_packets_total"] + # NN_REC_BYTS_TOTAL = PROM_METRICS["node_network_receive_bytes_total"] + # NN_TRSMT_BYTS_TOTAL = PROM_METRICS["node_network_transmit_bytes_total"] + # PROC_OPEN_FDs = PROM_METRICS["process_open_fds"] + + diff --git a/src/kpi_manager/service/database/Kpi_DB.py b/src/kpi_manager/service/database/Kpi_DB.py index 68ac156c7..45c9ff7ed 100644 --- a/src/kpi_manager/service/database/Kpi_DB.py +++ b/src/kpi_manager/service/database/Kpi_DB.py @@ -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 @@ -50,7 +50,7 @@ class Kpi_DB: Kpi.metadata.create_all(self.db_engine) # type: ignore LOGGER.info("Tables created in the DB Name: {:}".format(self.db_name)) except Exception as e: - LOGGER.info("Tables cannot be created in the TelemetryFrontend database. {:s}".format(str(e))) + LOGGER.info("Tables cannot be created in the kpi database. {:s}".format(str(e))) def verify_tables(self): try: diff --git a/src/kpi_manager/tests/test_unitary.py b/src/kpi_manager/tests/test_kpi_manager.py similarity index 100% rename from src/kpi_manager/tests/test_unitary.py rename to src/kpi_manager/tests/test_kpi_manager.py diff --git a/src/kpi_manager/tests/test_kpi_writer.py b/src/kpi_manager/tests/test_kpi_writer.py new file mode 100644 index 000000000..d2261b6ad --- /dev/null +++ b/src/kpi_manager/tests/test_kpi_writer.py @@ -0,0 +1,24 @@ +# 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 threading +import logging +from kpi_manager.service.KpiWriter import KpiWriter + +LOGGER = logging.getLogger(__name__) + +def test_kpi_writer(): + LOGGER.info(' >>> test_kpi_writer START <<< ') + KpiWriter.kpi_writer() + -- GitLab From f766e5123d0dd713d25291e23d779122d395fd96 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sun, 9 Jun 2024 14:38:18 +0000 Subject: [PATCH 251/602] Create Promtheus client V1 (not working 100%) --- src/kpi_manager/service/KpiWriter.py | 48 ++++++++++++++++++---------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/src/kpi_manager/service/KpiWriter.py b/src/kpi_manager/service/KpiWriter.py index 3c8382c12..8d26ce494 100644 --- a/src/kpi_manager/service/KpiWriter.py +++ b/src/kpi_manager/service/KpiWriter.py @@ -14,9 +14,11 @@ # read Kafka stream from Kafka topic +import ast +import time import threading from confluent_kafka import KafkaError -from prometheus_client import start_http_server, Gauge +from prometheus_client import start_http_server, Gauge, CollectorRegistry from confluent_kafka import Consumer as KafkaConsumer KAFKA_SERVER_IP = '127.0.0.1:9092' @@ -30,7 +32,7 @@ KPIs_TO_SEARCH = ["node_network_receive_packets_total", "node_network_transmit_bytes_total", "process_open_fds"] PROM_METRICS = {} - +KAFKA_REGISTERY = CollectorRegistry() class KpiWriter: def __init__(self) -> None: @@ -38,6 +40,9 @@ class KpiWriter: @staticmethod def kpi_writer(): + # Start up the server to expose the metrics at port number mention below. + start_http_server(8101) + KpiWriter.create_prom_metrics_name() threading.Thread(target=KpiWriter.kafka_listener, args=()).start() @staticmethod @@ -67,21 +72,30 @@ class KpiWriter: print(f"Error to consume event from topic: {KAFKA_TOPICS['labeled']}. Error detail: {str(e)}") continue - @staticmethod # send metric to Prometheus + @staticmethod def write_metric_to_promtheus(event): - print("New recevied event: {:}".format(event)) - - # # create Prometheus metrics - # for metric_key in KPIs_TO_SEARCH: - # metric_name = metric_key - # metric_description = "description of " + str(metric_key) - # metric_tags = "tags of " + str(metric_key) - # PROM_METRICS[metric_key] = Gauge( metric_name, metric_description,metric_tags ) - - # NN_REC_PKTS_TOTAL = PROM_METRICS["node_network_receive_packets_total"] - # NN_REC_BYTS_TOTAL = PROM_METRICS["node_network_receive_bytes_total"] - # NN_TRSMT_BYTS_TOTAL = PROM_METRICS["node_network_transmit_bytes_total"] - # PROC_OPEN_FDs = PROM_METRICS["process_open_fds"] - + event = ast.literal_eval(event) # converted into dict + print("New recevied event: {:}".format(event['kpi_description'])) + event_kpi_name = event['kpi_description'] + if event_kpi_name in KPIs_TO_SEARCH: + PROM_METRICS[event_kpi_name].labels( + tag1 = "test tag value", + tag2 = "test tag value" + ).set(event['kpi_value']) + time.sleep(0.05) + @staticmethod + def create_prom_metrics_name(): + metric_tags = ["tag1", "tag2"] + for metric_key in KPIs_TO_SEARCH: + metric_name = metric_key + metric_description = "description of " + str(metric_key) + try: + PROM_METRICS[metric_key] = Gauge ( + metric_name, metric_description, metric_tags, + registry=KAFKA_REGISTERY ) + print("Metric pushed to Prometheus: {:}".format(PROM_METRICS[metric_key])) + except ValueError as e: + if 'Duplicated timeseries' in str(e): + print("Metric {:} is already registered. Skipping.".format(metric_name)) -- GitLab From d120ce74db0201b910147af0ee523b2ec5ba61c8 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sun, 9 Jun 2024 22:38:48 +0000 Subject: [PATCH 252/602] Promtheus exporter is sucessfully working. --- src/kpi_manager/service/KpiWriter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/kpi_manager/service/KpiWriter.py b/src/kpi_manager/service/KpiWriter.py index 8d26ce494..62fd4b7b3 100644 --- a/src/kpi_manager/service/KpiWriter.py +++ b/src/kpi_manager/service/KpiWriter.py @@ -40,8 +40,6 @@ class KpiWriter: @staticmethod def kpi_writer(): - # Start up the server to expose the metrics at port number mention below. - start_http_server(8101) KpiWriter.create_prom_metrics_name() threading.Thread(target=KpiWriter.kafka_listener, args=()).start() @@ -50,6 +48,8 @@ class KpiWriter: """ listener for events on Kafka topic. """ + # Start up the server to expose the metrics at port number mention below. + start_http_server(8101, registry=KAFKA_REGISTERY) kafka_consumer = KafkaConsumer(CONSUMER_CONFIG) kafka_consumer.subscribe([KAFKA_TOPICS['labeled']]) while True: -- GitLab From f4b549f7c29925d461522d364a4f60c92e3489a5 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sun, 9 Jun 2024 23:18:54 +0000 Subject: [PATCH 253/602] All KPI tags are added with metric. --- src/kpi_manager/service/KpiValueComposer.py | 2 +- src/kpi_manager/service/KpiWriter.py | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/kpi_manager/service/KpiValueComposer.py b/src/kpi_manager/service/KpiValueComposer.py index 9d703b233..31da6c5db 100644 --- a/src/kpi_manager/service/KpiValueComposer.py +++ b/src/kpi_manager/service/KpiValueComposer.py @@ -86,7 +86,7 @@ class KpiValueComposer: sub_names = kpi_value = "" for line in lines: try: - if pattern.search(line) and not line.startswith("# HELP") and not line.startswith("# TYPE"): + if pattern.search(line) and not line.startswith("# HELP") and not line.startswith("# TYPE") and not 'device="lo"' in line: (kpi_name, kpi_value) = line.split(" ") if kpi_name.endswith('}'): (kpi_name, sub_names) = kpi_name.replace('}','').split('{') diff --git a/src/kpi_manager/service/KpiWriter.py b/src/kpi_manager/service/KpiWriter.py index 62fd4b7b3..6c74f1a05 100644 --- a/src/kpi_manager/service/KpiWriter.py +++ b/src/kpi_manager/service/KpiWriter.py @@ -76,18 +76,25 @@ class KpiWriter: @staticmethod def write_metric_to_promtheus(event): event = ast.literal_eval(event) # converted into dict - print("New recevied event: {:}".format(event['kpi_description'])) + print("New recevied event: {:}".format(event)) event_kpi_name = event['kpi_description'] if event_kpi_name in KPIs_TO_SEARCH: PROM_METRICS[event_kpi_name].labels( - tag1 = "test tag value", - tag2 = "test tag value" - ).set(event['kpi_value']) + kpi_id = event['kpi_id'], + kpi_sample_type = event['kpi_sample_type'], + device_id = event['device_id'], + endpoint_id = event['endpoint_id'], + service_id = event['service_id'], + slice_id = event['slice_id'], + connection_id = event['connection_id'], + link_id = event['link_id'] + ).set(float(event['kpi_value'])) time.sleep(0.05) @staticmethod def create_prom_metrics_name(): - metric_tags = ["tag1", "tag2"] + metric_tags = ['kpi_id','kpi_sample_type','device_id', + 'endpoint_id','service_id','slice_id','connection_id','link_id'] for metric_key in KPIs_TO_SEARCH: metric_name = metric_key metric_description = "description of " + str(metric_key) @@ -95,7 +102,7 @@ class KpiWriter: PROM_METRICS[metric_key] = Gauge ( metric_name, metric_description, metric_tags, registry=KAFKA_REGISTERY ) - print("Metric pushed to Prometheus: {:}".format(PROM_METRICS[metric_key])) + # print("Metric pushed to Prometheus: {:}".format(PROM_METRICS[metric_key])) except ValueError as e: if 'Duplicated timeseries' in str(e): print("Metric {:} is already registered. Skipping.".format(metric_name)) -- GitLab From 10e29ea8a488002d2c51078439626edf58f3d845 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 10 Jun 2024 09:42:03 +0000 Subject: [PATCH 254/602] minor changes in KPI composer --- src/kpi_manager/service/KpiValueComposer.py | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/kpi_manager/service/KpiValueComposer.py b/src/kpi_manager/service/KpiValueComposer.py index 31da6c5db..bb2b6ebf3 100644 --- a/src/kpi_manager/service/KpiValueComposer.py +++ b/src/kpi_manager/service/KpiValueComposer.py @@ -47,10 +47,6 @@ class KpiValueComposer: def compose_kpi(): threading.Thread(target=KpiValueComposer.kafka_listener, args=()).start() - # @staticmethod - # def run_kafka_listener(): - # threading.Thread(target=KpiValueComposer.kafka_listener, args=()).start() - @staticmethod def kafka_listener(): """ @@ -71,15 +67,13 @@ class KpiValueComposer: continue try: new_event = receive_msg.value().decode('utf-8') - # print("New event on topic '{:}' is {:}".format(KAFKA_TOPICS['raw'], new_event)) - # LOGGER.info("New event on topic '{:}' is {:}".format(KAFKA_TOPICS['raw'], new_event)) - KpiValueComposer.extract_kpi_values(new_event) + KpiValueComposer.process_event_and_label_kpi(new_event) except Exception as e: print(f"Error to consume event from topic: {KAFKA_TOPICS['raw']}. Error detail: {str(e)}") continue @staticmethod - def extract_kpi_values(event): + def process_event_and_label_kpi(event): pattern = re.compile("|".join(map(re.escape, KPIs_TO_SEARCH))) lines = event.split('\n') # matching_rows = [] @@ -90,7 +84,7 @@ class KpiValueComposer: (kpi_name, kpi_value) = line.split(" ") if kpi_name.endswith('}'): (kpi_name, sub_names) = kpi_name.replace('}','').split('{') - print("Extracted row that match the KPI {:}".format((kpi_name, sub_names, kpi_value))) + print("Received KPI from raw topic: {:}".format((kpi_name, sub_names, kpi_value))) kpi_descriptor = KpiValueComposer.request_kpi_descriptor_from_db(kpi_name) if kpi_descriptor is not None: kpi_to_produce = KpiValueComposer.merge_kpi_descriptor_and_value(kpi_descriptor, kpi_value) @@ -130,15 +124,6 @@ class KpiValueComposer: } return kpi_dict - @staticmethod - def delete_kpi_by_id(): - col_name = "link_id" - kpi_name = None - kpiDBobj = Kpi_DB() - row = kpiDBobj.delete_db_row_by_id(DB_TABLE_NAME, col_name, kpi_name) - if row is not None: - LOGGER.info("Deleted Row: {:}".format(row)) - @staticmethod def delivery_callback( err, msg): """ -- GitLab From 8d398733bf78762230c0b766acf9e2b8d17a7e9c Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 10 Jun 2024 11:46:16 +0000 Subject: [PATCH 255/602] minor changes in TelemetryFrontend --- .../backend/tests/testTelemetryBackend.py | 34 ++++++------- src/telemetry/database/TelemetryModel.py | 48 ++++------------- src/telemetry/database/managementDB.py | 51 ++++++++++++------- .../TelemetryFrontendServiceServicerImpl.py | 4 +- src/telemetry/frontend/tests/Messages.py | 8 ++- src/telemetry/frontend/tests/test_frontend.py | 8 +++ 6 files changed, 77 insertions(+), 76 deletions(-) diff --git a/src/telemetry/backend/tests/testTelemetryBackend.py b/src/telemetry/backend/tests/testTelemetryBackend.py index e81e98473..f8abc08cf 100644 --- a/src/telemetry/backend/tests/testTelemetryBackend.py +++ b/src/telemetry/backend/tests/testTelemetryBackend.py @@ -28,26 +28,26 @@ LOGGER = logging.getLogger(__name__) # Tests Implementation of Telemetry Backend ########################### -# def test_verify_kafka_topics(): -# LOGGER.info('test_verify_kafka_topics requesting') -# TelemetryBackendServiceObj = TelemetryBackendService() -# KafkaTopics = ['topic_request', 'topic_response', 'topic_raw', 'topic_labled'] -# response = TelemetryBackendServiceObj.create_topic_if_not_exists(KafkaTopics) -# LOGGER.debug(str(response)) -# assert isinstance(response, bool) - -# def test_run_kafka_listener(): -# LOGGER.info('test_receive_kafka_request requesting') -# TelemetryBackendServiceObj = TelemetryBackendService() -# response = TelemetryBackendServiceObj.run_kafka_listener() -# LOGGER.debug(str(response)) -# assert isinstance(response, bool) +def test_verify_kafka_topics(): + LOGGER.info('test_verify_kafka_topics requesting') + TelemetryBackendServiceObj = TelemetryBackendService() + KafkaTopics = ['topic_request', 'topic_response', 'topic_raw', 'topic_labled'] + response = TelemetryBackendServiceObj.create_topic_if_not_exists(KafkaTopics) + LOGGER.debug(str(response)) + assert isinstance(response, bool) + +def test_run_kafka_listener(): + LOGGER.info('test_receive_kafka_request requesting') + TelemetryBackendServiceObj = TelemetryBackendService() + response = TelemetryBackendServiceObj.run_kafka_listener() + LOGGER.debug(str(response)) + assert isinstance(response, bool) # def test_fetch_node_exporter_metrics(): # LOGGER.info(' >>> test_fetch_node_exporter_metrics START <<< ') # TelemetryBackendService.fetch_single_node_exporter_metric() -def test_stream_node_export_metrics_to_raw_topic(): - LOGGER.info(' >>> test_stream_node_export_metrics_to_raw_topic START <<< ') - threading.Thread(target=TelemetryBackendService.stream_node_export_metrics_to_raw_topic, args=()).start() +# def test_stream_node_export_metrics_to_raw_topic(): +# LOGGER.info(' >>> test_stream_node_export_metrics_to_raw_topic START <<< ') +# threading.Thread(target=TelemetryBackendService.stream_node_export_metrics_to_raw_topic, args=()).start() diff --git a/src/telemetry/database/TelemetryModel.py b/src/telemetry/database/TelemetryModel.py index 8defdd2e8..54b7c13ef 100644 --- a/src/telemetry/database/TelemetryModel.py +++ b/src/telemetry/database/TelemetryModel.py @@ -17,55 +17,29 @@ from sqlalchemy.dialects.postgresql import UUID from sqlalchemy import Column, Integer, String, Float, Text, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, relationship - +from sqlalchemy.orm import registry logging.basicConfig(level=logging.INFO) LOGGER = logging.getLogger(__name__) # Create a base class for declarative models -Base = declarative_base() - -class Kpi(Base): - __tablename__ = 'kpi' - - kpi_id = Column(UUID(as_uuid=False), primary_key=True) - kpi_description = Column(Text) - 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) - # monitor_flag = Column(String) - - # Relationship to Collector model: allows access to related Collector objects from a Kpi object - collectors = relationship('Collector', back_populates='kpi') - - # helps in logging the information - def __repr__(self): - return (f"") +Base = registry().generate_base() +# Base = declarative_base() class Collector(Base): __tablename__ = 'collector' - collector_id = Column(UUID(as_uuid=False), primary_key=True) - kpi_id = Column(UUID(as_uuid=False), ForeignKey('kpi.kpi_id')) - collector = Column(String) - sampling_duration_s = Column(Float) - sampling_interval_s = Column(Float) - start_timestamp = Column(Float) - end_timestamp = Column(Float) + collector_id = Column(UUID(as_uuid=False), primary_key=True) + kpi_id = Column(UUID(as_uuid=False)) + collector_decription = Column(String) + sampling_duration_s = Column(Float) + sampling_interval_s = Column(Float) + start_timestamp = Column(Float) + end_timestamp = Column(Float) - # Relationship to Kpi model: allows access to the related Kpi object from a Collector object - kpi = relationship('Kpi', back_populates='collectors') def __repr__(self): return (f"") \ No newline at end of file diff --git a/src/telemetry/database/managementDB.py b/src/telemetry/database/managementDB.py index 0a94c6c25..3e0cfc5fb 100644 --- a/src/telemetry/database/managementDB.py +++ b/src/telemetry/database/managementDB.py @@ -13,16 +13,18 @@ # limitations under the License. import logging, time +import sqlalchemy +import sqlalchemy_utils from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base from telemetry.database.TelemetryEngine import TelemetryEngine - +from telemetry.database.TelemetryModel import Base LOGGER = logging.getLogger(__name__) -TELEMETRY_DB_NAME = "telemetryfrontend" +DB_NAME = "telemetryfrontend" -# Create a base class for declarative models -Base = declarative_base() +# # Create a base class for declarative models +# Base = declarative_base() class managementDB: def __init__(self): @@ -30,23 +32,35 @@ class managementDB: if self.db_engine is None: LOGGER.error('Unable to get SQLAlchemy DB Engine...') return False - self.db_name = TELEMETRY_DB_NAME + self.db_name = DB_NAME self.Session = sessionmaker(bind=self.db_engine) - def create_database(self): - try: - with self.db_engine.connect() as connection: - connection.execute(f"CREATE DATABASE {self.db_name};") - LOGGER.info('managementDB initalizes database. Name: {self.db_name}') - return True - except: - LOGGER.exception('Failed to check/create the database: {:s}'.format(str(self.db_engine.url))) - return False + @staticmethod + def create_database(engine : sqlalchemy.engine.Engine) -> None: + if not sqlalchemy_utils.database_exists(engine.url): + LOGGER.info("Database created. {:}".format(engine.url)) + sqlalchemy_utils.create_database(engine.url) + + @staticmethod + def drop_database(engine : sqlalchemy.engine.Engine) -> None: + if sqlalchemy_utils.database_exists(engine.url): + sqlalchemy_utils.drop_database(engine.url) + + # def create_database(self): + # try: + # with self.db_engine.connect() as connection: + # connection.execute(f"CREATE DATABASE {self.db_name};") + # LOGGER.info('managementDB initalizes database. Name: {self.db_name}') + # return True + # except: + # LOGGER.exception('Failed to check/create the database: {:s}'.format(str(self.db_engine.url))) + # return False - def create_tables(self): + @staticmethod + def create_tables(engine : sqlalchemy.engine.Engine): try: - Base.metadata.create_all(self.db_engine) # type: ignore - LOGGER.info("Tables created in the DB Name: {:}".format(self.db_name)) + Base.metadata.create_all(engine) # type: ignore + LOGGER.info("Tables created in the DB Name: {:}".format(DB_NAME)) except Exception as e: LOGGER.info("Tables cannot be created in the TelemetryFrontend database. {:s}".format(str(e))) @@ -59,6 +73,7 @@ class managementDB: except Exception as e: LOGGER.info("Unable to fetch Table names. {:s}".format(str(e))) + @staticmethod def add_row_to_db(self, row): session = self.Session() try: @@ -103,7 +118,7 @@ class managementDB: LOGGER.error("Error deleting %s with %s %s: %s", model.__name__, col_name, id_to_search, e) finally: session.close() - + def select_with_filter(self, model, **filters): session = self.Session() try: diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index d10e9dffd..c63b42cbf 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -55,12 +55,12 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): collector_to_insert = CollectorModel() collector_to_insert.collector_id = request.collector_id.collector_id.uuid collector_to_insert.kpi_id = request.kpi_id.kpi_id.uuid - collector_to_insert.collector = "DESC 1" + # collector_to_insert.collector_decription= request.collector collector_to_insert.sampling_duration_s = request.duration_s collector_to_insert.sampling_interval_s = request.interval_s collector_to_insert.start_timestamp = time.time() collector_to_insert.end_timestamp = time.time() - self.managementDBobj.add_row_to_db(collector_to_insert) + managementDB.add_row_to_db(collector_to_insert) except Exception as e: LOGGER.info("Unable to create collectorModel class object. {:}".format(e)) diff --git a/src/telemetry/frontend/tests/Messages.py b/src/telemetry/frontend/tests/Messages.py index 48668f7bf..6dc1dffa9 100644 --- a/src/telemetry/frontend/tests/Messages.py +++ b/src/telemetry/frontend/tests/Messages.py @@ -17,6 +17,8 @@ import random from common.proto import telemetry_frontend_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType + +# ----------------------- "2nd" Iteration -------------------------------- def create_collector_id(): _collector_id = telemetry_frontend_pb2.CollectorId() _collector_id.collector_id.uuid = uuid.uuid4() @@ -31,16 +33,18 @@ def create_collector_request(): _create_collector_request = telemetry_frontend_pb2.Collector() _create_collector_request.collector_id.collector_id.uuid = str(uuid.uuid4()) _create_collector_request.kpi_id.kpi_id.uuid = "165d20c5-a446-42fa-812f-e2b7ed283c6f" + # _create_collector_request.collector = "collector description" _create_collector_request.duration_s = float(random.randint(8, 16)) _create_collector_request.interval_s = float(random.randint(2, 4)) return _create_collector_request def create_collector_filter(): _create_collector_filter = telemetry_frontend_pb2.CollectorFilter() - new_kpi_id = _create_collector_filter.kpi_id.add() - new_kpi_id.kpi_id.uuid = "165d20c5-a446-42fa-812f-e2b7ed283c6f" + new_kpi_id = _create_collector_filter.kpi_id.add() + new_kpi_id.kpi_id.uuid = "165d20c5-a446-42fa-812f-e2b7ed283c6f" return _create_collector_filter +# ----------------------- "First" Iteration -------------------------------- # def create_collector_request_a(): # _create_collector_request_a = telemetry_frontend_pb2.Collector() # _create_collector_request_a.collector_id.collector_id.uuid = "-1" diff --git a/src/telemetry/frontend/tests/test_frontend.py b/src/telemetry/frontend/tests/test_frontend.py index 7d050349b..e33545dcc 100644 --- a/src/telemetry/frontend/tests/test_frontend.py +++ b/src/telemetry/frontend/tests/test_frontend.py @@ -32,6 +32,8 @@ from telemetry.frontend.client.TelemetryFrontendClient import TelemetryFrontendC from telemetry.frontend.service.TelemetryFrontendService import TelemetryFrontendService from telemetry.frontend.service.TelemetryFrontendServiceServicerImpl import TelemetryFrontendServiceServicerImpl from telemetry.frontend.tests.Messages import ( create_collector_request, create_collector_filter) +from telemetry.database.managementDB import managementDB +from telemetry.database.TelemetryEngine import TelemetryEngine from device.client.DeviceClient import DeviceClient from device.service.DeviceService import DeviceService @@ -166,6 +168,12 @@ def telemetryFrontend_client( # Tests Implementation of Telemetry Frontend ########################### +def test_verify_db_and_table(): + LOGGER.info(' >>> test_verify_database_and_tables START: <<< ') + _engine = TelemetryEngine.get_engine() + managementDB.create_database(_engine) + managementDB.create_tables(_engine) + def test_StartCollector(telemetryFrontend_client): LOGGER.info(' >>> test_StartCollector START: <<< ') response = telemetryFrontend_client.StartCollector(create_collector_request()) -- GitLab From da36643781237614e4bfd4db4668b91af8577b85 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 10 Jun 2024 17:08:58 +0000 Subject: [PATCH 256/602] KPI manager - Flow tested sucessfully --- src/kpi_manager/service/KPI_configs.json | 8 + .../service/KpiManagerServiceServicerImpl.py | 73 ++------ src/kpi_manager/service/database/Kpi_DB.py | 5 +- src/kpi_manager/tests/test_kpi_manager.py | 51 +++--- src/kpi_manager/tests/test_messages.py | 158 +++++++++--------- 5 files changed, 135 insertions(+), 160 deletions(-) create mode 100644 src/kpi_manager/service/KPI_configs.json diff --git a/src/kpi_manager/service/KPI_configs.json b/src/kpi_manager/service/KPI_configs.json new file mode 100644 index 000000000..ba73bc41a --- /dev/null +++ b/src/kpi_manager/service/KPI_configs.json @@ -0,0 +1,8 @@ +{ + "KPIs": + [ + "node_network_receive_packets_total", + "node_network_receive_bytes_total", + "node_network_transmit_bytes_total" + ] +} \ No newline at end of file diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py index d099f8a5e..4b2e9fc3f 100644 --- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -37,10 +37,6 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): LOGGER.info('Init KpiManagerService') self.Kpi_DBobj = Kpi_DB() - @staticmethod - def create_database_if_not_exist(engine: sqlalchemy.engine.Engine) -> None: - if not sqlalchemy_utils.database_exists(engine.url): - sqlalchemy_utils.create_database(engine.url) @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SetKpiDescriptor(self, request: KpiDescriptor, grpc_context: grpc.ServicerContext # type: ignore @@ -82,12 +78,13 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): response.slice_id.slice_uuid.uuid = row.slice_id response.endpoint_id.endpoint_uuid.uuid = row.endpoint_id response.connection_id.connection_uuid.uuid = row.connection_id + response.link_id.link_uuid.uuid = row.link_id return response except Exception as e: LOGGER.info('Unable to search kpi id. {:}'.format(e)) @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext + def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext # type: ignore ) -> Empty: # type: ignore LOGGER.info("Received gRPC message object: {:}".format(request)) try: @@ -106,8 +103,13 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): # LOGGER.info("Recevied requested Object: {:}".format(request)) # re-structre the filter. create dynamic filter filter_to_apply = dict() - filter_to_apply['device_id'] = request.device_id[0].device_uuid.uuid filter_to_apply['kpi_sample_type'] = request.kpi_sample_type[0] + filter_to_apply['device_id'] = request.device_id[0].device_uuid.uuid + filter_to_apply['endpoint_id'] = request.endpoint_id[0].endpoint_uuid.uuid + filter_to_apply['service_id'] = request.service_id[0].service_uuid.uuid + filter_to_apply['slice_id'] = request.slice_id[0].slice_uuid.uuid + filter_to_apply['connection_id'] = request.connection_id[0].connection_uuid.uuid + filter_to_apply['link_id'] = request.link_id[0].link_uuid.uuid try: rows = self.Kpi_DBobj.select_with_filter(KpiModel, **filter_to_apply) except Exception as e: @@ -116,58 +118,15 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): if len(rows) != 0: for row in rows: kpiDescriptor_obj = KpiDescriptor() - kpiDescriptor_obj.kpi_id.kpi_id.uuid = row.kpi_id - # kpiDescriptor_obj.kpi_description = row.kpi_description - + kpiDescriptor_obj.kpi_id.kpi_id.uuid = row.kpi_id + kpiDescriptor_obj.kpi_description = row.kpi_description + kpiDescriptor_obj.kpi_sample_type = row.kpi_sample_type + kpiDescriptor_obj.service_id.service_uuid.uuid = row.service_id + kpiDescriptor_obj.device_id.device_uuid.uuid = row.device_id + kpiDescriptor_obj.slice_id.slice_uuid.uuid = row.slice_id + kpiDescriptor_obj.endpoint_id.endpoint_uuid.uuid = row.endpoint_id + kpiDescriptor_obj.connection_id.connection_uuid.uuid = row.connection_id response.kpi_descriptor_list.append(kpiDescriptor_obj) return response except Exception as e: LOGGER.info('Unable to process response {:}'.format(e)) - - - # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - # def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> Empty: # type: ignore - # kpi_id = int(request.kpi_id.uuid) - # kpi = self.management_db.get_KPI(kpi_id) - # if kpi: - # self.management_db.delete_KPI(kpi_id) - # else: - # LOGGER.info('DeleteKpi error: KpiID({:s}): not found in database'.format(str(kpi_id))) - # return Empty() - - # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - # def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext) -> KpiDescriptor: # type: ignore - # kpi_id = request.kpi_id.uuid - # kpi_db = self.management_db.get_KPI(int(kpi_id)) - # kpiDescriptor = KpiDescriptor() - # if kpi_db is None: - # LOGGER.info('GetKpiDescriptor error: KpiID({:s}): not found in database'.format(str(kpi_id))) - # else: - # kpiDescriptor.kpi_description = kpi_db[1] - # kpiDescriptor.kpi_sample_type = kpi_db[2] - # kpiDescriptor.device_id.device_uuid.uuid = str(kpi_db[3]) - # kpiDescriptor.endpoint_id.endpoint_uuid.uuid = str(kpi_db[4]) - # kpiDescriptor.service_id.service_uuid.uuid = str(kpi_db[5]) - # kpiDescriptor.slice_id.slice_uuid.uuid = str(kpi_db[6]) - # kpiDescriptor.connection_id.connection_uuid.uuid = str(kpi_db[7]) - # kpiDescriptor.link_id.link_uuid.uuid = str(kpi_db[8]) - # return kpiDescriptor - - # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - # def SelectKpiDescriptor(self, request: KpiDescriptorFilter, grpc_context: grpc.ServicerContext) -> KpiDescriptorList: # type: ignore - # kpi_descriptor_list = KpiDescriptorList() - # data = self.management_db.get_KPIS() - # LOGGER.debug(f"data: {data}") - # for item in data: - # kpi_descriptor = KpiDescriptor() - # kpi_descriptor.kpi_id.kpi_id.uuid = str(item[0]) - # kpi_descriptor.kpi_description = item[1] - # kpi_descriptor.kpi_sample_type = item[2] - # kpi_descriptor.device_id.device_uuid.uuid = str(item[3]) - # kpi_descriptor.endpoint_id.endpoint_uuid.uuid = str(item[4]) - # kpi_descriptor.service_id.service_uuid.uuid = str(item[5]) - # kpi_descriptor.slice_id.slice_uuid.uuid = str(item[6]) - # kpi_descriptor.connection_id.connection_uuid.uuid = str(item[7]) - # kpi_descriptor.link_id.link_uuid.uuid = str(item[8]) - # kpi_descriptor_list.kpi_descriptor_list.append(kpi_descriptor) - # return kpi_descriptor_list \ No newline at end of file diff --git a/src/kpi_manager/service/database/Kpi_DB.py b/src/kpi_manager/service/database/Kpi_DB.py index 45c9ff7ed..df03deba4 100644 --- a/src/kpi_manager/service/database/Kpi_DB.py +++ b/src/kpi_manager/service/database/Kpi_DB.py @@ -70,7 +70,10 @@ class Kpi_DB: return True except Exception as e: session.rollback() - LOGGER.error(f"Failed to insert new row into {row.__class__.__name__} table. {str(e)}") + if "psycopg2.errors.UniqueViolation" in str(e): + LOGGER.warning(f"Unique key voilation: {row.__class__.__name__} table. {str(e)}") + else: + LOGGER.error(f"Failed to insert new row into {row.__class__.__name__} table. {str(e)}") return False finally: session.close() diff --git a/src/kpi_manager/tests/test_kpi_manager.py b/src/kpi_manager/tests/test_kpi_manager.py index f6d8460d9..977c85fb8 100755 --- a/src/kpi_manager/tests/test_kpi_manager.py +++ b/src/kpi_manager/tests/test_kpi_manager.py @@ -43,10 +43,8 @@ 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_request, create_kpi_request_b, \ - create_kpi_request_c, create_kpi_request_d, create_kpi_filter_request, \ - create_kpi_descriptor_request, create_kpi_id_request, create_kpi_filter_request_a, \ - create_kpi_descriptor_request_a +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 monitoring.service.MonitoringService import MonitoringService from kpi_manager.service.KpiManagerService import KpiManagerService # from monitoring.client.MonitoringClient import MonitoringClient @@ -215,33 +213,34 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab # ---------- 2nd Iteration Tests ----------------- def test_SetKpiDescriptor(kpi_manager_client): LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ") - _descriptors = ["node_network_receive_packets_total", - "node_network_receive_bytes_total", - "node_network_transmit_bytes_total"] + with open("kpi_manager/service/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()) -# LOGGER.info("Response gRPC message object: {:}".format(response)) -# assert isinstance(response, KpiDescriptor) - -# def test_DeleteKpiDescriptor(kpi_manager_client): -# LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ") -# response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) -# del_response = kpi_manager_client.DeleteKpiDescriptor(response) -# kpi_manager_client.GetKpiDescriptor(response) -# LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response)) -# assert isinstance(response, KpiId) - -# def test_SelectKpiDescriptor(kpi_manager_client): -# LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ") -# response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request_a()) -# LOGGER.info("Response gRPC message object: {:}".format(response)) -# assert isinstance(response, KpiDescriptorList) +def test_GetKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") + response = kpi_manager_client.GetKpiDescriptor(create_kpi_id_request()) + LOGGER.info("Response gRPC message object: {:}".format(response)) + assert isinstance(response, KpiDescriptor) + +def test_DeleteKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ") + response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + del_response = kpi_manager_client.DeleteKpiDescriptor(response) + kpi_manager_client.GetKpiDescriptor(response) + LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response)) + assert isinstance(del_response, Empty) + +def test_SelectKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ") + kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a()) + response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request_a()) + LOGGER.info("Response gRPC message object: {:}".format(response)) + assert isinstance(response, KpiDescriptorList) # ------------- INITIAL TESTs ---------------- # Test case that makes use of client fixture to test server's CreateKpi method diff --git a/src/kpi_manager/tests/test_messages.py b/src/kpi_manager/tests/test_messages.py index bc4c5b9d1..93e2d6472 100755 --- a/src/kpi_manager/tests/test_messages.py +++ b/src/kpi_manager/tests/test_messages.py @@ -24,7 +24,7 @@ def create_kpi_id_request(): _kpi_id.kpi_id.uuid = "34f73604-eca6-424f-9995-18b519ad0978" return _kpi_id -def create_kpi_descriptor_request_a(descriptor_name: str): +def create_kpi_descriptor_request_a(descriptor_name: str = "Test_name"): _create_kpi_request = kpi_manager_pb2.KpiDescriptor() _create_kpi_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) _create_kpi_request.kpi_description = descriptor_name @@ -51,89 +51,95 @@ def create_kpi_descriptor_request(): return _create_kpi_request def create_kpi_filter_request_a(): - _create_kpi_filter_request = kpi_manager_pb2.KpiDescriptorFilter() - _create_kpi_filter_request.kpi_sample_type.append(102) + _create_kpi_filter_request = kpi_manager_pb2.KpiDescriptorFilter() + _create_kpi_filter_request.kpi_sample_type.append(KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED) + + device_id_obj = DeviceId() + endpoint_id_obj = EndPointId() + service_id_obj = ServiceId() + slice_id_obj = SliceId() + connection_id_obj = ConnectionId() + link_id_obj = LinkId() + + device_id_obj.device_uuid.uuid = "DEV1" + endpoint_id_obj.endpoint_uuid.uuid = "END1" + service_id_obj.service_uuid.uuid = "SERV1" + slice_id_obj.slice_uuid.uuid = "SLC1" + connection_id_obj.connection_uuid.uuid = "CON1" + link_id_obj.link_uuid.uuid = "LNK1" - device_id_obj = DeviceId() - device_id_obj.device_uuid.uuid = "SERV3" _create_kpi_filter_request.device_id.append(device_id_obj) - - # new_device_id = _create_kpi_filter_request.device_id.add() - # new_device_id.device_uuid.uuid = 'DEV3' - # new_service_id = _create_kpi_filter_request.service_id.add() - # new_service_id.service_uuid.uuid = 'SERV1' - # new_slice_id = _create_kpi_filter_request.slice_id.add() - # new_slice_id.slice_uuid.uuid = 'SLC1' - # new_endpoint_id = _create_kpi_filter_request.endpoint_id.add() - # new_endpoint_id.endpoint_uuid.uuid = 'END1' - # new_connection_id = _create_kpi_filter_request.connection_id.add() - # new_connection_id.connection_uuid.uuid = 'CON1' + _create_kpi_filter_request.endpoint_id.append(endpoint_id_obj) + _create_kpi_filter_request.service_id.append(service_id_obj) + _create_kpi_filter_request.slice_id.append(slice_id_obj) + _create_kpi_filter_request.connection_id.append(connection_id_obj) + _create_kpi_filter_request.link_id.append(link_id_obj) return _create_kpi_filter_request # -------------------- Initial Test messages ------------------------------------- -def create_kpi_request(kpi_id_str): - _create_kpi_request = kpi_manager_pb2.KpiDescriptor() - _create_kpi_request.kpi_description = 'KPI Description Test' - _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED - _create_kpi_request.device_id.device_uuid.uuid = 'DEV' + str(kpi_id_str) - _create_kpi_request.service_id.service_uuid.uuid = 'SERV' + str(kpi_id_str) - _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC' + str(kpi_id_str) - _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END' + str(kpi_id_str) - _create_kpi_request.connection_id.connection_uuid.uuid = 'CON' + str(kpi_id_str) - return _create_kpi_request +# def create_kpi_request(kpi_id_str): +# _create_kpi_request = kpi_manager_pb2.KpiDescriptor() +# _create_kpi_request.kpi_description = 'KPI Description Test' +# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED +# _create_kpi_request.device_id.device_uuid.uuid = 'DEV' + str(kpi_id_str) +# _create_kpi_request.service_id.service_uuid.uuid = 'SERV' + str(kpi_id_str) +# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC' + str(kpi_id_str) +# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END' + str(kpi_id_str) +# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON' + str(kpi_id_str) +# return _create_kpi_request -def create_kpi_request_b(): - _create_kpi_request = kpi_manager_pb2.KpiDescriptor() - _create_kpi_request = str(uuid.uuid4()) - _create_kpi_request.kpi_description = 'KPI Description Test' - _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED - _create_kpi_request.device_id.device_uuid.uuid = 'DEV2' # pylint: disable=maybe-no-member - _create_kpi_request.service_id.service_uuid.uuid = 'SERV2' # pylint: disable=maybe-no-member - _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC2' # pylint: disable=maybe-no-member - _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END2' # pylint: disable=maybe-no-member - _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2' # pylint: disable=maybe-no-member - return _create_kpi_request +# def create_kpi_request_b(): +# _create_kpi_request = kpi_manager_pb2.KpiDescriptor() +# _create_kpi_request = str(uuid.uuid4()) +# _create_kpi_request.kpi_description = 'KPI Description Test' +# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED +# _create_kpi_request.device_id.device_uuid.uuid = 'DEV2' # pylint: disable=maybe-no-member +# _create_kpi_request.service_id.service_uuid.uuid = 'SERV2' # pylint: disable=maybe-no-member +# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC2' # pylint: disable=maybe-no-member +# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END2' # pylint: disable=maybe-no-member +# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2' # pylint: disable=maybe-no-member +# return _create_kpi_request -def create_kpi_request_c(): - _create_kpi_request = kpi_manager_pb2.KpiDescriptor() - _create_kpi_request.kpi_description = 'KPI Description Test' - _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED - _create_kpi_request.device_id.device_uuid.uuid = 'DEV3' # pylint: disable=maybe-no-member - _create_kpi_request.service_id.service_uuid.uuid = 'SERV3' # pylint: disable=maybe-no-member - _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC3' # pylint: disable=maybe-no-member - _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END3' # pylint: disable=maybe-no-member - _create_kpi_request.connection_id.connection_uuid.uuid = 'CON3' # pylint: disable=maybe-no-member - return _create_kpi_request +# def create_kpi_request_c(): +# _create_kpi_request = kpi_manager_pb2.KpiDescriptor() +# _create_kpi_request.kpi_description = 'KPI Description Test' +# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED +# _create_kpi_request.device_id.device_uuid.uuid = 'DEV3' # pylint: disable=maybe-no-member +# _create_kpi_request.service_id.service_uuid.uuid = 'SERV3' # pylint: disable=maybe-no-member +# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC3' # pylint: disable=maybe-no-member +# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END3' # pylint: disable=maybe-no-member +# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON3' # pylint: disable=maybe-no-member +# return _create_kpi_request -def create_kpi_request_d(): - _create_kpi_request = kpi_manager_pb2.KpiDescriptor() - _create_kpi_request.kpi_description = 'KPI Description Test' - _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED - _create_kpi_request.device_id.device_uuid.uuid = 'DEV4' # pylint: disable=maybe-no-member - _create_kpi_request.service_id.service_uuid.uuid = 'SERV4' # pylint: disable=maybe-no-member - _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC4' # pylint: disable=maybe-no-member - _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END4' # pylint: disable=maybe-no-member - _create_kpi_request.connection_id.connection_uuid.uuid = 'CON4' # pylint: disable=maybe-no-member - return _create_kpi_request +# def create_kpi_request_d(): +# _create_kpi_request = kpi_manager_pb2.KpiDescriptor() +# _create_kpi_request.kpi_description = 'KPI Description Test' +# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED +# _create_kpi_request.device_id.device_uuid.uuid = 'DEV4' # pylint: disable=maybe-no-member +# _create_kpi_request.service_id.service_uuid.uuid = 'SERV4' # pylint: disable=maybe-no-member +# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC4' # pylint: disable=maybe-no-member +# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END4' # pylint: disable=maybe-no-member +# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON4' # pylint: disable=maybe-no-member +# return _create_kpi_request + +# def kpi_descriptor_list(): +# _kpi_descriptor_list = kpi_manager_pb2.KpiDescriptorList() +# return _kpi_descriptor_list + +# def create_kpi_filter_request(): +# _create_kpi_filter_request = kpi_manager_pb2.KpiDescriptorFilter() +# _create_kpi_filter_request.kpi_sample_type.append(KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED) +# new_device_id = _create_kpi_filter_request.device_id.add() +# new_device_id.device_uuid.uuid = 'DEV1' +# new_service_id = _create_kpi_filter_request.service_id.add() +# new_service_id.service_uuid.uuid = 'SERV1' +# new_slice_id = _create_kpi_filter_request.slice_id.add() +# new_slice_id.slice_uuid.uuid = 'SLC1' +# new_endpoint_id = _create_kpi_filter_request.endpoint_id.add() +# new_endpoint_id.endpoint_uuid.uuid = 'END1' +# new_connection_id = _create_kpi_filter_request.connection_id.add() +# new_connection_id.connection_uuid.uuid = 'CON1' -def kpi_descriptor_list(): - _kpi_descriptor_list = kpi_manager_pb2.KpiDescriptorList() - return _kpi_descriptor_list - -def create_kpi_filter_request(): - _create_kpi_filter_request = kpi_manager_pb2.KpiDescriptorFilter() - _create_kpi_filter_request.kpi_sample_type.append(KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED) - new_device_id = _create_kpi_filter_request.device_id.add() - new_device_id.device_uuid.uuid = 'DEV1' - new_service_id = _create_kpi_filter_request.service_id.add() - new_service_id.service_uuid.uuid = 'SERV1' - new_slice_id = _create_kpi_filter_request.slice_id.add() - new_slice_id.slice_uuid.uuid = 'SLC1' - new_endpoint_id = _create_kpi_filter_request.endpoint_id.add() - new_endpoint_id.endpoint_uuid.uuid = 'END1' - new_connection_id = _create_kpi_filter_request.connection_id.add() - new_connection_id.connection_uuid.uuid = 'CON1' - - return _create_kpi_filter_request \ No newline at end of file +# return _create_kpi_filter_request \ No newline at end of file -- GitLab From 6b2078ef920acdf016b47e316cfb87c835aecec2 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 10 Jun 2024 17:38:51 +0000 Subject: [PATCH 257/602] readme in progress --- src/kpi_manager/README.md | 22 ++++++++++++++++++ src/kpi_manager/requirements.in | 41 ++++++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/kpi_manager/README.md diff --git a/src/kpi_manager/README.md b/src/kpi_manager/README.md new file mode 100644 index 000000000..131bf1efd --- /dev/null +++ b/src/kpi_manager/README.md @@ -0,0 +1,22 @@ +# How to locally run and test KPI Manager service + +### Pre-requisets +The following requirements should be fulfilled before the execuation of this module. + +1. verify that kpi_manager.proto file exists and grpc 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. +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. + +### 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 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. + +### Flow of execution +1. Call "" and "" function, this will create the required database and table, if they doesn't exist. +` +GRPC_HEALTH_PROBE_VERSION=v0.2.0 +` diff --git a/src/kpi_manager/requirements.in b/src/kpi_manager/requirements.in index a6183b57e..d96e4b1b8 100644 --- a/src/kpi_manager/requirements.in +++ b/src/kpi_manager/requirements.in @@ -14,11 +14,50 @@ anytree==2.8.0 APScheduler==3.10.1 +attrs==23.2.0 +certifi==2024.2.2 +charset-normalizer==2.0.12 +colorama==0.4.6 +confluent-kafka==2.3.0 +coverage==6.3 +future-fstrings==1.2.0 +greenlet==3.0.3 +grpcio==1.47.5 +grpcio-health-checking==1.47.5 +grpcio-tools==1.47.5 +grpclib==0.4.4 +h2==4.1.0 +hpack==4.0.0 +hyperframe==6.0.1 +idna==3.7 influx-line-protocol==0.1.4 +iniconfig==2.0.0 +kafka-python==2.0.2 +multidict==6.0.5 +networkx==3.3 +packaging==24.0 +pluggy==1.5.0 +prettytable==3.5.0 +prometheus-client==0.13.0 +protobuf==3.20.3 psycopg2-binary==2.9.3 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==6.2.5 +pytest-benchmark==3.4.1 +pytest-depends==1.0.1 python-dateutil==2.8.2 python-json-logger==2.0.2 +pytz==2024.1 questdb==1.0.1 requests==2.27.1 +six==1.16.0 +SQLAlchemy==1.4.52 +sqlalchemy-cockroachdb==1.4.4 +SQLAlchemy-Utils==0.38.3 +toml==0.10.2 +typing_extensions==4.12.0 +tzlocal==5.2 +urllib3==1.26.18 +wcwidth==0.2.13 xmltodict==0.12.0 -# grpc_health_probe==0.2.0 #getting error on this library \ No newline at end of file -- GitLab From de38c5d0d9c8b9969dac52ca17ecceeaf6fdffe8 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 11 Jun 2024 10:16:25 +0000 Subject: [PATCH 258/602] KpiManager Service README.md file completed --- src/kpi_manager/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/kpi_manager/README.md b/src/kpi_manager/README.md index 131bf1efd..fdfdf7f54 100644 --- a/src/kpi_manager/README.md +++ b/src/kpi_manager/README.md @@ -12,11 +12,11 @@ The following requirements should be fulfilled before the execuation of this mod ### 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 messages format used during the testing. -### Test File +### 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. ### Flow of execution -1. Call "" and "" function, this will create the required database and table, if they doesn't exist. -` -GRPC_HEALTH_PROBE_VERSION=v0.2.0 -` +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. +2. Call the gRPC method `SetKpiDescriptor(KpiDescriptor)->KpiId` to add the KpiDescriptor in `Kpi` DB. `KpiDescriptor` and `KpiId` are both pre-defined gRPC message types. +3. Call `GetKpiDescriptor(KpiId)->KpiDescriptor` to read the `KpiDescriptor` from DB and `DeleteKpiDescriptor(KpiId)` to delete the `KpiDescriptor` from DB. +4. Call `SelectKpiDescriptor(KpiDescriptorFilter)->KpiDescriptorList` to get all `KpiDescriptor` objects that matches the filter criteria. `KpiDescriptorFilter` and `KpiDescriptorList` are pre-defined gRPC message types. \ No newline at end of file -- GitLab From 4aeda2988da1f672a102405232d4daac066b1953 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 11 Jun 2024 10:21:12 +0000 Subject: [PATCH 259/602] Minor change in KpiManager service README.md file --- src/kpi_manager/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kpi_manager/README.md b/src/kpi_manager/README.md index fdfdf7f54..a97950c4b 100644 --- a/src/kpi_manager/README.md +++ b/src/kpi_manager/README.md @@ -3,7 +3,7 @@ ### Pre-requisets The following requirements should be fulfilled before the execuation of this module. -1. verify that kpi_manager.proto file exists and grpc file are generated sucessfully. +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. 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. -- GitLab From d2ff0a3aa28e1ab346a7a5dbfaf1ae8b673fed3f Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 11 Jun 2024 11:02:06 +0000 Subject: [PATCH 260/602] Analytic_frontend.proto added --- proto/analytics_frontend.proto | 49 ++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 proto/analytics_frontend.proto diff --git a/proto/analytics_frontend.proto b/proto/analytics_frontend.proto new file mode 100644 index 000000000..6af761ae5 --- /dev/null +++ b/proto/analytics_frontend.proto @@ -0,0 +1,49 @@ +syntax = "proto3"; +package device; + +import "context.proto"; +import "kpi_manager.proto"; +import "kpi_sample_types.proto"; + +service AnalyticsFrontendService { + rpc StartAnalyzer (Analyzer ) returns (AnalyzerId ) {} + rpc StopAnalyzer (AnalyzerId ) returns (context.Empty) {} + rpc SelectAnalyzers(AnalyzerFilter) returns (AnalyzerList ) {} +} + +message AnalyzerId { + context.Uuid analyzer_id = 1; +} + +enum AnalyzerMode { + ANALYZERMODE_BATCH = 0; + ANALYZERMODE_STRAMING = 1; +} + +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 +} + +message AnalyzerFilter { + // Analyzer 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 Analyzers + repeated AnalyzerId analyzer_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; +} + +message AnalyzerList { + repeated Analyzer analyzer_list = 1; +} -- GitLab From 857fa4ab233b6660d9caab0ec1e79c216b3ef6ca Mon Sep 17 00:00:00 2001 From: armingol Date: Tue, 11 Jun 2024 16:47:18 +0200 Subject: [PATCH 261/602] code clean up --- quick_deploy.sh | 438 ------------------ src/tests/ecoc22/tests/Objects.py | 2 +- .../descriptors/real/dc-2-dc-service.json | 2 +- 3 files changed, 2 insertions(+), 440 deletions(-) delete mode 100755 quick_deploy.sh diff --git a/quick_deploy.sh b/quick_deploy.sh deleted file mode 100755 index 79846559b..000000000 --- a/quick_deploy.sh +++ /dev/null @@ -1,438 +0,0 @@ -#!/bin/bash -# 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. - - -######################################################################################################################## -# Read deployment settings -######################################################################################################################## - - -# ----- TeraFlowSDN ------------------------------------------------------------ - -# If not already set, set the URL of the Docker registry where the images will be uploaded to. -# By default, assume internal MicroK8s registry is used. -export TFS_REGISTRY_IMAGES=${TFS_REGISTRY_IMAGES:-"http://localhost:32000/tfs/"} - -# If not already set, set the list of components, separated by spaces, you want to build images for, and deploy. -# By default, only basic components are deployed -export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device pathcomp service slice nbi webui load_generator"} - -# If not already set, set the tag you want to use for your images. -export TFS_IMAGE_TAG=${TFS_IMAGE_TAG:-"dev"} - -# If not already set, set the name of the Kubernetes namespace to deploy TFS to. -export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"} - -# If not already set, set additional manifest files to be applied after the deployment -export TFS_EXTRA_MANIFESTS=${TFS_EXTRA_MANIFESTS:-""} - -# If not already set, set the new Grafana admin password -export TFS_GRAFANA_PASSWORD=${TFS_GRAFANA_PASSWORD:-"admin123+"} - -# If not already set, disable skip-build flag to rebuild the Docker images. -# If TFS_SKIP_BUILD is "YES", the containers are not rebuilt-retagged-repushed and existing ones are used. -export TFS_SKIP_BUILD=${TFS_SKIP_BUILD:-"YES"} - -# If TFS_SKIP_BUILD is "YES", select the containers to be build -# Any other container will use previous docker images -export TFS_QUICK_COMPONENTS="slice" - -# ----- CockroachDB ------------------------------------------------------------ - -# If not already set, set the namespace where CockroackDB will be deployed. -export CRDB_NAMESPACE=${CRDB_NAMESPACE:-"crdb"} - -# If not already set, set the database username to be used by Context. -export CRDB_USERNAME=${CRDB_USERNAME:-"tfs"} - -# If not already set, set the database user's password to be used by Context. -export CRDB_PASSWORD=${CRDB_PASSWORD:-"tfs123"} - -# If not already set, set the database name to be used by Context. -export CRDB_DATABASE=${CRDB_DATABASE:-"tfs"} - - -# ----- NATS ------------------------------------------------------------------- - -# If not already set, set the namespace where NATS will be deployed. -export NATS_NAMESPACE=${NATS_NAMESPACE:-"nats"} - - -# ----- QuestDB ---------------------------------------------------------------- - -# If not already set, set the namespace where QuestDB will be deployed. -export QDB_NAMESPACE=${QDB_NAMESPACE:-"qdb"} - -# If not already set, set the database username to be used for QuestDB. -export QDB_USERNAME=${QDB_USERNAME:-"admin"} - -# If not already set, set the database user's password to be used for QuestDB. -export QDB_PASSWORD=${QDB_PASSWORD:-"quest"} - -# If not already set, set the table name to be used by Monitoring for KPIs. -export QDB_TABLE_MONITORING_KPIS=${QDB_TABLE_MONITORING_KPIS:-"tfs_monitoring_kpis"} - -# If not already set, set the table name to be used by Slice for plotting groups. -export QDB_TABLE_SLICE_GROUPS=${QDB_TABLE_SLICE_GROUPS:-"tfs_slice_groups"} - - -######################################################################################################################## -# Automated steps start here -######################################################################################################################## - -# Constants -GITLAB_REPO_URL="labs.etsi.org:5050/tfs/controller" -TMP_FOLDER="./tmp" - -# Create a tmp folder for files modified during the deployment -TMP_MANIFESTS_FOLDER="$TMP_FOLDER/manifests" -mkdir -p $TMP_MANIFESTS_FOLDER -TMP_LOGS_FOLDER="$TMP_FOLDER/logs" -mkdir -p $TMP_LOGS_FOLDER - -echo "Deleting and Creating a new namespace..." -kubectl delete namespace $TFS_K8S_NAMESPACE --ignore-not-found -kubectl create namespace $TFS_K8S_NAMESPACE -printf "\n" - -echo "Create secret with CockroachDB data" -CRDB_SQL_PORT=$(kubectl --namespace ${CRDB_NAMESPACE} get service cockroachdb-public -o 'jsonpath={.spec.ports[?(@.name=="sql")].port}') -kubectl create secret generic crdb-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ - --from-literal=CRDB_NAMESPACE=${CRDB_NAMESPACE} \ - --from-literal=CRDB_SQL_PORT=${CRDB_SQL_PORT} \ - --from-literal=CRDB_DATABASE=${CRDB_DATABASE} \ - --from-literal=CRDB_USERNAME=${CRDB_USERNAME} \ - --from-literal=CRDB_PASSWORD=${CRDB_PASSWORD} \ - --from-literal=CRDB_SSLMODE=require -printf "\n" - -echo "Create secret with NATS data" -NATS_CLIENT_PORT=$(kubectl --namespace ${NATS_NAMESPACE} get service nats -o 'jsonpath={.spec.ports[?(@.name=="client")].port}') -kubectl create secret generic nats-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ - --from-literal=NATS_NAMESPACE=${NATS_NAMESPACE} \ - --from-literal=NATS_CLIENT_PORT=${NATS_CLIENT_PORT} -printf "\n" - -echo "Create secret with QuestDB data" -QDB_HTTP_PORT=$(kubectl --namespace ${QDB_NAMESPACE} get service questdb-public -o 'jsonpath={.spec.ports[?(@.name=="http")].port}') -QDB_ILP_PORT=$(kubectl --namespace ${QDB_NAMESPACE} get service questdb-public -o 'jsonpath={.spec.ports[?(@.name=="ilp")].port}') -QDB_SQL_PORT=$(kubectl --namespace ${QDB_NAMESPACE} get service questdb-public -o 'jsonpath={.spec.ports[?(@.name=="sql")].port}') -METRICSDB_HOSTNAME="questdb-public.${QDB_NAMESPACE}.svc.cluster.local" -kubectl create secret generic qdb-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ - --from-literal=QDB_NAMESPACE=${QDB_NAMESPACE} \ - --from-literal=METRICSDB_HOSTNAME=${METRICSDB_HOSTNAME} \ - --from-literal=METRICSDB_REST_PORT=${QDB_HTTP_PORT} \ - --from-literal=METRICSDB_ILP_PORT=${QDB_ILP_PORT} \ - --from-literal=METRICSDB_SQL_PORT=${QDB_SQL_PORT} \ - --from-literal=METRICSDB_TABLE_MONITORING_KPIS=${QDB_TABLE_MONITORING_KPIS} \ - --from-literal=METRICSDB_TABLE_SLICE_GROUPS=${QDB_TABLE_SLICE_GROUPS} \ - --from-literal=METRICSDB_USERNAME=${QDB_USERNAME} \ - --from-literal=METRICSDB_PASSWORD=${QDB_PASSWORD} -printf "\n" - -echo "Deploying components and collecting environment variables..." -ENV_VARS_SCRIPT=tfs_runtime_env_vars.sh -echo "# Environment variables for TeraFlowSDN deployment" > $ENV_VARS_SCRIPT -PYTHONPATH=$(pwd)/src -echo "export PYTHONPATH=${PYTHONPATH}" >> $ENV_VARS_SCRIPT - -for COMPONENT in $TFS_COMPONENTS; do - echo "Processing '$COMPONENT' component..." - - if [ "$TFS_SKIP_BUILD" != "YES" ]; then - echo " Building Docker image..." - BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}.log" - - if [ "$COMPONENT" == "automation" ] || [ "$COMPONENT" == "policy" ]; then - docker build -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile ./src/"$COMPONENT"/ > "$BUILD_LOG" - elif [ "$COMPONENT" == "pathcomp" ]; then - BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-frontend.log" - docker build -t "$COMPONENT-frontend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/frontend/Dockerfile . > "$BUILD_LOG" - - BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-backend.log" - docker build -t "$COMPONENT-backend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/backend/Dockerfile . > "$BUILD_LOG" - # next command is redundant, but helpful to keep cache updated between rebuilds - IMAGE_NAME="$COMPONENT-backend:$TFS_IMAGE_TAG-builder" - docker build -t "$IMAGE_NAME" --target builder -f ./src/"$COMPONENT"/backend/Dockerfile . >> "$BUILD_LOG" - elif [ "$COMPONENT" == "dlt" ]; then - BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-connector.log" - docker build -t "$COMPONENT-connector:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/connector/Dockerfile . > "$BUILD_LOG" - - BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-gateway.log" - docker build -t "$COMPONENT-gateway:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/gateway/Dockerfile . > "$BUILD_LOG" - else - docker build -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile . > "$BUILD_LOG" - fi - - echo " Pushing Docker image to '$TFS_REGISTRY_IMAGES'..." - - if [ "$COMPONENT" == "pathcomp" ]; then - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-frontend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - - TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-frontend.log" - docker tag "$COMPONENT-frontend:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" - - PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-frontend.log" - docker push "$IMAGE_URL" > "$PUSH_LOG" - - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-backend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - - TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-backend.log" - docker tag "$COMPONENT-backend:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" - - PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-backend.log" - docker push "$IMAGE_URL" > "$PUSH_LOG" - elif [ "$COMPONENT" == "dlt" ]; then - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-connector:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - - TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-connector.log" - docker tag "$COMPONENT-connector:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" - - PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-connector.log" - docker push "$IMAGE_URL" > "$PUSH_LOG" - - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-gateway:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - - TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-gateway.log" - docker tag "$COMPONENT-gateway:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" - - PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-gateway.log" - docker push "$IMAGE_URL" > "$PUSH_LOG" - else - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - - TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}.log" - docker tag "$COMPONENT:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" - - PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}.log" - docker push "$IMAGE_URL" > "$PUSH_LOG" - fi - else - for QUICK_COMPONENT in $TFS_QUICK_COMPONENTS; do - if [ "$COMPONENT" == "$QUICK_COMPONENT" ]; then - - echo " Building Docker image..." - BUILD_LOG="$TMP_LOGS_FOLDER/build_${QUICK_COMPONENT}.log" - - docker build -t "$QUICK_COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$QUICK_COMPONENT"/Dockerfile . > "$BUILD_LOG" - echo " Pushing Docker image to '$TFS_REGISTRY_IMAGES'..." - - - - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$QUICK_COMPONENT:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - - TAG_LOG="$TMP_LOGS_FOLDER/tag_${QUICK_COMPONENT}.log" - docker tag "$QUICK_COMPONENT:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" - - PUSH_LOG="$TMP_LOGS_FOLDER/push_${QUICK_COMPONENT}.log" - docker push "$IMAGE_URL" > "$PUSH_LOG" - fi - done - fi - - echo " Adapting '$COMPONENT' manifest file..." - MANIFEST="$TMP_MANIFESTS_FOLDER/${COMPONENT}service.yaml" - cp ./manifests/"${COMPONENT}"service.yaml "$MANIFEST" - - if [ "$COMPONENT" == "pathcomp" ]; then - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-frontend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}-frontend:" "$MANIFEST" | cut -d ":" -f4) - sed -E -i "s#image: $GITLAB_REPO_URL/$COMPONENT-frontend:${VERSION}#image: $IMAGE_URL#g" "$MANIFEST" - - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-backend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}-backend:" "$MANIFEST" | cut -d ":" -f4) - sed -E -i "s#image: $GITLAB_REPO_URL/$COMPONENT-backend:${VERSION}#image: $IMAGE_URL#g" "$MANIFEST" - elif [ "$COMPONENT" == "dlt" ]; then - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-connector:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}-connector:" "$MANIFEST" | cut -d ":" -f4) - sed -E -i "s#image: $GITLAB_REPO_URL/$COMPONENT-connector:${VERSION}#image: $IMAGE_URL#g" "$MANIFEST" - - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-gateway:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}-gateway:" "$MANIFEST" | cut -d ":" -f4) - sed -E -i "s#image: $GITLAB_REPO_URL/$COMPONENT-gateway:${VERSION}#image: $IMAGE_URL#g" "$MANIFEST" - else - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}:" "$MANIFEST" | cut -d ":" -f4) - sed -E -i "s#image: $GITLAB_REPO_URL/$COMPONENT:${VERSION}#image: $IMAGE_URL#g" "$MANIFEST" - fi - - sed -E -i "s#imagePullPolicy: .*#imagePullPolicy: Always#g" "$MANIFEST" - - # TODO: harmonize names of the monitoring component - - echo " Deploying '$COMPONENT' component to Kubernetes..." - DEPLOY_LOG="$TMP_LOGS_FOLDER/deploy_${COMPONENT}.log" - kubectl --namespace $TFS_K8S_NAMESPACE apply -f "$MANIFEST" > "$DEPLOY_LOG" - COMPONENT_OBJNAME=$(echo "${COMPONENT}" | sed "s/\_/-/") - #kubectl --namespace $TFS_K8S_NAMESPACE scale deployment --replicas=0 ${COMPONENT_OBJNAME}service >> "$DEPLOY_LOG" - #kubectl --namespace $TFS_K8S_NAMESPACE scale deployment --replicas=1 ${COMPONENT_OBJNAME}service >> "$DEPLOY_LOG" - - echo " Collecting env-vars for '$COMPONENT' component..." - - SERVICE_DATA=$(kubectl get service ${COMPONENT_OBJNAME}service --namespace $TFS_K8S_NAMESPACE -o json) - if [ -z "${SERVICE_DATA}" ]; then continue; fi - - # Env vars for service's host address - SERVICE_HOST=$(echo ${SERVICE_DATA} | jq -r '.spec.clusterIP') - if [ -z "${SERVICE_HOST}" ]; then continue; fi - ENVVAR_HOST=$(echo "${COMPONENT}service_SERVICE_HOST" | tr '[:lower:]' '[:upper:]') - echo "export ${ENVVAR_HOST}=${SERVICE_HOST}" >> $ENV_VARS_SCRIPT - - # Env vars for service's 'grpc' port (if any) - SERVICE_PORT_GRPC=$(echo ${SERVICE_DATA} | jq -r '.spec.ports[] | select(.name=="grpc") | .port') - if [ -n "${SERVICE_PORT_GRPC}" ]; then - ENVVAR_PORT_GRPC=$(echo "${COMPONENT}service_SERVICE_PORT_GRPC" | tr '[:lower:]' '[:upper:]') - echo "export ${ENVVAR_PORT_GRPC}=${SERVICE_PORT_GRPC}" >> $ENV_VARS_SCRIPT - fi - - # Env vars for service's 'http' port (if any) - SERVICE_PORT_HTTP=$(echo ${SERVICE_DATA} | jq -r '.spec.ports[] | select(.name=="http") | .port') - if [ -n "${SERVICE_PORT_HTTP}" ]; then - ENVVAR_PORT_HTTP=$(echo "${COMPONENT}service_SERVICE_PORT_HTTP" | tr '[:lower:]' '[:upper:]') - echo "export ${ENVVAR_PORT_HTTP}=${SERVICE_PORT_HTTP}" >> $ENV_VARS_SCRIPT - fi - - printf "\n" -done - -echo "Deploying extra manifests..." -for EXTRA_MANIFEST in $TFS_EXTRA_MANIFESTS; do - echo "Processing manifest '$EXTRA_MANIFEST'..." - if [[ "$EXTRA_MANIFEST" == *"servicemonitor"* ]]; then - kubectl apply -f $EXTRA_MANIFEST - else - kubectl --namespace $TFS_K8S_NAMESPACE apply -f $EXTRA_MANIFEST - fi - printf "\n" -done -printf "\n" - -for COMPONENT in $TFS_COMPONENTS; do - echo "Waiting for '$COMPONENT' component..." - COMPONENT_OBJNAME=$(echo "${COMPONENT}" | sed "s/\_/-/") - kubectl wait --namespace $TFS_K8S_NAMESPACE \ - --for='condition=available' --timeout=300s deployment/${COMPONENT_OBJNAME}service - printf "\n" -done - -if [[ "$TFS_COMPONENTS" == *"webui"* ]] && [[ "$TFS_COMPONENTS" == *"monitoring"* ]]; then - echo "Configuring WebUI DataStores and Dashboards..." - sleep 5 - - # Exposed through the ingress controller "tfs-ingress" - GRAFANA_URL="127.0.0.1:80/grafana" - - # Default Grafana credentials - GRAFANA_USERNAME="admin" - GRAFANA_PASSWORD="admin" - - # Configure Grafana Admin Password - # Ref: https://grafana.com/docs/grafana/latest/http_api/user/#change-password - GRAFANA_URL_DEFAULT="http://${GRAFANA_USERNAME}:${GRAFANA_PASSWORD}@${GRAFANA_URL}" - - echo ">> Updating Grafana 'admin' password..." - curl -X PUT -H "Content-Type: application/json" -d '{ - "oldPassword": "'${GRAFANA_PASSWORD}'", - "newPassword": "'${TFS_GRAFANA_PASSWORD}'", - "confirmNew" : "'${TFS_GRAFANA_PASSWORD}'" - }' ${GRAFANA_URL_DEFAULT}/api/user/password - echo - echo - - # Updated Grafana API URL - GRAFANA_URL_UPDATED="http://${GRAFANA_USERNAME}:${TFS_GRAFANA_PASSWORD}@${GRAFANA_URL}" - echo "export GRAFANA_URL_UPDATED=${GRAFANA_URL_UPDATED}" >> $ENV_VARS_SCRIPT - - echo ">> Installing Scatter Plot plugin..." - curl -X POST -H "Content-Type: application/json" -H "Content-Length: 0" \ - ${GRAFANA_URL_UPDATED}/api/plugins/michaeldmoore-scatter-panel/install - echo - - # Ref: https://grafana.com/docs/grafana/latest/http_api/data_source/ - QDB_HOST_PORT="${METRICSDB_HOSTNAME}:${QDB_SQL_PORT}" - echo ">> Creating datasources..." - curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d '{ - "access" : "proxy", - "type" : "postgres", - "name" : "questdb-mon-kpi", - "url" : "'${QDB_HOST_PORT}'", - "database" : "'${QDB_TABLE_MONITORING_KPIS}'", - "user" : "'${QDB_USERNAME}'", - "basicAuth": false, - "isDefault": true, - "jsonData" : { - "sslmode" : "disable", - "postgresVersion" : 1100, - "maxOpenConns" : 0, - "maxIdleConns" : 2, - "connMaxLifetime" : 14400, - "tlsAuth" : false, - "tlsAuthWithCACert" : false, - "timescaledb" : false, - "tlsConfigurationMethod": "file-path", - "tlsSkipVerify" : true - }, - "secureJsonData": {"password": "'${QDB_PASSWORD}'"} - }' ${GRAFANA_URL_UPDATED}/api/datasources - echo - - curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d '{ - "access" : "proxy", - "type" : "postgres", - "name" : "questdb-slc-grp", - "url" : "'${QDB_HOST_PORT}'", - "database" : "'${QDB_TABLE_SLICE_GROUPS}'", - "user" : "'${QDB_USERNAME}'", - "basicAuth": false, - "isDefault": false, - "jsonData" : { - "sslmode" : "disable", - "postgresVersion" : 1100, - "maxOpenConns" : 0, - "maxIdleConns" : 2, - "connMaxLifetime" : 14400, - "tlsAuth" : false, - "tlsAuthWithCACert" : false, - "timescaledb" : false, - "tlsConfigurationMethod": "file-path", - "tlsSkipVerify" : true - }, - "secureJsonData": {"password": "'${QDB_PASSWORD}'"} - }' ${GRAFANA_URL_UPDATED}/api/datasources - printf "\n\n" - - echo ">> Creating dashboards..." - # Ref: https://grafana.com/docs/grafana/latest/http_api/dashboard/ - curl -X POST -H "Content-Type: application/json" -d '@src/webui/grafana_db_mon_kpis_psql.json' \ - ${GRAFANA_URL_UPDATED}/api/dashboards/db - echo - - curl -X POST -H "Content-Type: application/json" -d '@src/webui/grafana_db_slc_grps_psql.json' \ - ${GRAFANA_URL_UPDATED}/api/dashboards/db - printf "\n\n" - - echo ">> Staring dashboards..." - DASHBOARD_URL="${GRAFANA_URL_UPDATED}/api/dashboards/uid/tfs-l3-monit" - DASHBOARD_ID=$(curl -s "${DASHBOARD_URL}" | jq '.dashboard.id') - curl -X POST ${GRAFANA_URL_UPDATED}/api/user/stars/dashboard/${DASHBOARD_ID} - echo - - DASHBOARD_URL="${GRAFANA_URL_UPDATED}/api/dashboards/uid/tfs-slice-grps" - DASHBOARD_ID=$(curl -s "${DASHBOARD_URL}" | jq '.dashboard.id') - curl -X POST ${GRAFANA_URL_UPDATED}/api/user/stars/dashboard/${DASHBOARD_ID} - echo - - printf "\n\n" -fi diff --git a/src/tests/ecoc22/tests/Objects.py b/src/tests/ecoc22/tests/Objects.py index 9daac3265..3a96e6625 100644 --- a/src/tests/ecoc22/tests/Objects.py +++ b/src/tests/ecoc22/tests/Objects.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from common.tools.object_factory.t json_device_id +from common.tools.object_factory.Device import json_device_id from common.tools.object_factory.EndPoint import json_endpoint_id from tests.tools.mock_osm.Tools import connection_point, wim_mapping diff --git a/src/tests/ofc23/descriptors/real/dc-2-dc-service.json b/src/tests/ofc23/descriptors/real/dc-2-dc-service.json index beabd44e5..3a83afa6d 100644 --- a/src/tests/ofc23/descriptors/real/dc-2-dc-service.json +++ b/src/tests/ofc23/descriptors/real/dc-2-dc-service.json @@ -20,7 +20,7 @@ "mtu": 1512, "vlan_id": 111 }}}, {"action": 1, "custom": {"resource_key": "/device[R149]/endpoint[eth-1/0/22]/settings", "resource_value": { - "route_distinguisher": "65000:123", "router_id": "", + "route_distinguisher": "65000:123", "router_id": "5.5.5.5", "address_ip": "172.16.4.1", "address_prefix": 24, "sub_interface_index": 0, "vlan_id": 111 }}}, {"action": 1, "custom": {"resource_key": "/device[R155]/endpoint[eth-1/0/22]/settings", "resource_value": { -- GitLab From 2519f1dcaa4a9d5967f0847fe2e491d499189816 Mon Sep 17 00:00:00 2001 From: armingol Date: Tue, 11 Jun 2024 16:48:36 +0200 Subject: [PATCH 262/602] code clean up --- test.py | 291 -------------------------------------------------------- 1 file changed, 291 deletions(-) delete mode 100644 test.py diff --git a/test.py b/test.py deleted file mode 100644 index 49dff75f9..000000000 --- a/test.py +++ /dev/null @@ -1,291 +0,0 @@ - -import concurrent.futures, json, logging, operator -import sys -from typing import Any, Dict, List, Optional, Tuple, Union - -TypeResults = List[Tuple[str, str, int, List[str]]] # entity_name, action, num_ok, list[error] - -class DescriptorLoader: - def __init__( - self, descriptors : Optional[Union[str, Dict]] = None, descriptors_file : Optional[str] = None, - num_workers : int = 1, - ) -> None: - print('holaa') - descriptors = { - "ietf-network-slice-service:network-slice-services": { - "slo-sle-templates": { - "slo-sle-template": [ - { - "id": "high-BW-template", - "description": "take the highest BW forwarding path" - }, - { - "id": "low-latency-template", - "description": "lowest possible latency forwarding behavior" - } - ] - }, - "slice-service": [ - { - "id": "slice_d1_d2", - "description": "example slice p2p between two devices", - "slo-sle-template": "low-latency-template", - "status": {}, - "sdps": { - "sdp": [ - { - "id": "1", - "node-id": "4.4.4.4", - "service-match-criteria": { - "match-criterion": [ - { - "index": 1, - "match-type": "ietf-nss:service-any-match", - "target-connection-group-id": "matrix1" - } - ] - }, - "attachment-circuits": { - "attachment-circuit": [ - { - "id": "ac1", - "description": "AC1 connected to device 1", - "ac-node-id": "4.4.4.4", - "ac-tp-id": "to_HL3-1-2", - "ac-tags": { - "ac-tags": [ - { - "tag-type": "ietf-nss:vlan-id", - "value": [ - "100" - ] - } - ] - }, - "status": {} - } - ] - }, - "status": {} - }, - { - "id": "2", - "node-id": "5.5.5.5", - "service-match-criteria": { - "match-criterion": [ - { - "index": 1, - "match-type": "ietf-nss:service-any-match", - "target-connection-group-id": "matrix1" - } - ] - }, - "attachment-circuits": { - "attachment-circuit": [ - { - "id": "ac2", - "description": "AC2 connected to device 2", - "ac-node-id": "5.5.5.5", - "ac-tp-id": "eth-1/0/22.111", - "ac-tags": { - "ac-tags": [ - { - "tag-type": "ietf-nss:vlan-id", - "value": [ - "111" - ] - } - ] - }, - "status": {} - } - ] - }, - "status": {} - } - ] - }, - "connection-groups": { - "connection-group": [ - { - "id": "matrix1", - "connectivity-type": "ietf-nss:point-to-point", - "service-slo-sle-policy": { - "slo-policy": { - "metric-bound": [ - { - "metric-type": "ietf-nss:one-way-delay-maximum", - "metric-unit": "milliseconds", - "bound": "10" - } - ] - } - }, - "connectivity-construct": [ - { - "id": 1, - "p2p-sender-sdp": "1", - "p2p-receiver-sdp": "2", - "status": {} - }, - { - "id": 2, - "p2p-sender-sdp": "2", - "p2p-receiver-sdp": "1", - "status": {} - } - ] - } - ] - } - } - ] - } - } - - self.__descriptors = json.loads(descriptors) if isinstance(descriptors, str) else descriptors - - self.__slices = self.__descriptors.get('slices' , []) - #data = self.__descriptors.get('data' , {}) #Coge de la file el campo slices - #ns_slice_service = data.get('ietf-network-slice-service:network-slice-services', {}) - #self.__slices= ns_slice_service.get('slice-service', []) #nuevas slices - self.__slices = self.__descriptors.get('ietf-network-slice-service:network-slice-services', {}) - #hasta aqui bien - - print(type(self.__slices)) - print(type(self.__slices["slice-service"])) - - - json_out = {"slices": [ - { - "slice_id": { - "context_id": {"context_uuid": {"uuid": "admin"}}, - "slice_uuid": {} - }, - "name": {}, - "slice_config": {"config_rules": [ - {"action": 1, "custom": {"resource_key": "/settings", "resource_value": { - "address_families": ["IPV4"], "bgp_as": 65000, "bgp_route_target": "65000:333", "mtu": 1512 - }}} - - ]}, - "slice_constraints": [ - {"sla_capacity": {"capacity_gbps": 20.0}}, - {"sla_availability": {"availability": 20.0, "num_disjoint_paths": 1, "all_active": True}}, - {"sla_isolation": {"isolation_level": [0]}} - ], - "slice_endpoint_ids": [ - - ], - "slice_status": {"slice_status": 1} - } - ]} - - for slice_service in self.__slices["slice-service"]: - for slice in json_out["slices"]: - slice["slice_id"]["slice_uuid"] = { "uuid": slice_service["id"]} - slice["name"] = slice_service["description"] - sdp = slice_service["sdps"]["sdp"] - print(sdp) - for elemento in sdp: - slice["slice_config"]["config_rules"].append( {"action": 1, "custom": {"resource_key": "/device[R1]/endpoint[1/2]/settings", "resource_value": { - "router_id": elemento.get("node-id",[]), "sub_interface_index": 0, "vlan_id": 111 - }}}) - slice["slice_endpoint_ids"].append({ - "device_id": {"device_uuid": {"uuid": elemento["id"]}}, - "endpoint_uuid": {"uuid": "1/2"}, - "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, - "topology_uuid": {"uuid": "admin"}} - }) - attcircuits = elemento["attachment-circuits"]["attachment-circuit"] - for attcircuit in attcircuits: - slice["slice_constraints"].append({"endpoint_location": { - "endpoint_id": {"device_id": {"device_uuid": {"uuid": attcircuit["id"]}}, "endpoint_uuid": {"uuid": attcircuit["ac-tp-id"]}}, - "location": {"region": "4"} - }}) - - # Convertir a JSON de salida - #json_output = json.dumps(json_out, indent=2) - self.__slices = json_out.get('slices' , []) - print(self.__slices) - self.__results : TypeResults = list() - - - @property - def slices(self) -> Dict[str, List[Dict]]: - _slices = {} - for slice_ in self.__slices: - context_uuid = "admin" - _slices.setdefault(context_uuid, []).append(slice_) #no tenemos context_uuid en este formato, lo meto a mano? - self.__slices = [format_slice_custom_config_rules (slice_ ) for slice_ in self.__slices ] - return _slices - - @property - def num_slices(self) -> Dict[str, int]: - _num_slices = {} - for slice_ in self.__slices: - context_uuid = slice_['slice_id']['context_id']['context_uuid']['uuid'] - _num_slices[context_uuid] = _num_slices.get(context_uuid, 0) + 1 - return _num_slices - - # Format CustomConfigRules in Devices, Services and Slices provided in JSON format - - def process(self) -> TypeResults: - # Format CustomConfigRules in Devices, Services and Slices provided in JSON format - self.__slices = [format_slice_custom_config_rules (slice_ ) for slice_ in self.__slices ] - - # Context and Topology require to create the entity first, and add devices, links, services, - # slices, etc. in a second stage. - - print(self.__results) - return self.__results - - #UTILIZA LA FUNCION FORMAT_CUSTOM_CONFIG_RULES -#cambio - -TypeResourceValue = Union[str, int, bool, float, dict, list] -''' -def format_custom_config_rules(config_rules : List[Dict]) -> List[Dict]: - for config_rule in config_rules: - # if 'custom' not in config_rule: continue #suponemos que siempre son custom, quitamos esta linea - custom_resource_value : TypeResourceValue = config_rule['attachment-circuits']['attachment-circuit'] - if isinstance(custom_resource_value, (dict, list)): - custom_resource_value = json.dumps(custom_resource_value, sort_keys=True, indent=0) - config_rule['attachment-circuits']['attachment-circuit'] = custom_resource_value - elif not isinstance(custom_resource_value, str): - config_rule['attachment-circuits']['attachment-circuit'] = str(custom_resource_value) - return config_rules - -def format_slice_custom_config_rules(slice_ : Dict) -> Dict: - #donde cojo los config_rules - #las config_rules parecen estar en ACs? - sdps = slice_.get('sdps', {}) - config_rules = sdps.get('sdp', {}) - print("Tipo de sdp:", type(config_rules)) - print("sdps:", config_rules) - #Despues de mucho revisar, el campo sdp es List[Dict] asique voy a pasar directamente sdp a la funcion format_custom_config_rules(config_rules) - - config_rules = format_custom_config_rules(config_rules) - slice_['sdps']['sdp'] = config_rules - return slice_ -''' -def format_custom_config_rules(config_rules : List[Dict]) -> List[Dict]: - for config_rule in config_rules: - if 'custom' not in config_rule: continue - custom_resource_value : TypeResourceValue = config_rule['custom']['resource_value'] - if isinstance(custom_resource_value, (dict, list)): - custom_resource_value = json.dumps(custom_resource_value, sort_keys=True, indent=0) - config_rule['custom']['resource_value'] = custom_resource_value - return config_rules - -def format_slice_custom_config_rules(slice_ : Dict) -> Dict: - config_rules = slice_.get('slice_config', {}).get('config_rules', []) - config_rules = format_custom_config_rules(config_rules) - slice_['slice_config']['config_rules'] = config_rules - return slice_ - -# Crear una instancia de la clase -mi_cargador = DescriptorLoader() -results = mi_cargador.process() - - -- GitLab From a4e7c92b7da8884ccf34554423521f8f58276515 Mon Sep 17 00:00:00 2001 From: armingol Date: Tue, 11 Jun 2024 17:16:12 +0200 Subject: [PATCH 263/602] add correct Copyright --- src/webui/service/templates/device/logical.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webui/service/templates/device/logical.html b/src/webui/service/templates/device/logical.html index 1287c20cf..8a2541989 100644 --- a/src/webui/service/templates/device/logical.html +++ b/src/webui/service/templates/device/logical.html @@ -1,5 +1,5 @@ Submit Transaction: InitLedger, function activates the chaincode'); + + await contract.submitTransaction('InitLedger'); + + console.log('*** Transaction committed successfully'); + } catch (error) { + console.error('Failed to submit InitLedger transaction:', error); + throw error; + } +} + + + +/** + * envOrDefault() will return the value of an environment variable, or a default value if the variable is undefined. + */ +function envOrDefault(key: string, defaultValue: string): string { + return process.env[key] || defaultValue; +} + +/** + * displayInputParameters() will print the global scope parameters used by the main driver routine. + */ +async function displayInputParameters(): Promise { + console.log(`channelName: ${channelName}`); + console.log(`chaincodeName: ${chaincodeName}`); + console.log(`mspId: ${mspId}`); + console.log(`cryptoPath: ${cryptoPath}`); + console.log(`keyDirectoryPath: ${keyDirectoryPath}`); + console.log(`certDirectoryPath: ${certDirectoryPath}`); + console.log(`tlsCertPath: ${tlsCertPath}`); + console.log(`peerEndpoint: ${peerEndpoint}`); + console.log(`peerHostAlias: ${peerHostAlias}`); +} + +/** + * startEventListening() will initiate the event listener for chaincode events. + */ +async function startEventListening(network: Network): Promise> { + console.log('\n*** Start chaincode event listening'); + + const events = await network.getChaincodeEvents(chaincodeName); + + void readEvents(events); // Don't await - run asynchronously + return events; +} + +/** + * readEvents() format and display the events as a JSON. + */ +async function readEvents(events: CloseableAsyncIterable): Promise { + try { + for await (const event of events) { + const payload = parseJson(event.payload); + console.log(`\n<-- Chaincode event received: ${event.eventName} -`, payload); + } + } catch (error: unknown) { + // Ignore the read error when events.close() is called explicitly + if (!(error instanceof GatewayError) || error.code !== grpc.status.CANCELLED.valueOf()) { + throw error; + } + } +} + +/** + * parseJson() formats a JSON. + */ +function parseJson(jsonBytes: Uint8Array): unknown { + const json = utf8Decoder.decode(jsonBytes); + return JSON.parse(json); +} + diff --git a/src/dlt/gateway/dltApp/src/testEvents.js b/src/dlt/gateway/dltApp/src/testEvents.js new file mode 100644 index 000000000..68573e271 --- /dev/null +++ b/src/dlt/gateway/dltApp/src/testEvents.js @@ -0,0 +1,51 @@ +const grpc = require('@grpc/grpc-js'); +const protoLoader = require('@grpc/proto-loader'); +const path = require('path'); + +const PROTO_PATH = path.resolve(__dirname, '../proto/dlt_service.proto'); +const packageDefinition = protoLoader.loadSync(PROTO_PATH, { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +}); +const dltProto = grpc.loadPackageDefinition(packageDefinition).dlt; + +const client = new dltProto.DltGatewayService( + '10.1.1.96:32001', + grpc.credentials.createInsecure() +); + +function subscribeToDlt() { + const request = { + // Define any necessary subscription filters here if applicable + }; + + const call = client.SubscribeToDlt(request); + + call.on('data', (event) => { + console.log('Received event:', event); + }); + + call.on('error', (error) => { + console.error('Error:', error.message); + }); + + call.on('end', () => { + console.log('Stream ended.'); + }); + + // Optionally, you can cancel the subscription after a certain time or condition + setTimeout(() => { + console.log('Cancelling subscription...'); + call.cancel(); + }, 600000); // Cancel after 1 minute for demonstration purposes +} + +function runTests() { + console.log("Testing subscription to DLT events"); + subscribeToDlt(); +} + +runTests(); diff --git a/src/dlt/gateway/dltApp/src/testGateway.js b/src/dlt/gateway/dltApp/src/testGateway.js new file mode 100644 index 000000000..3486cb4f3 --- /dev/null +++ b/src/dlt/gateway/dltApp/src/testGateway.js @@ -0,0 +1,111 @@ +const grpc = require('@grpc/grpc-js'); +const protoLoader = require('@grpc/proto-loader'); +const path = require('path'); +const fs = require('fs').promises; +const { v4: uuidv4 } = require('uuid'); // Import the UUID library + + +const PROTO_PATH = path.resolve(__dirname, '../proto/dlt_service.proto'); +const packageDefinition = protoLoader.loadSync(PROTO_PATH, { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +}); +const dltProto = grpc.loadPackageDefinition(packageDefinition).dlt; + +const client = new dltProto.DltGatewayService( + '10.1.1.96:32001', + grpc.credentials.createInsecure() +); + +const assetId = `asset-${Date.now()}`; +const domainUuid = `domain-${uuidv4()}`; // Generate a pretty domain UUID + +async function getTopoData(filename) { + try { + const data = await fs.readFile(`../../samples/${filename}`, 'utf8'); + return data; + } catch (error) { + console.error('Failed to read file:', filename, error); + return '{}'; // Empty JSON if error + } +} + +async function processTopoData(operation, assetId, jsonFilename) { + let jsonData = '{}'; + if (jsonFilename) { + jsonData = await getTopoData(jsonFilename); + } + + const request = { + record_id: { + domain_uuid: { uuid: domainUuid }, // Replace "domain-uuid" with actual domain UUID if needed + type: 'DLTRECORDTYPE_TOPOLOGY', // Use the appropriate type if needed + record_uuid: { uuid: assetId } + }, + operation, + data_json: jsonData + }; + + return new Promise((resolve, reject) => { + client.RecordToDlt(request, (error, response) => { + if (error) { + console.error('Error:', error.message); + reject(error); + } else { + console.log('Response:', response); + resolve(response); + } + }); + }); +} + +async function getDLTData(assetId) { + + const request = { + domain_uuid: { uuid: domainUuid }, // Replace "domain-uuid" with actual domain UUID if needed + type: 'DLTRECORDTYPE_TOPOLOGY', // Use the appropriate type if needed + record_uuid: { uuid: assetId } + }; + + return new Promise((resolve, reject) => { + client.GetFromDlt(request, (error, response) => { + if (error) { + console.error('Error:', error.message); + reject(error); + } else { + console.log('Response:', response); + resolve(response); + } + }); + }); +} + +async function runTests() { + console.log("Testing Store Operation"); + await processTopoData('DLTRECORDOPERATION_ADD', assetId, 'topo2.json'); + + console.log("Testing Update Operation"); + await processTopoData('DLTRECORDOPERATION_UPDATE', assetId, 'topo3.json'); + + console.log("Testing Fetch Operation"); + await getDLTData(assetId); + + + console.log("Testing Delete Operation"); + await processTopoData('DLTRECORDOPERATION_DELETE', assetId); + + console.log("Testing Fetch All Operation"); + // This part assumes you have a GetAllInfo method implemented in your chaincode and corresponding gRPC service. + // client.GetAllInfo({}, (error, response) => { + // if (error) { + // console.error('Error:', error.message); + // } else { + // console.log('All Data:', response); + // } + // }); +} + +runTests().catch(console.error); diff --git a/src/dlt/gateway/dltApp/tests/dltApp_Test/.gitignore b/src/dlt/gateway/dltApp/tests/dltApp_Test/.gitignore new file mode 100644 index 000000000..40b878db5 --- /dev/null +++ b/src/dlt/gateway/dltApp/tests/dltApp_Test/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/src/dlt/gateway/dltApp/tests/dltApp_Test/package-lock.json b/src/dlt/gateway/dltApp/tests/dltApp_Test/package-lock.json new file mode 100644 index 000000000..c7e3f7976 --- /dev/null +++ b/src/dlt/gateway/dltApp/tests/dltApp_Test/package-lock.json @@ -0,0 +1,2060 @@ +{ + "name": "adrenalineDLT_APP", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "adrenalineDLT_APP", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.9.7", + "@hyperledger/fabric-gateway": "~1.4.0", + "dotenv": "^16.4.5" + }, + "devDependencies": { + "@tsconfig/node18": "^18.2.2", + "@types/node": "^18.18.6", + "@typescript-eslint/eslint-plugin": "^6.9.0", + "@typescript-eslint/parser": "^6.9.0", + "eslint": "^8.52.0", + "typescript": "~5.2.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.7.tgz", + "integrity": "sha512-ZMBVjSeDAz3tFSehyO6Pd08xZT1HfIwq3opbeM4cDlBh52gmwp0wVIPcQur53NN0ac68HMZ/7SF2rGRD5KmVmg==", + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "node_modules/@hyperledger/fabric-gateway": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@hyperledger/fabric-gateway/-/fabric-gateway-1.4.0.tgz", + "integrity": "sha512-dJ0eJdGBo8wtZ/oR5mADHnllp+pSuVOI7uq5fRFf0NTVk1SzlX42Q3kt4j53bJQaxd21TMvofgXNO+BCgJcB/A==", + "dependencies": { + "@grpc/grpc-js": "^1.9.0", + "@hyperledger/fabric-protos": "^0.2.0", + "asn1.js": "^5.4.1", + "bn.js": "^5.2.1", + "elliptic": "^6.5.4", + "google-protobuf": "^3.21.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "optionalDependencies": { + "pkcs11js": "^1.3.0" + } + }, + "node_modules/@hyperledger/fabric-protos": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@hyperledger/fabric-protos/-/fabric-protos-0.2.1.tgz", + "integrity": "sha512-qjm0vIQIfCall804tWDeA8p/mUfu14sl5Sj+PbOn2yDKJq+7ThoIhNsLAqf+BCxUfqsoqQq6AojhqQeTFyOOqg==", + "dependencies": { + "@grpc/grpc-js": "^1.9.0", + "google-protobuf": "^3.21.0" + }, + "engines": { + "node": ">=14.15.0" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@tsconfig/node18": { + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.4.tgz", + "integrity": "sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.19.32", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.32.tgz", + "integrity": "sha512-2bkg93YBSDKk8DLmmHnmj/Rwr18TLx7/n+I23BigFwgexUJoMHZOd8X1OFxuF/W3NN0S2W2E5sVabI5CPinNvA==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/elliptic": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", + "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nan": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", + "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==", + "optional": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkcs11js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkcs11js/-/pkcs11js-1.3.1.tgz", + "integrity": "sha512-eo7fTeQwYGzX1pFmRaf4ji/WcDW2XKpwqylOwzutsjNWECv6G9PzDHj3Yj5dX9EW/fydMnJG8xvWj/btnQT9TA==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "nan": "^2.15.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/PeculiarVentures" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/src/dlt/gateway/dltApp/tests/dltApp_Test/package.json b/src/dlt/gateway/dltApp/tests/dltApp_Test/package.json new file mode 100644 index 000000000..228dbaad9 --- /dev/null +++ b/src/dlt/gateway/dltApp/tests/dltApp_Test/package.json @@ -0,0 +1,34 @@ +{ + "name": "adrenalineDLT_APP", + "version": "1.0.0", + "description": "A DLT application that record and manages topology data as JSON implemented in typeScript using fabric-gateway", + "main": "dist/index.js", + "typings": "dist/index.d.ts", + "engines": { + "node": ">=18" + }, + "scripts": { + "build": "tsc", + "build:watch": "tsc -w", + "lint": "eslint . --ext .ts", + "prepare": "npm run build", + "pretest": "npm run lint", + "start": "node dist/adrenalineDLT_app.js" + }, + "engineStrict": true, + "author": "CTTC-Javier", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.9.7", + "@hyperledger/fabric-gateway": "~1.4.0", + "dotenv": "^16.4.5" + }, + "devDependencies": { + "@tsconfig/node18": "^18.2.2", + "@types/node": "^18.18.6", + "@typescript-eslint/eslint-plugin": "^6.9.0", + "@typescript-eslint/parser": "^6.9.0", + "eslint": "^8.52.0", + "typescript": "~5.2.2" + } +} diff --git a/src/dlt/gateway/dltApp/tests/dltApp_Test/src/adrenalineDLT_app.ts b/src/dlt/gateway/dltApp/tests/dltApp_Test/src/adrenalineDLT_app.ts new file mode 100644 index 000000000..d1cd3a5e3 --- /dev/null +++ b/src/dlt/gateway/dltApp/tests/dltApp_Test/src/adrenalineDLT_app.ts @@ -0,0 +1,341 @@ +/* + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as grpc from '@grpc/grpc-js'; +import { connect, Contract, Identity, Signer, signers, Network, CloseableAsyncIterable, ChaincodeEvent, GatewayError } from '@hyperledger/fabric-gateway'; +import * as crypto from 'crypto'; +import { promises as fs } from 'fs'; +import * as path from 'path'; +import { TextDecoder } from 'util'; +import * as dotenv from 'dotenv'; + +dotenv.config(); +const channelName = envOrDefault('CHANNEL_NAME', 'channel1'); +const chaincodeName = envOrDefault('CHAINCODE_NAME', 'adrenalineDLT'); +const mspId = envOrDefault('MSP_ID', 'Org1MSP'); + +// Path to crypto materials. +const cryptoPath = envOrDefault('CRYPTO_PATH', path.resolve(__dirname, '..', '..', '..', 'test-network', 'organizations', 'peerOrganizations', 'org1.adrenaline.com')); + +// Path to user private key directory. +const keyDirectoryPath = envOrDefault('KEY_DIRECTORY_PATH', path.resolve(cryptoPath, 'users', 'User1@org1.adrenaline.com', 'msp', 'keystore')); + +// Path to user certificate directory. +const certDirectoryPath = envOrDefault('CERT_DIRECTORY_PATH', path.resolve(cryptoPath, 'users', 'User1@org1.adrenaline.com', 'msp', 'signcerts')); + +// Path to peer tls certificate. +const tlsCertPath = envOrDefault('TLS_CERT_PATH', path.resolve(cryptoPath, 'peers', 'peer0.org1.adrenaline.com', 'tls', 'ca.crt')); + +// Gateway peer endpoint. +const peerEndpoint = envOrDefault('PEER_ENDPOINT', 'localhost:7051'); + +// Gateway peer SSL host name override. +const peerHostAlias = envOrDefault('PEER_HOST_ALIAS', 'peer0.org1.adrenaline.com'); + +const utf8Decoder = new TextDecoder(); +const assetId = `asset${Date.now()}`; + +async function main(): Promise { + + await displayInputParameters(); + + // The gRPC client connection should be shared by all Gateway connections to this endpoint. + const client = await newGrpcConnection(); + + const gateway = connect({ + client, + identity: await newIdentity(), + signer: await newSigner(), + // Default timeouts for different gRPC calls + evaluateOptions: () => { + return { deadline: Date.now() + 5000 }; // 5 seconds + }, + endorseOptions: () => { + return { deadline: Date.now() + 15000 }; // 15 seconds + }, + submitOptions: () => { + return { deadline: Date.now() + 5000 }; // 5 seconds + }, + commitStatusOptions: () => { + return { deadline: Date.now() + 60000 }; // 1 minute + }, + }); + + let events: CloseableAsyncIterable | undefined; + + try { + // Get a network instance representing the channel where the smart contract is deployed. + const network = gateway.getNetwork(channelName); + + // Get the smart contract from the network. + const contract = network.getContract(chaincodeName); + + //Listen for events emitted by transactions + events = await startEventListening(network); + + // Initialize the ledger. + await initLedger(contract); + +// Create a new asset on the ledger and gets the blocknumber. + const firstBlockNumber = await StoreTopoData(contract); + + // Get the asset details by key. + await RetrieveTopoData(contract); + + //Updates existing record of a topology + await updateRecord(contract); + + // Verifies the changes. + await RetrieveTopoData(contract); + + //Deletes existing topology + await deleteRecordByID(contract); + + // Return all the current assets on the ledger. + await GetAllInfo(contract); + + // Update an asset which does not exist. + await updateNonExistentRecord(contract) + + // Replay events from the block containing the first transactions + await replayChaincodeEvents(network, firstBlockNumber); + + } finally { + events?.close(); + gateway.close(); + client.close(); + } +} + +main().catch(error => { + console.error('******** FAILED to run the application:', error); + process.exitCode = 1; +}); + +async function newGrpcConnection(): Promise { + const tlsRootCert = await fs.readFile(tlsCertPath); + const tlsCredentials = grpc.credentials.createSsl(tlsRootCert); + return new grpc.Client(peerEndpoint, tlsCredentials, { + 'grpc.ssl_target_name_override': peerHostAlias, + }); +} + +async function newIdentity(): Promise { + const certPath = await getFirstDirFileName(certDirectoryPath); + const credentials = await fs.readFile(certPath); + return { mspId, credentials }; +} + +async function getFirstDirFileName(dirPath: string): Promise { + const files = await fs.readdir(dirPath); + return path.join(dirPath, files[0]); +} + +async function newSigner(): Promise { + const keyPath = await getFirstDirFileName(keyDirectoryPath); + const privateKeyPem = await fs.readFile(keyPath); + const privateKey = crypto.createPrivateKey(privateKeyPem); + return signers.newPrivateKeySigner(privateKey); +} + +/** + * This type of transaction would typically only be run once by an application the first time it was started after its + * initial deployment. A new version of the chaincode deployed later would likely not need to run an "init" function. + */ +async function initLedger(contract: Contract): Promise { + try { + console.log('\n--> Submit Transaction: InitLedger, function activates the chaincode'); + + await contract.submitTransaction('InitLedger'); + + console.log('*** Transaction committed successfully'); + } catch (error) { + console.error('Failed to submit InitLedger transaction:', error); + throw error; + } +} + + + +/** + * Evaluate a transaction to query ledger state. + */ +async function GetAllInfo(contract: Contract): Promise { + console.log('\n--> Evaluate Transaction: GetAllInfo, function returns all the current topologies on the ledger'); + + const resultBytes = await contract.evaluateTransaction('GetAllInfo'); + + const resultJson = utf8Decoder.decode(resultBytes); + const result = JSON.parse(resultJson); + console.log('*** Result:', result); +} + +/** + * Submit a transaction Asynchronously. + */ +async function StoreTopoData(contract: Contract): Promise { + console.log('\n--> Submit Transaction: StoreTopoData, records a new topology structure by Key values'); + + const storeTopoDataPath = path.resolve(__dirname, '..', '..', '..', 'samples', 'sampleTopo.json'); + const jsonData = await fs.readFile(storeTopoDataPath, 'utf8'); + const result = await contract.submitAsync('StoreTopoData', { + arguments: [assetId, jsonData] + }); + + const status = await result.getStatus(); + if (!status.successful) { + throw new Error(`failed to commit transaction ${status.transactionId} with status code ${status.code}`); + } + + console.log('*** Transaction committed successfully'); + return status.blockNumber; +} + +/** + * updateRecord(), updates topology record by key synchronously. + */ +async function updateRecord(contract: Contract): Promise { + console.log(`\n--> Submit transaction: UpdateTopoData, ${assetId}`); + + + try { + const updateTopoDataPath = path.resolve(__dirname, '..', '..', '..', 'samples', 'updatedTopo.json'); + const jsonData = await fs.readFile(updateTopoDataPath, 'utf8'); + await contract.submitTransaction('UpdateTopoData', assetId, jsonData); + console.log('UpdateTopoData committed successfully'); + } catch (error) { + console.log('*** Successfully caught the error: \n', error); + } +} + +/** + * RetrieveTopoData(), gets the topology information by key. + */ +async function RetrieveTopoData(contract: Contract): Promise { + console.log('\n--> Evaluate Transaction: RetrieveTopoData, function returns topology attributes'); + + const resultBytes = await contract.evaluateTransaction('RetrieveTopoData', assetId); + + const resultJson = utf8Decoder.decode(resultBytes); + const result = JSON.parse(resultJson); + console.log('*** Result:', result); +} + +/** + * submitTransaction() will throw an error containing details of any error responses from the smart contract. + */ +async function updateNonExistentRecord(contract: Contract): Promise{ + console.log('\n--> Submit Transaction: UpdateAsset asset70, asset70 does not exist and should return an error'); + + try { + const updateTopoDataPath = path.resolve(__dirname, '..', '..', '..', 'samples', 'updatedTopo.json'); + const jsonData = await fs.readFile(updateTopoDataPath, 'utf8'); + await contract.submitTransaction('UpdateTopoData', 'nonExist', jsonData) + console.log('******** FAILED to return an error'); + } catch (error) { + console.log('*** Successfully caught the error: \n', error); + } +} + +/** + * deleteRecordByID() removes a record from the ledger. + */ + +async function deleteRecordByID(contract: Contract): Promise{ + console.log(`\n--> Submit transaction: deleteRecordByID, ${assetId}`); + try { + + await contract.submitTransaction('DeleteTopo', assetId); + console.log('\n*** deleteRecordByID committed successfully'); + } catch (error) { + console.log('*** Successfully caught the error: \n', error); + } +} + + +/** + * envOrDefault() will return the value of an environment variable, or a default value if the variable is undefined. + */ +function envOrDefault(key: string, defaultValue: string): string { + return process.env[key] || defaultValue; +} + +/** + * displayInputParameters() will print the global scope parameters used by the main driver routine. + */ +async function displayInputParameters(): Promise { + console.log(`channelName: ${channelName}`); + console.log(`chaincodeName: ${chaincodeName}`); + console.log(`mspId: ${mspId}`); + console.log(`cryptoPath: ${cryptoPath}`); + console.log(`keyDirectoryPath: ${keyDirectoryPath}`); + console.log(`certDirectoryPath: ${certDirectoryPath}`); + console.log(`tlsCertPath: ${tlsCertPath}`); + console.log(`peerEndpoint: ${peerEndpoint}`); + console.log(`peerHostAlias: ${peerHostAlias}`); +} + +/** + * startEventListening() will initiate the event listener for chaincode events. + */ +async function startEventListening(network: Network): Promise> { + console.log('\n*** Start chaincode event listening'); + + const events = await network.getChaincodeEvents(chaincodeName); + + void readEvents(events); // Don't await - run asynchronously + return events; +} + +/** + * readEvents() format and display the events as a JSON. + */ +async function readEvents(events: CloseableAsyncIterable): Promise { + try { + for await (const event of events) { + const payload = parseJson(event.payload); + console.log(`\n<-- Chaincode event received: ${event.eventName} -`, payload); + } + } catch (error: unknown) { + // Ignore the read error when events.close() is called explicitly + if (!(error instanceof GatewayError) || error.code !== grpc.status.CANCELLED.valueOf()) { + throw error; + } + } +} + +/** + * parseJson() formats a JSON. + */ +function parseJson(jsonBytes: Uint8Array): unknown { + const json = utf8Decoder.decode(jsonBytes); + return JSON.parse(json); +} + + +/** + * replayChaincodeEvents() + */ +async function replayChaincodeEvents(network: Network, startBlock: bigint): Promise { + console.log('\n*** Start chaincode event replay'); + + const events = await network.getChaincodeEvents(chaincodeName, { + startBlock, + }); + + try { + for await (const event of events) { + const payload = parseJson(event.payload); + console.log(`\n<-- Chaincode event replayed: ${event.eventName} -`, payload); + + if (event.eventName === 'DeleteTopo') { + // Reached the last submitted transaction so break to stop listening for events + break; + } + } + } finally { + events.close(); + } +} \ No newline at end of file diff --git a/src/dlt/gateway/dltApp/tests/dltApp_Test/tsconfig.json b/src/dlt/gateway/dltApp/tests/dltApp_Test/tsconfig.json new file mode 100644 index 000000000..ed2150983 --- /dev/null +++ b/src/dlt/gateway/dltApp/tests/dltApp_Test/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends":"@tsconfig/node18/tsconfig.json", + "compilerOptions": { + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "outDir": "dist", + "declaration": true, + "sourceMap": true, + "noImplicitAny": true + }, + "include": [ + "./src/**/*" + ], + "exclude": [ + "./src/**/*.spec.ts" + ] + } + \ No newline at end of file diff --git a/src/dlt/gateway/dltApp/tests/perfTest.js b/src/dlt/gateway/dltApp/tests/perfTest.js new file mode 100644 index 000000000..d2892d451 --- /dev/null +++ b/src/dlt/gateway/dltApp/tests/perfTest.js @@ -0,0 +1,105 @@ +const { connectToNetwork } = require('../dist/fabricConnect'); +const fsp = require('fs').promises; +const fs = require('fs'); +const util = require('util'); + +const utf8Decoder = new TextDecoder(); +const topoDirectory = '../samples/'; +//const topologies = ['topo1.json', 'topo2.json', 'topo3.json', 'topo4.json']; +const topologies = ['topo4.json']; + +const iterations = 1000; + +async function main() { + try { + const { contract, close } = await connectToNetwork(); + for (const topoFile of topologies) { + const logFilePath = `./operation_times_${topoFile.split('.')[0]}.txt`; // Creates a separate logfile for each topology + const appendFile = util.promisify(fs.appendFile.bind(fs, logFilePath)); + + console.log(`Starting tests for ${topoFile}`); + for (let i = 0; i < iterations; i++) { + console.log(`Iteration ${i + 1} for ${topoFile}`); + await runBlockchainOperations(contract, topoFile, appendFile); + } + } + await close(); // Clean up the connection + } catch (error) { + console.error('An error occurred:', error); + } +} + +async function runBlockchainOperations(contract, topoFile, appendFile) { + const assetId = `asset${Date.now()}`; + const jsonData = await readJsonData(`${topoDirectory}${topoFile}`); + + // Define operations + const operations = [ + { type: 'STORE', jsonData }, + { type: 'UPDATE', jsonData }, + { type: 'FETCH', jsonData: null }, + { type: 'DELETE', jsonData: null }, + { type: 'FETCH_ALL', jsonData: null } + ]; + + for (let op of operations) { + await executeOperation(contract, op.type, assetId, op.jsonData, appendFile); + } +} + +async function readJsonData(filePath) { + try { + return await fsp.readFile(filePath, 'utf8'); + } catch (error) { + console.error(`Failed to read file: ${filePath}`, error); + return '{}'; + } +} + +async function executeOperation(contract, operationType, assetId, jsonData, appendFile) { + const startTime = process.hrtime.bigint(); + try { + let result; + switch (operationType) { + case 'STORE': + result = await contract.submitTransaction('StoreTopoData', assetId, jsonData); + break; + case 'UPDATE': + result = await contract.submitTransaction('UpdateTopoData', assetId, jsonData); + break; + case 'FETCH': + result = await contract.evaluateTransaction('RetrieveTopoData', assetId); + break; + case 'DELETE': + result = await contract.submitTransaction('DeleteTopo', assetId); + break; + case 'FETCH_ALL': + result = await contract.evaluateTransaction('GetAllInfo'); + break; + } + result = utf8Decoder.decode(result); + const operationTime = recordOperationTime(startTime); + await logOperationTime(operationTime, operationType, appendFile); + console.log(`${operationType} Result:`, result); + } catch (error) { + console.error(`Error during ${operationType}:`, error); + } +} + +function recordOperationTime(startTime) { + const endTime = process.hrtime.bigint(); + const operationTime = Number(endTime - startTime) / 1e6; + return operationTime; +} + +async function logOperationTime(operationTime, operationType, appendFile) { + const timestamp = Date.now(); + const logEntry = `${timestamp} - ${operationType} - Execution time: ${operationTime.toFixed(3)} ms\n`; + try { + await appendFile(logEntry); + } catch (error) { + console, error('Error writing to log file:', error); + } +} + +main(); diff --git a/src/dlt/gateway/dltApp/tests/rateTest.js b/src/dlt/gateway/dltApp/tests/rateTest.js new file mode 100644 index 000000000..95370f487 --- /dev/null +++ b/src/dlt/gateway/dltApp/tests/rateTest.js @@ -0,0 +1,71 @@ +const { connectToNetwork } = require('../dist/fabricConnect'); +const fs = require('fs'); +const util = require('util'); +const appendFile = util.promisify(fs.appendFile); +const logFilePath = './transaction_times_TPS_TOPO3.txt'; +const utf8Decoder = new TextDecoder(); +const topoDirectory = '../samples/'; + +async function main() { + const { contract, close } = await connectToNetwork(); + try { + const rates = [10, 50, 250, 500]; // Transactions per second + for (let i = 0; i < 1000; i++) { + for (let rate of rates) { + console.log(`Testing at ${rate} TPS`); + await performLoadTest(contract, 1000, rate); + } + } + } finally { + await close(); // Ensure to close the network connection + } +} + +async function performLoadTest(contract, totalTransactions, rate) { + const interval = 1000 / rate; // Calculate interval in milliseconds + let promises = []; + const startTime = Date.now(); + + for (let i = 0; i < totalTransactions; i++) { + // Queue a transaction promise + promises.push(sendTransaction(contract, `asset${Date.now() + i}`)); + + // Process in batches according to the rate + if ((i + 1) % rate === 0 || i === totalTransactions - 1) { + await Promise.all(promises); // Send a batch of transactions + promises = []; // Reset for the next batch + if (i < totalTransactions - 1) { + await new Promise(resolve => setTimeout(resolve, interval)); // Throttle the transaction sending + } + } + } + + const endTime = Date.now(); + const totalTime = endTime - startTime; + const actualRate = totalTransactions / (totalTime / 1000); + console.log(`Total time for ${totalTransactions} transactions at target ${rate} TPS: ${totalTime} ms`); + console.log(`Actual rate achieved: ${actualRate.toFixed(2)} TPS`); + await appendFile(logFilePath, `Target Rate: ${rate} TPS, Total Time: ${totalTime} ms, Actual Rate: ${actualRate.toFixed(2)} TPS\n`); +} + +async function sendTransaction(contract, assetId) { + try { + const jsonData = await readJsonData(`${topoDirectory}topo3.json`); + const result = await contract.submitTransaction('StoreTopoData', assetId, jsonData); + return utf8Decoder.decode(result); + } catch (error) { + console.error('Transaction failed:', error); + return null; + } +} + +async function readJsonData(filePath) { + try { + return await fs.promises.readFile(filePath, 'utf8'); + } catch (error) { + console.error(`Failed to read file: ${filePath}`, error); + return '{}'; + } +} + +main().catch(console.error); diff --git a/src/dlt/gateway/dltApp/tests/simpleTest.js b/src/dlt/gateway/dltApp/tests/simpleTest.js new file mode 100644 index 000000000..98c6ae135 --- /dev/null +++ b/src/dlt/gateway/dltApp/tests/simpleTest.js @@ -0,0 +1,60 @@ +const { connectToNetwork } = require('../dist/fabricConnect'); +const fs = require('fs'); +const util = require('util'); +const appendFile = util.promisify(fs.appendFile); +const logFilePath = './transaction_times_TPS2.txt'; +const utf8Decoder = new TextDecoder(); +const topoDirectory = '../samples/'; + +async function main() { + const { contract, close } = await connectToNetwork(); + try { + console.log('Testing with 8 consecutive transactions'); + await performLoadTest(contract); + } finally { + await close(); // Ensure to close the network connection + } +} + +async function performLoadTest(contract) { + const totalTransactions = 500; + const promises = []; + const startTime = Date.now(); + + for (let i = 0; i < totalTransactions; i++) { + // Queue a transaction promise + promises.push(sendTransaction(contract, `asset${startTime}_${i}`)); + } + + await Promise.all(promises); // Send all transactions + + const endTime = Date.now(); + const totalTime = endTime - startTime; + const actualRate = totalTransactions / (totalTime / 1000); + console.log(`Total time for ${totalTransactions} transactions: ${totalTime} ms`); + console.log(`Actual rate achieved: ${actualRate.toFixed(2)} TPS`); + await appendFile(logFilePath, `Total Transactions: ${totalTransactions}, Total Time: ${totalTime} ms, Actual Rate: ${actualRate.toFixed(2)} TPS\n`); +} + +async function sendTransaction(contract, assetId) { + try { + const jsonData = await readJsonData(`${topoDirectory}topo4.json`); + //const jsonData = JSON.stringify({ data: `Data for ${assetId}`}); + const result = await contract.submitTransaction('StoreTopoData', assetId, jsonData); + return utf8Decoder.decode(result); + } catch (error) { + console.error('Transaction failed:', error); + return null; + } +} + +async function readJsonData(filePath) { + try { + return await fs.promises.readFile(filePath, 'utf8'); + } catch (error) { + console.error(`Failed to read file: ${filePath}`, error); + return '{}'; + } +} + +main().catch(console.error); diff --git a/src/dlt/gateway/dltApp/tsconfig.json b/src/dlt/gateway/dltApp/tsconfig.json new file mode 100644 index 000000000..56f092a36 --- /dev/null +++ b/src/dlt/gateway/dltApp/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends":"@tsconfig/node18/tsconfig.json", + "compilerOptions": { + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "outDir": "dist", + "declaration": true, + "sourceMap": true, + "noImplicitAny": true + }, + "include": [ + "./src/**/*" +, "src.old/grpcClient.js", "src.old/grpcServer.js" ], + "exclude": [ + "./src/**/*.spec.ts" + ] + } + \ No newline at end of file diff --git a/src/dlt/gateway/gradle.properties b/src/dlt/gateway/gradle.properties deleted file mode 100644 index 7fc6f1ff2..000000000 --- a/src/dlt/gateway/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -kotlin.code.style=official diff --git a/src/dlt/gateway/gradle/wrapper/gradle-wrapper.jar b/src/dlt/gateway/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL diff --git a/src/dlt/gateway/gradle/wrapper/gradle-wrapper.properties b/src/dlt/gateway/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 69a971507..000000000 --- a/src/dlt/gateway/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/src/dlt/gateway/gradlew b/src/dlt/gateway/gradlew deleted file mode 100755 index 744e882ed..000000000 --- a/src/dlt/gateway/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# 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 -# -# https://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. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MSYS* | MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/src/dlt/gateway/gradlew.bat b/src/dlt/gateway/gradlew.bat deleted file mode 100644 index ac1b06f93..000000000 --- a/src/dlt/gateway/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/src/dlt/gateway/samples/sampleTopo.json b/src/dlt/gateway/samples/sampleTopo.json new file mode 100644 index 000000000..435d0bfbe --- /dev/null +++ b/src/dlt/gateway/samples/sampleTopo.json @@ -0,0 +1,30 @@ +{ + "name": "Network A", + "nodes": [ + { + "id": "node1", + "type": "switch", + "status": "active", + "connections": [ + "node2", + "node3" + ] + }, + { + "id": "node2", + "type": "router", + "status": "inactive", + "connections": [ + "node1" + ] + }, + { + "id": "node3", + "type": "server", + "status": "active", + "connections": [ + "node1" + ] + } + ] +} \ No newline at end of file diff --git a/src/dlt/gateway/samples/topo1.json b/src/dlt/gateway/samples/topo1.json new file mode 100644 index 000000000..e4a49981f --- /dev/null +++ b/src/dlt/gateway/samples/topo1.json @@ -0,0 +1,96 @@ +{ + "contexts": [ + {"context_id": {"context_uuid": {"uuid": "admin"}}} + ], + "topologies": [ + {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}} + ], + "devices": [ + { + "device_id": {"device_uuid": {"uuid": "DC1"}}, "device_type": "emu-datacenter", "device_drivers": [0], + "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"uuid": "eth1", "type": "copper"}, {"uuid": "eth2", "type": "copper"}, {"uuid": "int", "type": "copper"} + ]}}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "DC2"}}, "device_type": "emu-datacenter", "device_drivers": [0], + "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"uuid": "eth1", "type": "copper"}, {"uuid": "eth2", "type": "copper"}, {"uuid": "int", "type": "copper"} + ]}}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "SRL1"}}, "device_type": "packet-router", "device_drivers": [8], + "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.100.100.101"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "57400"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { + "username": "admin", "password": "NokiaSrl1!", "use_tls": true + }}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "SRL2"}}, "device_type": "packet-router", "device_drivers": [8], + "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.100.100.102"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "57400"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { + "username": "admin", "password": "NokiaSrl1!", "use_tls": true + }}} + ]} + } + ], + "links": [ + { + "link_id": {"link_uuid": {"uuid": "DC1/eth1==SRL1/ethernet-1/2"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "DC1"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "SRL1"}}, "endpoint_uuid": {"uuid": "ethernet-1/2"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "SRL1/ethernet-1/2==DC1/eth1"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "SRL1"}}, "endpoint_uuid": {"uuid": "ethernet-1/2"}}, + {"device_id": {"device_uuid": {"uuid": "DC1"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + }, + + { + "link_id": {"link_uuid": {"uuid": "SRL1/ethernet-1/1==SRL2/ethernet-1/1"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "SRL1"}}, "endpoint_uuid": {"uuid": "ethernet-1/1"}}, + {"device_id": {"device_uuid": {"uuid": "SRL2"}}, "endpoint_uuid": {"uuid": "ethernet-1/1"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "SRL2/ethernet-1/1==SRL1/ethernet-1/1"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "SRL2"}}, "endpoint_uuid": {"uuid": "ethernet-1/1"}}, + {"device_id": {"device_uuid": {"uuid": "SRL1"}}, "endpoint_uuid": {"uuid": "ethernet-1/1"}} + ] + }, + + { + "link_id": {"link_uuid": {"uuid": "DC2/eth1==SRL2/ethernet-1/2"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "DC2"}}, "endpoint_uuid": {"uuid": "eth1"}}, + {"device_id": {"device_uuid": {"uuid": "SRL2"}}, "endpoint_uuid": {"uuid": "ethernet-1/2"}} + ] + }, + { + "link_id": {"link_uuid": {"uuid": "SRL2/ethernet-1/2==DC2/eth1"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "SRL2"}}, "endpoint_uuid": {"uuid": "ethernet-1/2"}}, + {"device_id": {"device_uuid": {"uuid": "DC2"}}, "endpoint_uuid": {"uuid": "eth1"}} + ] + } + ] +} diff --git a/src/dlt/gateway/samples/topo2.json b/src/dlt/gateway/samples/topo2.json new file mode 100644 index 000000000..6885c7d90 --- /dev/null +++ b/src/dlt/gateway/samples/topo2.json @@ -0,0 +1,210 @@ +{ + "contexts": [ + {"context_id": {"context_uuid": {"uuid": "admin"}}} + ], + "topologies": [ + {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}} + ], + "devices": [ + { + "device_id": {"device_uuid": {"uuid": "R1"}}, "device_type": "emu-packet-router", "device_drivers": [0], + "device_endpoints": [], "device_operational_status": 1, "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/1"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/2"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/3"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/4"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/5"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/6"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/1"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/2"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/3"} + ]}}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "R2"}}, "device_type": "emu-packet-router", "device_drivers": [0], + "device_endpoints": [], "device_operational_status": 1, "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/1"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/2"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/3"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/4"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/5"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/6"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/1"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/2"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/3"} + ]}}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "R3"}}, "device_type": "emu-packet-router", "device_drivers": [0], + "device_endpoints": [], "device_operational_status": 1, "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/1"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/2"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/3"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/4"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/5"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/6"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/1"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/2"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/3"} + ]}}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "R4"}}, "device_type": "emu-packet-router", "device_drivers": [0], + "device_endpoints": [], "device_operational_status": 1, "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/1"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/2"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/3"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/4"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/5"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/6"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/1"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/2"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/3"} + ]}}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "R5"}}, "device_type": "emu-packet-router", "device_drivers": [0], + "device_endpoints": [], "device_operational_status": 1, "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/1"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/2"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/3"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/4"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/5"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/6"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/1"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/2"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/3"} + ]}}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "R6"}}, "device_type": "emu-packet-router", "device_drivers": [0], + "device_endpoints": [], "device_operational_status": 1, "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/1"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/2"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/3"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/4"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/5"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/6"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/1"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/2"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/3"} + ]}}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "R7"}}, "device_type": "emu-packet-router", "device_drivers": [0], + "device_endpoints": [], "device_operational_status": 1, "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/1"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/2"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/3"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/1"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/2"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/3"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/4"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/5"}, + {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/6"} + ]}}} + ]} + } + ], + "links": [ + {"link_id": {"link_uuid": {"uuid": "R1==R2"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "2/1"}}, + {"device_id": {"device_uuid": {"uuid": "R2"}}, "endpoint_uuid": {"uuid": "2/2"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R1==R6"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "2/2"}}, + {"device_id": {"device_uuid": {"uuid": "R6"}}, "endpoint_uuid": {"uuid": "2/1"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R1==R7"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "2/3"}}, + {"device_id": {"device_uuid": {"uuid": "R7"}}, "endpoint_uuid": {"uuid": "2/1"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R2==R1"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R2"}}, "endpoint_uuid": {"uuid": "2/2"}}, + {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "2/1"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R2==R3"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R2"}}, "endpoint_uuid": {"uuid": "2/1"}}, + {"device_id": {"device_uuid": {"uuid": "R3"}}, "endpoint_uuid": {"uuid": "2/2"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R3==R2"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R3"}}, "endpoint_uuid": {"uuid": "2/2"}}, + {"device_id": {"device_uuid": {"uuid": "R2"}}, "endpoint_uuid": {"uuid": "2/1"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R3==R4"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R3"}}, "endpoint_uuid": {"uuid": "2/1"}}, + {"device_id": {"device_uuid": {"uuid": "R4"}}, "endpoint_uuid": {"uuid": "2/2"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R3==R7"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R3"}}, "endpoint_uuid": {"uuid": "2/3"}}, + {"device_id": {"device_uuid": {"uuid": "R7"}}, "endpoint_uuid": {"uuid": "2/3"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R4==R3"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R4"}}, "endpoint_uuid": {"uuid": "2/2"}}, + {"device_id": {"device_uuid": {"uuid": "R3"}}, "endpoint_uuid": {"uuid": "2/1"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R4==R5"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R4"}}, "endpoint_uuid": {"uuid": "2/1"}}, + {"device_id": {"device_uuid": {"uuid": "R5"}}, "endpoint_uuid": {"uuid": "2/2"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R5==R4"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R5"}}, "endpoint_uuid": {"uuid": "2/2"}}, + {"device_id": {"device_uuid": {"uuid": "R4"}}, "endpoint_uuid": {"uuid": "2/1"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R5==R6"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R5"}}, "endpoint_uuid": {"uuid": "2/1"}}, + {"device_id": {"device_uuid": {"uuid": "R6"}}, "endpoint_uuid": {"uuid": "2/2"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R5==R7"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R5"}}, "endpoint_uuid": {"uuid": "2/3"}}, + {"device_id": {"device_uuid": {"uuid": "R7"}}, "endpoint_uuid": {"uuid": "2/5"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R6==R1"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R6"}}, "endpoint_uuid": {"uuid": "2/1"}}, + {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "2/2"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R6==R5"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R6"}}, "endpoint_uuid": {"uuid": "2/2"}}, + {"device_id": {"device_uuid": {"uuid": "R5"}}, "endpoint_uuid": {"uuid": "2/1"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R7==R1"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R7"}}, "endpoint_uuid": {"uuid": "2/1"}}, + {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "2/3"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R7==R3"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R7"}}, "endpoint_uuid": {"uuid": "2/3"}}, + {"device_id": {"device_uuid": {"uuid": "R3"}}, "endpoint_uuid": {"uuid": "2/3"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R7==R5"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R7"}}, "endpoint_uuid": {"uuid": "2/5"}}, + {"device_id": {"device_uuid": {"uuid": "R5"}}, "endpoint_uuid": {"uuid": "2/3"}} + ]} + ] +} diff --git a/src/dlt/gateway/samples/topo3.json b/src/dlt/gateway/samples/topo3.json new file mode 100644 index 000000000..f36fbd7d0 --- /dev/null +++ b/src/dlt/gateway/samples/topo3.json @@ -0,0 +1,200 @@ +{ + "contexts": [ + {"context_id": {"context_uuid": {"uuid": "admin"}}, "name": "admin"} + ], + "topologies": [ + {"topology_id": {"topology_uuid": {"uuid": "admin"}, "context_id": {"context_uuid": {"uuid": "admin"}}}, "name": "admin"} + ], + "devices": [ + {"device_id": {"device_uuid": {"uuid": "fr1.fr"}}, "device_type": "emu-packet-router", "device_operational_status": 1, "device_drivers": [0], "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"uuid": "client:1", "type": "copper"}, {"uuid": "client:2", "type": "copper"}, {"uuid": "client:3", "type": "copper"}, + {"uuid": "be1.be", "type": "copper"}, {"uuid": "pt1.pt", "type": "copper"}, {"uuid": "uk1.uk", "type": "copper"}, + {"uuid": "es1.es", "type": "copper"}, {"uuid": "it1.it", "type": "copper"} + ]}}} + ]}}, + {"device_id": {"device_uuid": {"uuid": "be1.be"}}, "device_type": "emu-packet-router", "device_operational_status": 1, "device_drivers": [0], "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"uuid": "client:1", "type": "copper"}, {"uuid": "client:2", "type": "copper"}, {"uuid": "client:3", "type": "copper"}, + {"uuid": "de1.de", "type": "copper"}, {"uuid": "gr1.gr", "type": "copper"}, {"uuid": "uk1.uk", "type": "copper"}, + {"uuid": "fr1.fr", "type": "copper"}, {"uuid": "it1.it", "type": "copper"} + ]}}} + ]}}, + {"device_id": {"device_uuid": {"uuid": "uk1.uk"}}, "device_type": "emu-packet-router", "device_operational_status": 1, "device_drivers": [0], "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"uuid": "client:1", "type": "copper"}, {"uuid": "client:2", "type": "copper"}, {"uuid": "client:3", "type": "copper"}, + {"uuid": "de1.de", "type": "copper"}, {"uuid": "fr1.fr", "type": "copper"}, {"uuid": "be1.be", "type": "copper"}, + {"uuid": "pt1.pt", "type": "copper"} + ]}}} + ]}}, + {"device_id": {"device_uuid": {"uuid": "de1.de"}}, "device_type": "emu-packet-router", "device_operational_status": 1, "device_drivers": [0], "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"uuid": "client:1", "type": "copper"}, {"uuid": "client:2", "type": "copper"}, {"uuid": "client:3", "type": "copper"}, + {"uuid": "uk1.uk", "type": "copper"}, {"uuid": "be1.be", "type": "copper"}, {"uuid": "gr1.gr", "type": "copper"} + ]}}} + ]}}, + {"device_id": {"device_uuid": {"uuid": "pt1.pt"}}, "device_type": "emu-packet-router", "device_operational_status": 1, "device_drivers": [0], "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"uuid": "client:1", "type": "copper"}, {"uuid": "client:2", "type": "copper"}, {"uuid": "client:3", "type": "copper"}, + {"uuid": "uk1.uk", "type": "copper"}, {"uuid": "fr1.fr", "type": "copper"}, {"uuid": "es1.es", "type": "copper"} + ]}}} + ]}}, + {"device_id": {"device_uuid": {"uuid": "es1.es"}}, "device_type": "emu-packet-router", "device_operational_status": 1, "device_drivers": [0], "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"uuid": "client:1", "type": "copper"}, {"uuid": "client:2", "type": "copper"}, {"uuid": "client:3", "type": "copper"}, + {"uuid": "it1.it", "type": "copper"}, {"uuid": "fr1.fr", "type": "copper"}, {"uuid": "pt1.pt", "type": "copper"} + ]}}} + ]}}, + {"device_id": {"device_uuid": {"uuid": "it1.it"}}, "device_type": "emu-packet-router", "device_operational_status": 1, "device_drivers": [0], "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"uuid": "client:1", "type": "copper"}, {"uuid": "client:2", "type": "copper"}, {"uuid": "client:3", "type": "copper"}, + {"uuid": "es1.es", "type": "copper"}, {"uuid": "fr1.fr", "type": "copper"}, {"uuid": "be1.be", "type": "copper"}, + {"uuid": "gr1.gr", "type": "copper"} + ]}}} + ]}}, + {"device_id": {"device_uuid": {"uuid": "gr1.gr"}}, "device_type": "emu-packet-router", "device_operational_status": 1, "device_drivers": [0], "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [ + {"uuid": "client:1", "type": "copper"}, {"uuid": "client:2", "type": "copper"}, {"uuid": "client:3", "type": "copper"}, + {"uuid": "it1.it", "type": "copper"}, {"uuid": "de1.de", "type": "copper"}, {"uuid": "be1.be", "type": "copper"} + ]}}} + ]}} + ], + "links": [ + {"link_id": {"link_uuid": {"uuid": "fr1.fr_be1.be"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 4.804849}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "fr1.fr"}}, "endpoint_uuid": {"uuid": "be1.be"}}, + {"device_id": {"device_uuid": {"uuid": "be1.be"}}, "endpoint_uuid": {"uuid": "fr1.fr"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "uk1.uk_fr1.fr"}}, "attributes": {"total_capacity_gbps": 300, "used_capacity_gbps": 55.182499}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "uk1.uk"}}, "endpoint_uuid": {"uuid": "fr1.fr"}}, + {"device_id": {"device_uuid": {"uuid": "fr1.fr"}}, "endpoint_uuid": {"uuid": "uk1.uk"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "uk1.uk_de1.de"}}, "attributes": {"total_capacity_gbps": 600, "used_capacity_gbps": 199.272255}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "uk1.uk"}}, "endpoint_uuid": {"uuid": "de1.de"}}, + {"device_id": {"device_uuid": {"uuid": "de1.de"}}, "endpoint_uuid": {"uuid": "uk1.uk"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "uk1.uk_be1.be"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 14.334868}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "uk1.uk"}}, "endpoint_uuid": {"uuid": "be1.be"}}, + {"device_id": {"device_uuid": {"uuid": "be1.be"}}, "endpoint_uuid": {"uuid": "uk1.uk"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "pt1.pt_uk1.uk"}}, "attributes": {"total_capacity_gbps": 400, "used_capacity_gbps": 51.415678}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "pt1.pt"}}, "endpoint_uuid": {"uuid": "uk1.uk"}}, + {"device_id": {"device_uuid": {"uuid": "uk1.uk"}}, "endpoint_uuid": {"uuid": "pt1.pt"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "pt1.pt_fr1.fr"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 3.733925}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "pt1.pt"}}, "endpoint_uuid": {"uuid": "fr1.fr"}}, + {"device_id": {"device_uuid": {"uuid": "fr1.fr"}}, "endpoint_uuid": {"uuid": "pt1.pt"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "pt1.pt_es1.es"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 13.32428}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "pt1.pt"}}, "endpoint_uuid": {"uuid": "es1.es"}}, + {"device_id": {"device_uuid": {"uuid": "es1.es"}}, "endpoint_uuid": {"uuid": "pt1.pt"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "it1.it_gr1.gr"}}, "attributes": {"total_capacity_gbps": 800, "used_capacity_gbps": 1.593313}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "it1.it"}}, "endpoint_uuid": {"uuid": "gr1.gr"}}, + {"device_id": {"device_uuid": {"uuid": "gr1.gr"}}, "endpoint_uuid": {"uuid": "it1.it"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "it1.it_fr1.fr"}}, "attributes": {"total_capacity_gbps": 200, "used_capacity_gbps": 98.574706}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "it1.it"}}, "endpoint_uuid": {"uuid": "fr1.fr"}}, + {"device_id": {"device_uuid": {"uuid": "fr1.fr"}}, "endpoint_uuid": {"uuid": "it1.it"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "it1.it_es1.es"}}, "attributes": {"total_capacity_gbps": 300, "used_capacity_gbps": 18.97108}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "it1.it"}}, "endpoint_uuid": {"uuid": "es1.es"}}, + {"device_id": {"device_uuid": {"uuid": "es1.es"}}, "endpoint_uuid": {"uuid": "it1.it"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "it1.it_be1.be"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 10.327772}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "it1.it"}}, "endpoint_uuid": {"uuid": "be1.be"}}, + {"device_id": {"device_uuid": {"uuid": "be1.be"}}, "endpoint_uuid": {"uuid": "it1.it"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "gr1.gr_it1.it"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 7.983659}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "gr1.gr"}}, "endpoint_uuid": {"uuid": "it1.it"}}, + {"device_id": {"device_uuid": {"uuid": "it1.it"}}, "endpoint_uuid": {"uuid": "gr1.gr"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "gr1.gr_de1.de"}}, "attributes": {"total_capacity_gbps": 5000, "used_capacity_gbps": 4930.897339}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "gr1.gr"}}, "endpoint_uuid": {"uuid": "de1.de"}}, + {"device_id": {"device_uuid": {"uuid": "de1.de"}}, "endpoint_uuid": {"uuid": "gr1.gr"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "gr1.gr_be1.be"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 0.895539}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "gr1.gr"}}, "endpoint_uuid": {"uuid": "be1.be"}}, + {"device_id": {"device_uuid": {"uuid": "be1.be"}}, "endpoint_uuid": {"uuid": "gr1.gr"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "fr1.fr_uk1.uk"}}, "attributes": {"total_capacity_gbps": 200, "used_capacity_gbps": 28.144199}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "fr1.fr"}}, "endpoint_uuid": {"uuid": "uk1.uk"}}, + {"device_id": {"device_uuid": {"uuid": "uk1.uk"}}, "endpoint_uuid": {"uuid": "fr1.fr"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "fr1.fr_pt1.pt"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 1.916587}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "fr1.fr"}}, "endpoint_uuid": {"uuid": "pt1.pt"}}, + {"device_id": {"device_uuid": {"uuid": "pt1.pt"}}, "endpoint_uuid": {"uuid": "fr1.fr"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "fr1.fr_it1.it"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 3.330747}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "fr1.fr"}}, "endpoint_uuid": {"uuid": "it1.it"}}, + {"device_id": {"device_uuid": {"uuid": "it1.it"}}, "endpoint_uuid": {"uuid": "fr1.fr"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "fr1.fr_es1.es"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 96.682749}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "fr1.fr"}}, "endpoint_uuid": {"uuid": "es1.es"}}, + {"device_id": {"device_uuid": {"uuid": "es1.es"}}, "endpoint_uuid": {"uuid": "fr1.fr"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "es1.es_pt1.pt"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 5.643483}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "es1.es"}}, "endpoint_uuid": {"uuid": "pt1.pt"}}, + {"device_id": {"device_uuid": {"uuid": "pt1.pt"}}, "endpoint_uuid": {"uuid": "es1.es"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "es1.es_it1.it"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 15.353667}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "es1.es"}}, "endpoint_uuid": {"uuid": "it1.it"}}, + {"device_id": {"device_uuid": {"uuid": "it1.it"}}, "endpoint_uuid": {"uuid": "es1.es"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "es1.es_fr1.fr"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 20.517778}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "es1.es"}}, "endpoint_uuid": {"uuid": "fr1.fr"}}, + {"device_id": {"device_uuid": {"uuid": "fr1.fr"}}, "endpoint_uuid": {"uuid": "es1.es"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "de1.de_uk1.uk"}}, "attributes": {"total_capacity_gbps": 600, "used_capacity_gbps": 239.446965}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "de1.de"}}, "endpoint_uuid": {"uuid": "uk1.uk"}}, + {"device_id": {"device_uuid": {"uuid": "uk1.uk"}}, "endpoint_uuid": {"uuid": "de1.de"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "de1.de_gr1.gr"}}, "attributes": {"total_capacity_gbps": 2100, "used_capacity_gbps": 110.602237}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "de1.de"}}, "endpoint_uuid": {"uuid": "gr1.gr"}}, + {"device_id": {"device_uuid": {"uuid": "gr1.gr"}}, "endpoint_uuid": {"uuid": "de1.de"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "de1.de_be1.be"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 57.709307}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "de1.de"}}, "endpoint_uuid": {"uuid": "be1.be"}}, + {"device_id": {"device_uuid": {"uuid": "be1.be"}}, "endpoint_uuid": {"uuid": "de1.de"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "uk1.uk_pt1.pt"}}, "attributes": {"total_capacity_gbps": 800, "used_capacity_gbps": 652.70225}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "uk1.uk"}}, "endpoint_uuid": {"uuid": "pt1.pt"}}, + {"device_id": {"device_uuid": {"uuid": "pt1.pt"}}, "endpoint_uuid": {"uuid": "uk1.uk"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "be1.be_uk1.uk"}}, "attributes": {"total_capacity_gbps": 200, "used_capacity_gbps": 8.252107}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "be1.be"}}, "endpoint_uuid": {"uuid": "uk1.uk"}}, + {"device_id": {"device_uuid": {"uuid": "uk1.uk"}}, "endpoint_uuid": {"uuid": "be1.be"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "be1.be_it1.it"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 0.357069}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "be1.be"}}, "endpoint_uuid": {"uuid": "it1.it"}}, + {"device_id": {"device_uuid": {"uuid": "it1.it"}}, "endpoint_uuid": {"uuid": "be1.be"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "be1.be_de1.de"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 20.400142}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "be1.be"}}, "endpoint_uuid": {"uuid": "de1.de"}}, + {"device_id": {"device_uuid": {"uuid": "de1.de"}}, "endpoint_uuid": {"uuid": "be1.be"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "be1.be_fr1.fr"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 31.346514}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "be1.be"}}, "endpoint_uuid": {"uuid": "fr1.fr"}}, + {"device_id": {"device_uuid": {"uuid": "fr1.fr"}}, "endpoint_uuid": {"uuid": "be1.be"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "be1.be_gr1.gr"}}, "attributes": {"total_capacity_gbps": 100, "used_capacity_gbps": 0.026822}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "be1.be"}}, "endpoint_uuid": {"uuid": "gr1.gr"}}, + {"device_id": {"device_uuid": {"uuid": "gr1.gr"}}, "endpoint_uuid": {"uuid": "be1.be"}} + ]} + ] +} diff --git a/src/dlt/gateway/samples/topo4.json b/src/dlt/gateway/samples/topo4.json new file mode 100644 index 000000000..85bbad55e --- /dev/null +++ b/src/dlt/gateway/samples/topo4.json @@ -0,0 +1,150 @@ +{ + "contexts": [ + {"context_id": {"context_uuid": {"uuid": "admin"}}} + ], + "topologies": [ + {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}} + ], + "devices": [ + { + "device_id": {"device_uuid": {"uuid": "T1"}}, "device_type": "optical-transponder", "device_drivers": [11], + "device_operational_status": 1, + "device_endpoints": [ + {"endpoint_id": { + "device_id": {"device_uuid": {"uuid": "T1"}}, "endpoint_uuid": {"uuid": "1"}, + "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}} + }} + ], + "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.254.253.101"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "2022"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { + "username": "admin", "password": "admin", "force_running": false, "hostkey_verify": false, + "look_for_keys": false, "allow_agent": false, "commit_per_rule": false, + "device_params": {"name": "default"}, "manager_params": {"timeout": 120}, + "endpoints": [{"uuid": "1", "type": "optical", "sample_types": [101, 102, 201, 202]}] + }}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "T2"}}, "device_type": "optical-transponder", "device_drivers": [11], + "device_operational_status": 1, + "device_endpoints": [ + {"endpoint_id": { + "device_id": {"device_uuid": {"uuid": "T2"}}, "endpoint_uuid": {"uuid": "6"}, + "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}} + }} + ], + "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.254.253.102"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "2022"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { + "username": "admin", "password": "admin", "force_running": false, "hostkey_verify": false, + "look_for_keys": false, "allow_agent": false, "commit_per_rule": false, + "device_params": {"name": "default"}, "manager_params": {"timeout": 120}, + "endpoints": [{"uuid": "6", "type": "optical", "sample_types": [101, 102, 201, 202]}] + }}} + ]} + }, + { + "device_id": {"device_uuid": {"uuid": "R1"}}, "device_type": "optical-roadm", "device_drivers": [11], + "device_operational_status": 1, + "device_endpoints": [ + {"endpoint_id": { + "device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "2"}, + "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}} + }}, + {"endpoint_id": { + "device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "3"}, + "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}} + }}, + {"endpoint_id": { + "device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "12"}, + "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}} + }}, + {"endpoint_id": { + "device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "13"}, + "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}} + }} + ], + "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.254.253.201"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "2022"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { + "username": "admin", "password": "admin", "force_running": false, "hostkey_verify": false, + "look_for_keys": false, "allow_agent": false, "commit_per_rule": false, + "device_params": {"name": "default"}, "manager_params": {"timeout": 120}, + "endpoints": [ + {"sample_types": [101, 102, 201, 202], "type": "optical", "uuid": "2"}, + {"sample_types": [101, 102, 201, 202], "type": "optical", "uuid": "3"}, + {"sample_types": [101, 102, 201, 202], "type": "optical", "uuid": "12"}, + {"sample_types": [101, 102, 201, 202], "type": "optical", "uuid": "13"} + ]} + }}] + } + }, + { + "device_id": {"device_uuid": {"uuid": "R2"}}, "device_type": "optical-roadm", "device_drivers": [11], + "device_operational_status": 1, + "device_endpoints": [ + {"endpoint_id": { + "device_id": {"device_uuid": {"uuid": "R2"}}, "endpoint_uuid": {"uuid": "4"}, + "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}} + }}, + {"endpoint_id": { + "device_id": {"device_uuid": {"uuid": "R2"}}, "endpoint_uuid": {"uuid": "5"}, + "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}} + }}, + {"endpoint_id": { + "device_id": {"device_uuid": {"uuid": "R2"}}, "endpoint_uuid": {"uuid": "14"}, + "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}} + }}, + {"endpoint_id": { + "device_id": {"device_uuid": {"uuid": "R2"}}, "endpoint_uuid": {"uuid": "15"}, + "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}} + }} + ], + "device_config": {"config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.254.253.202"}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "2022"}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { + "username": "admin", "password": "admin", "force_running": false, "hostkey_verify": false, + "look_for_keys": false, "allow_agent": false, "commit_per_rule": false, + "device_params": {"name": "default"}, "manager_params": {"timeout": 120}, + "endpoints": [ + {"sample_types": [101, 102, 201, 202], "type": "optical", "uuid": "4"}, + {"sample_types": [101, 102, 201, 202], "type": "optical", "uuid": "5"}, + {"sample_types": [101, 102, 201, 202], "type": "optical", "uuid": "14"}, + {"sample_types": [101, 102, 201, 202], "type": "optical", "uuid": "15"} + ] + }}} + ]} + } + ], + "links": [ + {"link_id": {"link_uuid": {"uuid": "T1->R1"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "T1"}}, "endpoint_uuid": {"uuid": "1"}}, + {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "12"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R1->T1"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "2"}}, + {"device_id": {"device_uuid": {"uuid": "T1"}}, "endpoint_uuid": {"uuid": "1"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R1->R2"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "3"}}, + {"device_id": {"device_uuid": {"uuid": "R2"}}, "endpoint_uuid": {"uuid": "14"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R2->R1"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R2"}}, "endpoint_uuid": {"uuid": "4"}}, + {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "13"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "T2->R2"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "T2"}}, "endpoint_uuid": {"uuid": "6"}}, + {"device_id": {"device_uuid": {"uuid": "R2"}}, "endpoint_uuid": {"uuid": "15"}} + ]}, + {"link_id": {"link_uuid": {"uuid": "R2->T2"}}, "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "R2"}}, "endpoint_uuid": {"uuid": "5"}}, + {"device_id": {"device_uuid": {"uuid": "T2"}}, "endpoint_uuid": {"uuid": "6"}} + ]} + ] +} diff --git a/src/dlt/gateway/samples/updatedTopo.json b/src/dlt/gateway/samples/updatedTopo.json new file mode 100644 index 000000000..17f927c89 --- /dev/null +++ b/src/dlt/gateway/samples/updatedTopo.json @@ -0,0 +1,17 @@ +{ + "name": "Updated Network", + "nodes": [ + { + "id": "node1", + "type": "switch", + "status": "active", + "connections": ["node2"] + }, + { + "id": "node2", + "type": "router", + "status": "inactive", + "connections": ["node1"] + } + ] +} \ No newline at end of file diff --git a/src/dlt/gateway/settings.gradle.kts b/src/dlt/gateway/settings.gradle.kts deleted file mode 100644 index 77fa0f0b2..000000000 --- a/src/dlt/gateway/settings.gradle.kts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * 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. - */ - - -rootProject.name = "gateway" - diff --git a/src/dlt/gateway/src/main/kotlin/Main.kt b/src/dlt/gateway/src/main/kotlin/Main.kt deleted file mode 100644 index c57c9e980..000000000 --- a/src/dlt/gateway/src/main/kotlin/Main.kt +++ /dev/null @@ -1,161 +0,0 @@ -// NEC Laboratories Europe GmbH -// -// PROPRIETARY INFORMATION -// -// The software and its source code contain valuable trade secrets and -// shall be maintained in confidence and treated as confidential -// information. The software may only be used for evaluation and/or -// testing purposes, unless otherwise explicitly stated in a written -// agreement with NEC Laboratories Europe GmbH. -// -// Any unauthorized publication, transfer to third parties or -// duplication of the object or source code - either totally or in -// part - is strictly prohibited. -// -// Copyright (c) 2022 NEC Laboratories Europe GmbH -// All Rights Reserved. -// -// Authors: Konstantin Munichev -// -// -// NEC Laboratories Europe GmbH DISCLAIMS ALL WARRANTIES, EITHER -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES -// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND THE -// WARRANTY AGAINST LATENT DEFECTS, WITH RESPECT TO THE PROGRAM AND -// THE ACCOMPANYING DOCUMENTATION. -// -// NO LIABILITIES FOR CONSEQUENTIAL DAMAGES: IN NO EVENT SHALL NEC -// Laboratories Europe GmbH or ANY OF ITS SUBSIDIARIES BE LIABLE FOR -// ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR -// LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF -// INFORMATION, OR OTHER PECUNIARY LOSS AND INDIRECT, CONSEQUENTIAL, -// INCIDENTAL, ECONOMIC OR PUNITIVE DAMAGES) ARISING OUT OF THE USE OF -// OR INABILITY TO USE THIS PROGRAM, EVEN IF NEC Laboratories Europe -// GmbH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -// -// THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. - -import context.ContextOuterClass -import io.grpc.ManagedChannel -import io.grpc.ManagedChannelBuilder -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking -import dlt.DltGateway -import dlt.DltGatewayServiceGrpcKt -import java.io.Closeable -import java.util.* -import java.util.concurrent.TimeUnit - -class DltServiceClient(private val channel: ManagedChannel) : Closeable { - private val stub: DltGatewayServiceGrpcKt.DltGatewayServiceCoroutineStub = - DltGatewayServiceGrpcKt.DltGatewayServiceCoroutineStub(channel) - - suspend fun putData(data: DltGateway.DltRecord) { - println("Sending record ${data.recordId}...") - val response = stub.recordToDlt(data) - println("Response: ${response.recordId}") - } - - suspend fun getData(id: DltGateway.DltRecordId) { - println("Requesting record $id...") - val response = stub.getFromDlt(id) - println("Got data: $response") - } - - fun subscribe(filter: DltGateway.DltRecordSubscription) { - val subscription = stub.subscribeToDlt(filter) - GlobalScope.launch { - subscription.collect { - println("Got subscription event") - println(it) - } - } - } - - override fun close() { - channel.shutdown().awaitTermination(5, TimeUnit.SECONDS) - } -} - - -fun main() = runBlocking { - val port = 50051 - val channel = ManagedChannelBuilder.forAddress("localhost", port).usePlaintext().build() - - val client = DltServiceClient(channel) - - val domainUuid = UUID.randomUUID().toString() - val recordUuid = UUID.randomUUID().toString() - println("New domain uuid $domainUuid") - println("New record uuid $recordUuid") - - val id = DltGateway.DltRecordId.newBuilder() - .setDomainUuid( - ContextOuterClass.Uuid.newBuilder() - .setUuid(domainUuid) - ) - .setRecordUuid( - ContextOuterClass.Uuid.newBuilder() - .setUuid(recordUuid) - ) - .setType(DltGateway.DltRecordTypeEnum.DLTRECORDTYPE_SERVICE) - .build() - - val subscription = DltGateway.DltRecordSubscription.newBuilder() - .addType(DltGateway.DltRecordTypeEnum.DLTRECORDTYPE_CONTEXT) - .addType(DltGateway.DltRecordTypeEnum.DLTRECORDTYPE_LINK) - .addType(DltGateway.DltRecordTypeEnum.DLTRECORDTYPE_SERVICE) - .addOperation(DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_ADD) - .addOperation(DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_UPDATE) - .addOperation(DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_DELETE) - .build() - - client.subscribe(subscription) - - Thread.sleep(5000) - - val data = DltGateway.DltRecord.newBuilder() - .setRecordId(id) - .setOperation(DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_ADD) - .setDataJson("\"{\"device_config\": {\"config_rules\": []}, \"device_drivers\": []," + - "\"device_endpoints\": [], \"device_id\": {\"device_uuid\": {\"uuid\": \"dev-12345\"}}," + - "\"device_operational_status\": \"DEVICEOPERATIONALSTATUS_ENABLED\"," + - "\"device_type\": \"packet-router\"}\", \"operation\": \"DLTRECORDOPERATION_ADD\"," + - "\"record_id\": {\"domain_uuid\": {\"uuid\": \"tfs-a\"}, \"record_uuid\": {\"uuid\": \"dev-12345\"}," + - "\"type\": \"DLTRECORDTYPE_DEVICE\"}") - .build() - - println("sending new record") - client.putData(data) - client.getData(id) - - Thread.sleep(5000) - - val updateData = DltGateway.DltRecord.newBuilder() - .setRecordId(id) - .setOperation(DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_UPDATE) - .setDataJson("{\"name\": \"test\"}") - .build() - - println("updating record") - client.putData(updateData) - client.getData(id) - - Thread.sleep(5000) - - val removeData = DltGateway.DltRecord.newBuilder() - .setRecordId(id) - .setOperation(DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_DELETE) - .setDataJson("{\"name\": \"test\"}") - .build() - - println("removing record") - client.putData(removeData) - try { - client.getData(id) - } catch (e: Exception) { - println(e.toString()) - } - Thread.sleep(5000) -} diff --git a/src/dlt/gateway/src/main/kotlin/fabric/ConnectGateway.kt b/src/dlt/gateway/src/main/kotlin/fabric/ConnectGateway.kt deleted file mode 100644 index 00ec40d57..000000000 --- a/src/dlt/gateway/src/main/kotlin/fabric/ConnectGateway.kt +++ /dev/null @@ -1,54 +0,0 @@ -// NEC Laboratories Europe GmbH -// -// PROPRIETARY INFORMATION -// -// The software and its source code contain valuable trade secrets and -// shall be maintained in confidence and treated as confidential -// information. The software may only be used for evaluation and/or -// testing purposes, unless otherwise explicitly stated in a written -// agreement with NEC Laboratories Europe GmbH. -// -// Any unauthorized publication, transfer to third parties or -// duplication of the object or source code - either totally or in -// part - is strictly prohibited. -// -// Copyright (c) 2022 NEC Laboratories Europe GmbH -// All Rights Reserved. -// -// Authors: Konstantin Munichev -// -// -// NEC Laboratories Europe GmbH DISCLAIMS ALL WARRANTIES, EITHER -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES -// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND THE -// WARRANTY AGAINST LATENT DEFECTS, WITH RESPECT TO THE PROGRAM AND -// THE ACCOMPANYING DOCUMENTATION. -// -// NO LIABILITIES FOR CONSEQUENTIAL DAMAGES: IN NO EVENT SHALL NEC -// Laboratories Europe GmbH or ANY OF ITS SUBSIDIARIES BE LIABLE FOR -// ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR -// LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF -// INFORMATION, OR OTHER PECUNIARY LOSS AND INDIRECT, CONSEQUENTIAL, -// INCIDENTAL, ECONOMIC OR PUNITIVE DAMAGES) ARISING OUT OF THE USE OF -// OR INABILITY TO USE THIS PROGRAM, EVEN IF NEC Laboratories Europe -// GmbH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -// -// THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. - -package fabric - -import org.hyperledger.fabric.gateway.Contract -import org.hyperledger.fabric.gateway.Gateway -import org.hyperledger.fabric.gateway.Wallet -import java.nio.file.Paths - -// helper function for getting connected to the gateway -fun getContract(config: proto.Config.DltConfig, wallet: Wallet): Contract { - // load a CCP - val networkConfigPath = Paths.get(config.connectionFile) - val builder = Gateway.createBuilder() - builder.identity(wallet, config.user).networkConfig(networkConfigPath).discovery(true) - val gateway = builder.connect() - val network = gateway.getNetwork(config.channel) - return network.getContract(config.contract) -} \ No newline at end of file diff --git a/src/dlt/gateway/src/main/kotlin/fabric/EnrollAdmin.kt b/src/dlt/gateway/src/main/kotlin/fabric/EnrollAdmin.kt deleted file mode 100644 index b44202719..000000000 --- a/src/dlt/gateway/src/main/kotlin/fabric/EnrollAdmin.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright IBM Corp. All Rights Reserved. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -package fabric - -import org.hyperledger.fabric.gateway.Identities -import org.hyperledger.fabric.gateway.Wallet -import org.hyperledger.fabric_ca.sdk.EnrollmentRequest -import org.hyperledger.fabric_ca.sdk.HFCAClient - -fun enrollAdmin(config: proto.Config.DltConfig, caClient: HFCAClient, wallet: Wallet) { - // Check to see if we've already enrolled the admin user. - if (wallet.get(config.caAdmin) != null) { - println("An identity for the admin user ${config.caAdmin} already exists in the wallet") - return - } - - // Enroll the admin user, and import the new identity into the wallet. - val enrollmentRequestTLS = EnrollmentRequest() - enrollmentRequestTLS.addHost(config.caUrl) - enrollmentRequestTLS.profile = "tls" - val enrollment = caClient.enroll(config.caAdmin, config.caAdminSecret, enrollmentRequestTLS) - val user = Identities.newX509Identity(config.msp, enrollment) - wallet.put(config.caAdmin, user) - println("Successfully enrolled user ${config.caAdmin} and imported it into the wallet") -} diff --git a/src/dlt/gateway/src/main/kotlin/fabric/FabricConnector.kt b/src/dlt/gateway/src/main/kotlin/fabric/FabricConnector.kt deleted file mode 100644 index af6592be9..000000000 --- a/src/dlt/gateway/src/main/kotlin/fabric/FabricConnector.kt +++ /dev/null @@ -1,178 +0,0 @@ -// NEC Laboratories Europe GmbH -// -// PROPRIETARY INFORMATION -// -// The software and its source code contain valuable trade secrets and -// shall be maintained in confidence and treated as confidential -// information. The software may only be used for evaluation and/or -// testing purposes, unless otherwise explicitly stated in a written -// agreement with NEC Laboratories Europe GmbH. -// -// Any unauthorized publication, transfer to third parties or -// duplication of the object or source code - either totally or in -// part - is strictly prohibited. -// -// Copyright (c) 2022 NEC Laboratories Europe GmbH -// All Rights Reserved. -// -// Authors: Konstantin Munichev -// -// -// NEC Laboratories Europe GmbH DISCLAIMS ALL WARRANTIES, EITHER -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES -// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND THE -// WARRANTY AGAINST LATENT DEFECTS, WITH RESPECT TO THE PROGRAM AND -// THE ACCOMPANYING DOCUMENTATION. -// -// NO LIABILITIES FOR CONSEQUENTIAL DAMAGES: IN NO EVENT SHALL NEC -// Laboratories Europe GmbH or ANY OF ITS SUBSIDIARIES BE LIABLE FOR -// ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR -// LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF -// INFORMATION, OR OTHER PECUNIARY LOSS AND INDIRECT, CONSEQUENTIAL, -// INCIDENTAL, ECONOMIC OR PUNITIVE DAMAGES) ARISING OUT OF THE USE OF -// OR INABILITY TO USE THIS PROGRAM, EVEN IF NEC Laboratories Europe -// GmbH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -// -// THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. - -package fabric - -import context.ContextOuterClass -import dlt.DltGateway.DltRecord -import dlt.DltGateway.DltRecordEvent -import kotlinx.coroutines.channels.Channel -import kotlinx.coroutines.runBlocking -import org.hyperledger.fabric.gateway.Contract -import org.hyperledger.fabric.gateway.ContractEvent -import org.hyperledger.fabric.gateway.Wallet -import org.hyperledger.fabric.gateway.Wallets -import org.hyperledger.fabric.sdk.security.CryptoSuiteFactory -import org.hyperledger.fabric_ca.sdk.HFCAClient -import proto.Config -import java.nio.file.Paths -import java.util.* -import java.util.function.Consumer - -class FabricConnector(val config: Config.DltConfig) { - private val caClient: HFCAClient - private val wallet: Wallet - private val contract: Contract - - private val channels: MutableList> = mutableListOf() - - private val encoder: Base64.Encoder = Base64.getEncoder() - private val decoder: Base64.Decoder = Base64.getDecoder() - - init { - // Create a CA client for interacting with the CA. - val props = Properties() - props["pemFile"] = config.caCertFile - props["allowAllHostNames"] = "true" - caClient = HFCAClient.createNewInstance(config.caUrl, props) - val cryptoSuite = CryptoSuiteFactory.getDefault().cryptoSuite - caClient.cryptoSuite = cryptoSuite - - // Create a wallet for managing identities - wallet = Wallets.newFileSystemWallet(Paths.get(config.wallet)) - contract = connect() - - fabricSubscribe() - } - - private fun fabricSubscribe() { - val consumer = Consumer { event: ContractEvent? -> - run { - println("new event detected") - val record = DltRecord.parseFrom(decoder.decode(event?.payload?.get())) - println(record.recordId.recordUuid) - val eventType: ContextOuterClass.EventTypeEnum = when (event?.name) { - "Add" -> ContextOuterClass.EventTypeEnum.EVENTTYPE_CREATE - "Update" -> ContextOuterClass.EventTypeEnum.EVENTTYPE_UPDATE - "Remove" -> ContextOuterClass.EventTypeEnum.EVENTTYPE_REMOVE - else -> ContextOuterClass.EventTypeEnum.EVENTTYPE_UNDEFINED - } - val pbEvent = DltRecordEvent.newBuilder() - .setEvent( - ContextOuterClass.Event.newBuilder() - .setTimestamp( - ContextOuterClass.Timestamp.newBuilder() - .setTimestamp(System.currentTimeMillis().toDouble()) - ) - .setEventType(eventType) - ) - .setRecordId(record.recordId) - .build() - - runBlocking { - channels.forEach { - it.trySend(pbEvent) - } - } - } - } - contract.addContractListener(consumer) - } - - fun connect(): Contract { - enrollAdmin(config, caClient, wallet) - registerUser(config, caClient, wallet) - return getContract(config, wallet) - } - - fun putData(record: DltRecord): String { - println(record.toString()) - - try { - contract.submitTransaction( - "AddRecord", - record.recordId.recordUuid.uuid, - encoder.encodeToString(record.toByteArray()) - ) - } catch (e: Exception) { - println(e.toString()) - return e.toString() - } - return "" - } - - fun getData(uuid: String): DltRecord { - return try { - val result = contract.evaluateTransaction("GetRecord", uuid) - DltRecord.parseFrom(decoder.decode(result)) - } catch (e: Exception) { - println(e.toString()) - DltRecord.getDefaultInstance() - } - } - - fun updateData(record: DltRecord): String { - try { - contract.submitTransaction( - "UpdateRecord", - record.recordId.recordUuid.uuid, - encoder.encodeToString(record.toByteArray()) - ) - } catch (e: Exception) { - return e.toString() - } - return "" - } - - fun deleteData(record: DltRecord): String { - try { - contract.submitTransaction( - "DeleteRecord", - record.recordId.recordUuid.uuid, - ) - } catch (e: Exception) { - return e.toString() - } - return "" - } - - fun subscribeForEvents(): Channel { - val produceCh = Channel() - channels.add(produceCh) - return produceCh - } -} \ No newline at end of file diff --git a/src/dlt/gateway/src/main/kotlin/fabric/RegisterUser.kt b/src/dlt/gateway/src/main/kotlin/fabric/RegisterUser.kt deleted file mode 100644 index fb5cc2969..000000000 --- a/src/dlt/gateway/src/main/kotlin/fabric/RegisterUser.kt +++ /dev/null @@ -1,65 +0,0 @@ -/* -SPDX-License-Identifier: Apache-2.0 -*/ -package fabric - -import org.hyperledger.fabric.gateway.Identities -import org.hyperledger.fabric.gateway.Wallet -import org.hyperledger.fabric.gateway.X509Identity -import org.hyperledger.fabric.sdk.Enrollment -import org.hyperledger.fabric.sdk.User -import org.hyperledger.fabric_ca.sdk.HFCAClient -import org.hyperledger.fabric_ca.sdk.RegistrationRequest -import java.security.PrivateKey - -fun registerUser(config: proto.Config.DltConfig, caClient: HFCAClient, wallet: Wallet) { - // Check to see if we've already enrolled the user. - if (wallet[config.user] != null) { - println("An identity for the user ${config.user} already exists in the wallet") - return - } - val adminIdentity = wallet[config.caAdmin] as X509Identity - val admin = object : User { - override fun getName(): String { - return config.caAdmin - } - - override fun getRoles(): Set? { - return null - } - - override fun getAccount(): String? { - return null - } - - override fun getAffiliation(): String { - return config.affiliation - } - - override fun getEnrollment(): Enrollment { - return object : Enrollment { - override fun getKey(): PrivateKey { - return adminIdentity.privateKey - } - - override fun getCert(): String { - return Identities.toPemString(adminIdentity.certificate) - } - } - } - - override fun getMspId(): String { - return config.msp - } - } - - // Register the user, enroll the user, and import the new identity into the wallet. - val registrationRequest = RegistrationRequest(config.user) - registrationRequest.affiliation = config.affiliation - registrationRequest.enrollmentID = config.user - val enrollmentSecret = caClient.register(registrationRequest, admin) - val enrollment = caClient.enroll(config.user, enrollmentSecret) - val user = Identities.newX509Identity(config.msp, enrollment) - wallet.put(config.user, user) - println("Successfully enrolled user ${config.user} and imported it into the wallet") -} diff --git a/src/dlt/gateway/src/main/kotlin/grpc/FabricServer.kt b/src/dlt/gateway/src/main/kotlin/grpc/FabricServer.kt deleted file mode 100644 index 9b4e1f4dc..000000000 --- a/src/dlt/gateway/src/main/kotlin/grpc/FabricServer.kt +++ /dev/null @@ -1,94 +0,0 @@ -// NEC Laboratories Europe GmbH -// -// PROPRIETARY INFORMATION -// -// The software and its source code contain valuable trade secrets and -// shall be maintained in confidence and treated as confidential -// information. The software may only be used for evaluation and/or -// testing purposes, unless otherwise explicitly stated in a written -// agreement with NEC Laboratories Europe GmbH. -// -// Any unauthorized publication, transfer to third parties or -// duplication of the object or source code - either totally or in -// part - is strictly prohibited. -// -// Copyright (c) 2022 NEC Laboratories Europe GmbH -// All Rights Reserved. -// -// Authors: Konstantin Munichev -// -// -// NEC Laboratories Europe GmbH DISCLAIMS ALL WARRANTIES, EITHER -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES -// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND THE -// WARRANTY AGAINST LATENT DEFECTS, WITH RESPECT TO THE PROGRAM AND -// THE ACCOMPANYING DOCUMENTATION. -// -// NO LIABILITIES FOR CONSEQUENTIAL DAMAGES: IN NO EVENT SHALL NEC -// Laboratories Europe GmbH or ANY OF ITS SUBSIDIARIES BE LIABLE FOR -// ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR -// LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF -// INFORMATION, OR OTHER PECUNIARY LOSS AND INDIRECT, CONSEQUENTIAL, -// INCIDENTAL, ECONOMIC OR PUNITIVE DAMAGES) ARISING OUT OF THE USE OF -// OR INABILITY TO USE THIS PROGRAM, EVEN IF NEC Laboratories Europe -// GmbH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -// -// THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. - -package grpc - -import fabric.FabricConnector -import io.grpc.Server -import io.grpc.ServerBuilder -import proto.Config -import kotlin.random.Random -import kotlin.random.nextUInt - -class FabricServer(val port: Int) { - private val server: Server - - init { - val id = Random.nextUInt() - val cfg = Config.DltConfig.newBuilder().setWallet("wallet$id").setConnectionFile("config/connection-org1.json") - .setUser("appUser$id") - .setChannel("dlt") - .setContract("basic").setCaCertFile("config/ca.org1.example.com-cert.pem").setCaUrl("https://teraflow.nlehd.de:7054") - .setCaAdmin("admin").setCaAdminSecret("adminpw").setMsp("Org1MSP").setAffiliation("org1.department1") - .build() - val connector = FabricConnector(cfg) - - val dltService = DLTService(connector) - server = ServerBuilder - .forPort(port) - .addService(dltService) - .build() - - } - - fun start() { - server.start() - println("Server started, listening on $port") - Runtime.getRuntime().addShutdownHook( - Thread { - println("Shutting down...") - this@FabricServer.stop() - println("Server shut down") - } - ) - } - - private fun stop() { - server.shutdown() - } - - fun blockUntilShutdown() { - server.awaitTermination() - } -} - -fun main() { - val port = 50051 - val server = FabricServer(port) - server.start() - server.blockUntilShutdown() -} diff --git a/src/dlt/gateway/src/main/kotlin/grpc/GrpcHandler.kt b/src/dlt/gateway/src/main/kotlin/grpc/GrpcHandler.kt deleted file mode 100644 index d39c24a1a..000000000 --- a/src/dlt/gateway/src/main/kotlin/grpc/GrpcHandler.kt +++ /dev/null @@ -1,95 +0,0 @@ -// NEC Laboratories Europe GmbH -// -// PROPRIETARY INFORMATION -// -// The software and its source code contain valuable trade secrets and -// shall be maintained in confidence and treated as confidential -// information. The software may only be used for evaluation and/or -// testing purposes, unless otherwise explicitly stated in a written -// agreement with NEC Laboratories Europe GmbH. -// -// Any unauthorized publication, transfer to third parties or -// duplication of the object or source code - either totally or in -// part - is strictly prohibited. -// -// Copyright (c) 2022 NEC Laboratories Europe GmbH -// All Rights Reserved. -// -// Authors: Konstantin Munichev -// -// -// NEC Laboratories Europe GmbH DISCLAIMS ALL WARRANTIES, EITHER -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES -// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND THE -// WARRANTY AGAINST LATENT DEFECTS, WITH RESPECT TO THE PROGRAM AND -// THE ACCOMPANYING DOCUMENTATION. -// -// NO LIABILITIES FOR CONSEQUENTIAL DAMAGES: IN NO EVENT SHALL NEC -// Laboratories Europe GmbH or ANY OF ITS SUBSIDIARIES BE LIABLE FOR -// ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR -// LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF -// INFORMATION, OR OTHER PECUNIARY LOSS AND INDIRECT, CONSEQUENTIAL, -// INCIDENTAL, ECONOMIC OR PUNITIVE DAMAGES) ARISING OUT OF THE USE OF -// OR INABILITY TO USE THIS PROGRAM, EVEN IF NEC Laboratories Europe -// GmbH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -// -// THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. - -package grpc - -import fabric.FabricConnector -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.consumeAsFlow -import context.ContextOuterClass -import dlt.DltGateway -import dlt.DltGatewayServiceGrpcKt - -class DLTService(private val connector: FabricConnector) : - DltGatewayServiceGrpcKt.DltGatewayServiceCoroutineImplBase() { - override suspend fun recordToDlt(request: DltGateway.DltRecord): DltGateway.DltRecordStatus { - println("Incoming request ${request.recordId.recordUuid}") - val error = when (request.operation) { - DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_ADD -> { - println("Adding new record") - connector.putData(request) - } - DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_UPDATE -> { - println("Updating record") - connector.updateData(request) - } - DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_DELETE -> { - println("Deleting record") - connector.deleteData(request) - } - else -> "Undefined or unknown operation" - } - - val dltStatusEnum: DltGateway.DltRecordStatusEnum = if (error == "") { - DltGateway.DltRecordStatusEnum.DLTRECORDSTATUS_SUCCEEDED - } else { - DltGateway.DltRecordStatusEnum.DLTRECORDSTATUS_FAILED - } - return DltGateway.DltRecordStatus.newBuilder() - .setRecordId(request.recordId) - .setStatus(dltStatusEnum) - .setErrorMessage(error) - .build() - } - - override suspend fun getFromDlt(request: DltGateway.DltRecordId): DltGateway.DltRecord { - return connector.getData(request.recordUuid.uuid) - } - - override fun subscribeToDlt(request: DltGateway.DltRecordSubscription): Flow { - println("Subscription request: $request") - return connector.subscribeForEvents().consumeAsFlow() - } - - override suspend fun getDltStatus(request: ContextOuterClass.TeraFlowController): DltGateway.DltPeerStatus { - return super.getDltStatus(request) - } - - override suspend fun getDltPeers(request: ContextOuterClass.Empty): DltGateway.DltPeerStatusList { - return super.getDltPeers(request) - } -} \ No newline at end of file diff --git a/src/dlt/gateway/src/main/kotlin/proto/Config.proto b/src/dlt/gateway/src/main/kotlin/proto/Config.proto deleted file mode 100644 index b6d4c5614..000000000 --- a/src/dlt/gateway/src/main/kotlin/proto/Config.proto +++ /dev/null @@ -1,54 +0,0 @@ -// NEC Laboratories Europe GmbH -// -// PROPRIETARY INFORMATION -// -// The software and its source code contain valuable trade secrets and -// shall be maintained in confidence and treated as confidential -// information. The software may only be used for evaluation and/or -// testing purposes, unless otherwise explicitly stated in a written -// agreement with NEC Laboratories Europe GmbH. -// -// Any unauthorized publication, transfer to third parties or -// duplication of the object or source code - either totally or in -// part - is strictly prohibited. -// -// Copyright (c) 2022 NEC Laboratories Europe GmbH -// All Rights Reserved. -// -// Authors: Konstantin Munichev -// -// -// NEC Laboratories Europe GmbH DISCLAIMS ALL WARRANTIES, EITHER -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES -// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND THE -// WARRANTY AGAINST LATENT DEFECTS, WITH RESPECT TO THE PROGRAM AND -// THE ACCOMPANYING DOCUMENTATION. -// -// NO LIABILITIES FOR CONSEQUENTIAL DAMAGES: IN NO EVENT SHALL NEC -// Laboratories Europe GmbH or ANY OF ITS SUBSIDIARIES BE LIABLE FOR -// ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR -// LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF -// INFORMATION, OR OTHER PECUNIARY LOSS AND INDIRECT, CONSEQUENTIAL, -// INCIDENTAL, ECONOMIC OR PUNITIVE DAMAGES) ARISING OUT OF THE USE OF -// OR INABILITY TO USE THIS PROGRAM, EVEN IF NEC Laboratories Europe -// GmbH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -// -// THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. - -syntax = "proto3"; - -package proto; - -message DltConfig { - string wallet = 1; - string connectionFile = 2; - string user = 3; - string channel = 4; - string contract = 5; - string caCertFile = 6; - string caUrl = 7; - string caAdmin = 8; - string caAdminSecret = 9; - string msp = 10; - string affiliation = 11; -} -- GitLab From 48cb33f4ec128ff59bf2ac1567b95f413d073fa3 Mon Sep 17 00:00:00 2001 From: diazjj Date: Thu, 20 Jun 2024 12:46:02 +0200 Subject: [PATCH 267/602] Updated DLT Gateway code. Related to Issue #165 --- src/dlt/gateway/{dltApp => }/README.md | 4 ++-- src/dlt/gateway/resources/System.png | Bin 0 -> 291845 bytes 2 files changed, 2 insertions(+), 2 deletions(-) rename src/dlt/gateway/{dltApp => }/README.md (92%) create mode 100644 src/dlt/gateway/resources/System.png diff --git a/src/dlt/gateway/dltApp/README.md b/src/dlt/gateway/README.md similarity index 92% rename from src/dlt/gateway/dltApp/README.md rename to src/dlt/gateway/README.md index feee576c1..d9a29e3b6 100644 --- a/src/dlt/gateway/dltApp/README.md +++ b/src/dlt/gateway/README.md @@ -1,8 +1,8 @@ # ADRENALINE DLT App
- DLT_APP for chaincode tests
DLT_APP for chaincode tests.
diff --git a/src/dlt/gateway/resources/System.png b/src/dlt/gateway/resources/System.png new file mode 100644 index 0000000000000000000000000000000000000000..f8c6b79f08e44842e7a486ede2477b987cbeb9d7 GIT binary patch literal 291845 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
0`mI47*@tD5cxnKl3TA+U)& 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⁣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 z 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 kimS{O&&+3Q-Hc`27pg45C8xG literal 0 HcmV?d00001 -- GitLab From 78dae728a491a74c57654d0689f74374ff8324f9 Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 21 Jun 2024 10:29:05 +0200 Subject: [PATCH 268/602] Updated Readme, Ref. Issue #165 --- src/dlt/gateway/README.md | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/dlt/gateway/README.md b/src/dlt/gateway/README.md index d9a29e3b6..7206289ec 100644 --- a/src/dlt/gateway/README.md +++ b/src/dlt/gateway/README.md @@ -10,37 +10,48 @@ ## Description -The DLT app consists of a **fabricConnect.ts** TypeScript file which contains the logic for Identification management (Certificates required for the MSP), connection management to the blockchain, and finally it exposes a contract object with all the required information for interacting with the chaincode. The compiled **fabricConnect.ts** logic can be imported into a **dltGateway.js** or other testing code inside the [/tests](./tests/) folder. +The DLT app consists of a **fabricConnect.ts** TypeScript file, which contains the logic for identification management (certificates required for the MSP), connection management to the blockchain, and finally, it exposes a contract object with all the required information for interacting with the chaincode. The **fabricConnect.ts** is coded following the Fabric Gateway API recommendations from Hyperledger Fabric 2.4+. The compiled **fabricConnect.ts** logic is imported into a **dltGateway.js** file, which contains the gRPC logic for interaction with the TFS controller. Testing code for various performance tests is included inside the [/dltApp/tests](./dltApp/tests/) folder. + +The chaincode is written in Go, providing a reference for the operations that are recorded in the blockchain. This chaincode must already be deployed in a working Hyperledger Fabric blockchain. ## Requisites -NodeJS +* NodeJS +* Docker +* K8s -## Running the App +## Building the App -Install the dependencies and compile the sourcecode. +Install the dependencies and compile the source code. ```bash npm install - ``` -Run the Gateway application +## Packing the App -```bash -node .\src\dltGateway.js +The [automation](./automation/) folder contains the Dockerfiles and Kubernetes configuration files alongside deployment scripts. -``` +### Build a Docker Image -In another terminal run the test client application. +Using the Dockerfile, create a Docker image of the Gateway. ```bash -node .\src\testGateway.js +docker build -t your-username/dltgateway:v1.0.0 . +``` +If necessary, upload the Docker image to a Docker repository for convenience. (You can work with the local image if deploying the Kubernetes service on the same machine.) + +```bash +docker push your-username/dltgateway:v1.0.0 ``` -The purpose of the dltGateway is to expose the chaincode operations to gRPC connections for integration with the ADRENALINE testbed modules. +### Run the Deployment Script +Make the necessary changes to the environment variables inside the **configmap.yaml** according to the specific Fabric deployment. Also, update the path in the **persistent-volume.yaml** with the correct information. -## Performance Test +```bash +./deploy_dlt_gateway.sh +``` +Once the Kubernetes service is deployed, TFS can perform gRPC requests to as usual. \ No newline at end of file -- GitLab From 32492d843d878a98c0402a48c773e5cea644aca3 Mon Sep 17 00:00:00 2001 From: armingol Date: Fri, 21 Jun 2024 13:33:07 +0200 Subject: [PATCH 269/602] Inventory NBI in Webuo --- .../ietf_hardware/HardwareMultipleDevices.py | 36 ++++++++++++++++ .../nbi_plugins/ietf_hardware/YangHandler.py | 41 +++---------------- .../nbi_plugins/ietf_hardware/__init__.py | 8 +++- .../nbi_plugins/tfs_api/Resources.py | 9 ---- .../nbi_plugins/tfs_api/__init__.py | 10 +++-- 5 files changed, 54 insertions(+), 50 deletions(-) create mode 100644 src/nbi/service/rest_server/nbi_plugins/ietf_hardware/HardwareMultipleDevices.py diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/HardwareMultipleDevices.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/HardwareMultipleDevices.py new file mode 100644 index 000000000..5258455e5 --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/HardwareMultipleDevices.py @@ -0,0 +1,36 @@ +import logging +from flask import request +from flask.json import jsonify +from flask_restful import Resource +from common.proto.context_pb2 import Empty +from context.client.ContextClient import ContextClient +from ..tools.Authentication import HTTP_AUTH +from ..tools.HttpStatusCodes import HTTP_OK, HTTP_SERVERERROR +from .YangHandler import YangHandler + +LOGGER = logging.getLogger(__name__) + +class HardwareMultipleDevices(Resource): + @HTTP_AUTH.login_required + def get(self): + + LOGGER.debug('Request: {:s}'.format(str(request))) + + try: + context_client = ContextClient() + list_devices = context_client.ListDevices(Empty()) + LOGGER.info('Request: {:s}'.format(str(list_devices))) + hardware_list_reply = [] + yang_handler = YangHandler() + for device in list_devices.devices: + hardware_reply = yang_handler.compose(device) + hardware_list_reply.append(hardware_reply) + + yang_handler.destroy() + response = jsonify(hardware_list_reply) + response.status_code = HTTP_OK + except Exception as e: # pylint: disable=broad-except + MSG = 'Something went wrong Retrieving Hardware of Devices({:s})' + response = jsonify({'error': str(e)}) + response.status_code = HTTP_SERVERERROR + return response \ No newline at end of file diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py index 88c9887c0..f0212b01f 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py @@ -98,8 +98,12 @@ class YangHandler: component_new.create_path('serial-num', attributes["serial-num"]) component_new.create_path('mfg-name', attributes["mfg-name"]) if attributes["id"]: - component_new.create_path('parent-rel-pos', attributes["id"]) - + try: + parent_rel_pos = int(attributes["id"].replace("\"", "")) + component_new.create_path('parent-rel-pos', parent_rel_pos) + except ValueError: + continue + component_new.create_path('uri', component.name) @@ -113,39 +117,6 @@ class YangHandler: component_new.create_path('contains-child', contains_child) return hardware.print_mem('json') - - - - '''# example methods (based on openconfig, to be adapted): - #str_path = '/interfaces/interface[name={:s}]'.format(if_name) - if_name = 'my-if' - interfaces = self._yang_context.create_data_path('/openconfig-interfaces:interfaces') - my_if = interfaces.create_path('interface[name="{:s}"]'.format(if_name)) - my_if.create_path('config/name', if_name) - my_if.create_path('config/enabled', True) - - my_subifs = my_if.create_path('subinterfaces') - - subif_index = 3 - my_subif = my_subifs.create_path('subinterface[index="{:d}"]'.format(subif_index)) - my_subif.create_path('config/index', subif_index) - my_subif.create_path('config/enabled', True) - - vlan_id = 123 - my_subif_vlan = my_subif.create_path('openconfig-vlan:vlan') - my_subif_vlan.create_path('match/single-tagged/config/vlan-id', vlan_id) - - my_subif_ipv4 = my_subif.create_path('openconfig-if-ip:ipv4') - my_subif_ipv4.create_path('config/enabled', True) - - my_subif_ipv4_addrs = my_subif_ipv4.create_path('addresses') - my_ipv4_addr_ip = '10.0.1.10' - my_ipv4_addr_prefix = 24 - my_subif_ipv4_addr = my_subif_ipv4_addrs.create_path('address[ip="{:s}"]'.format(my_ipv4_addr_ip)) - my_subif_ipv4_addr.create_path('config/ip', my_ipv4_addr_ip) - my_subif_ipv4_addr.create_path('config/prefix-length', my_ipv4_addr_prefix) - - return my_if.print_mem('json')''' def destroy(self) -> None: diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py index 7f4e219ff..2b1621a2a 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py @@ -1,7 +1,11 @@ from nbi.service.rest_server.nbi_plugins.ietf_hardware.Hardware import Hardware +from nbi.service.rest_server.nbi_plugins.ietf_hardware.HardwareMultipleDevices import HardwareMultipleDevices from nbi.service.rest_server.RestServer import RestServer -URL_PREFIX = "/restconf/data/device=/ietf-hardware:hardware" +URL_PREFIX_device = "/restconf/data/device=/ietf-hardware:hardware" +URL_PREFIX_hardware = "/restconf/data/ietf-hardware:hardware" def register_ietf_hardware(rest_server: RestServer): - rest_server.add_resource(Hardware, URL_PREFIX) \ No newline at end of file + rest_server.add_resource(Hardware, URL_PREFIX_device) + rest_server.add_resource(HardwareMultipleDevices, URL_PREFIX_hardware) + \ No newline at end of file diff --git a/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py b/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py index b5fd18971..9311c915a 100644 --- a/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py +++ b/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py @@ -176,15 +176,6 @@ class Devices(_Resource): class Device(_Resource): def get(self, device_uuid : str): return format_grpc_to_json(self.client.GetDevice(grpc_device_id(device_uuid))) -class Deviceshw(_Resource): - def get(self, device_uuid : str): - device =format_grpc_to_json(self.client.GetDevice(grpc_device_id(device_uuid))) - yang_handler = YangHandler('ietf-hardware') - - hardware_reply = yang_handler.compose(device) - device = jsonify(hardware_reply) - - return device class LinkIds(_Resource): def get(self): diff --git a/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py b/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py index cbb38e6f2..569c26c4e 100644 --- a/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py +++ b/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py @@ -13,10 +13,11 @@ # limitations under the License. from nbi.service.rest_server.RestServer import RestServer +from nbi.service.rest_server.nbi_plugins.ietf_hardware import Hardware, HardwareMultipleDevices from .Resources import ( Connection, ConnectionIds, Connections, Context, ContextIds, Contexts, - Device, DeviceIds, Devices, Deviceshw, + Device, DeviceIds, Devices, DummyContexts, Link, LinkIds, Links, PolicyRule, PolicyRuleIds, PolicyRules, @@ -48,10 +49,11 @@ RESOURCES = [ ('api.slice', Slice, '/context//slice/'), ('api.device_ids', DeviceIds, '/device_ids'), - ('api.devices', Devices, '/devices'), - ('api.device', Device, '/device/'), + '''('api.devices', Devices, '/devices'),''' + '''('api.device', Device, '/device/'),''' + ('api.devices', HardwareMultipleDevices, '/devices'), + ('api.device', Hardware, '/device/'), - ('api.deviceshw', Deviceshw, '/device//hardware'), ('api.link_ids', LinkIds, '/link_ids'), ('api.links', Links, '/links'), -- GitLab From c4a662d36127782129a9d0084ee8ff4b96861f1e Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 25 Jun 2024 10:42:07 +0000 Subject: [PATCH 270/602] baisc version of README files --- src/kpi_manager/README.md | 11 +++++++---- src/telemetry/README.md | 10 ++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 src/telemetry/README.md diff --git a/src/kpi_manager/README.md b/src/kpi_manager/README.md index a97950c4b..88c52bb4f 100644 --- a/src/kpi_manager/README.md +++ b/src/kpi_manager/README.md @@ -1,7 +1,7 @@ # How to locally run and test KPI Manager service ### Pre-requisets -The following requirements should be fulfilled before the execuation of this module. +The following requirements should be fulfilled before the execuation of KPI Manager 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. @@ -10,13 +10,16 @@ The following requirements should be fulfilled before the execuation of this mod [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. ### 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 messages format used during the testing. +["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. ### 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. -### Flow of execution +### 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. 2. Call the gRPC method `SetKpiDescriptor(KpiDescriptor)->KpiId` to add the KpiDescriptor in `Kpi` DB. `KpiDescriptor` and `KpiId` are both pre-defined gRPC message types. 3. Call `GetKpiDescriptor(KpiId)->KpiDescriptor` to read the `KpiDescriptor` from DB and `DeleteKpiDescriptor(KpiId)` to delete the `KpiDescriptor` from DB. -4. Call `SelectKpiDescriptor(KpiDescriptorFilter)->KpiDescriptorList` to get all `KpiDescriptor` objects that matches the filter criteria. `KpiDescriptorFilter` and `KpiDescriptorList` are pre-defined gRPC message types. \ No newline at end of file +4. Call `SelectKpiDescriptor(KpiDescriptorFilter)->KpiDescriptorList` to get all `KpiDescriptor` objects that matches the filter criteria. `KpiDescriptorFilter` and `KpiDescriptorList` are pre-defined gRPC message types. + +## For KPI composer and KPI writer +The functionalities of KPI composer and writer is heavily dependent upon Telemetery service. Therfore, these services has other pre-requsites that are mention [here](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/telemetry/requirements.in). \ No newline at end of file diff --git a/src/telemetry/README.md b/src/telemetry/README.md new file mode 100644 index 000000000..da43bd471 --- /dev/null +++ b/src/telemetry/README.md @@ -0,0 +1,10 @@ +# How to locally run and test Telemetry service + +### Pre-requisets +The following requirements should be fulfilled before the execuation of Telemetry service. + +1. verify that [telmetry_frontend.proto](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/proto/telemetry_frontend.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/telemetry/telemetry_virenv.txt) are installed sucessfully. +3. verify the creation of required database and table. +[DB test](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/telemetry/database/tests/managementDBtests.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. -- GitLab From a741f76ff964a9ad12785440e9fb2019fd991e1b Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 28 Jun 2024 13:18:15 +0200 Subject: [PATCH 271/602] Updated the Manifest files and deployment scripts for DLT --- deploy/all.sh | 2 +- manifests/dltservice.yaml | 205 ++++++++++++++---- my_deploy.sh | 2 +- .../{automation/DockerFiles => }/Dockerfile | 0 src/dlt/gateway/README.md | 2 +- 5 files changed, 162 insertions(+), 49 deletions(-) rename src/dlt/gateway/{automation/DockerFiles => }/Dockerfile (100%) diff --git a/deploy/all.sh b/deploy/all.sh index c169bc92c..e77ff22ae 100755 --- a/deploy/all.sh +++ b/deploy/all.sh @@ -27,7 +27,7 @@ export TFS_REGISTRY_IMAGES=${TFS_REGISTRY_IMAGES:-"http://localhost:32000/tfs/"} # If not already set, set the list of components, separated by spaces, you want to build images for, and deploy. # By default, only basic components are deployed -export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device ztp monitoring pathcomp service slice nbi webui load_generator"} +export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device ztp monitoring pathcomp service slice nbi webui load_generator dlt"} # If not already set, set the tag you want to use for your images. export TFS_IMAGE_TAG=${TFS_IMAGE_TAG:-"dev"} diff --git a/manifests/dltservice.yaml b/manifests/dltservice.yaml index 34f0d53c3..5362fe6ab 100644 --- a/manifests/dltservice.yaml +++ b/manifests/dltservice.yaml @@ -12,10 +12,29 @@ # See the License for the specific language governing permissions and # limitations under the License. +apiVersion: v1 +kind: ConfigMap +metadata: + name: dlt-config + namespace: dlt +data: + CHANNEL_NAME: "channel1" + CHAINCODE_NAME: "adrenalineDLT" + MSP_ID: "Org1MSP" + PEER_ENDPOINT: "PEER_IP:PORT" + PEER_HOST_ALIAS: "peer0.org1.adrenaline.com" + CRYPTO_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com" + KEY_DIRECTORY_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/keystore" + CERT_DIRECTORY_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/signcerts" + TLS_CERT_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com/peers/peer0.org1.adrenaline.com/tls/ca.crt" + +--- + apiVersion: apps/v1 kind: Deployment metadata: name: dltservice + namespace: dlt spec: selector: matchLabels: @@ -27,62 +46,156 @@ spec: spec: terminationGracePeriodSeconds: 5 containers: - - name: connector - image: labs.etsi.org:5050/tfs/controller/dlt-connector:latest - imagePullPolicy: Always - ports: - - containerPort: 8080 - - containerPort: 9192 - env: - - name: LOG_LEVEL - value: "INFO" + - name: connector + image: labs.etsi.org:5050/tfs/controller/dlt-connector:latest + imagePullPolicy: Always + ports: + - containerPort: 8080 + - containerPort: 9192 + env: + - name: LOG_LEVEL + value: "INFO" ## for debug purposes #- name: DLT_GATEWAY_HOST # value: "mock-blockchain.tfs-bchain.svc.cluster.local" #- name: DLT_GATEWAY_PORT # value: "50051" - readinessProbe: - exec: - command: ["/bin/grpc_health_probe", "-addr=:8080"] - livenessProbe: - exec: - command: ["/bin/grpc_health_probe", "-addr=:8080"] - resources: - requests: - cpu: 50m - memory: 64Mi - limits: - cpu: 500m - memory: 512Mi - - name: gateway - image: labs.etsi.org:5050/tfs/controller/dlt-gateway:latest - imagePullPolicy: Always - ports: - - containerPort: 50051 - #readinessProbe: - # httpGet: - # path: /health - # port: 8081 - # initialDelaySeconds: 5 - # timeoutSeconds: 5 - #livenessProbe: - # httpGet: - # path: /health - # port: 8081 - # initialDelaySeconds: 5 - # timeoutSeconds: 5 - resources: - requests: - cpu: 200m - memory: 512Mi - limits: - cpu: 700m - memory: 1024Mi + readinessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:8080"] + livenessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:8080"] + resources: + requests: + cpu: 50m + memory: 64Mi + limits: + cpu: 500m + memory: 512Mi + - name: gateway + image: labs.etsi.org:5050/tfs/controller/dlt-gateway:latest + imagePullPolicy: Always + ports: + - containerPort: 50051 + resources: + requests: + cpu: 200m + memory: 512Mi + limits: + cpu: 700m + memory: 1024Mi + volumeMounts: + - mountPath: /test-network + name: dlt-volume + readOnly: true + env: + - name: CHANNEL_NAME + valueFrom: + configMapKeyRef: + name: dlt-config + key: CHANNEL_NAME + - name: CHAINCODE_NAME + valueFrom: + configMapKeyRef: + name: dlt-config + key: CHAINCODE_NAME + - name: MSP_ID + valueFrom: + configMapKeyRef: + name: dlt-config + key: MSP_ID + - name: PEER_ENDPOINT + valueFrom: + configMapKeyRef: + name: dlt-config + key: PEER_ENDPOINT + - name: PEER_HOST_ALIAS + valueFrom: + configMapKeyRef: + name: dlt-config + key: PEER_HOST_ALIAS + - name: CRYPTO_PATH + valueFrom: + configMapKeyRef: + name: dlt-config + key: CRYPTO_PATH + - name: KEY_DIRECTORY_PATH + valueFrom: + configMapKeyRef: + name: dlt-config + key: KEY_DIRECTORY_PATH + - name: CERT_DIRECTORY_PATH + valueFrom: + configMapKeyRef: + name: dlt-config + key: CERT_DIRECTORY_PATH + - name: TLS_CERT_PATH + valueFrom: + configMapKeyRef: + name: dlt-config + key: TLS_CERT_PATH + volumes: + - name: dlt-volume + persistentVolumeClaim: + claimName: dlt-pvc + --- + +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: dlt-pvc + namespace: dlt +spec: + accessModes: + - ReadOnlyMany + resources: + requests: + storage: 1Gi + +--- + +apiVersion: v1 +kind: PersistentVolume +metadata: + name: dlt-pv +spec: + capacity: + storage: 1Gi + accessModes: + - ReadOnlyMany + persistentVolumeReclaimPolicy: Retain + hostPath: + path: "/home/cttc/test-network" + claimRef: + namespace: dlt + name: dlt-pvc + +--- + +apiVersion: v1 +kind: Service +metadata: + name: gatewayservice + namespace: dlt +spec: + selector: + app: dltservice + ports: + - protocol: TCP + port: 50051 + targetPort: 50051 + nodePort: 32001 + type: NodePort + +--- + apiVersion: v1 kind: Service metadata: name: dltservice + namespace: dlt labels: app: dltservice spec: diff --git a/my_deploy.sh b/my_deploy.sh index 8417f6eae..7cd94d136 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -20,7 +20,7 @@ export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/" # Set the list of components, separated by spaces, you want to build images for, and deploy. -export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_generator" +export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_generator dlt" # Uncomment to activate Monitoring #export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" diff --git a/src/dlt/gateway/automation/DockerFiles/Dockerfile b/src/dlt/gateway/Dockerfile similarity index 100% rename from src/dlt/gateway/automation/DockerFiles/Dockerfile rename to src/dlt/gateway/Dockerfile diff --git a/src/dlt/gateway/README.md b/src/dlt/gateway/README.md index 7206289ec..401e17864 100644 --- a/src/dlt/gateway/README.md +++ b/src/dlt/gateway/README.md @@ -54,4 +54,4 @@ Make the necessary changes to the environment variables inside the **configmap.y ./deploy_dlt_gateway.sh ``` -Once the Kubernetes service is deployed, TFS can perform gRPC requests to as usual. \ No newline at end of file +Once the Kubernetes service is deployed, TFS can perform gRPC requests to as usual. \ No newline at end of file -- GitLab From 2c606fb2becb38a3a65a346eab56368bc70bde89 Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 28 Jun 2024 13:20:27 +0200 Subject: [PATCH 272/602] Updated deployment Script --- my_deploy.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/my_deploy.sh b/my_deploy.sh index 7cd94d136..d18c5db7f 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -106,7 +106,7 @@ export CRDB_DATABASE="tfs" export CRDB_DEPLOY_MODE="single" # Disable flag for dropping database, if it exists. -export CRDB_DROP_DATABASE_IF_EXISTS="" +export CRDB_DROP_DATABASE_IF_EXISTS="YES" # Disable flag for re-deploying CockroachDB from scratch. export CRDB_REDEPLOY="" @@ -154,7 +154,7 @@ export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis" export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups" # Disable flag for dropping tables if they exist. -export QDB_DROP_TABLES_IF_EXIST="" +export QDB_DROP_TABLES_IF_EXIST="YES" # Disable flag for re-deploying QuestDB from scratch. export QDB_REDEPLOY="" -- GitLab From dde6c4ed98241e44585c8d625977f7baf0060116 Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 28 Jun 2024 13:39:16 +0200 Subject: [PATCH 273/602] Updated deployment scripts --- deploy/tfs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/tfs.sh b/deploy/tfs.sh index 3fdbe77fb..57d647cde 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -27,7 +27,7 @@ export TFS_REGISTRY_IMAGES=${TFS_REGISTRY_IMAGES:-"http://localhost:32000/tfs/"} # If not already set, set the list of components, separated by spaces, you want to build images for, and deploy. # By default, only basic components are deployed -export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device ztp monitoring pathcomp service slice nbi webui load_generator"} +export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device ztp monitoring pathcomp service slice nbi webui load_generator dlt"} # If not already set, set the tag you want to use for your images. export TFS_IMAGE_TAG=${TFS_IMAGE_TAG:-"dev"} -- GitLab From fb62c881df96a7cf53a7ac352fa0a25b03d8b066 Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 28 Jun 2024 15:09:33 +0200 Subject: [PATCH 274/602] Updated tfs.sh deployment exists to control building of docker images --- deploy/tfs.sh | 113 +++++++++++++++++++++++++++----------------------- 1 file changed, 61 insertions(+), 52 deletions(-) diff --git a/deploy/tfs.sh b/deploy/tfs.sh index 57d647cde..e81b946c8 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -45,6 +45,10 @@ export TFS_GRAFANA_PASSWORD=${TFS_GRAFANA_PASSWORD:-"admin123+"} # If TFS_SKIP_BUILD is "YES", the containers are not rebuilt-retagged-repushed and existing ones are used. export TFS_SKIP_BUILD=${TFS_SKIP_BUILD:-""} +# If not already set, disable build-if-exists flag to skip building Docker images if they already exist. +# If TFS_BUILD_IF_EXISTS is "NO", the containers are not rebuilt if they already exist. +export TFS_BUILD_IF_EXISTS=${TFS_BUILD_IF_EXISTS:-"NO"} + # ----- CockroachDB ------------------------------------------------------------ @@ -208,72 +212,77 @@ for COMPONENT in $TFS_COMPONENTS; do echo "Processing '$COMPONENT' component..." if [ "$TFS_SKIP_BUILD" != "YES" ]; then - echo " Building Docker image..." - BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}.log" - - if [ "$COMPONENT" == "ztp" ] || [ "$COMPONENT" == "policy" ]; then - $DOCKER_BUILD -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile ./src/"$COMPONENT"/ > "$BUILD_LOG" - elif [ "$COMPONENT" == "pathcomp" ]; then - BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-frontend.log" - $DOCKER_BUILD -t "$COMPONENT-frontend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/frontend/Dockerfile . > "$BUILD_LOG" - - BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-backend.log" - $DOCKER_BUILD -t "$COMPONENT-backend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/backend/Dockerfile . > "$BUILD_LOG" - # next command is redundant, but helpful to keep cache updated between rebuilds - IMAGE_NAME="$COMPONENT-backend:$TFS_IMAGE_TAG-builder" - $DOCKER_BUILD -t "$IMAGE_NAME" --target builder -f ./src/"$COMPONENT"/backend/Dockerfile . >> "$BUILD_LOG" - elif [ "$COMPONENT" == "dlt" ]; then - BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-connector.log" - $DOCKER_BUILD -t "$COMPONENT-connector:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/connector/Dockerfile . > "$BUILD_LOG" - - BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-gateway.log" - $DOCKER_BUILD -t "$COMPONENT-gateway:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/gateway/Dockerfile . > "$BUILD_LOG" - else - $DOCKER_BUILD -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile . > "$BUILD_LOG" - fi + IMAGE_EXISTS=$(docker images -q "$COMPONENT:$TFS_IMAGE_TAG") + if [ -z "$IMAGE_EXISTS" ] || [ "$TFS_BUILD_IF_EXISTS" == "YES" ]; then + echo " Building Docker image..." + BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}.log" - echo " Pushing Docker image to '$TFS_REGISTRY_IMAGES'..." + if [ "$COMPONENT" == "ztp" ] || [ "$COMPONENT" == "policy" ]; then + $DOCKER_BUILD -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile ./src/"$COMPONENT"/ > "$BUILD_LOG" + elif [ "$COMPONENT" == "pathcomp" ]; then + BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-frontend.log" + $DOCKER_BUILD -t "$COMPONENT-frontend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/frontend/Dockerfile . > "$BUILD_LOG" - if [ "$COMPONENT" == "pathcomp" ]; then - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-frontend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-backend.log" + $DOCKER_BUILD -t "$COMPONENT-backend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/backend/Dockerfile . > "$BUILD_LOG" + # next command is redundant, but helpful to keep cache updated between rebuilds + IMAGE_NAME="$COMPONENT-backend:$TFS_IMAGE_TAG-builder" + $DOCKER_BUILD -t "$IMAGE_NAME" --target builder -f ./src/"$COMPONENT"/backend/Dockerfile . >> "$BUILD_LOG" + elif [ "$COMPONENT" == "dlt" ]; then + BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-connector.log" + $DOCKER_BUILD -t "$COMPONENT-connector:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/connector/Dockerfile . > "$BUILD_LOG" - TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-frontend.log" - docker tag "$COMPONENT-frontend:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-gateway.log" + $DOCKER_BUILD -t "$COMPONENT-gateway:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/gateway/Dockerfile . > "$BUILD_LOG" + else + $DOCKER_BUILD -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile . > "$BUILD_LOG" + fi - PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-frontend.log" - docker push "$IMAGE_URL" > "$PUSH_LOG" + echo " Pushing Docker image to '$TFS_REGISTRY_IMAGES'..." - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-backend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + if [ "$COMPONENT" == "pathcomp" ]; then + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-frontend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-backend.log" - docker tag "$COMPONENT-backend:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-frontend.log" + docker tag "$COMPONENT-frontend:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" - PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-backend.log" - docker push "$IMAGE_URL" > "$PUSH_LOG" - elif [ "$COMPONENT" == "dlt" ]; then - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-connector:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-frontend.log" + docker push "$IMAGE_URL" > "$PUSH_LOG" - TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-connector.log" - docker tag "$COMPONENT-connector:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-backend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-connector.log" - docker push "$IMAGE_URL" > "$PUSH_LOG" + TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-backend.log" + docker tag "$COMPONENT-backend:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-gateway:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-backend.log" + docker push "$IMAGE_URL" > "$PUSH_LOG" + elif [ "$COMPONENT" == "dlt" ]; then + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-connector:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-gateway.log" - docker tag "$COMPONENT-gateway:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-connector.log" + docker tag "$COMPONENT-connector:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" - PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-gateway.log" - docker push "$IMAGE_URL" > "$PUSH_LOG" - else - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-connector.log" + docker push "$IMAGE_URL" > "$PUSH_LOG" - TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}.log" - docker tag "$COMPONENT:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-gateway:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}.log" - docker push "$IMAGE_URL" > "$PUSH_LOG" + TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-gateway.log" + docker tag "$COMPONENT-gateway:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + + PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-gateway.log" + docker push "$IMAGE_URL" > "$PUSH_LOG" + else + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + + TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}.log" + docker tag "$COMPONENT:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + + PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}.log" + docker push "$IMAGE_URL" > "$PUSH_LOG" + fi + else + echo " Skipping Docker build for '$COMPONENT' as the image already exists and TFS_BUILD_IF_EXISTS is set to 'NO'." fi fi -- GitLab From 9d0c65cb6f1de4e136ff39d85bf817bbdf904353 Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 28 Jun 2024 15:20:31 +0200 Subject: [PATCH 275/602] Updated the Dockerfile of DLT to work with general deployment script. --- src/dlt/gateway/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dlt/gateway/Dockerfile b/src/dlt/gateway/Dockerfile index dcbd81810..dae745d9f 100644 --- a/src/dlt/gateway/Dockerfile +++ b/src/dlt/gateway/Dockerfile @@ -5,15 +5,15 @@ FROM node:20 WORKDIR /usr/dltApp # Copy package.json and package-lock.json -COPY dltApp/package*.json ./ +COPY src/dlt/connector/gateway/dltApp/dltApp/package*.json ./ # Copy tsconfig.json -COPY dltApp/tsconfig*.json ./ +COPY src/dlt/connector/gateway/dltApp/tsconfig*.json ./ # Copy the proto folder -COPY dltApp/proto/ ./proto +COPY src/dlt/connector/gateway/dltApp/dltApp/proto/ ./proto # Copy the src folder -COPY dltApp/src/ ./src +COPY src/dlt/connector/gateway/dltApp/dltApp/src/ ./src # Install dependencies RUN npm install -- GitLab From 50b7bf4e28c9e2407d878a188912721bc91d606e Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 28 Jun 2024 15:24:46 +0200 Subject: [PATCH 276/602] Crroected some path errors --- src/dlt/gateway/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dlt/gateway/Dockerfile b/src/dlt/gateway/Dockerfile index dae745d9f..4c911f53e 100644 --- a/src/dlt/gateway/Dockerfile +++ b/src/dlt/gateway/Dockerfile @@ -5,15 +5,15 @@ FROM node:20 WORKDIR /usr/dltApp # Copy package.json and package-lock.json -COPY src/dlt/connector/gateway/dltApp/dltApp/package*.json ./ +COPY src/dlt/gateway/dltApp/package*.json ./ # Copy tsconfig.json -COPY src/dlt/connector/gateway/dltApp/tsconfig*.json ./ +COPY src/dlt/gateway/dltApp/tsconfig*.json ./ # Copy the proto folder -COPY src/dlt/connector/gateway/dltApp/dltApp/proto/ ./proto +COPY src/dlt/gateway/dltApp/proto/ ./proto # Copy the src folder -COPY src/dlt/connector/gateway/dltApp/dltApp/src/ ./src +COPY src/dlt/gateway/dltApp/src/ ./src # Install dependencies RUN npm install -- GitLab From 4ca50c44690214601e8f112db4013b7d5717f2ad Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 28 Jun 2024 15:35:49 +0200 Subject: [PATCH 277/602] Corrected the configurationMap --- manifests/dltservice.yaml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/manifests/dltservice.yaml b/manifests/dltservice.yaml index 5362fe6ab..de79ff86b 100644 --- a/manifests/dltservice.yaml +++ b/manifests/dltservice.yaml @@ -16,7 +16,6 @@ apiVersion: v1 kind: ConfigMap metadata: name: dlt-config - namespace: dlt data: CHANNEL_NAME: "channel1" CHAINCODE_NAME: "adrenalineDLT" @@ -34,7 +33,6 @@ apiVersion: apps/v1 kind: Deployment metadata: name: dltservice - namespace: dlt spec: selector: matchLabels: @@ -146,7 +144,6 @@ apiVersion: v1 kind: PersistentVolumeClaim metadata: name: dlt-pvc - namespace: dlt spec: accessModes: - ReadOnlyMany @@ -169,7 +166,6 @@ spec: hostPath: path: "/home/cttc/test-network" claimRef: - namespace: dlt name: dlt-pvc --- @@ -178,7 +174,6 @@ apiVersion: v1 kind: Service metadata: name: gatewayservice - namespace: dlt spec: selector: app: dltservice @@ -195,7 +190,6 @@ apiVersion: v1 kind: Service metadata: name: dltservice - namespace: dlt labels: app: dltservice spec: -- GitLab From 21b72b8cf04511d071e286bb18190320bc943890 Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 28 Jun 2024 15:44:26 +0200 Subject: [PATCH 278/602] PEER_ENDPOINT value. --- manifests/dltservice.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifests/dltservice.yaml b/manifests/dltservice.yaml index de79ff86b..fd892df87 100644 --- a/manifests/dltservice.yaml +++ b/manifests/dltservice.yaml @@ -20,7 +20,7 @@ data: CHANNEL_NAME: "channel1" CHAINCODE_NAME: "adrenalineDLT" MSP_ID: "Org1MSP" - PEER_ENDPOINT: "PEER_IP:PORT" + PEER_ENDPOINT: "10.1.1.96:7051" #Change to required peer# PEER_HOST_ALIAS: "peer0.org1.adrenaline.com" CRYPTO_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com" KEY_DIRECTORY_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/keystore" -- GitLab From 94682324f85172731ae464026ed7b92c795d9a07 Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 28 Jun 2024 16:20:55 +0200 Subject: [PATCH 279/602] Corrected HostPath. --- manifests/dltservice.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifests/dltservice.yaml b/manifests/dltservice.yaml index fd892df87..4c5cc9907 100644 --- a/manifests/dltservice.yaml +++ b/manifests/dltservice.yaml @@ -164,7 +164,7 @@ spec: - ReadOnlyMany persistentVolumeReclaimPolicy: Retain hostPath: - path: "/home/cttc/test-network" + path: "/home/cttc/fabric-samples/test-network" claimRef: name: dlt-pvc -- GitLab From 55392f7aabf2d7af0fdc37e426a19bfa1e041ab7 Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 28 Jun 2024 16:49:44 +0200 Subject: [PATCH 280/602] Manifest update --- manifests/dltservice.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifests/dltservice.yaml b/manifests/dltservice.yaml index 4c5cc9907..b8bc1a833 100644 --- a/manifests/dltservice.yaml +++ b/manifests/dltservice.yaml @@ -164,7 +164,7 @@ spec: - ReadOnlyMany persistentVolumeReclaimPolicy: Retain hostPath: - path: "/home/cttc/fabric-samples/test-network" + path: "/home/ubuntu/fabric-samples/test-network" #Update to correct host paths where the MSP is located. claimRef: name: dlt-pvc -- GitLab From 84292923f68ed751a5be0c0664769082c316c774 Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 28 Jun 2024 17:58:34 +0200 Subject: [PATCH 281/602] Updated deployment to use secrets for the HLF certificates --- deploy/tfs.sh | 26 +++++++++++++++++++++++++ manifests/dltservice.yaml | 39 +++++++++++++++++++++++--------------- src/dlt/gateway/Dockerfile | 3 ++- 3 files changed, 52 insertions(+), 16 deletions(-) diff --git a/deploy/tfs.sh b/deploy/tfs.sh index e81b946c8..4c187b9a4 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -118,6 +118,19 @@ export PROM_EXT_PORT_HTTP=${PROM_EXT_PORT_HTTP:-"9090"} # If not already set, set the external port Grafana HTTP Dashboards will be exposed to. export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"} +# ----- HLF Key Paths ----------------------------------------------------------- + +echo "Create secret for keystore" +KEY_DIRECTORY_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/keystore" +printf "\n" + +echo "Create secret for signcerts" +CERT_DIRECTORY_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/signcerts" +printf "\n" + +echo "Create secret for ca.crt" +TLS_CERT_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/peers/peer0.org1.adrenaline.com/tls/ca.crt" +printf "\n" ######################################################################################################################## # Automated steps start here @@ -178,6 +191,19 @@ kubectl create secret generic qdb-data --namespace ${TFS_K8S_NAMESPACE} --type=' --from-literal=METRICSDB_PASSWORD=${QDB_PASSWORD} printf "\n" +echo "Create secret for HLF keystore" +kubectl create secret generic dlt-keystone --namespace ${TFS_K8S_NAMESPACE} --from-file=keystore=${KEY_DIRECTORY_PATH} +printf "\n" + +echo "Create secret for HLF signcerts" +kubectl create secret generic dlt-signcerts --namespace ${TFS_K8S_NAMESPACE} --from-file=signcerts=${CERT_DIRECTORY_PATH} +printf "\n" + +echo "Create secret for HLF ca.crt" +kubectl create secret generic dlt-ca-crt --namespace ${TFS_K8S_NAMESPACE} --from-file=ca.crt=${TLS_CERT_PATH} +printf "\n" + + echo "Deploying components and collecting environment variables..." ENV_VARS_SCRIPT=tfs_runtime_env_vars.sh echo "# Environment variables for TeraFlowSDN deployment" > $ENV_VARS_SCRIPT diff --git a/manifests/dltservice.yaml b/manifests/dltservice.yaml index b8bc1a833..d3bd6c436 100644 --- a/manifests/dltservice.yaml +++ b/manifests/dltservice.yaml @@ -23,9 +23,9 @@ data: PEER_ENDPOINT: "10.1.1.96:7051" #Change to required peer# PEER_HOST_ALIAS: "peer0.org1.adrenaline.com" CRYPTO_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com" - KEY_DIRECTORY_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/keystore" - CERT_DIRECTORY_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/signcerts" - TLS_CERT_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com/peers/peer0.org1.adrenaline.com/tls/ca.crt" + KEY_DIRECTORY_PATH: "/etc/hyperledger/fabric-keystore" + CERT_DIRECTORY_PATH: "/etc/hyperledger/fabric-signcerts" + TLS_CERT_PATH: "/etc/hyperledger/fabric-ca-crt/ca.crt" --- @@ -87,6 +87,15 @@ spec: - mountPath: /test-network name: dlt-volume readOnly: true + - name: keystore + mountPath: /etc/hyperledger/fabric-keystore + readOnly: true + - name: signcerts + mountPath: /etc/hyperledger/fabric-signcerts + readOnly: true + - name: ca-crt + mountPath: /etc/hyperledger/fabric-ca-crt + readOnly: true env: - name: CHANNEL_NAME valueFrom: @@ -119,24 +128,24 @@ spec: name: dlt-config key: CRYPTO_PATH - name: KEY_DIRECTORY_PATH - valueFrom: - configMapKeyRef: - name: dlt-config - key: KEY_DIRECTORY_PATH + value: "/etc/hyperledger/fabric-keystore" - name: CERT_DIRECTORY_PATH - valueFrom: - configMapKeyRef: - name: dlt-config - key: CERT_DIRECTORY_PATH + value: "/etc/hyperledger/fabric-signcerts" - name: TLS_CERT_PATH - valueFrom: - configMapKeyRef: - name: dlt-config - key: TLS_CERT_PATH + value: "/etc/hyperledger/fabric-ca-crt/ca.crt" volumes: - name: dlt-volume persistentVolumeClaim: claimName: dlt-pvc + - name: keystore + secret: + secretName: dlt-keystone + - name: signcerts + secret: + secretName: dlt-signcerts + - name: ca-crt + secret: + secretName: dlt-ca-cr --- diff --git a/src/dlt/gateway/Dockerfile b/src/dlt/gateway/Dockerfile index 4c911f53e..1f2b4abed 100644 --- a/src/dlt/gateway/Dockerfile +++ b/src/dlt/gateway/Dockerfile @@ -24,4 +24,5 @@ RUN npm install EXPOSE 50051 # Command to run the service -CMD ["node", "src/dltGateway.js"] \ No newline at end of file +#CMD ["node", "src/dltGateway.js"] +CMD ["sh", "-c", "sleep 3600"] # Keep the container running for testing -- GitLab From 6bd936c17ac6eba36f8127ecdc160680cbaae2ad Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 28 Jun 2024 18:09:05 +0200 Subject: [PATCH 282/602] Updated Deployment Scripts to use Secrets --- deploy/tfs.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/deploy/tfs.sh b/deploy/tfs.sh index 4c187b9a4..a11dee682 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -120,15 +120,15 @@ export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"} # ----- HLF Key Paths ----------------------------------------------------------- -echo "Create secret for keystore" -KEY_DIRECTORY_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/keystore" +echo "Keystore PATH" +KEY_DIRECTORY_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/keystore/priv_sk" printf "\n" -echo "Create secret for signcerts" -CERT_DIRECTORY_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/signcerts" +echo "signcerts PATH" +CERT_DIRECTORY_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/signcerts/User1@org1.adrenaline.com-cert.pem" printf "\n" -echo "Create secret for ca.crt" +echo "ca.crt PATH" TLS_CERT_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/peers/peer0.org1.adrenaline.com/tls/ca.crt" printf "\n" -- GitLab From b6bd5b20cd40ff663fc0cda11a5fd36d8981863c Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 28 Jun 2024 18:19:20 +0200 Subject: [PATCH 283/602] Updated Manifest for DLT --- manifests/dltservice.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifests/dltservice.yaml b/manifests/dltservice.yaml index d3bd6c436..8bc435b39 100644 --- a/manifests/dltservice.yaml +++ b/manifests/dltservice.yaml @@ -145,7 +145,7 @@ spec: secretName: dlt-signcerts - name: ca-crt secret: - secretName: dlt-ca-cr + secretName: dlt-ca-crt --- -- GitLab From cc538beb0dfabfbf3e3539bdb766d81d6df229b8 Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 28 Jun 2024 18:29:02 +0200 Subject: [PATCH 284/602] Updated Dockerfile of DLT gateway --- src/dlt/gateway/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dlt/gateway/Dockerfile b/src/dlt/gateway/Dockerfile index 1f2b4abed..694cc521f 100644 --- a/src/dlt/gateway/Dockerfile +++ b/src/dlt/gateway/Dockerfile @@ -24,5 +24,5 @@ RUN npm install EXPOSE 50051 # Command to run the service -#CMD ["node", "src/dltGateway.js"] -CMD ["sh", "-c", "sleep 3600"] # Keep the container running for testing +CMD ["node", "src/dltGateway.js"] +#CMD ["sh", "-c", "sleep 3600"] # Keep the container running for testing -- GitLab From f7af99017cb315ad493522a39eb1112510a45b2f Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 1 Jul 2024 08:51:19 +0200 Subject: [PATCH 285/602] Debugging --- src/dlt/gateway/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dlt/gateway/Dockerfile b/src/dlt/gateway/Dockerfile index 694cc521f..1f2b4abed 100644 --- a/src/dlt/gateway/Dockerfile +++ b/src/dlt/gateway/Dockerfile @@ -24,5 +24,5 @@ RUN npm install EXPOSE 50051 # Command to run the service -CMD ["node", "src/dltGateway.js"] -#CMD ["sh", "-c", "sleep 3600"] # Keep the container running for testing +#CMD ["node", "src/dltGateway.js"] +CMD ["sh", "-c", "sleep 3600"] # Keep the container running for testing -- GitLab From 1e8f51ac7f59a8ad2f853a332ab5cafbf817391e Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 1 Jul 2024 10:05:55 +0200 Subject: [PATCH 286/602] Debugging --- src/dlt/gateway/dltApp/src/fabricConnect.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dlt/gateway/dltApp/src/fabricConnect.ts b/src/dlt/gateway/dltApp/src/fabricConnect.ts index 51c8f8046..42711f5a0 100644 --- a/src/dlt/gateway/dltApp/src/fabricConnect.ts +++ b/src/dlt/gateway/dltApp/src/fabricConnect.ts @@ -105,6 +105,7 @@ async function newGrpcConnection(): Promise { async function newIdentity(): Promise { const certPath = await getFirstDirFileName(certDirectoryPath); + console.log("DEBUG", certPath); const credentials = await fs.readFile(certPath); return { mspId, credentials }; } @@ -116,6 +117,7 @@ async function getFirstDirFileName(dirPath: string): Promise { async function newSigner(): Promise { const keyPath = await getFirstDirFileName(keyDirectoryPath); + console.log("DEBUG2", keyPath); const privateKeyPem = await fs.readFile(keyPath); const privateKey = crypto.createPrivateKey(privateKeyPem); return signers.newPrivateKeySigner(privateKey); -- GitLab From 8aed033c5a3757ffe3b21ac616f8d8163a0fda34 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 1 Jul 2024 10:19:57 +0200 Subject: [PATCH 287/602] debugging --- deploy/tfs.sh | 2 +- src/dlt/gateway/Dockerfile | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/deploy/tfs.sh b/deploy/tfs.sh index a11dee682..6626262f8 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -196,7 +196,7 @@ kubectl create secret generic dlt-keystone --namespace ${TFS_K8S_NAMESPACE} --fr printf "\n" echo "Create secret for HLF signcerts" -kubectl create secret generic dlt-signcerts --namespace ${TFS_K8S_NAMESPACE} --from-file=signcerts=${CERT_DIRECTORY_PATH} +kubectl create secret generic dlt-signcerts --namespace ${TFS_K8S_NAMESPACE} --from-file=signcerts.pem=${CERT_DIRECTORY_PATH} printf "\n" echo "Create secret for HLF ca.crt" diff --git a/src/dlt/gateway/Dockerfile b/src/dlt/gateway/Dockerfile index 1f2b4abed..694cc521f 100644 --- a/src/dlt/gateway/Dockerfile +++ b/src/dlt/gateway/Dockerfile @@ -24,5 +24,5 @@ RUN npm install EXPOSE 50051 # Command to run the service -#CMD ["node", "src/dltGateway.js"] -CMD ["sh", "-c", "sleep 3600"] # Keep the container running for testing +CMD ["node", "src/dltGateway.js"] +#CMD ["sh", "-c", "sleep 3600"] # Keep the container running for testing -- GitLab From 547c5f6ad4ac117fb32c73b5be7da724305492a4 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 1 Jul 2024 12:07:21 +0200 Subject: [PATCH 288/602] Debugging --- manifests/dltservice.yaml | 8 ++++---- src/dlt/gateway/dltApp/src/fabricConnect.ts | 4 +++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/manifests/dltservice.yaml b/manifests/dltservice.yaml index 8bc435b39..6602a45f5 100644 --- a/manifests/dltservice.yaml +++ b/manifests/dltservice.yaml @@ -23,8 +23,8 @@ data: PEER_ENDPOINT: "10.1.1.96:7051" #Change to required peer# PEER_HOST_ALIAS: "peer0.org1.adrenaline.com" CRYPTO_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com" - KEY_DIRECTORY_PATH: "/etc/hyperledger/fabric-keystore" - CERT_DIRECTORY_PATH: "/etc/hyperledger/fabric-signcerts" + KEY_DIRECTORY_PATH: "/etc/hyperledger/fabric-keystore/keystore" + CERT_DIRECTORY_PATH: "/etc/hyperledger/fabric-signcerts/signcerts.pem" TLS_CERT_PATH: "/etc/hyperledger/fabric-ca-crt/ca.crt" --- @@ -128,9 +128,9 @@ spec: name: dlt-config key: CRYPTO_PATH - name: KEY_DIRECTORY_PATH - value: "/etc/hyperledger/fabric-keystore" + value: "/etc/hyperledger/fabric-keystore/keystore" - name: CERT_DIRECTORY_PATH - value: "/etc/hyperledger/fabric-signcerts" + value: "/etc/hyperledger/fabric-signcerts/signcerts.pem" - name: TLS_CERT_PATH value: "/etc/hyperledger/fabric-ca-crt/ca.crt" volumes: diff --git a/src/dlt/gateway/dltApp/src/fabricConnect.ts b/src/dlt/gateway/dltApp/src/fabricConnect.ts index 42711f5a0..ae61ef2ff 100644 --- a/src/dlt/gateway/dltApp/src/fabricConnect.ts +++ b/src/dlt/gateway/dltApp/src/fabricConnect.ts @@ -112,7 +112,9 @@ async function newIdentity(): Promise { async function getFirstDirFileName(dirPath: string): Promise { const files = await fs.readdir(dirPath); - return path.join(dirPath, files[0]); + const filePath = path.join(dirPath, files[0]); + const realFilePath = await fs.readlink(filePath); + return path.join(dirPath, realFilePath); } async function newSigner(): Promise { -- GitLab From 3f9d67757abc4dc8cfbcc136bf025804d255135d Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 1 Jul 2024 12:27:15 +0200 Subject: [PATCH 289/602] Debugging --- manifests/dltservice.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/manifests/dltservice.yaml b/manifests/dltservice.yaml index 6602a45f5..a6b04b4d8 100644 --- a/manifests/dltservice.yaml +++ b/manifests/dltservice.yaml @@ -23,8 +23,8 @@ data: PEER_ENDPOINT: "10.1.1.96:7051" #Change to required peer# PEER_HOST_ALIAS: "peer0.org1.adrenaline.com" CRYPTO_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com" - KEY_DIRECTORY_PATH: "/etc/hyperledger/fabric-keystore/keystore" - CERT_DIRECTORY_PATH: "/etc/hyperledger/fabric-signcerts/signcerts.pem" + KEY_DIRECTORY_PATH: "/etc/hyperledger/fabric-keystore/" + CERT_DIRECTORY_PATH: "/etc/hyperledger/fabric-signcerts/" TLS_CERT_PATH: "/etc/hyperledger/fabric-ca-crt/ca.crt" --- @@ -128,9 +128,9 @@ spec: name: dlt-config key: CRYPTO_PATH - name: KEY_DIRECTORY_PATH - value: "/etc/hyperledger/fabric-keystore/keystore" + value: "/etc/hyperledger/fabric-keystore/" - name: CERT_DIRECTORY_PATH - value: "/etc/hyperledger/fabric-signcerts/signcerts.pem" + value: "/etc/hyperledger/fabric-signcerts/" - name: TLS_CERT_PATH value: "/etc/hyperledger/fabric-ca-crt/ca.crt" volumes: -- GitLab From 65839d40fb45f514eb876433cb0f0675accc6dbf Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 1 Jul 2024 12:33:07 +0200 Subject: [PATCH 290/602] Debugging --- manifests/dltservice.yaml | 8 +++---- src/dlt/gateway/dltApp/src/fabricConnect.ts | 24 ++++++++++----------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/manifests/dltservice.yaml b/manifests/dltservice.yaml index a6b04b4d8..6602a45f5 100644 --- a/manifests/dltservice.yaml +++ b/manifests/dltservice.yaml @@ -23,8 +23,8 @@ data: PEER_ENDPOINT: "10.1.1.96:7051" #Change to required peer# PEER_HOST_ALIAS: "peer0.org1.adrenaline.com" CRYPTO_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com" - KEY_DIRECTORY_PATH: "/etc/hyperledger/fabric-keystore/" - CERT_DIRECTORY_PATH: "/etc/hyperledger/fabric-signcerts/" + KEY_DIRECTORY_PATH: "/etc/hyperledger/fabric-keystore/keystore" + CERT_DIRECTORY_PATH: "/etc/hyperledger/fabric-signcerts/signcerts.pem" TLS_CERT_PATH: "/etc/hyperledger/fabric-ca-crt/ca.crt" --- @@ -128,9 +128,9 @@ spec: name: dlt-config key: CRYPTO_PATH - name: KEY_DIRECTORY_PATH - value: "/etc/hyperledger/fabric-keystore/" + value: "/etc/hyperledger/fabric-keystore/keystore" - name: CERT_DIRECTORY_PATH - value: "/etc/hyperledger/fabric-signcerts/" + value: "/etc/hyperledger/fabric-signcerts/signcerts.pem" - name: TLS_CERT_PATH value: "/etc/hyperledger/fabric-ca-crt/ca.crt" volumes: diff --git a/src/dlt/gateway/dltApp/src/fabricConnect.ts b/src/dlt/gateway/dltApp/src/fabricConnect.ts index ae61ef2ff..cab955958 100644 --- a/src/dlt/gateway/dltApp/src/fabricConnect.ts +++ b/src/dlt/gateway/dltApp/src/fabricConnect.ts @@ -104,23 +104,23 @@ async function newGrpcConnection(): Promise { } async function newIdentity(): Promise { - const certPath = await getFirstDirFileName(certDirectoryPath); - console.log("DEBUG", certPath); - const credentials = await fs.readFile(certPath); + //const certPath = await getFirstDirFileName(certDirectoryPath); + console.log("DEBUG", certDirectoryPath); + const credentials = await fs.readFile(certDirectoryPath); return { mspId, credentials }; } -async function getFirstDirFileName(dirPath: string): Promise { - const files = await fs.readdir(dirPath); - const filePath = path.join(dirPath, files[0]); - const realFilePath = await fs.readlink(filePath); - return path.join(dirPath, realFilePath); -} +//async function getFirstDirFileName(dirPath: string): Promise { + // const files = await fs.readdir(dirPath); + // const filePath = path.join(dirPath, files[0]); + // const realFilePath = await fs.readlink(filePath); + // return path.join(dirPath, realFilePath); +//} async function newSigner(): Promise { - const keyPath = await getFirstDirFileName(keyDirectoryPath); - console.log("DEBUG2", keyPath); - const privateKeyPem = await fs.readFile(keyPath); + //const keyPath = await getFirstDirFileName(keyDirectoryPath); + console.log("DEBUG2", keyDirectoryPath); + const privateKeyPem = await fs.readFile(keyDirectoryPath); const privateKey = crypto.createPrivateKey(privateKeyPem); return signers.newPrivateKeySigner(privateKey); } -- GitLab From 179e98bc782bf4f0f9b53bd739d3e0b71333ce90 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 1 Jul 2024 12:52:18 +0200 Subject: [PATCH 291/602] Debugging --- src/dlt/gateway/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dlt/gateway/Dockerfile b/src/dlt/gateway/Dockerfile index 694cc521f..1f2b4abed 100644 --- a/src/dlt/gateway/Dockerfile +++ b/src/dlt/gateway/Dockerfile @@ -24,5 +24,5 @@ RUN npm install EXPOSE 50051 # Command to run the service -CMD ["node", "src/dltGateway.js"] -#CMD ["sh", "-c", "sleep 3600"] # Keep the container running for testing +#CMD ["node", "src/dltGateway.js"] +CMD ["sh", "-c", "sleep 3600"] # Keep the container running for testing -- GitLab From 638299bd338234187854d49e000a9ed80436d454 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 1 Jul 2024 14:45:31 +0200 Subject: [PATCH 292/602] Debugging --- src/dlt/gateway/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dlt/gateway/Dockerfile b/src/dlt/gateway/Dockerfile index 1f2b4abed..694cc521f 100644 --- a/src/dlt/gateway/Dockerfile +++ b/src/dlt/gateway/Dockerfile @@ -24,5 +24,5 @@ RUN npm install EXPOSE 50051 # Command to run the service -#CMD ["node", "src/dltGateway.js"] -CMD ["sh", "-c", "sleep 3600"] # Keep the container running for testing +CMD ["node", "src/dltGateway.js"] +#CMD ["sh", "-c", "sleep 3600"] # Keep the container running for testing -- GitLab From 3470151e45fd89cb4a074195987b39b48ee05b82 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 1 Jul 2024 14:51:41 +0200 Subject: [PATCH 293/602] Debugging --- deploy/tfs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/tfs.sh b/deploy/tfs.sh index 6626262f8..00bc2d48f 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -47,7 +47,7 @@ export TFS_SKIP_BUILD=${TFS_SKIP_BUILD:-""} # If not already set, disable build-if-exists flag to skip building Docker images if they already exist. # If TFS_BUILD_IF_EXISTS is "NO", the containers are not rebuilt if they already exist. -export TFS_BUILD_IF_EXISTS=${TFS_BUILD_IF_EXISTS:-"NO"} +export TFS_BUILD_IF_EXISTS=${TFS_BUILD_IF_EXISTS:-"YES"} # ----- CockroachDB ------------------------------------------------------------ -- GitLab From ca09f455760864ded210d50db49fe612b19790ad Mon Sep 17 00:00:00 2001 From: root Date: Tue, 2 Jul 2024 12:31:42 +0000 Subject: [PATCH 294/602] SBI Get resources and create links --- proto/context.proto | 2 + .../database/models/enums/DeviceDriver.py | 1 + src/device/requirements.in | 1 - src/device/service/drivers/__init__.py | 11 + src/device/service/drivers/qkd/QKDDriver.py | 149 +++ src/device/service/drivers/qkd/Tools.py | 159 +++ src/device/service/drivers/qkd/__init__.py | 27 + .../tools/mock_qkd_nodes/YangValidator.py | 42 + src/tests/tools/mock_qkd_nodes/mock.py | 355 +++++++ src/tests/tools/mock_qkd_nodes/start.sh | 17 + .../yang/etsi-qkd-node-types.yang | 326 ++++++ .../yang/etsi-qkd-sdn-node.yang | 941 ++++++++++++++++++ .../mock_qkd_nodes/yang/ietf-inet-types.yang | 458 +++++++++ .../mock_qkd_nodes/yang/ietf-yang-types.yang | 474 +++++++++ 14 files changed, 2962 insertions(+), 1 deletion(-) create mode 100644 src/device/service/drivers/qkd/QKDDriver.py create mode 100644 src/device/service/drivers/qkd/Tools.py create mode 100644 src/device/service/drivers/qkd/__init__.py create mode 100644 src/tests/tools/mock_qkd_nodes/YangValidator.py create mode 100644 src/tests/tools/mock_qkd_nodes/mock.py create mode 100755 src/tests/tools/mock_qkd_nodes/start.sh create mode 100644 src/tests/tools/mock_qkd_nodes/yang/etsi-qkd-node-types.yang create mode 100644 src/tests/tools/mock_qkd_nodes/yang/etsi-qkd-sdn-node.yang create mode 100644 src/tests/tools/mock_qkd_nodes/yang/ietf-inet-types.yang create mode 100644 src/tests/tools/mock_qkd_nodes/yang/ietf-yang-types.yang diff --git a/proto/context.proto b/proto/context.proto index 87f69132d..fa9b1959b 100644 --- a/proto/context.proto +++ b/proto/context.proto @@ -214,6 +214,7 @@ enum DeviceDriverEnum { DEVICEDRIVER_OPTICAL_TFS = 9; DEVICEDRIVER_IETF_ACTN = 10; DEVICEDRIVER_OC = 11; + DEVICEDRIVER_QKD = 12; } enum DeviceOperationalStatusEnum { @@ -300,6 +301,7 @@ enum ServiceTypeEnum { SERVICETYPE_TE = 4; SERVICETYPE_E2E = 5; SERVICETYPE_OPTICAL_CONNECTIVITY = 6; + SERVICETYPE_QKD = 7; } enum ServiceStatusEnum { diff --git a/src/context/service/database/models/enums/DeviceDriver.py b/src/context/service/database/models/enums/DeviceDriver.py index 06d731770..cf900ed6d 100644 --- a/src/context/service/database/models/enums/DeviceDriver.py +++ b/src/context/service/database/models/enums/DeviceDriver.py @@ -34,6 +34,7 @@ class ORM_DeviceDriverEnum(enum.Enum): OPTICAL_TFS = DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS IETF_ACTN = DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN OC = DeviceDriverEnum.DEVICEDRIVER_OC + QKD = DeviceDriverEnum.DEVICEDRIVER_QKD grpc_to_enum__device_driver = functools.partial( grpc_to_enum, DeviceDriverEnum, ORM_DeviceDriverEnum) diff --git a/src/device/requirements.in b/src/device/requirements.in index 73ea741d1..61ca7a42d 100644 --- a/src/device/requirements.in +++ b/src/device/requirements.in @@ -31,7 +31,6 @@ python-json-logger==2.0.2 #pytz==2021.3 #redis==4.1.2 requests==2.27.1 -requests-mock==1.9.3 xmltodict==0.12.0 tabulate ipaddress diff --git a/src/device/service/drivers/__init__.py b/src/device/service/drivers/__init__.py index cb6158b96..573eb194e 100644 --- a/src/device/service/drivers/__init__.py +++ b/src/device/service/drivers/__init__.py @@ -178,3 +178,14 @@ if LOAD_ALL_DEVICE_DRIVERS: FilterFieldEnum.DRIVER : DeviceDriverEnum.DEVICEDRIVER_OC, } ])) + +if LOAD_ALL_DEVICE_DRIVERS: + from .qkd.QKDDriver import QKDDriver # pylint: disable=wrong-import-position + DRIVERS.append( + (QKDDriver, [ + { + # Close enough, it does optical switching + FilterFieldEnum.DEVICE_TYPE: DeviceTypeEnum.QKD_NODE, + FilterFieldEnum.DRIVER : DeviceDriverEnum.DEVICEDRIVER_QKD, + } + ])) diff --git a/src/device/service/drivers/qkd/QKDDriver.py b/src/device/service/drivers/qkd/QKDDriver.py new file mode 100644 index 000000000..b8f7a8ebe --- /dev/null +++ b/src/device/service/drivers/qkd/QKDDriver.py @@ -0,0 +1,149 @@ +import json, logging, requests, threading +from requests.auth import HTTPBasicAuth +from typing import Any, Iterator, List, Optional, Tuple, Union +from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method +from common.type_checkers.Checkers import chk_string, chk_type +from device.service.driver_api._Driver import _Driver +from . import ALL_RESOURCE_KEYS +from .Tools import find_key, config_getter, create_connectivity_link + +LOGGER = logging.getLogger(__name__) + +DRIVER_NAME = 'qkd' +METRICS_POOL = MetricsPool('Device', 'Driver', labels={'driver': DRIVER_NAME}) + + +class QKDDriver(_Driver): + def __init__(self, address: str, port: int, **settings) -> None: + super().__init__(DRIVER_NAME, address, port, **settings) + self.__lock = threading.Lock() + self.__started = threading.Event() + self.__terminate = threading.Event() + username = self.settings.get('username') + password = self.settings.get('password') + self.__auth = HTTPBasicAuth(username, password) if username is not None and password is not None else None + scheme = self.settings.get('scheme', 'http') + self.__qkd_root = '{:s}://{:s}:{:d}'.format(scheme, self.address, int(self.port)) + self.__timeout = int(self.settings.get('timeout', 120)) + self.__node_ids = set(self.settings.get('node_ids', [])) + self.__initial_data = None + + def Connect(self) -> bool: + url = self.__qkd_root + '/restconf/data/etsi-qkd-sdn-node:qkd_node' + with self.__lock: + if self.__started.is_set(): return True + r = None + try: + r = requests.get(url, timeout=self.__timeout, verify=False, auth=self.__auth) + except requests.exceptions.Timeout: + LOGGER.exception('Timeout connecting {:s}'.format(str(self.__qkd_root))) + return False + except Exception: # pylint: disable=broad-except + LOGGER.exception('Exception connecting {:s}'.format(str(self.__qkd_root))) + return False + else: + self.__started.set() + self.__initial_data = r.json() + return True + + def Disconnect(self) -> bool: + with self.__lock: + self.__terminate.set() + return True + + @metered_subclass_method(METRICS_POOL) + def GetInitialConfig(self) -> List[Tuple[str, Any]]: + with self.__lock: + return self.__initial_data + + @metered_subclass_method(METRICS_POOL) + def GetConfig(self, resource_keys : List[str] = []) -> List[Tuple[str, Union[Any, None, Exception]]]: + chk_type('resources', resource_keys, list) + results = [] + with self.__lock: + if len(resource_keys) == 0: resource_keys = ALL_RESOURCE_KEYS + for i, resource_key in enumerate(resource_keys): + str_resource_name = 'resource_key[#{:d}]'.format(i) + chk_string(str_resource_name, resource_key, allow_empty=False) + results.extend(config_getter( + self.__qkd_root, resource_key, timeout=self.__timeout, auth=self.__auth, + node_ids=self.__node_ids)) + return results + + + @metered_subclass_method(METRICS_POOL) + def SetConfig(self, resources: List[Tuple[str, Any]]) -> List[Union[bool, Exception]]: + results = [] + if len(resources) == 0: + return results + with self.__lock: + for resource_key, resource_value in resources: + LOGGER.info('resource = {:s}'.format(str(resource_key))) + + if resource_key.startswith('/link'): + try: + resource_value = json.loads(resource_value) + link_uuid = resource_value['uuid'] + + node_id_src = resource_value['src_qkdn_id'] + interface_id_src = resource_value['src_interface_id'] + node_id_dst = resource_value['dst_qkdn_id'] + interface_id_dst = resource_value['dst_interface_id'] + virt_prev_hop = resource_value.get('virt_prev_hop') + virt_next_hops = resource_value.get('virt_next_hops') + virt_bandwidth = resource_value.get('virt_bandwidth') + + + data = create_connectivity_link( + self.__qkd_root, link_uuid, node_id_src, interface_id_src, node_id_dst, interface_id_dst, + virt_prev_hop, virt_next_hops, virt_bandwidth, + timeout=self.__timeout, auth=self.__auth + ) + + #data = create_connectivity_link( + # self.__qkd_root, link_uuid, node_id_src, interface_id_src, node_id_dst, interface_id_dst, + # timeout=self.__timeout, auth=self.__auth + #) + results.append(True) + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Unhandled error processing resource_key({:s})'.format(str(resource_key))) + results.append(e) + else: + results.append(True) + + LOGGER.info('Test keys: ' + str([x for x,y in resources])) + LOGGER.info('Test values: ' + str(results)) + return results + + ''' + @metered_subclass_method(METRICS_POOL) + def DeleteConfig(self, resources: List[Tuple[str, Any]]) -> List[Union[bool, Exception]]: + results = [] + if len(resources) == 0: return results + with self.__lock: + for resource in resources: + LOGGER.info('resource = {:s}'.format(str(resource))) + uuid = find_key(resource, 'uuid') + results.extend(delete_connectivity_service( + self.__qkd_root, uuid, timeout=self.__timeout, auth=self.__auth)) + return results + ''' + + @metered_subclass_method(METRICS_POOL) + def SubscribeState(self, subscriptions : List[Tuple[str, float, float]]) -> List[Union[bool, Exception]]: + # TODO: QKD API Driver does not support monitoring by now + LOGGER.info(f'Subscribe {self.address}: {subscriptions}') + return [True for _ in subscriptions] + + @metered_subclass_method(METRICS_POOL) + def UnsubscribeState(self, subscriptions : List[Tuple[str, float, float]]) -> List[Union[bool, Exception]]: + # TODO: QKD API Driver does not support monitoring by now + return [False for _ in subscriptions] + + def GetState( + self, blocking=False, terminate : Optional[threading.Event] = None + ) -> Iterator[Tuple[float, str, Any]]: + # TODO: QKD API Driver does not support monitoring by now + LOGGER.info(f'GetState {self.address} called') + return [] + diff --git a/src/device/service/drivers/qkd/Tools.py b/src/device/service/drivers/qkd/Tools.py new file mode 100644 index 000000000..38e80ad50 --- /dev/null +++ b/src/device/service/drivers/qkd/Tools.py @@ -0,0 +1,159 @@ +import json, logging, requests +from requests.auth import HTTPBasicAuth +from typing import Dict, Optional, Set +from device.service.driver_api._Driver import RESOURCE_ENDPOINTS, RESOURCE_INTERFACES, RESOURCE_NETWORK_INSTANCES +from . import RESOURCE_APPS, RESOURCE_LINKS, RESOURCE_CAPABILITES, RESOURCE_NODE + + +LOGGER = logging.getLogger(__name__) + +HTTP_OK_CODES = { + 200, # OK + 201, # Created + 202, # Accepted + 204, # No Content +} + +def find_key(resource, key): + return json.loads(resource[1])[key] + + + +def config_getter( + root_url : str, resource_key : str, auth : Optional[HTTPBasicAuth] = None, timeout : Optional[int] = None, + node_ids : Set[str] = set() +): + # getting endpoints + + url = root_url + '/restconf/data/etsi-qkd-sdn-node:qkd_node/' + + + result = [] + + try: + if resource_key in [RESOURCE_ENDPOINTS, RESOURCE_INTERFACES]: + url += 'qkd_interfaces/' + r = requests.get(url, timeout=timeout, verify=False, auth=auth) + interfaces = r.json()['qkd_interfaces']['qkd_interface'] + + # If it's a physical endpoint + if resource_key == RESOURCE_ENDPOINTS: + for interface in interfaces: + resource_value = interface.get('qkdi_att_point', {}) + if 'device' in resource_value and 'port' in resource_value: + uuid = '{}:{}'.format(resource_value['device'], resource_value['port']) + resource_key = '/endpoints/endpoint[{:s}]'.format(uuid) + resource_value['uuid'] = uuid + + sample_types = {} + metric_name = 'KPISAMPLETYPE_LINK_TOTAL_CAPACITY_GBPS' + metric_id = 301 + metric_name = metric_name.lower().replace('kpisampletype_', '') + monitoring_resource_key = '{:s}/state/{:s}'.format(resource_key, metric_name) + sample_types[metric_id] = monitoring_resource_key + + + + resource_value['sample_types'] = sample_types + + + + result.append((resource_key, resource_value)) + else: + for interface in interfaces: + resource_key = '/interface[{:s}]'.format(interface['qkdi_id']) + endpoint_value = interface.get('qkdi_att_point', {}) + + if 'device' in endpoint_value and 'port' in endpoint_value: + name = '{}:{}'.format(endpoint_value['device'], endpoint_value['port']) + interface['name'] = name + interface['enabled'] = True # For test purpose only + + result.append((resource_key, interface)) + + elif resource_key in [RESOURCE_LINKS, RESOURCE_NETWORK_INSTANCES]: + url += 'qkd_links/' + r = requests.get(url, timeout=timeout, verify=False, auth=auth) + links = r.json()['qkd_links']['qkd_link'] + + if resource_key == RESOURCE_LINKS: + for link in links: + link_type = link.get('qkdl_type', 'Direct') + + if link_type == 'Direct': + resource_key = '/link[{:s}]'.format(link['qkdl_id']) + result.append((resource_key, link)) + else: + for link in links: + link_type = link.get('qkdl_type', 'Direct') + + if link_type == 'Virtual': + resource_key = '/service[{:s}]'.format(link['qkdl_id']) + result.append((resource_key, link)) + + elif resource_key == RESOURCE_APPS: + url += 'qkd_applications/' + r = requests.get(url, timeout=timeout, verify=False, auth=auth) + apps = r.json()['qkd_applications']['qkd_app'] + + for app in apps: + resource_key = '/app[{:s}]'.format(app['app_id']) + result.append((resource_key, app)) + + + elif resource_key == RESOURCE_CAPABILITES: + url += 'qkdn_capabilities/' + r = requests.get(url, timeout=timeout, verify=False, auth=auth) + capabilities = r.json()['qkdn_capabilities'] + + result.append((resource_key, capabilities)) + + elif resource_key == RESOURCE_NODE: + r = requests.get(url, timeout=timeout, verify=False, auth=auth) + node = r.json()['qkd_node'] + + result.append((resource_key, node)) + + except requests.exceptions.Timeout: + LOGGER.exception('Timeout connecting {:s}'.format(url)) + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Exception retrieving/parsing endpoints for {:s}'.format(resource_key)) + result.append((resource_key, e)) + + + return result + + + +def create_connectivity_link( + root_url, link_uuid, node_id_src, interface_id_src, node_id_dst, interface_id_dst, + virt_prev_hop = None, virt_next_hops = None, virt_bandwidth = None, + auth : Optional[HTTPBasicAuth] = None, timeout : Optional[int] = None +): + + url = root_url + '/restconf/data/etsi-qkd-sdn-node:qkd_node/qkd_links/' + is_virtual = bool(virt_prev_hop or virt_next_hops) + + qkd_link = { + 'qkdl_id': link_uuid, + 'qkdl_type': 'etsi-qkd-node-types:' + ('VIRT' if is_virtual else 'PHYS'), + 'qkdl_local': { + 'qkdn_id': node_id_src, + 'qkdi_id': interface_id_src + }, + 'qkdl_remote': { + 'qkdn_id': node_id_dst, + 'qkdi_id': interface_id_dst + } + } + + if is_virtual: + qkd_link['virt_prev_hop'] = virt_prev_hop + qkd_link['virt_next_hop'] = virt_next_hops or [] + qkd_link['virt_bandwidth'] = virt_bandwidth + + + data = {'qkd_links': {'qkd_link': [qkd_link]}} + + requests.post(url, json=data) + diff --git a/src/device/service/drivers/qkd/__init__.py b/src/device/service/drivers/qkd/__init__.py new file mode 100644 index 000000000..15a32c574 --- /dev/null +++ b/src/device/service/drivers/qkd/__init__.py @@ -0,0 +1,27 @@ +from device.service.driver_api._Driver import RESOURCE_ENDPOINTS, RESOURCE_INTERFACES, RESOURCE_NETWORK_INSTANCES + +RESOURCE_LINKS = '__links__' +RESOURCE_APPS = '__apps__' +RESOURCE_CAPABILITES = '__capabilities__' +RESOURCE_NODE = '__node__' + + +ALL_RESOURCE_KEYS = [ + RESOURCE_ENDPOINTS, + RESOURCE_INTERFACES, + RESOURCE_NETWORK_INSTANCES, + RESOURCE_LINKS, + RESOURCE_APPS, + RESOURCE_CAPABILITES, + RESOURCE_NODE +] + +RESOURCE_KEY_MAPPINGS = { + RESOURCE_ENDPOINTS : 'component', + RESOURCE_INTERFACES : 'interface', + RESOURCE_NETWORK_INSTANCES: 'network_instance', + RESOURCE_LINKS : 'links', + RESOURCE_APPS : 'apps', + RESOURCE_CAPABILITES : 'capabilities', + RESOURCE_NODE : 'node' +} \ No newline at end of file diff --git a/src/tests/tools/mock_qkd_nodes/YangValidator.py b/src/tests/tools/mock_qkd_nodes/YangValidator.py new file mode 100644 index 000000000..2056d5df6 --- /dev/null +++ b/src/tests/tools/mock_qkd_nodes/YangValidator.py @@ -0,0 +1,42 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 libyang, os +from typing import Dict, Optional + +YANG_DIR = os.path.join(os.path.dirname(__file__), 'yang') + +class YangValidator: + def __init__(self, main_module : str, dependency_modules : [str]) -> None: + self._yang_context = libyang.Context(YANG_DIR) + + self._yang_module = self._yang_context.load_module(main_module) + mods = [self._yang_context.load_module(mod) for mod in dependency_modules] + [self._yang_module] + + for mod in mods: + mod.feature_enable_all() + + + + def parse_to_dict(self, message : Dict) -> Dict: + dnode : Optional[libyang.DNode] = self._yang_module.parse_data_dict( + message, validate_present=True, validate=True, strict=True + ) + if dnode is None: raise Exception('Unable to parse Message({:s})'.format(str(message))) + message = dnode.print_dict() + dnode.free() + return message + + def destroy(self) -> None: + self._yang_context.destroy() diff --git a/src/tests/tools/mock_qkd_nodes/mock.py b/src/tests/tools/mock_qkd_nodes/mock.py new file mode 100644 index 000000000..b5d884197 --- /dev/null +++ b/src/tests/tools/mock_qkd_nodes/mock.py @@ -0,0 +1,355 @@ +import os + +from flask import Flask, request +from YangValidator import YangValidator + +app = Flask(__name__) + + +yang_validator = YangValidator('etsi-qkd-sdn-node', ['etsi-qkd-node-types']) + + +nodes = { + '10.211.36.220:11111': {'node': { + 'qkdn_id': '00000001-0000-0000-0000-000000000000', + }, + 'qkdn_capabilities': { + }, + 'qkd_applications': { + 'qkd_app': [ + { + 'app_id': '00000001-0001-0000-0000-000000000000', + 'client_app_id': [], + 'app_statistics': { + 'statistics': [] + }, + 'app_qos': { + }, + 'backing_qkdl_id': [] + } + ] + }, + 'qkd_interfaces': { + 'qkd_interface': [ + { + 'qkdi_id': '100', + 'qkdi_att_point': { + }, + 'qkdi_capabilities': { + } + }, + { + 'qkdi_id': '101', + 'qkdi_att_point': { + 'device':'10.211.36.220', + 'port':'1001' + }, + 'qkdi_capabilities': { + } + } + ] + }, + 'qkd_links': { + 'qkd_link': [ + + ] + } + }, + + '10.211.36.220:22222': {'node': { + 'qkdn_id': '00000002-0000-0000-0000-000000000000', + }, + 'qkdn_capabilities': { + }, + 'qkd_applications': { + 'qkd_app': [ + { + 'app_id': '00000002-0001-0000-0000-000000000000', + 'client_app_id': [], + 'app_statistics': { + 'statistics': [] + }, + 'app_qos': { + }, + 'backing_qkdl_id': [] + } + ] + }, + 'qkd_interfaces': { + 'qkd_interface': [ + { + 'qkdi_id': '200', + 'qkdi_att_point': { + }, + 'qkdi_capabilities': { + } + }, + { + 'qkdi_id': '201', + 'qkdi_att_point': { + 'device':'10.211.36.220', + 'port':'2001' + }, + 'qkdi_capabilities': { + } + }, + { + 'qkdi_id': '202', + 'qkdi_att_point': { + 'device':'10.211.36.220', + 'port':'2002' + }, + 'qkdi_capabilities': { + } + } + ] + }, + 'qkd_links': { + 'qkd_link': [ + + ] + } + }, + + '10.211.36.220:33333': {'node': { + 'qkdn_id': '00000003-0000-0000-0000-000000000000', + }, + 'qkdn_capabilities': { + }, + 'qkd_applications': { + 'qkd_app': [ + { + 'app_id': '00000003-0001-0000-0000-000000000000', + 'client_app_id': [], + 'app_statistics': { + 'statistics': [] + }, + 'app_qos': { + }, + 'backing_qkdl_id': [] + } + ] + }, + 'qkd_interfaces': { + 'qkd_interface': [ + { + 'qkdi_id': '300', + 'qkdi_att_point': { + }, + 'qkdi_capabilities': { + } + }, + { + 'qkdi_id': '301', + 'qkdi_att_point': { + 'device':'10.211.36.220', + 'port':'3001' + }, + 'qkdi_capabilities': { + } + } + ] + }, + 'qkd_links': { + 'qkd_link': [ + + ] + } + } +} + + +def get_side_effect(url): + + steps = url.lstrip('https://').lstrip('http://').rstrip('/') + ip_port, _, _, header, *steps = steps.split('/') + + header_splitted = header.split(':') + + module = header_splitted[0] + assert(module == 'etsi-qkd-sdn-node') + + tree = {'qkd_node': nodes[ip_port]['node'].copy()} + + if len(header_splitted) == 1 or not header_splitted[1]: + value = nodes[ip_port].copy() + value.pop('node') + tree['qkd_node'].update(value) + + return tree, tree + + root = header_splitted[1] + assert(root == 'qkd_node') + + if not steps: + return tree, tree + + + endpoint, *steps = steps + + value = nodes[ip_port][endpoint] + + if not steps: + return_value = {endpoint:value} + tree['qkd_node'].update(return_value) + + return return_value, tree + + + + ''' + element, *steps = steps + + container, key = element.split('=') + + # value = value[container][key] + + if not steps: + return_value['qkd_node'][endpoint] = [value] + return return_value + + ''' + raise Exception('Url too long') + + + +def edit(from_dict, to_dict, create): + for key, value in from_dict.items(): + if isinstance(value, dict): + if key not in to_dict and create: + to_dict[key] = {} + edit(from_dict[key], to_dict[key], create) + elif isinstance(value, list): + to_dict[key].extend(value) + else: + to_dict[key] = value + + + +def edit_side_effect(url, json, create): + steps = url.lstrip('https://').lstrip('http://').rstrip('/') + ip_port, _, _, header, *steps = steps.split('/') + + module, root = header.split(':') + + assert(module == 'etsi-qkd-sdn-node') + assert(root == 'qkd_node') + + if not steps: + edit(json, nodes[ip_port]['node']) + return + + endpoint, *steps = steps + + if not steps: + edit(json[endpoint], nodes[ip_port][endpoint], create) + return + + + ''' + element, *steps = steps + + container, key = element.split('=') + + if not steps: + if key not in nodes[ip_port][endpoint][container] and create: + nodes[ip_port][endpoint][container][key] = {} + + edit(json, nodes[ip_port][endpoint][container][key], create) + return 0 + ''' + + raise Exception('Url too long') + + + + + + +@app.get('/', defaults={'path': ''}) +@app.get("/") +@app.get('/') +def get(path): + msg, msg_validate = get_side_effect(request.base_url) + print(msg_validate) + yang_validator.parse_to_dict(msg_validate) + return msg + + +@app.post('/', defaults={'path': ''}) +@app.post("/") +@app.post('/') +def post(path): + success = True + reason = '' + try: + edit_side_effect(request.base_url, request.json, True) + except Exception as e: + reason = str(e) + success = False + return {'success': success, 'reason': reason} + + + +@app.route('/', defaults={'path': ''}, methods=['PUT', 'PATCH']) +@app.route("/", methods=['PUT', 'PATCH']) +@app.route('/', methods=['PUT', 'PATCH']) +def patch(path): + success = True + reason = '' + try: + edit_side_effect(request.base_url, request.json, False) + except Exception as e: + reason = str(e) + success = False + return {'success': success, 'reason': reason} + + + + + +# import json +# from mock import requests +# import pyangbind.lib.pybindJSON as enc +# from pyangbind.lib.serialise import pybindJSONDecoder as dec +# from yang.sbi.qkd.templates.etsi_qkd_sdn_node import etsi_qkd_sdn_node + +# module = etsi_qkd_sdn_node() +# url = 'https://1.1.1.1/restconf/data/etsi-qkd-sdn-node:' + +# # Get node all info +# z = requests.get(url).json() +# var = dec.load_json(z, None, None, obj=module) +# print(enc.dumps(var)) + + +# Reset module variable because it is already filled +# module = etsi_qkd_sdn_node() + +# # Get node basic info +# node = module.qkd_node +# z = requests.get(url + 'qkd_node').json() +# var = dec.load_json(z, None, None, obj=node) +# print(enc.dumps(var)) + + +# # Get all apps +# apps = node.qkd_applications +# z = requests.get(url + 'qkd_node/qkd_applications').json() +# var = dec.load_json(z, None, None, obj=apps) +# print(enc.dumps(var)) + +# # Edit app 0 +# app = apps.qkd_app['00000000-0001-0000-0000-000000000000'] +# app.client_app_id = 'id_0' +# requests.put(url + 'qkd_node/qkd_applications/qkd_app=00000000-0001-0000-0000-000000000000', json=json.loads(enc.dumps(app))) + +# # Create app 1 +# app = apps.qkd_app.add('00000000-0001-0000-0000-000000000001') +# requests.post(url + 'qkd_node/qkd_applications/qkd_app=00000000-0001-0000-0000-000000000001', json=json.loads(enc.dumps(app))) + +# # Get all apps +# apps = node.qkd_applications +# z = requests.get(url + 'qkd_node/qkd_applications').json() +# var = dec.load_json(z, None, None, obj=apps) +# print(enc.dumps(var)) diff --git a/src/tests/tools/mock_qkd_nodes/start.sh b/src/tests/tools/mock_qkd_nodes/start.sh new file mode 100755 index 000000000..cf8ee7533 --- /dev/null +++ b/src/tests/tools/mock_qkd_nodes/start.sh @@ -0,0 +1,17 @@ +#!/bin/bash +cd "$(dirname "$0")" + + +#!/bin/bash +killbg() { + for p in "${pids[@]}" ; do + kill "$p"; + done +} +trap killbg EXIT +pids=() +flask --app mock run --host 0.0.0.0 --port 11111 & +pids+=($!) +flask --app mock run --host 0.0.0.0 --port 22222 & +pids+=($!) +flask --app mock run --host 0.0.0.0 --port 33333 diff --git a/src/tests/tools/mock_qkd_nodes/yang/etsi-qkd-node-types.yang b/src/tests/tools/mock_qkd_nodes/yang/etsi-qkd-node-types.yang new file mode 100644 index 000000000..04bbd8a87 --- /dev/null +++ b/src/tests/tools/mock_qkd_nodes/yang/etsi-qkd-node-types.yang @@ -0,0 +1,326 @@ +/* Copyright 2022 ETSI +Licensed under the BSD-3 Clause (https://forge.etsi.org/legal-matters) */ + +module etsi-qkd-node-types { + + yang-version "1"; + + namespace "urn:etsi:qkd:yang:etsi-qkd-node-types"; + + prefix "etsi-qkdn-types"; + + organization "ETSI ISG QKD"; + + contact + "https://www.etsi.org/committee/qkd + vicente@fi.upm.es"; + + description + "This module contains the base types created for + the software-defined QKD node information models + specified in ETSI GS QKD 015 V2.1.1 + - QKD-TECHNOLOGY-TYPES + - QKDN-STATUS-TYPES + - QKD-LINK-TYPES + - QKD-ROLE-TYPES + - QKD-APP-TYPES + - Wavelength + "; + + revision "2022-01-30" { + description + "Refinement of the YANG model to make it compatible with the ETSI ISG QKD 018. Minor fixes."; + } + + revision "2020-09-30" { + description + "First definition based on initial requirement analysis."; + } + + identity QKD-TECHNOLOGY-TYPES { + description "Quantum Key Distribution System base technology types."; + } + + identity CV-QKD { + base QKD-TECHNOLOGY-TYPES; + description "Continuous Variable base technology."; + } + + identity DV-QKD { + base QKD-TECHNOLOGY-TYPES; + description "Discrete Variable base technology."; + } + + identity DV-QKD-COW { + base QKD-TECHNOLOGY-TYPES; + description "COW base technology."; + } + + identity DV-QKD-2Ws { + base QKD-TECHNOLOGY-TYPES; + description "2-Ways base technology."; + } + + typedef qkd-technology-types { + type identityref { + base QKD-TECHNOLOGY-TYPES; + } + description "This type represents the base technology types of the SD-QKD system."; + } + + identity QKDN-STATUS-TYPES { + description "Base identity used to identify the SD-QKD node status."; + } + + identity NEW { + base QKDN-STATUS-TYPES; + description "The QKD node is installed."; + } + + identity OPERATING { + base QKDN-STATUS-TYPES; + description "The QKD node is up."; + } + + identity DOWN { + base QKDN-STATUS-TYPES; + description "The QKD node is not working as expected."; + } + + identity FAILURE { + base QKDN-STATUS-TYPES; + description "The QKD node cannot be accessed by SDN controller with communication failure."; + } + + identity OUT { + base QKDN-STATUS-TYPES; + description "The QKD node is switched off and uninstalled."; + } + + typedef qkdn-status-types { + type identityref { + base QKDN-STATUS-TYPES; + } + description "This type represents the status of the SD-QKD node."; + } + + identity QKD-LINK-TYPES { + description "QKD key association link types."; + } + + identity VIRT { + base QKD-LINK-TYPES; + description "Virtual Link."; + } + + identity PHYS { + base QKD-LINK-TYPES; + description "Physical Link."; + } + + typedef qkd-link-types { + type identityref { + base QKD-LINK-TYPES; + } + description "This type represents the key association link type between two SD-QKD nodes."; + } + + identity QKD-ROLE-TYPES { + description "QKD Role Type."; + } + + identity TRANSMITTER { + base QKD-ROLE-TYPES; + description "QKD module working as transmitter."; + } + + identity RECEIVER { + base QKD-ROLE-TYPES; + description "QKD module working as receiver."; + } + + identity TRANSCEIVER { + base QKD-ROLE-TYPES; + description "QKD System that can work as a transmitter or receiver."; + } + + typedef qkd-role-types { + type identityref { + base QKD-ROLE-TYPES; + } + description "This type represents the working mode of a SD-QKD module."; + } + + identity QKD-APP-TYPES { + description "Application types."; + } + + identity CLIENT { + base QKD-APP-TYPES; + description "Application working as client."; + } + + identity INTERNAL { + base QKD-APP-TYPES; + description "Internal QKD node application."; + } + + typedef qkd-app-types { + type identityref { + base QKD-APP-TYPES; + } + description "This type represents the application class consuming key from SD-QKD nodes."; + } + + identity PHYS-PERF-TYPES { + description "Physical performance types."; + } + + identity QBER { + base PHYS-PERF-TYPES; + description "Quantum Bit Error Rate."; + } + + identity SNR { + base PHYS-PERF-TYPES; + description "Signal to Noise Ratio."; + } + + typedef phys-perf-types { + type identityref { + base PHYS-PERF-TYPES; + } + description "This type represents physical performance types."; + } + + identity LINK-STATUS-TYPES { + description "Status of the key association QKD link (physical and virtual)."; + } + + identity ACTIVE { + base LINK-STATUS-TYPES; + description "Link actively generating keys."; + } + + identity PASSIVE { + base LINK-STATUS-TYPES; + description "No key generation on key association QKD link but a pool of keys + are still available."; + } + + identity PENDING { + base LINK-STATUS-TYPES; + description "Waiting for activation and no keys are available."; + } + + identity OFF { + base LINK-STATUS-TYPES; + description "No key generation and no keys are available."; + } + + typedef link-status-types { + type identityref { + base LINK-STATUS-TYPES; + } + description "This type represents the status of a key association QKD link, both physical and virtual."; + } + + /// + + identity IFACE-STATUS-TYPES { + description "Interface Status."; + } + + identity ENABLED { + base IFACE-STATUS-TYPES; + description "The interfaces is up."; + } + + identity DISABLED { + base IFACE-STATUS-TYPES; + description "The interfaces is down."; + } + + identity FAILED { + base IFACE-STATUS-TYPES; + description "The interfaces has failed."; + } + + typedef iface-status-types { + type identityref { + base IFACE-STATUS-TYPES; + } + description "This type represents the status of a interface between a SD-QKD node and a SD-QKD module."; + } + + identity APP-STATUS-TYPES { + description "Application types."; + } + + identity ON { + base APP-STATUS-TYPES; + description "The application is on."; + } + + identity DISCONNECTED { + base APP-STATUS-TYPES; + description "The application is disconnected."; + } + + identity OUT-OF-TIME { + base APP-STATUS-TYPES; + description "The application is out of time."; + } + + identity ZOMBIE { + base APP-STATUS-TYPES; + description "The application is in a zombie state."; + } + + typedef app-status-types { + type identityref { + base APP-STATUS-TYPES; + } + description "This type represents the status of an application consuming key from SD-QKD nodes."; + } + + identity SEVERITY-TYPES { + description "Error/Failure severity levels."; + } + + identity MAJOR { + base SEVERITY-TYPES; + description "Major error/failure."; + } + + identity MINOR { + base SEVERITY-TYPES; + description "Minor error/failure."; + } + + typedef severity-types { + type identityref { + base SEVERITY-TYPES; + } + description "This type represents the Error/Failure severity levels."; + } + + typedef wavelength { + type string { + pattern "([1-9][0-9]{0,3})"; + } + description + "A WDM channel number (starting at 1). For example: 20"; + } + + //Pattern from "A Yang Data Model for WSON Optical Networks". + typedef wavelength-range-type { + type string { + pattern "([1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?" + + "(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)"; + } + description + "A list of WDM channel numbers (starting at 1) + in ascending order. For example: 1,12-20,40,50-80"; + } +} diff --git a/src/tests/tools/mock_qkd_nodes/yang/etsi-qkd-sdn-node.yang b/src/tests/tools/mock_qkd_nodes/yang/etsi-qkd-sdn-node.yang new file mode 100644 index 000000000..d07004cdc --- /dev/null +++ b/src/tests/tools/mock_qkd_nodes/yang/etsi-qkd-sdn-node.yang @@ -0,0 +1,941 @@ +/* Copyright 2022 ETSI +Licensed under the BSD-3 Clause (https://forge.etsi.org/legal-matters) */ + +module etsi-qkd-sdn-node { + + yang-version "1"; + + namespace "urn:etsi:qkd:yang:etsi-qkd-node"; + + prefix "etsi-qkdn"; + + import ietf-yang-types { prefix "yang"; } + import ietf-inet-types { prefix "inet"; } + import etsi-qkd-node-types { prefix "etsi-qkdn-types"; } + + // meta + organization "ETSI ISG QKD"; + + contact + "https://www.etsi.org/committee/qkd + vicente@fi.upm.es"; + + description + "This module contains the groupings and containers composing + the software-defined QKD node information models + specified in ETSI GS QKD 015 V2.1.1"; + + revision "2022-01-30" { + description + "Refinement of the YANG model to make it compatible with the ETSI ISG QKD 018. Minor fixes."; + reference + "ETSI GS QKD 015 V2.1.1 (2022-01)"; + } + + revision "2020-09-30" { + description + "First definition based on initial requirement analysis."; + reference + "ETSI GS QKD 015 V1.1.1 (2021-03)"; + } + + grouping qkdn_id { + description "Grouping of qkdn_id leaf."; + + leaf qkdn_id { + type yang:uuid; + mandatory true; + description + "This value reflects the unique ID of the SD-QKD node."; + } + } + + grouping qkdn_version { + description "Grouping of qkdn_version leaf."; + + leaf qkdn_version { + type string; + description "Hardware or software version of the SD-QKD node."; + } + } + + grouping qkdn_location_id { + description "Grouping of qkdn_location_id leaf."; + + leaf qkdn_location_id { + type string; + default ""; + description + "This value enables the location of the secure + area that contains the SD-QKD node to be specified."; + } + } + + grouping qkdn_status { + description "Grouping of qkdn_status leaf."; + + leaf qkdn_status { + type etsi-qkdn-types:qkdn-status-types; + config false; + description "Status of the SD-QKD node."; + } + } + + grouping qkdn_capabilities { + description "Grouping of the capabilities of the SD-QKD node."; + + container qkdn_capabilities { + description "Capabilities of the SD-QKD node."; + + leaf link_stats_support { + type boolean; + default true; + description + "If true, this node exposes link-related statistics (secure key + generation rate-SKR, link consumption, status, QBER)."; + } + + leaf application_stats_support { + type boolean; + default true; + description "If true, this node exposes application related + statistics (application consumption, alerts)."; + } + + leaf key_relay_mode_enable { + type boolean; + default true; + description "If true, this node supports key relay (multi-hop) mode services."; + } + } + } + + grouping app_id { + description "Grouping of app_id leaf."; + + leaf app_id { + type yang:uuid; + description + "Unique ID that identifies a QKD application consisting of a set of entities + that are allowed to receive keys shared with each other from the SD-QKD nodes + they connect to. This value is similar to a key ID or key handle."; + } + } + + grouping app_basic { + description "Grouping of app's basic parameters."; + + uses app_id; + + leaf app_status { + type etsi-qkdn-types:app-status-types; + config false; + description "Status of the application."; + } + } + + grouping app_priority { + description "Grouping of app_priority leaf."; + + leaf app_priority { + type uint32; + default 0; + description "Priority of the association/application + might be defined by the user but usually + handled by a network administrator."; + } + } + + grouping app_details { + description "Grouping of app's details parameters."; + + leaf app_type { + type etsi-qkdn-types:qkd-app-types; + description "Type of the registered application. These + values, defined within the types module, can be client + (if an external applications requesting keys) + or internal (application is defined to maintain + the QKD - e.g. multi-hop, authentication or + other encryption operations)."; + } + + leaf server_app_id { + type inet:uri; + description "ID that identifies the entity that initiated the + creation of the QKD application to receive keys shared with one + or more specified target entity identified by client_app_id. + It is a client in the interface to the SD-QKD node and the name + server_app_id reflects that it requested the QKD application to + be initiated."; + } + + leaf-list client_app_id { + type inet:uri; + description "List of IDs that identifies the one or more + entities that are allowed to receive keys from SD-QKD + node(s) under the QKD application in addition to the + initiating entity identified by server_app_id."; + } + + uses app_priority; + } + + grouping local_qkdn_id { + description "Grouping of local_qkdn_id leaf."; + + leaf local_qkdn_id { + type yang:uuid; + description "Unique ID of the local SD-QKD node which + is providing QKD keys to the local application."; + } + } + + grouping app_time { + description "Grouping of app's time parameters."; + + leaf creation_time { + type yang:date-and-time; + config false; + description "Date and time of the service creation."; + } + + leaf expiration_time { + type yang:date-and-time; + description "Date and time of the service expiration."; + } + } + + grouping app_statistics { + description "Grouping of app's statistic parameters."; + + container app_statistics { + description "Statistical information relating to a specific statistic period of time."; + + list statistics { + key "end_time"; + config false; + description "List of statistics."; + + leaf end_time { + type yang:date-and-time; + config false; + description "End time for the statistic period."; + } + + leaf start_time { + type yang:date-and-time; + config false; + description "Start time for the statistic period."; + } + + leaf consumed_bits { + type uint32; + config false; + description "Consumed secret key amount (in bits) for a statistics collection period of time."; + } + } + } + } + + grouping app_qos { + description "Grouping of app's basic qos parameters."; + + container app_qos { + description "Requested Quality of Service."; + + leaf max_bandwidth { + type uint32; + description "Maximum bandwidth (in bits per second) allowed for + this specific application. Exceeding this value will raise an + error from the local key store to the appl. This value might + be internally configured (or by an admin) with a default value."; + } + + leaf min_bandwidth { + type uint32; + description "This value is an optional QoS parameter which + enables to require a minimum key rate (in bits per second) + for the application."; + } + + leaf jitter { + type uint32; + description "This value allows to specify the maximum jitter + (in msec) to be provided by the key delivery API for + applications requiring fast rekeying. This value can be + coordinated with the other QoS to provide a wide enough + QoS definition."; + } + + leaf ttl { + type uint32; + description "This value is used to specify the maximum time + (in seconds) that a key could be kept in the key store for + a given application without being used."; + } + } + } + + grouping augmented_app_qos { + description "Grouping of app's detailed qos parameters."; + + uses app_qos { + augment app_qos { + description "Augmentation of app's basic parameters with app's detailed qos parameters."; + + leaf clients_shared_path_enable { + type boolean; + default false; + description "If true, multiple clients for this + application might share keys to reduce service + impact (consumption)."; + } + + leaf clients_shared_keys_required { + type boolean; + default false; + description "If true, multiple clients for this application + might share keys to reduce service impact (consumption)."; + } + } + } + } + + grouping qkd_applications { + description "Grouping of the list of applications container."; + + container qkd_applications { + description "List of applications container."; + + list qkd_app { + key "app_id"; + description "List of applications that are currently registered + in the SD-QKD node. Any entity consuming QKD-derived keys (either + for internal or external purposes) is considered an application."; + + uses app_basic; + + uses app_details; + + uses app_time; + + uses app_statistics; + + uses augmented_app_qos; + + leaf-list backing_qkdl_id { + type yang:uuid; + description "Unique ID of the key association link which is + providing QKD keys to these applications."; + } + + uses local_qkdn_id; + + leaf remote_qkdn_id { + type yang:uuid; + description "Unique ID of the remote SD-QKD node which + is providing QKD keys to the remote application. + While unknown, the local SD-QKD will not be able to + provide keys to the local application."; + } + } + } + } + + grouping qkdi_status { + description "Grouping of qkdi_status leaf."; + + leaf qkdi_status { + type etsi-qkdn-types:iface-status-types; + config false; + description "Status of a QKD interface of the SD-QKD node."; + } + } + + grouping qkdi_model { + description "Grouping of qkdi_model leaf."; + + leaf qkdi_model { + type string; + description "Device model (vendor/device)."; + } + } + + grouping qkdi_type { + description "Grouping of qkdi_type leaf."; + + leaf qkdi_type { + type etsi-qkdn-types:qkd-technology-types; + description "Interface type (QKD technology)."; + } + } + + grouping qkdi_att_point { + description "Grouping of the interface attachment points to an optical switch."; + + container qkdi_att_point { + description "Interface attachment point to an optical switch."; + + leaf device { + type string; + description "Unique ID of the optical switch (or + passive component) to which the interface is connected."; + } + + leaf port { + type uint32; + description "Port ID of the device to which the interface + is connected."; + } + } + } + + grouping qkdi_id { + description "Grouping of qkdi_id leaf."; + + leaf qkdi_id { + type uint32; + description "Interface id. It is described as a locally unique number, + which is globally unique when combined with the SD-QKD node ID."; + } + } + + grouping qkd_interface_item { + description "Grouping of the interface parameters."; + + uses qkdi_id; + + uses qkdi_model; + + uses qkdi_type; + + uses qkdi_att_point; + + container qkdi_capabilities { + description "Capabilities of the QKD system (interface)."; + + leaf role_support { + type etsi-qkdn-types:qkd-role-types; + description "QKD node support for key relay mode services."; + } + + leaf wavelength_range { + type etsi-qkdn-types:wavelength-range-type; + description "Range of supported wavelengths (nm) (multiple + if it contains a tunable laser)."; + } + + leaf max_absorption { + type decimal64 { + fraction-digits 3; + } + description "Maximum absorption supported (in dB)."; + } + } + } + + grouping qkd_interfaces { + description "Grouping of the list of interfaces."; + + container qkd_interfaces { + description "List of interfaces container."; + + list qkd_interface { + key "qkdi_id"; + description "List of physical QKD modules in a secure location, + abstracted as interfaces of the SD-QKD node."; + + uses qkd_interface_item; + + uses qkdi_status; + + } + } + } + + grouping qkdl_id { + description "Grouping of qkdl_id leaf."; + + leaf qkdl_id { + type yang:uuid; + description "Unique ID of the QKD link (key association)."; + } + } + + grouping qkdl_status { + description "Grouping of qkdl_status leaf."; + + leaf qkdl_status { + type etsi-qkdn-types:link-status-types; + description "Status of the QKD key association link."; + } + } + + grouping common_performance { + description "Grouping of common performance parameters."; + + leaf expected_consumption { + type uint32; + config false; + description "Sum of all the application's bandwidth (in bits per + second) on this particular key association link."; + } + + leaf skr { + type uint32; + config false; + description "Secret key rate generation (in bits per second) + of the key association link."; + } + + leaf eskr { + type uint32; + config false; + description "Effective secret key rate (in bits per second) generation + of the key association link available after internal consumption."; + } + } + + grouping physical_link_perf { + description "Grouping of the list of physical performance parameters."; + + list phys_perf { + key "perf_type"; + config false; + description "List of physical performance parameters."; + + leaf perf_type { + type etsi-qkdn-types:phys-perf-types; + config false; + description "Type of the physical performance value to be + exposed to the controller."; + } + + leaf value { + type decimal64 { + fraction-digits 3; + } + config false; + description "Numerical value for the performance parameter + type specified above."; + } + } + } + + grouping virtual_link_spec { + description "Grouping of the virtual link's parameters."; + + leaf virt_prev_hop { + type yang:uuid; + description "Previous hop in a multi-hop/virtual key + association link config."; + } + + leaf-list virt_next_hop { + type yang:uuid; + description "Next hop(s) in a multihop/virtual key + association link config. Defined as a list for multicast + over shared sub-paths."; + } + + leaf virt_bandwidth { + type uint32; + description "Required bandwidth (in bits per second) for that key association link. + Used to reserve bandwidth from the physical QKD links to support the virtual key + association link as an internal application."; + } + } + + grouping physical_link_spec { + description "Grouping of the physical link's parameters."; + + leaf phys_channel_att { + type decimal64 { + fraction-digits 3; + } + description "Expected attenuation on the quantum channel (in dB) + between the Source/qkd_node and Destination/qkd_node."; + + } + + leaf phys_wavelength { + type etsi-qkdn-types:wavelength; + description "Wavelength (in nm) to be used for the quantum channel. + If the interface is not tunable, this configuration could be bypassed"; + } + + leaf phys_qkd_role { + type etsi-qkdn-types:qkd-role-types; + description "Transmitter/receiver mode for the QKD module. + If there is no multi-role support, this could be ignored."; + } + } + + grouping qkd_links { + description "Grouping of the list of links."; + + container qkd_links { + description "List of links container"; + + list qkd_link { + key "qkdl_id"; + description "List of (key association) links to other SD-QKD nodes in the network. + The links can be physical (direct quantum channel) or virtual multi-hop + connection doing key-relay through several nodes."; + + uses qkdl_id; + + uses qkdl_status; + + leaf qkdl_enable { + type boolean; + default true; + description "This value allows to enable of disable the key generation + process for a given link."; + + } + + container qkdl_local { + description "Source (local) node of the SD-QKD link."; + + leaf qkdn_id { + type yang:uuid; + description "Unique ID of the local SD-QKD node."; + } + + leaf qkdi_id { + type uint32; + description "Interface used to create the key association link."; + } + } + + container qkdl_remote { + description "Destination (remote) unique SD-QKD node."; + + leaf qkdn_id { + type yang:uuid; + description "Unique ID of the remote SD-QKD node. This value is + provided by the SDN controller when the key association link + request arrives."; + } + + leaf qkdi_id { + type uint32; + description "Interface used to create the link."; + } + } + + leaf qkdl_type { + type etsi-qkdn-types:qkd-link-types; + description "Key Association Link type: Virtual (multi-hop) or Direct."; + } + + leaf-list qkdl_applications { + type yang:uuid; + description "Applications which are consuming keys from + this key association link."; + } + + uses virtual_link_spec { + when "qkdl_type = 'etsi-qkd-node-types:VIRT'" { + description "Virtual key association link specific configuration."; + } + } + + uses physical_link_spec { + when "qkdl_type = 'etsi-qkd-node-types:PHYS'" { + description "Physical key association link specific configuration."; + } + } + + container qkdl_performance { + description "Container of link's performace parameters."; + + uses common_performance; + + uses physical_link_perf { + when "../qkdl_type = 'PHYS'" { + description "Performance of the specific physical link."; + } + } + } + } + } + } + + container qkd_node { + description + "Top module describing a software-defined QKD node (SD-QKD node)."; + + uses qkdn_id; + + uses qkdn_status; + + uses qkdn_version; + + uses qkdn_location_id; + + uses qkdn_capabilities; + + uses qkd_applications; + + uses qkd_interfaces; + + uses qkd_links; + } + + grouping message { + description "Grouping of message leaf."; + + leaf message { + type string; + description "Placeholder for the message."; + } + } + + grouping severity { + description "Grouping of severity leaf."; + + leaf severity { + type etsi-qkdn-types:severity-types; + description "Placeholder for the severity."; + } + } + + grouping reason { + description "Grouping of reason leaf."; + + leaf reason { + type string; + description "Auxiliary parameter to include additional + information about the reason for link failure."; + } + } + + notification sdqkdn_application_new { + description "Defined for the controller to detect new applications + requesting keys from a QKD node. This maps with the workflow shown + in clause 5.2 'QKD Application Registration'. Parameters such as + client and server app IDs, local QKD node identifier, priority and + QoS are sent in the notification."; + + container qkd_application { + description "'sdqkdn_application_new' notification's qkd_application parameters."; + + uses app_details; + + uses local_qkdn_id; + + uses augmented_app_qos; + + } + } + + notification sdqkdn_application_qos_update { + description "Notification that includes information about priority or + QoS changes on an existing and already registered application."; + + container qkd_application { + description "'sdqkdn_application_qos_update' notification's qkd_application parameters."; + + uses app_id; + + uses augmented_app_qos; + + uses app_priority; + + } + } + + notification sdqkdn_application_disconnected { + description "Includes the application identifier to inform that the + application is no longer registered and active in the QKD node."; + + container qkd_application { + description "'sdqkdn_application_disconnected' notification's qkd_application parameters."; + + uses app_id; + + } + } + + notification sdqkdn_interface_new { + description "Includes all the information about the new QKD system + installed in the secure location of a given QKD node."; + + container qkd_interface { + description "'sdqkdn_interface_new' notification's qkd_interface parameters."; + + uses qkd_interface_item; + + } + } + + notification sdqkdn_interface_down { + description "Identifies an interface within a QKD node which is not + working as expected, allowing additional information to be included + in a 'reason' string field."; + + container qkd_interface { + description "'sdqkdn_interface_down' notification's qkd_interface parameters."; + + uses qkdi_id; + + uses reason; + + } + } + + notification sdqkdn_interface_out { + description "Contains the ID of an interface which is switch off and + uninstall from a QKD node. This information can be gathered from this + notification or from regular polling from the controller's side."; + + container qkd_interface { + description "'sdqkdn_interface_out' notification's qkd_interface parameters."; + + uses qkdi_id; + + } + } + + notification sdqkdn_link_down { + description "As in the interface down event, this notification contains + the identifier of a given link which has gone down unexpectedly. + In addition, further information can be sent in the 'reason' field."; + + container qkd_link { + description "'sdqkdn_link_down' notification's qkd_link parameters."; + + uses qkdl_id; + + uses reason; + + } + } + + notification sdqkdn_link_perf_update { + description "This notification allows to inform of any mayor + modification in the performance of an active link. The identifier + of the link is sent together with the performance parameters of the link."; + + container qkd_link { + description "'sdqkdn_link_perf_update' notification's qkd_link parameters."; + + uses qkdl_id; + + container performance { + description "'sdqkdn_link_perf_update' notification's performance parameters."; + + uses common_performance; + + uses physical_link_perf; + + } + } + } + + notification sdqkdn_link_overloaded { + description "This notification is sent when the link cannot cope with the + demand. The link identifier is sent with the expected consumption and + general performance parameters."; + + container qkd_link { + description "'sdqkdn_link_overloaded' notification's qkd_link parameters."; + + uses qkdl_id; + + container performance { + description "'sdqkdn_link_overloaded' notification's performance parameters."; + + uses common_performance; + + } + } + } + + notification alarm { + description "'alarm' notification."; + + container link { + description "'alarm' notification's link parameters."; + + uses qkdl_id; + + uses qkdl_status; + + uses message; + + uses severity; + + } + + container interface { + description "'alarm' notification's interface parameters."; + + uses qkdi_id; + + uses qkdi_status; + + uses message; + + uses severity; + + } + + container application { + description "'alarm' notification's application parameters."; + + uses app_basic; + + uses message; + + uses severity; + + } + + } + + notification event { + description "'event' notification."; + + container link { + description "'alarm' notification's link parameters."; + + uses qkdl_id; + + uses qkdl_status; + + uses message; + + uses severity; + + } + + container interface { + description "'alarm' notification's interface parameters."; + + uses qkdi_id; + + uses qkdi_status; + + uses message; + + uses severity; + + } + + container application { + description "'alarm' notification's application parameters."; + + uses app_basic; + + uses message; + + uses severity; + + } + + } + +} diff --git a/src/tests/tools/mock_qkd_nodes/yang/ietf-inet-types.yang b/src/tests/tools/mock_qkd_nodes/yang/ietf-inet-types.yang new file mode 100644 index 000000000..eacefb636 --- /dev/null +++ b/src/tests/tools/mock_qkd_nodes/yang/ietf-inet-types.yang @@ -0,0 +1,458 @@ +module ietf-inet-types { + + namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types"; + prefix "inet"; + + organization + "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; + + contact + "WG Web: + WG List: + + WG Chair: David Kessens + + + WG Chair: Juergen Schoenwaelder + + + Editor: Juergen Schoenwaelder + "; + + description + "This module contains a collection of generally useful derived + YANG data types for Internet addresses and related things. + + Copyright (c) 2013 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6991; see + the RFC itself for full legal notices."; + + revision 2013-07-15 { + description + "This revision adds the following new data types: + - ip-address-no-zone + - ipv4-address-no-zone + - ipv6-address-no-zone"; + reference + "RFC 6991: Common YANG Data Types"; + } + + revision 2010-09-24 { + description + "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + } + + /*** collection of types related to protocol fields ***/ + + typedef ip-version { + type enumeration { + enum unknown { + value "0"; + description + "An unknown or unspecified version of the Internet + protocol."; + } + enum ipv4 { + value "1"; + description + "The IPv4 protocol as defined in RFC 791."; + } + enum ipv6 { + value "2"; + description + "The IPv6 protocol as defined in RFC 2460."; + } + } + description + "This value represents the version of the IP protocol. + + In the value set and its semantics, this type is equivalent + to the InetVersion textual convention of the SMIv2."; + reference + "RFC 791: Internet Protocol + RFC 2460: Internet Protocol, Version 6 (IPv6) Specification + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + typedef dscp { + type uint8 { + range "0..63"; + } + description + "The dscp type represents a Differentiated Services Code Point + that may be used for marking packets in a traffic stream. + In the value set and its semantics, this type is equivalent + to the Dscp textual convention of the SMIv2."; + reference + "RFC 3289: Management Information Base for the Differentiated + Services Architecture + RFC 2474: Definition of the Differentiated Services Field + (DS Field) in the IPv4 and IPv6 Headers + RFC 2780: IANA Allocation Guidelines For Values In + the Internet Protocol and Related Headers"; + } + + typedef ipv6-flow-label { + type uint32 { + range "0..1048575"; + } + description + "The ipv6-flow-label type represents the flow identifier or Flow + Label in an IPv6 packet header that may be used to + discriminate traffic flows. + + In the value set and its semantics, this type is equivalent + to the IPv6FlowLabel textual convention of the SMIv2."; + reference + "RFC 3595: Textual Conventions for IPv6 Flow Label + RFC 2460: Internet Protocol, Version 6 (IPv6) Specification"; + } + + typedef port-number { + type uint16 { + range "0..65535"; + } + description + "The port-number type represents a 16-bit port number of an + Internet transport-layer protocol such as UDP, TCP, DCCP, or + SCTP. Port numbers are assigned by IANA. A current list of + all assignments is available from . + + Note that the port number value zero is reserved by IANA. In + situations where the value zero does not make sense, it can + be excluded by subtyping the port-number type. + In the value set and its semantics, this type is equivalent + to the InetPortNumber textual convention of the SMIv2."; + reference + "RFC 768: User Datagram Protocol + RFC 793: Transmission Control Protocol + RFC 4960: Stream Control Transmission Protocol + RFC 4340: Datagram Congestion Control Protocol (DCCP) + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + /*** collection of types related to autonomous systems ***/ + + typedef as-number { + type uint32; + description + "The as-number type represents autonomous system numbers + which identify an Autonomous System (AS). An AS is a set + of routers under a single technical administration, using + an interior gateway protocol and common metrics to route + packets within the AS, and using an exterior gateway + protocol to route packets to other ASes. IANA maintains + the AS number space and has delegated large parts to the + regional registries. + + Autonomous system numbers were originally limited to 16 + bits. BGP extensions have enlarged the autonomous system + number space to 32 bits. This type therefore uses an uint32 + base type without a range restriction in order to support + a larger autonomous system number space. + + In the value set and its semantics, this type is equivalent + to the InetAutonomousSystemNumber textual convention of + the SMIv2."; + reference + "RFC 1930: Guidelines for creation, selection, and registration + of an Autonomous System (AS) + RFC 4271: A Border Gateway Protocol 4 (BGP-4) + RFC 4001: Textual Conventions for Internet Network Addresses + RFC 6793: BGP Support for Four-Octet Autonomous System (AS) + Number Space"; + } + + /*** collection of types related to IP addresses and hostnames ***/ + + typedef ip-address { + type union { + type inet:ipv4-address; + type inet:ipv6-address; + } + description + "The ip-address type represents an IP address and is IP + version neutral. The format of the textual representation + implies the IP version. This type supports scoped addresses + by allowing zone identifiers in the address format."; + reference + "RFC 4007: IPv6 Scoped Address Architecture"; + } + + typedef ipv4-address { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '(%[\p{N}\p{L}]+)?'; + } + description + "The ipv4-address type represents an IPv4 address in + dotted-quad notation. The IPv4 address may include a zone + index, separated by a % sign. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format for the zone index is the numerical + format"; + } + + typedef ipv6-address { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(%[\p{N}\p{L}]+)?'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(%.+)?'; + } + description + "The ipv6-address type represents an IPv6 address in full, + mixed, shortened, and shortened-mixed notation. The IPv6 + address may include a zone index, separated by a % sign. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format of IPv6 addresses uses the textual + representation defined in Section 4 of RFC 5952. The + canonical format for the zone index is the numerical + format as described in Section 11.2 of RFC 4007."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + typedef ip-address-no-zone { + type union { + type inet:ipv4-address-no-zone; + type inet:ipv6-address-no-zone; + } + description + "The ip-address-no-zone type represents an IP address and is + IP version neutral. The format of the textual representation + implies the IP version. This type does not support scoped + addresses since it does not allow zone identifiers in the + address format."; + reference + "RFC 4007: IPv6 Scoped Address Architecture"; + } + + typedef ipv4-address-no-zone { + type inet:ipv4-address { + pattern '[0-9\.]*'; + } + description + "An IPv4 address without a zone index. This type, derived from + ipv4-address, may be used in situations where the zone is + known from the context and hence no zone index is needed."; + } + + typedef ipv6-address-no-zone { + type inet:ipv6-address { + pattern '[0-9a-fA-F:\.]*'; + } + description + "An IPv6 address without a zone index. This type, derived from + ipv6-address, may be used in situations where the zone is + known from the context and hence no zone index is needed."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + typedef ip-prefix { + type union { + type inet:ipv4-prefix; + type inet:ipv6-prefix; + } + description + "The ip-prefix type represents an IP prefix and is IP + version neutral. The format of the textual representations + implies the IP version."; + } + + typedef ipv4-prefix { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '/(([0-9])|([1-2][0-9])|(3[0-2]))'; + } + description + "The ipv4-prefix type represents an IPv4 address prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 32. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The canonical format of an IPv4 prefix has all bits of + the IPv4 address set to zero that are not part of the + IPv4 prefix."; + } + + typedef ipv6-prefix { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(/.+)'; + } + + description + "The ipv6-prefix type represents an IPv6 address prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 128. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The IPv6 address should have all bits that do not belong + to the prefix set to zero. + + The canonical format of an IPv6 prefix has all bits of + the IPv6 address set to zero that are not part of the + IPv6 prefix. Furthermore, the IPv6 address is represented + as defined in Section 4 of RFC 5952."; + reference + "RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + /*** collection of domain name and URI types ***/ + + typedef domain-name { + type string { + pattern + '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' + + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' + + '|\.'; + length "1..253"; + } + description + "The domain-name type represents a DNS domain name. The + name SHOULD be fully qualified whenever possible. + + Internet domain names are only loosely specified. Section + 3.5 of RFC 1034 recommends a syntax (modified in Section + 2.1 of RFC 1123). The pattern above is intended to allow + for current practice in domain name use, and some possible + future expansion. It is designed to hold various types of + domain names, including names used for A or AAAA records + (host names) and other records, such as SRV records. Note + that Internet host names have a stricter syntax (described + in RFC 952) than the DNS recommendations in RFCs 1034 and + 1123, and that systems that want to store host names in + schema nodes using the domain-name type are recommended to + adhere to this stricter standard to ensure interoperability. + + The encoding of DNS names in the DNS protocol is limited + to 255 characters. Since the encoding consists of labels + prefixed by a length bytes and there is a trailing NULL + byte, only 253 characters can appear in the textual dotted + notation. + + The description clause of schema nodes using the domain-name + type MUST describe when and how these names are resolved to + IP addresses. Note that the resolution of a domain-name value + may require to query multiple DNS records (e.g., A for IPv4 + and AAAA for IPv6). The order of the resolution process and + which DNS record takes precedence can either be defined + explicitly or may depend on the configuration of the + resolver. + + Domain-name values use the US-ASCII encoding. Their canonical + format uses lowercase US-ASCII characters. Internationalized + domain names MUST be A-labels as per RFC 5890."; + reference + "RFC 952: DoD Internet Host Table Specification + RFC 1034: Domain Names - Concepts and Facilities + RFC 1123: Requirements for Internet Hosts -- Application + and Support + RFC 2782: A DNS RR for specifying the location of services + (DNS SRV) + RFC 5890: Internationalized Domain Names in Applications + (IDNA): Definitions and Document Framework"; + } + + typedef host { + type union { + type inet:ip-address; + type inet:domain-name; + } + description + "The host type represents either an IP address or a DNS + domain name."; + } + + typedef uri { + type string; + description + "The uri type represents a Uniform Resource Identifier + (URI) as defined by STD 66. + + Objects using the uri type MUST be in US-ASCII encoding, + and MUST be normalized as described by RFC 3986 Sections + 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary + percent-encoding is removed, and all case-insensitive + characters are set to lowercase except for hexadecimal + digits, which are normalized to uppercase as described in + Section 6.2.2.1. + + The purpose of this normalization is to help provide + unique URIs. Note that this normalization is not + sufficient to provide uniqueness. Two URIs that are + textually distinct after this normalization may still be + equivalent. + + Objects using the uri type may restrict the schemes that + they permit. For example, 'data:' and 'urn:' schemes + might not be appropriate. + + A zero-length URI is not a valid URI. This can be used to + express 'URI absent' where required. + + In the value set and its semantics, this type is equivalent + to the Uri SMIv2 textual convention defined in RFC 5017."; + reference + "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax + RFC 3305: Report from the Joint W3C/IETF URI Planning Interest + Group: Uniform Resource Identifiers (URIs), URLs, + and Uniform Resource Names (URNs): Clarifications + and Recommendations + RFC 5017: MIB Textual Conventions for Uniform Resource + Identifiers (URIs)"; + } + +} diff --git a/src/tests/tools/mock_qkd_nodes/yang/ietf-yang-types.yang b/src/tests/tools/mock_qkd_nodes/yang/ietf-yang-types.yang new file mode 100644 index 000000000..ee58fa3ab --- /dev/null +++ b/src/tests/tools/mock_qkd_nodes/yang/ietf-yang-types.yang @@ -0,0 +1,474 @@ +module ietf-yang-types { + + namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types"; + prefix "yang"; + + organization + "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; + + contact + "WG Web: + WG List: + + WG Chair: David Kessens + + + WG Chair: Juergen Schoenwaelder + + + Editor: Juergen Schoenwaelder + "; + + description + "This module contains a collection of generally useful derived + YANG data types. + + Copyright (c) 2013 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6991; see + the RFC itself for full legal notices."; + + revision 2013-07-15 { + description + "This revision adds the following new data types: + - yang-identifier + - hex-string + - uuid + - dotted-quad"; + reference + "RFC 6991: Common YANG Data Types"; + } + + revision 2010-09-24 { + description + "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + } + + /*** collection of counter and gauge types ***/ + + typedef counter32 { + type uint32; + description + "The counter32 type represents a non-negative integer + that monotonically increases until it reaches a + maximum value of 2^32-1 (4294967295 decimal), when it + wraps around and starts increasing again from zero. + + Counters have no defined 'initial' value, and thus, a + single value of a counter has (in general) no information + content. Discontinuities in the monotonically increasing + value normally occur at re-initialization of the + management system, and at other times as specified in the + description of a schema node using this type. If such + other times can occur, for example, the creation of + a schema node of type counter32 at times other than + re-initialization, then a corresponding schema node + should be defined, with an appropriate type, to indicate + the last discontinuity. + + The counter32 type should not be used for configuration + schema nodes. A default statement SHOULD NOT be used in + combination with the type counter32. + + In the value set and its semantics, this type is equivalent + to the Counter32 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef zero-based-counter32 { + type yang:counter32; + default "0"; + description + "The zero-based-counter32 type represents a counter32 + that has the defined 'initial' value zero. + + A schema node of this type will be set to zero (0) on creation + and will thereafter increase monotonically until it reaches + a maximum value of 2^32-1 (4294967295 decimal), when it + wraps around and starts increasing again from zero. + + Provided that an application discovers a new schema node + of this type within the minimum time to wrap, it can use the + 'initial' value as a delta. It is important for a management + station to be aware of this minimum time and the actual time + between polls, and to discard data if the actual time is too + long or there is no defined minimum time. + + In the value set and its semantics, this type is equivalent + to the ZeroBasedCounter32 textual convention of the SMIv2."; + reference + "RFC 4502: Remote Network Monitoring Management Information + Base Version 2"; + } + + typedef counter64 { + type uint64; + description + "The counter64 type represents a non-negative integer + that monotonically increases until it reaches a + maximum value of 2^64-1 (18446744073709551615 decimal), + when it wraps around and starts increasing again from zero. + + Counters have no defined 'initial' value, and thus, a + single value of a counter has (in general) no information + content. Discontinuities in the monotonically increasing + value normally occur at re-initialization of the + management system, and at other times as specified in the + description of a schema node using this type. If such + other times can occur, for example, the creation of + a schema node of type counter64 at times other than + re-initialization, then a corresponding schema node + should be defined, with an appropriate type, to indicate + the last discontinuity. + + The counter64 type should not be used for configuration + schema nodes. A default statement SHOULD NOT be used in + combination with the type counter64. + + In the value set and its semantics, this type is equivalent + to the Counter64 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef zero-based-counter64 { + type yang:counter64; + default "0"; + description + "The zero-based-counter64 type represents a counter64 that + has the defined 'initial' value zero. + + A schema node of this type will be set to zero (0) on creation + and will thereafter increase monotonically until it reaches + a maximum value of 2^64-1 (18446744073709551615 decimal), + when it wraps around and starts increasing again from zero. + + Provided that an application discovers a new schema node + of this type within the minimum time to wrap, it can use the + 'initial' value as a delta. It is important for a management + station to be aware of this minimum time and the actual time + between polls, and to discard data if the actual time is too + long or there is no defined minimum time. + + In the value set and its semantics, this type is equivalent + to the ZeroBasedCounter64 textual convention of the SMIv2."; + reference + "RFC 2856: Textual Conventions for Additional High Capacity + Data Types"; + } + + typedef gauge32 { + type uint32; + description + "The gauge32 type represents a non-negative integer, which + may increase or decrease, but shall never exceed a maximum + value, nor fall below a minimum value. The maximum value + cannot be greater than 2^32-1 (4294967295 decimal), and + the minimum value cannot be smaller than 0. The value of + a gauge32 has its maximum value whenever the information + being modeled is greater than or equal to its maximum + value, and has its minimum value whenever the information + being modeled is smaller than or equal to its minimum value. + If the information being modeled subsequently decreases + below (increases above) the maximum (minimum) value, the + gauge32 also decreases (increases). + + In the value set and its semantics, this type is equivalent + to the Gauge32 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef gauge64 { + type uint64; + description + "The gauge64 type represents a non-negative integer, which + may increase or decrease, but shall never exceed a maximum + value, nor fall below a minimum value. The maximum value + cannot be greater than 2^64-1 (18446744073709551615), and + the minimum value cannot be smaller than 0. The value of + a gauge64 has its maximum value whenever the information + being modeled is greater than or equal to its maximum + value, and has its minimum value whenever the information + being modeled is smaller than or equal to its minimum value. + If the information being modeled subsequently decreases + below (increases above) the maximum (minimum) value, the + gauge64 also decreases (increases). + + In the value set and its semantics, this type is equivalent + to the CounterBasedGauge64 SMIv2 textual convention defined + in RFC 2856"; + reference + "RFC 2856: Textual Conventions for Additional High Capacity + Data Types"; + } + + /*** collection of identifier-related types ***/ + + typedef object-identifier { + type string { + pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))' + + '(\.(0|([1-9]\d*)))*'; + } + description + "The object-identifier type represents administratively + assigned names in a registration-hierarchical-name tree. + + Values of this type are denoted as a sequence of numerical + non-negative sub-identifier values. Each sub-identifier + value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers + are separated by single dots and without any intermediate + whitespace. + + The ASN.1 standard restricts the value space of the first + sub-identifier to 0, 1, or 2. Furthermore, the value space + of the second sub-identifier is restricted to the range + 0 to 39 if the first sub-identifier is 0 or 1. Finally, + the ASN.1 standard requires that an object identifier + has always at least two sub-identifiers. The pattern + captures these restrictions. + + Although the number of sub-identifiers is not limited, + module designers should realize that there may be + implementations that stick with the SMIv2 limit of 128 + sub-identifiers. + + This type is a superset of the SMIv2 OBJECT IDENTIFIER type + since it is not restricted to 128 sub-identifiers. Hence, + this type SHOULD NOT be used to represent the SMIv2 OBJECT + IDENTIFIER type; the object-identifier-128 type SHOULD be + used instead."; + reference + "ISO9834-1: Information technology -- Open Systems + Interconnection -- Procedures for the operation of OSI + Registration Authorities: General procedures and top + arcs of the ASN.1 Object Identifier tree"; + } + + typedef object-identifier-128 { + type object-identifier { + pattern '\d*(\.\d*){1,127}'; + } + description + "This type represents object-identifiers restricted to 128 + sub-identifiers. + + In the value set and its semantics, this type is equivalent + to the OBJECT IDENTIFIER type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef yang-identifier { + type string { + length "1..max"; + pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*'; + pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*'; + } + description + "A YANG identifier string as defined by the 'identifier' + rule in Section 12 of RFC 6020. An identifier must + start with an alphabetic character or an underscore + followed by an arbitrary sequence of alphabetic or + numeric characters, underscores, hyphens, or dots. + + A YANG identifier MUST NOT start with any possible + combination of the lowercase or uppercase character + sequence 'xml'."; + reference + "RFC 6020: YANG - A Data Modeling Language for the Network + Configuration Protocol (NETCONF)"; + } + + /*** collection of types related to date and time***/ + + typedef date-and-time { + type string { + pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?' + + '(Z|[\+\-]\d{2}:\d{2})'; + } + description + "The date-and-time type is a profile of the ISO 8601 + standard for representation of dates and times using the + Gregorian calendar. The profile is defined by the + date-time production in Section 5.6 of RFC 3339. + + The date-and-time type is compatible with the dateTime XML + schema type with the following notable exceptions: + + (a) The date-and-time type does not allow negative years. + + (b) The date-and-time time-offset -00:00 indicates an unknown + time zone (see RFC 3339) while -00:00 and +00:00 and Z + all represent the same time zone in dateTime. + + (c) The canonical format (see below) of data-and-time values + differs from the canonical format used by the dateTime XML + schema type, which requires all times to be in UTC using + the time-offset 'Z'. + + This type is not equivalent to the DateAndTime textual + convention of the SMIv2 since RFC 3339 uses a different + separator between full-date and full-time and provides + higher resolution of time-secfrac. + + The canonical format for date-and-time values with a known time + zone uses a numeric time zone offset that is calculated using + the device's configured known offset to UTC time. A change of + the device's offset to UTC time will cause date-and-time values + to change accordingly. Such changes might happen periodically + in case a server follows automatically daylight saving time + (DST) time zone offset changes. The canonical format for + date-and-time values with an unknown time zone (usually + referring to the notion of local time) uses the time-offset + -00:00."; + reference + "RFC 3339: Date and Time on the Internet: Timestamps + RFC 2579: Textual Conventions for SMIv2 + XSD-TYPES: XML Schema Part 2: Datatypes Second Edition"; + } + + typedef timeticks { + type uint32; + description + "The timeticks type represents a non-negative integer that + represents the time, modulo 2^32 (4294967296 decimal), in + hundredths of a second between two epochs. When a schema + node is defined that uses this type, the description of + the schema node identifies both of the reference epochs. + + In the value set and its semantics, this type is equivalent + to the TimeTicks type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef timestamp { + type yang:timeticks; + description + "The timestamp type represents the value of an associated + timeticks schema node at which a specific occurrence + happened. The specific occurrence must be defined in the + description of any schema node defined using this type. When + the specific occurrence occurred prior to the last time the + associated timeticks attribute was zero, then the timestamp + value is zero. Note that this requires all timestamp values + to be reset to zero when the value of the associated timeticks + attribute reaches 497+ days and wraps around to zero. + + The associated timeticks schema node must be specified + in the description of any schema node using this type. + + In the value set and its semantics, this type is equivalent + to the TimeStamp textual convention of the SMIv2."; + reference + "RFC 2579: Textual Conventions for SMIv2"; + } + + /*** collection of generic address types ***/ + + typedef phys-address { + type string { + pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + } + + description + "Represents media- or physical-level addresses represented + as a sequence octets, each octet represented by two hexadecimal + numbers. Octets are separated by colons. The canonical + representation uses lowercase characters. + + In the value set and its semantics, this type is equivalent + to the PhysAddress textual convention of the SMIv2."; + reference + "RFC 2579: Textual Conventions for SMIv2"; + } + + typedef mac-address { + type string { + pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'; + } + description + "The mac-address type represents an IEEE 802 MAC address. + The canonical representation uses lowercase characters. + + In the value set and its semantics, this type is equivalent + to the MacAddress textual convention of the SMIv2."; + reference + "IEEE 802: IEEE Standard for Local and Metropolitan Area + Networks: Overview and Architecture + RFC 2579: Textual Conventions for SMIv2"; + } + + /*** collection of XML-specific types ***/ + + typedef xpath1.0 { + type string; + description + "This type represents an XPATH 1.0 expression. + + When a schema node is defined that uses this type, the + description of the schema node MUST specify the XPath + context in which the XPath expression is evaluated."; + reference + "XPATH: XML Path Language (XPath) Version 1.0"; + } + + /*** collection of string types ***/ + + typedef hex-string { + type string { + pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + } + description + "A hexadecimal string with octets represented as hex digits + separated by colons. The canonical representation uses + lowercase characters."; + } + + typedef uuid { + type string { + pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' + + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'; + } + description + "A Universally Unique IDentifier in the string representation + defined in RFC 4122. The canonical representation uses + lowercase characters. + + The following is an example of a UUID in string representation: + f81d4fae-7dec-11d0-a765-00a0c91e6bf6 + "; + reference + "RFC 4122: A Universally Unique IDentifier (UUID) URN + Namespace"; + } + + typedef dotted-quad { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'; + } + description + "An unsigned 32-bit number expressed in the dotted-quad + notation, i.e., four octets written as decimal numbers + and separated with the '.' (full stop) character."; + } +} -- GitLab From 0762893a4d685ec77eed20d9860d03f174721ea2 Mon Sep 17 00:00:00 2001 From: armingol Date: Wed, 3 Jul 2024 08:51:26 +0200 Subject: [PATCH 295/602] change to IETF network hardware inventory --- .../nbi_plugins/ietf_hardware/YangHandler.py | 35 +- .../nbi_plugins/ietf_hardware/__init__.py | 4 +- ...network-hardware-inventory@2023-03-09.yang | 604 ++++++++++++++++++ 3 files changed, 629 insertions(+), 14 deletions(-) create mode 100644 src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/ietf-network-hardware-inventory@2023-03-09.yang diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py index 3888b7708..4ddf8522a 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py @@ -24,7 +24,8 @@ LOGGER = logging.getLogger(__name__) YANG_DIR = os.path.join(os.path.dirname(__file__), 'yang') YANG_MODULES = [ 'iana-hardware', - 'ietf-hardware' + 'ietf-hardware', + 'ietf-network-hardware-inventory' ] class YangHandler: @@ -35,7 +36,7 @@ class YangHandler: self._yang_context.load_module(yang_module_name).feature_enable_all() def parse_to_dict(self, message : Dict) -> Dict: - yang_module = self._yang_context.get_module('ietf-hardware') + yang_module = self._yang_context.get_module('ietf-network-hardware-inventory') dnode : Optional[libyang.DNode] = yang_module.parse_data_dict( message, validate_present=True, validate=True, strict=True ) @@ -65,15 +66,19 @@ class YangHandler: def compose(self, device : Device) -> Dict: - # compose device iterating through the components - - hardware = self._yang_context.create_data_path('/ietf-hardware:hardware') + hardware = self._yang_context.create_data_path('/ietf-network-hardware-inventory:network-hardware-inventory') + network_elements = hardware.create_path('network-elements') + + network_element = network_elements.create_path('network-element[uuid="{:s}"]'.format(device.device_id.device_uuid.uuid)) + network_element.create_path('uuid', device.device_id.device_uuid.uuid) + network_element.create_path('name', device.name) + components = network_element.create_path('components') physical_index = 1 for component in device.components: attributes = component.attributes - component_new = hardware.create_path('component[name="{:s}"]'.format(component.name)) + component_new = components.create_path('component[uuid="{:s}"]'.format(component.component_uuid.uuid)) component_new.create_path('name', component.name) #Cambiar las clases especiales, su formato y añadir isfru @@ -95,15 +100,18 @@ class YangHandler: #Añadir resto de atributos en IETF physical_index += 1 - component_new.create_path('physical-index', physical_index) component_new.create_path('description', attributes["description"]) - component_new.create_path('parent', component.parent) + parent_component_references = component_new.create_path('parent-component-references') + parent = parent_component_references.create_path('component-reference[index="{:d}"]'.format(physical_index)) + for component2 in device.components: + if component.parent == component2.name : + parent.create_path('uuid', component2.component_uuid.uuid) + break if attributes["mfg-date"] != "": mfg_date = self.convert_to_iso_date(attributes["mfg-date"]) - LOGGER.info('component[name="{:s}"]'.format(attributes["mfg-date"])) component_new.create_path('mfg-date', mfg_date) component_new.create_path('hardware-rev', attributes["hardware-rev"]) @@ -123,12 +131,15 @@ class YangHandler: component_new.create_path('uuid', component.component_uuid.uuid) - contains_child = [] + contained_child = [] for component2 in device.components: if component.name == component2.parent : - contains_child.append(component2.name) + child_uuid = component2.component_uuid.uuid.strip("'") + contained_child.append(child_uuid) + LOGGER.info('parent: {:s}'.format(str(component))) + LOGGER.info('child: {:s}'.format(str(component2))) - component_new.create_path('contains-child', contains_child) + component_new.create_path('contained-child', contained_child) return json.loads(hardware.print_mem('json')) diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py index d3f7c6375..acec9ac45 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py @@ -16,8 +16,8 @@ from nbi.service.rest_server.nbi_plugins.ietf_hardware.Hardware import Hardware from nbi.service.rest_server.nbi_plugins.ietf_hardware.HardwareMultipleDevices import HardwareMultipleDevices from nbi.service.rest_server.RestServer import RestServer -URL_PREFIX_device = "/restconf/data/device=/ietf-hardware:hardware" -URL_PREFIX_hardware = "/restconf/data/ietf-hardware:hardware" +URL_PREFIX_device = "/restconf/data/device=/ietf-network-hardware-inventory:network-hardware-inventory" +URL_PREFIX_hardware = "/restconf/data/ietf-network-hardware-inventory:network-hardware-inventory" def register_ietf_hardware(rest_server: RestServer): rest_server.add_resource(Hardware, URL_PREFIX_device) diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/ietf-network-hardware-inventory@2023-03-09.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/ietf-network-hardware-inventory@2023-03-09.yang new file mode 100644 index 000000000..e074e3005 --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/yang/ietf-network-hardware-inventory@2023-03-09.yang @@ -0,0 +1,604 @@ +module ietf-network-hardware-inventory { + yang-version 1.1; + namespace + "urn:ietf:params:xml:ns:yang:ietf-network-hardware-inventory"; + prefix nhi; + + import ietf-yang-types { + prefix yang; + reference + "RFC6991: Common YANG Data Types."; + } + + import iana-hardware { + prefix ianahw; + reference + "https://www.iana.org/assignments/yang-parameters"; + } + + import ietf-inet-types { + prefix inet; + reference + "RFC6991: Common YANG Data Types."; + } + + organization + "IETF CCAMP Working Group"; + contact + "WG Web: + WG List: + + Editor: Chaode Yu + + + Editor: Italo Busi + + + Editor: Aihua Guo + + + Editor: Sergio Belotti + + + Editor: Jean-Francois Bouquier + + + Editor: Fabio Peruzzini + "; + + description + "This module defines a model for retrieving network hardware + inventory. + + The model fully conforms to the Network Management + Datastore Architecture (NMDA). + Copyright (c) 2022 IETF Trust and the persons + identified as authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Revised BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (https://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; see + the RFC itself for full legal notices. + + The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL + NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED', + 'MAY', and 'OPTIONAL' in this document are to be interpreted as + described in BCP 14 (RFC 2119) (RFC 8174) when, and only when, + they appear in all capitals, as shown here."; + + // RFC Ed.: replace XXXX with actual RFC number and remove this + // note. + // RFC Ed.: update the date below with the date of RFC publication + // and remove this note. + + revision 2023-03-09 { + description + "Initial version"; + reference + "RFC XXXX: A YANG Data Model for Network Hardware Inventory."; + //RFC Editor: replace XXXX with actual RFC number, update date + //information and remove this note + } + + container network-hardware-inventory { + config false; + description + "The top-level container for the network inventory + information."; + uses equipment-rooms-grouping; + uses network-elements-grouping; + } + + grouping common-entity-attributes { + description + "A set of attributes which are common to all the entities + (e.g., component, equipment room) defined in this module."; + leaf uuid { + type yang:uuid; + description + "Uniquely identifies an entity (e.g., component)."; + } + leaf name { + type string; + description + "A name for an entity (e.g., component), as specified by + a network manager, that provides a non-volatile 'handle' + for the entity and that can be modified anytime during the + entity lifetime. + + If no configured value exists, the server MAY set the value + of this node to a locally unique value in the operational + state."; + } + leaf description { + type string; + description "a textual description of inventory object"; + } + leaf alias { + type string; + description + "a alias name of inventory objects. This alias name can be + specified by network manager."; + } + } + + grouping network-elements-grouping { + description + "The attributes of the network elements."; + container network-elements { + description + "The container for the list of network elements."; + list network-element { + key uuid; + description + "The list of network elements within the network."; + uses common-entity-attributes; + container ne-location { + description + "The location information of this network element."; + leaf-list equipment-room-name { + type leafref { + path "/nhi:network-hardware-inventory/" + + "nhi:equipment-rooms/nhi:equipment-room/nhi:name"; + } + description + "Names of equipment rooms where the NE is located. + Please note that a NE could be located in several + equipment rooms."; + } + } + uses ne-specific-info-grouping; + uses components-grouping; + } + } + } + + grouping ne-specific-info-grouping { + description + "Attributes applicable to network elements."; + leaf hardware-rev { + type string; + description + "The vendor-specific hardware revision string for the NE."; + } + leaf software-rev { + type string; + description + "The vendor-specific software revision string for the NE."; + } + leaf mfg-name { + type string; + description "The name of the manufacturer of this NE"; + } + leaf mfg-date { + type yang:date-and-time; + description "The date of manufacturing of the NE."; + } + leaf part-number { + type string; + description + "The vendor-specific model name identifier string associated + with this NE. The preferred value is the customer-visible + part number, which may be printed on the NE itself."; + } + leaf serial-number { + type string; + description + "The vendor-specific serial number string for the NE"; + } + leaf product-name { + type string; + description + "indicates the vendor-spefic device type infomation."; + } + } + + grouping equipment-rooms-grouping { + description + "The attributes of the equipment rooms."; + container equipment-rooms { + description + "The container for the list of equipment rooms."; + list equipment-room { + key uuid; + description + "The list of equipment rooms within the network."; + uses common-entity-attributes; + leaf location { + type string; + description + "compared with the location information of the other + inventory objects, a GIS address is preferred for + equipment room"; + } + container racks { + description + "Top level container for the list of racks."; + list rack { + key uuid; + description + "The list of racks within an equipment room."; + uses common-entity-attributes; + uses rack-specific-info-grouping; + list contained-chassis { + key "ne-ref component-ref"; + description + "The list of chassis within a rack."; + leaf ne-ref { + type leafref { + path "/nhi:network-hardware-inventory" + + "/nhi:network-elements/nhi:network-element" + + "/nhi:uuid"; + } + description + "The reference to the network element containing + the chassis component."; + } + leaf component-ref { + type leafref { + path "/nhi:network-hardware-inventory" + + "/nhi:network-elements/nhi:network-element" + + "[nhi:uuid=current()/../ne-ref]/nhi:components" + + "/nhi:component/nhi:uuid"; + } + description + "The reference to the chassis component within + the network element and contained by the rack."; + } + leaf relative-position { + type uint8; + description "A relative position of chassis within + the rack"; + } + } + } + } + } + } + } + + grouping rack-specific-info-grouping { + description + "Attributes applicable to racks only."; + container rack-location { + description + "The location information of the rack, which comprises the + name of the equipment room, row number, and column number."; + leaf equipment-room-name { + type leafref { + path "/nhi:network-hardware-inventory/nhi:equipment-rooms" + + "/nhi:equipment-room/nhi:name"; + } + description + "Name of equipment room where this rack is located."; + } + leaf row-number { + type uint32; + description + "Identifies the row within the equipment room where + the rack is located."; + } + leaf column-number { + type uint32; + description + "Identifies the physical location of the rack within + the column."; + } + } + leaf height { + type uint16; + units millimeter; + description + "Rack height."; + } + leaf width { + type uint16; + units millimeter; + description + "Rack width."; + } + leaf depth { + type uint16; + units millimeter; + description + "Rack depth."; + } + leaf max-voltage { + type uint16; + units volt; + description + "The maximum voltage could be supported by the rack."; + } + } + + grouping components-grouping { + description + "The attributes of the hardware components."; + container components { + description + "The container for the list of components."; + list component { + key uuid; + description + "The list of components within a network element."; + uses common-entity-attributes; + leaf location { + type string; + description + "A relative location information of this component. + In optical transport network, the location string is + using the following pattern: + '/ne=[/r=][/sh= + [/s_sh= ...]][[/sl= + [/s_sl= ...]][/p= …]]' + "; + } + leaf class { + type identityref { + base ianahw:hardware-class; + } + description + "An indication of the general hardware type of the + component."; + reference + "RFC 8348: A YANG Data Model for Hardware Management."; + } + leaf-list contained-child { + type leafref { + path "../nhi:uuid"; + } + description + "The list of the identifiers of the child components + physically contained within this component."; + } + leaf parent-rel-pos { + type int32 { + range "0 .. 2147483647"; + } + description + "The relative position with respect to the parent + component among all the sibling components."; + reference + "RFC 6933: Entity MIB (Version 4) - + entPhysicalParentRelPos"; + } + + container parent-component-references { + description + "The top level container for the list of the + identifiers of the parents of this component in a + hierarchy."; + list component-reference { + key index; + description + "The list of the identifiers of the parents of this + component in a hierarchy. + + The index parameter defines the hierarchy: the topmost + parent has an index of 0."; + leaf index { + type uint8; + description + "The index of the parent with respect to the + hierarchy."; + } + leaf class { + type leafref { + path "../../../nhi:class"; + } + description + "Class of the hierarchial parent component."; + } + leaf uuid { + type leafref { + path "../../../nhi:uuid"; + } + description + "The identifier of the parent's component in the + hierarchy."; + } + } + } + + leaf hardware-rev { + type string; + description + "The vendor-specific hardware revision string for the + component. The preferred value is the hardware revision + identifier actually printed on the component itself (if + present)."; + reference + "RFC 6933: Entity MIB (Version 4) - + entPhysicalHardwareRev"; + } + leaf firmware-rev { + type string; + description + "The vendor-specific firmware revision string for the + component."; + reference + "RFC 6933: Entity MIB (Version 4) - + entPhysicalFirmwareRev"; + } + leaf software-rev { + type string; + description + "The vendor-specific software revision string for the + component."; + reference + "RFC 6933: Entity MIB (Version 4) - + entPhysicalSoftwareRev"; + } + leaf serial-num { + type string; + description + "The vendor-specific serial number string for the + component. The preferred value is the serial number + string actually printed on the component itself (if + present)."; + reference + "RFC 6933: Entity MIB (Version 4) - + entPhysicalSerialNum"; + } + leaf mfg-name { + type string; + description + "The name of the manufacturer of this physical component. + The preferred value is the manufacturer name string + actually printed on the component itself (if present). + + Note that comparisons between instances of the + 'model-name', 'firmware-rev', 'software-rev', and + 'serial-num' nodes are only meaningful amongst + components with the same value of 'mfg-name'. + + If the manufacturer name string associated with the + physical component is unknown to the server, then this + node is not instantiated."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalMfgName"; + } + leaf part-number { + type string; + description + "The vendor-specific model name identifier string + associated with this physical component. The preferred + value is the customer-visible part number, which may be + printed on the component itself. + + If the model name string associated with the physical + component is unknown to the server, then this node is + not instantiated."; + reference + "RFC 6933: Entity MIB (Version 4) - + entPhysicalModelName"; + } + leaf asset-id { + type string; + description + "This node is a user-assigned asset tracking identifier + for the component. + + A server implementation MAY map this leaf to the + entPhysicalAssetID MIB object. Such an implementation + needs to use some mechanism to handle the differences in + size and characters allowed between this leaf and + entPhysicalAssetID. The definition of such a mechanism + is outside the scope of this document."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalAssetID"; + } + leaf is-fru { + type boolean; + description + "This node indicates whether or not this component is + considered a 'field-replaceable unit' by the vendor. If + this node contains the value 'true', then this component + identifies a field-replaceable unit. For all components + that are permanently contained within a + field-replaceable unit, the value 'false' should be + returned for this node."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalIsFRU"; + } + leaf mfg-date { + type yang:date-and-time; + description + "The date of manufacturing of the managed component."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalMfgDate"; + } + leaf-list uri { + type inet:uri; + description + "This node contains identification information about the + component."; + reference + "RFC 6933: Entity MIB (Version 4) - entPhysicalUris"; + } + uses component-specific-info-grouping; + } + } + } + + grouping component-specific-info-grouping { + description + "In case if there are some missing attributes of component not + defined by RFC8348. These attributes could be + component-specific. + Here we provide a extension structure for all the components + we recognized. We will enrich these component specifc + containers in the future."; + choice component-class { + description + "This extension differs between different component + classes."; + case chassis { + when "./class = 'ianahw:chassis'"; + container chassis-specific-info { + description + "This container contains some attributes belong to + chassis only."; + uses chassis-specific-info-grouping; + } + } + case container { + when "./class = 'ianahw:container'"; + container slot-specific-info { + description + "This container contains some attributes belong to + slot or sub-slot only."; + uses slot-specific-info-grouping; + } + } + case module { + when "./nhi:class = 'ianahw:module'"; + container board-specific-info { + description + "This container contains some attributes belong to + board only."; + uses board-specific-info-grouping; + } + } + case port { + when "./nhi:class = 'ianahw:port'"; + container port-specific-info { + description + "This container contains some attributes belong to + port only."; + uses port-specific-info-grouping; + } + } + //TO BE ADDED: transceiver + } + } + + grouping chassis-specific-info-grouping { + //To be enriched in the future. + description + "Specific attributes applicable to chassis only."; + } + + grouping slot-specific-info-grouping { + //To be enriched in the future. + description + "Specific attributes applicable to slots only."; + } + + grouping board-specific-info-grouping { + //To be enriched in the future. + description + "Specific attributes applicable to boards only."; + } + + grouping port-specific-info-grouping { + //To be enriched in the future. + description + "Specific attributes applicable to ports only."; + } +} -- GitLab From aa6ff5b26de559404671986db9e7815e15436302 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 3 Jul 2024 15:32:14 +0000 Subject: [PATCH 296/602] NBI - Device ACL connector: - Enabled DEBUG mode - Corrected REST-API server binding paths - Added missing imports - Minor cosmetic improvements --- manifests/nbiservice.yaml | 2 +- .../service/rest_server/nbi_plugins/ietf_acl/__init__.py | 8 ++++---- .../rest_server/nbi_plugins/ietf_acl/acl_services.py | 8 ++------ 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/manifests/nbiservice.yaml b/manifests/nbiservice.yaml index de97ba364..f5477aeb4 100644 --- a/manifests/nbiservice.yaml +++ b/manifests/nbiservice.yaml @@ -37,7 +37,7 @@ spec: - containerPort: 9192 env: - name: LOG_LEVEL - value: "INFO" + value: "DEBUG" readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:9090"] diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py index 6c1353bff..3d6ed94c8 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py @@ -30,13 +30,13 @@ def register_ietf_acl(rest_server: RestServer): __add_resource( rest_server, ACLs, - "/device=/ietf-access-control-list:acls", - "/device=/ietf-access-control-list:acls", + "/device=/ietf-access-control-list:acls", + "/device=/ietf-access-control-list:acls", ) __add_resource( rest_server, ACL, - "/device=/ietf-access-control-list:acl=", - "/device=/ietf-access-control-list:acl=/", + "/device=/ietf-access-control-list:acl=", + "/device=/ietf-access-control-list:acl=/", ) diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_services.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_services.py index 2d03e61b6..1ed7893b4 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_services.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_services.py @@ -14,19 +14,15 @@ import logging from typing import Dict - from flask import request from flask_restful import Resource -from werkzeug.exceptions import NotFound - +from werkzeug.exceptions import NotFound, UnsupportedMediaType from common.proto.context_pb2 import Device, DeviceId from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Device import json_device_id from context.client.ContextClient import ContextClient from device.client.DeviceClient import DeviceClient - -from nbi.service.rest_server.nbi_plugins.tools.Authentication import HTTP_AUTH - +#from nbi.service.rest_server.nbi_plugins.tools.Authentication import HTTP_AUTH from .ietf_acl_parser import config_rule_from_ietf_acl LOGGER = logging.getLogger(__name__) -- GitLab From 690dfcdc44f5a6fdb6d10318f0691a21a6f11171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Mon, 11 Dec 2023 17:03:55 +0000 Subject: [PATCH 297/602] HPA in services HPA in webui service --- manifests/deviceservice.yaml | 35 ++++++++++++++++++++++++-------- manifests/monitoringservice.yaml | 35 ++++++++++++++++++++++++-------- manifests/webuiservice.yaml | 35 ++++++++++++++++++++++++++------ 3 files changed, 83 insertions(+), 22 deletions(-) diff --git a/manifests/deviceservice.yaml b/manifests/deviceservice.yaml index e49ba2399..bf599d0b4 100644 --- a/manifests/deviceservice.yaml +++ b/manifests/deviceservice.yaml @@ -70,11 +70,30 @@ spec: selector: app: deviceservice ports: - - name: grpc - protocol: TCP - port: 2020 - targetPort: 2020 - - name: metrics - protocol: TCP - port: 9192 - targetPort: 9192 + - name: grpc + protocol: TCP + port: 2020 + targetPort: 2020 + - name: metrics + protocol: TCP + port: 9192 + targetPort: 9192 +--- +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: deviceservice-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: deviceservice + minReplicas: 1 + maxReplicas: 10 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 80 diff --git a/manifests/monitoringservice.yaml b/manifests/monitoringservice.yaml index 1540db0a1..4058436e5 100644 --- a/manifests/monitoringservice.yaml +++ b/manifests/monitoringservice.yaml @@ -65,11 +65,30 @@ spec: selector: app: monitoringservice ports: - - name: grpc - protocol: TCP - port: 7070 - targetPort: 7070 - - name: metrics - protocol: TCP - port: 9192 - targetPort: 9192 + - name: grpc + protocol: TCP + port: 7070 + targetPort: 7070 + - name: metrics + protocol: TCP + port: 9192 + targetPort: 9192 +--- +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: monitoringservice-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: monitoringservice + minReplicas: 1 + maxReplicas: 10 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 80 diff --git a/manifests/webuiservice.yaml b/manifests/webuiservice.yaml index a519aa4a2..58e1a65a0 100644 --- a/manifests/webuiservice.yaml +++ b/manifests/webuiservice.yaml @@ -111,9 +111,32 @@ spec: selector: app: webuiservice ports: - - name: webui - port: 8004 - targetPort: 8004 - - name: grafana - port: 3000 - targetPort: 3000 + - name: webui + port: 8004 + targetPort: 8004 + - name: grafana + port: 3000 + targetPort: 3000 +# TESTING +--- +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: webuiservice-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: webuiservice + minReplicas: 1 + maxReplicas: 20 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 50 + #behavior: + # scaleDown: + # stabilizationWindowSeconds: 30 -- GitLab From 385f3533721028c05939247598f5d7b36356e8a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Wed, 22 Nov 2023 15:54:26 +0000 Subject: [PATCH 298/602] Added rate limiting to ingress controller --- manifests/nginx_ingress_http.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/manifests/nginx_ingress_http.yaml b/manifests/nginx_ingress_http.yaml index 0892f0c9b..210848fa9 100644 --- a/manifests/nginx_ingress_http.yaml +++ b/manifests/nginx_ingress_http.yaml @@ -18,6 +18,11 @@ metadata: name: tfs-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 + nginx.ingress.kubernetes.io/limit-rps: '2' + nginx.ingress.kubernetes.io/limit-connections: '5' + nginx.ingress.kubernetes.io/proxy-connect-timeout: '10' + nginx.ingress.kubernetes.io/proxy-send-timeout: '10' + nginx.ingress.kubernetes.io/proxy-read-timeout: '10' spec: rules: - http: -- GitLab From 1cc1683a81a6b7735fa7914ed3c4f861549ee0a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Fri, 2 Feb 2024 13:52:55 +0000 Subject: [PATCH 299/602] NGINX and redeployall default variables set code refactoring NATS cluster complete Startup Probe failling in NATS cluster mode Cockroach cluster operator and NATS cluster mode Update Update scheduling policy for CRDB NATS cluster mode Testing CRDB cluster with node affinity Revert "Testing dynamic node resources" This reverts commit 856eb4799d2136697c721b387e6fca9fdcdbf5fd. Testing dynamic node resources NGINX and redeployall Update my_deploy.sh Update nginx_ingress_http.yaml Redeploy all fixed Add redeploy all feature --- deploy/all.sh | 14 ++++ deploy/crdb.sh | 11 ++- deploy/nats.sh | 119 ++++++++++++++++++++++++++-- deploy/qdb.sh | 6 +- manifests/cockroachdb/cluster.yaml | 36 ++++----- manifests/cockroachdb/operator.yaml | 2 + manifests/nats/cluster.yaml | 34 ++++++++ manifests/nginx_ingress_http.yaml | 4 +- my_deploy.sh | 12 ++- 9 files changed, 204 insertions(+), 34 deletions(-) create mode 100644 manifests/nats/cluster.yaml diff --git a/deploy/all.sh b/deploy/all.sh index c169bc92c..204bbcfe2 100755 --- a/deploy/all.sh +++ b/deploy/all.sh @@ -18,6 +18,11 @@ # Read deployment settings ######################################################################################################################## +# ----- Redeploy All ------------------------------------------------------------ + +# If not already set, enables all components redeployment +export REDEPLOYALL=${REDEPLOYALL:-""} + # ----- TeraFlowSDN ------------------------------------------------------------ @@ -102,6 +107,15 @@ export NATS_EXT_PORT_CLIENT=${NATS_EXT_PORT_CLIENT:-"4222"} # If not already set, set the external port NATS HTTP Mgmt GUI interface will be exposed to. export NATS_EXT_PORT_HTTP=${NATS_EXT_PORT_HTTP:-"8222"} +# TESTING +# If not already set, set NATS installation mode. Accepted values are: 'single' and 'cluster'. +# - If NATS_DEPLOY_MODE is "single", NATS is deployed in single node mode. It is convenient for +# development and testing purposes and should fit in a VM. IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS. +# - If NATS_DEPLOY_MODE is "cluster", NATS is deployed in cluster mode, and an entire NATS cluster +# with 3 replicas (set by default) will be deployed. It is convenient for production and +# provides scalability features. +export NATS_DEPLOY_MODE=${NATS_DEPLOY_MODE:-"single"} + # If not already set, disable flag for re-deploying NATS from scratch. # WARNING: ACTIVATING THIS FLAG IMPLIES LOOSING THE MESSAGE BROKER INFORMATION! # If NATS_REDEPLOY is "YES", the message broker will be dropped while checking/deploying NATS. diff --git a/deploy/crdb.sh b/deploy/crdb.sh index c979ad4f2..6412d1316 100755 --- a/deploy/crdb.sh +++ b/deploy/crdb.sh @@ -18,6 +18,11 @@ # Read deployment settings ######################################################################################################################## +# ----- Redeploy All ------------------------------------------------------------ +# If not already set, enables all components redeployment +export REDEPLOYALL=${REDEPLOYALL:-""} + + # If not already set, set the namespace where CockroackDB will be deployed. export CRDB_NAMESPACE=${CRDB_NAMESPACE:-"crdb"} @@ -223,7 +228,7 @@ function crdb_deploy_cluster() { kubectl create namespace ${CRDB_NAMESPACE} echo - echo "CockroachDB" + echo "CockroachDB (cluster-mode)" echo ">>> Checking if CockroachDB is deployed..." if kubectl get --namespace ${CRDB_NAMESPACE} statefulset/cockroachdb &> /dev/null; then echo ">>> CockroachDB is present; skipping step." @@ -360,7 +365,7 @@ function crdb_drop_database_cluster() { } if [ "$CRDB_DEPLOY_MODE" == "single" ]; then - if [ "$CRDB_REDEPLOY" == "YES" ]; then + if [ "$CRDB_REDEPLOY" == "YES" ] || [ "$REDEPLOYALL" == "YES" ]; then crdb_undeploy_single fi @@ -370,7 +375,7 @@ if [ "$CRDB_DEPLOY_MODE" == "single" ]; then crdb_drop_database_single fi elif [ "$CRDB_DEPLOY_MODE" == "cluster" ]; then - if [ "$CRDB_REDEPLOY" == "YES" ]; then + if [ "$CRDB_REDEPLOY" == "YES" ] || [ "$REDEPLOYALL" == "YES" ]; then crdb_undeploy_cluster fi diff --git a/deploy/nats.sh b/deploy/nats.sh index 366270a69..9cc11ca8b 100755 --- a/deploy/nats.sh +++ b/deploy/nats.sh @@ -18,6 +18,10 @@ # Read deployment settings ######################################################################################################################## +# ----- Redeploy All ------------------------------------------------------------ +# If not already set, enables all components redeployment +export REDEPLOYALL=${REDEPLOYALL:-""} + # If not already set, set the namespace where NATS will be deployed. export NATS_NAMESPACE=${NATS_NAMESPACE:-"nats"} @@ -27,16 +31,32 @@ export NATS_EXT_PORT_CLIENT=${NATS_EXT_PORT_CLIENT:-"4222"} # If not already set, set the external port NATS HTTP Mgmt GUI interface will be exposed to. export NATS_EXT_PORT_HTTP=${NATS_EXT_PORT_HTTP:-"8222"} +# TESTING +# If not already set, set NATS installation mode. Accepted values are: 'single' and 'cluster'. +# - If NATS_DEPLOY_MODE is "single", NATS is deployed in single node mode. It is convenient for +# development and testing purposes and should fit in a VM. IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS. +# - If NATS_DEPLOY_MODE is "cluster", NATS is deployed in cluster mode, and an entire NATS cluster +# with 3 replicas (set by default) will be deployed. It is convenient for production and +# provides scalability features. +export NATS_DEPLOY_MODE=${NATS_DEPLOY_MODE:-"single"} + # If not already set, disable flag for re-deploying NATS from scratch. # WARNING: ACTIVATING THIS FLAG IMPLIES LOOSING THE MESSAGE BROKER INFORMATION! # If NATS_REDEPLOY is "YES", the message broker will be dropped while checking/deploying NATS. export NATS_REDEPLOY=${NATS_REDEPLOY:-""} - ######################################################################################################################## # Automated steps start here ######################################################################################################################## +# Constants +TMP_FOLDER="./tmp" +NATS_MANIFESTS_PATH="manifests/nats" + +# Create a tmp folder for files modified during the deployment +TMP_MANIFESTS_FOLDER="${TMP_FOLDER}/${NATS_NAMESPACE}/manifests" +mkdir -p $TMP_MANIFESTS_FOLDER + function nats_deploy_single() { echo "NATS Namespace" echo ">>> Create NATS Namespace (if missing)" @@ -47,18 +67,85 @@ function nats_deploy_single() { helm3 repo add nats https://nats-io.github.io/k8s/helm/charts/ echo + echo "Install NATS (single-node)" + echo ">>> Checking if NATS is deployed..." + if kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; then + echo ">>> NATS is present; skipping step." + else + echo ">>> Deploy NATS" + helm3 install ${NATS_NAMESPACE} nats/nats --namespace ${NATS_NAMESPACE} --set nats.image=nats:2.9-alpine + + echo ">>> Waiting NATS statefulset to be created..." + while ! kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; do + printf "%c" "." + sleep 1 + done + + # Wait for statefulset condition "Available=True" does not work + # Wait for statefulset condition "jsonpath='{.status.readyReplicas}'=3" throws error: + # "error: readyReplicas is not found" + # Workaround: Check the pods are ready + #echo ">>> NATS statefulset created. Waiting for readiness condition..." + #kubectl wait --namespace ${NATS_NAMESPACE} --for=condition=Available=True --timeout=300s statefulset/nats + #kubectl wait --namespace ${NATS_NAMESPACE} --for=jsonpath='{.status.readyReplicas}'=3 --timeout=300s \ + # statefulset/nats + echo ">>> NATS statefulset created. Waiting NATS pods to be created..." + while ! kubectl get --namespace ${NATS_NAMESPACE} pod/${NATS_NAMESPACE}-0 &> /dev/null; do + printf "%c" "." + sleep 1 + done + kubectl wait --namespace ${NATS_NAMESPACE} --for=condition=Ready --timeout=300s pod/${NATS_NAMESPACE}-0 + fi + echo + + echo "NATS Port Mapping" + echo ">>> Expose NATS Client port (4222->${NATS_EXT_PORT_CLIENT})" + NATS_PORT_CLIENT=$(kubectl --namespace ${NATS_NAMESPACE} get service ${NATS_NAMESPACE} -o 'jsonpath={.spec.ports[?(@.name=="client")].port}') + PATCH='{"data": {"'${NATS_EXT_PORT_CLIENT}'": "'${NATS_NAMESPACE}'/'${NATS_NAMESPACE}':'${NATS_PORT_CLIENT}'"}}' + kubectl patch configmap nginx-ingress-tcp-microk8s-conf --namespace ingress --patch "${PATCH}" + + PORT_MAP='{"containerPort": '${NATS_EXT_PORT_CLIENT}', "hostPort": '${NATS_EXT_PORT_CLIENT}'}' + CONTAINER='{"name": "nginx-ingress-microk8s", "ports": ['${PORT_MAP}']}' + PATCH='{"spec": {"template": {"spec": {"containers": ['${CONTAINER}']}}}}' + kubectl patch daemonset nginx-ingress-microk8s-controller --namespace ingress --patch "${PATCH}" + echo + + echo ">>> Expose NATS HTTP Mgmt GUI port (8222->${NATS_EXT_PORT_HTTP})" + NATS_PORT_HTTP=$(kubectl --namespace ${NATS_NAMESPACE} get service ${NATS_NAMESPACE} -o 'jsonpath={.spec.ports[?(@.name=="monitor")].port}') + PATCH='{"data": {"'${NATS_EXT_PORT_HTTP}'": "'${NATS_NAMESPACE}'/'${NATS_NAMESPACE}':'${NATS_PORT_HTTP}'"}}' + kubectl patch configmap nginx-ingress-tcp-microk8s-conf --namespace ingress --patch "${PATCH}" + + PORT_MAP='{"containerPort": '${NATS_EXT_PORT_HTTP}', "hostPort": '${NATS_EXT_PORT_HTTP}'}' + CONTAINER='{"name": "nginx-ingress-microk8s", "ports": ['${PORT_MAP}']}' + PATCH='{"spec": {"template": {"spec": {"containers": ['${CONTAINER}']}}}}' + kubectl patch daemonset nginx-ingress-microk8s-controller --namespace ingress --patch "${PATCH}" + echo +} + + +function nats_deploy_cluster() { + echo "NATS Namespace" + echo ">>> Create NATS Namespace (if missing)" + kubectl create namespace ${NATS_NAMESPACE} + echo + + echo "Add NATS Helm Chart" + helm3 repo add nats https://nats-io.github.io/k8s/helm/charts/ + echo + echo "Upgrade NATS Helm Chart" helm3 repo update nats echo - echo "Install NATS (single-node)" + echo "Install NATS (cluster-mode)" echo ">>> Checking if NATS is deployed..." if kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; then echo ">>> NATS is present; skipping step." else echo ">>> Deploy NATS" - helm3 install ${NATS_NAMESPACE} nats/nats --namespace ${NATS_NAMESPACE} --set nats.image=nats:2.9-alpine - + cp "${NATS_MANIFESTS_PATH}/cluster.yaml" "${TMP_MANIFESTS_FOLDER}/nats_cluster.yaml" + helm3 install ${NATS_NAMESPACE} nats/nats --namespace ${NATS_NAMESPACE} -f "${TMP_MANIFESTS_FOLDER}/nats_cluster.yaml" + echo ">>> Waiting NATS statefulset to be created..." while ! kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; do printf "%c" "." @@ -78,7 +165,17 @@ function nats_deploy_single() { printf "%c" "." sleep 1 done + while ! kubectl get --namespace ${NATS_NAMESPACE} pod/${NATS_NAMESPACE}-1 &> /dev/null; do + printf "%c" "." + sleep 1 + done + while ! kubectl get --namespace ${NATS_NAMESPACE} pod/${NATS_NAMESPACE}-2 &> /dev/null; do + printf "%c" "." + sleep 1 + done kubectl wait --namespace ${NATS_NAMESPACE} --for=condition=Ready --timeout=300s pod/${NATS_NAMESPACE}-0 + kubectl wait --namespace ${NATS_NAMESPACE} --for=condition=Ready --timeout=300s pod/${NATS_NAMESPACE}-1 + kubectl wait --namespace ${NATS_NAMESPACE} --for=condition=Ready --timeout=300s pod/${NATS_NAMESPACE}-2 fi echo @@ -110,7 +207,7 @@ function nats_deploy_single() { echo } -function nats_undeploy_single() { +function nats_undeploy() { echo "NATS" echo ">>> Checking if NATS is deployed..." if kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; then @@ -127,8 +224,14 @@ function nats_undeploy_single() { echo } -if [ "$NATS_REDEPLOY" == "YES" ]; then - nats_undeploy_single +if [ "$NATS_REDEPLOY" == "YES" ] || [ "$REDEPLOYALL" == "YES" ]; then + nats_undeploy fi -nats_deploy_single +if [ "$NATS_DEPLOY_MODE" == "single" ]; then + nats_deploy_single +elif [ "$NATS_DEPLOY_MODE" == "cluster" ]; then + nats_deploy_cluster +else + echo "Unsupported value: NATS_DEPLOY_MODE=$NATS_DEPLOY_MODE" +fi \ No newline at end of file diff --git a/deploy/qdb.sh b/deploy/qdb.sh index acbcfd4f9..513ef9ae0 100755 --- a/deploy/qdb.sh +++ b/deploy/qdb.sh @@ -18,6 +18,10 @@ # Read deployment settings ######################################################################################################################## +# ----- Redeploy All ------------------------------------------------------------ +# If not already set, enables all components redeployment +export REDEPLOYALL=${REDEPLOYALL:-""} + # If not already set, set the namespace where QuestDB will be deployed. export QDB_NAMESPACE=${QDB_NAMESPACE:-"qdb"} @@ -177,7 +181,7 @@ function qdb_drop_tables() { echo } -if [ "$QDB_REDEPLOY" == "YES" ]; then +if [ "$QDB_REDEPLOY" == "YES" ] || [ "$REDEPLOYALL" == "YES" ]; then qdb_undeploy fi diff --git a/manifests/cockroachdb/cluster.yaml b/manifests/cockroachdb/cluster.yaml index 4d9ef0f84..73875ca3f 100644 --- a/manifests/cockroachdb/cluster.yaml +++ b/manifests/cockroachdb/cluster.yaml @@ -33,14 +33,16 @@ spec: resources: requests: # This is intentionally low to make it work on local k3d clusters. - cpu: 4 - memory: 4Gi + # TESTING + cpu: 1 #4 + memory: 500Mi #4Gi limits: - cpu: 8 - memory: 8Gi + # TESTING + cpu: 1 #8 + memory: 1Gi #8Gi tlsEnabled: true -# You can set either a version of the db or a specific image name -# cockroachDBVersion: v22.2.8 + # You can set either a version of the db or a specific image name + # cockroachDBVersion: v22.2.8 image: name: cockroachdb/cockroach:v22.2.8 # nodes refers to the number of crdb pods that are created @@ -49,21 +51,17 @@ spec: additionalLabels: crdb: is-cool # affinity is a new API field that is behind a feature gate that is - # disabled by default. To enable please see the operator.yaml file. + # disabled by default. To enable please see the operator.yaml file. # The affinity field will accept any podSpec affinity rule. - # affinity: - # podAntiAffinity: - # preferredDuringSchedulingIgnoredDuringExecution: - # - weight: 100 - # podAffinityTerm: - # labelSelector: - # matchExpressions: - # - key: app.kubernetes.io/instance - # operator: In - # values: - # - cockroachdb - # topologyKey: kubernetes.io/hostname + # TESTING: Force one pod per node, if possible + topologySpreadConstraints: + - maxSkew: 1 + topologyKey: kubernetes.io/hostname + whenUnsatisfiable: ScheduleAnyway + labelSelector: + matchLabels: + app.kubernetes.io/instance: cockroachdb # nodeSelectors used to match against # nodeSelector: diff --git a/manifests/cockroachdb/operator.yaml b/manifests/cockroachdb/operator.yaml index 59d515061..0d578410c 100644 --- a/manifests/cockroachdb/operator.yaml +++ b/manifests/cockroachdb/operator.yaml @@ -381,6 +381,8 @@ spec: spec: containers: - args: + # TESTING + - -feature-gates=TolerationRules=true,AffinityRules=true,TopologySpreadRules=true - -zap-log-level - info env: diff --git a/manifests/nats/cluster.yaml b/manifests/nats/cluster.yaml new file mode 100644 index 000000000..39e41958f --- /dev/null +++ b/manifests/nats/cluster.yaml @@ -0,0 +1,34 @@ +container: + image: + tags: 2.9-alpine + env: + # different from k8s units, suffix must be B, KiB, MiB, GiB, or TiB + # should be ~90% of memory limit + GOMEMLIMIT: 400MiB + merge: + # recommended limit is at least 2 CPU cores and 8Gi Memory for production JetStream clusters + resources: + requests: + cpu: 1 # 2 + memory: 500Mi # 4Gi + limits: + cpu: 1 # 4 + memory: 1Gi # 8Gi + +config: + cluster: + enabled: true + replicas: 3 + jetstream: + enabled: true + fileStore: + pvc: + size: 4Gi + +# Force one pod per node, if possible +podTemplate: + topologySpreadConstraints: + kubernetes.io/hostname: + maxSkew: 1 + whenUnsatisfiable: ScheduleAnyway + \ No newline at end of file diff --git a/manifests/nginx_ingress_http.yaml b/manifests/nginx_ingress_http.yaml index 210848fa9..cb400ee7d 100644 --- a/manifests/nginx_ingress_http.yaml +++ b/manifests/nginx_ingress_http.yaml @@ -18,8 +18,8 @@ metadata: name: tfs-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 - nginx.ingress.kubernetes.io/limit-rps: '2' - nginx.ingress.kubernetes.io/limit-connections: '5' + nginx.ingress.kubernetes.io/limit-rps: '5' + nginx.ingress.kubernetes.io/limit-connections: '10' nginx.ingress.kubernetes.io/proxy-connect-timeout: '10' nginx.ingress.kubernetes.io/proxy-send-timeout: '10' nginx.ingress.kubernetes.io/proxy-read-timeout: '10' diff --git a/my_deploy.sh b/my_deploy.sh index 8417f6eae..0b7a259de 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -13,6 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. +# ----- Redeploy All ------------------------------------------------------------ + +# If not already set, enables all components redeployment +export REDEPLOYALL="" + # ----- TeraFlowSDN ------------------------------------------------------------ @@ -103,7 +108,7 @@ export CRDB_DATABASE="tfs" # Set CockroachDB installation mode to 'single'. This option is convenient for development and testing. # See ./deploy/all.sh or ./deploy/crdb.sh for additional details -export CRDB_DEPLOY_MODE="single" +export CRDB_DEPLOY_MODE="cluster" # Disable flag for dropping database, if it exists. export CRDB_DROP_DATABASE_IF_EXISTS="" @@ -123,6 +128,11 @@ export NATS_EXT_PORT_CLIENT="4222" # Set the external port NATS HTTP Mgmt GUI interface will be exposed to. export NATS_EXT_PORT_HTTP="8222" +# TESTING +# Set NATS installation mode to 'single'. This option is convenient for development and testing. +# See ./deploy/all.sh or ./deploy/nats.sh for additional details +export NATS_DEPLOY_MODE="single" + # Disable flag for re-deploying NATS from scratch. export NATS_REDEPLOY="" -- GitLab From 237674b63a97ece39cb15aa8298e3ef28019cb5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Wed, 31 Jan 2024 16:29:09 +0000 Subject: [PATCH 300/602] CRDB and NATS cluter mode Restore default values --- deploy/all.sh | 1 - deploy/nats.sh | 4 ++-- manifests/cockroachdb/cluster.yaml | 11 ++++------- manifests/cockroachdb/operator.yaml | 1 - manifests/nats/cluster.yaml | 8 ++++---- manifests/webuiservice.yaml | 1 - my_deploy.sh | 3 +-- 7 files changed, 11 insertions(+), 18 deletions(-) diff --git a/deploy/all.sh b/deploy/all.sh index 204bbcfe2..c5d423a2f 100755 --- a/deploy/all.sh +++ b/deploy/all.sh @@ -107,7 +107,6 @@ export NATS_EXT_PORT_CLIENT=${NATS_EXT_PORT_CLIENT:-"4222"} # If not already set, set the external port NATS HTTP Mgmt GUI interface will be exposed to. export NATS_EXT_PORT_HTTP=${NATS_EXT_PORT_HTTP:-"8222"} -# TESTING # If not already set, set NATS installation mode. Accepted values are: 'single' and 'cluster'. # - If NATS_DEPLOY_MODE is "single", NATS is deployed in single node mode. It is convenient for # development and testing purposes and should fit in a VM. IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS. diff --git a/deploy/nats.sh b/deploy/nats.sh index 9cc11ca8b..57fda629c 100755 --- a/deploy/nats.sh +++ b/deploy/nats.sh @@ -31,7 +31,6 @@ export NATS_EXT_PORT_CLIENT=${NATS_EXT_PORT_CLIENT:-"4222"} # If not already set, set the external port NATS HTTP Mgmt GUI interface will be exposed to. export NATS_EXT_PORT_HTTP=${NATS_EXT_PORT_HTTP:-"8222"} -# TESTING # If not already set, set NATS installation mode. Accepted values are: 'single' and 'cluster'. # - If NATS_DEPLOY_MODE is "single", NATS is deployed in single node mode. It is convenient for # development and testing purposes and should fit in a VM. IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS. @@ -73,7 +72,8 @@ function nats_deploy_single() { echo ">>> NATS is present; skipping step." else echo ">>> Deploy NATS" - helm3 install ${NATS_NAMESPACE} nats/nats --namespace ${NATS_NAMESPACE} --set nats.image=nats:2.9-alpine + helm3 install ${NATS_NAMESPACE} nats/nats --namespace ${NATS_NAMESPACE} --set nats.image=nats:2.9-alpine --set config.cluster.enabled=true --set config.cluster.tls.enabled=true + echo ">>> Waiting NATS statefulset to be created..." while ! kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; do diff --git a/manifests/cockroachdb/cluster.yaml b/manifests/cockroachdb/cluster.yaml index 73875ca3f..bcb0c7049 100644 --- a/manifests/cockroachdb/cluster.yaml +++ b/manifests/cockroachdb/cluster.yaml @@ -33,13 +33,11 @@ spec: resources: requests: # This is intentionally low to make it work on local k3d clusters. - # TESTING - cpu: 1 #4 - memory: 500Mi #4Gi + cpu: 4 + memory: 4Gi limits: - # TESTING - cpu: 1 #8 - memory: 1Gi #8Gi + cpu: 8 + memory: 8Gi tlsEnabled: true # You can set either a version of the db or a specific image name # cockroachDBVersion: v22.2.8 @@ -54,7 +52,6 @@ spec: # disabled by default. To enable please see the operator.yaml file. # The affinity field will accept any podSpec affinity rule. - # TESTING: Force one pod per node, if possible topologySpreadConstraints: - maxSkew: 1 topologyKey: kubernetes.io/hostname diff --git a/manifests/cockroachdb/operator.yaml b/manifests/cockroachdb/operator.yaml index 0d578410c..d8e691308 100644 --- a/manifests/cockroachdb/operator.yaml +++ b/manifests/cockroachdb/operator.yaml @@ -381,7 +381,6 @@ spec: spec: containers: - args: - # TESTING - -feature-gates=TolerationRules=true,AffinityRules=true,TopologySpreadRules=true - -zap-log-level - info diff --git a/manifests/nats/cluster.yaml b/manifests/nats/cluster.yaml index 39e41958f..491c86628 100644 --- a/manifests/nats/cluster.yaml +++ b/manifests/nats/cluster.yaml @@ -9,11 +9,11 @@ container: # recommended limit is at least 2 CPU cores and 8Gi Memory for production JetStream clusters resources: requests: - cpu: 1 # 2 - memory: 500Mi # 4Gi + cpu: 1 + memory: 500Mi limits: - cpu: 1 # 4 - memory: 1Gi # 8Gi + cpu: 1 + memory: 1Gi config: cluster: diff --git a/manifests/webuiservice.yaml b/manifests/webuiservice.yaml index 58e1a65a0..132839edd 100644 --- a/manifests/webuiservice.yaml +++ b/manifests/webuiservice.yaml @@ -117,7 +117,6 @@ spec: - name: grafana port: 3000 targetPort: 3000 -# TESTING --- apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler diff --git a/my_deploy.sh b/my_deploy.sh index 0b7a259de..991c21e71 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -108,7 +108,7 @@ export CRDB_DATABASE="tfs" # Set CockroachDB installation mode to 'single'. This option is convenient for development and testing. # See ./deploy/all.sh or ./deploy/crdb.sh for additional details -export CRDB_DEPLOY_MODE="cluster" +export CRDB_DEPLOY_MODE="single" # Disable flag for dropping database, if it exists. export CRDB_DROP_DATABASE_IF_EXISTS="" @@ -128,7 +128,6 @@ export NATS_EXT_PORT_CLIENT="4222" # Set the external port NATS HTTP Mgmt GUI interface will be exposed to. export NATS_EXT_PORT_HTTP="8222" -# TESTING # Set NATS installation mode to 'single'. This option is convenient for development and testing. # See ./deploy/all.sh or ./deploy/nats.sh for additional details export NATS_DEPLOY_MODE="single" -- GitLab From ae2876684d0ee13e0e17978583269208c15d3878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Wed, 24 Apr 2024 15:46:39 +0100 Subject: [PATCH 301/602] Container lab fixed --- hackfest/containerlab/srl1.cli | 14 ++++++++++++++ hackfest/containerlab/srl2.cli | 14 ++++++++++++++ hackfest/containerlab/tfs-scenario.clab.yml | 12 +++++++++--- 3 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 hackfest/containerlab/srl1.cli create mode 100644 hackfest/containerlab/srl2.cli diff --git a/hackfest/containerlab/srl1.cli b/hackfest/containerlab/srl1.cli new file mode 100644 index 000000000..fd7144ca7 --- /dev/null +++ b/hackfest/containerlab/srl1.cli @@ -0,0 +1,14 @@ +set / interface ethernet-1/2 admin-state enable +set / interface ethernet-1/2 subinterface 0 admin-state enable +set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.1.1/24 + +set / interface ethernet-1/1 admin-state enable +set / interface ethernet-1/1 subinterface 0 admin-state enable +set / interface ethernet-1/1 subinterface 0 ipv4 address 172.0.0.1/30 + +set / network-instance default +set / network-instance default interface ethernet-1/1.0 +set / network-instance default interface ethernet-1/2.0 + +set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.2 admin-state enable +set / network-instance default static-routes route 172.16.2.0/24 next-hop-group group1 admin-state enable \ No newline at end of file diff --git a/hackfest/containerlab/srl2.cli b/hackfest/containerlab/srl2.cli new file mode 100644 index 000000000..395d53c71 --- /dev/null +++ b/hackfest/containerlab/srl2.cli @@ -0,0 +1,14 @@ +set / interface ethernet-1/2 admin-state enable +set / interface ethernet-1/2 subinterface 0 admin-state enable +set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.2.1/24 + +set / interface ethernet-1/1 admin-state enable +set / interface ethernet-1/1 subinterface 0 admin-state enable +set / interface ethernet-1/1 subinterface 0 ipv4 address 172.0.0.2/30 + +set / network-instance default +set / network-instance default interface ethernet-1/1.0 +set / network-instance default interface ethernet-1/2.0 + +set /network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.1 admin-state enable +set /network-instance default static-routes route 172.16.1.0/24 next-hop-group group1 admin-state enable \ No newline at end of file diff --git a/hackfest/containerlab/tfs-scenario.clab.yml b/hackfest/containerlab/tfs-scenario.clab.yml index f79378757..91467d2b9 100644 --- a/hackfest/containerlab/tfs-scenario.clab.yml +++ b/hackfest/containerlab/tfs-scenario.clab.yml @@ -24,7 +24,7 @@ mgmt: topology: kinds: srl: - image: ghcr.io/nokia/srlinux:23.3.1 + image: ghcr.io/nokia/srlinux:21.11.3 linux: image: ghcr.io/hellt/network-multitool nodes: @@ -34,24 +34,30 @@ topology: cpu: 0.5 memory: 1GB mgmt-ipv4: 172.100.100.101 - #startup-config: srl1.cli + startup-config: ./srl1.cli srl2: kind: srl type: ixr6 cpu: 0.5 memory: 1GB mgmt-ipv4: 172.100.100.102 - #startup-config: srl2.cli + startup-config: ./srl2.cli client1: kind: linux cpu: 0.1 memory: 100MB mgmt-ipv4: 172.100.100.201 + exec: + - ip address add 172.16.1.10/24 dev eth1 + - ip route add 172.16.2.0/24 via 172.16.1.1 client2: kind: linux cpu: 0.1 memory: 100MB mgmt-ipv4: 172.100.100.202 + exec: + - ip address add 172.16.2.10/24 dev eth1 + - ip route add 172.16.1.0/24 via 172.16.2.1 links: - endpoints: ["srl1:e1-1", "srl2:e1-1"] -- GitLab From 1dff67b533ec93cab4a88cfecdbb37a39b2c9be0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Mon, 11 Dec 2023 17:03:55 +0000 Subject: [PATCH 302/602] HPA in services HPA in webui service --- manifests/webuiservice.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/manifests/webuiservice.yaml b/manifests/webuiservice.yaml index 132839edd..58e1a65a0 100644 --- a/manifests/webuiservice.yaml +++ b/manifests/webuiservice.yaml @@ -117,6 +117,7 @@ spec: - name: grafana port: 3000 targetPort: 3000 +# TESTING --- apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler -- GitLab From c2fd76b6a863ae307f1151f8dd6a499663feac64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Wed, 22 Nov 2023 15:54:26 +0000 Subject: [PATCH 303/602] Added rate limiting to ingress controller --- manifests/nginx_ingress_http.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifests/nginx_ingress_http.yaml b/manifests/nginx_ingress_http.yaml index cb400ee7d..4797e275d 100644 --- a/manifests/nginx_ingress_http.yaml +++ b/manifests/nginx_ingress_http.yaml @@ -18,7 +18,7 @@ metadata: name: tfs-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 - nginx.ingress.kubernetes.io/limit-rps: '5' + nginx.ingress.kubernetes.io/limit-rps: '10' nginx.ingress.kubernetes.io/limit-connections: '10' nginx.ingress.kubernetes.io/proxy-connect-timeout: '10' nginx.ingress.kubernetes.io/proxy-send-timeout: '10' -- GitLab From 2569774256a5f1ed5b55b7061a9b8823bd2b4c1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Fri, 2 Feb 2024 13:52:55 +0000 Subject: [PATCH 304/602] NGINX and redeployall default variables set code refactoring NATS cluster complete Startup Probe failling in NATS cluster mode Cockroach cluster operator and NATS cluster mode Update Update scheduling policy for CRDB NATS cluster mode Testing CRDB cluster with node affinity Revert "Testing dynamic node resources" This reverts commit 856eb4799d2136697c721b387e6fca9fdcdbf5fd. Testing dynamic node resources NGINX and redeployall Update my_deploy.sh Update nginx_ingress_http.yaml Redeploy all fixed Add redeploy all feature --- manifests/cockroachdb/cluster.yaml | 10 ++++++---- manifests/cockroachdb/operator.yaml | 1 + my_deploy.sh | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/manifests/cockroachdb/cluster.yaml b/manifests/cockroachdb/cluster.yaml index bcb0c7049..fcc487d71 100644 --- a/manifests/cockroachdb/cluster.yaml +++ b/manifests/cockroachdb/cluster.yaml @@ -33,11 +33,13 @@ spec: resources: requests: # This is intentionally low to make it work on local k3d clusters. - cpu: 4 - memory: 4Gi + # TESTING + cpu: 1 #4 + memory: 500Mi #4Gi limits: - cpu: 8 - memory: 8Gi + # TESTING + cpu: 1 #8 + memory: 1Gi #8Gi tlsEnabled: true # You can set either a version of the db or a specific image name # cockroachDBVersion: v22.2.8 diff --git a/manifests/cockroachdb/operator.yaml b/manifests/cockroachdb/operator.yaml index d8e691308..0d578410c 100644 --- a/manifests/cockroachdb/operator.yaml +++ b/manifests/cockroachdb/operator.yaml @@ -381,6 +381,7 @@ spec: spec: containers: - args: + # TESTING - -feature-gates=TolerationRules=true,AffinityRules=true,TopologySpreadRules=true - -zap-log-level - info diff --git a/my_deploy.sh b/my_deploy.sh index 991c21e71..24da28a7c 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -108,7 +108,7 @@ export CRDB_DATABASE="tfs" # Set CockroachDB installation mode to 'single'. This option is convenient for development and testing. # See ./deploy/all.sh or ./deploy/crdb.sh for additional details -export CRDB_DEPLOY_MODE="single" +export CRDB_DEPLOY_MODE="cluster" # Disable flag for dropping database, if it exists. export CRDB_DROP_DATABASE_IF_EXISTS="" -- GitLab From 6df82fd82465e681255018fe276856976bffce9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Wed, 31 Jan 2024 16:29:09 +0000 Subject: [PATCH 305/602] CRDB and NATS cluter mode Restore default values --- manifests/cockroachdb/cluster.yaml | 10 ++++------ manifests/cockroachdb/operator.yaml | 1 - manifests/webuiservice.yaml | 1 - my_deploy.sh | 2 +- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/manifests/cockroachdb/cluster.yaml b/manifests/cockroachdb/cluster.yaml index fcc487d71..bcb0c7049 100644 --- a/manifests/cockroachdb/cluster.yaml +++ b/manifests/cockroachdb/cluster.yaml @@ -33,13 +33,11 @@ spec: resources: requests: # This is intentionally low to make it work on local k3d clusters. - # TESTING - cpu: 1 #4 - memory: 500Mi #4Gi + cpu: 4 + memory: 4Gi limits: - # TESTING - cpu: 1 #8 - memory: 1Gi #8Gi + cpu: 8 + memory: 8Gi tlsEnabled: true # You can set either a version of the db or a specific image name # cockroachDBVersion: v22.2.8 diff --git a/manifests/cockroachdb/operator.yaml b/manifests/cockroachdb/operator.yaml index 0d578410c..d8e691308 100644 --- a/manifests/cockroachdb/operator.yaml +++ b/manifests/cockroachdb/operator.yaml @@ -381,7 +381,6 @@ spec: spec: containers: - args: - # TESTING - -feature-gates=TolerationRules=true,AffinityRules=true,TopologySpreadRules=true - -zap-log-level - info diff --git a/manifests/webuiservice.yaml b/manifests/webuiservice.yaml index 58e1a65a0..132839edd 100644 --- a/manifests/webuiservice.yaml +++ b/manifests/webuiservice.yaml @@ -117,7 +117,6 @@ spec: - name: grafana port: 3000 targetPort: 3000 -# TESTING --- apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler diff --git a/my_deploy.sh b/my_deploy.sh index 24da28a7c..991c21e71 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -108,7 +108,7 @@ export CRDB_DATABASE="tfs" # Set CockroachDB installation mode to 'single'. This option is convenient for development and testing. # See ./deploy/all.sh or ./deploy/crdb.sh for additional details -export CRDB_DEPLOY_MODE="cluster" +export CRDB_DEPLOY_MODE="single" # Disable flag for dropping database, if it exists. export CRDB_DROP_DATABASE_IF_EXISTS="" -- GitLab From 830b453ec67b3295066d57bab7b15511bc7dd63d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Mon, 29 Apr 2024 16:30:27 +0100 Subject: [PATCH 306/602] Revert "Container lab fixed" This reverts commit 610f10e79f4d22d927239994e916ace3d61f8b9a. --- hackfest/containerlab/srl1.cli | 14 -------------- hackfest/containerlab/srl2.cli | 14 -------------- hackfest/containerlab/tfs-scenario.clab.yml | 12 +++--------- 3 files changed, 3 insertions(+), 37 deletions(-) delete mode 100644 hackfest/containerlab/srl1.cli delete mode 100644 hackfest/containerlab/srl2.cli diff --git a/hackfest/containerlab/srl1.cli b/hackfest/containerlab/srl1.cli deleted file mode 100644 index fd7144ca7..000000000 --- a/hackfest/containerlab/srl1.cli +++ /dev/null @@ -1,14 +0,0 @@ -set / interface ethernet-1/2 admin-state enable -set / interface ethernet-1/2 subinterface 0 admin-state enable -set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.1.1/24 - -set / interface ethernet-1/1 admin-state enable -set / interface ethernet-1/1 subinterface 0 admin-state enable -set / interface ethernet-1/1 subinterface 0 ipv4 address 172.0.0.1/30 - -set / network-instance default -set / network-instance default interface ethernet-1/1.0 -set / network-instance default interface ethernet-1/2.0 - -set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.2 admin-state enable -set / network-instance default static-routes route 172.16.2.0/24 next-hop-group group1 admin-state enable \ No newline at end of file diff --git a/hackfest/containerlab/srl2.cli b/hackfest/containerlab/srl2.cli deleted file mode 100644 index 395d53c71..000000000 --- a/hackfest/containerlab/srl2.cli +++ /dev/null @@ -1,14 +0,0 @@ -set / interface ethernet-1/2 admin-state enable -set / interface ethernet-1/2 subinterface 0 admin-state enable -set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.2.1/24 - -set / interface ethernet-1/1 admin-state enable -set / interface ethernet-1/1 subinterface 0 admin-state enable -set / interface ethernet-1/1 subinterface 0 ipv4 address 172.0.0.2/30 - -set / network-instance default -set / network-instance default interface ethernet-1/1.0 -set / network-instance default interface ethernet-1/2.0 - -set /network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.1 admin-state enable -set /network-instance default static-routes route 172.16.1.0/24 next-hop-group group1 admin-state enable \ No newline at end of file diff --git a/hackfest/containerlab/tfs-scenario.clab.yml b/hackfest/containerlab/tfs-scenario.clab.yml index 91467d2b9..f79378757 100644 --- a/hackfest/containerlab/tfs-scenario.clab.yml +++ b/hackfest/containerlab/tfs-scenario.clab.yml @@ -24,7 +24,7 @@ mgmt: topology: kinds: srl: - image: ghcr.io/nokia/srlinux:21.11.3 + image: ghcr.io/nokia/srlinux:23.3.1 linux: image: ghcr.io/hellt/network-multitool nodes: @@ -34,30 +34,24 @@ topology: cpu: 0.5 memory: 1GB mgmt-ipv4: 172.100.100.101 - startup-config: ./srl1.cli + #startup-config: srl1.cli srl2: kind: srl type: ixr6 cpu: 0.5 memory: 1GB mgmt-ipv4: 172.100.100.102 - startup-config: ./srl2.cli + #startup-config: srl2.cli client1: kind: linux cpu: 0.1 memory: 100MB mgmt-ipv4: 172.100.100.201 - exec: - - ip address add 172.16.1.10/24 dev eth1 - - ip route add 172.16.2.0/24 via 172.16.1.1 client2: kind: linux cpu: 0.1 memory: 100MB mgmt-ipv4: 172.100.100.202 - exec: - - ip address add 172.16.2.10/24 dev eth1 - - ip route add 172.16.1.0/24 via 172.16.2.1 links: - endpoints: ["srl1:e1-1", "srl2:e1-1"] -- GitLab From ce1cd5209f4d206c59ac80edb8c4484cf51855bc Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 4 Jul 2024 11:28:53 +0000 Subject: [PATCH 307/602] NBI - IETF ACL connector: - Improved test client - Added debug log messages - Code cleanup - Added dump of configured resources and rules while NBI starts --- src/nbi/service/__main__.py | 8 ++ .../nbi_plugins/ietf_acl/__init__.py | 1 - .../nbi_plugins/ietf_acl/acl_service.py | 2 + .../nbi_plugins/ietf_acl/acl_services.py | 1 + .../nbi_plugins/ietf_acl/ietf_acl_client.py | 83 +++++++++---------- 5 files changed, 52 insertions(+), 43 deletions(-) diff --git a/src/nbi/service/__main__.py b/src/nbi/service/__main__.py index 7e01b8de4..58fbb9625 100644 --- a/src/nbi/service/__main__.py +++ b/src/nbi/service/__main__.py @@ -75,6 +75,14 @@ def main(): register_tfs_api(rest_server) rest_server.start() + LOGGER.debug('Configured Resources:') + for resource in rest_server.api.resources: + LOGGER.debug(' - {:s}'.format(str(resource))) + + LOGGER.debug('Configured Rules:') + for rule in rest_server.app.url_map.iter_rules(): + LOGGER.debug(' - {:s}'.format(str(rule))) + # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=1.0): pass diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py index 3d6ed94c8..d556aa648 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py @@ -31,7 +31,6 @@ def register_ietf_acl(rest_server: RestServer): rest_server, ACLs, "/device=/ietf-access-control-list:acls", - "/device=/ietf-access-control-list:acls", ) __add_resource( diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_service.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_service.py index 466a68efc..99cbf09ba 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_service.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_service.py @@ -43,6 +43,7 @@ ACL_CONIG_RULE_KEY = r'\/device\[.+\]\/endpoint\[(.+)\]/acl_ruleset\[{}\]' class ACL(Resource): # @HTTP_AUTH.login_required def get(self, device_uuid: str, acl_name: str): + LOGGER.debug("GET device_uuid={:s}, acl_name={:s}".format(str(device_uuid), str(acl_name))) RE_ACL_CONIG_RULE_KEY = re.compile(ACL_CONIG_RULE_KEY.format(acl_name)) context_client = ContextClient() @@ -63,6 +64,7 @@ class ACL(Resource): # @HTTP_AUTH.login_required def delete(self, device_uuid: str, acl_name: str): + LOGGER.debug("DELETE device_uuid={:s}, acl_name={:s}".format(str(device_uuid), str(acl_name))) RE_ACL_CONIG_RULE_KEY = re.compile(ACL_CONIG_RULE_KEY.format(acl_name)) context_client = ContextClient() diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_services.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_services.py index 1ed7893b4..63095e294 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_services.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_services.py @@ -34,6 +34,7 @@ class ACLs(Resource): # @HTTP_AUTH.login_required def post(self, device_uuid: str): + LOGGER.debug("POST device_uuid={:s}, body={:s}".format(str(device_uuid), str(request.data))) if not request.is_json: raise UnsupportedMediaType("JSON pyload is required") request_data: Dict = request.json diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_client.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_client.py index 79ec388a2..9bad3bec9 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_client.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_client.py @@ -12,58 +12,57 @@ # See the License for the specific language governing permissions and # limitations under the License. -import requests -import json -import time +import json, requests, time +from typing import Optional +from requests.auth import HTTPBasicAuth -BASE_URL = "/restconf/data" -POST_URL = "/device={}/ietf-access-control-list:acls" -DELETE_URL = "/device={}/ietf-access-control-list:acl={}" +BASE_URL = '{:s}://{:s}:{:d}/restconf/data' +ACLS_URL = '{:s}/device={:s}/ietf-access-control-list:acls' +ACL_URL = '{:s}/device={:s}/ietf-access-control-list:acl={:s}' -class IetfTfsClient: - def __init__(self, - tfs_host: str = "10.1.1.119", - tfs_port: int = 80, - username: str = "admin", - password: str = "admin", - timeout: int = 10, - allow_redirects: bool = True, - ) -> None: - self.host = tfs_host - self.port = tfs_port - self.username = username - self.password = password - self.timeout = timeout - self.allow_redirects = allow_redirects - - def post(self, device_uuid: str, ietf_acl_data: dict) -> str: - request_url = "http://{:s}:{:d}{:s}{:s}".format(self.host, self.port, BASE_URL, POST_URL.format(device_uuid)) - reply = requests.request("post", request_url, timeout=self.timeout, json=ietf_acl_data, allow_redirects=self.allow_redirects) +class TfsIetfAclClient: + def __init__( + self, host : str = 'localhost', port : int = 80, schema : str = 'http', + username : Optional[str] = 'admin', password : Optional[str] = 'admin', + timeout : int = 10, allow_redirects : bool = True, verify : bool = False + ) -> None: + self._base_url = BASE_URL.format(schema, host, port) + auth = HTTPBasicAuth(username, password) if username is not None and password is not None else None + self._settings = dict(auth=auth, timeout=timeout, allow_redirects=allow_redirects, verify=verify) + + def post(self, device_uuid : str, ietf_acl_data : dict) -> str: + request_url = ACLS_URL.format(self._base_url, device_uuid) + reply = requests.post(request_url, json=ietf_acl_data, **(self._settings)) return reply.text - def get(self, device_uuid: str, acl_name: str) -> str: - request_url = "http://{:s}:{:d}{:s}{:s}".format(self.host, self.port, BASE_URL, DELETE_URL.format(device_uuid, acl_name)) - reply = requests.request("get", request_url, timeout=self.timeout, allow_redirects=self.allow_redirects) + def get(self, device_uuid : str, acl_name : str) -> str: + request_url = ACL_URL.format(self._base_url, device_uuid, acl_name) + reply = requests.get(request_url, **(self._settings)) return reply.text - def delete(self, device_uuid: str, acl_name: str) -> str: - request_url = "http://{:s}:{:d}{:s}{:s}".format(self.host, self.port, BASE_URL, DELETE_URL.format(device_uuid, acl_name)) - reply = requests.request("delete", request_url, timeout=self.timeout, allow_redirects=self.allow_redirects) + def delete(self, device_uuid : str, acl_name : str) -> str: + request_url = ACL_URL.format(self._base_url, device_uuid, acl_name) + reply = requests.delete(request_url, **(self._settings)) return reply.text -if __name__ == "__main__": - csg1_device_uuid = 'b71fd62f-e3d4-5956-93b9-3139094836cf' +def main(): + csg1_device_uuid = '0392c251-b5d3-526b-8f3b-a3d4137829fa' acl_name = 'sample-ipv4-acl' acl_request_path = 'src/nbi/tests/data/ietf_acl.json' - with open(acl_request_path, 'r') as afile: - acl_request_data = json.load(afile) - ietf_tfs_client = IetfTfsClient() - post_response = ietf_tfs_client.post(csg1_device_uuid, acl_request_data) - print(f"post response: {post_response}") + with open(acl_request_path, 'r', encoding='UTF-8') as f: + acl_request_data = json.load(f) + print(acl_request_data) + + client = TfsIetfAclClient() + post_response = client.post(csg1_device_uuid, acl_request_data) + print(f'post response: {post_response}') time.sleep(.5) - get_response = ietf_tfs_client.get(csg1_device_uuid, acl_name) - print(f"get response: {get_response}") + get_response = client.get(csg1_device_uuid, acl_name) + print(f'get response: {get_response}') time.sleep(.5) - delete_response = ietf_tfs_client.delete(csg1_device_uuid, acl_name) - print(f"delete response: {delete_response}") \ No newline at end of file + delete_response = client.delete(csg1_device_uuid, acl_name) + print(f'delete response: {delete_response}') + +if __name__ == '__main__': + main() -- GitLab From 770a0ca162bcac5498eb7fd1579558d41c603b4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Thu, 4 Jul 2024 14:34:16 +0100 Subject: [PATCH 308/602] Credentials fixed --- hackfest/containerlab/tfs-descriptors/topology.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hackfest/containerlab/tfs-descriptors/topology.json b/hackfest/containerlab/tfs-descriptors/topology.json index f5d1c0d73..e4a49981f 100644 --- a/hackfest/containerlab/tfs-descriptors/topology.json +++ b/hackfest/containerlab/tfs-descriptors/topology.json @@ -32,7 +32,7 @@ {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.100.100.101"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "57400"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { - "username": "admin", "password": "admin", "use_tls": true + "username": "admin", "password": "NokiaSrl1!", "use_tls": true }}} ]} }, @@ -42,7 +42,7 @@ {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.100.100.102"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "57400"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { - "username": "admin", "password": "admin", "use_tls": true + "username": "admin", "password": "NokiaSrl1!", "use_tls": true }}} ]} } -- GitLab From 08e2533f703607c0c19866d29b6796fecc6af91e Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 4 Jul 2024 13:34:35 +0000 Subject: [PATCH 309/602] NBI - IETF ACL connector: - Moved IETF ACL Test client to tests folder - Corrected target ACL interface in test script --- src/nbi/tests/data/ietf_acl.json | 2 +- .../nbi_plugins/ietf_acl => tests}/ietf_acl_client.py | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/nbi/{service/rest_server/nbi_plugins/ietf_acl => tests}/ietf_acl_client.py (100%) diff --git a/src/nbi/tests/data/ietf_acl.json b/src/nbi/tests/data/ietf_acl.json index 3cbdd0c67..8b59da441 100644 --- a/src/nbi/tests/data/ietf_acl.json +++ b/src/nbi/tests/data/ietf_acl.json @@ -38,7 +38,7 @@ "attachment-points": { "interface": [ { - "interface-id": "PORT-ce1", + "interface-id": "200", "ingress": { "acl-sets": { "acl-set": [ diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_client.py b/src/nbi/tests/ietf_acl_client.py similarity index 100% rename from src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_client.py rename to src/nbi/tests/ietf_acl_client.py -- GitLab From 8b042d858f2219f4c077de94b52ab13435c6156f Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 4 Jul 2024 13:34:57 +0000 Subject: [PATCH 310/602] NBI - ETSI BWM connector: - Added missing import --- src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py index 4d04c2d18..70dbaec31 100644 --- a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py +++ b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py @@ -12,9 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import json -import logging -import time +import json, logging, re, time from decimal import ROUND_HALF_EVEN, Decimal from flask.json import jsonify from common.proto.context_pb2 import ( -- GitLab From 278dd07fce20a91d61c5ac0494867b16d47b0384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Tue, 30 Apr 2024 14:56:12 +0100 Subject: [PATCH 311/602] containerlab pre-configured lab --- hackfest/containerlab/srl1.cli | 0 hackfest/containerlab/srl2.cli | 0 hackfest/containerlab/tfs-scenario.clab.yml | 6 ++++++ 3 files changed, 6 insertions(+) create mode 100644 hackfest/containerlab/srl1.cli create mode 100644 hackfest/containerlab/srl2.cli diff --git a/hackfest/containerlab/srl1.cli b/hackfest/containerlab/srl1.cli new file mode 100644 index 000000000..e69de29bb diff --git a/hackfest/containerlab/srl2.cli b/hackfest/containerlab/srl2.cli new file mode 100644 index 000000000..e69de29bb diff --git a/hackfest/containerlab/tfs-scenario.clab.yml b/hackfest/containerlab/tfs-scenario.clab.yml index f79378757..8e3514630 100644 --- a/hackfest/containerlab/tfs-scenario.clab.yml +++ b/hackfest/containerlab/tfs-scenario.clab.yml @@ -47,11 +47,17 @@ topology: cpu: 0.1 memory: 100MB mgmt-ipv4: 172.100.100.201 + exec: + - ip address add 172.16.1.10/24 dev eth1 + - ip route add 172.16.2.0/24 via 172.16.1.1 client2: kind: linux cpu: 0.1 memory: 100MB mgmt-ipv4: 172.100.100.202 + exec: + - ip address add 172.16.2.10/24 dev eth1 + - ip route add 172.16.2.0/24 via 172.16.2.1 links: - endpoints: ["srl1:e1-1", "srl2:e1-1"] -- GitLab From 891bb79d5a5dde9210d0c7e880879561646bb23a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Tue, 30 Apr 2024 15:40:52 +0100 Subject: [PATCH 312/602] Configuration files --- hackfest/containerlab/srl1.cli | 17 +++++++++++++++++ hackfest/containerlab/srl2.cli | 17 +++++++++++++++++ hackfest/containerlab/tfs-scenario.clab.yml | 2 +- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/hackfest/containerlab/srl1.cli b/hackfest/containerlab/srl1.cli index e69de29bb..c72ae130a 100644 --- a/hackfest/containerlab/srl1.cli +++ b/hackfest/containerlab/srl1.cli @@ -0,0 +1,17 @@ +set / interface ethernet-1/2 admin-state enable +set / interface ethernet-1/2 subinterface 0 admin-state enable +set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.1.1/24 + +set / interface ethernet-1/1 admin-state enable +set / interface ethernet-1/1 subinterface 0 admin-state enable +set / interface ethernet-1/1 subinterface 0 ipv4 address 172.0.0.1/30 + +set / network-instance default +set / network-instance default interface ethernet-1/1.0 +set / network-instance default interface ethernet-1/2.0 + +set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.2 admin-state enable +set / network-instance default static-routes route 172.16.2.0/24 next-hop-group group1 admin-state enable + +set / system management openconfig admin-state enable +set / system gnmi-server network-instance mgmt yang-models openconfig \ No newline at end of file diff --git a/hackfest/containerlab/srl2.cli b/hackfest/containerlab/srl2.cli index e69de29bb..c72ae130a 100644 --- a/hackfest/containerlab/srl2.cli +++ b/hackfest/containerlab/srl2.cli @@ -0,0 +1,17 @@ +set / interface ethernet-1/2 admin-state enable +set / interface ethernet-1/2 subinterface 0 admin-state enable +set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.1.1/24 + +set / interface ethernet-1/1 admin-state enable +set / interface ethernet-1/1 subinterface 0 admin-state enable +set / interface ethernet-1/1 subinterface 0 ipv4 address 172.0.0.1/30 + +set / network-instance default +set / network-instance default interface ethernet-1/1.0 +set / network-instance default interface ethernet-1/2.0 + +set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.2 admin-state enable +set / network-instance default static-routes route 172.16.2.0/24 next-hop-group group1 admin-state enable + +set / system management openconfig admin-state enable +set / system gnmi-server network-instance mgmt yang-models openconfig \ No newline at end of file diff --git a/hackfest/containerlab/tfs-scenario.clab.yml b/hackfest/containerlab/tfs-scenario.clab.yml index 8e3514630..ffb00dfc9 100644 --- a/hackfest/containerlab/tfs-scenario.clab.yml +++ b/hackfest/containerlab/tfs-scenario.clab.yml @@ -57,7 +57,7 @@ topology: mgmt-ipv4: 172.100.100.202 exec: - ip address add 172.16.2.10/24 dev eth1 - - ip route add 172.16.2.0/24 via 172.16.2.1 + - ip route add 172.16.1.0/24 via 172.16.2.1 links: - endpoints: ["srl1:e1-1", "srl2:e1-1"] -- GitLab From 789d40024f3c76feb9e0fdffa837c06678483f55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Mon, 6 May 2024 15:22:28 +0100 Subject: [PATCH 313/602] Stable with previous version of SRLinux --- hackfest/containerlab/srl1.cli | 3 +-- hackfest/containerlab/srl2.cli | 5 ++--- hackfest/containerlab/tfs-descriptors/topology.json | 4 ++-- hackfest/containerlab/tfs-scenario.clab.yml | 13 ++++++------- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/hackfest/containerlab/srl1.cli b/hackfest/containerlab/srl1.cli index c72ae130a..b0e1b5c79 100644 --- a/hackfest/containerlab/srl1.cli +++ b/hackfest/containerlab/srl1.cli @@ -13,5 +13,4 @@ set / network-instance default interface ethernet-1/2.0 set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.2 admin-state enable set / network-instance default static-routes route 172.16.2.0/24 next-hop-group group1 admin-state enable -set / system management openconfig admin-state enable -set / system gnmi-server network-instance mgmt yang-models openconfig \ No newline at end of file +set / system gnmi-server network-instance mgmt admin-state enable \ No newline at end of file diff --git a/hackfest/containerlab/srl2.cli b/hackfest/containerlab/srl2.cli index c72ae130a..a5c72d027 100644 --- a/hackfest/containerlab/srl2.cli +++ b/hackfest/containerlab/srl2.cli @@ -1,6 +1,6 @@ set / interface ethernet-1/2 admin-state enable set / interface ethernet-1/2 subinterface 0 admin-state enable -set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.1.1/24 +set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.2.1/24 set / interface ethernet-1/1 admin-state enable set / interface ethernet-1/1 subinterface 0 admin-state enable @@ -13,5 +13,4 @@ set / network-instance default interface ethernet-1/2.0 set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.2 admin-state enable set / network-instance default static-routes route 172.16.2.0/24 next-hop-group group1 admin-state enable -set / system management openconfig admin-state enable -set / system gnmi-server network-instance mgmt yang-models openconfig \ No newline at end of file +set / system gnmi-server network-instance mgmt admin-state enable \ No newline at end of file diff --git a/hackfest/containerlab/tfs-descriptors/topology.json b/hackfest/containerlab/tfs-descriptors/topology.json index e4a49981f..f5d1c0d73 100644 --- a/hackfest/containerlab/tfs-descriptors/topology.json +++ b/hackfest/containerlab/tfs-descriptors/topology.json @@ -32,7 +32,7 @@ {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.100.100.101"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "57400"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { - "username": "admin", "password": "NokiaSrl1!", "use_tls": true + "username": "admin", "password": "admin", "use_tls": true }}} ]} }, @@ -42,7 +42,7 @@ {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.100.100.102"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "57400"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { - "username": "admin", "password": "NokiaSrl1!", "use_tls": true + "username": "admin", "password": "admin", "use_tls": true }}} ]} } diff --git a/hackfest/containerlab/tfs-scenario.clab.yml b/hackfest/containerlab/tfs-scenario.clab.yml index ffb00dfc9..950870b84 100644 --- a/hackfest/containerlab/tfs-scenario.clab.yml +++ b/hackfest/containerlab/tfs-scenario.clab.yml @@ -20,28 +20,27 @@ name: tfs-scenario mgmt: network: mgmt-net ipv4-subnet: 172.100.100.0/24 - topology: kinds: - srl: - image: ghcr.io/nokia/srlinux:23.3.1 + nokia_srlinux: + image: ghcr.io/nokia/srlinux:21.11.3 linux: image: ghcr.io/hellt/network-multitool nodes: srl1: - kind: srl + kind: nokia_srlinux type: ixr6 cpu: 0.5 memory: 1GB mgmt-ipv4: 172.100.100.101 - #startup-config: srl1.cli + startup-config: srl1.cli srl2: - kind: srl + kind: nokia_srlinux type: ixr6 cpu: 0.5 memory: 1GB mgmt-ipv4: 172.100.100.102 - #startup-config: srl2.cli + startup-config: srl2.cli client1: kind: linux cpu: 0.1 -- GitLab From 787ad3d6546cea959e549343904ad17d47a92620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Tue, 30 Apr 2024 14:56:12 +0100 Subject: [PATCH 314/602] Final working version containerlab pre-configured lab Configuration files --- hackfest/containerlab/commands.txt | 20 ++++++++++---------- hackfest/containerlab/srl1.cli | 3 ++- hackfest/containerlab/srl2.cli | 14 +++++++------- hackfest/containerlab/tfs-scenario.clab.yml | 6 +++--- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/hackfest/containerlab/commands.txt b/hackfest/containerlab/commands.txt index df5fbc0ce..ac91d4b08 100644 --- a/hackfest/containerlab/commands.txt +++ b/hackfest/containerlab/commands.txt @@ -83,19 +83,19 @@ $ssh admin@clab-tfs-scenario-srl1 # Check configurations done: -gnmic -a 172.100.100.101 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/network-instances' > srl1-nis.json -gnmic -a 172.100.100.101 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/interfaces' > srl1-ifs.json -gnmic -a 172.100.100.102 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/network-instances' > srl2-nis.json -gnmic -a 172.100.100.102 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/interfaces' > srl2-ifs.json +gnmic -a clab-tfs-scenario-srl1 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/network-instances' > srl1-nis.json +gnmic -a clab-tfs-scenario-srl1 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/interfaces' > srl1-ifs.json +gnmic -a clab-tfs-scenario-srl2 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/network-instances' > srl2-nis.json +gnmic -a clab-tfs-scenario-srl2 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/interfaces' > srl2-ifs.json # Delete elements: -gnmic -a 172.100.100.101 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/network-instances/network-instance[name=b19229e8]' -gnmic -a 172.100.100.101 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/1]/subinterfaces/subinterface[index=0]' -gnmic -a 172.100.100.101 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/2]/subinterfaces/subinterface[index=0]' -gnmic -a 172.100.100.102 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/network-instances/network-instance[name=b19229e8]' -gnmic -a 172.100.100.102 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/1]/subinterfaces/subinterface[index=0]' -gnmic -a 172.100.100.102 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/2]/subinterfaces/subinterface[index=0]' +gnmic -a clab-tfs-scenario-srl1 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/network-instances/network-instance[name=b19229e8]' +gnmic -a clab-tfs-scenario-srl1 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/1]/subinterfaces/subinterface[index=0]' +gnmic -a clab-tfs-scenario-srl1 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/2]/subinterfaces/subinterface[index=0]' +gnmic -a clab-tfs-scenario-srl2 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/network-instances/network-instance[name=b19229e8]' +gnmic -a clab-tfs-scenario-srl2 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/1]/subinterfaces/subinterface[index=0]' +gnmic -a clab-tfs-scenario-srl2 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/2]/subinterfaces/subinterface[index=0]' # Run gNMI Driver in standalone mode (advanced) PYTHONPATH=./src python -m src.device.tests.test_gnmi diff --git a/hackfest/containerlab/srl1.cli b/hackfest/containerlab/srl1.cli index b0e1b5c79..cf0f58363 100644 --- a/hackfest/containerlab/srl1.cli +++ b/hackfest/containerlab/srl1.cli @@ -13,4 +13,5 @@ set / network-instance default interface ethernet-1/2.0 set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.2 admin-state enable set / network-instance default static-routes route 172.16.2.0/24 next-hop-group group1 admin-state enable -set / system gnmi-server network-instance mgmt admin-state enable \ No newline at end of file +set / system management openconfig admin-state enable +set / system gnmi-server network-instance mgmt yang-models openconfig diff --git a/hackfest/containerlab/srl2.cli b/hackfest/containerlab/srl2.cli index a5c72d027..c932ca01a 100644 --- a/hackfest/containerlab/srl2.cli +++ b/hackfest/containerlab/srl2.cli @@ -1,16 +1,16 @@ set / interface ethernet-1/2 admin-state enable -set / interface ethernet-1/2 subinterface 0 admin-state enable +set / interface ethernet-1/2 subinterface 0 ipv4 admin-state enable set / interface ethernet-1/2 subinterface 0 ipv4 address 172.16.2.1/24 set / interface ethernet-1/1 admin-state enable -set / interface ethernet-1/1 subinterface 0 admin-state enable -set / interface ethernet-1/1 subinterface 0 ipv4 address 172.0.0.1/30 +set / interface ethernet-1/1 subinterface 0 ipv4 admin-state enable +set / interface ethernet-1/1 subinterface 0 ipv4 address 172.0.0.2/30 -set / network-instance default set / network-instance default interface ethernet-1/1.0 set / network-instance default interface ethernet-1/2.0 -set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.2 admin-state enable -set / network-instance default static-routes route 172.16.2.0/24 next-hop-group group1 admin-state enable +set / network-instance default next-hop-groups group group1 nexthop 1 ip-address 172.0.0.1 admin-state enable +set / network-instance default static-routes route 172.16.1.0/24 next-hop-group group1 admin-state enable -set / system gnmi-server network-instance mgmt admin-state enable \ No newline at end of file +set / system management openconfig admin-state enable +set / system gnmi-server network-instance mgmt yang-models openconfig diff --git a/hackfest/containerlab/tfs-scenario.clab.yml b/hackfest/containerlab/tfs-scenario.clab.yml index 950870b84..8b0ca6130 100644 --- a/hackfest/containerlab/tfs-scenario.clab.yml +++ b/hackfest/containerlab/tfs-scenario.clab.yml @@ -23,7 +23,7 @@ mgmt: topology: kinds: nokia_srlinux: - image: ghcr.io/nokia/srlinux:21.11.3 + image: ghcr.io/nokia/srlinux:23.10.3 linux: image: ghcr.io/hellt/network-multitool nodes: @@ -31,14 +31,14 @@ topology: kind: nokia_srlinux type: ixr6 cpu: 0.5 - memory: 1GB + memory: 2GB mgmt-ipv4: 172.100.100.101 startup-config: srl1.cli srl2: kind: nokia_srlinux type: ixr6 cpu: 0.5 - memory: 1GB + memory: 2GB mgmt-ipv4: 172.100.100.102 startup-config: srl2.cli client1: -- GitLab From 5b584d9e95cf9609c922f6515720440bd6b908d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Thu, 4 Jul 2024 14:34:16 +0100 Subject: [PATCH 315/602] Credentials fixed --- hackfest/containerlab/tfs-descriptors/topology.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hackfest/containerlab/tfs-descriptors/topology.json b/hackfest/containerlab/tfs-descriptors/topology.json index f5d1c0d73..e4a49981f 100644 --- a/hackfest/containerlab/tfs-descriptors/topology.json +++ b/hackfest/containerlab/tfs-descriptors/topology.json @@ -32,7 +32,7 @@ {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.100.100.101"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "57400"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { - "username": "admin", "password": "admin", "use_tls": true + "username": "admin", "password": "NokiaSrl1!", "use_tls": true }}} ]} }, @@ -42,7 +42,7 @@ {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.100.100.102"}}, {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "57400"}}, {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { - "username": "admin", "password": "admin", "use_tls": true + "username": "admin", "password": "NokiaSrl1!", "use_tls": true }}} ]} } -- GitLab From 8e2dcd0e6989af60c4391027a3afd10d5519c7b3 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 4 Jul 2024 13:59:32 +0000 Subject: [PATCH 316/602] NBI - IETF ACL connector: - Minor fixes in IETF ACL Test client --- src/nbi/tests/data/ietf_acl.json | 4 +-- src/nbi/tests/ietf_acl_client.py | 45 +++++++++++++++++++++++--------- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/nbi/tests/data/ietf_acl.json b/src/nbi/tests/data/ietf_acl.json index 8b59da441..4fd5e6c13 100644 --- a/src/nbi/tests/data/ietf_acl.json +++ b/src/nbi/tests/data/ietf_acl.json @@ -12,8 +12,8 @@ "matches": { "ipv4": { "dscp": 18, - "source-ipv4-network": "192.168.10.6/24", - "destination-ipv4-network": "192.168.20.6/24" + "source-ipv4-network": "128.32.10.6/24", + "destination-ipv4-network": "172.10.33.0/24" }, "tcp": { "flags": "syn", diff --git a/src/nbi/tests/ietf_acl_client.py b/src/nbi/tests/ietf_acl_client.py index 9bad3bec9..72e34d202 100644 --- a/src/nbi/tests/ietf_acl_client.py +++ b/src/nbi/tests/ietf_acl_client.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import json, requests, time +import requests, time from typing import Optional from requests.auth import HTTPBasicAuth @@ -20,6 +20,34 @@ BASE_URL = '{:s}://{:s}:{:d}/restconf/data' ACLS_URL = '{:s}/device={:s}/ietf-access-control-list:acls' ACL_URL = '{:s}/device={:s}/ietf-access-control-list:acl={:s}' +CSG1_DEVICE_UUID = '118295c8-318a-52ec-a394-529fc4b70f2f' # router: 128.32.10.1 +ACL_NAME = 'sample-ipv4-acl' +ACL_RULE = {"ietf-access-control-list": {"acls": { + "acl": [{ + "name": "sample-ipv4-acl", "type": "ipv4-acl-type", + "aces": {"ace": [{ + "name": "rule1", + "matches": { + "ipv4": { + "source-ipv4-network": "128.32.10.6/24", + "destination-ipv4-network": "172.10.33.0/24", + "dscp": 18 + }, + "tcp": { + "source-port": {"operator": "eq", "port": 1444}, + "destination-port": {"operator": "eq", "port": 1333}, + "flags": "syn" + } + }, + "actions": {"forwarding": "drop"} + }]} + }], + "attachment-points": {"interface": [{ + "interface-id": "200", + "ingress": {"acl-sets": {"acl-set": [{"name": "sample-ipv4-acl"}]}} + }] +}}}} + class TfsIetfAclClient: def __init__( self, host : str = 'localhost', port : int = 80, schema : str = 'http', @@ -46,22 +74,15 @@ class TfsIetfAclClient: return reply.text def main(): - csg1_device_uuid = '0392c251-b5d3-526b-8f3b-a3d4137829fa' - acl_name = 'sample-ipv4-acl' - acl_request_path = 'src/nbi/tests/data/ietf_acl.json' - - with open(acl_request_path, 'r', encoding='UTF-8') as f: - acl_request_data = json.load(f) - print(acl_request_data) - client = TfsIetfAclClient() - post_response = client.post(csg1_device_uuid, acl_request_data) + print(f'ACL rule: {ACL_RULE}') + post_response = client.post(CSG1_DEVICE_UUID, ACL_RULE) print(f'post response: {post_response}') time.sleep(.5) - get_response = client.get(csg1_device_uuid, acl_name) + get_response = client.get(CSG1_DEVICE_UUID, ACL_NAME) print(f'get response: {get_response}') time.sleep(.5) - delete_response = client.delete(csg1_device_uuid, acl_name) + delete_response = client.delete(CSG1_DEVICE_UUID, ACL_NAME) print(f'delete response: {delete_response}') if __name__ == '__main__': -- GitLab From e4a7bc3aca547391533ccb50c40b2c6c2632e7a6 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 4 Jul 2024 14:08:25 +0000 Subject: [PATCH 317/602] NBI - IETF ACL connector: - Updated License headers --- src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py | 2 +- src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_service.py | 2 +- .../service/rest_server/nbi_plugins/ietf_acl/acl_services.py | 2 +- .../service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py | 2 +- src/nbi/tests/ietf_acl_client.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py index d556aa648..299838076 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_service.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_service.py index 99cbf09ba..e958f3648 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_service.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_service.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_services.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_services.py index 63095e294..1dd9ef27b 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_services.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/acl_services.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py index b378153f8..38f2d9d40 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/nbi/tests/ietf_acl_client.py b/src/nbi/tests/ietf_acl_client.py index 72e34d202..aea784aa2 100644 --- a/src/nbi/tests/ietf_acl_client.py +++ b/src/nbi/tests/ietf_acl_client.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. -- GitLab From c4d7ca20ce21a72043ed22d6a780f07b5b06ced5 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 4 Jul 2024 14:08:58 +0000 Subject: [PATCH 318/602] Device - OpenConfig Driver: - Updated License headers --- src/device/service/drivers/openconfig/templates/acl/__init__.py | 2 +- .../service/drivers/openconfig/templates/acl/acl_adapter.py | 2 +- .../templates/acl/acl_adapter_ipinfusion_proprietary.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/device/service/drivers/openconfig/templates/acl/__init__.py b/src/device/service/drivers/openconfig/templates/acl/__init__.py index f80ccfd52..839e45e3b 100644 --- a/src/device/service/drivers/openconfig/templates/acl/__init__.py +++ b/src/device/service/drivers/openconfig/templates/acl/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/device/service/drivers/openconfig/templates/acl/acl_adapter.py b/src/device/service/drivers/openconfig/templates/acl/acl_adapter.py index 244c4b616..e36d25366 100644 --- a/src/device/service/drivers/openconfig/templates/acl/acl_adapter.py +++ b/src/device/service/drivers/openconfig/templates/acl/acl_adapter.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/device/service/drivers/openconfig/templates/acl/acl_adapter_ipinfusion_proprietary.py b/src/device/service/drivers/openconfig/templates/acl/acl_adapter_ipinfusion_proprietary.py index 79db6ad98..9d496e26f 100644 --- a/src/device/service/drivers/openconfig/templates/acl/acl_adapter_ipinfusion_proprietary.py +++ b/src/device/service/drivers/openconfig/templates/acl/acl_adapter_ipinfusion_proprietary.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. -- GitLab From 8b987b8e43463b76e455f3562ffa23ce31a91a42 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 4 Jul 2024 14:21:33 +0000 Subject: [PATCH 319/602] Pre-merge cosmetic cleanup --- .../service/drivers/openconfig/templates/acl/acl_adapter.py | 2 -- .../templates/acl/acl_adapter_ipinfusion_proprietary.py | 2 -- src/nbi/requirements.in | 2 +- .../service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py | 2 +- src/nbi/tests/data/ietf_acl.json | 2 +- .../service/service_handlers/l3nm_openconfig/ConfigRules.py | 1 + 6 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/device/service/drivers/openconfig/templates/acl/acl_adapter.py b/src/device/service/drivers/openconfig/templates/acl/acl_adapter.py index e36d25366..15e723680 100644 --- a/src/device/service/drivers/openconfig/templates/acl/acl_adapter.py +++ b/src/device/service/drivers/openconfig/templates/acl/acl_adapter.py @@ -71,5 +71,3 @@ def acl_cr_to_dict(acl_cr_dict: Dict, subinterface:int = 0) -> Dict: source_port=22, destination_port=80 ) - - \ No newline at end of file diff --git a/src/device/service/drivers/openconfig/templates/acl/acl_adapter_ipinfusion_proprietary.py b/src/device/service/drivers/openconfig/templates/acl/acl_adapter_ipinfusion_proprietary.py index 9d496e26f..52213c2ab 100644 --- a/src/device/service/drivers/openconfig/templates/acl/acl_adapter_ipinfusion_proprietary.py +++ b/src/device/service/drivers/openconfig/templates/acl/acl_adapter_ipinfusion_proprietary.py @@ -61,5 +61,3 @@ def acl_cr_to_dict_ipinfusion_proprietary(acl_cr_dict: Dict, delete: bool = Fals source_port=rule_set_entry_match['src_port'], destination_port=rule_set_entry_match['dst_port'] ) - - \ No newline at end of file diff --git a/src/nbi/requirements.in b/src/nbi/requirements.in index 0757ae0b9..4c5460a8e 100644 --- a/src/nbi/requirements.in +++ b/src/nbi/requirements.in @@ -22,6 +22,6 @@ libyang==2.8.0 netaddr==0.9.0 pyang==2.6.0 git+https://github.com/robshakir/pyangbind.git +pydantic==2.6.3 requests==2.27.1 werkzeug==2.3.7 -pydantic==2.6.3 diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py index 38f2d9d40..1e29a9365 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py @@ -161,4 +161,4 @@ def ietf_acl_from_config_rule_resource_value(config_rule_rv: Dict) -> Dict: acls = Acls(acl=[acl], attachment_points=AttachmentPoints(attachment_points=interfaces)) ietf_acl = IETF_ACL(acls=acls) - return ietf_acl.model_dump(by_alias=True) \ No newline at end of file + return ietf_acl.model_dump(by_alias=True) diff --git a/src/nbi/tests/data/ietf_acl.json b/src/nbi/tests/data/ietf_acl.json index 4fd5e6c13..072df6d01 100644 --- a/src/nbi/tests/data/ietf_acl.json +++ b/src/nbi/tests/data/ietf_acl.json @@ -53,4 +53,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py index ef48002f3..752793287 100644 --- a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py +++ b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py @@ -195,6 +195,7 @@ def setup_config_rules( }), ] + for res_key, res_value in endpoint_acls: json_config_rules.append( {'action': 1, 'acl': res_value} -- GitLab From 16d9b2f35013fbbc9cdb7f2670a3e0865f487e31 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 4 Jul 2024 14:22:00 +0000 Subject: [PATCH 320/602] NBI - ETSI BWM connector: - Added missing imports - Fixed pull-from-develop leftovers --- .../rest_server/nbi_plugins/etsi_bwm/Tools.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py index 70dbaec31..0a9a77e36 100644 --- a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py +++ b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py @@ -16,11 +16,14 @@ import json, logging, re, time from decimal import ROUND_HALF_EVEN, Decimal from flask.json import jsonify from common.proto.context_pb2 import ( - ContextId, Empty, EndPointId, ServiceId, ServiceTypeEnum, Service, Constraint, Constraint_SLA_Capacity, - ConfigRule, ConfigRule_Custom, ConfigActionEnum) + ContextId, Empty, EndPointId, ServiceId, ServiceStatusEnum, ServiceTypeEnum, + Service, Constraint, Constraint_SLA_Capacity, ConfigRule, ConfigRule_Custom, + ConfigActionEnum +) from common.tools.grpc.Tools import grpc_message_to_json from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id +from common.tools.grpc.ConfigRules import update_config_rule_custom LOGGER = logging.getLogger(__name__) @@ -172,14 +175,14 @@ def bwInfo_2_service(client, bw_info: dict) -> Service: service.service_status.service_status = ServiceStatusEnum.SERVICESTATUS_PLANNED service.service_type = ServiceTypeEnum.SERVICETYPE_L3NM - if 'appInsId' in bwInfo: - service.service_id.service_uuid.uuid = bwInfo['appInsId'] + if 'appInsId' in bw_info: + service.service_id.service_uuid.uuid = bw_info['appInsId'] service.service_id.context_id.context_uuid.uuid = 'admin' - service.name = bwInfo['appInsId'] + service.name = bw_info['appInsId'] - if 'fixedAllocation' in bwInfo: + if 'fixedAllocation' in bw_info: capacity = Constraint_SLA_Capacity() - capacity.capacity_gbps = float(bwInfo['fixedAllocation']) / 1.e9 + capacity.capacity_gbps = float(bw_info['fixedAllocation']) / 1.e9 constraint = Constraint() constraint.sla_capacity.CopyFrom(capacity) service.service_constraints.append(constraint) -- GitLab From e8f4bff8a9bca77ca86d356a0c017b3ae14fc3a4 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 4 Jul 2024 14:26:55 +0000 Subject: [PATCH 321/602] Pre-merge cosmetic cleanup --- .../nbi_plugins/etsi_bwm/Resources.py | 20 +++++++++++++------ .../rest_server/nbi_plugins/etsi_bwm/Tools.py | 2 +- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Resources.py b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Resources.py index 4c6ad47bc..7f9360e00 100644 --- a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Resources.py +++ b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Resources.py @@ -13,12 +13,15 @@ # limitations under the License. import copy, deepmerge, json, logging +from typing import Dict +from flask_restful import Resource, request +from werkzeug.exceptions import UnsupportedMediaType from common.Constants import DEFAULT_CONTEXT_NAME from context.client.ContextClient import ContextClient -from flask_restful import Resource, request from service.client.ServiceClient import ServiceClient from .Tools import ( - format_grpc_to_json, grpc_context_id, grpc_service_id, bwInfo_2_service, service_2_bwInfo) + format_grpc_to_json, grpc_context_id, grpc_service_id, bwInfo_2_service, service_2_bwInfo +) LOGGER = logging.getLogger(__name__) @@ -37,15 +40,20 @@ class BwInfo(_Resource): return bw_allocations def post(self): - bwinfo = request.get_json() - service = bwInfo_2_service(self.client, bwinfo) + if not request.is_json: + raise UnsupportedMediaType('JSON payload is required') + request_data: Dict = request.get_json() + service = bwInfo_2_service(self.client, request_data) stripped_service = copy.deepcopy(service) stripped_service.ClearField('service_endpoint_ids') stripped_service.ClearField('service_constraints') stripped_service.ClearField('service_config') - response = format_grpc_to_json(self.service_client.CreateService(stripped_service)) - response = format_grpc_to_json(self.service_client.UpdateService(service)) + try: + response = format_grpc_to_json(self.service_client.CreateService(stripped_service)) + response = format_grpc_to_json(self.service_client.UpdateService(service)) + except Exception as e: # pylint: disable=broad-except + return e return response diff --git a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py index 0a9a77e36..55efa48b1 100644 --- a/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py +++ b/src/nbi/service/rest_server/nbi_plugins/etsi_bwm/Tools.py @@ -20,10 +20,10 @@ from common.proto.context_pb2 import ( Service, Constraint, Constraint_SLA_Capacity, ConfigRule, ConfigRule_Custom, ConfigActionEnum ) +from common.tools.grpc.ConfigRules import update_config_rule_custom from common.tools.grpc.Tools import grpc_message_to_json from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Service import json_service_id -from common.tools.grpc.ConfigRules import update_config_rule_custom LOGGER = logging.getLogger(__name__) -- GitLab From 32779e30683c744dcd93f40e4efa28716c28098c Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 4 Jul 2024 14:45:38 +0000 Subject: [PATCH 322/602] Proto: - Fixed naming of AclMatch "flags" field to tcp_flags --- proto/acl.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proto/acl.proto b/proto/acl.proto index ac36ca771..b45d46226 100644 --- a/proto/acl.proto +++ b/proto/acl.proto @@ -46,7 +46,7 @@ message AclMatch { uint32 dst_port = 6; uint32 start_mpls_label = 7; uint32 end_mpls_label = 8; - string flags = 9; + string tcp_flags = 9; } message AclAction { -- GitLab From 2e27b0c8700b33aafd76b93d4ecbe4809500354c Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 4 Jul 2024 14:45:59 +0000 Subject: [PATCH 323/602] Device - Openconfig Driver: - Fixed pull-from-develop leftovers --- .../openconfig/templates/VPN/Network_instance_multivendor.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py b/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py index c92fed877..157dd0ab8 100644 --- a/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py +++ b/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py @@ -125,6 +125,7 @@ def add_protocol_NI(parameters,vendor, DEL): with tag('config'): with tag('identifier', 'xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):text('oc-pol-types:',parameters['identifier']) with tag('name') :text(parameters['protocol_name']) + with tag('enabled'): text('true') if "BGP" in parameters['identifier']: with tag('bgp'): with tag('name'): text(parameters['as']) -- GitLab From de5ab58135987903595f3d8abef7ecc0d5a81a1a Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 4 Jul 2024 14:46:20 +0000 Subject: [PATCH 324/602] NBI - IETF ACL connector: - Cosmetic updates --- .../nbi_plugins/ietf_acl/ietf_acl_parser.py | 54 +++++++++++++++---- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py index 1e29a9365..d418a8c36 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_acl/ietf_acl_parser.py @@ -12,9 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import List, Dict, Optional, TypedDict +from typing import List, Dict from pydantic import BaseModel, Field - from common.proto.acl_pb2 import AclForwardActionEnum, AclRuleTypeEnum, AclEntry from common.proto.context_pb2 import ConfigActionEnum, ConfigRule @@ -139,7 +138,7 @@ def config_rule_from_ietf_acl( acl_entry.match.src_port = source_port acl_entry.match.dst_port = destination_port acl_entry.match.dscp = acl_ip_data["dscp"] - acl_entry.match.flags = acl_tcp_data["flags"] + acl_entry.match.tcp_flags = acl_tcp_data["flags"] acl_entry.action.forward_action = getattr(AclForwardActionEnum, IETF_TFS_FORWARDING_ACTION_MAPPING[ietf_action]) acl_rule_set.entries.append(acl_entry) @@ -150,15 +149,50 @@ def ietf_acl_from_config_rule_resource_value(config_rule_rv: Dict) -> Dict: acl_entry = rule_set['entries'][0] match_ = acl_entry['match'] - ipv4 = Ipv4(dscp=match_["dscp"], source_ipv4_network=match_["src_address"], destination_ipv4_network=match_["dst_address"]) - tcp = Tcp(flags=match_["flags"], source_port=Port(port=match_["src_port"]), destination_port=Port(port=match_["dst_port"])) + ipv4 = Ipv4( + dscp=match_["dscp"], + source_ipv4_network=match_["src_address"], + destination_ipv4_network=match_["dst_address"] + ) + tcp = Tcp( + flags=match_["tcp_flags"], + source_port=Port(port=match_["src_port"]), + destination_port=Port(port=match_["dst_port"]) + ) matches = Matches(ipvr=ipv4, tcp=tcp) - aces = Aces(ace=[Ace(matches=matches, actions=Action(forwarding=TFS_IETF_FORWARDING_ACTION_MAPPING[acl_entry["action"]["forward_action"]]))]) - acl = Acl(name=rule_set["name"], type=TFS_IETF_RULE_TYPE_MAPPING[rule_set["type"]], aces=aces) - acl_sets = AclSets(acl_sets=AclSet(acl_set=[Name(name=rule_set["name"])])) + aces = Aces(ace=[ + Ace( + matches=matches, + actions=Action( + forwarding=TFS_IETF_FORWARDING_ACTION_MAPPING[acl_entry["action"]["forward_action"]] + ) + ) + ]) + acl = Acl( + name=rule_set["name"], + type=TFS_IETF_RULE_TYPE_MAPPING[rule_set["type"]], + aces=aces + ) + acl_sets = AclSets( + acl_sets=AclSet( + acl_set=[ + Name(name=rule_set["name"]) + ] + ) + ) ingress = Ingress(ingress=acl_sets) - interfaces = Interfaces(interface=[Interface(interface_id=config_rule_rv["interface"], ingress=ingress)]) - acls = Acls(acl=[acl], attachment_points=AttachmentPoints(attachment_points=interfaces)) + interfaces = Interfaces(interface=[ + Interface( + interface_id=config_rule_rv["interface"], + ingress=ingress + ) + ]) + acls = Acls( + acl=[acl], + attachment_points=AttachmentPoints( + attachment_points=interfaces + ) + ) ietf_acl = IETF_ACL(acls=acls) return ietf_acl.model_dump(by_alias=True) -- GitLab From f35c556646af56591771b74ca51f868f8d070acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Fri, 5 Jul 2024 00:14:50 +0100 Subject: [PATCH 325/602] REDEPLOYALL flag removed --- deploy/all.sh | 6 ------ deploy/crdb.sh | 9 ++------- deploy/nats.sh | 6 +----- deploy/qdb.sh | 6 +----- my_deploy.sh | 6 ------ 5 files changed, 4 insertions(+), 29 deletions(-) diff --git a/deploy/all.sh b/deploy/all.sh index c5d423a2f..da3b412d5 100755 --- a/deploy/all.sh +++ b/deploy/all.sh @@ -18,12 +18,6 @@ # Read deployment settings ######################################################################################################################## -# ----- Redeploy All ------------------------------------------------------------ - -# If not already set, enables all components redeployment -export REDEPLOYALL=${REDEPLOYALL:-""} - - # ----- TeraFlowSDN ------------------------------------------------------------ # If not already set, set the URL of the Docker registry where the images will be uploaded to. diff --git a/deploy/crdb.sh b/deploy/crdb.sh index 6412d1316..03a6dc5a6 100755 --- a/deploy/crdb.sh +++ b/deploy/crdb.sh @@ -18,11 +18,6 @@ # Read deployment settings ######################################################################################################################## -# ----- Redeploy All ------------------------------------------------------------ -# If not already set, enables all components redeployment -export REDEPLOYALL=${REDEPLOYALL:-""} - - # If not already set, set the namespace where CockroackDB will be deployed. export CRDB_NAMESPACE=${CRDB_NAMESPACE:-"crdb"} @@ -365,7 +360,7 @@ function crdb_drop_database_cluster() { } if [ "$CRDB_DEPLOY_MODE" == "single" ]; then - if [ "$CRDB_REDEPLOY" == "YES" ] || [ "$REDEPLOYALL" == "YES" ]; then + if [ "$CRDB_REDEPLOY" == "YES" ]; then crdb_undeploy_single fi @@ -375,7 +370,7 @@ if [ "$CRDB_DEPLOY_MODE" == "single" ]; then crdb_drop_database_single fi elif [ "$CRDB_DEPLOY_MODE" == "cluster" ]; then - if [ "$CRDB_REDEPLOY" == "YES" ] || [ "$REDEPLOYALL" == "YES" ]; then + if [ "$CRDB_REDEPLOY" == "YES" ]; then crdb_undeploy_cluster fi diff --git a/deploy/nats.sh b/deploy/nats.sh index 57fda629c..1bad13f02 100755 --- a/deploy/nats.sh +++ b/deploy/nats.sh @@ -18,10 +18,6 @@ # Read deployment settings ######################################################################################################################## -# ----- Redeploy All ------------------------------------------------------------ -# If not already set, enables all components redeployment -export REDEPLOYALL=${REDEPLOYALL:-""} - # If not already set, set the namespace where NATS will be deployed. export NATS_NAMESPACE=${NATS_NAMESPACE:-"nats"} @@ -224,7 +220,7 @@ function nats_undeploy() { echo } -if [ "$NATS_REDEPLOY" == "YES" ] || [ "$REDEPLOYALL" == "YES" ]; then +if [ "$NATS_REDEPLOY" == "YES" ]; then nats_undeploy fi diff --git a/deploy/qdb.sh b/deploy/qdb.sh index 513ef9ae0..acbcfd4f9 100755 --- a/deploy/qdb.sh +++ b/deploy/qdb.sh @@ -18,10 +18,6 @@ # Read deployment settings ######################################################################################################################## -# ----- Redeploy All ------------------------------------------------------------ -# If not already set, enables all components redeployment -export REDEPLOYALL=${REDEPLOYALL:-""} - # If not already set, set the namespace where QuestDB will be deployed. export QDB_NAMESPACE=${QDB_NAMESPACE:-"qdb"} @@ -181,7 +177,7 @@ function qdb_drop_tables() { echo } -if [ "$QDB_REDEPLOY" == "YES" ] || [ "$REDEPLOYALL" == "YES" ]; then +if [ "$QDB_REDEPLOY" == "YES" ]; then qdb_undeploy fi diff --git a/my_deploy.sh b/my_deploy.sh index 991c21e71..956d1b654 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -13,12 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# ----- Redeploy All ------------------------------------------------------------ - -# If not already set, enables all components redeployment -export REDEPLOYALL="" - - # ----- TeraFlowSDN ------------------------------------------------------------ # Set the URL of the internal MicroK8s Docker registry where the images will be uploaded to. -- GitLab From 0d16d024d6f22eaab83e87b6d5c1a6b859a7bf30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Fri, 5 Jul 2024 00:15:35 +0100 Subject: [PATCH 326/602] HPA in device and monitoring disabled --- manifests/deviceservice.yaml | 52 ++++++++++++++++---------------- manifests/monitoringservice.yaml | 52 ++++++++++++++++---------------- 2 files changed, 52 insertions(+), 52 deletions(-) diff --git a/manifests/deviceservice.yaml b/manifests/deviceservice.yaml index bf599d0b4..bd7c1bf1e 100644 --- a/manifests/deviceservice.yaml +++ b/manifests/deviceservice.yaml @@ -70,30 +70,30 @@ spec: selector: app: deviceservice ports: - - name: grpc - protocol: TCP - port: 2020 - targetPort: 2020 - - name: metrics - protocol: TCP - port: 9192 - targetPort: 9192 + - name: grpc + protocol: TCP + port: 2020 + targetPort: 2020 + - name: metrics + protocol: TCP + port: 9192 + targetPort: 9192 --- -apiVersion: autoscaling/v2 -kind: HorizontalPodAutoscaler -metadata: - name: deviceservice-hpa -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: deviceservice - minReplicas: 1 - maxReplicas: 10 - metrics: - - type: Resource - resource: - name: cpu - target: - type: Utilization - averageUtilization: 80 +# apiVersion: autoscaling/v2 +# kind: HorizontalPodAutoscaler +# metadata: +# name: deviceservice-hpa +# spec: +# scaleTargetRef: +# apiVersion: apps/v1 +# kind: Deployment +# name: deviceservice +# minReplicas: 1 +# maxReplicas: 10 +# metrics: +# - type: Resource +# resource: +# name: cpu +# target: +# type: Utilization +# averageUtilization: 80 diff --git a/manifests/monitoringservice.yaml b/manifests/monitoringservice.yaml index 4058436e5..a37073b2f 100644 --- a/manifests/monitoringservice.yaml +++ b/manifests/monitoringservice.yaml @@ -65,30 +65,30 @@ spec: selector: app: monitoringservice ports: - - name: grpc - protocol: TCP - port: 7070 - targetPort: 7070 - - name: metrics - protocol: TCP - port: 9192 - targetPort: 9192 + - name: grpc + protocol: TCP + port: 7070 + targetPort: 7070 + - name: metrics + protocol: TCP + port: 9192 + targetPort: 9192 --- -apiVersion: autoscaling/v2 -kind: HorizontalPodAutoscaler -metadata: - name: monitoringservice-hpa -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: monitoringservice - minReplicas: 1 - maxReplicas: 10 - metrics: - - type: Resource - resource: - name: cpu - target: - type: Utilization - averageUtilization: 80 +# apiVersion: autoscaling/v2 +# kind: HorizontalPodAutoscaler +# metadata: +# name: monitoringservice-hpa +# spec: +# scaleTargetRef: +# apiVersion: apps/v1 +# kind: Deployment +# name: monitoringservice +# minReplicas: 1 +# maxReplicas: 10 +# metrics: +# - type: Resource +# resource: +# name: cpu +# target: +# type: Utilization +# averageUtilization: 80 -- GitLab From bcf6657ec1e2fe20e0026991a0bead2e7346d7be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Fri, 5 Jul 2024 00:15:46 +0100 Subject: [PATCH 327/602] NGINX limits increased --- manifests/nginx_ingress_http.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/manifests/nginx_ingress_http.yaml b/manifests/nginx_ingress_http.yaml index 4797e275d..955d5726a 100644 --- a/manifests/nginx_ingress_http.yaml +++ b/manifests/nginx_ingress_http.yaml @@ -18,11 +18,11 @@ metadata: name: tfs-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 - nginx.ingress.kubernetes.io/limit-rps: '10' - nginx.ingress.kubernetes.io/limit-connections: '10' - nginx.ingress.kubernetes.io/proxy-connect-timeout: '10' - nginx.ingress.kubernetes.io/proxy-send-timeout: '10' - nginx.ingress.kubernetes.io/proxy-read-timeout: '10' + nginx.ingress.kubernetes.io/limit-rps: "50" + nginx.ingress.kubernetes.io/limit-connections: "50" + nginx.ingress.kubernetes.io/proxy-connect-timeout: "50" + nginx.ingress.kubernetes.io/proxy-send-timeout: "50" + nginx.ingress.kubernetes.io/proxy-read-timeout: "50" spec: rules: - http: -- GitLab From 86a588baf098eb467702937c9c214854089dd8f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ara=C3=BAjo?= Date: Fri, 5 Jul 2024 00:16:05 +0100 Subject: [PATCH 328/602] Reformating --- manifests/webuiservice.yaml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/manifests/webuiservice.yaml b/manifests/webuiservice.yaml index 132839edd..19317323f 100644 --- a/manifests/webuiservice.yaml +++ b/manifests/webuiservice.yaml @@ -111,12 +111,12 @@ spec: selector: app: webuiservice ports: - - name: webui - port: 8004 - targetPort: 8004 - - name: grafana - port: 3000 - targetPort: 3000 + - name: webui + port: 8004 + targetPort: 8004 + - name: grafana + port: 3000 + targetPort: 3000 --- apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler @@ -130,12 +130,12 @@ spec: minReplicas: 1 maxReplicas: 20 metrics: - - type: Resource - resource: - name: cpu - target: - type: Utilization - averageUtilization: 50 + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 50 #behavior: # scaleDown: # stabilizationWindowSeconds: 30 -- GitLab From 4b775276df4c1e93be033962e1604e0154a09976 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 8 Jul 2024 11:48:26 +0000 Subject: [PATCH 329/602] Pre-merge cleanup + script polishing --- deploy/all.sh | 46 ++++++++++++++++++++++++++++---- deploy/crdb.sh | 10 +++---- deploy/nats.sh | 3 ++- deploy/qdb.sh | 6 ++--- manifests/deviceservice.yaml | 19 ------------- manifests/monitoringservice.yaml | 19 ------------- manifests/nats/cluster.yaml | 17 ++++++++++-- my_deploy.sh | 1 + 8 files changed, 66 insertions(+), 55 deletions(-) diff --git a/deploy/all.sh b/deploy/all.sh index da3b412d5..cedbb5b8b 100755 --- a/deploy/all.sh +++ b/deploy/all.sh @@ -18,6 +18,7 @@ # Read deployment settings ######################################################################################################################## + # ----- TeraFlowSDN ------------------------------------------------------------ # If not already set, set the URL of the Docker registry where the images will be uploaded to. @@ -26,7 +27,44 @@ export TFS_REGISTRY_IMAGES=${TFS_REGISTRY_IMAGES:-"http://localhost:32000/tfs/"} # If not already set, set the list of components, separated by spaces, you want to build images for, and deploy. # By default, only basic components are deployed -export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device ztp monitoring pathcomp service slice nbi webui load_generator"} +export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device pathcomp service slice nbi webui load_generator"} + +# Uncomment to activate Monitoring +#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" + +# Uncomment to activate BGP-LS Speaker +#export TFS_COMPONENTS="${TFS_COMPONENTS} bgpls_speaker" + +# Uncomment to activate Optical Controller +# To manage optical connections, "service" requires "opticalcontroller" to be deployed +# before "service", thus we "hack" the TFS_COMPONENTS environment variable prepending the +# "opticalcontroller" only if "service" is already in TFS_COMPONENTS, and re-export it. +#if [[ "$TFS_COMPONENTS" == *"service"* ]]; then +# BEFORE="${TFS_COMPONENTS% service*}" +# AFTER="${TFS_COMPONENTS#* service}" +# export TFS_COMPONENTS="${BEFORE} opticalcontroller service ${AFTER}" +#fi + +# Uncomment to activate ZTP +#export TFS_COMPONENTS="${TFS_COMPONENTS} ztp" + +# Uncomment to activate Policy Manager +#export TFS_COMPONENTS="${TFS_COMPONENTS} policy" + +# Uncomment to activate Optical CyberSecurity +#export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager" + +# Uncomment to activate L3 CyberSecurity +#export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector" + +# Uncomment to activate TE +#export TFS_COMPONENTS="${TFS_COMPONENTS} te" + +# Uncomment to activate Forecaster +#export TFS_COMPONENTS="${TFS_COMPONENTS} forecaster" + +# Uncomment to activate E2E Orchestrator +#export TFS_COMPONENTS="${TFS_COMPONENTS} e2e_orchestrator" # If not already set, set the tag you want to use for your images. export TFS_IMAGE_TAG=${TFS_IMAGE_TAG:-"dev"} @@ -66,8 +104,6 @@ export CRDB_PASSWORD=${CRDB_PASSWORD:-"tfs123"} export CRDB_DATABASE=${CRDB_DATABASE:-"tfs"} # If not already set, set CockroachDB installation mode. Accepted values are: 'single' and 'cluster'. -# "YES", the database pointed by variable CRDB_NAMESPACE will be dropped while -# checking/deploying CockroachDB. # - If CRDB_DEPLOY_MODE is "single", CockroachDB is deployed in single node mode. It is convenient for # development and testing purposes and should fit in a VM. IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS. # - If CRDB_DEPLOY_MODE is "cluster", CockroachDB is deployed in cluster mode, and an entire CockroachDB cluster @@ -79,7 +115,7 @@ export CRDB_DEPLOY_MODE=${CRDB_DEPLOY_MODE:-"single"} # If not already set, disable flag for dropping database, if it exists. # WARNING: ACTIVATING THIS FLAG IMPLIES LOOSING THE DATABASE INFORMATION! -# If CRDB_DROP_DATABASE_IF_EXISTS is "YES", the database pointed by variable CRDB_NAMESPACE will be dropped while +# If CRDB_DROP_DATABASE_IF_EXISTS is "YES", the database pointed by variable CRDB_DATABASE will be dropped while # checking/deploying CockroachDB. export CRDB_DROP_DATABASE_IF_EXISTS=${CRDB_DROP_DATABASE_IF_EXISTS:-""} @@ -144,7 +180,7 @@ export QDB_TABLE_SLICE_GROUPS=${QDB_TABLE_SLICE_GROUPS:-"tfs_slice_groups"} # If not already set, disable flag for dropping tables if they exist. # WARNING: ACTIVATING THIS FLAG IMPLIES LOOSING THE TABLE INFORMATION! # If QDB_DROP_TABLES_IF_EXIST is "YES", the tables pointed by variables -# QDB_TABLE_MONITORING_KPIS and QDB_TABLE_SLICE_GROUPS will be dropped while +# QDB_TABLE_MONITORING_KPIS and QDB_TABLE_SLICE_GROUPS will be dropped while # checking/deploying QuestDB. export QDB_DROP_TABLES_IF_EXIST=${QDB_DROP_TABLES_IF_EXIST:-""} diff --git a/deploy/crdb.sh b/deploy/crdb.sh index 03a6dc5a6..3e80b6350 100755 --- a/deploy/crdb.sh +++ b/deploy/crdb.sh @@ -37,8 +37,6 @@ export CRDB_PASSWORD=${CRDB_PASSWORD:-"tfs123"} export CRDB_DATABASE=${CRDB_DATABASE:-"tfs"} # If not already set, set CockroachDB installation mode. Accepted values are: 'single' and 'cluster'. -# "YES", the database pointed by variable CRDB_NAMESPACE will be dropped while -# checking/deploying CockroachDB. # - If CRDB_DEPLOY_MODE is "single", CockroachDB is deployed in single node mode. It is convenient for # development and testing purposes and should fit in a VM. IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS. # - If CRDB_DEPLOY_MODE is "cluster", CockroachDB is deployed in cluster mode, and an entire CockroachDB cluster @@ -48,7 +46,7 @@ export CRDB_DATABASE=${CRDB_DATABASE:-"tfs"} # Ref: https://www.cockroachlabs.com/docs/stable/recommended-production-settings.html export CRDB_DEPLOY_MODE=${CRDB_DEPLOY_MODE:-"single"} -# If not already set, disable flag for dropping database if exists. +# If not already set, disable flag for dropping database, if it exists. # WARNING: ACTIVATING THIS FLAG IMPLIES LOOSING THE DATABASE INFORMATION! # If CRDB_DROP_DATABASE_IF_EXISTS is "YES", the database pointed by variable CRDB_DATABASE will be dropped while # checking/deploying CockroachDB. @@ -79,7 +77,7 @@ function crdb_deploy_single() { kubectl create namespace ${CRDB_NAMESPACE} echo - echo "CockroachDB (single-node)" + echo "CockroachDB (single-mode)" echo ">>> Checking if CockroachDB is deployed..." if kubectl get --namespace ${CRDB_NAMESPACE} statefulset/cockroachdb &> /dev/null; then echo ">>> CockroachDB is present; skipping step." @@ -139,7 +137,7 @@ function crdb_deploy_single() { } function crdb_undeploy_single() { - echo "CockroachDB" + echo "CockroachDB (single-mode)" echo ">>> Checking if CockroachDB is deployed..." if kubectl get --namespace ${CRDB_NAMESPACE} statefulset/cockroachdb &> /dev/null; then echo ">>> Undeploy CockroachDB" @@ -319,7 +317,7 @@ function crdb_undeploy_cluster() { fi echo - echo "CockroachDB" + echo "CockroachDB (cluster-mode)" echo ">>> Checking if CockroachDB is deployed..." if kubectl get --namespace ${CRDB_NAMESPACE} statefulset/cockroachdb &> /dev/null; then echo ">>> Undeploy CockroachDB" diff --git a/deploy/nats.sh b/deploy/nats.sh index 1bad13f02..e9cef883e 100755 --- a/deploy/nats.sh +++ b/deploy/nats.sh @@ -40,6 +40,7 @@ export NATS_DEPLOY_MODE=${NATS_DEPLOY_MODE:-"single"} # If NATS_REDEPLOY is "YES", the message broker will be dropped while checking/deploying NATS. export NATS_REDEPLOY=${NATS_REDEPLOY:-""} + ######################################################################################################################## # Automated steps start here ######################################################################################################################## @@ -62,7 +63,7 @@ function nats_deploy_single() { helm3 repo add nats https://nats-io.github.io/k8s/helm/charts/ echo - echo "Install NATS (single-node)" + echo "Install NATS (single-mode)" echo ">>> Checking if NATS is deployed..." if kubectl get --namespace ${NATS_NAMESPACE} statefulset/${NATS_NAMESPACE} &> /dev/null; then echo ">>> NATS is present; skipping step." diff --git a/deploy/qdb.sh b/deploy/qdb.sh index acbcfd4f9..426171b65 100755 --- a/deploy/qdb.sh +++ b/deploy/qdb.sh @@ -44,9 +44,9 @@ export QDB_TABLE_SLICE_GROUPS=${QDB_TABLE_SLICE_GROUPS:-"tfs_slice_groups"} # If not already set, disable flag for dropping tables if they exist. # WARNING: ACTIVATING THIS FLAG IMPLIES LOOSING THE TABLE INFORMATION! -# If QDB_DROP_TABLES_IF_EXIST is "YES", the table pointed by variables -# QDB_TABLE_MONITORING_KPIS and QDB_TABLE_SLICE_GROUPS will be dropped -# while checking/deploying QuestDB. +# If QDB_DROP_TABLES_IF_EXIST is "YES", the tables pointed by variables +# QDB_TABLE_MONITORING_KPIS and QDB_TABLE_SLICE_GROUPS will be dropped while +# checking/deploying QuestDB. export QDB_DROP_TABLES_IF_EXIST=${QDB_DROP_TABLES_IF_EXIST:-""} # If not already set, disable flag for re-deploying QuestDB from scratch. diff --git a/manifests/deviceservice.yaml b/manifests/deviceservice.yaml index bd7c1bf1e..e49ba2399 100644 --- a/manifests/deviceservice.yaml +++ b/manifests/deviceservice.yaml @@ -78,22 +78,3 @@ spec: protocol: TCP port: 9192 targetPort: 9192 ---- -# apiVersion: autoscaling/v2 -# kind: HorizontalPodAutoscaler -# metadata: -# name: deviceservice-hpa -# spec: -# scaleTargetRef: -# apiVersion: apps/v1 -# kind: Deployment -# name: deviceservice -# minReplicas: 1 -# maxReplicas: 10 -# metrics: -# - type: Resource -# resource: -# name: cpu -# target: -# type: Utilization -# averageUtilization: 80 diff --git a/manifests/monitoringservice.yaml b/manifests/monitoringservice.yaml index a37073b2f..1540db0a1 100644 --- a/manifests/monitoringservice.yaml +++ b/manifests/monitoringservice.yaml @@ -73,22 +73,3 @@ spec: protocol: TCP port: 9192 targetPort: 9192 ---- -# apiVersion: autoscaling/v2 -# kind: HorizontalPodAutoscaler -# metadata: -# name: monitoringservice-hpa -# spec: -# scaleTargetRef: -# apiVersion: apps/v1 -# kind: Deployment -# name: monitoringservice -# minReplicas: 1 -# maxReplicas: 10 -# metrics: -# - type: Resource -# resource: -# name: cpu -# target: -# type: Utilization -# averageUtilization: 80 diff --git a/manifests/nats/cluster.yaml b/manifests/nats/cluster.yaml index 491c86628..00dbef17f 100644 --- a/manifests/nats/cluster.yaml +++ b/manifests/nats/cluster.yaml @@ -1,3 +1,17 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + container: image: tags: 2.9-alpine @@ -24,11 +38,10 @@ config: fileStore: pvc: size: 4Gi - + # Force one pod per node, if possible podTemplate: topologySpreadConstraints: kubernetes.io/hostname: maxSkew: 1 whenUnsatisfiable: ScheduleAnyway - \ No newline at end of file diff --git a/my_deploy.sh b/my_deploy.sh index 956d1b654..6007a7ff9 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -13,6 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. + # ----- TeraFlowSDN ------------------------------------------------------------ # Set the URL of the internal MicroK8s Docker registry where the images will be uploaded to. -- GitLab From f81ed5202094099ad731c2d56daa4319e08ccb63 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 8 Jul 2024 11:50:49 +0000 Subject: [PATCH 330/602] Pre-merge cleanup + script polishing --- deploy/qdb.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/qdb.sh b/deploy/qdb.sh index 426171b65..ebb75dce9 100755 --- a/deploy/qdb.sh +++ b/deploy/qdb.sh @@ -45,8 +45,8 @@ export QDB_TABLE_SLICE_GROUPS=${QDB_TABLE_SLICE_GROUPS:-"tfs_slice_groups"} # If not already set, disable flag for dropping tables if they exist. # WARNING: ACTIVATING THIS FLAG IMPLIES LOOSING THE TABLE INFORMATION! # If QDB_DROP_TABLES_IF_EXIST is "YES", the tables pointed by variables -# QDB_TABLE_MONITORING_KPIS and QDB_TABLE_SLICE_GROUPS will be dropped while -# checking/deploying QuestDB. +# QDB_TABLE_MONITORING_KPIS and QDB_TABLE_SLICE_GROUPS will be dropped +# while checking/deploying QuestDB. export QDB_DROP_TABLES_IF_EXIST=${QDB_DROP_TABLES_IF_EXIST:-""} # If not already set, disable flag for re-deploying QuestDB from scratch. -- GitLab From 6512694f90c11cb57a68f840c566db1fc7531015 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 8 Jul 2024 15:55:58 +0000 Subject: [PATCH 331/602] Updated missing copyright notices in files --- .../service/java/netphony-topology/doc/Examples.md | 2 +- .../service/java/netphony-topology/doc/TAPIExample.md | 2 +- .../java/netphony-topology/doc/TopologyFileDescription.md | 2 +- src/dlt/gateway/settings.gradle.kts | 2 +- src/webui/service/templates/base.html | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/bgpls_speaker/service/java/netphony-topology/doc/Examples.md b/src/bgpls_speaker/service/java/netphony-topology/doc/Examples.md index 88f7a7bd5..f4faae268 100644 --- a/src/bgpls_speaker/service/java/netphony-topology/doc/Examples.md +++ b/src/bgpls_speaker/service/java/netphony-topology/doc/Examples.md @@ -1,4 +1,4 @@ ->> test_validate_kafka_topics: START <<<--- ") KpiValueWriter.RunKafkaConsumer() - \ No newline at end of file + +def test_metric_composer_and_writer(): + LOGGER.debug(" --->>> test_metric_composer_and_writer: START <<<--- ") diff --git a/src/kpi_value_writer/tests/test_messages.py b/src/kpi_value_writer/tests/test_messages.py index 7e59499e9..d9f4cf80a 100755 --- a/src/kpi_value_writer/tests/test_messages.py +++ b/src/kpi_value_writer/tests/test_messages.py @@ -12,13 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -import uuid +import uuid, time +import random from common.proto import kpi_manager_pb2 +from common.proto.kpi_value_api_pb2 import KpiValue from common.proto.kpi_sample_types_pb2 import KpiSampleType -from common.proto.context_pb2 import DeviceId, LinkId, ServiceId, SliceId,\ - ConnectionId, EndPointId -# ---------------------- 3rd iteration Test Messages --------------------------------- + def create_kpi_descriptor_request(description: str = "Test Description"): _create_kpi_request = kpi_manager_pb2.KpiDescriptor() _create_kpi_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) @@ -32,128 +32,9 @@ def create_kpi_descriptor_request(description: str = "Test Description"): _create_kpi_request.link_id.link_uuid.uuid = 'LNK2' # pylint: disable=maybe-no-member return _create_kpi_request -# ---------------------- 2nd iteration Test Messages --------------------------------- -# def create_kpi_id_request(): -# _kpi_id = kpi_manager_pb2.KpiId() -# _kpi_id.kpi_id.uuid = "34f73604-eca6-424f-9995-18b519ad0978" -# return _kpi_id - -# def create_kpi_descriptor_request_a(descriptor_name: str = "Test_name"): -# _create_kpi_request = kpi_manager_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 - -# def create_kpi_descriptor_request(): -# _create_kpi_request = kpi_manager_pb2.KpiDescriptor() -# _create_kpi_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) -# _create_kpi_request.kpi_description = 'KPI Description Test' -# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED -# _create_kpi_request.device_id.device_uuid.uuid = 'DEV4' # pylint: disable=maybe-no-member -# _create_kpi_request.service_id.service_uuid.uuid = 'SERV3' # pylint: disable=maybe-no-member -# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC3' # pylint: disable=maybe-no-member -# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END2' # pylint: disable=maybe-no-member -# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2' # pylint: disable=maybe-no-member -# _create_kpi_request.link_id.link_uuid.uuid = 'LNK2' # pylint: disable=maybe-no-member -# return _create_kpi_request - -# def create_kpi_filter_request_a(): -# _create_kpi_filter_request = kpi_manager_pb2.KpiDescriptorFilter() -# _create_kpi_filter_request.kpi_sample_type.append(KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED) - -# device_id_obj = DeviceId() -# endpoint_id_obj = EndPointId() -# service_id_obj = ServiceId() -# slice_id_obj = SliceId() -# connection_id_obj = ConnectionId() -# link_id_obj = LinkId() - -# device_id_obj.device_uuid.uuid = "DEV1" -# endpoint_id_obj.endpoint_uuid.uuid = "END1" -# service_id_obj.service_uuid.uuid = "SERV1" -# slice_id_obj.slice_uuid.uuid = "SLC1" -# connection_id_obj.connection_uuid.uuid = "CON1" -# link_id_obj.link_uuid.uuid = "LNK1" - -# _create_kpi_filter_request.device_id.append(device_id_obj) -# _create_kpi_filter_request.endpoint_id.append(endpoint_id_obj) -# _create_kpi_filter_request.service_id.append(service_id_obj) -# _create_kpi_filter_request.slice_id.append(slice_id_obj) -# _create_kpi_filter_request.connection_id.append(connection_id_obj) -# _create_kpi_filter_request.link_id.append(link_id_obj) - -# return _create_kpi_filter_request - -# -------------------- Initial Test messages ------------------------------------- - -# def create_kpi_request(kpi_id_str): -# _create_kpi_request = kpi_manager_pb2.KpiDescriptor() -# _create_kpi_request.kpi_description = 'KPI Description Test' -# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED -# _create_kpi_request.device_id.device_uuid.uuid = 'DEV' + str(kpi_id_str) -# _create_kpi_request.service_id.service_uuid.uuid = 'SERV' + str(kpi_id_str) -# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC' + str(kpi_id_str) -# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END' + str(kpi_id_str) -# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON' + str(kpi_id_str) -# return _create_kpi_request - -# def create_kpi_request_b(): -# _create_kpi_request = kpi_manager_pb2.KpiDescriptor() -# _create_kpi_request = str(uuid.uuid4()) -# _create_kpi_request.kpi_description = 'KPI Description Test' -# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED -# _create_kpi_request.device_id.device_uuid.uuid = 'DEV2' # pylint: disable=maybe-no-member -# _create_kpi_request.service_id.service_uuid.uuid = 'SERV2' # pylint: disable=maybe-no-member -# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC2' # pylint: disable=maybe-no-member -# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END2' # pylint: disable=maybe-no-member -# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2' # pylint: disable=maybe-no-member -# return _create_kpi_request - -# def create_kpi_request_c(): -# _create_kpi_request = kpi_manager_pb2.KpiDescriptor() -# _create_kpi_request.kpi_description = 'KPI Description Test' -# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED -# _create_kpi_request.device_id.device_uuid.uuid = 'DEV3' # pylint: disable=maybe-no-member -# _create_kpi_request.service_id.service_uuid.uuid = 'SERV3' # pylint: disable=maybe-no-member -# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC3' # pylint: disable=maybe-no-member -# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END3' # pylint: disable=maybe-no-member -# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON3' # pylint: disable=maybe-no-member -# return _create_kpi_request - -# def create_kpi_request_d(): -# _create_kpi_request = kpi_manager_pb2.KpiDescriptor() -# _create_kpi_request.kpi_description = 'KPI Description Test' -# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED -# _create_kpi_request.device_id.device_uuid.uuid = 'DEV4' # pylint: disable=maybe-no-member -# _create_kpi_request.service_id.service_uuid.uuid = 'SERV4' # pylint: disable=maybe-no-member -# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC4' # pylint: disable=maybe-no-member -# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END4' # pylint: disable=maybe-no-member -# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON4' # pylint: disable=maybe-no-member -# return _create_kpi_request - -# def kpi_descriptor_list(): -# _kpi_descriptor_list = kpi_manager_pb2.KpiDescriptorList() -# return _kpi_descriptor_list - -# def create_kpi_filter_request(): -# _create_kpi_filter_request = kpi_manager_pb2.KpiDescriptorFilter() -# _create_kpi_filter_request.kpi_sample_type.append(KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED) -# new_device_id = _create_kpi_filter_request.device_id.add() -# new_device_id.device_uuid.uuid = 'DEV1' -# new_service_id = _create_kpi_filter_request.service_id.add() -# new_service_id.service_uuid.uuid = 'SERV1' -# new_slice_id = _create_kpi_filter_request.slice_id.add() -# new_slice_id.slice_uuid.uuid = 'SLC1' -# new_endpoint_id = _create_kpi_filter_request.endpoint_id.add() -# new_endpoint_id.endpoint_uuid.uuid = 'END1' -# new_connection_id = _create_kpi_filter_request.connection_id.add() -# new_connection_id.connection_uuid.uuid = 'CON1' - -# return _create_kpi_filter_request \ No newline at end of file +def create_kpi_value_request(): + _create_kpi_value_request = KpiValue() + _create_kpi_value_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) + _create_kpi_value_request.timestamp.timestamp = time.time() + _create_kpi_value_request.kpi_value_type.floatVal = random.randint(10, 10000) + return _create_kpi_value_request \ No newline at end of file diff --git a/src/kpi_value_writer/tests/test_metric_writer_to_prom.py b/src/kpi_value_writer/tests/test_metric_writer_to_prom.py new file mode 100644 index 000000000..cee2877ff --- /dev/null +++ b/src/kpi_value_writer/tests/test_metric_writer_to_prom.py @@ -0,0 +1,29 @@ +# 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 threading +import logging +from kpi_value_writer.service.MetricWriterToPrometheus import MetricWriterToPrometheus +from kpi_value_writer.tests.test_messages import create_kpi_descriptor_request, create_kpi_value_request + +LOGGER = logging.getLogger(__name__) + +def test_metric_writer_to_prometheus(): + LOGGER.info(' >>> test_metric_writer_to_prometheus START <<< ') + metric_writer_obj = MetricWriterToPrometheus() + metric_writer_obj.create_and_expose_cooked_kpi( + create_kpi_descriptor_request(), + create_kpi_value_request() + ) + -- GitLab From f8c3a52f51f90c52720774b2b5e28f4357ae7de6 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 18 Jul 2024 10:28:33 +0000 Subject: [PATCH 356/602] changes for integration with TFS (service is running) --- deploy/tfs.sh | 2 +- manifests/kpi_managerservice.yaml | 28 +++++++++---------- src/kpi_manager/service/KpiManagerService.py | 2 +- .../service/KpiManagerServiceServicerImpl.py | 2 +- src/kpi_manager/service/__main__.py | 3 +- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/deploy/tfs.sh b/deploy/tfs.sh index 04895f984..f85e9bbc9 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -27,7 +27,7 @@ export TFS_REGISTRY_IMAGES=${TFS_REGISTRY_IMAGES:-"http://localhost:32000/tfs/"} # If not already set, set the list of components, separated by spaces, you want to build images for, and deploy. # By default, only basic components are deployed -export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device ztp monitoring pathcomp service slice nbi webui load_generator"} +export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device ztp monitoring pathcomp service slice nbi webui load_generator kpi_manager"} # If not already set, set the tag you want to use for your images. export TFS_IMAGE_TAG=${TFS_IMAGE_TAG:-"dev"} diff --git a/manifests/kpi_managerservice.yaml b/manifests/kpi_managerservice.yaml index 45ee77895..3e106fd92 100644 --- a/manifests/kpi_managerservice.yaml +++ b/manifests/kpi_managerservice.yaml @@ -15,26 +15,26 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: kpi_managerservice + name: kpi-managerservice spec: selector: matchLabels: - app: kpi_managerservice + app: kpi-managerservice #replicas: 1 template: metadata: annotations: config.linkerd.io/skip-outbound-ports: "4222" labels: - app: kpi_managerservice + app: kpi-managerservice spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: labs.etsi.org:5050/tfs/controller/context:latest + image: labs.etsi.org:5050/tfs/controller/kpi_manager:latest imagePullPolicy: Always ports: - - containerPort: 7071 + - containerPort: 30010 - containerPort: 9192 env: - name: LOG_LEVEL @@ -44,10 +44,10 @@ spec: name: crdb-data readinessProbe: exec: - command: ["/bin/grpc_health_probe", "-addr=:7071"] + command: ["/bin/grpc_health_probe", "-addr=:30010"] livenessProbe: exec: - command: ["/bin/grpc_health_probe", "-addr=:7071"] + command: ["/bin/grpc_health_probe", "-addr=:30010"] resources: requests: cpu: 250m @@ -59,18 +59,18 @@ spec: apiVersion: v1 kind: Service metadata: - name: kpi_managerservice + name: kpi-managerservice labels: - app: kpi_managerservice + app: kpi-managerservice spec: type: ClusterIP selector: - app: kpi_managerservice + app: kpi-managerservice ports: - name: grpc protocol: TCP - port: 7071 - targetPort: 7071 + port: 30010 + targetPort: 30010 - name: metrics protocol: TCP port: 9192 @@ -79,12 +79,12 @@ spec: apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: - name: kpi_managerservice-hpa + name: kpi-managerservice-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment - name: kpi_managerservice + name: kpi-managerservice minReplicas: 1 maxReplicas: 20 metrics: diff --git a/src/kpi_manager/service/KpiManagerService.py b/src/kpi_manager/service/KpiManagerService.py index 434246a43..6c8c66393 100755 --- a/src/kpi_manager/service/KpiManagerService.py +++ b/src/kpi_manager/service/KpiManagerService.py @@ -14,7 +14,7 @@ from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc -from monitoring.service.NameMapping import NameMapping +from .NameMapping import NameMapping from common.tools.service.GenericGrpcService import GenericGrpcService from common.proto.kpi_manager_pb2_grpc import add_KpiManagerServiceServicer_to_server from kpi_manager.service.KpiManagerServiceServicerImpl import KpiManagerServiceServicerImpl diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py index 2fd4e6ac8..17d8da675 100644 --- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -20,7 +20,7 @@ from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_m 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 monitoring.service.NameMapping import NameMapping +from .NameMapping import NameMapping from kpi_manager.database.Kpi_DB import KpiDB from kpi_manager.database.KpiModel import Kpi as KpiModel diff --git a/src/kpi_manager/service/__main__.py b/src/kpi_manager/service/__main__.py index ef39263ff..50b504867 100644 --- a/src/kpi_manager/service/__main__.py +++ b/src/kpi_manager/service/__main__.py @@ -19,8 +19,7 @@ from common.Settings import ( ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_log_level, get_metrics_port, wait_for_environment_variables) from common.proto import monitoring_pb2 -from monitoring.service.EventTools import EventsDeviceCollector # import updated -from monitoring.service.NameMapping import NameMapping # import updated +from .NameMapping import NameMapping # import updated from .KpiManagerService import KpiManagerService terminate = threading.Event() -- GitLab From ac2a0594a7773ebf7bab1475ecd977572ec4a2a6 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 18 Jul 2024 10:29:36 +0000 Subject: [PATCH 357/602] change verison to resolve dependencies --- src/kpi_manager/requirements.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kpi_manager/requirements.in b/src/kpi_manager/requirements.in index b66e07d20..c4a1c2120 100644 --- a/src/kpi_manager/requirements.in +++ b/src/kpi_manager/requirements.in @@ -39,7 +39,7 @@ macaddress==2.0.2 MarkupSafe==2.1.5 multidict==6.0.5 ncclient==0.6.15 -networkx==3.3 +networkx==2.8.8 numpy==2.0.0 ordered-set==4.1.0 p4runtime==1.3.0 -- GitLab From ceaeba274d66e822ea234f2120bfefeba85195f1 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 18 Jul 2024 15:26:56 +0000 Subject: [PATCH 358/602] Some other changes for integration with TFS --- deploy/all.sh | 2 +- install_requirements.sh | 1 + src/kpi_manager/requirements-all.in | 83 +++++++++++++++++++ src/kpi_manager/requirements.in | 42 ++-------- .../service/KpiValueWriter.py | 4 +- .../tests/test_kpi_value_writer.py | 4 +- 6 files changed, 95 insertions(+), 41 deletions(-) create mode 100644 src/kpi_manager/requirements-all.in diff --git a/deploy/all.sh b/deploy/all.sh index cedbb5b8b..99058b96e 100755 --- a/deploy/all.sh +++ b/deploy/all.sh @@ -27,7 +27,7 @@ export TFS_REGISTRY_IMAGES=${TFS_REGISTRY_IMAGES:-"http://localhost:32000/tfs/"} # If not already set, set the list of components, separated by spaces, you want to build images for, and deploy. # By default, only basic components are deployed -export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device pathcomp service slice nbi webui load_generator"} +export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device pathcomp service slice nbi webui load_generator kpi_manager"} # Uncomment to activate Monitoring #export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" diff --git a/install_requirements.sh b/install_requirements.sh index cbd378eca..f1ae278c6 100755 --- a/install_requirements.sh +++ b/install_requirements.sh @@ -22,6 +22,7 @@ ALL_COMPONENTS="context device service nbi monitoring webui interdomain slice" ALL_COMPONENTS="${ALL_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector" ALL_COMPONENTS="${ALL_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector l3_distributedattackdetector" +ALL_COMPONENTS="${ALL_COMPONENTS} kpi_manager" TFS_COMPONENTS=${TFS_COMPONENTS:-$ALL_COMPONENTS} # Some components require libyang built from source code diff --git a/src/kpi_manager/requirements-all.in b/src/kpi_manager/requirements-all.in new file mode 100644 index 000000000..c4a1c2120 --- /dev/null +++ b/src/kpi_manager/requirements-all.in @@ -0,0 +1,83 @@ +aniso8601==9.0.1 +anytree==2.8.0 +APScheduler==3.10.1 +attrs==23.2.0 +bcrypt==4.1.3 +certifi==2024.2.2 +cffi==1.16.0 +charset-normalizer==2.0.12 +click==8.1.7 +colorama==0.4.6 +confluent-kafka==2.3.0 +coverage==6.3 +cryptography==36.0.2 +deepdiff==6.7.1 +deepmerge==1.1.1 +enum34==1.1.10 +Flask==2.1.3 +Flask-HTTPAuth==4.5.0 +Flask-RESTful==0.3.9 +future-fstrings==1.2.0 +googleapis-common-protos==1.63.2 +greenlet==3.0.3 +grpcio==1.47.5 +grpcio-health-checking==1.47.5 +grpcio-tools==1.47.5 +grpclib==0.4.4 +h2==4.1.0 +hpack==4.0.0 +hyperframe==6.0.1 +idna==3.7 +influx-line-protocol==0.1.4 +iniconfig==2.0.0 +ipaddress==1.0.23 +itsdangerous==2.2.0 +Jinja2==3.0.3 +kafka-python==2.0.2 +lxml==5.2.2 +macaddress==2.0.2 +MarkupSafe==2.1.5 +multidict==6.0.5 +ncclient==0.6.15 +networkx==2.8.8 +numpy==2.0.0 +ordered-set==4.1.0 +p4runtime==1.3.0 +packaging==24.0 +pandas==1.5.3 +paramiko==2.9.2 +pluggy==1.5.0 +prettytable==3.5.0 +prometheus-client==0.13.0 +protobuf==3.20.3 +psycopg2-binary==2.9.3 +py==1.11.0 +py-cpuinfo==9.0.0 +pyang==2.6.0 +pyangbind @ git+https://github.com/robshakir/pyangbind.git@daf530f882c14bdb1bae4dc94fb4b4ad04d1295c +pycparser==2.22 +PyNaCl==1.5.0 +pytest==6.2.5 +pytest-benchmark==3.4.1 +pytest-depends==1.0.1 +python-dateutil==2.8.2 +python-json-logger==2.0.2 +pytz==2024.1 +questdb==1.0.1 +regex==2024.5.15 +requests==2.27.1 +requests-mock==1.9.3 +six==1.16.0 +SQLAlchemy==1.4.52 +sqlalchemy-cockroachdb==1.4.4 +SQLAlchemy-Utils==0.38.3 +tabulate==0.9.0 +toml==0.10.2 +typing_extensions==4.12.0 +tzlocal==5.2 +urllib3==1.26.18 +wcwidth==0.2.13 +websockets==10.4 +Werkzeug==2.3.7 +xmltodict==0.12.0 +yattag==1.15.2 diff --git a/src/kpi_manager/requirements.in b/src/kpi_manager/requirements.in index c4a1c2120..b961116dc 100644 --- a/src/kpi_manager/requirements.in +++ b/src/kpi_manager/requirements.in @@ -1,23 +1,12 @@ -aniso8601==9.0.1 anytree==2.8.0 APScheduler==3.10.1 attrs==23.2.0 bcrypt==4.1.3 -certifi==2024.2.2 +certifi==2024.7.4 cffi==1.16.0 charset-normalizer==2.0.12 -click==8.1.7 -colorama==0.4.6 -confluent-kafka==2.3.0 coverage==6.3 -cryptography==36.0.2 -deepdiff==6.7.1 -deepmerge==1.1.1 -enum34==1.1.10 -Flask==2.1.3 -Flask-HTTPAuth==4.5.0 -Flask-RESTful==0.3.9 -future-fstrings==1.2.0 +cryptography==42.0.8 googleapis-common-protos==1.63.2 greenlet==3.0.3 grpcio==1.47.5 @@ -28,56 +17,37 @@ h2==4.1.0 hpack==4.0.0 hyperframe==6.0.1 idna==3.7 -influx-line-protocol==0.1.4 iniconfig==2.0.0 -ipaddress==1.0.23 -itsdangerous==2.2.0 Jinja2==3.0.3 -kafka-python==2.0.2 lxml==5.2.2 macaddress==2.0.2 MarkupSafe==2.1.5 multidict==6.0.5 ncclient==0.6.15 -networkx==2.8.8 -numpy==2.0.0 -ordered-set==4.1.0 p4runtime==1.3.0 -packaging==24.0 -pandas==1.5.3 -paramiko==2.9.2 +packaging==24.1 +paramiko==3.4.0 pluggy==1.5.0 prettytable==3.5.0 prometheus-client==0.13.0 protobuf==3.20.3 psycopg2-binary==2.9.3 py==1.11.0 -py-cpuinfo==9.0.0 -pyang==2.6.0 -pyangbind @ git+https://github.com/robshakir/pyangbind.git@daf530f882c14bdb1bae4dc94fb4b4ad04d1295c pycparser==2.22 PyNaCl==1.5.0 pytest==6.2.5 -pytest-benchmark==3.4.1 -pytest-depends==1.0.1 -python-dateutil==2.8.2 -python-json-logger==2.0.2 pytz==2024.1 -questdb==1.0.1 -regex==2024.5.15 requests==2.27.1 -requests-mock==1.9.3 six==1.16.0 SQLAlchemy==1.4.52 sqlalchemy-cockroachdb==1.4.4 SQLAlchemy-Utils==0.38.3 tabulate==0.9.0 toml==0.10.2 -typing_extensions==4.12.0 +typing_extensions==4.12.2 tzlocal==5.2 -urllib3==1.26.18 +urllib3==1.26.19 wcwidth==0.2.13 websockets==10.4 -Werkzeug==2.3.7 xmltodict==0.12.0 yattag==1.15.2 diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index 1385ac564..ae75f777a 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -49,8 +49,8 @@ class KpiValueWriter: 'auto.offset.reset' : 'latest'} ) kafka_consumer.subscribe([KafkaTopic.VALUE.value]) - LOGGER.debug("Kafka Consumer start listenng on topic: ".format(KafkaTopic.VALUE.value)) - print("Kafka Consumer start listenng on topic: ".format(KafkaTopic.VALUE.value)) + LOGGER.debug("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) + print("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) while True: raw_kpi = kafka_consumer.poll(1.0) if raw_kpi is None: diff --git a/src/kpi_value_writer/tests/test_kpi_value_writer.py b/src/kpi_value_writer/tests/test_kpi_value_writer.py index e528f1dbb..bec193a9e 100755 --- a/src/kpi_value_writer/tests/test_kpi_value_writer.py +++ b/src/kpi_value_writer/tests/test_kpi_value_writer.py @@ -30,5 +30,5 @@ def test_KafkaConsumer(): LOGGER.debug(" --->>> test_validate_kafka_topics: START <<<--- ") KpiValueWriter.RunKafkaConsumer() -def test_metric_composer_and_writer(): - LOGGER.debug(" --->>> test_metric_composer_and_writer: START <<<--- ") +# def test_metric_composer_and_writer(): +# LOGGER.debug(" --->>> test_metric_composer_and_writer: START <<<--- ") -- GitLab From f67066bd87e0823092768018ed266f14ec4ec848 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 19 Jul 2024 15:26:31 +0000 Subject: [PATCH 359/602] Some other changes for KPI value api and writer --- src/common/Constants.py | 6 +++--- .../service/KpiManagerServiceServicerImpl.py | 1 + src/kpi_value_writer/service/KpiValueWriter.py | 17 +++++++++++++++-- .../tests/test_kpi_value_writer.py | 2 +- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/common/Constants.py b/src/common/Constants.py index c616fed09..ad4cfa958 100644 --- a/src/common/Constants.py +++ b/src/common/Constants.py @@ -43,9 +43,9 @@ class ServiceNameEnum(Enum): ZTP = 'ztp' POLICY = 'policy' MONITORING = 'monitoring' - KPIMANAGER = 'kpiManager' - KPIVALUEAPI = 'kpiValueApi' - TELEMETRYFRONTEND = 'telemetryfrontend' + KPIMANAGER = 'kpi_manager' + KPIVALUEAPI = 'kpi_value_api' + TELEMETRYFRONTEND = 'telemetry_frontend' DLT = 'dlt' NBI = 'nbi' CYBERSECURITY = 'cybersecurity' diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py index 17d8da675..8996a8efb 100644 --- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -50,6 +50,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext # type: ignore ) -> KpiDescriptor: # type: ignore response = KpiDescriptor() + print("--> Received gRPC message object: {:}".format(request)) LOGGER.debug("Received gRPC message object: {:}".format(request)) try: kpi_id_to_search = request.kpi_id.uuid diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index ae75f777a..73dcac935 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -29,6 +29,10 @@ from kpi_manager.client.KpiManagerClient import KpiManagerClient from monitoring.service.NameMapping import NameMapping from kpi_manager.service.KpiManagerService import KpiManagerService +# -- test import -- +from kpi_value_writer.tests.test_messages import create_kpi_descriptor_request +from .MetricWriterToPrometheus import MetricWriterToPrometheus + LOGGER = logging.getLogger(__name__) ACTIVE_CONSUMERS = [] @@ -48,6 +52,8 @@ class KpiValueWriter: 'group.id' : __class__, 'auto.offset.reset' : 'latest'} ) + metric_writer_to_prom = MetricWriterToPrometheus() + kafka_consumer.subscribe([KafkaTopic.VALUE.value]) LOGGER.debug("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) print("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) @@ -66,13 +72,20 @@ class KpiValueWriter: kpi_value.ParseFromString(raw_kpi.value()) LOGGER.debug("Received KPI : {:}".format(kpi_value)) print("Received KPI : {:}".format(kpi_value)) - KpiValueWriter.get_kpi_descriptor_from_db(kpi_value.kpi_id.kpi_id.uuid) + KpiValueWriter.get_kpi_descriptor(kpi_value.kpi_id.kpi_id.uuid) + # -------- Testing section --------------- + # test_kpi_descriptor_obj = create_kpi_descriptor_request() + # metric_writer_to_prom.create_and_expose_cooked_kpi( + # test_kpi_descriptor_obj, kpi_value + # ) + # -------- Testing section --------------- + except Exception as e: print("Error detail: {:}".format(e)) continue @staticmethod - def get_kpi_descriptor_from_db(kpi_value_uuid: str): + def get_kpi_descriptor(kpi_value_uuid: str): print("--- START -----") kpi_id = KpiId() diff --git a/src/kpi_value_writer/tests/test_kpi_value_writer.py b/src/kpi_value_writer/tests/test_kpi_value_writer.py index bec193a9e..19a7d3915 100755 --- a/src/kpi_value_writer/tests/test_kpi_value_writer.py +++ b/src/kpi_value_writer/tests/test_kpi_value_writer.py @@ -27,7 +27,7 @@ LOGGER = logging.getLogger(__name__) # assert isinstance(response, bool) def test_KafkaConsumer(): - LOGGER.debug(" --->>> test_validate_kafka_topics: START <<<--- ") + LOGGER.debug(" --->>> test_kafka_consumer: START <<<--- ") KpiValueWriter.RunKafkaConsumer() # def test_metric_composer_and_writer(): -- GitLab From baa73d795398100b66254f6228de784eace7fff9 Mon Sep 17 00:00:00 2001 From: Lluis Gifre Renom Date: Mon, 22 Jul 2024 09:00:00 +0000 Subject: [PATCH 360/602] Merge branch 'feat/171-e2e-orchestrator-component-has-wrong-service-name-in-constants-py' into 'release/3.0.1' Resolve "E2E Orchestrator component has wrong service name in Constants.py" See merge request tfs/controller!245 (cherry picked from commit 9ac39915f30c035fa7cba6165cb255eaa47adddd) d1c7d0eb Common Framework: --- src/common/Constants.py | 2 +- src/common/Settings.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/common/Constants.py b/src/common/Constants.py index de9ac45a4..a6a6899b0 100644 --- a/src/common/Constants.py +++ b/src/common/Constants.py @@ -58,7 +58,7 @@ class ServiceNameEnum(Enum): CACHING = 'caching' TE = 'te' FORECASTER = 'forecaster' - E2EORCHESTRATOR = 'e2eorchestrator' + E2EORCHESTRATOR = 'e2e-orchestrator' OPTICALCONTROLLER = 'opticalcontroller' BGPLS = 'bgpls-speaker' diff --git a/src/common/Settings.py b/src/common/Settings.py index edc74c776..eaeb363ad 100644 --- a/src/common/Settings.py +++ b/src/common/Settings.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, os, time +import logging, os, re, time from typing import Dict, List from common.Constants import ( DEFAULT_GRPC_BIND_ADDRESS, DEFAULT_GRPC_GRACE_PERIOD, DEFAULT_GRPC_MAX_WORKERS, DEFAULT_HTTP_BIND_ADDRESS, @@ -68,7 +68,8 @@ def get_setting(name, **kwargs): raise Exception('Setting({:s}) not specified in environment or configuration'.format(str(name))) def get_env_var_name(service_name : ServiceNameEnum, env_var_group): - return ('{:s}SERVICE_{:s}'.format(service_name.value, env_var_group)).upper() + service_name = re.sub(r'[^a-zA-Z0-9]', '_', service_name.value) + return ('{:s}SERVICE_{:s}'.format(service_name, env_var_group)).upper() def get_service_host(service_name : ServiceNameEnum): envvar_name = get_env_var_name(service_name, ENVVAR_SUFIX_SERVICE_HOST) -- GitLab From c1888a4e456a6d7742fb9b1d20917710f44a5400 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 22 Jul 2024 09:23:42 +0000 Subject: [PATCH 361/602] Requirements: - Updated numpy version to <2.0.0 --- src/device/requirements.in | 1 + src/forecaster/requirements.in | 2 +- src/l3_centralizedattackdetector/requirements.in | 2 +- src/l3_distributedattackdetector/requirements.in | 2 +- src/monitoring/requirements.in | 2 +- src/opticalattackdetector/requirements.in | 2 +- src/opticalcontroller/requirements.in | 2 +- src/pathcomp/frontend/requirements.in | 1 + src/slice/requirements.in | 2 +- 9 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/device/requirements.in b/src/device/requirements.in index 6f20b0de1..bf5e6a2b3 100644 --- a/src/device/requirements.in +++ b/src/device/requirements.in @@ -23,6 +23,7 @@ Flask==2.1.3 Flask-HTTPAuth==4.5.0 Flask-RESTful==0.3.9 Jinja2==3.0.3 +numpy<2.0.0 ncclient==0.6.15 p4runtime==1.3.0 pandas==1.5.* diff --git a/src/forecaster/requirements.in b/src/forecaster/requirements.in index 6caa5d616..9a3151379 100644 --- a/src/forecaster/requirements.in +++ b/src/forecaster/requirements.in @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -#numpy==1.23.* +numpy<2.0.0 pandas==1.5.* #prophet==1.1.* scikit-learn==1.1.* diff --git a/src/l3_centralizedattackdetector/requirements.in b/src/l3_centralizedattackdetector/requirements.in index 345131013..14808cba5 100644 --- a/src/l3_centralizedattackdetector/requirements.in +++ b/src/l3_centralizedattackdetector/requirements.in @@ -12,6 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -numpy==1.23.* +numpy<2.0.0 onnxruntime==1.12.* scikit-learn==1.1.* diff --git a/src/l3_distributedattackdetector/requirements.in b/src/l3_distributedattackdetector/requirements.in index 6deb8d906..1d2fbafc2 100644 --- a/src/l3_distributedattackdetector/requirements.in +++ b/src/l3_distributedattackdetector/requirements.in @@ -12,5 +12,5 @@ # See the License for the specific language governing permissions and # limitations under the License. -numpy==1.23.* +numpy<2.0.0 asyncio==3.4.3 diff --git a/src/monitoring/requirements.in b/src/monitoring/requirements.in index 8684cb223..3b67c00ee 100644 --- a/src/monitoring/requirements.in +++ b/src/monitoring/requirements.in @@ -18,7 +18,7 @@ APScheduler==3.10.1 #google-api-core #opencensus[stackdriver] #google-cloud-profiler -#numpy +numpy<2.0.0 #Jinja2==3.0.3 #ncclient==0.6.13 #p4runtime==1.3.0 diff --git a/src/opticalattackdetector/requirements.in b/src/opticalattackdetector/requirements.in index 39982773b..e8476e9fa 100644 --- a/src/opticalattackdetector/requirements.in +++ b/src/opticalattackdetector/requirements.in @@ -12,5 +12,5 @@ # See the License for the specific language governing permissions and # limitations under the License. -numpy +numpy<2.0.0 redis diff --git a/src/opticalcontroller/requirements.in b/src/opticalcontroller/requirements.in index 0b1947bee..4732ee635 100644 --- a/src/opticalcontroller/requirements.in +++ b/src/opticalcontroller/requirements.in @@ -17,5 +17,5 @@ flask-restplus==0.13.0 itsdangerous==1.1.0 Jinja2==2.11.3 MarkupSafe==1.1.1 -numpy==1.23.0 +numpy<2.0.0 Werkzeug==0.16.1 diff --git a/src/pathcomp/frontend/requirements.in b/src/pathcomp/frontend/requirements.in index 0466b25dc..602ecff54 100644 --- a/src/pathcomp/frontend/requirements.in +++ b/src/pathcomp/frontend/requirements.in @@ -13,6 +13,7 @@ # limitations under the License. +numpy<2.0.0 pandas==1.5.* requests==2.27.1 scikit-learn==1.1.* diff --git a/src/slice/requirements.in b/src/slice/requirements.in index f2e7219e3..158355b69 100644 --- a/src/slice/requirements.in +++ b/src/slice/requirements.in @@ -13,7 +13,7 @@ # limitations under the License. #deepdiff==5.8.* -numpy==1.23.* +numpy<2.0.0 pandas==1.5.* questdb==1.0.1 requests==2.27.* -- GitLab From b40d9732f6dc30164af2dec09b353bf39e97c83a Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 22 Jul 2024 15:04:36 +0000 Subject: [PATCH 362/602] some changes for integration --- my_deploy.sh | 2 +- scripts/run_tests_locally-kpi-value-API.sh | 4 +- src/common/Constants.py | 6 +- src/kpi_manager/client/KpiManagerClient.py | 2 + .../service/KpiValueApiServiceServicerImpl.py | 68 +++++++++++++++++-- 5 files changed, 70 insertions(+), 12 deletions(-) diff --git a/my_deploy.sh b/my_deploy.sh index d7da19b86..83cc898c3 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -57,7 +57,7 @@ export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring kpi_manager" #export TFS_COMPONENTS="${TFS_COMPONENTS} forecaster" # Uncomment to activate E2E Orchestrator -export TFS_COMPONENTS="${TFS_COMPONENTS} e2e_orchestrator" +# export TFS_COMPONENTS="${TFS_COMPONENTS} e2e_orchestrator" # Set the tag you want to use for your images. export TFS_IMAGE_TAG="dev" diff --git a/scripts/run_tests_locally-kpi-value-API.sh b/scripts/run_tests_locally-kpi-value-API.sh index 65a269ec6..770c97ce0 100755 --- a/scripts/run_tests_locally-kpi-value-API.sh +++ b/scripts/run_tests_locally-kpi-value-API.sh @@ -19,5 +19,7 @@ PROJECTDIR=`pwd` cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc -python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ + +# helpful pytest flags: --log-level=INFO -o log_cli=true --verbose --maxfail=1 --durations=0 +python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG -o log_cli=true --verbose \ kpi_value_api/tests/test_kpi_value_api.py \ No newline at end of file diff --git a/src/common/Constants.py b/src/common/Constants.py index ad4cfa958..7a0112308 100644 --- a/src/common/Constants.py +++ b/src/common/Constants.py @@ -43,9 +43,9 @@ class ServiceNameEnum(Enum): ZTP = 'ztp' POLICY = 'policy' MONITORING = 'monitoring' - KPIMANAGER = 'kpi_manager' - KPIVALUEAPI = 'kpi_value_api' - TELEMETRYFRONTEND = 'telemetry_frontend' + KPIMANAGER = 'kpi-manager' + KPIVALUEAPI = 'kpi-value-api' + TELEMETRYFRONTEND = 'telemetry-frontend' DLT = 'dlt' NBI = 'nbi' CYBERSECURITY = 'cybersecurity' diff --git a/src/kpi_manager/client/KpiManagerClient.py b/src/kpi_manager/client/KpiManagerClient.py index cfc3a0b1c..a5dfb37a3 100755 --- a/src/kpi_manager/client/KpiManagerClient.py +++ b/src/kpi_manager/client/KpiManagerClient.py @@ -63,8 +63,10 @@ class KpiManagerClient: @RETRY_DECORATOR def GetKpiDescriptor(self, request : KpiId) -> KpiDescriptor: + print('---> GetKpiDescriptor: {:s}'.format(grpc_message_to_json_string(request))) LOGGER.debug('GetKpiDescriptor: {:s}'.format(grpc_message_to_json_string(request))) response = self.stub.GetKpiDescriptor(request) + print('---> GetKpiDescriptor result: {:s}'.format(grpc_message_to_json_string(response))) LOGGER.debug('GetKpiDescriptor result: {:s}'.format(grpc_message_to_json_string(response))) return response diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index ce1dd1282..1d3b9bdfd 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -12,22 +12,24 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, grpc, json +import logging, grpc, json, requests from typing import Tuple, Any, List, Dict +from datetime import datetime from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from common.proto.context_pb2 import Empty from common.proto.kpi_value_api_pb2_grpc import KpiValueAPIServiceServicer -from common.proto.kpi_value_api_pb2 import KpiValueList, KpiValueFilter +from common.proto.kpi_value_api_pb2 import KpiValueList, KpiValueFilter, KpiValue, KpiValueType from confluent_kafka import Producer as KafkaProducer from .NameMapping import NameMapping -LOGGER = logging.getLogger(__name__) +LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('KpiValueAPI', 'NBIgRPC') +PROM_URL = "http://localhost:9090" class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): def __init__(self, name_mapping : NameMapping): @@ -49,7 +51,7 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): kpi_value.kpi_value_type # kpi_value.kpi_value_type.(many options) how? ) LOGGER.debug('KPI to produce is {:}'.format(kpi_value_to_produce)) - msg_key = "gRPC-KpiValueApi" # str(__class__.__name__) + msg_key = "gRPC-kpivalueapi" # str(__class__.__name__) can be used # write this KPI to Kafka producer_obj.produce( @@ -60,14 +62,66 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): callback = self.delivery_callback ) producer_obj.flush() - return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SelectKpiValues(self, request: KpiValueFilter, grpc_context: grpc.ServicerContext ) -> KpiValueList: - LOGGER.debug('SelectKpiValues: Received gRPC message object: {:}'.format(request)) + LOGGER.debug('StoreKpiValues: Received gRPC message object: {:}'.format(request)) + response = KpiValueList() + metrics = [kpi.kpi_id for kpi in request.kpi_id] + start_timestamps = [timestamp for timestamp in request.start_timestamp] + end_timestamps = [timestamp for timestamp in request.end_timestamp] + results = [] + + for start, end in zip(start_timestamps, end_timestamps): + start_str = datetime.fromtimestamp(start.seconds).isoformat() + "Z" + end_str = datetime.fromtimestamp(end.seconds).isoformat() + "Z" + + for metric in metrics: + url = f'{PROM_URL}/api/v1/query_range' + params = { + 'query': metric, + 'start': start_str, + 'end' : end_str, + 'step' : '30s' # or any other step you need + } + response = requests.get(url, params=params) + if response.status_code == 200: + data = response.json() + for result in data['data']['result']: + for value in result['values']: + kpi_value = KpiValue( + kpi_id=metric, + timestamp=str(seconds=value[0]), + kpi_value_type=self._convert_value_to_kpi_value_type(value[1]) + ) + results.append(kpi_value) + + def _convert_value_to_kpi_value_type(self, value): + # Check if the value is an integer (int64) + try: + int64_value = int(value) + return KpiValueType(int64Val=int64_value) + except ValueError: + pass + + # Check if the value is a float + try: + float_value = float(value) + return KpiValueType(floatVal=float_value) + except ValueError: + pass + + # Check if the value is a boolean + if value.lower() in ['true', 'false']: + bool_value = value.lower() == 'true' + return KpiValueType(boolVal=bool_value) + + # If none of the above, treat it as a string + return KpiValueType(stringVal=value) + def delivery_callback(self, err, msg): if err: LOGGER.debug('Message delivery failed: {:}'.format(err)) - else: print('Message delivered to topic {:}'.format(msg.topic())) + else: LOGGER.debug('Message delivered to topic {:}'.format(msg.topic())) -- GitLab From 9fcbc75e34db3785bf25c9ad6ec8fcc1482727c4 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 22 Jul 2024 16:33:44 +0000 Subject: [PATCH 363/602] logs added on kpiClient --- scripts/show_logs_kpi_manager.sh | 27 ++++++++++++++++++++++ src/kpi_manager/client/KpiManagerClient.py | 2 ++ 2 files changed, 29 insertions(+) create mode 100755 scripts/show_logs_kpi_manager.sh diff --git a/scripts/show_logs_kpi_manager.sh b/scripts/show_logs_kpi_manager.sh new file mode 100755 index 000000000..86f084f69 --- /dev/null +++ b/scripts/show_logs_kpi_manager.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +######################################################################################################################## +# Define your deployment settings here +######################################################################################################################## + +# If not already set, set the name of the Kubernetes namespace to deploy to. +export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"} + +######################################################################################################################## +# Automated steps start here +######################################################################################################################## + +kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/kpi-managerservice -c server diff --git a/src/kpi_manager/client/KpiManagerClient.py b/src/kpi_manager/client/KpiManagerClient.py index a5dfb37a3..0b7979dbb 100755 --- a/src/kpi_manager/client/KpiManagerClient.py +++ b/src/kpi_manager/client/KpiManagerClient.py @@ -33,6 +33,8 @@ class KpiManagerClient: if not port: port = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) self.endpoint = '{:s}:{:s}'.format(str(host), str(port)) LOGGER.debug('Creating channel to {:s}...'.format(str(self.endpoint))) + print('Creating channel to {:s}...'.format(str(self.endpoint))) + self.channel = None self.stub = None self.connect() -- GitLab From 1879fb18b18ecc0788e747c9749cfff4fd23df67 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 23 Jul 2024 08:55:49 +0000 Subject: [PATCH 364/602] changes for kpi_manager integration with TFS --- src/kpi_manager/tests/test_kpi_manager.py | 102 +++++++++--------- .../service/KpiValueWriter.py | 17 +-- 2 files changed, 58 insertions(+), 61 deletions(-) diff --git a/src/kpi_manager/tests/test_kpi_manager.py b/src/kpi_manager/tests/test_kpi_manager.py index 968eafbfe..f29265cdd 100755 --- a/src/kpi_manager/tests/test_kpi_manager.py +++ b/src/kpi_manager/tests/test_kpi_manager.py @@ -28,10 +28,10 @@ from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilt from common.tools.service.GenericGrpcService import GenericGrpcService from context.client.ContextClient import ContextClient -from device.service.driver_api.DriverFactory import DriverFactory -from device.service.driver_api.DriverInstanceCache import DriverInstanceCache -from device.service.DeviceService import DeviceService -from device.client.DeviceClient import DeviceClient +# from device.service.driver_api.DriverFactory import DriverFactory +# 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_filter_request, create_kpi_descriptor_request_a from kpi_manager.service.KpiManagerService import KpiManagerService @@ -47,13 +47,12 @@ from device.service.drivers import DRIVERS ########################### LOCAL_HOST = '127.0.0.1' -MOCKSERVICE_PORT = 10000 -KPIMANAGER_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # type: ignore +KPIMANAGER_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # type: ignore os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(KPIMANAGER_SERVICE_PORT) -# METRICSDB_HOSTNAME = os.environ.get('METRICSDB_HOSTNAME') +# METRICSDB_HOSTNAME = os.environ.get('METRICSDB_HOSTNAME'){} LOGGER = logging.getLogger(__name__) @@ -68,50 +67,50 @@ class MockContextService(GenericGrpcService): self.context_servicer = MockServicerImpl_Context() add_ContextServiceServicer_to_server(self.context_servicer, self.server) -@pytest.fixture(scope='session') -def context_service(): - LOGGER.info('Initializing MockContextService...') - _service = MockContextService(MOCKSERVICE_PORT) - _service.start() +# @pytest.fixture(scope='session') +# def context_service(): +# LOGGER.info('Initializing MockContextService...') +# _service = MockContextService(MOCKSERVICE_PORT) +# _service.start() - LOGGER.info('Yielding MockContextService...') - yield _service +# LOGGER.info('Yielding MockContextService...') +# yield _service - LOGGER.info('Terminating MockContextService...') - _service.context_servicer.msg_broker.terminate() - _service.stop() +# LOGGER.info('Terminating MockContextService...') +# _service.context_servicer.msg_broker.terminate() +# _service.stop() - LOGGER.info('Terminated MockContextService...') +# LOGGER.info('Terminated MockContextService...') -@pytest.fixture(scope='session') -def context_client(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument - LOGGER.info('Initializing ContextClient...') - _client = ContextClient() +# @pytest.fixture(scope='session') +# def context_client(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument +# LOGGER.info('Initializing ContextClient...') +# _client = ContextClient() - LOGGER.info('Yielding ContextClient...') - yield _client +# LOGGER.info('Yielding ContextClient...') +# yield _client - LOGGER.info('Closing ContextClient...') - _client.close() +# LOGGER.info('Closing ContextClient...') +# _client.close() - LOGGER.info('Closed ContextClient...') +# LOGGER.info('Closed ContextClient...') -@pytest.fixture(scope='session') -def device_service(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument - LOGGER.info('Initializing DeviceService...') - driver_factory = DriverFactory(DRIVERS) - driver_instance_cache = DriverInstanceCache(driver_factory) - _service = DeviceService(driver_instance_cache) - _service.start() +# @pytest.fixture(scope='session') +# def device_service(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument +# LOGGER.info('Initializing DeviceService...') +# driver_factory = DriverFactory(DRIVERS) +# driver_instance_cache = DriverInstanceCache(driver_factory) +# _service = DeviceService(driver_instance_cache) +# _service.start() - # yield the server, when test finishes, execution will resume to stop it - LOGGER.info('Yielding DeviceService...') - yield _service +# # yield the server, when test finishes, execution will resume to stop it +# LOGGER.info('Yielding DeviceService...') +# yield _service - LOGGER.info('Terminating DeviceService...') - _service.stop() +# LOGGER.info('Terminating DeviceService...') +# _service.stop() - LOGGER.info('Terminated DeviceService...') +# LOGGER.info('Terminated DeviceService...') # @pytest.fixture(scope='session') # def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument @@ -126,25 +125,22 @@ def device_service(context_service : MockContextService): # pylint: disable=rede # LOGGER.info('Closed DeviceClient...') -@pytest.fixture(scope='session') -def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument - LOGGER.info('Initializing DeviceClient...') - _client = DeviceClient() +# @pytest.fixture(scope='session') +# def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument +# LOGGER.info('Initializing DeviceClient...') +# _client = DeviceClient() - LOGGER.info('Yielding DeviceClient...') - yield _client +# LOGGER.info('Yielding DeviceClient...') +# yield _client - LOGGER.info('Closing DeviceClient...') - _client.close() +# LOGGER.info('Closing DeviceClient...') +# _client.close() - LOGGER.info('Closed DeviceClient...') +# LOGGER.info('Closed DeviceClient...') # This fixture will be requested by test cases and last during testing session @pytest.fixture(scope='session') -def kpi_manager_service( - context_service : MockContextService, # pylint: disable=redefined-outer-name,unused-argument - device_service : DeviceService # pylint: disable=redefined-outer-name,unused-argument - ): +def kpi_manager_service(): LOGGER.info('Initializing KpiManagerService...') name_mapping = NameMapping() # _service = MonitoringService(name_mapping) diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index 73dcac935..82342bbbd 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -52,8 +52,11 @@ class KpiValueWriter: 'group.id' : __class__, 'auto.offset.reset' : 'latest'} ) - metric_writer_to_prom = MetricWriterToPrometheus() + metric_writer_to_prom = MetricWriterToPrometheus() + kpi_manager_client = KpiManagerClient() + print("Kpi manger client created: {:}".format(kpi_manager_client)) + kafka_consumer.subscribe([KafkaTopic.VALUE.value]) LOGGER.debug("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) print("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) @@ -70,9 +73,9 @@ class KpiValueWriter: try: kpi_value = KpiValue() kpi_value.ParseFromString(raw_kpi.value()) - LOGGER.debug("Received KPI : {:}".format(kpi_value)) + LOGGER.info("Received KPI : {:}".format(kpi_value)) print("Received KPI : {:}".format(kpi_value)) - KpiValueWriter.get_kpi_descriptor(kpi_value.kpi_id.kpi_id.uuid) + KpiValueWriter.get_kpi_descriptor(kpi_value.kpi_id.kpi_id.uuid, kpi_manager_client) # -------- Testing section --------------- # test_kpi_descriptor_obj = create_kpi_descriptor_request() # metric_writer_to_prom.create_and_expose_cooked_kpi( @@ -85,14 +88,12 @@ class KpiValueWriter: continue @staticmethod - def get_kpi_descriptor(kpi_value_uuid: str): + def get_kpi_descriptor(kpi_value_uuid: str, kpi_manager_client ): print("--- START -----") kpi_id = KpiId() kpi_id.kpi_id.uuid = kpi_value_uuid print("KpiId generated: {:}".format(kpi_id)) - - kpi_manager_client = KpiManagerClient() print("Kpi manger client created: {:}".format(kpi_manager_client)) try: @@ -101,8 +102,8 @@ class KpiValueWriter: print("kpi descriptor received: {:}".format(kpi_descriptor_object)) if isinstance (kpi_descriptor_object, KpiDescriptor): - LOGGER.debug("Extracted row: {:}".format(kpi_descriptor_object)) + LOGGER.info("Extracted row: {:}".format(kpi_descriptor_object)) else: - LOGGER.debug("Error in extracting row {:}".format(kpi_descriptor_object)) + LOGGER.info("Error in extracting row {:}".format(kpi_descriptor_object)) except Exception as e: print ("Unable to get Descriptor. Error: {:}".format(e)) -- GitLab From 258f2dbde0e8b55ecadaf15ee21599472005b159 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 23 Jul 2024 12:57:15 +0000 Subject: [PATCH 365/602] basic changes in the KPI Manager and Value API --- src/kpi_manager/database/KpiEngine.py | 10 +++++----- .../service/KpiManagerServiceServicerImpl.py | 1 + src/kpi_value_writer/service/KpiValueWriter.py | 5 ++++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/kpi_manager/database/KpiEngine.py b/src/kpi_manager/database/KpiEngine.py index 620ac9796..1d4015ff2 100644 --- a/src/kpi_manager/database/KpiEngine.py +++ b/src/kpi_manager/database/KpiEngine.py @@ -19,14 +19,14 @@ LOGGER = logging.getLogger(__name__) APP_NAME = 'tfs' ECHO = False # False: No dump SQL commands and transactions executed -CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' +# CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' CRDB_NAMESPACE = "crdb" CRDB_SQL_PORT = "26257" CRDB_DATABASE = "kpi" CRDB_USERNAME = "tfs" CRDB_PASSWORD = "tfs123" CRDB_SSLMODE = "require" -# CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' +CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' class KpiEngine: # def __init__(self): @@ -34,10 +34,10 @@ class KpiEngine: @staticmethod def get_engine() -> sqlalchemy.engine.Engine: - crdb_uri = CRDB_URI_TEMPLATE.format( - CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) # crdb_uri = CRDB_URI_TEMPLATE.format( - # CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) + # CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) + crdb_uri = CRDB_URI_TEMPLATE.format( + CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) try: # engine = sqlalchemy.create_engine( # crdb_uri, connect_args={'application_name': APP_NAME}, echo=ECHO, future=True) diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py index 8996a8efb..7e30c688c 100644 --- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -59,6 +59,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): response = KpiModel.convert_row_to_KpiDescriptor(row) return response except Exception as e: + print ('Unable to search kpi id. {:}'.format(e)) LOGGER.debug('Unable to search kpi id. {:}'.format(e)) @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index 82342bbbd..70e018d08 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -94,7 +94,7 @@ class KpiValueWriter: kpi_id = KpiId() kpi_id.kpi_id.uuid = kpi_value_uuid print("KpiId generated: {:}".format(kpi_id)) - print("Kpi manger client created: {:}".format(kpi_manager_client)) + # print("Kpi manger client created: {:}".format(kpi_manager_client)) try: kpi_descriptor_object = KpiDescriptor() @@ -103,7 +103,10 @@ class KpiValueWriter: print("kpi descriptor received: {:}".format(kpi_descriptor_object)) if isinstance (kpi_descriptor_object, KpiDescriptor): LOGGER.info("Extracted row: {:}".format(kpi_descriptor_object)) + print("Extracted row: {:}".format(kpi_descriptor_object)) else: LOGGER.info("Error in extracting row {:}".format(kpi_descriptor_object)) + print("Error in extracting row {:}".format(kpi_descriptor_object)) except Exception as e: + LOGGER.info("Unable to get Descriptor. Error: {:}".format(e)) print ("Unable to get Descriptor. Error: {:}".format(e)) -- GitLab From 4c2f3c9df5df67bbd00b28874f37e7dc845aaa29 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 23 Jul 2024 14:22:31 +0000 Subject: [PATCH 366/602] some changes for testing --- .../service/KpiManagerServiceServicerImpl.py | 20 +++++++++++-- src/kpi_manager/tests/test_kpi_manager.py | 8 +++++ .../tests/test_kpi_value_writer.py | 30 +++++++++++++++---- src/kpi_value_writer/tests/test_messages.py | 11 +++++-- 4 files changed, 58 insertions(+), 11 deletions(-) diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py index 7e30c688c..287478f13 100644 --- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -27,6 +27,9 @@ from kpi_manager.database.KpiModel import Kpi as KpiModel LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('KpiManager', 'NBIgRPC') +class IDNotFoundError(Exception): + ... + class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): def __init__(self, name_mapping : NameMapping): LOGGER.debug('Init KpiManagerService') @@ -57,11 +60,24 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): row = self.kpi_db_obj.search_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) if row is not None: response = KpiModel.convert_row_to_KpiDescriptor(row) - return response + return response + if row is None: + print ('No matching row found for kpi id: {:}'.format(kpi_id_to_search)) + LOGGER.debug('No matching row found kpi id: {:}'.format(kpi_id_to_search)) + return Empty() except Exception as e: print ('Unable to search kpi id. {:}'.format(e)) LOGGER.debug('Unable to search kpi id. {:}'.format(e)) - + raise e + # kpi_id_to_search = request.kpi_id.uuid + # row = self.kpi_db_obj.search_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) + # if row is None: + # print ('Unable to search kpi id. {:}'.format(kpi_id_to_search)) + # LOGGER.debug('Unable to search kpi id. {:}'.format(kpi_id_to_search)) + # raise IDNotFoundError + # response = KpiModel.convert_row_to_KpiDescriptor(row) + # return response + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext # type: ignore ) -> Empty: # type: ignore diff --git a/src/kpi_manager/tests/test_kpi_manager.py b/src/kpi_manager/tests/test_kpi_manager.py index f29265cdd..e5bf17a5f 100755 --- a/src/kpi_manager/tests/test_kpi_manager.py +++ b/src/kpi_manager/tests/test_kpi_manager.py @@ -36,6 +36,9 @@ from context.client.ContextClient import ContextClient from kpi_manager.tests.test_messages import create_kpi_descriptor_request, create_kpi_filter_request, create_kpi_descriptor_request_a from kpi_manager.service.KpiManagerService import KpiManagerService from kpi_manager.client.KpiManagerClient import KpiManagerClient +from kpi_manager.tests.test_messages import create_kpi_descriptor_request +from kpi_value_writer.tests.test_messages import create_kpi_id_request + from monitoring.service.NameMapping import NameMapping @@ -214,6 +217,11 @@ def test_GetKpiDescriptor(kpi_manager_client): # get KPI response = kpi_manager_client.GetKpiDescriptor(response_id) LOGGER.info("Response gRPC message object: {:}".format(response)) + + LOGGER.info(" >>> calling GetKpiDescriptor with random ID") + rand_response = kpi_manager_client.GetKpiDescriptor(create_kpi_id_request()) + LOGGER.info("Response gRPC message object: {:}".format(rand_response)) + assert isinstance(response, KpiDescriptor) # def test_SelectKpiDescriptor(kpi_manager_client): diff --git a/src/kpi_value_writer/tests/test_kpi_value_writer.py b/src/kpi_value_writer/tests/test_kpi_value_writer.py index 19a7d3915..4ac7b21c8 100755 --- a/src/kpi_value_writer/tests/test_kpi_value_writer.py +++ b/src/kpi_value_writer/tests/test_kpi_value_writer.py @@ -15,10 +15,30 @@ import logging from kpi_value_writer.service.KpiValueWriter import KpiValueWriter from common.tools.kafka.Variables import KafkaTopic - +from kpi_manager.client.KpiManagerClient import KpiManagerClient +from kpi_manager.tests.test_messages import create_kpi_descriptor_request +from common.proto.kpi_manager_pb2 import KpiDescriptor +from kpi_value_writer.tests.test_messages import create_kpi_id_request LOGGER = logging.getLogger(__name__) +def test_GetKpiDescriptor(): + LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") + kpi_manager_client = KpiManagerClient() + # adding KPI + LOGGER.info(" >>> calling SetKpiDescriptor ") + response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + # get KPI + LOGGER.info(" >>> calling GetKpiDescriptor with response ID") + response = kpi_manager_client.GetKpiDescriptor(response_id) + LOGGER.info("Response gRPC message object: {:}".format(response)) + + LOGGER.info(" >>> calling GetKpiDescriptor with random ID") + rand_response = kpi_manager_client.GetKpiDescriptor(create_kpi_id_request()) + LOGGER.info("Response gRPC message object: {:}".format(rand_response)) + + LOGGER.info("\n------------------ TEST FINISHED ---------------------\n") + assert isinstance(response, KpiDescriptor) # -------- Initial Test ---------------- # def test_validate_kafka_topics(): @@ -26,9 +46,7 @@ LOGGER = logging.getLogger(__name__) # response = KafkaTopic.create_all_topics() # assert isinstance(response, bool) -def test_KafkaConsumer(): - LOGGER.debug(" --->>> test_kafka_consumer: START <<<--- ") - KpiValueWriter.RunKafkaConsumer() +# def test_KafkaConsumer(): +# LOGGER.debug(" --->>> test_kafka_consumer: START <<<--- ") +# KpiValueWriter.RunKafkaConsumer() -# def test_metric_composer_and_writer(): -# LOGGER.debug(" --->>> test_metric_composer_and_writer: START <<<--- ") diff --git a/src/kpi_value_writer/tests/test_messages.py b/src/kpi_value_writer/tests/test_messages.py index d9f4cf80a..d4b263c80 100755 --- a/src/kpi_value_writer/tests/test_messages.py +++ b/src/kpi_value_writer/tests/test_messages.py @@ -18,6 +18,11 @@ from common.proto import kpi_manager_pb2 from common.proto.kpi_value_api_pb2 import KpiValue from common.proto.kpi_sample_types_pb2 import KpiSampleType +def create_kpi_id_request(): + _create_kpi_id = kpi_manager_pb2.KpiId() + _create_kpi_id.kpi_id.uuid = str(uuid.uuid4()) + return _create_kpi_id + def create_kpi_descriptor_request(description: str = "Test Description"): _create_kpi_request = kpi_manager_pb2.KpiDescriptor() @@ -33,8 +38,8 @@ def create_kpi_descriptor_request(description: str = "Test Description"): return _create_kpi_request def create_kpi_value_request(): - _create_kpi_value_request = KpiValue() - _create_kpi_value_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) - _create_kpi_value_request.timestamp.timestamp = time.time() + _create_kpi_value_request = KpiValue() + _create_kpi_value_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) + _create_kpi_value_request.timestamp.timestamp = time.time() _create_kpi_value_request.kpi_value_type.floatVal = random.randint(10, 10000) return _create_kpi_value_request \ No newline at end of file -- GitLab From bd9f119fed160c7ed563c2f7fd49cbd19970a1a9 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 24 Jul 2024 09:20:28 +0000 Subject: [PATCH 367/602] Pre-merge cleanup --- deploy/all.sh | 4 ++-- deploy/tfs.sh | 2 +- my_deploy.sh | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/deploy/all.sh b/deploy/all.sh index 99058b96e..4b644cf11 100755 --- a/deploy/all.sh +++ b/deploy/all.sh @@ -27,10 +27,10 @@ export TFS_REGISTRY_IMAGES=${TFS_REGISTRY_IMAGES:-"http://localhost:32000/tfs/"} # If not already set, set the list of components, separated by spaces, you want to build images for, and deploy. # By default, only basic components are deployed -export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device pathcomp service slice nbi webui load_generator kpi_manager"} +export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device pathcomp service slice nbi webui load_generator"} # Uncomment to activate Monitoring -#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" +#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring kpi_manager" # Uncomment to activate BGP-LS Speaker #export TFS_COMPONENTS="${TFS_COMPONENTS} bgpls_speaker" diff --git a/deploy/tfs.sh b/deploy/tfs.sh index f85e9bbc9..8565077c3 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -27,7 +27,7 @@ export TFS_REGISTRY_IMAGES=${TFS_REGISTRY_IMAGES:-"http://localhost:32000/tfs/"} # If not already set, set the list of components, separated by spaces, you want to build images for, and deploy. # By default, only basic components are deployed -export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device ztp monitoring pathcomp service slice nbi webui load_generator kpi_manager"} +export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device pathcomp service slice nbi webui load_generator"} # If not already set, set the tag you want to use for your images. export TFS_IMAGE_TAG=${TFS_IMAGE_TAG:-"dev"} diff --git a/my_deploy.sh b/my_deploy.sh index 83cc898c3..a9468a245 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -23,7 +23,7 @@ export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/" export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_generator" # Uncomment to activate Monitoring -export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring kpi_manager" +#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring kpi_manager" # Uncomment to activate BGP-LS Speaker #export TFS_COMPONENTS="${TFS_COMPONENTS} bgpls_speaker" @@ -57,7 +57,7 @@ export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring kpi_manager" #export TFS_COMPONENTS="${TFS_COMPONENTS} forecaster" # Uncomment to activate E2E Orchestrator -# export TFS_COMPONENTS="${TFS_COMPONENTS} e2e_orchestrator" +#export TFS_COMPONENTS="${TFS_COMPONENTS} e2e_orchestrator" # Set the tag you want to use for your images. export TFS_IMAGE_TAG="dev" @@ -69,7 +69,7 @@ export TFS_K8S_NAMESPACE="tfs" export TFS_EXTRA_MANIFESTS="manifests/nginx_ingress_http.yaml" # Uncomment to monitor performance of components -export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml" +#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml" # Uncomment when deploying Optical CyberSecurity #export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml" @@ -106,7 +106,7 @@ export CRDB_DATABASE="tfs" export CRDB_DEPLOY_MODE="single" # Disable flag for dropping database, if it exists. -export CRDB_DROP_DATABASE_IF_EXISTS="NO" +export CRDB_DROP_DATABASE_IF_EXISTS="" # Disable flag for re-deploying CockroachDB from scratch. export CRDB_REDEPLOY="" @@ -158,7 +158,7 @@ export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis" export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups" # Disable flag for dropping tables if they exist. -export QDB_DROP_TABLES_IF_EXIST="YES" +export QDB_DROP_TABLES_IF_EXIST="" # Disable flag for re-deploying QuestDB from scratch. export QDB_REDEPLOY="" -- GitLab From 3355487d012a9a5ee1b5b31e89d903818471bcf7 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 24 Jul 2024 09:25:01 +0000 Subject: [PATCH 368/602] Pre-merge cleanup --- deploy/exporters.sh | 23 ----------------------- manifests/kafka/01-zookeeper.yaml | 15 +++++++++++++++ manifests/kafka/02-kafka.yaml | 15 +++++++++++++++ manifests/node_exporter_deployment.yaml | 21 --------------------- manifests/node_exporter_service.yaml | 12 ------------ 5 files changed, 30 insertions(+), 56 deletions(-) delete mode 100644 deploy/exporters.sh delete mode 100644 manifests/node_exporter_deployment.yaml delete mode 100644 manifests/node_exporter_service.yaml diff --git a/deploy/exporters.sh b/deploy/exporters.sh deleted file mode 100644 index 6c56f25c9..000000000 --- a/deploy/exporters.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# 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. - -######################################################################################################################## -# Read deployment settings -######################################################################################################################## - -# If not already set, set the namespace where Apache Kafka will be deployed. -export KFK_NAMESPACE=${KFK_NAMESPACE:-"exporters"} - -# Add instruction of exporter automatic deployment here \ No newline at end of file diff --git a/manifests/kafka/01-zookeeper.yaml b/manifests/kafka/01-zookeeper.yaml index 0f5ade5d9..c0e87ae0c 100644 --- a/manifests/kafka/01-zookeeper.yaml +++ b/manifests/kafka/01-zookeeper.yaml @@ -1,3 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + apiVersion: v1 kind: Service metadata: diff --git a/manifests/kafka/02-kafka.yaml b/manifests/kafka/02-kafka.yaml index 8a2b51724..8e4562e6e 100644 --- a/manifests/kafka/02-kafka.yaml +++ b/manifests/kafka/02-kafka.yaml @@ -1,3 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + apiVersion: v1 kind: Service metadata: diff --git a/manifests/node_exporter_deployment.yaml b/manifests/node_exporter_deployment.yaml deleted file mode 100644 index bf595d63a..000000000 --- a/manifests/node_exporter_deployment.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: node-exporter - labels: - app: node-exporter -spec: - replicas: 1 - selector: - matchLabels: - app: node-exporter - template: - metadata: - labels: - app: node-exporter - spec: - containers: - - name: node-exporter - image: prom/node-exporter:latest - ports: - - containerPort: 9100 diff --git a/manifests/node_exporter_service.yaml b/manifests/node_exporter_service.yaml deleted file mode 100644 index b7bb4f879..000000000 --- a/manifests/node_exporter_service.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: node-exporter -spec: - selector: - app: node-exporter - ports: - - protocol: TCP - port: 9100 - targetPort: 9100 - type: NodePort -- GitLab From 9ac7f427c2638eda32b06d786b545382fc34fdd1 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 24 Jul 2024 09:42:02 +0000 Subject: [PATCH 369/602] Pre-merge cleanup --- proto/analytics_frontend.proto | 60 +++++++++++++++++++---------- proto/device.proto | 11 +++--- proto/monitoring.proto | 45 ++++++++++++++-------- proto/optical_attack_detector.proto | 6 +-- proto/policy_condition.proto | 9 ++--- 5 files changed, 80 insertions(+), 51 deletions(-) diff --git a/proto/analytics_frontend.proto b/proto/analytics_frontend.proto index c37acceaa..096c1ee03 100644 --- a/proto/analytics_frontend.proto +++ b/proto/analytics_frontend.proto @@ -1,9 +1,23 @@ +// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + syntax = "proto3"; -package device; +package analytics_frontend; import "context.proto"; import "kpi_manager.proto"; -import "kpi_sample_types.proto"; +//import "kpi_sample_types.proto"; service AnalyticsFrontendService { rpc StartAnalyzer (Analyzer ) returns (AnalyzerId ) {} @@ -15,33 +29,39 @@ message AnalyzerId { context.Uuid analyzer_id = 1; } -enum AnalyzerMode { - ANALYZERMODE_BATCH = 0; - ANALYZERMODE_STRAMING = 1; +enum AnalyzerOperationMode { + ANALYZEROPERATIONMODE_BATCH = 0; + ANALYZEROPERATIONMODE_STREAMING = 1; } 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 - 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 + string algorithm_name = 1; // The algorithm to be executed + repeated kpi_manager.KpiId input_kpi_ids = 2; // The KPI Ids to be processed by the analyzer + repeated kpi_manager.KpiId output_kpi_ids = 3; // The KPI Ids produced by the analyzer + AnalyzerOperationMode operation_mode = 4; // Operation mode of the analyzer + + // In batch mode... + float batch_min_duration_s = 5; // ..., min duration to collect before executing batch + float batch_max_duration_s = 6; // ..., max duration collected to execute the batch + uint64 batch_min_size = 7; // ..., min number of samples to collect before executing batch + uint64 batch_max_size = 8; // ..., max number of samples collected to execute the batch } message AnalyzerFilter { // Analyzer 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 Analyzers - repeated AnalyzerId analyzer_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 AnalyzerId analyzer_id = 1; + repeated string algorithm_names = 2; + repeated kpi_manager.KpiId input_kpi_ids = 3; + repeated kpi_manager.KpiId output_kpi_ids = 4; + //repeated kpi_sample_types.KpiSampleType kpi_sample_type = 5; // Not implemented + //repeated context.DeviceId device_id = 6; // Not implemented + //repeated context.EndPointId endpoint_id = 7; // Not implemented + //repeated context.ServiceId service_id = 8; // Not implemented + //repeated context.SliceId slice_id = 9; // Not implemented + //repeated context.ConnectionId connection_id = 10; // Not implemented + //repeated context.LinkId link_id = 11; // Not implemented } message AnalyzerList { diff --git a/proto/device.proto b/proto/device.proto index 57780adae..a1882f33f 100644 --- a/proto/device.proto +++ b/proto/device.proto @@ -16,8 +16,7 @@ syntax = "proto3"; package device; import "context.proto"; -//import "monitoring.proto"; -import "kpi_manager.proto"; +import "monitoring.proto"; // to be migrated to: "kpi_manager.proto" service DeviceService { rpc AddDevice (context.Device ) returns (context.DeviceId ) {} @@ -28,8 +27,8 @@ service DeviceService { } message MonitoringSettings { - kpi_manager.KpiId kpi_id = 1; - kpi_manager.KpiDescriptor kpi_descriptor = 2; - float sampling_duration_s = 3; - float sampling_interval_s = 4; + monitoring.KpiId kpi_id = 1; // to be migrated to: "kpi_manager.KpiId" + monitoring.KpiDescriptor kpi_descriptor = 2; // to be migrated to: "kpi_manager.KpiDescriptor" + float sampling_duration_s = 3; + float sampling_interval_s = 4; } diff --git a/proto/monitoring.proto b/proto/monitoring.proto index f240fc3ce..96423bb49 100755 --- a/proto/monitoring.proto +++ b/proto/monitoring.proto @@ -16,14 +16,14 @@ syntax = "proto3"; package monitoring; import "context.proto"; -import "kpi_manager.proto"; -//import "kpi_sample_types.proto"; +import "monitoring.proto"; +import "kpi_sample_types.proto"; service MonitoringService { -// rpc SetKpi (KpiDescriptor ) returns (KpiId ) {} // Stable not final -// rpc DeleteKpi (KpiId ) returns (context.Empty ) {} // Stable and final -// rpc GetKpiDescriptor (KpiId ) returns (KpiDescriptor ) {} // Stable and final -// rpc GetKpiDescriptorList (context.Empty ) returns (KpiDescriptorList ) {} // Stable and final + rpc SetKpi (KpiDescriptor ) returns (KpiId ) {} // Stable not final + rpc DeleteKpi (KpiId ) returns (context.Empty ) {} // Stable and final + rpc GetKpiDescriptor (KpiId ) returns (KpiDescriptor ) {} // Stable and final + rpc GetKpiDescriptorList (context.Empty ) returns (KpiDescriptorList ) {} // Stable and final rpc IncludeKpi (Kpi ) returns (context.Empty ) {} // Stable and final rpc MonitorKpi (MonitorKpiRequest ) returns (context.Empty ) {} // Stable and final rpc QueryKpiData (KpiQuery ) returns (RawKpiTable ) {} // Not implemented @@ -36,21 +36,32 @@ service MonitoringService { rpc GetAlarmDescriptor (AlarmID ) returns (AlarmDescriptor ) {} // Stable and final rpc GetAlarmResponseStream(AlarmSubscription ) returns (stream AlarmResponse) {} // Not Stable not final rpc DeleteAlarm (AlarmID ) returns (context.Empty ) {} // Stable and final -// rpc GetStreamKpi (KpiId ) returns (stream Kpi ) {} // Stable not final -// rpc GetInstantKpi (KpiId ) returns (Kpi ) {} // Stable not final + rpc GetStreamKpi (KpiId ) returns (stream Kpi ) {} // Stable not final + rpc GetInstantKpi (KpiId ) returns (Kpi ) {} // Stable not final } - +message KpiDescriptor { + KpiId kpi_id = 1; + string kpi_description = 2; + repeated KpiId kpi_id_list = 3; + kpi_sample_types.KpiSampleType kpi_sample_type = 4; + context.DeviceId device_id = 5; + context.EndPointId endpoint_id = 6; + context.ServiceId service_id = 7; + context.SliceId slice_id = 8; + context.ConnectionId connection_id = 9; + context.LinkId link_id = 10; +} message MonitorKpiRequest { - kpi_manager.KpiId kpi_id = 1; + 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 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 +75,7 @@ message RawKpi { // cell } message RawKpiList { // column - kpi_manager.KpiId kpi_id = 1; + KpiId kpi_id = 1; repeated RawKpi raw_kpis = 2; } @@ -72,10 +83,12 @@ message RawKpiTable { // table repeated RawKpiList raw_kpi_lists = 1; } - +message KpiId { + context.Uuid kpi_id = 1; +} message Kpi { - kpi_manager.KpiId kpi_id = 1; + KpiId kpi_id = 1; context.Timestamp timestamp = 2; KpiValue kpi_value = 3; } @@ -109,7 +122,7 @@ message KpiList { message SubsDescriptor{ SubscriptionID subs_id = 1; - kpi_manager.KpiId kpi_id = 2; + 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 +147,7 @@ message AlarmDescriptor { AlarmID alarm_id = 1; string alarm_description = 2; string name = 3; - kpi_manager.KpiId kpi_id = 4; + 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 bf5cf4db1..f74eea68b 100644 --- a/proto/optical_attack_detector.proto +++ b/proto/optical_attack_detector.proto @@ -12,13 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -// protocol buffers documentation: https://developers.google.com/protocol-buffers/docs/proto3 syntax = "proto3"; package optical_attack_detector; import "context.proto"; -//import "monitoring.proto"; -import "kpi_manager.proto"; +import "monitoring.proto"; // to be migrated to: "kpi_manager.proto" service OpticalAttackDetectorService { @@ -29,5 +27,5 @@ service OpticalAttackDetectorService { message DetectionRequest { context.ServiceId service_id = 1; - kpi_manager.KpiId kpi_id = 2; + monitoring.KpiId kpi_id = 2; // to be migrated to: "kpi_manager.KpiId" } diff --git a/proto/policy_condition.proto b/proto/policy_condition.proto index 2904f4756..612dcb1af 100644 --- a/proto/policy_condition.proto +++ b/proto/policy_condition.proto @@ -15,14 +15,13 @@ syntax = "proto3"; package policy; -import "monitoring.proto"; -import "kpi_manager.proto"; +import "monitoring.proto"; // to be migrated to: "kpi_manager.proto" // Condition message PolicyRuleCondition { - kpi_manager.KpiId kpiId = 1; - NumericalOperator numericalOperator = 2; - monitoring.KpiValue kpiValue = 3; + monitoring.KpiId kpiId = 1; // to be migrated to: "kpi_manager.KpiId" + NumericalOperator numericalOperator = 2; + monitoring.KpiValue kpiValue = 3; } // Operator to be used when comparing Kpis with condition values -- GitLab From d71d851d5c4df7024ab9c7bc600151e3fdcc0c6e Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 24 Jul 2024 09:47:21 +0000 Subject: [PATCH 370/602] Pre-merge cleanup --- proto/kpi_manager.proto | 14 +++++++------- proto/kpi_value_api.proto | 14 ++++++++++++++ proto/monitoring.proto | 31 +++++++++++++++---------------- proto/telemetry_frontend.proto | 28 +++++++++++++++++++++------- 4 files changed, 57 insertions(+), 30 deletions(-) diff --git a/proto/kpi_manager.proto b/proto/kpi_manager.proto index dbb464d73..2640b58c6 100644 --- a/proto/kpi_manager.proto +++ b/proto/kpi_manager.proto @@ -1,4 +1,4 @@ -// Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. @@ -18,11 +18,11 @@ package kpi_manager; import "context.proto"; import "kpi_sample_types.proto"; -service KpiManagerService{ - rpc SetKpiDescriptor (KpiDescriptor ) returns (KpiId ) {} // Stable not final - rpc DeleteKpiDescriptor (KpiId ) returns (context.Empty ) {} // Stable and final - rpc GetKpiDescriptor (KpiId ) returns (KpiDescriptor ) {} // Stable and final - rpc SelectKpiDescriptor (KpiDescriptorFilter) returns (KpiDescriptorList ) {} // Stable and final +service KpiManagerService { + rpc SetKpiDescriptor (KpiDescriptor ) returns (KpiId ) {} + rpc DeleteKpiDescriptor (KpiId ) returns (context.Empty ) {} + rpc GetKpiDescriptor (KpiId ) returns (KpiDescriptor ) {} + rpc SelectKpiDescriptor (KpiDescriptorFilter) returns (KpiDescriptorList ) {} } message KpiId { @@ -57,4 +57,4 @@ message KpiDescriptorFilter { message KpiDescriptorList { repeated KpiDescriptor kpi_descriptor_list = 1; -} \ No newline at end of file +} diff --git a/proto/kpi_value_api.proto b/proto/kpi_value_api.proto index 19069f547..dff96272e 100644 --- a/proto/kpi_value_api.proto +++ b/proto/kpi_value_api.proto @@ -1,3 +1,17 @@ +// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + syntax = "proto3"; package kpi_value_api; diff --git a/proto/monitoring.proto b/proto/monitoring.proto index 96423bb49..a29a996b8 100755 --- a/proto/monitoring.proto +++ b/proto/monitoring.proto @@ -16,7 +16,6 @@ syntax = "proto3"; package monitoring; import "context.proto"; -import "monitoring.proto"; import "kpi_sample_types.proto"; service MonitoringService { @@ -54,7 +53,7 @@ message KpiDescriptor { } message MonitorKpiRequest { - KpiId kpi_id = 1; + KpiId kpi_id = 1; float monitoring_window_s = 2; float sampling_rate_s = 3; // Pending add field to reflect Available Device Protocols @@ -62,10 +61,10 @@ message MonitorKpiRequest { message KpiQuery { repeated 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" - context.Timestamp end_timestamp = 5; // used when you want something like "get the samples until X date/time" + 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" + context.Timestamp end_timestamp = 5; // used when you want something like "get the samples until X date/time" } @@ -75,8 +74,8 @@ message RawKpi { // cell } message RawKpiList { // column - KpiId kpi_id = 1; - repeated RawKpi raw_kpis = 2; + KpiId kpi_id = 1; + repeated RawKpi raw_kpis = 2; } message RawKpiTable { // table @@ -122,7 +121,7 @@ message KpiList { message SubsDescriptor{ SubscriptionID subs_id = 1; - KpiId kpi_id = 2; + 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" @@ -144,12 +143,12 @@ message SubsList { } message AlarmDescriptor { - AlarmID alarm_id = 1; - string alarm_description = 2; - string name = 3; - KpiId kpi_id = 4; - KpiValueRange kpi_value_range = 5; - context.Timestamp timestamp = 6; + AlarmID alarm_id = 1; + string alarm_description = 2; + string name = 3; + KpiId kpi_id = 4; + KpiValueRange kpi_value_range = 5; + context.Timestamp timestamp = 6; } message AlarmID{ @@ -169,5 +168,5 @@ message AlarmResponse { } message AlarmList { - repeated AlarmDescriptor alarm_descriptor = 1; + repeated AlarmDescriptor alarm_descriptor = 1; } diff --git a/proto/telemetry_frontend.proto b/proto/telemetry_frontend.proto index 01fedd4f3..dbc1e8bf6 100644 --- a/proto/telemetry_frontend.proto +++ b/proto/telemetry_frontend.proto @@ -1,5 +1,19 @@ +// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + syntax = "proto3"; -package device; +package telemetry_frontend; import "context.proto"; import "kpi_manager.proto"; @@ -15,18 +29,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_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 } 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 CollectorId collector_id = 1; + repeated kpi_manager.KpiId kpi_id = 2; } message CollectorList { -- GitLab From 0149ba1fc9ab55946209e1f249051b9d904793e6 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 24 Jul 2024 09:48:58 +0000 Subject: [PATCH 371/602] Pre-merge cleanup --- proto/monitoring.proto | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/proto/monitoring.proto b/proto/monitoring.proto index a29a996b8..e5d4f6aaa 100755 --- a/proto/monitoring.proto +++ b/proto/monitoring.proto @@ -87,7 +87,7 @@ message KpiId { } message Kpi { - KpiId kpi_id = 1; + KpiId kpi_id = 1; context.Timestamp timestamp = 2; KpiValue kpi_value = 3; } @@ -118,7 +118,6 @@ message KpiList { } - message SubsDescriptor{ SubscriptionID subs_id = 1; KpiId kpi_id = 2; -- GitLab From b7dc1846ad1e9191ca3ebdbf2c7de4af47b85f82 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 24 Jul 2024 09:49:48 +0000 Subject: [PATCH 372/602] Pre-merge cleanup --- proto/monitoring.proto | 3 +++ 1 file changed, 3 insertions(+) diff --git a/proto/monitoring.proto b/proto/monitoring.proto index e5d4f6aaa..083bd8285 100755 --- a/proto/monitoring.proto +++ b/proto/monitoring.proto @@ -117,6 +117,9 @@ message KpiList { repeated Kpi kpi = 1; } +message KpiDescriptorList { + repeated KpiDescriptor kpi_descriptor_list = 1; +} message SubsDescriptor{ SubscriptionID subs_id = 1; -- GitLab From 929b1e30a57314e376d5c8a4aedf3e671f0006d4 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 24 Jul 2024 09:55:58 +0000 Subject: [PATCH 373/602] Fixed Copyright headers --- deploy/kafka.sh | 2 +- scripts/run_tests_locally-kpi-DB.sh | 4 ++-- scripts/run_tests_locally-kpi-manager.sh | 4 ++-- scripts/run_tests_locally-kpi-prom-writer.sh | 4 ++-- scripts/run_tests_locally-kpi-value-API.sh | 4 ++-- scripts/run_tests_locally-kpi-value-writer.sh | 4 ++-- scripts/run_tests_locally-telemetry-DB.sh | 4 ++-- scripts/run_tests_locally-telemetry-backend.sh | 4 ++-- scripts/run_tests_locally-telemetry-frontend.sh | 4 ++-- scripts/run_tests_locally-telemetry-mgtDB.sh | 4 ++-- scripts/show_logs_telemetry-DB.sh | 2 +- src/kpi_manager/Dockerfile | 2 +- src/kpi_value_writer/Dockerfile | 2 +- src/kpi_value_writer/__init__.py | 2 +- src/kpi_value_writer/service/KpiWriterOld.py | 2 +- src/kpi_value_writer/service/MetricWriterToPrometheus.py | 2 +- src/kpi_value_writer/service/__init__.py | 2 +- src/kpi_value_writer/tests/test_kpi_composer.py | 2 +- src/kpi_value_writer/tests/test_kpi_value_writer.py | 2 +- src/kpi_value_writer/tests/test_messages.py | 2 +- src/kpi_value_writer/tests/test_metric_writer_to_prom.py | 2 +- src/telemetry/__init__.py | 2 +- src/telemetry/backend/__init__.py | 2 +- src/telemetry/backend/service/TelemetryBackendService.py | 2 +- src/telemetry/backend/service/__init__.py | 2 +- src/telemetry/backend/tests/__init__.py | 2 +- src/telemetry/backend/tests/messagesBackend.py | 2 +- src/telemetry/backend/tests/testTelemetryBackend.py | 2 +- src/telemetry/database/TelemetryDBmanager.py | 2 +- src/telemetry/database/TelemetryEngine.py | 2 +- src/telemetry/database/TelemetryModel.py | 2 +- src/telemetry/database/__init__.py | 2 +- src/telemetry/database/__main__.py | 2 +- src/telemetry/database/managementDB.py | 2 +- src/telemetry/database/tests/__init__.py | 2 +- src/telemetry/database/tests/managementDBtests.py | 2 +- src/telemetry/database/tests/messages.py | 2 +- src/telemetry/database/tests/telemetryDBtests.py | 2 +- src/telemetry/frontend/__init__.py | 2 +- src/telemetry/frontend/client/TelemetryFrontendClient.py | 2 +- src/telemetry/frontend/client/__init__.py | 2 +- src/telemetry/frontend/service/TelemetryFrontendService.py | 2 +- .../frontend/service/TelemetryFrontendServiceServicerImpl.py | 2 +- src/telemetry/frontend/service/__init__.py | 2 +- src/telemetry/frontend/service/__main__.py | 2 +- src/telemetry/frontend/tests/Messages.py | 2 +- src/telemetry/frontend/tests/__init__.py | 2 +- src/telemetry/frontend/tests/test_frontend.py | 2 +- src/telemetry/requirements.in | 2 +- 49 files changed, 58 insertions(+), 58 deletions(-) diff --git a/deploy/kafka.sh b/deploy/kafka.sh index 4be5ef6b2..4a91bfc9e 100755 --- a/deploy/kafka.sh +++ b/deploy/kafka.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/scripts/run_tests_locally-kpi-DB.sh b/scripts/run_tests_locally-kpi-DB.sh index e46df4657..d43be66e1 100755 --- a/scripts/run_tests_locally-kpi-DB.sh +++ b/scripts/run_tests_locally-kpi-DB.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. @@ -25,4 +25,4 @@ cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ - kpi_manager/tests/test_kpi_db.py \ No newline at end of file + kpi_manager/tests/test_kpi_db.py diff --git a/scripts/run_tests_locally-kpi-manager.sh b/scripts/run_tests_locally-kpi-manager.sh index 742a52685..db6e78683 100755 --- a/scripts/run_tests_locally-kpi-manager.sh +++ b/scripts/run_tests_locally-kpi-manager.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. @@ -25,4 +25,4 @@ cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ - kpi_manager/tests/test_kpi_manager.py \ No newline at end of file + kpi_manager/tests/test_kpi_manager.py diff --git a/scripts/run_tests_locally-kpi-prom-writer.sh b/scripts/run_tests_locally-kpi-prom-writer.sh index 63989a13b..1179cbf86 100755 --- a/scripts/run_tests_locally-kpi-prom-writer.sh +++ b/scripts/run_tests_locally-kpi-prom-writer.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. @@ -20,4 +20,4 @@ cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ - kpi_value_writer/tests/test_metric_writer_to_prom.py \ No newline at end of file + kpi_value_writer/tests/test_metric_writer_to_prom.py diff --git a/scripts/run_tests_locally-kpi-value-API.sh b/scripts/run_tests_locally-kpi-value-API.sh index 770c97ce0..8dfbfb162 100755 --- a/scripts/run_tests_locally-kpi-value-API.sh +++ b/scripts/run_tests_locally-kpi-value-API.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. @@ -22,4 +22,4 @@ RCFILE=$PROJECTDIR/coverage/.coveragerc # helpful pytest flags: --log-level=INFO -o log_cli=true --verbose --maxfail=1 --durations=0 python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG -o log_cli=true --verbose \ - kpi_value_api/tests/test_kpi_value_api.py \ No newline at end of file + kpi_value_api/tests/test_kpi_value_api.py diff --git a/scripts/run_tests_locally-kpi-value-writer.sh b/scripts/run_tests_locally-kpi-value-writer.sh index 95cf396f6..8faaeb6d8 100755 --- a/scripts/run_tests_locally-kpi-value-writer.sh +++ b/scripts/run_tests_locally-kpi-value-writer.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. @@ -20,4 +20,4 @@ cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ - kpi_value_writer/tests/test_kpi_value_writer.py \ No newline at end of file + kpi_value_writer/tests/test_kpi_value_writer.py diff --git a/scripts/run_tests_locally-telemetry-DB.sh b/scripts/run_tests_locally-telemetry-DB.sh index 0a896d92c..bb1c48b76 100755 --- a/scripts/run_tests_locally-telemetry-DB.sh +++ b/scripts/run_tests_locally-telemetry-DB.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. @@ -23,4 +23,4 @@ cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc python3 -m pytest --log-cli-level=INFO --verbose \ - telemetry/database/tests/telemetryDBtests.py \ No newline at end of file + telemetry/database/tests/telemetryDBtests.py diff --git a/scripts/run_tests_locally-telemetry-backend.sh b/scripts/run_tests_locally-telemetry-backend.sh index 8f72fb283..9cf404ffc 100755 --- a/scripts/run_tests_locally-telemetry-backend.sh +++ b/scripts/run_tests_locally-telemetry-backend.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. @@ -25,4 +25,4 @@ cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ - telemetry/backend/tests/testTelemetryBackend.py \ No newline at end of file + telemetry/backend/tests/testTelemetryBackend.py diff --git a/scripts/run_tests_locally-telemetry-frontend.sh b/scripts/run_tests_locally-telemetry-frontend.sh index 673104af6..7652ccb58 100755 --- a/scripts/run_tests_locally-telemetry-frontend.sh +++ b/scripts/run_tests_locally-telemetry-frontend.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. @@ -25,4 +25,4 @@ cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ - telemetry/frontend/tests/test_frontend.py \ No newline at end of file + telemetry/frontend/tests/test_frontend.py diff --git a/scripts/run_tests_locally-telemetry-mgtDB.sh b/scripts/run_tests_locally-telemetry-mgtDB.sh index 02a449abf..8b68104ea 100755 --- a/scripts/run_tests_locally-telemetry-mgtDB.sh +++ b/scripts/run_tests_locally-telemetry-mgtDB.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. @@ -23,4 +23,4 @@ cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc python3 -m pytest --log-cli-level=INFO --verbose \ - telemetry/database/tests/managementDBtests.py \ No newline at end of file + telemetry/database/tests/managementDBtests.py diff --git a/scripts/show_logs_telemetry-DB.sh b/scripts/show_logs_telemetry-DB.sh index 0f57a36af..84fc875d0 100755 --- a/scripts/show_logs_telemetry-DB.sh +++ b/scripts/show_logs_telemetry-DB.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/kpi_manager/Dockerfile b/src/kpi_manager/Dockerfile index 4d74030e7..a57957759 100644 --- a/src/kpi_manager/Dockerfile +++ b/src/kpi_manager/Dockerfile @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/kpi_value_writer/Dockerfile b/src/kpi_value_writer/Dockerfile index 4d74030e7..a57957759 100644 --- a/src/kpi_value_writer/Dockerfile +++ b/src/kpi_value_writer/Dockerfile @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/kpi_value_writer/__init__.py b/src/kpi_value_writer/__init__.py index 1549d9811..3ee6f7071 100644 --- a/src/kpi_value_writer/__init__.py +++ b/src/kpi_value_writer/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/kpi_value_writer/service/KpiWriterOld.py b/src/kpi_value_writer/service/KpiWriterOld.py index 6c74f1a05..b9a4316b0 100644 --- a/src/kpi_value_writer/service/KpiWriterOld.py +++ b/src/kpi_value_writer/service/KpiWriterOld.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py index b2bfc07a4..b68116478 100644 --- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py +++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/kpi_value_writer/service/__init__.py b/src/kpi_value_writer/service/__init__.py index 1549d9811..3ee6f7071 100644 --- a/src/kpi_value_writer/service/__init__.py +++ b/src/kpi_value_writer/service/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/kpi_value_writer/tests/test_kpi_composer.py b/src/kpi_value_writer/tests/test_kpi_composer.py index 787ca6676..fa75ba2ab 100644 --- a/src/kpi_value_writer/tests/test_kpi_composer.py +++ b/src/kpi_value_writer/tests/test_kpi_composer.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/kpi_value_writer/tests/test_kpi_value_writer.py b/src/kpi_value_writer/tests/test_kpi_value_writer.py index 4ac7b21c8..06758851c 100755 --- a/src/kpi_value_writer/tests/test_kpi_value_writer.py +++ b/src/kpi_value_writer/tests/test_kpi_value_writer.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/kpi_value_writer/tests/test_messages.py b/src/kpi_value_writer/tests/test_messages.py index d4b263c80..64add9a63 100755 --- a/src/kpi_value_writer/tests/test_messages.py +++ b/src/kpi_value_writer/tests/test_messages.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/kpi_value_writer/tests/test_metric_writer_to_prom.py b/src/kpi_value_writer/tests/test_metric_writer_to_prom.py index cee2877ff..44f12ecea 100644 --- a/src/kpi_value_writer/tests/test_metric_writer_to_prom.py +++ b/src/kpi_value_writer/tests/test_metric_writer_to_prom.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/__init__.py b/src/telemetry/__init__.py index 6a8f39746..234a1af65 100644 --- a/src/telemetry/__init__.py +++ b/src/telemetry/__init__.py @@ -1,5 +1,5 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/backend/__init__.py b/src/telemetry/backend/__init__.py index 38d04994f..bbfc943b6 100644 --- a/src/telemetry/backend/__init__.py +++ b/src/telemetry/backend/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index ef57ea8e8..d81be79db 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/backend/service/__init__.py b/src/telemetry/backend/service/__init__.py index 38d04994f..bbfc943b6 100644 --- a/src/telemetry/backend/service/__init__.py +++ b/src/telemetry/backend/service/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/backend/tests/__init__.py b/src/telemetry/backend/tests/__init__.py index 38d04994f..bbfc943b6 100644 --- a/src/telemetry/backend/tests/__init__.py +++ b/src/telemetry/backend/tests/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/backend/tests/messagesBackend.py b/src/telemetry/backend/tests/messagesBackend.py index 10f5e099a..5cf553eaa 100644 --- a/src/telemetry/backend/tests/messagesBackend.py +++ b/src/telemetry/backend/tests/messagesBackend.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/backend/tests/testTelemetryBackend.py b/src/telemetry/backend/tests/testTelemetryBackend.py index 5f0697b72..d832e54e7 100644 --- a/src/telemetry/backend/tests/testTelemetryBackend.py +++ b/src/telemetry/backend/tests/testTelemetryBackend.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/database/TelemetryDBmanager.py b/src/telemetry/database/TelemetryDBmanager.py index e2b1f63a2..b558180a9 100644 --- a/src/telemetry/database/TelemetryDBmanager.py +++ b/src/telemetry/database/TelemetryDBmanager.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/database/TelemetryEngine.py b/src/telemetry/database/TelemetryEngine.py index 2b47e4ec8..a563fa09f 100644 --- a/src/telemetry/database/TelemetryEngine.py +++ b/src/telemetry/database/TelemetryEngine.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/database/TelemetryModel.py b/src/telemetry/database/TelemetryModel.py index 54b7c13ef..be4f0969c 100644 --- a/src/telemetry/database/TelemetryModel.py +++ b/src/telemetry/database/TelemetryModel.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/database/__init__.py b/src/telemetry/database/__init__.py index 1549d9811..3ee6f7071 100644 --- a/src/telemetry/database/__init__.py +++ b/src/telemetry/database/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/database/__main__.py b/src/telemetry/database/__main__.py index 10f5e099a..5cf553eaa 100644 --- a/src/telemetry/database/__main__.py +++ b/src/telemetry/database/__main__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/database/managementDB.py b/src/telemetry/database/managementDB.py index 3e0cfc5fb..f79126f27 100644 --- a/src/telemetry/database/managementDB.py +++ b/src/telemetry/database/managementDB.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/database/tests/__init__.py b/src/telemetry/database/tests/__init__.py index f80ccfd52..839e45e3b 100644 --- a/src/telemetry/database/tests/__init__.py +++ b/src/telemetry/database/tests/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/database/tests/managementDBtests.py b/src/telemetry/database/tests/managementDBtests.py index 3d7ef6615..24138abe4 100644 --- a/src/telemetry/database/tests/managementDBtests.py +++ b/src/telemetry/database/tests/managementDBtests.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/database/tests/messages.py b/src/telemetry/database/tests/messages.py index 6452e79e7..6919eecc6 100644 --- a/src/telemetry/database/tests/messages.py +++ b/src/telemetry/database/tests/messages.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/database/tests/telemetryDBtests.py b/src/telemetry/database/tests/telemetryDBtests.py index 59043b33f..0d2211064 100644 --- a/src/telemetry/database/tests/telemetryDBtests.py +++ b/src/telemetry/database/tests/telemetryDBtests.py @@ -1,5 +1,5 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/frontend/__init__.py b/src/telemetry/frontend/__init__.py index 6a8f39746..234a1af65 100644 --- a/src/telemetry/frontend/__init__.py +++ b/src/telemetry/frontend/__init__.py @@ -1,5 +1,5 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/frontend/client/TelemetryFrontendClient.py b/src/telemetry/frontend/client/TelemetryFrontendClient.py index 9b4e27b36..cd36ecd45 100644 --- a/src/telemetry/frontend/client/TelemetryFrontendClient.py +++ b/src/telemetry/frontend/client/TelemetryFrontendClient.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/frontend/client/__init__.py b/src/telemetry/frontend/client/__init__.py index 1549d9811..3ee6f7071 100644 --- a/src/telemetry/frontend/client/__init__.py +++ b/src/telemetry/frontend/client/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/frontend/service/TelemetryFrontendService.py b/src/telemetry/frontend/service/TelemetryFrontendService.py index 522d125e6..dc3f8df36 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendService.py +++ b/src/telemetry/frontend/service/TelemetryFrontendService.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index c63b42cbf..e6830ad67 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/frontend/service/__init__.py b/src/telemetry/frontend/service/__init__.py index 1549d9811..3ee6f7071 100644 --- a/src/telemetry/frontend/service/__init__.py +++ b/src/telemetry/frontend/service/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/frontend/service/__main__.py b/src/telemetry/frontend/service/__main__.py index 0f48a4de1..3b0263706 100644 --- a/src/telemetry/frontend/service/__main__.py +++ b/src/telemetry/frontend/service/__main__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/frontend/tests/Messages.py b/src/telemetry/frontend/tests/Messages.py index 6dc1dffa9..1205898d1 100644 --- a/src/telemetry/frontend/tests/Messages.py +++ b/src/telemetry/frontend/tests/Messages.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/frontend/tests/__init__.py b/src/telemetry/frontend/tests/__init__.py index 1549d9811..3ee6f7071 100644 --- a/src/telemetry/frontend/tests/__init__.py +++ b/src/telemetry/frontend/tests/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/frontend/tests/test_frontend.py b/src/telemetry/frontend/tests/test_frontend.py index e33545dcc..002cc4307 100644 --- a/src/telemetry/frontend/tests/test_frontend.py +++ b/src/telemetry/frontend/tests/test_frontend.py @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. diff --git a/src/telemetry/requirements.in b/src/telemetry/requirements.in index 1dd24fe32..a0e78d2bf 100644 --- a/src/telemetry/requirements.in +++ b/src/telemetry/requirements.in @@ -1,4 +1,4 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. -- GitLab From cedf682476bfbc5a669bd613d03713c2fbd5412f Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 24 Jul 2024 10:05:57 +0000 Subject: [PATCH 374/602] changes for testing KPI manager and value API --- .../service/KpiManagerServiceServicerImpl.py | 32 +++++++------------ .../service/KpiValueWriter.py | 12 +++---- .../tests/test_kpi_value_writer.py | 6 ++-- 3 files changed, 21 insertions(+), 29 deletions(-) diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py index 287478f13..0ac7dd76b 100644 --- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -32,29 +32,29 @@ class IDNotFoundError(Exception): class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): def __init__(self, name_mapping : NameMapping): - LOGGER.debug('Init KpiManagerService') + LOGGER.info('Init KpiManagerService') self.kpi_db_obj = KpiDB() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SetKpiDescriptor(self, request: KpiDescriptor, grpc_context: grpc.ServicerContext # type: ignore ) -> KpiId: # type: ignore response = KpiId() - LOGGER.debug("Received gRPC message object: {:}".format(request)) + LOGGER.info("Received gRPC message object: {:}".format(request)) try: kpi_to_insert = KpiModel.convert_KpiDescriptor_to_row(request) if(self.kpi_db_obj.add_row_to_db(kpi_to_insert)): response.kpi_id.uuid = request.kpi_id.kpi_id.uuid - # LOGGER.debug("Added Row: {:}".format(response)) + # LOGGER.info("Added Row: {:}".format(response)) return response except Exception as e: - LOGGER.debug("Unable to create KpiModel class object. {:}".format(e)) + LOGGER.info("Unable to create KpiModel class object. {:}".format(e)) @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext # type: ignore ) -> KpiDescriptor: # type: ignore response = KpiDescriptor() print("--> Received gRPC message object: {:}".format(request)) - LOGGER.debug("Received gRPC message object: {:}".format(request)) + LOGGER.info("Received gRPC message object: {:}".format(request)) try: kpi_id_to_search = request.kpi_id.uuid row = self.kpi_db_obj.search_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) @@ -63,46 +63,38 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): return response if row is None: print ('No matching row found for kpi id: {:}'.format(kpi_id_to_search)) - LOGGER.debug('No matching row found kpi id: {:}'.format(kpi_id_to_search)) + LOGGER.info('No matching row found kpi id: {:}'.format(kpi_id_to_search)) return Empty() except Exception as e: print ('Unable to search kpi id. {:}'.format(e)) - LOGGER.debug('Unable to search kpi id. {:}'.format(e)) + LOGGER.info('Unable to search kpi id. {:}'.format(e)) raise e - # kpi_id_to_search = request.kpi_id.uuid - # row = self.kpi_db_obj.search_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) - # if row is None: - # print ('Unable to search kpi id. {:}'.format(kpi_id_to_search)) - # LOGGER.debug('Unable to search kpi id. {:}'.format(kpi_id_to_search)) - # raise IDNotFoundError - # response = KpiModel.convert_row_to_KpiDescriptor(row) - # return response @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext # type: ignore ) -> Empty: # type: ignore - LOGGER.debug("Received gRPC message object: {:}".format(request)) + LOGGER.info("Received gRPC message object: {:}".format(request)) try: kpi_id_to_search = request.kpi_id.uuid self.kpi_db_obj.delete_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) except Exception as e: - LOGGER.debug('Unable to search kpi id. {:}'.format(e)) + LOGGER.info('Unable to search kpi id. {:}'.format(e)) finally: return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SelectKpiDescriptor(self, filter: KpiDescriptorFilter, grpc_context: grpc.ServicerContext # type: ignore ) -> KpiDescriptorList: # type: ignore - LOGGER.debug("Received gRPC message object: {:}".format(filter)) + LOGGER.info("Received gRPC message object: {:}".format(filter)) response = KpiDescriptorList() try: rows = self.kpi_db_obj.select_with_filter(KpiModel, filter) except Exception as e: - LOGGER.debug('Unable to apply filter on kpi descriptor. {:}'.format(e)) + LOGGER.info('Unable to apply filter on kpi descriptor. {:}'.format(e)) try: for row in rows: kpiDescriptor_obj = KpiModel.convert_row_to_KpiDescriptor(row) response.kpi_descriptor_list.append(kpiDescriptor_obj) return response except Exception as e: - LOGGER.debug('Unable to process filter response {:}'.format(e)) + LOGGER.info('Unable to process filter response {:}'.format(e)) diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index 70e018d08..73dd0a20b 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -102,11 +102,11 @@ class KpiValueWriter: print("kpi descriptor received: {:}".format(kpi_descriptor_object)) if isinstance (kpi_descriptor_object, KpiDescriptor): - LOGGER.info("Extracted row: {:}".format(kpi_descriptor_object)) - print("Extracted row: {:}".format(kpi_descriptor_object)) + LOGGER.info("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) + print("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) else: - LOGGER.info("Error in extracting row {:}".format(kpi_descriptor_object)) - print("Error in extracting row {:}".format(kpi_descriptor_object)) + LOGGER.info("Error in extracting KpiDescriptor {:}".format(kpi_descriptor_object)) + print("Error in extracting KpiDescriptor {:}".format(kpi_descriptor_object)) except Exception as e: - LOGGER.info("Unable to get Descriptor. Error: {:}".format(e)) - print ("Unable to get Descriptor. Error: {:}".format(e)) + LOGGER.info("Unable to get KpiDescriptor. Error: {:}".format(e)) + print ("Unable to get KpiDescriptor. Error: {:}".format(e)) diff --git a/src/kpi_value_writer/tests/test_kpi_value_writer.py b/src/kpi_value_writer/tests/test_kpi_value_writer.py index 4ac7b21c8..05310aa6b 100755 --- a/src/kpi_value_writer/tests/test_kpi_value_writer.py +++ b/src/kpi_value_writer/tests/test_kpi_value_writer.py @@ -26,14 +26,14 @@ def test_GetKpiDescriptor(): LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") kpi_manager_client = KpiManagerClient() # adding KPI - LOGGER.info(" >>> calling SetKpiDescriptor ") + LOGGER.info(" --->>> calling SetKpiDescriptor ") response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) # get KPI - LOGGER.info(" >>> calling GetKpiDescriptor with response ID") + LOGGER.info(" --->>> calling GetKpiDescriptor with response ID") response = kpi_manager_client.GetKpiDescriptor(response_id) LOGGER.info("Response gRPC message object: {:}".format(response)) - LOGGER.info(" >>> calling GetKpiDescriptor with random ID") + LOGGER.info(" --->>> calling GetKpiDescriptor with random ID") rand_response = kpi_manager_client.GetKpiDescriptor(create_kpi_id_request()) LOGGER.info("Response gRPC message object: {:}".format(rand_response)) -- GitLab From 544cdc34d2644c32d19e304d79986d8935698414 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 24 Jul 2024 12:01:11 +0000 Subject: [PATCH 375/602] merge cleanup --- src/kpi_manager/database/KpiEngine.py | 29 ++++------ src/kpi_manager/requirements-all.in | 83 --------------------------- src/kpi_manager/requirements.in | 20 ------- 3 files changed, 12 insertions(+), 120 deletions(-) delete mode 100644 src/kpi_manager/requirements-all.in diff --git a/src/kpi_manager/database/KpiEngine.py b/src/kpi_manager/database/KpiEngine.py index 1d4015ff2..42bda9527 100644 --- a/src/kpi_manager/database/KpiEngine.py +++ b/src/kpi_manager/database/KpiEngine.py @@ -13,37 +13,32 @@ # limitations under the License. import logging, sqlalchemy -# from common.Settings import get_setting +from common.Settings import get_setting LOGGER = logging.getLogger(__name__) -APP_NAME = 'tfs' -ECHO = False # False: No dump SQL commands and transactions executed # CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' -CRDB_NAMESPACE = "crdb" -CRDB_SQL_PORT = "26257" -CRDB_DATABASE = "kpi" -CRDB_USERNAME = "tfs" -CRDB_PASSWORD = "tfs123" -CRDB_SSLMODE = "require" CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' class KpiEngine: - # def __init__(self): - # self.engine = self.get_engine() - @staticmethod def get_engine() -> sqlalchemy.engine.Engine: - # crdb_uri = CRDB_URI_TEMPLATE.format( - # CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) + crdb_uri = get_setting('CRDB_URI', default=None) + if crdb_uri is None: + CRDB_NAMESPACE = get_setting('CRDB_NAMESPACE') + CRDB_SQL_PORT = get_setting('CRDB_SQL_PORT') + CRDB_DATABASE = get_setting('CRDB_DATABASE') + CRDB_USERNAME = get_setting('CRDB_USERNAME') + CRDB_PASSWORD = get_setting('CRDB_PASSWORD') + CRDB_SSLMODE = get_setting('CRDB_SSLMODE') crdb_uri = CRDB_URI_TEMPLATE.format( CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) + # crdb_uri = CRDB_URI_TEMPLATE.format( + # CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) try: - # engine = sqlalchemy.create_engine( - # crdb_uri, connect_args={'application_name': APP_NAME}, echo=ECHO, future=True) engine = sqlalchemy.create_engine(crdb_uri, echo=False) LOGGER.info(' KpiDBmanager initalized with DB URL: {:}'.format(crdb_uri)) except: # pylint: disable=bare-except # pragma: no cover LOGGER.exception('Failed to connect to database: {:s}'.format(str(crdb_uri))) return None # type: ignore - return engine # type: ignore + return engine diff --git a/src/kpi_manager/requirements-all.in b/src/kpi_manager/requirements-all.in deleted file mode 100644 index c4a1c2120..000000000 --- a/src/kpi_manager/requirements-all.in +++ /dev/null @@ -1,83 +0,0 @@ -aniso8601==9.0.1 -anytree==2.8.0 -APScheduler==3.10.1 -attrs==23.2.0 -bcrypt==4.1.3 -certifi==2024.2.2 -cffi==1.16.0 -charset-normalizer==2.0.12 -click==8.1.7 -colorama==0.4.6 -confluent-kafka==2.3.0 -coverage==6.3 -cryptography==36.0.2 -deepdiff==6.7.1 -deepmerge==1.1.1 -enum34==1.1.10 -Flask==2.1.3 -Flask-HTTPAuth==4.5.0 -Flask-RESTful==0.3.9 -future-fstrings==1.2.0 -googleapis-common-protos==1.63.2 -greenlet==3.0.3 -grpcio==1.47.5 -grpcio-health-checking==1.47.5 -grpcio-tools==1.47.5 -grpclib==0.4.4 -h2==4.1.0 -hpack==4.0.0 -hyperframe==6.0.1 -idna==3.7 -influx-line-protocol==0.1.4 -iniconfig==2.0.0 -ipaddress==1.0.23 -itsdangerous==2.2.0 -Jinja2==3.0.3 -kafka-python==2.0.2 -lxml==5.2.2 -macaddress==2.0.2 -MarkupSafe==2.1.5 -multidict==6.0.5 -ncclient==0.6.15 -networkx==2.8.8 -numpy==2.0.0 -ordered-set==4.1.0 -p4runtime==1.3.0 -packaging==24.0 -pandas==1.5.3 -paramiko==2.9.2 -pluggy==1.5.0 -prettytable==3.5.0 -prometheus-client==0.13.0 -protobuf==3.20.3 -psycopg2-binary==2.9.3 -py==1.11.0 -py-cpuinfo==9.0.0 -pyang==2.6.0 -pyangbind @ git+https://github.com/robshakir/pyangbind.git@daf530f882c14bdb1bae4dc94fb4b4ad04d1295c -pycparser==2.22 -PyNaCl==1.5.0 -pytest==6.2.5 -pytest-benchmark==3.4.1 -pytest-depends==1.0.1 -python-dateutil==2.8.2 -python-json-logger==2.0.2 -pytz==2024.1 -questdb==1.0.1 -regex==2024.5.15 -requests==2.27.1 -requests-mock==1.9.3 -six==1.16.0 -SQLAlchemy==1.4.52 -sqlalchemy-cockroachdb==1.4.4 -SQLAlchemy-Utils==0.38.3 -tabulate==0.9.0 -toml==0.10.2 -typing_extensions==4.12.0 -tzlocal==5.2 -urllib3==1.26.18 -wcwidth==0.2.13 -websockets==10.4 -Werkzeug==2.3.7 -xmltodict==0.12.0 -yattag==1.15.2 diff --git a/src/kpi_manager/requirements.in b/src/kpi_manager/requirements.in index b961116dc..f4e54a174 100644 --- a/src/kpi_manager/requirements.in +++ b/src/kpi_manager/requirements.in @@ -5,49 +5,29 @@ bcrypt==4.1.3 certifi==2024.7.4 cffi==1.16.0 charset-normalizer==2.0.12 -coverage==6.3 cryptography==42.0.8 googleapis-common-protos==1.63.2 greenlet==3.0.3 -grpcio==1.47.5 -grpcio-health-checking==1.47.5 -grpcio-tools==1.47.5 -grpclib==0.4.4 -h2==4.1.0 -hpack==4.0.0 -hyperframe==6.0.1 idna==3.7 -iniconfig==2.0.0 Jinja2==3.0.3 lxml==5.2.2 macaddress==2.0.2 MarkupSafe==2.1.5 -multidict==6.0.5 ncclient==0.6.15 p4runtime==1.3.0 -packaging==24.1 paramiko==3.4.0 -pluggy==1.5.0 -prettytable==3.5.0 -prometheus-client==0.13.0 -protobuf==3.20.3 psycopg2-binary==2.9.3 -py==1.11.0 pycparser==2.22 PyNaCl==1.5.0 -pytest==6.2.5 pytz==2024.1 requests==2.27.1 -six==1.16.0 SQLAlchemy==1.4.52 sqlalchemy-cockroachdb==1.4.4 SQLAlchemy-Utils==0.38.3 tabulate==0.9.0 -toml==0.10.2 typing_extensions==4.12.2 tzlocal==5.2 urllib3==1.26.19 -wcwidth==0.2.13 websockets==10.4 xmltodict==0.12.0 yattag==1.15.2 -- GitLab From 3aaf8cc139e93d98fde276ea9a4cc1685c5ed463 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 24 Jul 2024 16:01:08 +0000 Subject: [PATCH 376/602] cleanup for merge --- src/common/tools/kafka/Variables.py | 11 ++--- src/kpi_value_api/requirements.in | 2 + .../service/KpiValueApiServiceServicerImpl.py | 3 -- src/kpi_value_api/tests/test_kpi_value_api.py | 1 + src/kpi_value_writer/requirements.in | 2 + .../tests/test_kpi_value_writer.py | 44 +++++++++---------- 6 files changed, 33 insertions(+), 30 deletions(-) create mode 100644 src/kpi_value_api/requirements.in create mode 100644 src/kpi_value_writer/requirements.in diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index ba58e31ef..a6f996932 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -36,9 +36,6 @@ class KafkaTopic(Enum): """ Method to create Kafka topics defined as class members """ - # LOGGER.debug("Topics to be created: {:}".format(KafkaTopic.__members__.values())) - # LOGGER.debug("Topics to be created: {:}".format(KafkaTopic.__members__.keys())) - # LOGGER.debug("Topics to be created: {:}".format([member.value for member in KafkaTopic])) all_topics = [member.value for member in KafkaTopic] if( KafkaTopic.create_new_topic_if_not_exists( all_topics )): LOGGER.debug("All topics created sucsessfully") @@ -54,16 +51,20 @@ class KafkaTopic(Enum): Args: list of topic: containing the topic name(s) to be created on Kafka """ - LOGGER.debug("Recevied topic List: {:}".format(new_topics)) + LOGGER.debug("Topics names to be verified and created: {:}".format(new_topics)) for topic in new_topics: try: topic_metadata = KafkaConfig.ADMIN_CLIENT.value.list_topics(timeout=5) + # LOGGER.debug("Existing topic list: {:}".format(topic_metadata.topics)) if topic not in topic_metadata.topics: # If the topic does not exist, create a new topic - print(f"Topic '{topic}' does not exist. Creating...") + print("Topic {:} does not exist. Creating...".format(topic)) LOGGER.debug("Topic {:} does not exist. Creating...".format(topic)) new_topic = NewTopic(topic, num_partitions=1, replication_factor=1) KafkaConfig.ADMIN_CLIENT.value.create_topics([new_topic]) + else: + print("Topic name already exists: {:}".format(topic)) + LOGGER.debug("Topic name already exists: {:}".format(topic)) except Exception as e: LOGGER.debug("Failed to create topic: {:}".format(e)) return False diff --git a/src/kpi_value_api/requirements.in b/src/kpi_value_api/requirements.in new file mode 100644 index 000000000..a642b5e58 --- /dev/null +++ b/src/kpi_value_api/requirements.in @@ -0,0 +1,2 @@ +confluent-kafka==2.3.0 +requests==2.27.1 \ No newline at end of file diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index 1d3b9bdfd..3ecf20c08 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -105,19 +105,16 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): return KpiValueType(int64Val=int64_value) except ValueError: pass - # Check if the value is a float try: float_value = float(value) return KpiValueType(floatVal=float_value) except ValueError: pass - # Check if the value is a boolean if value.lower() in ['true', 'false']: bool_value = value.lower() == 'true' return KpiValueType(boolVal=bool_value) - # If none of the above, treat it as a string return KpiValueType(stringVal=value) diff --git a/src/kpi_value_api/tests/test_kpi_value_api.py b/src/kpi_value_api/tests/test_kpi_value_api.py index 519a61704..6c2858659 100644 --- a/src/kpi_value_api/tests/test_kpi_value_api.py +++ b/src/kpi_value_api/tests/test_kpi_value_api.py @@ -90,3 +90,4 @@ def test_store_kpi_values(kpi_value_api_client): LOGGER.debug(" >>> test_set_list_of_KPIs: START <<< ") response = kpi_value_api_client.StoreKpiValues(create_kpi_value_list()) assert isinstance(response, Empty) + diff --git a/src/kpi_value_writer/requirements.in b/src/kpi_value_writer/requirements.in new file mode 100644 index 000000000..a642b5e58 --- /dev/null +++ b/src/kpi_value_writer/requirements.in @@ -0,0 +1,2 @@ +confluent-kafka==2.3.0 +requests==2.27.1 \ No newline at end of file diff --git a/src/kpi_value_writer/tests/test_kpi_value_writer.py b/src/kpi_value_writer/tests/test_kpi_value_writer.py index 0a57c7416..572495d48 100755 --- a/src/kpi_value_writer/tests/test_kpi_value_writer.py +++ b/src/kpi_value_writer/tests/test_kpi_value_writer.py @@ -22,31 +22,31 @@ from kpi_value_writer.tests.test_messages import create_kpi_id_request LOGGER = logging.getLogger(__name__) -def test_GetKpiDescriptor(): - LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") - kpi_manager_client = KpiManagerClient() - # adding KPI - LOGGER.info(" --->>> calling SetKpiDescriptor ") - response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) - # get KPI - LOGGER.info(" --->>> calling GetKpiDescriptor with response ID") - response = kpi_manager_client.GetKpiDescriptor(response_id) - LOGGER.info("Response gRPC message object: {:}".format(response)) +# def test_GetKpiDescriptor(): +# LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") +# kpi_manager_client = KpiManagerClient() +# # adding KPI +# LOGGER.info(" --->>> calling SetKpiDescriptor ") +# response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) +# # get KPI +# LOGGER.info(" --->>> calling GetKpiDescriptor with response ID") +# response = kpi_manager_client.GetKpiDescriptor(response_id) +# LOGGER.info("Response gRPC message object: {:}".format(response)) - LOGGER.info(" --->>> calling GetKpiDescriptor with random ID") - rand_response = kpi_manager_client.GetKpiDescriptor(create_kpi_id_request()) - LOGGER.info("Response gRPC message object: {:}".format(rand_response)) +# LOGGER.info(" --->>> calling GetKpiDescriptor with random ID") +# rand_response = kpi_manager_client.GetKpiDescriptor(create_kpi_id_request()) +# LOGGER.info("Response gRPC message object: {:}".format(rand_response)) - LOGGER.info("\n------------------ TEST FINISHED ---------------------\n") - assert isinstance(response, KpiDescriptor) +# LOGGER.info("\n------------------ TEST FINISHED ---------------------\n") +# assert isinstance(response, KpiDescriptor) # -------- Initial Test ---------------- -# def test_validate_kafka_topics(): -# LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ") -# response = KafkaTopic.create_all_topics() -# assert isinstance(response, bool) +def test_validate_kafka_topics(): + LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ") + response = KafkaTopic.create_all_topics() + assert isinstance(response, bool) -# def test_KafkaConsumer(): -# LOGGER.debug(" --->>> test_kafka_consumer: START <<<--- ") -# KpiValueWriter.RunKafkaConsumer() +def test_KafkaConsumer(): + LOGGER.debug(" --->>> test_kafka_consumer: START <<<--- ") + KpiValueWriter.RunKafkaConsumer() -- GitLab From 5f4a7d312b2fb6c106873d9c1d65b2c7c92d6c30 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 24 Jul 2024 16:13:45 +0000 Subject: [PATCH 377/602] added and updated __main__ file --- src/kpi_manager/service/__main__.py | 39 -------------- src/kpi_value_api/service/__main__.py | 55 +++++++++++++++++++ src/kpi_value_writer/service/__main__.py | 67 ++++-------------------- 3 files changed, 64 insertions(+), 97 deletions(-) create mode 100644 src/kpi_value_api/service/__main__.py diff --git a/src/kpi_manager/service/__main__.py b/src/kpi_manager/service/__main__.py index 50b504867..132a15219 100644 --- a/src/kpi_manager/service/__main__.py +++ b/src/kpi_manager/service/__main__.py @@ -29,35 +29,6 @@ def signal_handler(signal, frame): # pylint: disable=redefined-outer-name LOGGER.warning('Terminate signal received') terminate.set() -# def start_kpi_manager(name_mapping : NameMapping): -# LOGGER.info('Start Kpi Manager...',) - -# events_collector = EventsDeviceCollector(name_mapping) -# events_collector.start() - -# # TODO: redesign this method to be more clear and clean - -# # Iterate while terminate is not set -# while not terminate.is_set(): -# list_new_kpi_ids = events_collector.listen_events() - -# # Monitor Kpis -# if bool(list_new_kpi_ids): -# for kpi_id in list_new_kpi_ids: -# # Create Monitor Kpi Requests -# monitor_kpi_request = monitoring_pb2.MonitorKpiRequest() -# monitor_kpi_request.kpi_id.CopyFrom(kpi_id) -# monitor_kpi_request.monitoring_window_s = 86400 -# monitor_kpi_request.sampling_rate_s = 10 -# events_collector._monitoring_client.MonitorKpi(monitor_kpi_request) - -# time.sleep(0.5) # let other tasks run; do not overload CPU -# else: -# # Terminate is set, looping terminates -# LOGGER.warning("Stopping execution...") - -# events_collector.start() - def main(): global LOGGER # pylint: disable=global-statement @@ -77,21 +48,11 @@ def main(): LOGGER.debug('Starting...') - # Start metrics server - metrics_port = get_metrics_port() - start_http_server(metrics_port) - name_mapping = NameMapping() - # Starting monitoring service - # grpc_service = MonitoringService(name_mapping) - # grpc_service.start() - # start_monitoring(name_mapping) grpc_service = KpiManagerService(name_mapping) grpc_service.start() - # start_kpi_manager(name_mapping) - # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=1.0): pass diff --git a/src/kpi_value_api/service/__main__.py b/src/kpi_value_api/service/__main__.py new file mode 100644 index 000000000..1a8707112 --- /dev/null +++ b/src/kpi_value_api/service/__main__.py @@ -0,0 +1,55 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging, signal, sys, threading, time +from prometheus_client import start_http_server +from common.Settings import get_log_level +from .NameMapping import NameMapping # import updated +from .KpiValueApiService import KpiValueApiService + +terminate = threading.Event() +LOGGER = None + +def signal_handler(signal, frame): # pylint: disable=redefined-outer-name + LOGGER.warning('Terminate signal received') + terminate.set() + +def main(): + global LOGGER # pylint: disable=global-statement + + log_level = get_log_level() + logging.basicConfig(level=log_level) + LOGGER = logging.getLogger(__name__) + + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + + LOGGER.debug('Starting...') + + name_mapping = NameMapping() + + grpc_service = KpiValueApiService(name_mapping) + grpc_service.start() + + # Wait for Ctrl+C or termination signal + while not terminate.wait(timeout=1.0): pass + + LOGGER.debug('Terminating...') + grpc_service.stop() + + LOGGER.debug('Bye') + return 0 + +if __name__ == '__main__': + sys.exit(main()) diff --git a/src/kpi_value_writer/service/__main__.py b/src/kpi_value_writer/service/__main__.py index 9085bc468..3e1d8989f 100644 --- a/src/kpi_value_writer/service/__main__.py +++ b/src/kpi_value_writer/service/__main__.py @@ -12,16 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, signal, sys, threading, time +import logging, signal, sys, threading from prometheus_client import start_http_server -from common.Constants import ServiceNameEnum -from common.Settings import ( - ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_log_level, get_metrics_port, - wait_for_environment_variables) -from common.proto import monitoring_pb2 -from monitoring.service.EventTools import EventsDeviceCollector # import updated -from monitoring.service.NameMapping import NameMapping # import updated -from .KpiManagerService import KpiManagerService +from .NameMapping import NameMapping # import updated +from .KpiValueWriter import KpiValueWriter +from common.Settings import get_log_level, get_metrics_port terminate = threading.Event() LOGGER = None @@ -30,35 +25,6 @@ def signal_handler(signal, frame): # pylint: disable=redefined-outer-name LOGGER.warning('Terminate signal received') terminate.set() -def start_kpi_manager(name_mapping : NameMapping): - LOGGER.info('Start Monitoring...',) - - events_collector = EventsDeviceCollector(name_mapping) - events_collector.start() - - # TODO: redesign this method to be more clear and clean - - # Iterate while terminate is not set - while not terminate.is_set(): - list_new_kpi_ids = events_collector.listen_events() - - # Monitor Kpis - if bool(list_new_kpi_ids): - for kpi_id in list_new_kpi_ids: - # Create Monitor Kpi Requests - monitor_kpi_request = monitoring_pb2.MonitorKpiRequest() - monitor_kpi_request.kpi_id.CopyFrom(kpi_id) - monitor_kpi_request.monitoring_window_s = 86400 - monitor_kpi_request.sampling_rate_s = 10 - events_collector._monitoring_client.MonitorKpi(monitor_kpi_request) - - time.sleep(0.5) # let other tasks run; do not overload CPU - else: - # Terminate is set, looping terminates - LOGGER.warning("Stopping execution...") - - events_collector.start() - def main(): global LOGGER # pylint: disable=global-statement @@ -66,40 +32,25 @@ def main(): logging.basicConfig(level=log_level) LOGGER = logging.getLogger(__name__) - wait_for_environment_variables([ - get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST ), - get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), - get_env_var_name(ServiceNameEnum.DEVICE, ENVVAR_SUFIX_SERVICE_HOST ), - get_env_var_name(ServiceNameEnum.DEVICE, ENVVAR_SUFIX_SERVICE_PORT_GRPC), - ]) - signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) - LOGGER.info('Starting...') + LOGGER.debug('Starting...') - # Start metrics server - metrics_port = get_metrics_port() - start_http_server(metrics_port) + start_http_server(get_metrics_port) # add Prometheus client port name_mapping = NameMapping() - # Starting monitoring service - # grpc_service = MonitoringService(name_mapping) - # grpc_service.start() - # start_monitoring(name_mapping) - grpc_service = KpiManagerService(name_mapping) + grpc_service = KpiValueWriter(name_mapping) grpc_service.start() - start_kpi_manager(name_mapping) - # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=1.0): pass - LOGGER.info('Terminating...') + LOGGER.debug('Terminating...') grpc_service.stop() - LOGGER.info('Bye') + LOGGER.debug('Bye') return 0 if __name__ == '__main__': -- GitLab From 9a86eaed0602b2dfb07ca47a629174d896714b98 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 24 Jul 2024 16:53:18 +0000 Subject: [PATCH 378/602] Pre-merge cleanup --- src/monitoring/client/MonitoringClient.py | 5 +- src/monitoring/requirements.in | 12 --- .../service/MonitoringServiceServicerImpl.py | 5 +- src/monitoring/tests/Messages.py | 102 +++++++++--------- 4 files changed, 55 insertions(+), 69 deletions(-) diff --git a/src/monitoring/client/MonitoringClient.py b/src/monitoring/client/MonitoringClient.py index b66a8061e..994cede8e 100644 --- a/src/monitoring/client/MonitoringClient.py +++ b/src/monitoring/client/MonitoringClient.py @@ -20,9 +20,8 @@ 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.monitoring_pb2 import Kpi, MonitorKpiRequest, \ - KpiQuery, KpiList, SubsDescriptor, SubscriptionID, SubsList, \ +from common.proto.monitoring_pb2 import Kpi, KpiDescriptor, KpiId, MonitorKpiRequest, \ + KpiDescriptorList, KpiQuery, KpiList, SubsDescriptor, SubscriptionID, SubsList, \ SubsResponse, AlarmDescriptor, AlarmID, AlarmList, AlarmResponse, AlarmSubscription, RawKpiTable from common.proto.monitoring_pb2_grpc import MonitoringServiceStub diff --git a/src/monitoring/requirements.in b/src/monitoring/requirements.in index 38364eb7c..3b67c00ee 100644 --- a/src/monitoring/requirements.in +++ b/src/monitoring/requirements.in @@ -32,15 +32,3 @@ requests==2.27.1 xmltodict==0.12.0 questdb==1.0.1 psycopg2-binary==2.9.3 -coverage==6.3 -grpcio==1.47.* -grpcio-health-checking==1.47.* -grpcio-tools==1.47.* -grpclib==0.4.4 -prettytable==3.5.0 -prometheus-client==0.13.0 -protobuf==3.20.* -pytest==6.2.5 -pytest-benchmark==3.4.1 -python-dateutil==2.8.2 -pytest-depends==1.0.1 diff --git a/src/monitoring/service/MonitoringServiceServicerImpl.py b/src/monitoring/service/MonitoringServiceServicerImpl.py index 970ae37cb..a883ab3c4 100644 --- a/src/monitoring/service/MonitoringServiceServicerImpl.py +++ b/src/monitoring/service/MonitoringServiceServicerImpl.py @@ -20,8 +20,8 @@ from common.proto.context_pb2 import Empty from common.proto.device_pb2 import MonitoringSettings from common.proto.kpi_sample_types_pb2 import KpiSampleType from common.proto.monitoring_pb2_grpc import MonitoringServiceServicer -from common.proto.monitoring_pb2 import AlarmResponse, AlarmDescriptor, AlarmList, SubsList, \ - KpiQuery, SubsDescriptor, SubscriptionID, AlarmID, KpiList,\ +from common.proto.monitoring_pb2 import AlarmResponse, AlarmDescriptor, AlarmList, SubsList, KpiId, \ + KpiDescriptor, KpiList, KpiQuery, SubsDescriptor, SubscriptionID, AlarmID, KpiDescriptorList, \ MonitorKpiRequest, Kpi, AlarmSubscription, SubsResponse, RawKpiTable, RawKpi, RawKpiList from common.tools.timestamp.Converters import timestamp_string_to_float, timestamp_utcnow_to_float from device.client.DeviceClient import DeviceClient @@ -30,7 +30,6 @@ from monitoring.service.AlarmManager import AlarmManager from monitoring.service.NameMapping import NameMapping from monitoring.service.SubscriptionManager import SubscriptionManager -from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorList LOGGER = logging.getLogger(__name__) diff --git a/src/monitoring/tests/Messages.py b/src/monitoring/tests/Messages.py index 6b636587b..a6ea6f74a 100644 --- a/src/monitoring/tests/Messages.py +++ b/src/monitoring/tests/Messages.py @@ -17,54 +17,54 @@ from common.proto import monitoring_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType from common.tools.timestamp.Converters import timestamp_utcnow_to_float -# def kpi_id(): -# _kpi_id = monitoring_pb2.KpiId() -# _kpi_id.kpi_id.uuid = str(1) # pylint: disable=maybe-no-member -# return _kpi_id - -# def create_kpi_request(kpi_id_str): -# _create_kpi_request = monitoring_pb2.KpiDescriptor() -# _create_kpi_request.kpi_description = 'KPI Description Test' -# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED -# _create_kpi_request.device_id.device_uuid.uuid = 'DEV' + str(kpi_id_str) -# _create_kpi_request.service_id.service_uuid.uuid = 'SERV' + str(kpi_id_str) -# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC' + str(kpi_id_str) -# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END' + str(kpi_id_str) -# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON' + str(kpi_id_str) -# return _create_kpi_request - -# def create_kpi_request_b(): -# _create_kpi_request = monitoring_pb2.KpiDescriptor() -# _create_kpi_request.kpi_description = 'KPI Description Test' -# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED -# _create_kpi_request.device_id.device_uuid.uuid = 'DEV2' # pylint: disable=maybe-no-member -# _create_kpi_request.service_id.service_uuid.uuid = 'SERV2' # pylint: disable=maybe-no-member -# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC2' # pylint: disable=maybe-no-member -# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END2' # pylint: disable=maybe-no-member -# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2' # pylint: disable=maybe-no-member -# return _create_kpi_request - -# def create_kpi_request_c(): -# _create_kpi_request = monitoring_pb2.KpiDescriptor() -# _create_kpi_request.kpi_description = 'KPI Description Test' -# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED -# _create_kpi_request.device_id.device_uuid.uuid = 'DEV3' # pylint: disable=maybe-no-member -# _create_kpi_request.service_id.service_uuid.uuid = 'SERV3' # pylint: disable=maybe-no-member -# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC3' # pylint: disable=maybe-no-member -# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END3' # pylint: disable=maybe-no-member -# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON3' # pylint: disable=maybe-no-member -# return _create_kpi_request - -# def create_kpi_request_d(): -# _create_kpi_request = monitoring_pb2.KpiDescriptor() -# _create_kpi_request.kpi_description = 'KPI Description Test' -# _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED -# _create_kpi_request.device_id.device_uuid.uuid = 'DEV4' # pylint: disable=maybe-no-member -# _create_kpi_request.service_id.service_uuid.uuid = 'SERV4' # pylint: disable=maybe-no-member -# _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC4' # pylint: disable=maybe-no-member -# _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END4' # pylint: disable=maybe-no-member -# _create_kpi_request.connection_id.connection_uuid.uuid = 'CON4' # pylint: disable=maybe-no-member -# return _create_kpi_request +def kpi_id(): + _kpi_id = monitoring_pb2.KpiId() + _kpi_id.kpi_id.uuid = str(1) # pylint: disable=maybe-no-member + return _kpi_id + +def create_kpi_request(kpi_id_str): + _create_kpi_request = monitoring_pb2.KpiDescriptor() + _create_kpi_request.kpi_description = 'KPI Description Test' + _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED + _create_kpi_request.device_id.device_uuid.uuid = 'DEV' + str(kpi_id_str) + _create_kpi_request.service_id.service_uuid.uuid = 'SERV' + str(kpi_id_str) + _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC' + str(kpi_id_str) + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END' + str(kpi_id_str) + _create_kpi_request.connection_id.connection_uuid.uuid = 'CON' + str(kpi_id_str) + return _create_kpi_request + +def create_kpi_request_b(): + _create_kpi_request = monitoring_pb2.KpiDescriptor() + _create_kpi_request.kpi_description = 'KPI Description Test' + _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED + _create_kpi_request.device_id.device_uuid.uuid = 'DEV2' # pylint: disable=maybe-no-member + _create_kpi_request.service_id.service_uuid.uuid = 'SERV2' # pylint: disable=maybe-no-member + _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC2' # pylint: disable=maybe-no-member + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END2' # pylint: disable=maybe-no-member + _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2' # pylint: disable=maybe-no-member + return _create_kpi_request + +def create_kpi_request_c(): + _create_kpi_request = monitoring_pb2.KpiDescriptor() + _create_kpi_request.kpi_description = 'KPI Description Test' + _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED + _create_kpi_request.device_id.device_uuid.uuid = 'DEV3' # pylint: disable=maybe-no-member + _create_kpi_request.service_id.service_uuid.uuid = 'SERV3' # pylint: disable=maybe-no-member + _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC3' # pylint: disable=maybe-no-member + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END3' # pylint: disable=maybe-no-member + _create_kpi_request.connection_id.connection_uuid.uuid = 'CON3' # pylint: disable=maybe-no-member + return _create_kpi_request + +def create_kpi_request_d(): + _create_kpi_request = monitoring_pb2.KpiDescriptor() + _create_kpi_request.kpi_description = 'KPI Description Test' + _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED + _create_kpi_request.device_id.device_uuid.uuid = 'DEV4' # pylint: disable=maybe-no-member + _create_kpi_request.service_id.service_uuid.uuid = 'SERV4' # pylint: disable=maybe-no-member + _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC4' # pylint: disable=maybe-no-member + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END4' # pylint: disable=maybe-no-member + _create_kpi_request.connection_id.connection_uuid.uuid = 'CON4' # pylint: disable=maybe-no-member + return _create_kpi_request def monitor_kpi_request(kpi_uuid, monitoring_window_s, sampling_rate_s): _monitor_kpi_request = monitoring_pb2.MonitorKpiRequest() @@ -80,10 +80,10 @@ def include_kpi_request(kpi_id): _include_kpi_request.kpi_value.floatVal = 500*random() # pylint: disable=maybe-no-member return _include_kpi_request -# def kpi_descriptor_list(): -# _kpi_descriptor_list = monitoring_pb2.KpiDescriptorList() +def kpi_descriptor_list(): + _kpi_descriptor_list = monitoring_pb2.KpiDescriptorList() -# return _kpi_descriptor_list + return _kpi_descriptor_list def kpi_query(kpi_id_list): _kpi_query = monitoring_pb2.KpiQuery() -- GitLab From 079aec5a5a31c924b85b558fb5a04df3249b1745 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 24 Jul 2024 16:54:44 +0000 Subject: [PATCH 379/602] Pre-merge cleanup --- src/monitoring/service/MonitoringServiceServicerImpl.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/monitoring/service/MonitoringServiceServicerImpl.py b/src/monitoring/service/MonitoringServiceServicerImpl.py index a883ab3c4..e70259691 100644 --- a/src/monitoring/service/MonitoringServiceServicerImpl.py +++ b/src/monitoring/service/MonitoringServiceServicerImpl.py @@ -30,7 +30,6 @@ from monitoring.service.AlarmManager import AlarmManager from monitoring.service.NameMapping import NameMapping from monitoring.service.SubscriptionManager import SubscriptionManager - LOGGER = logging.getLogger(__name__) METRICSDB_HOSTNAME = os.environ.get("METRICSDB_HOSTNAME") -- GitLab From 1b88637a7f54a07d19ab006e57dc76d29301a817 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 24 Jul 2024 17:01:21 +0000 Subject: [PATCH 380/602] Pre-merge cleanup --- deploy/all.sh | 7 +++++-- install_requirements.sh | 2 +- my_deploy.sh | 7 +++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/deploy/all.sh b/deploy/all.sh index 4b644cf11..f93cd92ac 100755 --- a/deploy/all.sh +++ b/deploy/all.sh @@ -29,8 +29,11 @@ export TFS_REGISTRY_IMAGES=${TFS_REGISTRY_IMAGES:-"http://localhost:32000/tfs/"} # By default, only basic components are deployed export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device pathcomp service slice nbi webui load_generator"} -# Uncomment to activate Monitoring -#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring kpi_manager" +# Uncomment to activate Monitoring (old) +#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" + +# Uncomment to activate Monitoring Framework (new) +#export TFS_COMPONENTS="${TFS_COMPONENTS} kpi_manager kpi_value_writer kpi_value_api" # Uncomment to activate BGP-LS Speaker #export TFS_COMPONENTS="${TFS_COMPONENTS} bgpls_speaker" diff --git a/install_requirements.sh b/install_requirements.sh index f1ae278c6..54b660a52 100755 --- a/install_requirements.sh +++ b/install_requirements.sh @@ -22,7 +22,7 @@ ALL_COMPONENTS="context device service nbi monitoring webui interdomain slice" ALL_COMPONENTS="${ALL_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector" ALL_COMPONENTS="${ALL_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector l3_distributedattackdetector" -ALL_COMPONENTS="${ALL_COMPONENTS} kpi_manager" +ALL_COMPONENTS="${ALL_COMPONENTS} kpi_manager kpi_value_writer kpi_value_api" TFS_COMPONENTS=${TFS_COMPONENTS:-$ALL_COMPONENTS} # Some components require libyang built from source code diff --git a/my_deploy.sh b/my_deploy.sh index a9468a245..b89df7481 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -22,8 +22,11 @@ export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/" # Set the list of components, separated by spaces, you want to build images for, and deploy. export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_generator" -# Uncomment to activate Monitoring -#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring kpi_manager" +# Uncomment to activate Monitoring (old) +#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" + +# Uncomment to activate Monitoring Framework (new) +#export TFS_COMPONENTS="${TFS_COMPONENTS} kpi_manager kpi_value_writer kpi_value_api" # Uncomment to activate BGP-LS Speaker #export TFS_COMPONENTS="${TFS_COMPONENTS} bgpls_speaker" -- GitLab From f0c99c8df4f1363a1a0f0d5e9f48c52956e3a7cf Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 25 Jul 2024 07:13:29 +0000 Subject: [PATCH 381/602] cleanup for merge --- src/common/tools/kafka/Variables.py | 4 +- src/kpi_manager/README.md | 2 +- src/kpi_manager/client/KpiManagerClient.py | 4 +- src/kpi_manager/database/KpiModel.py | 5 +- src/kpi_manager/database/Kpi_DB.py | 2 +- src/kpi_manager/service/KpiManagerService.py | 5 +- .../service/KpiManagerServiceServicerImpl.py | 8 +- src/kpi_manager/service/NameMapping.py | 46 ------ src/kpi_manager/service/__main__.py | 11 +- src/kpi_manager/tests/test_messages.py | 24 +-- src/kpi_value_api/client/KpiValueApiClient.py | 4 +- .../service/KpiValueApiService.py | 7 +- .../service/KpiValueApiServiceServicerImpl.py | 20 +-- src/kpi_value_api/service/NameMapping.py | 46 ------ src/kpi_value_api/service/__main__.py | 7 +- src/kpi_value_api/tests/messages.py | 2 +- src/kpi_value_api/tests/test_kpi_value_api.py | 11 +- .../service/KpiValueComposer.py | 138 ------------------ .../service/KpiValueWriter.py | 8 - src/kpi_value_writer/service/NameMapping.py | 46 ------ src/kpi_value_writer/service/__main__.py | 7 +- .../tests/test_kpi_composer.py | 31 ---- src/kpi_value_writer/tests/test_messages.py | 15 +- .../tests/test_metric_writer_to_prom.py | 1 - 24 files changed, 47 insertions(+), 407 deletions(-) delete mode 100644 src/kpi_manager/service/NameMapping.py delete mode 100644 src/kpi_value_api/service/NameMapping.py delete mode 100644 src/kpi_value_writer/service/KpiValueComposer.py delete mode 100644 src/kpi_value_writer/service/NameMapping.py delete mode 100644 src/kpi_value_writer/tests/test_kpi_composer.py diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index a6f996932..e01b33896 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -38,7 +38,7 @@ class KafkaTopic(Enum): """ all_topics = [member.value for member in KafkaTopic] if( KafkaTopic.create_new_topic_if_not_exists( all_topics )): - LOGGER.debug("All topics created sucsessfully") + LOGGER.debug("All topics are created sucsessfully") return True else: LOGGER.debug("Error creating all topics") @@ -70,4 +70,4 @@ class KafkaTopic(Enum): return False return True -# create all topics after the deployments (Telemetry and Analytics) \ No newline at end of file +# create all topics after the deployments (Telemetry and Analytics) diff --git a/src/kpi_manager/README.md b/src/kpi_manager/README.md index 72ba6e559..c1feadcc4 100644 --- a/src/kpi_manager/README.md +++ b/src/kpi_manager/README.md @@ -26,4 +26,4 @@ The following requirements should be fulfilled before the execuation of KPI mana 4. Call `SelectKpiDescriptor(KpiDescriptorFilter)->KpiDescriptorList` to get all `KpiDescriptor` objects that matches the filter criteria. `KpiDescriptorFilter` and `KpiDescriptorList` are pre-defined gRPC message types. ## For KPI composer and KPI writer -The functionalities of KPI composer and writer is heavily dependent upon Telemetery service. Therfore, these services has other pre-requsites that are mention [here](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/telemetry/requirements.in). \ No newline at end of file +The functionalities of KPI composer and writer is heavily dependent upon Telemetery service. Therfore, these services has other pre-requsites that are mention [here](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/telemetry/requirements.in). diff --git a/src/kpi_manager/client/KpiManagerClient.py b/src/kpi_manager/client/KpiManagerClient.py index 0b7979dbb..9e7079ae4 100755 --- a/src/kpi_manager/client/KpiManagerClient.py +++ b/src/kpi_manager/client/KpiManagerClient.py @@ -65,10 +65,8 @@ class KpiManagerClient: @RETRY_DECORATOR def GetKpiDescriptor(self, request : KpiId) -> KpiDescriptor: - print('---> GetKpiDescriptor: {:s}'.format(grpc_message_to_json_string(request))) LOGGER.debug('GetKpiDescriptor: {:s}'.format(grpc_message_to_json_string(request))) response = self.stub.GetKpiDescriptor(request) - print('---> GetKpiDescriptor result: {:s}'.format(grpc_message_to_json_string(response))) LOGGER.debug('GetKpiDescriptor result: {:s}'.format(grpc_message_to_json_string(response))) return response @@ -77,4 +75,4 @@ class KpiManagerClient: LOGGER.debug('SelectKpiDescriptor: {:s}'.format(grpc_message_to_json_string(filter))) response = self.stub.SelectKpiDescriptor(filter) LOGGER.debug('SelectKpiDescriptor result: {:s}'.format(grpc_message_to_json_string(response))) - return response \ No newline at end of file + return response diff --git a/src/kpi_manager/database/KpiModel.py b/src/kpi_manager/database/KpiModel.py index b8794ef68..5c2fdff06 100644 --- a/src/kpi_manager/database/KpiModel.py +++ b/src/kpi_manager/database/KpiModel.py @@ -14,7 +14,7 @@ import logging from sqlalchemy.dialects.postgresql import UUID -from sqlalchemy import Column, Integer, String, Float, Text +from sqlalchemy import Column, Integer, String, Text from sqlalchemy.orm import registry from common.proto.kpi_manager_pb2 import KpiDescriptor @@ -23,7 +23,6 @@ LOGGER = logging.getLogger(__name__) # Create a base class for declarative models Base = registry().generate_base() -# Base = declarative_base() class Kpi(Base): __tablename__ = 'kpi' @@ -82,4 +81,4 @@ class Kpi(Base): response.endpoint_id.endpoint_uuid.uuid = row.endpoint_id response.connection_id.connection_uuid.uuid = row.connection_id response.link_id.link_uuid.uuid = row.link_id - return response \ No newline at end of file + return response diff --git a/src/kpi_manager/database/Kpi_DB.py b/src/kpi_manager/database/Kpi_DB.py index 6ab2c52f6..5b2b586b6 100644 --- a/src/kpi_manager/database/Kpi_DB.py +++ b/src/kpi_manager/database/Kpi_DB.py @@ -151,4 +151,4 @@ class KpiDB: LOGGER.error(f"Error fetching filtered rows from {model.__name__} table with filters {filter_object} ::: {e}") raise OperationFailedException ("Select by filter", extra_details=["unable to apply the filter {:}".format(e)]) finally: - session.close() \ No newline at end of file + session.close() diff --git a/src/kpi_manager/service/KpiManagerService.py b/src/kpi_manager/service/KpiManagerService.py index 6c8c66393..b69a926a9 100755 --- a/src/kpi_manager/service/KpiManagerService.py +++ b/src/kpi_manager/service/KpiManagerService.py @@ -14,17 +14,16 @@ from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc -from .NameMapping import NameMapping from common.tools.service.GenericGrpcService import GenericGrpcService from common.proto.kpi_manager_pb2_grpc import add_KpiManagerServiceServicer_to_server from kpi_manager.service.KpiManagerServiceServicerImpl import KpiManagerServiceServicerImpl class KpiManagerService(GenericGrpcService): - def __init__(self, name_mapping : NameMapping, cls_name: str = __name__) -> None: + def __init__(self, cls_name: str = __name__) -> None: port = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) super().__init__(port, cls_name=cls_name) - self.kpiManagerService_servicer = KpiManagerServiceServicerImpl(name_mapping) + self.kpiManagerService_servicer = KpiManagerServiceServicerImpl() def install_servicers(self): add_KpiManagerServiceServicer_to_server(self.kpiManagerService_servicer, self.server) diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py index 0ac7dd76b..05292fc5b 100644 --- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -14,24 +14,18 @@ import logging, grpc -from typing import List, Set -from sqlalchemy.sql.expression import BinaryExpression 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 .NameMapping import NameMapping from kpi_manager.database.Kpi_DB import KpiDB from kpi_manager.database.KpiModel import Kpi as KpiModel LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('KpiManager', 'NBIgRPC') -class IDNotFoundError(Exception): - ... - class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): - def __init__(self, name_mapping : NameMapping): + def __init__(self): LOGGER.info('Init KpiManagerService') self.kpi_db_obj = KpiDB() diff --git a/src/kpi_manager/service/NameMapping.py b/src/kpi_manager/service/NameMapping.py deleted file mode 100644 index f98e367b1..000000000 --- a/src/kpi_manager/service/NameMapping.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 threading -from typing import Dict, Optional - -class NameMapping: - def __init__(self) -> None: - self.__lock = threading.Lock() - self.__device_to_name : Dict[str, str] = dict() - self.__endpoint_to_name : Dict[str, str] = dict() - - def get_device_name(self, device_uuid : str) -> Optional[str]: - with self.__lock: - return self.__device_to_name.get(device_uuid) - - def get_endpoint_name(self, endpoint_uuid : str) -> Optional[str]: - with self.__lock: - return self.__endpoint_to_name.get(endpoint_uuid) - - def set_device_name(self, device_uuid : str, device_name : str) -> None: - with self.__lock: - self.__device_to_name[device_uuid] = device_name - - def set_endpoint_name(self, endpoint_uuid : str, endpoint_name : str) -> None: - with self.__lock: - self.__endpoint_to_name[endpoint_uuid] = endpoint_name - - def delete_device_name(self, device_uuid : str) -> None: - with self.__lock: - self.__device_to_name.pop(device_uuid, None) - - def delete_endpoint_name(self, endpoint_uuid : str) -> None: - with self.__lock: - self.__endpoint_to_name.pop(endpoint_uuid, None) diff --git a/src/kpi_manager/service/__main__.py b/src/kpi_manager/service/__main__.py index 132a15219..a4884c545 100644 --- a/src/kpi_manager/service/__main__.py +++ b/src/kpi_manager/service/__main__.py @@ -36,21 +36,12 @@ def main(): logging.basicConfig(level=log_level) LOGGER = logging.getLogger(__name__) - wait_for_environment_variables([ - get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST ), - get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), - get_env_var_name(ServiceNameEnum.DEVICE, ENVVAR_SUFIX_SERVICE_HOST ), - get_env_var_name(ServiceNameEnum.DEVICE, ENVVAR_SUFIX_SERVICE_PORT_GRPC), - ]) - signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) LOGGER.debug('Starting...') - name_mapping = NameMapping() - - grpc_service = KpiManagerService(name_mapping) + grpc_service = KpiManagerService() grpc_service.start() # Wait for Ctrl+C or termination signal diff --git a/src/kpi_manager/tests/test_messages.py b/src/kpi_manager/tests/test_messages.py index 6294d1969..870660658 100644 --- a/src/kpi_manager/tests/test_messages.py +++ b/src/kpi_manager/tests/test_messages.py @@ -23,12 +23,12 @@ def create_kpi_descriptor_request(descriptor_name: str = "Test_name"): _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 = 'DEV2' # pylint: disable=maybe-no-member - _create_kpi_request.service_id.service_uuid.uuid = 'SERV2' # 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 + _create_kpi_request.device_id.device_uuid.uuid = 'DEV2' + _create_kpi_request.service_id.service_uuid.uuid = 'SERV2' + _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC1' + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END1' + _create_kpi_request.connection_id.connection_uuid.uuid = 'CON1' + _create_kpi_request.link_id.link_uuid.uuid = 'LNK1' return _create_kpi_request def create_kpi_descriptor_request_a(description: str = "Test Description"): @@ -36,12 +36,12 @@ def create_kpi_descriptor_request_a(description: str = "Test Description"): _create_kpi_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) _create_kpi_request.kpi_description = description _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED - _create_kpi_request.device_id.device_uuid.uuid = 'DEV4' # pylint: disable=maybe-no-member - _create_kpi_request.service_id.service_uuid.uuid = 'SERV3' # pylint: disable=maybe-no-member - _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC3' # pylint: disable=maybe-no-member - _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END2' # pylint: disable=maybe-no-member - _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2' # pylint: disable=maybe-no-member - _create_kpi_request.link_id.link_uuid.uuid = 'LNK2' # pylint: disable=maybe-no-member + _create_kpi_request.device_id.device_uuid.uuid = 'DEV4' + _create_kpi_request.service_id.service_uuid.uuid = 'SERV3' + _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC3' + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END2' + _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2' + _create_kpi_request.link_id.link_uuid.uuid = 'LNK2' return _create_kpi_request def create_kpi_filter_request(): diff --git a/src/kpi_value_api/client/KpiValueApiClient.py b/src/kpi_value_api/client/KpiValueApiClient.py index adf17da5d..f432271cf 100644 --- a/src/kpi_value_api/client/KpiValueApiClient.py +++ b/src/kpi_value_api/client/KpiValueApiClient.py @@ -20,7 +20,7 @@ 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_value_api_pb2 import KpiValue, KpiValueList, KpiValueType, KpiValueFilter +from common.proto.kpi_value_api_pb2 import KpiValueList, KpiValueFilter from common.proto.kpi_value_api_pb2_grpc import KpiValueAPIServiceStub LOGGER = logging.getLogger(__name__) @@ -60,4 +60,4 @@ class KpiValueApiClient: LOGGER.debug('SelectKpiValues: {:s}'.format(grpc_message_to_json_string(request))) response = self.stub.SelectKpiValues(request) LOGGER.debug('SelectKpiValues result: {:s}'.format(grpc_message_to_json_string(response))) - return response \ No newline at end of file + return response diff --git a/src/kpi_value_api/service/KpiValueApiService.py b/src/kpi_value_api/service/KpiValueApiService.py index 2fb24aaac..68b6fbdc2 100644 --- a/src/kpi_value_api/service/KpiValueApiService.py +++ b/src/kpi_value_api/service/KpiValueApiService.py @@ -13,7 +13,6 @@ # limitations under the License. -from .NameMapping import NameMapping from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc from common.tools.service.GenericGrpcService import GenericGrpcService @@ -22,10 +21,10 @@ from common.proto.kpi_value_api_pb2_grpc import add_KpiValueAPIServiceServicer_t class KpiValueApiService(GenericGrpcService): - def __init__(self, name_mapping : NameMapping, cls_name : str = __name__ ) -> None: + def __init__(self, cls_name : str = __name__ ) -> None: port = get_service_port_grpc(ServiceNameEnum.KPIVALUEAPI) super().__init__(port, cls_name=cls_name) - self.kpiValueApiService_servicer = KpiValueApiServiceServicerImpl(name_mapping) + self.kpiValueApiService_servicer = KpiValueApiServiceServicerImpl() def install_servicers(self): - add_KpiValueAPIServiceServicer_to_server(self.kpiValueApiService_servicer, self.server) \ No newline at end of file + add_KpiValueAPIServiceServicer_to_server(self.kpiValueApiService_servicer, self.server) diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index 3ecf20c08..d27de54f3 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -12,8 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, grpc, json, requests -from typing import Tuple, Any, List, Dict +import logging, grpc, requests +from typing import Tuple, Any from datetime import datetime from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.tools.kafka.Variables import KafkaConfig, KafkaTopic @@ -24,41 +24,35 @@ from common.proto.kpi_value_api_pb2 import KpiValueList, KpiValueFilter, KpiValu from confluent_kafka import Producer as KafkaProducer -from .NameMapping import NameMapping - LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('KpiValueAPI', 'NBIgRPC') PROM_URL = "http://localhost:9090" class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): - def __init__(self, name_mapping : NameMapping): + def __init__(self): LOGGER.debug('Init KpiValueApiService') @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StoreKpiValues(self, request: KpiValueList, grpc_context: grpc.ServicerContext ) -> Empty: LOGGER.debug('StoreKpiValues: Received gRPC message object: {:}'.format(request)) - producer_obj = KafkaProducer({ 'bootstrap.servers' : KafkaConfig.SERVER_IP.value }) - for kpi_value in request.kpi_value_list: kpi_value_to_produce : Tuple [str, Any, Any] = ( - kpi_value.kpi_id.kpi_id, # kpi_value.kpi_id.kpi_id.uuid - kpi_value.timestamp, # kpi_value.timestamp.timestamp + kpi_value.kpi_id.kpi_id, + kpi_value.timestamp, kpi_value.kpi_value_type # kpi_value.kpi_value_type.(many options) how? ) LOGGER.debug('KPI to produce is {:}'.format(kpi_value_to_produce)) msg_key = "gRPC-kpivalueapi" # str(__class__.__name__) can be used - # write this KPI to Kafka producer_obj.produce( KafkaTopic.VALUE.value, - key = msg_key, - # value = json.dumps(kpi_value_to_produce), - value = kpi_value.SerializeToString(), + key = msg_key, + value = kpi_value.SerializeToString(), # value = json.dumps(kpi_value_to_produce), callback = self.delivery_callback ) producer_obj.flush() diff --git a/src/kpi_value_api/service/NameMapping.py b/src/kpi_value_api/service/NameMapping.py deleted file mode 100644 index f98e367b1..000000000 --- a/src/kpi_value_api/service/NameMapping.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 threading -from typing import Dict, Optional - -class NameMapping: - def __init__(self) -> None: - self.__lock = threading.Lock() - self.__device_to_name : Dict[str, str] = dict() - self.__endpoint_to_name : Dict[str, str] = dict() - - def get_device_name(self, device_uuid : str) -> Optional[str]: - with self.__lock: - return self.__device_to_name.get(device_uuid) - - def get_endpoint_name(self, endpoint_uuid : str) -> Optional[str]: - with self.__lock: - return self.__endpoint_to_name.get(endpoint_uuid) - - def set_device_name(self, device_uuid : str, device_name : str) -> None: - with self.__lock: - self.__device_to_name[device_uuid] = device_name - - def set_endpoint_name(self, endpoint_uuid : str, endpoint_name : str) -> None: - with self.__lock: - self.__endpoint_to_name[endpoint_uuid] = endpoint_name - - def delete_device_name(self, device_uuid : str) -> None: - with self.__lock: - self.__device_to_name.pop(device_uuid, None) - - def delete_endpoint_name(self, endpoint_uuid : str) -> None: - with self.__lock: - self.__endpoint_to_name.pop(endpoint_uuid, None) diff --git a/src/kpi_value_api/service/__main__.py b/src/kpi_value_api/service/__main__.py index 1a8707112..8b4ebe296 100644 --- a/src/kpi_value_api/service/__main__.py +++ b/src/kpi_value_api/service/__main__.py @@ -12,10 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, signal, sys, threading, time +import logging, signal, sys, threading from prometheus_client import start_http_server from common.Settings import get_log_level -from .NameMapping import NameMapping # import updated from .KpiValueApiService import KpiValueApiService terminate = threading.Event() @@ -37,9 +36,7 @@ def main(): LOGGER.debug('Starting...') - name_mapping = NameMapping() - - grpc_service = KpiValueApiService(name_mapping) + grpc_service = KpiValueApiService() grpc_service.start() # Wait for Ctrl+C or termination signal diff --git a/src/kpi_value_api/tests/messages.py b/src/kpi_value_api/tests/messages.py index fc883db1f..c2a1cbb0b 100644 --- a/src/kpi_value_api/tests/messages.py +++ b/src/kpi_value_api/tests/messages.py @@ -32,4 +32,4 @@ def create_kpi_value_list(): _create_kpi_value_list.kpi_value_list.append(kpi_value_object) - return _create_kpi_value_list \ No newline at end of file + return _create_kpi_value_list diff --git a/src/kpi_value_api/tests/test_kpi_value_api.py b/src/kpi_value_api/tests/test_kpi_value_api.py index 6c2858659..307b5cdad 100644 --- a/src/kpi_value_api/tests/test_kpi_value_api.py +++ b/src/kpi_value_api/tests/test_kpi_value_api.py @@ -14,35 +14,28 @@ import os, logging, pytest - from common.proto.context_pb2 import Empty from common.Constants import ServiceNameEnum from common.tools.kafka.Variables import KafkaTopic from common.Settings import ( ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_service_port_grpc) - - -from kpi_value_api.service.NameMapping import NameMapping from kpi_value_api.service.KpiValueApiService import KpiValueApiService from kpi_value_api.client.KpiValueApiClient import KpiValueApiClient from kpi_value_api.tests.messages import create_kpi_value_list LOCAL_HOST = '127.0.0.1' - KPIVALUEAPI_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.KPIVALUEAPI) # type: ignore os.environ[get_env_var_name(ServiceNameEnum.KPIVALUEAPI, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) os.environ[get_env_var_name(ServiceNameEnum.KPIVALUEAPI, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(KPIVALUEAPI_SERVICE_PORT) - LOGGER = logging.getLogger(__name__) # This fixture will be requested by test cases and last during testing session @pytest.fixture(scope='session') def kpi_value_api_service(): LOGGER.info('Initializing KpiValueApiService...') - name_mapping = NameMapping() # _service = MonitoringService(name_mapping) - _service = KpiValueApiService(name_mapping) + _service = KpiValueApiService() _service.start() # yield the server, when test finishes, execution will resume to stop it @@ -85,9 +78,7 @@ def test_validate_kafka_topics(): response = KafkaTopic.create_all_topics() assert isinstance(response, bool) - def test_store_kpi_values(kpi_value_api_client): LOGGER.debug(" >>> test_set_list_of_KPIs: START <<< ") response = kpi_value_api_client.StoreKpiValues(create_kpi_value_list()) assert isinstance(response, Empty) - diff --git a/src/kpi_value_writer/service/KpiValueComposer.py b/src/kpi_value_writer/service/KpiValueComposer.py deleted file mode 100644 index e2f315eda..000000000 --- a/src/kpi_value_writer/service/KpiValueComposer.py +++ /dev/null @@ -1,138 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. - -# read Kafka stream from Kafka topic - -import re -import logging -import threading -from confluent_kafka import KafkaError -from confluent_kafka import Producer as KafkaProducer -from confluent_kafka import Consumer as KafkaConsumer -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' -KAFKA_SERVER_IP = '127.0.0.1:9092' -# ADMIN_KAFKA_CLIENT = AdminClient({'bootstrap.servers': KAFKA_SERVER_IP}) -KAFKA_TOPICS = {'request' : 'topic_request', 'response': 'topic_response', - 'raw' : 'topic_raw' , 'labeled' : 'topic_labeled'} -PRODUCER_CONFIG = {'bootstrap.servers': KAFKA_SERVER_IP,} -CONSUMER_CONFIG = {'bootstrap.servers' : KAFKA_SERVER_IP, - 'group.id' : 'kpi_composer', - 'auto.offset.reset' : 'latest'} -KPIs_TO_SEARCH = ["node_network_receive_packets_total", - "node_network_receive_bytes_total", - "node_network_transmit_bytes_total", - "process_open_fds"] -DB_TABLE_NAME = KpiModel - -class KpiValueComposer: - def __init__(self) -> None: - pass - - @staticmethod - def compose_kpi(): - threading.Thread(target=KpiValueComposer.kafka_listener, args=()).start() - - @staticmethod - def kafka_listener(): - """ - listener for events on Kafka topic. - """ - kafka_consumer = KafkaConsumer(CONSUMER_CONFIG) - kafka_consumer.subscribe([KAFKA_TOPICS['raw']]) - while True: - receive_msg = kafka_consumer.poll(2.0) - if receive_msg is None: - # print (" - Telemetry frontend listening on Kafka Topic: ", KAFKA_TOPICS['raw']) # added for debugging purposes - continue - elif receive_msg.error(): - if receive_msg.error().code() == KafkaError._PARTITION_EOF: - continue - else: - print("Consumer error: {}".format(receive_msg.error())) - continue - try: - new_event = receive_msg.value().decode('utf-8') - KpiValueComposer.process_event_and_label_kpi(new_event) - except Exception as e: - print(f"Error to consume event from topic: {KAFKA_TOPICS['raw']}. Error detail: {str(e)}") - continue - - @staticmethod - def process_event_and_label_kpi(event): - pattern = re.compile("|".join(map(re.escape, KPIs_TO_SEARCH))) - lines = event.split('\n') - # matching_rows = [] - sub_names = kpi_value = "" - for line in lines: - try: - if pattern.search(line) and not line.startswith("# HELP") and not line.startswith("# TYPE") and not 'device="lo"' in line: - (kpi_name, kpi_value) = line.split(" ") - if kpi_name.endswith('}'): - (kpi_name, sub_names) = kpi_name.replace('}','').split('{') - print("Received KPI from raw topic: {:}".format((kpi_name, sub_names, kpi_value))) - kpi_descriptor = KpiValueComposer.request_kpi_descriptor_from_db(kpi_name) - if kpi_descriptor is not None: - kpi_to_produce = KpiValueComposer.merge_kpi_descriptor_and_value(kpi_descriptor, kpi_value) - producerObj = KafkaProducer(PRODUCER_CONFIG) - producerObj.produce(KAFKA_TOPICS['labeled'], key="labeled", value= str(kpi_to_produce), callback=KpiValueComposer.delivery_callback) - producerObj.flush() - else: - print ("No matching of KPI ({:}) found in db".format(kpi_name)) - except Exception as e: - print("Unable to extract kpi name and value from raw data: ERROR Info: {:}".format(e)) - - @staticmethod - def request_kpi_descriptor_from_db(kpi_name: str = KPIs_TO_SEARCH[0]): # = KPIs_TO_SEARCH[0] is added for testing - col_name = "kpi_description" - kpiDBobj = Kpi_DB() - row = kpiDBobj.search_db_row_by_id(DB_TABLE_NAME, col_name, kpi_name) - if row is not None: - LOGGER.info("Extracted Row: {:}".format(row)) - return row - else: - return None - - @staticmethod - def merge_kpi_descriptor_and_value(kpi_descriptor, kpi_value): - # Creating a dictionary from the kpi_descriptor's attributes - kpi_dict = { - 'kpi_id' : kpi_descriptor.kpi_id, - 'kpi_description': kpi_descriptor.kpi_description, - 'kpi_sample_type': kpi_descriptor.kpi_sample_type, - 'device_id' : kpi_descriptor.device_id, - 'endpoint_id' : kpi_descriptor.endpoint_id, - 'service_id' : kpi_descriptor.service_id, - 'slice_id' : kpi_descriptor.slice_id, - 'connection_id' : kpi_descriptor.connection_id, - 'link_id' : kpi_descriptor.link_id, - 'kpi_value' : kpi_value - } - return kpi_dict - - @staticmethod - def delivery_callback( err, msg): - """ - Callback function to handle message delivery status. - Args: - err (KafkaError): Kafka error object. - msg (Message): Kafka message object. - """ - if err: - print(f'Message delivery failed: {err}') - else: - print(f'Message delivered to topic {msg.topic()}') \ No newline at end of file diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index 73dd0a20b..aa0f2cf79 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -12,23 +12,16 @@ # See the License for the specific language governing permissions and # limitations under the License. -import grpc -import json import logging import threading from common.tools.kafka.Variables import KafkaConfig, KafkaTopic - from common.proto.kpi_value_api_pb2 import KpiValue from common.proto.kpi_manager_pb2 import KpiDescriptor, KpiId -from common.proto.kpi_manager_pb2_grpc import KpiManagerServiceStub from confluent_kafka import KafkaError from confluent_kafka import Consumer as KafkaConsumer from kpi_manager.client.KpiManagerClient import KpiManagerClient -from monitoring.service.NameMapping import NameMapping -from kpi_manager.service.KpiManagerService import KpiManagerService - # -- test import -- from kpi_value_writer.tests.test_messages import create_kpi_descriptor_request from .MetricWriterToPrometheus import MetricWriterToPrometheus @@ -38,7 +31,6 @@ LOGGER = logging.getLogger(__name__) ACTIVE_CONSUMERS = [] class KpiValueWriter: - @staticmethod def RunKafkaConsumer(): thread = threading.Thread(target=KpiValueWriter.KafkaConsumer, args=()) diff --git a/src/kpi_value_writer/service/NameMapping.py b/src/kpi_value_writer/service/NameMapping.py deleted file mode 100644 index f98e367b1..000000000 --- a/src/kpi_value_writer/service/NameMapping.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 threading -from typing import Dict, Optional - -class NameMapping: - def __init__(self) -> None: - self.__lock = threading.Lock() - self.__device_to_name : Dict[str, str] = dict() - self.__endpoint_to_name : Dict[str, str] = dict() - - def get_device_name(self, device_uuid : str) -> Optional[str]: - with self.__lock: - return self.__device_to_name.get(device_uuid) - - def get_endpoint_name(self, endpoint_uuid : str) -> Optional[str]: - with self.__lock: - return self.__endpoint_to_name.get(endpoint_uuid) - - def set_device_name(self, device_uuid : str, device_name : str) -> None: - with self.__lock: - self.__device_to_name[device_uuid] = device_name - - def set_endpoint_name(self, endpoint_uuid : str, endpoint_name : str) -> None: - with self.__lock: - self.__endpoint_to_name[endpoint_uuid] = endpoint_name - - def delete_device_name(self, device_uuid : str) -> None: - with self.__lock: - self.__device_to_name.pop(device_uuid, None) - - def delete_endpoint_name(self, endpoint_uuid : str) -> None: - with self.__lock: - self.__endpoint_to_name.pop(endpoint_uuid, None) diff --git a/src/kpi_value_writer/service/__main__.py b/src/kpi_value_writer/service/__main__.py index 3e1d8989f..028585575 100644 --- a/src/kpi_value_writer/service/__main__.py +++ b/src/kpi_value_writer/service/__main__.py @@ -14,7 +14,6 @@ import logging, signal, sys, threading from prometheus_client import start_http_server -from .NameMapping import NameMapping # import updated from .KpiValueWriter import KpiValueWriter from common.Settings import get_log_level, get_metrics_port @@ -37,11 +36,7 @@ def main(): LOGGER.debug('Starting...') - start_http_server(get_metrics_port) # add Prometheus client port - - name_mapping = NameMapping() - - grpc_service = KpiValueWriter(name_mapping) + grpc_service = KpiValueWriter() grpc_service.start() # Wait for Ctrl+C or termination signal diff --git a/src/kpi_value_writer/tests/test_kpi_composer.py b/src/kpi_value_writer/tests/test_kpi_composer.py deleted file mode 100644 index fa75ba2ab..000000000 --- a/src/kpi_value_writer/tests/test_kpi_composer.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 threading -import logging -from kpi_manager.service.KpiValueComposer import KpiValueComposer - -LOGGER = logging.getLogger(__name__) - -def test_compose_kpi(): - LOGGER.info(' >>> test_compose_kpi START <<< ') - KpiValueComposer.compose_kpi() - -# def test_request_kpi_descriptor_from_db(): -# LOGGER.info(' >>> test_request_kpi_descriptor_from_db START <<< ') -# KpiValueComposer.request_kpi_descriptor_from_db() - -# def test_delete_kpi_by_id(): -# LOGGER.info(' >>> test_test_delete_kpi_by_id START <<< ') -# KpiValueComposer.delete_kpi_by_id() \ No newline at end of file diff --git a/src/kpi_value_writer/tests/test_messages.py b/src/kpi_value_writer/tests/test_messages.py index 64add9a63..89a41fa08 100755 --- a/src/kpi_value_writer/tests/test_messages.py +++ b/src/kpi_value_writer/tests/test_messages.py @@ -23,18 +23,17 @@ def create_kpi_id_request(): _create_kpi_id.kpi_id.uuid = str(uuid.uuid4()) return _create_kpi_id - def create_kpi_descriptor_request(description: str = "Test Description"): _create_kpi_request = kpi_manager_pb2.KpiDescriptor() _create_kpi_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) _create_kpi_request.kpi_description = description _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED - _create_kpi_request.device_id.device_uuid.uuid = 'DEV4' # pylint: disable=maybe-no-member - _create_kpi_request.service_id.service_uuid.uuid = 'SERV3' # pylint: disable=maybe-no-member - _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC3' # pylint: disable=maybe-no-member - _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END2' # pylint: disable=maybe-no-member - _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2' # pylint: disable=maybe-no-member - _create_kpi_request.link_id.link_uuid.uuid = 'LNK2' # pylint: disable=maybe-no-member + _create_kpi_request.device_id.device_uuid.uuid = 'DEV4' + _create_kpi_request.service_id.service_uuid.uuid = 'SERV3' + _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC3' + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END2' + _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2' + _create_kpi_request.link_id.link_uuid.uuid = 'LNK2' return _create_kpi_request def create_kpi_value_request(): @@ -42,4 +41,4 @@ def create_kpi_value_request(): _create_kpi_value_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) _create_kpi_value_request.timestamp.timestamp = time.time() _create_kpi_value_request.kpi_value_type.floatVal = random.randint(10, 10000) - return _create_kpi_value_request \ No newline at end of file + return _create_kpi_value_request diff --git a/src/kpi_value_writer/tests/test_metric_writer_to_prom.py b/src/kpi_value_writer/tests/test_metric_writer_to_prom.py index 44f12ecea..f60e96253 100644 --- a/src/kpi_value_writer/tests/test_metric_writer_to_prom.py +++ b/src/kpi_value_writer/tests/test_metric_writer_to_prom.py @@ -26,4 +26,3 @@ def test_metric_writer_to_prometheus(): create_kpi_descriptor_request(), create_kpi_value_request() ) - -- GitLab From ed1af500517373fc8899153dafff348e8701a33b Mon Sep 17 00:00:00 2001 From: diazjj Date: Thu, 25 Jul 2024 11:03:47 +0200 Subject: [PATCH 382/602] Integrating DLT into Interdomain module --- my_deploy.sh | 2 +- src/interdomain/Config.py | 7 + src/interdomain/service/__main__.py | 25 ++-- .../topology_abstractor/DltRecorder.py | 133 ++++++++++++++++++ 4 files changed, 158 insertions(+), 9 deletions(-) create mode 100644 src/interdomain/service/topology_abstractor/DltRecorder.py diff --git a/my_deploy.sh b/my_deploy.sh index d18c5db7f..c0f2196c8 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -20,7 +20,7 @@ export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/" # Set the list of components, separated by spaces, you want to build images for, and deploy. -export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_generator dlt" +export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_generator interdomain dlt" # Uncomment to activate Monitoring #export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" diff --git a/src/interdomain/Config.py b/src/interdomain/Config.py index 918f60d79..d9098447b 100644 --- a/src/interdomain/Config.py +++ b/src/interdomain/Config.py @@ -15,6 +15,7 @@ from common.Settings import get_setting SETTING_NAME_TOPOLOGY_ABSTRACTOR = 'TOPOLOGY_ABSTRACTOR' +SETTING_NAME_DLT_INTEGRATION = 'DLT_INTEGRATION' TRUE_VALUES = {'Y', 'YES', 'TRUE', 'T', 'E', 'ENABLE', 'ENABLED'} def is_topology_abstractor_enabled() -> bool: @@ -22,3 +23,9 @@ def is_topology_abstractor_enabled() -> bool: if is_enabled is None: return False str_is_enabled = str(is_enabled).upper() return str_is_enabled in TRUE_VALUES + +def is_dlt_enabled() -> bool: + is_enabled = get_setting(SETTING_NAME_DLT_INTEGRATION, default=None) + if is_enabled is None: return False + str_is_enabled = str(is_enabled).upper() + return str_is_enabled in TRUE_VALUES diff --git a/src/interdomain/service/__main__.py b/src/interdomain/service/__main__.py index c0497bd29..a0a25ae1e 100644 --- a/src/interdomain/service/__main__.py +++ b/src/interdomain/service/__main__.py @@ -18,8 +18,9 @@ from common.Constants import ServiceNameEnum from common.Settings import ( ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_log_level, get_metrics_port, wait_for_environment_variables) -from interdomain.Config import is_topology_abstractor_enabled -from .topology_abstractor.TopologyAbstractor import TopologyAbstractor +from interdomain.Config import is_dlt_enabled +#from .topology_abstractor.TopologyAbstractor import TopologyAbstractor +from .topology_abstractor.DltRecorder import DLTRecorder from .InterdomainService import InterdomainService from .RemoteDomainClients import RemoteDomainClients @@ -64,17 +65,25 @@ def main(): grpc_service.start() # Subscribe to Context Events - topology_abstractor_enabled = is_topology_abstractor_enabled() - if topology_abstractor_enabled: - topology_abstractor = TopologyAbstractor() - topology_abstractor.start() + # topology_abstractor_enabled = is_topology_abstractor_enabled() + # if topology_abstractor_enabled: + # topology_abstractor = TopologyAbstractor() + # topology_abstractor.start() + + # Subscribe to Context Events + dlt_enabled = is_dlt_enabled() + if dlt_enabled: + dlt_recorder = DLTRecorder() + dlt_recorder.start() # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=1.0): pass LOGGER.info('Terminating...') - if topology_abstractor_enabled: - topology_abstractor.stop() + # if topology_abstractor_enabled: + # topology_abstractor.stop() + if dlt_enabled: + dlt_recorder.stop() grpc_service.stop() remote_domain_clients.stop() diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py new file mode 100644 index 000000000..cb8c194eb --- /dev/null +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -0,0 +1,133 @@ +import logging +import threading +from typing import Dict, Optional + +from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum +from common.Settings import ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_environment_variables, get_env_var_name +from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, DeviceId, EndPointId, Link, LinkEvent, TopologyId, TopologyEvent +from common.tools.context_queries.Context import create_context +from common.tools.context_queries.Device import get_uuids_of_devices_in_topology +from common.tools.context_queries.Topology import create_missing_topologies +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Context import json_context_id +from common.tools.object_factory.Device import json_device_id +from common.tools.object_factory.Topology import json_topology_id +from context.client.ContextClient import ContextClient +from context.client.EventsCollector import EventsCollector +from dlt.connector.client.DltConnectorClient import DltConnectorClient +from .DltRecordSender import DltRecordSender +from .Types import EventTypes + +LOGGER = logging.getLogger(__name__) + +ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) +INTERDOMAIN_TOPOLOGY_ID = TopologyId(**json_topology_id(INTERDOMAIN_TOPOLOGY_NAME, context_id=ADMIN_CONTEXT_ID)) + + +class DLTRecorder(threading.Thread): + def __init__(self) -> None: + super().__init__(daemon=True) + self.terminate = threading.Event() + self.context_client = ContextClient() + self.context_event_collector = EventsCollector(self.context_client) + + def stop(self): + self.terminate.set() + + def run(self) -> None: + self.context_client.connect() + create_context(self.context_client, DEFAULT_CONTEXT_NAME) + self.create_topologies() + self.context_event_collector.start() + + while not self.terminate.is_set(): + event = self.context_event_collector.get_event(timeout=0.1) + if event is None: + continue + LOGGER.info('Processing Event({:s})...'.format(grpc_message_to_json_string(event))) + self.update_record(event) + + self.context_event_collector.stop() + self.context_client.close() + + def create_topologies(self): + topology_uuids = [DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME] + create_missing_topologies(self.context_client, ADMIN_CONTEXT_ID, topology_uuids) + + def get_dlt_connector_client(self) -> Optional[DltConnectorClient]: + env_vars = find_environment_variables([ + get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_HOST), + get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), + ]) + if len(env_vars) == 2: + dlt_connector_client = DltConnectorClient() + dlt_connector_client.connect() + return dlt_connector_client + return None + + def update_record(self, event: EventTypes) -> None: + dlt_connector_client = self.get_dlt_connector_client() + dlt_record_sender = DltRecordSender(self.context_client, dlt_connector_client) + + if isinstance(event, ContextEvent): + LOGGER.debug('Processing ContextEvent({:s})'.format(grpc_message_to_json_string(event))) + LOGGER.warning('Ignoring ContextEvent({:s})'.format(grpc_message_to_json_string(event))) + + elif isinstance(event, TopologyEvent): + LOGGER.debug('Processing TopologyEvent({:s})'.format(grpc_message_to_json_string(event))) + self.process_topology_event(event, dlt_record_sender) + + elif isinstance(event, DeviceEvent): + LOGGER.debug('Processing DeviceEvent({:s})'.format(grpc_message_to_json_string(event))) + self.process_device_event(event, dlt_record_sender) + + elif isinstance(event, LinkEvent): + LOGGER.debug('Processing LinkEvent({:s})'.format(grpc_message_to_json_string(event))) + self.process_link_event(event, dlt_record_sender) + + else: + LOGGER.warning('Unsupported Event({:s})'.format(grpc_message_to_json_string(event))) + + dlt_record_sender.commit() + if dlt_connector_client is not None: + dlt_connector_client.close() + + def process_topology_event(self, event: TopologyEvent, dlt_record_sender: DltRecordSender) -> None: + topology_id = event.topology_id + topology_uuid = topology_id.topology_uuid.uuid + context_id = topology_id.context_id + context_uuid = context_id.context_uuid.uuid + topology_uuids = {DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME} + + context = self.context_client.GetContext(context_id) + context_name = context.name + + topology_details = self.context_client.GetTopologyDetails(topology_id) + topology_name = topology_details.name + + if ((context_uuid == DEFAULT_CONTEXT_NAME) or (context_name == DEFAULT_CONTEXT_NAME)) and \ + (topology_uuid not in topology_uuids) and (topology_name not in topology_uuids): + for device in topology_details.devices: + dlt_record_sender.add_device(topology_id, device) + + for link in topology_details.links: + dlt_record_sender.add_link(topology_id, link) + + else: + MSG = 'Ignoring ({:s}/{:s})({:s}/{:s}) TopologyEvent({:s})' + args = context_uuid, context_name, topology_uuid, topology_name, grpc_message_to_json_string(event) + LOGGER.warning(MSG.format(*args)) + + +#Check which ID to use. + + def process_device_event(self, event: DeviceEvent, dlt_record_sender: DltRecordSender) -> None: + device_id = event.device_id + device_uuid = device_id.device_uuid.uuid + device = self.context_client.GetDevice(device_id) + dlt_record_sender.add_device(device_id.context_id, device) + + def process_link_event(self, event: LinkEvent, dlt_record_sender: DltRecordSender) -> None: + link_id = event.link_id + link = self.context_client.GetLink(link_id) + dlt_record_sender.add_link(link_id.context_id, link) -- GitLab From 9e81b87e3bc2f6f52fec082c9b04b534757836f0 Mon Sep 17 00:00:00 2001 From: diazjj Date: Thu, 25 Jul 2024 11:14:01 +0200 Subject: [PATCH 383/602] Debugging --- src/interdomain/service/__main__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/interdomain/service/__main__.py b/src/interdomain/service/__main__.py index a0a25ae1e..577af4908 100644 --- a/src/interdomain/service/__main__.py +++ b/src/interdomain/service/__main__.py @@ -73,6 +73,7 @@ def main(): # Subscribe to Context Events dlt_enabled = is_dlt_enabled() if dlt_enabled: + LOGGER.info('Starting DLT functionality...') dlt_recorder = DLTRecorder() dlt_recorder.start() -- GitLab From 15b795acc9266baf48aab0125de054dd9b715d1d Mon Sep 17 00:00:00 2001 From: diazjj Date: Thu, 25 Jul 2024 11:26:19 +0200 Subject: [PATCH 384/602] Debugging --- src/interdomain/service/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interdomain/service/__main__.py b/src/interdomain/service/__main__.py index 577af4908..b89e27c61 100644 --- a/src/interdomain/service/__main__.py +++ b/src/interdomain/service/__main__.py @@ -50,7 +50,7 @@ def main(): signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) - LOGGER.info('Starting...') + LOGGER.info('Starting Interdomain Service...') # Start metrics server metrics_port = get_metrics_port() -- GitLab From f0a20b9dba6fea55d5d31456e76e3682200cd4f5 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 25 Jul 2024 09:32:12 +0000 Subject: [PATCH 385/602] cleanup for merge --- manifests/kpi_value_apiservice.yaml | 99 ++++++++++++++++++++++ manifests/kpi_value_writerservice.yaml | 99 ++++++++++++++++++++++ src/common/Constants.py | 8 +- src/kpi_manager/.gitlab-ci.yml | 12 +-- src/kpi_value_api/.gitlab-ci.yml | 109 +++++++++++++++++++++++++ src/kpi_value_api/Dockerfile | 68 +++++++++++++++ src/kpi_value_writer/.gitlab-ci.yml | 40 ++------- src/kpi_value_writer/Dockerfile | 10 +-- 8 files changed, 399 insertions(+), 46 deletions(-) create mode 100644 manifests/kpi_value_apiservice.yaml create mode 100644 manifests/kpi_value_writerservice.yaml create mode 100644 src/kpi_value_api/.gitlab-ci.yml create mode 100644 src/kpi_value_api/Dockerfile diff --git a/manifests/kpi_value_apiservice.yaml b/manifests/kpi_value_apiservice.yaml new file mode 100644 index 000000000..eb53a2383 --- /dev/null +++ b/manifests/kpi_value_apiservice.yaml @@ -0,0 +1,99 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: kpi-value-apiservice +spec: + selector: + matchLabels: + app: kpi-value-apiservice + #replicas: 1 + template: + metadata: + annotations: + config.linkerd.io/skip-outbound-ports: "4222" + labels: + app: kpi-value-apiservice + spec: + terminationGracePeriodSeconds: 5 + containers: + - name: server + image: labs.etsi.org:5050/tfs/controller/kpi_manager:latest + imagePullPolicy: Always + ports: + - containerPort: 30020 + - containerPort: 9192 + env: + - name: LOG_LEVEL + value: "INFO" + # envFrom: + # - secretRef: + # name: crdb-data + readinessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:30020"] + livenessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:30020"] + resources: + requests: + cpu: 250m + memory: 128Mi + limits: + cpu: 1000m + memory: 1024Mi +--- +apiVersion: v1 +kind: Service +metadata: + name: kpi-value-apiservice + labels: + app: kpi-value-apiservice +spec: + type: ClusterIP + selector: + app: kpi-value-apiservice + ports: + - name: grpc + protocol: TCP + port: 30020 + targetPort: 30020 + - name: metrics + protocol: TCP + port: 9192 + targetPort: 9192 +--- +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: kpi-value-apiservice-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: kpi-value-apiservice + minReplicas: 1 + maxReplicas: 20 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 80 + #behavior: + # scaleDown: + # stabilizationWindowSeconds: 30 diff --git a/manifests/kpi_value_writerservice.yaml b/manifests/kpi_value_writerservice.yaml new file mode 100644 index 000000000..19cab536f --- /dev/null +++ b/manifests/kpi_value_writerservice.yaml @@ -0,0 +1,99 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: kpi-value-writerservice +spec: + selector: + matchLabels: + app: kpi-value-writerservice + #replicas: 1 + template: + metadata: + annotations: + config.linkerd.io/skip-outbound-ports: "4222" + labels: + app: kpi-value-writerservice + spec: + terminationGracePeriodSeconds: 5 + containers: + - name: server + image: labs.etsi.org:5050/tfs/controller/kpi_manager:latest + imagePullPolicy: Always + ports: + - containerPort: 30030 + - containerPort: 9192 + env: + - name: LOG_LEVEL + value: "INFO" + envFrom: + - secretRef: + name: crdb-data + readinessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:30030"] + livenessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:30030"] + resources: + requests: + cpu: 250m + memory: 128Mi + limits: + cpu: 1000m + memory: 1024Mi +--- +apiVersion: v1 +kind: Service +metadata: + name: kpi-value-writerservice + labels: + app: kpi-value-writerservice +spec: + type: ClusterIP + selector: + app: kpi-value-writerservice + ports: + - name: grpc + protocol: TCP + port: 30030 + targetPort: 30030 + - name: metrics + protocol: TCP + port: 9192 + targetPort: 9192 +--- +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: kpi-value-writerservice-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: kpi-value-writerservice + minReplicas: 1 + maxReplicas: 20 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 80 + #behavior: + # scaleDown: + # stabilizationWindowSeconds: 30 diff --git a/src/common/Constants.py b/src/common/Constants.py index 8f3e7894d..767b21343 100644 --- a/src/common/Constants.py +++ b/src/common/Constants.py @@ -43,9 +43,6 @@ class ServiceNameEnum(Enum): ZTP = 'ztp' POLICY = 'policy' MONITORING = 'monitoring' - KPIMANAGER = 'kpi-manager' - KPIVALUEAPI = 'kpi-value-api' - TELEMETRYFRONTEND = 'telemetry-frontend' DLT = 'dlt' NBI = 'nbi' CYBERSECURITY = 'cybersecurity' @@ -64,6 +61,10 @@ class ServiceNameEnum(Enum): E2EORCHESTRATOR = 'e2e-orchestrator' OPTICALCONTROLLER = 'opticalcontroller' BGPLS = 'bgpls-speaker' + KPIMANAGER = 'kpi-manager' + KPIVALUEAPI = 'kpi-value-api' + KPIVALUEWRITER = 'kpi-value-writer' + TELEMETRYFRONTEND = 'telemetry-frontend' # Used for test and debugging only DLT_GATEWAY = 'dltgateway' @@ -95,6 +96,7 @@ DEFAULT_SERVICE_GRPC_PORTS = { ServiceNameEnum.BGPLS .value : 20030, ServiceNameEnum.KPIMANAGER .value : 30010, ServiceNameEnum.KPIVALUEAPI .value : 30020, + ServiceNameEnum.KPIVALUEWRITER .value : 30030, ServiceNameEnum.TELEMETRYFRONTEND .value : 30050, # Used for test and debugging only diff --git a/src/kpi_manager/.gitlab-ci.yml b/src/kpi_manager/.gitlab-ci.yml index ffd4e38ff..6aef328ea 100644 --- a/src/kpi_manager/.gitlab-ci.yml +++ b/src/kpi_manager/.gitlab-ci.yml @@ -13,9 +13,9 @@ # limitations under the License. # Build, tag, and push the Docker image to the GitLab Docker registry -build kpi_manager: +build kpi-manager: variables: - IMAGE_NAME: 'kpi_manager' # name of the microservice + IMAGE_NAME: 'kpi-manager' # name of the microservice IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) stage: build before_script: @@ -39,13 +39,13 @@ build kpi_manager: - .gitlab-ci.yml # Apply unit test to the component -unit_test context: +unit_test kpi-manager: variables: - IMAGE_NAME: 'kpi_manager' # name of the microservice + IMAGE_NAME: 'kpi-manager' # name of the microservice IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) stage: unit_test needs: - - build context + - build kpi-manager before_script: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi @@ -71,7 +71,7 @@ unit_test context: - NATS_ADDRESS=$(docker inspect nats --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") - echo $NATS_ADDRESS - > - docker run --name $IMAGE_NAME -d -p 1010:1010 + docker run --name $IMAGE_NAME -d -p 30010:30010 --env "CRDB_URI=cockroachdb://tfs:tfs123@${CRDB_ADDRESS}:26257/tfs_test?sslmode=require" --volume "$PWD/src/$IMAGE_NAME/tests:/opt/results" --network=teraflowbridge diff --git a/src/kpi_value_api/.gitlab-ci.yml b/src/kpi_value_api/.gitlab-ci.yml new file mode 100644 index 000000000..c9107abaa --- /dev/null +++ b/src/kpi_value_api/.gitlab-ci.yml @@ -0,0 +1,109 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +# Build, tag, and push the Docker image to the GitLab Docker registry +build kpi-value-api: + variables: + IMAGE_NAME: 'kpi-value-api' # name of the microservice + IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) + stage: build + before_script: + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + script: + - docker buildx build -t "$IMAGE_NAME:$IMAGE_TAG" -f ./src/$IMAGE_NAME/Dockerfile . + - docker tag "$IMAGE_NAME:$IMAGE_TAG" "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG" + - docker push "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG" + after_script: + - docker images --filter="dangling=true" --quiet | xargs -r docker rmi + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' + - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' + - changes: + - src/common/**/*.py + - proto/*.proto + - src/$IMAGE_NAME/**/*.{py,in,yml} + - src/$IMAGE_NAME/Dockerfile + - src/$IMAGE_NAME/tests/*.py + - manifests/${IMAGE_NAME}service.yaml + - .gitlab-ci.yml + +# Apply unit test to the component +unit_test kpi-value-api: + variables: + IMAGE_NAME: 'kpi-value-api' # name of the microservice + IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) + stage: unit_test + needs: + - build kpi-value-api + before_script: + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi + - if docker container ls | grep $IMAGE_NAME; then docker rm -f $IMAGE_NAME; else echo "$IMAGE_NAME container is not in the system"; fi + - docker container prune -f + script: + - docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG" + - docker run --name $IMAGE_NAME -d -p 30020:30020 -v "$PWD/src/$IMAGE_NAME/tests:/opt/results" --network=teraflowbridge $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG + - sleep 5 + - docker ps -a + - docker logs $IMAGE_NAME + - > + docker exec -i $IMAGE_NAME bash -c + "coverage run -m pytest --log-level=INFO --verbose --junitxml=/opt/results/${IMAGE_NAME}_report.xml $IMAGE_NAME/tests/test_*.py" + - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing" + coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' + after_script: + - docker rm -f $IMAGE_NAME + - docker network rm teraflowbridge + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' + - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' + - changes: + - src/common/**/*.py + - proto/*.proto + - src/$IMAGE_NAME/**/*.{py,in,yml} + - src/$IMAGE_NAME/Dockerfile + - src/$IMAGE_NAME/tests/*.py + - src/$IMAGE_NAME/tests/Dockerfile + - manifests/${IMAGE_NAME}service.yaml + - .gitlab-ci.yml + artifacts: + when: always + reports: + junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml + +## Deployment of the service in Kubernetes Cluster +#deploy context: +# variables: +# IMAGE_NAME: 'context' # name of the microservice +# IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) +# stage: deploy +# needs: +# - unit test context +# # - integ_test execute +# script: +# - 'sed -i "s/$IMAGE_NAME:.*/$IMAGE_NAME:$IMAGE_TAG/" manifests/${IMAGE_NAME}service.yaml' +# - kubectl version +# - kubectl get all +# - kubectl apply -f "manifests/${IMAGE_NAME}service.yaml" +# - kubectl get all +# # environment: +# # name: test +# # url: https://example.com +# # kubernetes: +# # namespace: test +# rules: +# - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' +# when: manual +# - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' +# when: manual diff --git a/src/kpi_value_api/Dockerfile b/src/kpi_value_api/Dockerfile new file mode 100644 index 000000000..7dd8d307b --- /dev/null +++ b/src/kpi_value_api/Dockerfile @@ -0,0 +1,68 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +FROM python:3.9-slim + +# Install dependencies +RUN apt-get --yes --quiet --quiet update && \ + apt-get --yes --quiet --quiet install wget g++ git && \ + rm -rf /var/lib/apt/lists/* + +# Set Python to show logs as they occur +ENV PYTHONUNBUFFERED=0 + +# Download the gRPC health probe +RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \ + chmod +x /bin/grpc_health_probe + +# Get generic Python packages +RUN python3 -m pip install --upgrade pip +RUN python3 -m pip install --upgrade setuptools wheel +RUN python3 -m pip install --upgrade pip-tools + +# Get common Python packages +# Note: this step enables sharing the previous Docker build steps among all the Python components +WORKDIR /var/teraflow +COPY common_requirements.in common_requirements.in +RUN pip-compile --quiet --output-file=common_requirements.txt common_requirements.in +RUN python3 -m pip install -r common_requirements.txt + +# Add common files into working directory +WORKDIR /var/teraflow/common +COPY src/common/. ./ +RUN rm -rf proto + +# Create proto sub-folder, copy .proto files, and generate Python code +RUN mkdir -p /var/teraflow/common/proto +WORKDIR /var/teraflow/common/proto +RUN touch __init__.py +COPY proto/*.proto ./ +RUN python3 -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. *.proto +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_value_api +WORKDIR /var/teraflow/kpi_value_api +COPY src/kpi_value_api/requirements.in requirements.in +RUN pip-compile --quiet --output-file=requirements.txt requirements.in +RUN python3 -m pip install -r requirements.txt + +# Add component files into working directory +WORKDIR /var/teraflow +COPY src/kpi_value_api/. kpi_value_api/ + +# Start the service +ENTRYPOINT ["python", "-m", "kpi_value_api.service"] diff --git a/src/kpi_value_writer/.gitlab-ci.yml b/src/kpi_value_writer/.gitlab-ci.yml index ffd4e38ff..52b1b8fe6 100644 --- a/src/kpi_value_writer/.gitlab-ci.yml +++ b/src/kpi_value_writer/.gitlab-ci.yml @@ -13,9 +13,9 @@ # limitations under the License. # Build, tag, and push the Docker image to the GitLab Docker registry -build kpi_manager: +build kpi-value-writer: variables: - IMAGE_NAME: 'kpi_manager' # name of the microservice + IMAGE_NAME: 'kpi-value-writer' # name of the microservice IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) stage: build before_script: @@ -39,45 +39,23 @@ build kpi_manager: - .gitlab-ci.yml # Apply unit test to the component -unit_test context: +unit_test kpi-value-writer: variables: - IMAGE_NAME: 'kpi_manager' # name of the microservice + IMAGE_NAME: 'kpi-value-writer' # name of the microservice IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) stage: unit_test needs: - - build context + - build kpi-value-writer before_script: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi - - if docker container ls | grep crdb; then docker rm -f crdb; else echo "CockroachDB container is not in the system"; fi - - if docker volume ls | grep crdb; then docker volume rm -f crdb; else echo "CockroachDB volume is not in the system"; fi - if docker container ls | grep $IMAGE_NAME; then docker rm -f $IMAGE_NAME; else echo "$IMAGE_NAME container is not in the system"; fi - docker container prune -f script: - docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG" - - docker pull "cockroachdb/cockroach:latest-v22.2" - - docker volume create crdb - - > - docker run --name crdb -d --network=teraflowbridge -p 26257:26257 -p 8080:8080 - --env COCKROACH_DATABASE=tfs_test --env COCKROACH_USER=tfs --env COCKROACH_PASSWORD=tfs123 - --volume "crdb:/cockroach/cockroach-data" - cockroachdb/cockroach:latest-v22.2 start-single-node - - echo "Waiting for initialization..." - - while ! docker logs crdb 2>&1 | grep -q 'finished creating default user \"tfs\"'; do sleep 1; done - - docker logs crdb - - docker ps -a - - CRDB_ADDRESS=$(docker inspect crdb --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") - - echo $CRDB_ADDRESS - - NATS_ADDRESS=$(docker inspect nats --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") - - echo $NATS_ADDRESS - - > - docker run --name $IMAGE_NAME -d -p 1010:1010 - --env "CRDB_URI=cockroachdb://tfs:tfs123@${CRDB_ADDRESS}:26257/tfs_test?sslmode=require" - --volume "$PWD/src/$IMAGE_NAME/tests:/opt/results" - --network=teraflowbridge - $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG - - docker ps -a + - docker run --name $IMAGE_NAME -d -p 30030:30030 -v "$PWD/src/$IMAGE_NAME/tests:/opt/results" --network=teraflowbridge $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG - sleep 5 + - docker ps -a - docker logs $IMAGE_NAME - > docker exec -i $IMAGE_NAME bash -c @@ -85,10 +63,8 @@ unit_test context: - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing" coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' after_script: - - docker volume rm -f crdb + - docker rm -f $IMAGE_NAME - docker network rm teraflowbridge - - docker volume prune --force - - docker image prune --force rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' diff --git a/src/kpi_value_writer/Dockerfile b/src/kpi_value_writer/Dockerfile index a57957759..c84613cfc 100644 --- a/src/kpi_value_writer/Dockerfile +++ b/src/kpi_value_writer/Dockerfile @@ -54,15 +54,15 @@ 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_value_writer +WORKDIR /var/teraflow/kpi_value_writer +COPY src/kpi_value_writer/requirements.in requirements.in RUN pip-compile --quiet --output-file=requirements.txt requirements.in RUN python3 -m pip install -r requirements.txt # Add component files into working directory WORKDIR /var/teraflow -COPY src/kpi_manager/. kpi_manager/ +COPY src/kpi_value_writer/. kpi_value_writer/ # Start the service -ENTRYPOINT ["python", "-m", "kpi_manager.service"] +ENTRYPOINT ["python", "-m", "kpi_value_writer.service"] -- GitLab From 31145f270e2d71e6c6fdd46c0f997b14e64d340e Mon Sep 17 00:00:00 2001 From: diazjj Date: Thu, 25 Jul 2024 11:34:02 +0200 Subject: [PATCH 386/602] Debugging --- src/interdomain/service/__main__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/interdomain/service/__main__.py b/src/interdomain/service/__main__.py index b89e27c61..8c392821e 100644 --- a/src/interdomain/service/__main__.py +++ b/src/interdomain/service/__main__.py @@ -71,7 +71,8 @@ def main(): # topology_abstractor.start() # Subscribe to Context Events - dlt_enabled = is_dlt_enabled() + #dlt_enabled = is_dlt_enabled() + dlt_enabled = True if dlt_enabled: LOGGER.info('Starting DLT functionality...') dlt_recorder = DLTRecorder() -- GitLab From 12d224a1e03dbe38c41a8a55820ef7730b4cb96d Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 25 Jul 2024 09:56:52 +0000 Subject: [PATCH 387/602] cleanup for merge --- manifests/kpi_value_apiservice.yaml | 2 +- manifests/kpi_value_writerservice.yaml | 2 +- src/kpi_manager/service/__main__.py | 10 ++-------- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/manifests/kpi_value_apiservice.yaml b/manifests/kpi_value_apiservice.yaml index eb53a2383..1a5dfc265 100644 --- a/manifests/kpi_value_apiservice.yaml +++ b/manifests/kpi_value_apiservice.yaml @@ -31,7 +31,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: labs.etsi.org:5050/tfs/controller/kpi_manager:latest + image: labs.etsi.org:5050/tfs/controller/kpi_value_api:latest imagePullPolicy: Always ports: - containerPort: 30020 diff --git a/manifests/kpi_value_writerservice.yaml b/manifests/kpi_value_writerservice.yaml index 19cab536f..9bd5da943 100644 --- a/manifests/kpi_value_writerservice.yaml +++ b/manifests/kpi_value_writerservice.yaml @@ -31,7 +31,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: labs.etsi.org:5050/tfs/controller/kpi_manager:latest + image: labs.etsi.org:5050/tfs/controller/kpi_value_writer:latest imagePullPolicy: Always ports: - containerPort: 30030 diff --git a/src/kpi_manager/service/__main__.py b/src/kpi_manager/service/__main__.py index a4884c545..244d5afa3 100644 --- a/src/kpi_manager/service/__main__.py +++ b/src/kpi_manager/service/__main__.py @@ -12,14 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, signal, sys, threading, time -from prometheus_client import start_http_server -from common.Constants import ServiceNameEnum -from common.Settings import ( - ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_log_level, get_metrics_port, - wait_for_environment_variables) -from common.proto import monitoring_pb2 -from .NameMapping import NameMapping # import updated +import logging, signal, sys, threading +from common.Settings import get_log_level from .KpiManagerService import KpiManagerService terminate = threading.Event() -- GitLab From 9088c6571c04a645a26097f4b8c78b66a84e3df6 Mon Sep 17 00:00:00 2001 From: diazjj Date: Thu, 25 Jul 2024 12:02:56 +0200 Subject: [PATCH 388/602] Debugging --- .../topology_abstractor/DltRecorder.py | 29 +++- .../topology_abstractor/DltRecorderOld.py | 133 ++++++++++++++++++ 2 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 src/interdomain/service/topology_abstractor/DltRecorderOld.py diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index cb8c194eb..abcb382f6 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -30,6 +30,7 @@ class DLTRecorder(threading.Thread): self.terminate = threading.Event() self.context_client = ContextClient() self.context_event_collector = EventsCollector(self.context_client) + self.topology_cache = {} def stop(self): self.terminate.set() @@ -105,6 +106,8 @@ class DLTRecorder(threading.Thread): topology_details = self.context_client.GetTopologyDetails(topology_id) topology_name = topology_details.name + self.topology_cache[topology_uuid] = topology_details + if ((context_uuid == DEFAULT_CONTEXT_NAME) or (context_name == DEFAULT_CONTEXT_NAME)) and \ (topology_uuid not in topology_uuids) and (topology_name not in topology_uuids): for device in topology_details.devices: @@ -118,16 +121,34 @@ class DLTRecorder(threading.Thread): args = context_uuid, context_name, topology_uuid, topology_name, grpc_message_to_json_string(event) LOGGER.warning(MSG.format(*args)) + def find_topology_for_device(self, device_id: DeviceId) -> Optional[TopologyId]: + for topology_id, details in self.topology_cache.items(): + for device in details.devices: + if device.device_id == device_id: + return topology_id + return None -#Check which ID to use. + def find_topology_for_link(self, link_id: LinkId) -> Optional[TopologyId]: + for topology_id, details in self.topology_cache.items(): + for link in details.links: + if link.link_id == link_id: + return topology_id + return None def process_device_event(self, event: DeviceEvent, dlt_record_sender: DltRecordSender) -> None: device_id = event.device_id - device_uuid = device_id.device_uuid.uuid device = self.context_client.GetDevice(device_id) - dlt_record_sender.add_device(device_id.context_id, device) + topology_id = self.find_topology_for_device(device_id) + if topology_id: + dlt_record_sender.add_device(topology_id, device) + else: + LOGGER.warning(f"Topology not found for device {device_id.device_uuid.uuid}") def process_link_event(self, event: LinkEvent, dlt_record_sender: DltRecordSender) -> None: link_id = event.link_id link = self.context_client.GetLink(link_id) - dlt_record_sender.add_link(link_id.context_id, link) + topology_id = self.find_topology_for_link(link_id) + if topology_id: + dlt_record_sender.add_link(topology_id, link) + else: + LOGGER.warning(f"Topology not found for link {link_id.link_uuid.uuid}") diff --git a/src/interdomain/service/topology_abstractor/DltRecorderOld.py b/src/interdomain/service/topology_abstractor/DltRecorderOld.py new file mode 100644 index 000000000..cb8c194eb --- /dev/null +++ b/src/interdomain/service/topology_abstractor/DltRecorderOld.py @@ -0,0 +1,133 @@ +import logging +import threading +from typing import Dict, Optional + +from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum +from common.Settings import ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_environment_variables, get_env_var_name +from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, DeviceId, EndPointId, Link, LinkEvent, TopologyId, TopologyEvent +from common.tools.context_queries.Context import create_context +from common.tools.context_queries.Device import get_uuids_of_devices_in_topology +from common.tools.context_queries.Topology import create_missing_topologies +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Context import json_context_id +from common.tools.object_factory.Device import json_device_id +from common.tools.object_factory.Topology import json_topology_id +from context.client.ContextClient import ContextClient +from context.client.EventsCollector import EventsCollector +from dlt.connector.client.DltConnectorClient import DltConnectorClient +from .DltRecordSender import DltRecordSender +from .Types import EventTypes + +LOGGER = logging.getLogger(__name__) + +ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) +INTERDOMAIN_TOPOLOGY_ID = TopologyId(**json_topology_id(INTERDOMAIN_TOPOLOGY_NAME, context_id=ADMIN_CONTEXT_ID)) + + +class DLTRecorder(threading.Thread): + def __init__(self) -> None: + super().__init__(daemon=True) + self.terminate = threading.Event() + self.context_client = ContextClient() + self.context_event_collector = EventsCollector(self.context_client) + + def stop(self): + self.terminate.set() + + def run(self) -> None: + self.context_client.connect() + create_context(self.context_client, DEFAULT_CONTEXT_NAME) + self.create_topologies() + self.context_event_collector.start() + + while not self.terminate.is_set(): + event = self.context_event_collector.get_event(timeout=0.1) + if event is None: + continue + LOGGER.info('Processing Event({:s})...'.format(grpc_message_to_json_string(event))) + self.update_record(event) + + self.context_event_collector.stop() + self.context_client.close() + + def create_topologies(self): + topology_uuids = [DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME] + create_missing_topologies(self.context_client, ADMIN_CONTEXT_ID, topology_uuids) + + def get_dlt_connector_client(self) -> Optional[DltConnectorClient]: + env_vars = find_environment_variables([ + get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_HOST), + get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), + ]) + if len(env_vars) == 2: + dlt_connector_client = DltConnectorClient() + dlt_connector_client.connect() + return dlt_connector_client + return None + + def update_record(self, event: EventTypes) -> None: + dlt_connector_client = self.get_dlt_connector_client() + dlt_record_sender = DltRecordSender(self.context_client, dlt_connector_client) + + if isinstance(event, ContextEvent): + LOGGER.debug('Processing ContextEvent({:s})'.format(grpc_message_to_json_string(event))) + LOGGER.warning('Ignoring ContextEvent({:s})'.format(grpc_message_to_json_string(event))) + + elif isinstance(event, TopologyEvent): + LOGGER.debug('Processing TopologyEvent({:s})'.format(grpc_message_to_json_string(event))) + self.process_topology_event(event, dlt_record_sender) + + elif isinstance(event, DeviceEvent): + LOGGER.debug('Processing DeviceEvent({:s})'.format(grpc_message_to_json_string(event))) + self.process_device_event(event, dlt_record_sender) + + elif isinstance(event, LinkEvent): + LOGGER.debug('Processing LinkEvent({:s})'.format(grpc_message_to_json_string(event))) + self.process_link_event(event, dlt_record_sender) + + else: + LOGGER.warning('Unsupported Event({:s})'.format(grpc_message_to_json_string(event))) + + dlt_record_sender.commit() + if dlt_connector_client is not None: + dlt_connector_client.close() + + def process_topology_event(self, event: TopologyEvent, dlt_record_sender: DltRecordSender) -> None: + topology_id = event.topology_id + topology_uuid = topology_id.topology_uuid.uuid + context_id = topology_id.context_id + context_uuid = context_id.context_uuid.uuid + topology_uuids = {DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME} + + context = self.context_client.GetContext(context_id) + context_name = context.name + + topology_details = self.context_client.GetTopologyDetails(topology_id) + topology_name = topology_details.name + + if ((context_uuid == DEFAULT_CONTEXT_NAME) or (context_name == DEFAULT_CONTEXT_NAME)) and \ + (topology_uuid not in topology_uuids) and (topology_name not in topology_uuids): + for device in topology_details.devices: + dlt_record_sender.add_device(topology_id, device) + + for link in topology_details.links: + dlt_record_sender.add_link(topology_id, link) + + else: + MSG = 'Ignoring ({:s}/{:s})({:s}/{:s}) TopologyEvent({:s})' + args = context_uuid, context_name, topology_uuid, topology_name, grpc_message_to_json_string(event) + LOGGER.warning(MSG.format(*args)) + + +#Check which ID to use. + + def process_device_event(self, event: DeviceEvent, dlt_record_sender: DltRecordSender) -> None: + device_id = event.device_id + device_uuid = device_id.device_uuid.uuid + device = self.context_client.GetDevice(device_id) + dlt_record_sender.add_device(device_id.context_id, device) + + def process_link_event(self, event: LinkEvent, dlt_record_sender: DltRecordSender) -> None: + link_id = event.link_id + link = self.context_client.GetLink(link_id) + dlt_record_sender.add_link(link_id.context_id, link) -- GitLab From c103dda5732b111229fbef7f40f016d541a67363 Mon Sep 17 00:00:00 2001 From: diazjj Date: Thu, 25 Jul 2024 12:07:15 +0200 Subject: [PATCH 389/602] Debugging --- src/interdomain/service/topology_abstractor/DltRecorder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index abcb382f6..1c5661b60 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -4,7 +4,7 @@ from typing import Dict, Optional from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum from common.Settings import ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_environment_variables, get_env_var_name -from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, DeviceId, EndPointId, Link, LinkEvent, TopologyId, TopologyEvent +from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, DeviceId, EndPointId, Link, LinkId, LinkEvent, TopologyId, TopologyEvent from common.tools.context_queries.Context import create_context from common.tools.context_queries.Device import get_uuids_of_devices_in_topology from common.tools.context_queries.Topology import create_missing_topologies -- GitLab From 99c55e1b2ea1dbdadc4c6dfc991d80a470540c6f Mon Sep 17 00:00:00 2001 From: diazjj Date: Thu, 25 Jul 2024 12:18:31 +0200 Subject: [PATCH 390/602] Debugging --- .../topology_abstractor/DltRecorder.py | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index 1c5661b60..6f4ce5e59 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -4,7 +4,7 @@ from typing import Dict, Optional from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum from common.Settings import ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_environment_variables, get_env_var_name -from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, DeviceId, EndPointId, Link, LinkId, LinkEvent, TopologyId, TopologyEvent +from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, DeviceId, EndPointId, Link, LinkEvent, TopologyId, TopologyEvent from common.tools.context_queries.Context import create_context from common.tools.context_queries.Device import get_uuids_of_devices_in_topology from common.tools.context_queries.Topology import create_missing_topologies @@ -30,7 +30,7 @@ class DLTRecorder(threading.Thread): self.terminate = threading.Event() self.context_client = ContextClient() self.context_event_collector = EventsCollector(self.context_client) - self.topology_cache = {} + self.topology_cache: Dict[str, TopologyId] = {} def stop(self): self.terminate.set() @@ -56,15 +56,19 @@ class DLTRecorder(threading.Thread): create_missing_topologies(self.context_client, ADMIN_CONTEXT_ID, topology_uuids) def get_dlt_connector_client(self) -> Optional[DltConnectorClient]: - env_vars = find_environment_variables([ - get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_HOST), - get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), - ]) - if len(env_vars) == 2: - dlt_connector_client = DltConnectorClient() - dlt_connector_client.connect() - return dlt_connector_client - return None + # Always enable DLT for testing + dlt_connector_client = DltConnectorClient() + dlt_connector_client.connect() + return dlt_connector_client + # env_vars = find_environment_variables([ + # get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_HOST), + # get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), + # ]) + # if len(env_vars) == 2: + # dlt_connector_client = DltConnectorClient() + # dlt_connector_client.connect() + # return dlt_connector_client + # return None def update_record(self, event: EventTypes) -> None: dlt_connector_client = self.get_dlt_connector_client() @@ -106,7 +110,7 @@ class DLTRecorder(threading.Thread): topology_details = self.context_client.GetTopologyDetails(topology_id) topology_name = topology_details.name - self.topology_cache[topology_uuid] = topology_details + self.topology_cache[topology_uuid] = topology_id if ((context_uuid == DEFAULT_CONTEXT_NAME) or (context_name == DEFAULT_CONTEXT_NAME)) and \ (topology_uuid not in topology_uuids) and (topology_name not in topology_uuids): @@ -122,14 +126,16 @@ class DLTRecorder(threading.Thread): LOGGER.warning(MSG.format(*args)) def find_topology_for_device(self, device_id: DeviceId) -> Optional[TopologyId]: - for topology_id, details in self.topology_cache.items(): + for topology_uuid, topology_id in self.topology_cache.items(): + details = self.context_client.GetTopologyDetails(topology_id) for device in details.devices: if device.device_id == device_id: return topology_id return None def find_topology_for_link(self, link_id: LinkId) -> Optional[TopologyId]: - for topology_id, details in self.topology_cache.items(): + for topology_uuid, topology_id in self.topology_cache.items(): + details = self.context_client.GetTopologyDetails(topology_id) for link in details.links: if link.link_id == link_id: return topology_id -- GitLab From d3baf581bd091ec349861afca7c2277602453936 Mon Sep 17 00:00:00 2001 From: diazjj Date: Thu, 25 Jul 2024 12:19:08 +0200 Subject: [PATCH 391/602] Debugging --- src/interdomain/service/topology_abstractor/DltRecorder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index 6f4ce5e59..ae1702a59 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -4,7 +4,7 @@ from typing import Dict, Optional from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum from common.Settings import ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_environment_variables, get_env_var_name -from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, DeviceId, EndPointId, Link, LinkEvent, TopologyId, TopologyEvent +from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, DeviceId, EndPointId, Link, LinkId, LinkEvent, TopologyId, TopologyEvent from common.tools.context_queries.Context import create_context from common.tools.context_queries.Device import get_uuids_of_devices_in_topology from common.tools.context_queries.Topology import create_missing_topologies -- GitLab From 73e0528c30ead568905df66b9589330d6d2fbfb6 Mon Sep 17 00:00:00 2001 From: diazjj Date: Thu, 25 Jul 2024 16:12:48 +0200 Subject: [PATCH 392/602] Debugging --- src/dlt/connector/client/DltConnectorClient.py | 1 + src/dlt/connector/service/DltConnectorServiceServicerImpl.py | 1 + src/interdomain/service/topology_abstractor/DltRecorder.py | 1 + 3 files changed, 3 insertions(+) diff --git a/src/dlt/connector/client/DltConnectorClient.py b/src/dlt/connector/client/DltConnectorClient.py index c3101d65e..e383217d8 100644 --- a/src/dlt/connector/client/DltConnectorClient.py +++ b/src/dlt/connector/client/DltConnectorClient.py @@ -22,6 +22,7 @@ from common.tools.client.RetryDecorator import retry, delay_exponential from common.tools.grpc.Tools import grpc_message_to_json_string LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) MAX_RETRIES = 15 DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') diff --git a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py index 42e86b102..c05d46b48 100644 --- a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py +++ b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py @@ -25,6 +25,7 @@ from dlt.connector.client.DltGatewayClient import DltGatewayClient from .tools.Checkers import record_exists LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) METRICS_POOL = MetricsPool('DltConnector', 'RPC') diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index ae1702a59..b4d18e9bc 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -19,6 +19,7 @@ from .DltRecordSender import DltRecordSender from .Types import EventTypes LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) INTERDOMAIN_TOPOLOGY_ID = TopologyId(**json_topology_id(INTERDOMAIN_TOPOLOGY_NAME, context_id=ADMIN_CONTEXT_ID)) -- GitLab From 9ee1f5ca288a6364d40d69c02f723469dd660a8e Mon Sep 17 00:00:00 2001 From: diazjj Date: Thu, 25 Jul 2024 16:31:06 +0200 Subject: [PATCH 393/602] Returns empty value if there is no record found by a key. --- src/dlt/gateway/dltApp/src/dltGateway.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/dlt/gateway/dltApp/src/dltGateway.js b/src/dlt/gateway/dltApp/src/dltGateway.js index f0ca8120b..7ee723e7c 100644 --- a/src/dlt/gateway/dltApp/src/dltGateway.js +++ b/src/dlt/gateway/dltApp/src/dltGateway.js @@ -101,7 +101,10 @@ async function getFromDlt(call, callback) { // Send the response with the formatted JSON data callback(null, { record_id: call.request, data_json: JSON.stringify(result) }); - } catch (error) { + } catch (error) { if (error.message.includes("data not found for key")) { + // Return an empty response when no record is found + callback(null, { record_id: call.request, data_json: "{}" }); + } else { // Send failure response with error message callback({ code: grpc.status.UNKNOWN, -- GitLab From 8c890d224afffb473ffcf85c45952dbaec82570c Mon Sep 17 00:00:00 2001 From: diazjj Date: Thu, 25 Jul 2024 16:38:07 +0200 Subject: [PATCH 394/602] Return empty value if there are no records match a key --- src/dlt/gateway/dltApp/src/dltGateway.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/dlt/gateway/dltApp/src/dltGateway.js b/src/dlt/gateway/dltApp/src/dltGateway.js index 7ee723e7c..80eeebc17 100644 --- a/src/dlt/gateway/dltApp/src/dltGateway.js +++ b/src/dlt/gateway/dltApp/src/dltGateway.js @@ -101,7 +101,8 @@ async function getFromDlt(call, callback) { // Send the response with the formatted JSON data callback(null, { record_id: call.request, data_json: JSON.stringify(result) }); - } catch (error) { if (error.message.includes("data not found for key")) { + } catch (error) { + if (error.message.includes("data not found for key")) { // Return an empty response when no record is found callback(null, { record_id: call.request, data_json: "{}" }); } else { @@ -110,6 +111,7 @@ async function getFromDlt(call, callback) { code: grpc.status.UNKNOWN, details: error.message }); + } } } -- GitLab From b8e0480a58c2559807616ebb71d1695a6eb77cd7 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 25 Jul 2024 14:58:21 +0000 Subject: [PATCH 395/602] cleanup for merge --- deploy/tfs.sh | 11 ++++++++ manifests/kpi_managerservice.yaml | 2 +- scripts/show_logs_kpi_value_api.sh | 27 +++++++++++++++++++ scripts/show_logs_kpi_value_writer.sh | 27 +++++++++++++++++++ src/common/tools/kafka/Variables.py | 3 ++- .../service/KpiValueWriter.py | 14 +++------- src/kpi_value_writer/service/__main__.py | 5 ++-- 7 files changed, 74 insertions(+), 15 deletions(-) create mode 100755 scripts/show_logs_kpi_value_api.sh create mode 100755 scripts/show_logs_kpi_value_writer.sh diff --git a/deploy/tfs.sh b/deploy/tfs.sh index 8565077c3..b8e1f8837 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -146,6 +146,17 @@ kubectl create secret generic crdb-data --namespace ${TFS_K8S_NAMESPACE} --type= --from-literal=CRDB_SSLMODE=require printf "\n" +echo "Create secret with CockroachDB data for KPI Management" +CRDB_SQL_PORT=$(kubectl --namespace ${CRDB_NAMESPACE} get service cockroachdb-public -o 'jsonpath={.spec.ports[?(@.name=="sql")].port}') +kubectl create secret generic crdb-kpi-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ + --from-literal=CRDB_NAMESPACE=${CRDB_NAMESPACE} \ + --from-literal=CRDB_SQL_PORT=${CRDB_SQL_PORT} \ + --from-literal=CRDB_DATABASE=${CRDB_DATABASE} \ + --from-literal=CRDB_USERNAME=${CRDB_USERNAME} \ + --from-literal=CRDB_PASSWORD=${CRDB_PASSWORD} \ + --from-literal=CRDB_SSLMODE=require +printf "\n" + echo "Create secret with NATS data" NATS_CLIENT_PORT=$(kubectl --namespace ${NATS_NAMESPACE} get service ${NATS_NAMESPACE} -o 'jsonpath={.spec.ports[?(@.name=="client")].port}') if [ -z "$NATS_CLIENT_PORT" ]; then diff --git a/manifests/kpi_managerservice.yaml b/manifests/kpi_managerservice.yaml index 3e106fd92..984d783a9 100644 --- a/manifests/kpi_managerservice.yaml +++ b/manifests/kpi_managerservice.yaml @@ -41,7 +41,7 @@ spec: value: "INFO" envFrom: - secretRef: - name: crdb-data + name: crdb-kpi-data readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:30010"] diff --git a/scripts/show_logs_kpi_value_api.sh b/scripts/show_logs_kpi_value_api.sh new file mode 100755 index 000000000..041ad7f1f --- /dev/null +++ b/scripts/show_logs_kpi_value_api.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +######################################################################################################################## +# Define your deployment settings here +######################################################################################################################## + +# If not already set, set the name of the Kubernetes namespace to deploy to. +export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"} + +######################################################################################################################## +# Automated steps start here +######################################################################################################################## + +kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/kpi-value-apiservice -c server diff --git a/scripts/show_logs_kpi_value_writer.sh b/scripts/show_logs_kpi_value_writer.sh new file mode 100755 index 000000000..d62f3ea0a --- /dev/null +++ b/scripts/show_logs_kpi_value_writer.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +######################################################################################################################## +# Define your deployment settings here +######################################################################################################################## + +# If not already set, set the name of the Kubernetes namespace to deploy to. +export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"} + +######################################################################################################################## +# Automated steps start here +######################################################################################################################## + +kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/kpi-value-writerservice -c server diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index e01b33896..bdb6708f3 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -21,7 +21,8 @@ from confluent_kafka.admin import AdminClient, NewTopic LOGGER = logging.getLogger(__name__) class KafkaConfig(Enum): - SERVER_IP = "127.0.0.1:9092" + # SERVER_IP = "127.0.0.1:9092" + SERVER_IP = "kafka-service:9092" ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_IP}) class KafkaTopic(Enum): diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index aa0f2cf79..a4b10ed63 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -67,24 +67,17 @@ class KpiValueWriter: kpi_value.ParseFromString(raw_kpi.value()) LOGGER.info("Received KPI : {:}".format(kpi_value)) print("Received KPI : {:}".format(kpi_value)) - KpiValueWriter.get_kpi_descriptor(kpi_value.kpi_id.kpi_id.uuid, kpi_manager_client) - # -------- Testing section --------------- - # test_kpi_descriptor_obj = create_kpi_descriptor_request() - # metric_writer_to_prom.create_and_expose_cooked_kpi( - # test_kpi_descriptor_obj, kpi_value - # ) - # -------- Testing section --------------- - + KpiValueWriter.get_kpi_descriptor(kpi_value, kpi_manager_client) except Exception as e: print("Error detail: {:}".format(e)) continue @staticmethod - def get_kpi_descriptor(kpi_value_uuid: str, kpi_manager_client ): + def get_kpi_descriptor(kpi_value: str, kpi_manager_client ): print("--- START -----") kpi_id = KpiId() - kpi_id.kpi_id.uuid = kpi_value_uuid + kpi_id.kpi_id.uuid = kpi_value.kpi_id.kpi_id.uuid print("KpiId generated: {:}".format(kpi_id)) # print("Kpi manger client created: {:}".format(kpi_manager_client)) @@ -96,6 +89,7 @@ class KpiValueWriter: if isinstance (kpi_descriptor_object, KpiDescriptor): LOGGER.info("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) print("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) + MetricWriterToPrometheus.create_and_expose_cooked_kpi(kpi_descriptor_object, kpi_value) else: LOGGER.info("Error in extracting KpiDescriptor {:}".format(kpi_descriptor_object)) print("Error in extracting KpiDescriptor {:}".format(kpi_descriptor_object)) diff --git a/src/kpi_value_writer/service/__main__.py b/src/kpi_value_writer/service/__main__.py index 028585575..aa67540fb 100644 --- a/src/kpi_value_writer/service/__main__.py +++ b/src/kpi_value_writer/service/__main__.py @@ -13,9 +13,8 @@ # limitations under the License. import logging, signal, sys, threading -from prometheus_client import start_http_server -from .KpiValueWriter import KpiValueWriter -from common.Settings import get_log_level, get_metrics_port +from kpi_value_writer.service.KpiValueWriter import KpiValueWriter +from common.Settings import get_log_level terminate = threading.Event() LOGGER = None -- GitLab From 20bf2c56d66f841b0b8f30d6d5b25001087ed2fe Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 25 Jul 2024 14:58:41 +0000 Subject: [PATCH 396/602] clenup for merge --- src/kpi_manager/requirements.in | 38 +++++++-------------------------- 1 file changed, 8 insertions(+), 30 deletions(-) diff --git a/src/kpi_manager/requirements.in b/src/kpi_manager/requirements.in index f4e54a174..a06ae4a6e 100644 --- a/src/kpi_manager/requirements.in +++ b/src/kpi_manager/requirements.in @@ -1,33 +1,11 @@ -anytree==2.8.0 -APScheduler==3.10.1 -attrs==23.2.0 -bcrypt==4.1.3 -certifi==2024.7.4 -cffi==1.16.0 -charset-normalizer==2.0.12 -cryptography==42.0.8 -googleapis-common-protos==1.63.2 -greenlet==3.0.3 -idna==3.7 -Jinja2==3.0.3 -lxml==5.2.2 -macaddress==2.0.2 -MarkupSafe==2.1.5 -ncclient==0.6.15 -p4runtime==1.3.0 -paramiko==3.4.0 -psycopg2-binary==2.9.3 -pycparser==2.22 -PyNaCl==1.5.0 -pytz==2024.1 -requests==2.27.1 SQLAlchemy==1.4.52 sqlalchemy-cockroachdb==1.4.4 SQLAlchemy-Utils==0.38.3 -tabulate==0.9.0 -typing_extensions==4.12.2 -tzlocal==5.2 -urllib3==1.26.19 -websockets==10.4 -xmltodict==0.12.0 -yattag==1.15.2 +psycopg2-binary==2.9.3 +confluent-kafka==2.3.0 +Jinja2==3.0.3 +ncclient==0.6.15 +pyang==2.6.0 +requests==2.27.1 +typing_extensions==4.12.0 +yattag==1.15.2 \ No newline at end of file -- GitLab From 9609a1ade36a5c3e428074ad4d5bd561a944cd62 Mon Sep 17 00:00:00 2001 From: diazjj Date: Thu, 25 Jul 2024 17:14:35 +0200 Subject: [PATCH 397/602] Return Empty DataJson if record is not found --- src/dlt/gateway/dltApp/src/dltGateway.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dlt/gateway/dltApp/src/dltGateway.js b/src/dlt/gateway/dltApp/src/dltGateway.js index 80eeebc17..c2cfb5e45 100644 --- a/src/dlt/gateway/dltApp/src/dltGateway.js +++ b/src/dlt/gateway/dltApp/src/dltGateway.js @@ -104,7 +104,7 @@ async function getFromDlt(call, callback) { } catch (error) { if (error.message.includes("data not found for key")) { // Return an empty response when no record is found - callback(null, { record_id: call.request, data_json: "{}" }); + callback(null, { record_id: call.request, data_json: "" }); } else { // Send failure response with error message callback({ -- GitLab From 6a2a460a3672d7b8e5c252439c885b1ecb5acc3a Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 25 Jul 2024 17:00:32 +0000 Subject: [PATCH 398/602] Pre-merge cleanup --- manifests/kpi_value_apiservice.yaml | 3 --- manifests/kpi_value_writerservice.yaml | 3 --- src/common/tools/kafka/Variables.py | 2 +- src/kpi_manager/client/KpiManagerClient.py | 1 - src/kpi_manager/requirements.in | 29 ++++++++++++++-------- src/kpi_manager/tests/test_kpi_manager.py | 15 +++++------ 6 files changed, 27 insertions(+), 26 deletions(-) diff --git a/manifests/kpi_value_apiservice.yaml b/manifests/kpi_value_apiservice.yaml index 1a5dfc265..74eb90f67 100644 --- a/manifests/kpi_value_apiservice.yaml +++ b/manifests/kpi_value_apiservice.yaml @@ -39,9 +39,6 @@ spec: env: - name: LOG_LEVEL value: "INFO" - # envFrom: - # - secretRef: - # name: crdb-data readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:30020"] diff --git a/manifests/kpi_value_writerservice.yaml b/manifests/kpi_value_writerservice.yaml index 9bd5da943..8a8e44ec2 100644 --- a/manifests/kpi_value_writerservice.yaml +++ b/manifests/kpi_value_writerservice.yaml @@ -39,9 +39,6 @@ spec: env: - name: LOG_LEVEL value: "INFO" - envFrom: - - secretRef: - name: crdb-data readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:30030"] diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index bdb6708f3..24ae2cff7 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -22,7 +22,7 @@ LOGGER = logging.getLogger(__name__) class KafkaConfig(Enum): # SERVER_IP = "127.0.0.1:9092" - SERVER_IP = "kafka-service:9092" + SERVER_IP = "kafka-service.kafka.svc.cluster.local:9092" ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_IP}) class KafkaTopic(Enum): diff --git a/src/kpi_manager/client/KpiManagerClient.py b/src/kpi_manager/client/KpiManagerClient.py index 9e7079ae4..672d82f2d 100755 --- a/src/kpi_manager/client/KpiManagerClient.py +++ b/src/kpi_manager/client/KpiManagerClient.py @@ -33,7 +33,6 @@ class KpiManagerClient: if not port: port = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) self.endpoint = '{:s}:{:s}'.format(str(host), str(port)) LOGGER.debug('Creating channel to {:s}...'.format(str(self.endpoint))) - print('Creating channel to {:s}...'.format(str(self.endpoint))) self.channel = None self.stub = None diff --git a/src/kpi_manager/requirements.in b/src/kpi_manager/requirements.in index a06ae4a6e..3e98fef36 100644 --- a/src/kpi_manager/requirements.in +++ b/src/kpi_manager/requirements.in @@ -1,11 +1,18 @@ -SQLAlchemy==1.4.52 -sqlalchemy-cockroachdb==1.4.4 -SQLAlchemy-Utils==0.38.3 -psycopg2-binary==2.9.3 -confluent-kafka==2.3.0 -Jinja2==3.0.3 -ncclient==0.6.15 -pyang==2.6.0 -requests==2.27.1 -typing_extensions==4.12.0 -yattag==1.15.2 \ No newline at end of file +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +psycopg2-binary==2.9.* +SQLAlchemy==1.4.* +sqlalchemy-cockroachdb==1.4.* +SQLAlchemy-Utils==0.38.* diff --git a/src/kpi_manager/tests/test_kpi_manager.py b/src/kpi_manager/tests/test_kpi_manager.py index e5bf17a5f..b41e5139d 100755 --- a/src/kpi_manager/tests/test_kpi_manager.py +++ b/src/kpi_manager/tests/test_kpi_manager.py @@ -17,7 +17,7 @@ import os, pytest import logging from typing import Union -from common.proto.context_pb2 import Empty +#from common.proto.context_pb2 import Empty from common.Constants import ServiceNameEnum from common.Settings import ( ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_service_port_grpc) @@ -26,7 +26,7 @@ from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList from common.tools.service.GenericGrpcService import GenericGrpcService -from context.client.ContextClient import ContextClient +#from context.client.ContextClient import ContextClient # from device.service.driver_api.DriverFactory import DriverFactory # from device.service.driver_api.DriverInstanceCache import DriverInstanceCache @@ -40,10 +40,10 @@ from kpi_manager.tests.test_messages import create_kpi_descriptor_request from kpi_value_writer.tests.test_messages import create_kpi_id_request -from monitoring.service.NameMapping import NameMapping +#from monitoring.service.NameMapping import NameMapping -os.environ['DEVICE_EMULATED_ONLY'] = 'TRUE' -from device.service.drivers import DRIVERS +#os.environ['DEVICE_EMULATED_ONLY'] = 'TRUE' +#from device.service.drivers import DRIVERS ########################### # Tests Setup @@ -145,9 +145,10 @@ class MockContextService(GenericGrpcService): @pytest.fixture(scope='session') def kpi_manager_service(): LOGGER.info('Initializing KpiManagerService...') - name_mapping = NameMapping() + #name_mapping = NameMapping() # _service = MonitoringService(name_mapping) - _service = KpiManagerService(name_mapping) + # _service = KpiManagerService(name_mapping) + _service = KpiManagerService() _service.start() # yield the server, when test finishes, execution will resume to stop it -- GitLab From 042e86a1d94d08aeea7fcf9ff108653810074352 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 25 Jul 2024 17:02:49 +0000 Subject: [PATCH 399/602] Pre-merge cleanup --- src/kpi_value_api/requirements.in | 18 ++++++++++++++++-- src/kpi_value_writer/requirements.in | 18 ++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/kpi_value_api/requirements.in b/src/kpi_value_api/requirements.in index a642b5e58..7e4694109 100644 --- a/src/kpi_value_api/requirements.in +++ b/src/kpi_value_api/requirements.in @@ -1,2 +1,16 @@ -confluent-kafka==2.3.0 -requests==2.27.1 \ No newline at end of file +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +confluent-kafka==2.3.* +requests==2.27.* diff --git a/src/kpi_value_writer/requirements.in b/src/kpi_value_writer/requirements.in index a642b5e58..7e4694109 100644 --- a/src/kpi_value_writer/requirements.in +++ b/src/kpi_value_writer/requirements.in @@ -1,2 +1,16 @@ -confluent-kafka==2.3.0 -requests==2.27.1 \ No newline at end of file +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +confluent-kafka==2.3.* +requests==2.27.* -- GitLab From 92772d7bd815c92c4fe468fe0a10e090ef3855e8 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 25 Jul 2024 17:06:32 +0000 Subject: [PATCH 400/602] KPI Value Writer: - Added dependency in Dockerfile --- src/kpi_value_writer/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/kpi_value_writer/Dockerfile b/src/kpi_value_writer/Dockerfile index c84613cfc..70f41128b 100644 --- a/src/kpi_value_writer/Dockerfile +++ b/src/kpi_value_writer/Dockerfile @@ -63,6 +63,8 @@ RUN python3 -m pip install -r requirements.txt # Add component files into working directory WORKDIR /var/teraflow COPY src/kpi_value_writer/. kpi_value_writer/ +COPY src/kpi_manager/__init__.py kpi_manager/__init__.py +COPY src/kpi_manager/client/. kpi_manager/client/ # Start the service ENTRYPOINT ["python", "-m", "kpi_value_writer.service"] -- GitLab From 9375c6922ac318e846196e3c9944a7c78399051d Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 25 Jul 2024 17:09:04 +0000 Subject: [PATCH 401/602] Deployment scripts: - Corrected name collision in CRDB databases --- deploy/tfs.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/deploy/tfs.sh b/deploy/tfs.sh index b8e1f8837..f61cdb991 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -137,10 +137,11 @@ printf "\n" echo "Create secret with CockroachDB data" CRDB_SQL_PORT=$(kubectl --namespace ${CRDB_NAMESPACE} get service cockroachdb-public -o 'jsonpath={.spec.ports[?(@.name=="sql")].port}') +CRDB_DATABASE_CONTEXT=${CRDB_DATABASE} # TODO: change by specific configurable environment variable kubectl create secret generic crdb-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ --from-literal=CRDB_NAMESPACE=${CRDB_NAMESPACE} \ --from-literal=CRDB_SQL_PORT=${CRDB_SQL_PORT} \ - --from-literal=CRDB_DATABASE=${CRDB_DATABASE} \ + --from-literal=CRDB_DATABASE=${CRDB_DATABASE_CONTEXT} \ --from-literal=CRDB_USERNAME=${CRDB_USERNAME} \ --from-literal=CRDB_PASSWORD=${CRDB_PASSWORD} \ --from-literal=CRDB_SSLMODE=require @@ -148,10 +149,11 @@ printf "\n" echo "Create secret with CockroachDB data for KPI Management" CRDB_SQL_PORT=$(kubectl --namespace ${CRDB_NAMESPACE} get service cockroachdb-public -o 'jsonpath={.spec.ports[?(@.name=="sql")].port}') +CRDB_DATABASE_KPI_MGMT="tfs_kpi_mgmt" # TODO: change by specific configurable environment variable kubectl create secret generic crdb-kpi-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ --from-literal=CRDB_NAMESPACE=${CRDB_NAMESPACE} \ --from-literal=CRDB_SQL_PORT=${CRDB_SQL_PORT} \ - --from-literal=CRDB_DATABASE=${CRDB_DATABASE} \ + --from-literal=CRDB_DATABASE=${CRDB_DATABASE_KPI_MGMT} \ --from-literal=CRDB_USERNAME=${CRDB_USERNAME} \ --from-literal=CRDB_PASSWORD=${CRDB_PASSWORD} \ --from-literal=CRDB_SSLMODE=require -- GitLab From f69da29d9369a3f75b34655d0c86c5a24ae0aeb7 Mon Sep 17 00:00:00 2001 From: armingol Date: Fri, 26 Jul 2024 08:34:26 +0200 Subject: [PATCH 402/602] add attributes to Inventory NBI --- .../nbi_plugins/ietf_hardware/YangHandler.py | 52 ++++++++++--------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py index 4ddf8522a..aa0a90908 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py @@ -12,13 +12,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -import libyang, os from common.proto.context_pb2 import Device from typing import Dict, Optional +import datetime import json import logging +import libyang +import os import re -import datetime LOGGER = logging.getLogger(__name__) YANG_DIR = os.path.join(os.path.dirname(__file__), 'yang') @@ -88,9 +89,6 @@ class YangHandler: if component_type == "FRU" : component_type = "slack" - component_new.create_path('is-fru', True) - else : - component_new.create_path('is-fru', False) component_type = component_type.replace("_", "-").lower() component_type = 'iana-hardware:' + component_type @@ -101,14 +99,15 @@ class YangHandler: physical_index += 1 - component_new.create_path('description', attributes["description"]) - - parent_component_references = component_new.create_path('parent-component-references') - parent = parent_component_references.create_path('component-reference[index="{:d}"]'.format(physical_index)) - for component2 in device.components: - if component.parent == component2.name : - parent.create_path('uuid', component2.component_uuid.uuid) - break + component_new.create_path('description', attributes["description"].replace('/"',"")) + + if "CHASSIS" not in component.type: + parent_component_references = component_new.create_path('parent-component-references') + parent = parent_component_references.create_path('component-reference[index="{:d}"]'.format(physical_index)) + for component_parent in device.components: + if component.parent == component_parent.name : + parent.create_path('uuid', component_parent.component_uuid.uuid) + break if attributes["mfg-date"] != "": mfg_date = self.convert_to_iso_date(attributes["mfg-date"]) @@ -119,11 +118,22 @@ class YangHandler: component_new.create_path('firmware-rev', attributes["firmware-version"]) component_new.create_path('serial-num', attributes["serial-num"]) component_new.create_path('mfg-name', attributes["mfg-name"]) + if attributes["removable"]: + removable = attributes["removable"].lower() + if 'true' in removable: + component_new.create_path('is-fru', True) + elif 'false' in removable: + component_new.create_path('is-fru', False) + if attributes["id"]: try: - parent_rel_pos = int(attributes["id"].replace("\"", "")) - component_new.create_path('parent-rel-pos', parent_rel_pos) + if "CHASSIS" in component.type : + component_new.create_path('parent-rel-pos', 0) + else: + parent_rel_pos = int(attributes["id"].replace("\"", "")) + component_new.create_path('parent-rel-pos', parent_rel_pos) except ValueError: + LOGGER.info('ERROR:{:s} '.format(component.name )) continue component_new.create_path('uri', component.name) @@ -131,15 +141,9 @@ class YangHandler: component_new.create_path('uuid', component.component_uuid.uuid) - contained_child = [] - for component2 in device.components: - if component.name == component2.parent : - child_uuid = component2.component_uuid.uuid.strip("'") - contained_child.append(child_uuid) - LOGGER.info('parent: {:s}'.format(str(component))) - LOGGER.info('child: {:s}'.format(str(component2))) - - component_new.create_path('contained-child', contained_child) + for child in device.components: + if component.name == child.parent : + component_new.create_path('contained-child', child.component_uuid.uuid) return json.loads(hardware.print_mem('json')) -- GitLab From 19cc0f7cdf327a826055f852d4417f54a3007bad Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 26 Jul 2024 09:36:35 +0200 Subject: [PATCH 403/602] Debugging --- src/interdomain/service/topology_abstractor/DltRecorder.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index b4d18e9bc..53d2dbe31 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -113,6 +113,8 @@ class DLTRecorder(threading.Thread): self.topology_cache[topology_uuid] = topology_id + LOGGER.debug('TOPOLOGY Details({:s})'.format(grpc_message_to_json_string(topology_details))) + if ((context_uuid == DEFAULT_CONTEXT_NAME) or (context_name == DEFAULT_CONTEXT_NAME)) and \ (topology_uuid not in topology_uuids) and (topology_name not in topology_uuids): for device in topology_details.devices: -- GitLab From 250172128fe5a76463cd3936b28e68905c43a75c Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 26 Jul 2024 12:20:04 +0200 Subject: [PATCH 404/602] Updated the way the dlt_gateway handles chaincode responses --- src/dlt/gateway/dltApp/src/dltGateway.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dlt/gateway/dltApp/src/dltGateway.js b/src/dlt/gateway/dltApp/src/dltGateway.js index c2cfb5e45..f4f9c0d0a 100644 --- a/src/dlt/gateway/dltApp/src/dltGateway.js +++ b/src/dlt/gateway/dltApp/src/dltGateway.js @@ -100,7 +100,7 @@ async function getFromDlt(call, callback) { const result = JSON.parse(resultJson); // Send the response with the formatted JSON data - callback(null, { record_id: call.request, data_json: JSON.stringify(result) }); + callback(null, { record_id: call.request, operation: result.operation, data_json: result.data_json }); } catch (error) { if (error.message.includes("data not found for key")) { // Return an empty response when no record is found -- GitLab From 65ffb21328aaa60dcceb81dc2e6957c3cf59cf20 Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 26 Jul 2024 13:17:22 +0200 Subject: [PATCH 405/602] Debugging --- src/dlt/connector/client/DltGatewayClient.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dlt/connector/client/DltGatewayClient.py b/src/dlt/connector/client/DltGatewayClient.py index 31ad4cca2..cde278517 100644 --- a/src/dlt/connector/client/DltGatewayClient.py +++ b/src/dlt/connector/client/DltGatewayClient.py @@ -23,6 +23,7 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from dlt.connector.Config import DLT_GATEWAY_HOST, DLT_GATEWAY_PORT LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) MAX_RETRIES = 15 DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') -- GitLab From 3973667383b02166ab59f7c32ae79b989fbdcffd Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 26 Jul 2024 13:26:21 +0200 Subject: [PATCH 406/602] Debugging --- src/dlt/gateway/dltApp/src/dltGateway.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dlt/gateway/dltApp/src/dltGateway.js b/src/dlt/gateway/dltApp/src/dltGateway.js index f4f9c0d0a..f39a6cb32 100644 --- a/src/dlt/gateway/dltApp/src/dltGateway.js +++ b/src/dlt/gateway/dltApp/src/dltGateway.js @@ -74,7 +74,7 @@ async function recordToDlt(call, callback) { callback(null, { record_id, status: 'DLTRECORDSTATUS_SUCCEEDED' }); } catch (error) { // Send failure response with error message - //console.log("ERRROR", error) + console.log("ERRROR", error) callback(null, { record_id, status: 'DLTRECORDSTATUS_FAILED', error_message: error.message }); } } -- GitLab From 30468bc7ffe5a64d0edc397120089e4df4fb3907 Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 26 Jul 2024 14:41:08 +0200 Subject: [PATCH 407/602] Debugging --- src/dlt/gateway/dltApp/src/dltGateway.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dlt/gateway/dltApp/src/dltGateway.js b/src/dlt/gateway/dltApp/src/dltGateway.js index f39a6cb32..0dcfb7508 100644 --- a/src/dlt/gateway/dltApp/src/dltGateway.js +++ b/src/dlt/gateway/dltApp/src/dltGateway.js @@ -104,6 +104,7 @@ async function getFromDlt(call, callback) { } catch (error) { if (error.message.includes("data not found for key")) { // Return an empty response when no record is found + console.log("REQUEST ERROR:", error); callback(null, { record_id: call.request, data_json: "" }); } else { // Send failure response with error message -- GitLab From fe74613c866585fc23627578ab2a1abcd3b1c0a6 Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 26 Jul 2024 14:57:48 +0200 Subject: [PATCH 408/602] Debugging --- src/dlt/connector/service/tools/Checkers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dlt/connector/service/tools/Checkers.py b/src/dlt/connector/service/tools/Checkers.py index 6ad0f4b82..f628126ec 100644 --- a/src/dlt/connector/service/tools/Checkers.py +++ b/src/dlt/connector/service/tools/Checkers.py @@ -19,6 +19,6 @@ def record_exists(record : DltRecord) -> bool: exists = exists and (len(record.record_id.domain_uuid.uuid) > 0) exists = exists and (record.record_id.type != DLTRECORDTYPE_UNDEFINED) exists = exists and (len(record.record_id.record_uuid.uuid) > 0) - #exists = exists and (record.operation != DLTRECORDOPERATION_UNDEFINED) + exists = exists and (record.operation != DLTRECORDOPERATION_UNDEFINED) exists = exists and (len(record.data_json) > 0) return exists -- GitLab From 4371a0830b91f4110c76966f0de8a284c32ce57e Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 26 Jul 2024 15:04:50 +0200 Subject: [PATCH 409/602] Debugging --- src/dlt/connector/service/tools/Checkers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dlt/connector/service/tools/Checkers.py b/src/dlt/connector/service/tools/Checkers.py index f628126ec..94a10d409 100644 --- a/src/dlt/connector/service/tools/Checkers.py +++ b/src/dlt/connector/service/tools/Checkers.py @@ -19,6 +19,6 @@ def record_exists(record : DltRecord) -> bool: exists = exists and (len(record.record_id.domain_uuid.uuid) > 0) exists = exists and (record.record_id.type != DLTRECORDTYPE_UNDEFINED) exists = exists and (len(record.record_id.record_uuid.uuid) > 0) - exists = exists and (record.operation != DLTRECORDOPERATION_UNDEFINED) - exists = exists and (len(record.data_json) > 0) + #exists = exists and (record.operation != DLTRECORDOPERATION_UNDEFINED) + #exists = exists and (len(record.data_json) > 0) return exists -- GitLab From 22ffe9d0ad143a85cfa24b9f9e919bf281d0affd Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 26 Jul 2024 15:15:50 +0200 Subject: [PATCH 410/602] Debugging --- src/dlt/connector/service/tools/Checkers.py | 2 +- src/dlt/gateway/dltApp/src/dltGateway.js | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/dlt/connector/service/tools/Checkers.py b/src/dlt/connector/service/tools/Checkers.py index 94a10d409..6ad0f4b82 100644 --- a/src/dlt/connector/service/tools/Checkers.py +++ b/src/dlt/connector/service/tools/Checkers.py @@ -20,5 +20,5 @@ def record_exists(record : DltRecord) -> bool: exists = exists and (record.record_id.type != DLTRECORDTYPE_UNDEFINED) exists = exists and (len(record.record_id.record_uuid.uuid) > 0) #exists = exists and (record.operation != DLTRECORDOPERATION_UNDEFINED) - #exists = exists and (len(record.data_json) > 0) + exists = exists and (len(record.data_json) > 0) return exists diff --git a/src/dlt/gateway/dltApp/src/dltGateway.js b/src/dlt/gateway/dltApp/src/dltGateway.js index 0dcfb7508..ba9a67a31 100644 --- a/src/dlt/gateway/dltApp/src/dltGateway.js +++ b/src/dlt/gateway/dltApp/src/dltGateway.js @@ -93,7 +93,7 @@ async function getFromDlt(call, callback) { try { console.log("RECEIVED CALL REQUEST:", call.request); - const { record_uuid } = call.request; + //const { record_id, operation, data_json } = call.request; const resultBytes = await contractInstance.evaluateTransaction('RetrieveRecord', JSON.stringify(call.request)); // Decode and parse the result const resultJson = utf8Decoder.decode(resultBytes); @@ -105,7 +105,12 @@ async function getFromDlt(call, callback) { if (error.message.includes("data not found for key")) { // Return an empty response when no record is found console.log("REQUEST ERROR:", error); - callback(null, { record_id: call.request, data_json: "" }); + const emptyRecordId = { + domain_uuid: { uuid: "" }, + type: 'DLTRECORDTYPE_UNDEFINED', + record_uuid: { uuid: "" } + }; + callback(null, { record_id: emptyRecordId, data_json: "" }); } else { // Send failure response with error message callback({ -- GitLab From 21a3d49ce3b68e411a81004ea74ddad5ded8d605 Mon Sep 17 00:00:00 2001 From: diazjj Date: Fri, 26 Jul 2024 15:22:09 +0200 Subject: [PATCH 411/602] Debugging --- src/dlt/connector/service/tools/Checkers.py | 2 +- .../topology_abstractor/DltRecorderOld.py | 133 ------------------ 2 files changed, 1 insertion(+), 134 deletions(-) delete mode 100644 src/interdomain/service/topology_abstractor/DltRecorderOld.py diff --git a/src/dlt/connector/service/tools/Checkers.py b/src/dlt/connector/service/tools/Checkers.py index 6ad0f4b82..94a10d409 100644 --- a/src/dlt/connector/service/tools/Checkers.py +++ b/src/dlt/connector/service/tools/Checkers.py @@ -20,5 +20,5 @@ def record_exists(record : DltRecord) -> bool: exists = exists and (record.record_id.type != DLTRECORDTYPE_UNDEFINED) exists = exists and (len(record.record_id.record_uuid.uuid) > 0) #exists = exists and (record.operation != DLTRECORDOPERATION_UNDEFINED) - exists = exists and (len(record.data_json) > 0) + #exists = exists and (len(record.data_json) > 0) return exists diff --git a/src/interdomain/service/topology_abstractor/DltRecorderOld.py b/src/interdomain/service/topology_abstractor/DltRecorderOld.py deleted file mode 100644 index cb8c194eb..000000000 --- a/src/interdomain/service/topology_abstractor/DltRecorderOld.py +++ /dev/null @@ -1,133 +0,0 @@ -import logging -import threading -from typing import Dict, Optional - -from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum -from common.Settings import ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_environment_variables, get_env_var_name -from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, DeviceId, EndPointId, Link, LinkEvent, TopologyId, TopologyEvent -from common.tools.context_queries.Context import create_context -from common.tools.context_queries.Device import get_uuids_of_devices_in_topology -from common.tools.context_queries.Topology import create_missing_topologies -from common.tools.grpc.Tools import grpc_message_to_json_string -from common.tools.object_factory.Context import json_context_id -from common.tools.object_factory.Device import json_device_id -from common.tools.object_factory.Topology import json_topology_id -from context.client.ContextClient import ContextClient -from context.client.EventsCollector import EventsCollector -from dlt.connector.client.DltConnectorClient import DltConnectorClient -from .DltRecordSender import DltRecordSender -from .Types import EventTypes - -LOGGER = logging.getLogger(__name__) - -ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) -INTERDOMAIN_TOPOLOGY_ID = TopologyId(**json_topology_id(INTERDOMAIN_TOPOLOGY_NAME, context_id=ADMIN_CONTEXT_ID)) - - -class DLTRecorder(threading.Thread): - def __init__(self) -> None: - super().__init__(daemon=True) - self.terminate = threading.Event() - self.context_client = ContextClient() - self.context_event_collector = EventsCollector(self.context_client) - - def stop(self): - self.terminate.set() - - def run(self) -> None: - self.context_client.connect() - create_context(self.context_client, DEFAULT_CONTEXT_NAME) - self.create_topologies() - self.context_event_collector.start() - - while not self.terminate.is_set(): - event = self.context_event_collector.get_event(timeout=0.1) - if event is None: - continue - LOGGER.info('Processing Event({:s})...'.format(grpc_message_to_json_string(event))) - self.update_record(event) - - self.context_event_collector.stop() - self.context_client.close() - - def create_topologies(self): - topology_uuids = [DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME] - create_missing_topologies(self.context_client, ADMIN_CONTEXT_ID, topology_uuids) - - def get_dlt_connector_client(self) -> Optional[DltConnectorClient]: - env_vars = find_environment_variables([ - get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_HOST), - get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), - ]) - if len(env_vars) == 2: - dlt_connector_client = DltConnectorClient() - dlt_connector_client.connect() - return dlt_connector_client - return None - - def update_record(self, event: EventTypes) -> None: - dlt_connector_client = self.get_dlt_connector_client() - dlt_record_sender = DltRecordSender(self.context_client, dlt_connector_client) - - if isinstance(event, ContextEvent): - LOGGER.debug('Processing ContextEvent({:s})'.format(grpc_message_to_json_string(event))) - LOGGER.warning('Ignoring ContextEvent({:s})'.format(grpc_message_to_json_string(event))) - - elif isinstance(event, TopologyEvent): - LOGGER.debug('Processing TopologyEvent({:s})'.format(grpc_message_to_json_string(event))) - self.process_topology_event(event, dlt_record_sender) - - elif isinstance(event, DeviceEvent): - LOGGER.debug('Processing DeviceEvent({:s})'.format(grpc_message_to_json_string(event))) - self.process_device_event(event, dlt_record_sender) - - elif isinstance(event, LinkEvent): - LOGGER.debug('Processing LinkEvent({:s})'.format(grpc_message_to_json_string(event))) - self.process_link_event(event, dlt_record_sender) - - else: - LOGGER.warning('Unsupported Event({:s})'.format(grpc_message_to_json_string(event))) - - dlt_record_sender.commit() - if dlt_connector_client is not None: - dlt_connector_client.close() - - def process_topology_event(self, event: TopologyEvent, dlt_record_sender: DltRecordSender) -> None: - topology_id = event.topology_id - topology_uuid = topology_id.topology_uuid.uuid - context_id = topology_id.context_id - context_uuid = context_id.context_uuid.uuid - topology_uuids = {DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME} - - context = self.context_client.GetContext(context_id) - context_name = context.name - - topology_details = self.context_client.GetTopologyDetails(topology_id) - topology_name = topology_details.name - - if ((context_uuid == DEFAULT_CONTEXT_NAME) or (context_name == DEFAULT_CONTEXT_NAME)) and \ - (topology_uuid not in topology_uuids) and (topology_name not in topology_uuids): - for device in topology_details.devices: - dlt_record_sender.add_device(topology_id, device) - - for link in topology_details.links: - dlt_record_sender.add_link(topology_id, link) - - else: - MSG = 'Ignoring ({:s}/{:s})({:s}/{:s}) TopologyEvent({:s})' - args = context_uuid, context_name, topology_uuid, topology_name, grpc_message_to_json_string(event) - LOGGER.warning(MSG.format(*args)) - - -#Check which ID to use. - - def process_device_event(self, event: DeviceEvent, dlt_record_sender: DltRecordSender) -> None: - device_id = event.device_id - device_uuid = device_id.device_uuid.uuid - device = self.context_client.GetDevice(device_id) - dlt_record_sender.add_device(device_id.context_id, device) - - def process_link_event(self, event: LinkEvent, dlt_record_sender: DltRecordSender) -> None: - link_id = event.link_id - link = self.context_client.GetLink(link_id) - dlt_record_sender.add_link(link_id.context_id, link) -- GitLab From fca7587e762136aeb7c7103ee8c93057e5d5ee35 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 26 Jul 2024 13:56:17 +0000 Subject: [PATCH 412/602] Multiple bug Fixes for KPI Management. - fixes deployment of KPI Writer and API --- deploy/tfs.sh | 4 +- scripts/run_tests_locally-kpi-DB.sh | 2 + scripts/run_tests_locally-kpi-manager.sh | 2 + scripts/run_tests_locally-kpi-prom-writer.sh | 2 + src/kpi_manager/database/KpiEngine.py | 4 +- src/kpi_manager/database/Kpi_DB.py | 6 +- .../service/KpiManagerServiceServicerImpl.py | 9 +- src/kpi_value_api/service/__main__.py | 1 - .../service/KpiValueWriter.py | 29 +++-- src/kpi_value_writer/service/KpiWriterOld.py | 108 ------------------ 10 files changed, 32 insertions(+), 135 deletions(-) delete mode 100644 src/kpi_value_writer/service/KpiWriterOld.py diff --git a/deploy/tfs.sh b/deploy/tfs.sh index f61cdb991..62f36a2c1 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -340,7 +340,7 @@ for COMPONENT in $TFS_COMPONENTS; do echo " Deploying '$COMPONENT' component to Kubernetes..." DEPLOY_LOG="$TMP_LOGS_FOLDER/deploy_${COMPONENT}.log" kubectl --namespace $TFS_K8S_NAMESPACE apply -f "$MANIFEST" > "$DEPLOY_LOG" - COMPONENT_OBJNAME=$(echo "${COMPONENT}" | sed "s/\_/-/") + COMPONENT_OBJNAME=$(echo "${COMPONENT}" | sed "s/\_/-/g") #kubectl --namespace $TFS_K8S_NAMESPACE scale deployment --replicas=0 ${COMPONENT_OBJNAME}service >> "$DEPLOY_LOG" #kubectl --namespace $TFS_K8S_NAMESPACE scale deployment --replicas=1 ${COMPONENT_OBJNAME}service >> "$DEPLOY_LOG" @@ -391,7 +391,7 @@ printf "\n" for COMPONENT in $TFS_COMPONENTS; do echo "Waiting for '$COMPONENT' component..." - COMPONENT_OBJNAME=$(echo "${COMPONENT}" | sed "s/\_/-/") + COMPONENT_OBJNAME=$(echo "${COMPONENT}" | sed "s/\_/-/g") kubectl wait --namespace $TFS_K8S_NAMESPACE \ --for='condition=available' --timeout=90s deployment/${COMPONENT_OBJNAME}service WAIT_EXIT_CODE=$? diff --git a/scripts/run_tests_locally-kpi-DB.sh b/scripts/run_tests_locally-kpi-DB.sh index d43be66e1..4953b49e0 100755 --- a/scripts/run_tests_locally-kpi-DB.sh +++ b/scripts/run_tests_locally-kpi-DB.sh @@ -24,5 +24,7 @@ cd $PROJECTDIR/src # python3 kpi_manager/tests/test_unitary.py RCFILE=$PROJECTDIR/coverage/.coveragerc +CRDB_SQL_ADDRESS=$(kubectl --namespace ${CRDB_NAMESPACE} get service cockroachdb-public -o 'jsonpath={.spec.clusterIP}') +export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_kpi_mgmt?sslmode=require" python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ kpi_manager/tests/test_kpi_db.py diff --git a/scripts/run_tests_locally-kpi-manager.sh b/scripts/run_tests_locally-kpi-manager.sh index db6e78683..a6a24f90d 100755 --- a/scripts/run_tests_locally-kpi-manager.sh +++ b/scripts/run_tests_locally-kpi-manager.sh @@ -24,5 +24,7 @@ cd $PROJECTDIR/src # python3 kpi_manager/tests/test_unitary.py RCFILE=$PROJECTDIR/coverage/.coveragerc +CRDB_SQL_ADDRESS=$(kubectl --namespace ${CRDB_NAMESPACE} get service cockroachdb-public -o 'jsonpath={.spec.clusterIP}') +export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_kpi_mgmt?sslmode=require" python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ kpi_manager/tests/test_kpi_manager.py diff --git a/scripts/run_tests_locally-kpi-prom-writer.sh b/scripts/run_tests_locally-kpi-prom-writer.sh index 1179cbf86..8865a8a34 100755 --- a/scripts/run_tests_locally-kpi-prom-writer.sh +++ b/scripts/run_tests_locally-kpi-prom-writer.sh @@ -19,5 +19,7 @@ PROJECTDIR=`pwd` cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc +CRDB_SQL_ADDRESS=$(kubectl --namespace ${CRDB_NAMESPACE} get service cockroachdb-public -o 'jsonpath={.spec.clusterIP}') +export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_kpi_mgmt?sslmode=require" python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ kpi_value_writer/tests/test_metric_writer_to_prom.py diff --git a/src/kpi_manager/database/KpiEngine.py b/src/kpi_manager/database/KpiEngine.py index 42bda9527..dff406de6 100644 --- a/src/kpi_manager/database/KpiEngine.py +++ b/src/kpi_manager/database/KpiEngine.py @@ -27,11 +27,11 @@ class KpiEngine: if crdb_uri is None: CRDB_NAMESPACE = get_setting('CRDB_NAMESPACE') CRDB_SQL_PORT = get_setting('CRDB_SQL_PORT') - CRDB_DATABASE = get_setting('CRDB_DATABASE') + CRDB_DATABASE = 'tfs_kpi_mgmt' # TODO: define variable get_setting('CRDB_DATABASE_KPI_MGMT') CRDB_USERNAME = get_setting('CRDB_USERNAME') CRDB_PASSWORD = get_setting('CRDB_PASSWORD') CRDB_SSLMODE = get_setting('CRDB_SSLMODE') - crdb_uri = CRDB_URI_TEMPLATE.format( + crdb_uri = CRDB_URI_TEMPLATE.format( CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) # crdb_uri = CRDB_URI_TEMPLATE.format( # CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) diff --git a/src/kpi_manager/database/Kpi_DB.py b/src/kpi_manager/database/Kpi_DB.py index 5b2b586b6..dcd28489b 100644 --- a/src/kpi_manager/database/Kpi_DB.py +++ b/src/kpi_manager/database/Kpi_DB.py @@ -18,10 +18,10 @@ from sqlalchemy.orm import sessionmaker from kpi_manager.database.KpiEngine import KpiEngine from kpi_manager.database.KpiModel import Kpi as KpiModel from common.method_wrappers.ServiceExceptions import ( - AlreadyExistsException, OperationFailedException) + AlreadyExistsException, OperationFailedException , NotFoundException) LOGGER = logging.getLogger(__name__) -DB_NAME = "kpi" +DB_NAME = "tfs_kpi_mgmt" class KpiDB: def __init__(self): @@ -86,7 +86,7 @@ class KpiDB: return entity else: LOGGER.debug(f"{model.__name__} ID not found: {str(id_to_search)}") - return None + raise NotFoundException (model.__name__, id_to_search, extra_details=["Row not found with ID"] ) except Exception as e: session.rollback() LOGGER.debug(f"Failed to retrieve {model.__name__} ID. {str(e)}") diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py index 05292fc5b..bea2c78b4 100644 --- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -52,13 +52,8 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): try: kpi_id_to_search = request.kpi_id.uuid row = self.kpi_db_obj.search_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) - if row is not None: - response = KpiModel.convert_row_to_KpiDescriptor(row) - return response - if row is None: - print ('No matching row found for kpi id: {:}'.format(kpi_id_to_search)) - LOGGER.info('No matching row found kpi id: {:}'.format(kpi_id_to_search)) - return Empty() + response = KpiModel.convert_row_to_KpiDescriptor(row) + return response except Exception as e: print ('Unable to search kpi id. {:}'.format(e)) LOGGER.info('Unable to search kpi id. {:}'.format(e)) diff --git a/src/kpi_value_api/service/__main__.py b/src/kpi_value_api/service/__main__.py index 8b4ebe296..f0f265a48 100644 --- a/src/kpi_value_api/service/__main__.py +++ b/src/kpi_value_api/service/__main__.py @@ -13,7 +13,6 @@ # limitations under the License. import logging, signal, sys, threading -from prometheus_client import start_http_server from common.Settings import get_log_level from .KpiValueApiService import KpiValueApiService diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index a4b10ed63..26bab4465 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -17,20 +17,29 @@ import threading from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from common.proto.kpi_value_api_pb2 import KpiValue from common.proto.kpi_manager_pb2 import KpiDescriptor, KpiId +from common.Settings import get_service_port_grpc +from common.Constants import ServiceNameEnum +from common.tools.service.GenericGrpcService import GenericGrpcService + from confluent_kafka import KafkaError from confluent_kafka import Consumer as KafkaConsumer from kpi_manager.client.KpiManagerClient import KpiManagerClient # -- test import -- -from kpi_value_writer.tests.test_messages import create_kpi_descriptor_request +# from kpi_value_writer.tests.test_messages import create_kpi_descriptor_request from .MetricWriterToPrometheus import MetricWriterToPrometheus LOGGER = logging.getLogger(__name__) ACTIVE_CONSUMERS = [] +METRIC_WRITER = MetricWriterToPrometheus() + +class KpiValueWriter(GenericGrpcService): + def __init__(self, cls_name : str = __name__) -> None: + port = get_service_port_grpc(ServiceNameEnum.KPIVALUEWRITER) + super().__init__(port, cls_name=cls_name) -class KpiValueWriter: @staticmethod def RunKafkaConsumer(): thread = threading.Thread(target=KpiValueWriter.KafkaConsumer, args=()) @@ -44,11 +53,7 @@ class KpiValueWriter: 'group.id' : __class__, 'auto.offset.reset' : 'latest'} ) - - metric_writer_to_prom = MetricWriterToPrometheus() kpi_manager_client = KpiManagerClient() - print("Kpi manger client created: {:}".format(kpi_manager_client)) - kafka_consumer.subscribe([KafkaTopic.VALUE.value]) LOGGER.debug("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) print("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) @@ -84,15 +89,15 @@ class KpiValueWriter: try: kpi_descriptor_object = KpiDescriptor() kpi_descriptor_object = kpi_manager_client.GetKpiDescriptor(kpi_id) - - print("kpi descriptor received: {:}".format(kpi_descriptor_object)) - if isinstance (kpi_descriptor_object, KpiDescriptor): + if kpi_descriptor_object.kpi_id.kpi_id.uuid == kpi_id.kpi_id.uuid: + # print("kpi descriptor received: {:}".format(kpi_descriptor_object)) + # if isinstance (kpi_descriptor_object, KpiDescriptor): LOGGER.info("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) print("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) - MetricWriterToPrometheus.create_and_expose_cooked_kpi(kpi_descriptor_object, kpi_value) + METRIC_WRITER.create_and_expose_cooked_kpi(kpi_descriptor_object, kpi_value) else: - LOGGER.info("Error in extracting KpiDescriptor {:}".format(kpi_descriptor_object)) - print("Error in extracting KpiDescriptor {:}".format(kpi_descriptor_object)) + LOGGER.info("No KPI Descriptor found in DB for Kpi ID: {:}".format(kpi_id)) + print("No KPI Descriptor found in DB for Kpi ID: {:}".format(kpi_id)) except Exception as e: LOGGER.info("Unable to get KpiDescriptor. Error: {:}".format(e)) print ("Unable to get KpiDescriptor. Error: {:}".format(e)) diff --git a/src/kpi_value_writer/service/KpiWriterOld.py b/src/kpi_value_writer/service/KpiWriterOld.py deleted file mode 100644 index b9a4316b0..000000000 --- a/src/kpi_value_writer/service/KpiWriterOld.py +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. - -# read Kafka stream from Kafka topic - -import ast -import time -import threading -from confluent_kafka import KafkaError -from prometheus_client import start_http_server, Gauge, CollectorRegistry -from confluent_kafka import Consumer as KafkaConsumer - -KAFKA_SERVER_IP = '127.0.0.1:9092' -KAFKA_TOPICS = {'request' : 'topic_request', 'response': 'topic_response', - 'raw' : 'topic_raw' , 'labeled' : 'topic_labeled'} -CONSUMER_CONFIG = {'bootstrap.servers' : KAFKA_SERVER_IP, - 'group.id' : 'kpi_writer', - 'auto.offset.reset' : 'latest'} -KPIs_TO_SEARCH = ["node_network_receive_packets_total", - "node_network_receive_bytes_total", - "node_network_transmit_bytes_total", - "process_open_fds"] -PROM_METRICS = {} -KAFKA_REGISTERY = CollectorRegistry() - -class KpiWriter: - def __init__(self) -> None: - pass - - @staticmethod - def kpi_writer(): - KpiWriter.create_prom_metrics_name() - threading.Thread(target=KpiWriter.kafka_listener, args=()).start() - - @staticmethod - def kafka_listener(): - """ - listener for events on Kafka topic. - """ - # Start up the server to expose the metrics at port number mention below. - start_http_server(8101, registry=KAFKA_REGISTERY) - kafka_consumer = KafkaConsumer(CONSUMER_CONFIG) - kafka_consumer.subscribe([KAFKA_TOPICS['labeled']]) - while True: - receive_msg = kafka_consumer.poll(2.0) - if receive_msg is None: - # print (" - Telemetry frontend listening on Kafka Topic: ", KAFKA_TOPICS['raw']) # added for debugging purposes - continue - elif receive_msg.error(): - if receive_msg.error().code() == KafkaError._PARTITION_EOF: - continue - else: - print("Consumer error: {}".format(receive_msg.error())) - continue - try: - new_event = receive_msg.value().decode('utf-8') - # print("New event on topic '{:}' is {:}".format(KAFKA_TOPICS['raw'], new_event)) - # LOGGER.info("New event on topic '{:}' is {:}".format(KAFKA_TOPICS['raw'], new_event)) - KpiWriter.write_metric_to_promtheus(new_event) - except Exception as e: - print(f"Error to consume event from topic: {KAFKA_TOPICS['labeled']}. Error detail: {str(e)}") - continue - - # send metric to Prometheus - @staticmethod - def write_metric_to_promtheus(event): - event = ast.literal_eval(event) # converted into dict - print("New recevied event: {:}".format(event)) - event_kpi_name = event['kpi_description'] - if event_kpi_name in KPIs_TO_SEARCH: - PROM_METRICS[event_kpi_name].labels( - kpi_id = event['kpi_id'], - kpi_sample_type = event['kpi_sample_type'], - device_id = event['device_id'], - endpoint_id = event['endpoint_id'], - service_id = event['service_id'], - slice_id = event['slice_id'], - connection_id = event['connection_id'], - link_id = event['link_id'] - ).set(float(event['kpi_value'])) - time.sleep(0.05) - - @staticmethod - def create_prom_metrics_name(): - metric_tags = ['kpi_id','kpi_sample_type','device_id', - 'endpoint_id','service_id','slice_id','connection_id','link_id'] - for metric_key in KPIs_TO_SEARCH: - metric_name = metric_key - metric_description = "description of " + str(metric_key) - try: - PROM_METRICS[metric_key] = Gauge ( - metric_name, metric_description, metric_tags, - registry=KAFKA_REGISTERY ) - # print("Metric pushed to Prometheus: {:}".format(PROM_METRICS[metric_key])) - except ValueError as e: - if 'Duplicated timeseries' in str(e): - print("Metric {:} is already registered. Skipping.".format(metric_name)) -- GitLab From 2ea824bf0eb18090afdcc9b14ff1ac48d03819e3 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 26 Jul 2024 14:02:52 +0000 Subject: [PATCH 413/602] KPI Management: - Activated CI/CD build and unitary test --- .gitlab-ci.yml | 1 + src/kpi_manager/.gitlab-ci.yml | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e2d653e03..59e0f0043 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -45,6 +45,7 @@ include: #- local: '/src/dlt/.gitlab-ci.yml' - local: '/src/load_generator/.gitlab-ci.yml' - local: '/src/bgpls_speaker/.gitlab-ci.yml' + - local: '/src/kpi_manager/.gitlab-ci.yml' # This should be last one: end-to-end integration tests - local: '/src/tests/.gitlab-ci.yml' diff --git a/src/kpi_manager/.gitlab-ci.yml b/src/kpi_manager/.gitlab-ci.yml index 6aef328ea..7d3870036 100644 --- a/src/kpi_manager/.gitlab-ci.yml +++ b/src/kpi_manager/.gitlab-ci.yml @@ -68,8 +68,6 @@ unit_test kpi-manager: - docker ps -a - CRDB_ADDRESS=$(docker inspect crdb --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") - echo $CRDB_ADDRESS - - NATS_ADDRESS=$(docker inspect nats --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") - - echo $NATS_ADDRESS - > docker run --name $IMAGE_NAME -d -p 30010:30010 --env "CRDB_URI=cockroachdb://tfs:tfs123@${CRDB_ADDRESS}:26257/tfs_test?sslmode=require" -- GitLab From c5e197135fd975e0f98533695ab662a132b66f53 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 26 Jul 2024 14:34:52 +0000 Subject: [PATCH 414/602] KPI Management: - Activated CI/CD build and unitary test --- .gitlab-ci.yml | 2 ++ src/kpi_manager/.gitlab-ci.yml | 4 ++-- src/kpi_value_api/.gitlab-ci.yml | 4 ++-- src/kpi_value_writer/.gitlab-ci.yml | 4 ++-- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 59e0f0043..0c5ff9325 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -46,6 +46,8 @@ include: - local: '/src/load_generator/.gitlab-ci.yml' - local: '/src/bgpls_speaker/.gitlab-ci.yml' - local: '/src/kpi_manager/.gitlab-ci.yml' + - local: '/src/kpi_value_api/.gitlab-ci.yml' + - local: '/src/kpi_value_writer/.gitlab-ci.yml' # This should be last one: end-to-end integration tests - local: '/src/tests/.gitlab-ci.yml' diff --git a/src/kpi_manager/.gitlab-ci.yml b/src/kpi_manager/.gitlab-ci.yml index 7d3870036..498cfd89f 100644 --- a/src/kpi_manager/.gitlab-ci.yml +++ b/src/kpi_manager/.gitlab-ci.yml @@ -15,7 +15,7 @@ # Build, tag, and push the Docker image to the GitLab Docker registry build kpi-manager: variables: - IMAGE_NAME: 'kpi-manager' # name of the microservice + IMAGE_NAME: 'kpi_manager' # name of the microservice IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) stage: build before_script: @@ -41,7 +41,7 @@ build kpi-manager: # Apply unit test to the component unit_test kpi-manager: variables: - IMAGE_NAME: 'kpi-manager' # name of the microservice + IMAGE_NAME: 'kpi_manager' # name of the microservice IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) stage: unit_test needs: diff --git a/src/kpi_value_api/.gitlab-ci.yml b/src/kpi_value_api/.gitlab-ci.yml index c9107abaa..166e9d3cb 100644 --- a/src/kpi_value_api/.gitlab-ci.yml +++ b/src/kpi_value_api/.gitlab-ci.yml @@ -15,7 +15,7 @@ # Build, tag, and push the Docker image to the GitLab Docker registry build kpi-value-api: variables: - IMAGE_NAME: 'kpi-value-api' # name of the microservice + IMAGE_NAME: 'kpi_value_api' # name of the microservice IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) stage: build before_script: @@ -41,7 +41,7 @@ build kpi-value-api: # Apply unit test to the component unit_test kpi-value-api: variables: - IMAGE_NAME: 'kpi-value-api' # name of the microservice + IMAGE_NAME: 'kpi_value_api' # name of the microservice IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) stage: unit_test needs: diff --git a/src/kpi_value_writer/.gitlab-ci.yml b/src/kpi_value_writer/.gitlab-ci.yml index 52b1b8fe6..25619ce7f 100644 --- a/src/kpi_value_writer/.gitlab-ci.yml +++ b/src/kpi_value_writer/.gitlab-ci.yml @@ -15,7 +15,7 @@ # Build, tag, and push the Docker image to the GitLab Docker registry build kpi-value-writer: variables: - IMAGE_NAME: 'kpi-value-writer' # name of the microservice + IMAGE_NAME: 'kpi_value_writer' # name of the microservice IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) stage: build before_script: @@ -41,7 +41,7 @@ build kpi-value-writer: # Apply unit test to the component unit_test kpi-value-writer: variables: - IMAGE_NAME: 'kpi-value-writer' # name of the microservice + IMAGE_NAME: 'kpi_value_writer' # name of the microservice IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) stage: unit_test needs: -- GitLab From 439212b7aa408638206ae475c5c91c91cfba3a07 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 09:45:01 +0200 Subject: [PATCH 415/602] Debugging --- src/dlt/connector/service/__main__.py | 2 ++ .../service/topology_abstractor/DltRecordSender.py | 4 +++- src/interdomain/service/topology_abstractor/DltRecorder.py | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/dlt/connector/service/__main__.py b/src/dlt/connector/service/__main__.py index 5e0fb6f87..b13f4257b 100644 --- a/src/dlt/connector/service/__main__.py +++ b/src/dlt/connector/service/__main__.py @@ -53,6 +53,8 @@ def main(): event_dispatcher = DltEventDispatcher() event_dispatcher.start() + # Context Event dispatcher + # Starting DLT connector service grpc_service = DltConnectorService() grpc_service.start() diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index a504fe01b..fd5bfa35a 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -21,6 +21,7 @@ from dlt.connector.client.DltConnectorClient import DltConnectorClient from .Types import DltRecordTypes LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) class DltRecordSender: def __init__(self, context_client : ContextClient, dlt_connector_client : Optional[DltConnectorClient]) -> None: @@ -64,7 +65,8 @@ class DltRecordSender: for dlt_record_uuid in self.dlt_record_uuids: topology_id,dlt_record = self.dlt_record_uuid_to_data[dlt_record_uuid] if isinstance(dlt_record, Device): - device_id = self.context_client.SetDevice(dlt_record) + device_id = self.context_client.SetDevice(dlt_record) # Se retriggerea el Evento. + LOGGER.debug('DEVICE ID: ({:s})'.format(str(dlt_record))) if self.dlt_connector_client is None: continue dlt_device_id = DltDeviceId() dlt_device_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index 53d2dbe31..7c48c750a 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -118,6 +118,7 @@ class DLTRecorder(threading.Thread): if ((context_uuid == DEFAULT_CONTEXT_NAME) or (context_name == DEFAULT_CONTEXT_NAME)) and \ (topology_uuid not in topology_uuids) and (topology_name not in topology_uuids): for device in topology_details.devices: + LOGGER.debug('DEVICE INFO({:s})'.format(grpc_message_to_json_string(device))) dlt_record_sender.add_device(topology_id, device) for link in topology_details.links: @@ -149,6 +150,7 @@ class DLTRecorder(threading.Thread): device = self.context_client.GetDevice(device_id) topology_id = self.find_topology_for_device(device_id) if topology_id: + LOGGER.debug('DEVICE INFO({:s}), DEVICE ID ({:s})'.format(grpc_message_to_json_string(device)), (str(device_id))) dlt_record_sender.add_device(topology_id, device) else: LOGGER.warning(f"Topology not found for device {device_id.device_uuid.uuid}") -- GitLab From 0944f56ec1f0bd470461821d885e42ceb2ea1514 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 09:55:49 +0200 Subject: [PATCH 416/602] debugging --- src/interdomain/service/topology_abstractor/DltRecordSender.py | 2 +- src/interdomain/service/topology_abstractor/DltRecorder.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index fd5bfa35a..12722925a 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -66,7 +66,7 @@ class DltRecordSender: topology_id,dlt_record = self.dlt_record_uuid_to_data[dlt_record_uuid] if isinstance(dlt_record, Device): device_id = self.context_client.SetDevice(dlt_record) # Se retriggerea el Evento. - LOGGER.debug('DEVICE ID: ({:s})'.format(str(dlt_record))) + LOGGER.debug('DEVICE_ID: ({:s})'.format(str(dlt_record))) if self.dlt_connector_client is None: continue dlt_device_id = DltDeviceId() dlt_device_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index 7c48c750a..3588fa836 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -150,7 +150,8 @@ class DLTRecorder(threading.Thread): device = self.context_client.GetDevice(device_id) topology_id = self.find_topology_for_device(device_id) if topology_id: - LOGGER.debug('DEVICE INFO({:s}), DEVICE ID ({:s})'.format(grpc_message_to_json_string(device)), (str(device_id))) + LOGGER.debug('DEVICE_INFO({:s}), DEVICE_ID ({:s})'.format(grpc_message_to_json_string(device), str(device_id))) + dlt_record_sender.add_device(topology_id, device) else: LOGGER.warning(f"Topology not found for device {device_id.device_uuid.uuid}") -- GitLab From e803ec1cdd099a11fd30c98c1a14980532a03963 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 10:07:34 +0200 Subject: [PATCH 417/602] debugging --- src/interdomain/service/topology_abstractor/DltRecordSender.py | 2 +- src/interdomain/service/topology_abstractor/DltRecorder.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index 12722925a..7710b9473 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -66,7 +66,7 @@ class DltRecordSender: topology_id,dlt_record = self.dlt_record_uuid_to_data[dlt_record_uuid] if isinstance(dlt_record, Device): device_id = self.context_client.SetDevice(dlt_record) # Se retriggerea el Evento. - LOGGER.debug('DEVICE_ID: ({:s})'.format(str(dlt_record))) + LOGGER.debug('DEVICE_ID: ({:s})'.format(str(device_id))) if self.dlt_connector_client is None: continue dlt_device_id = DltDeviceId() dlt_device_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index 3588fa836..2adac1726 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -150,7 +150,7 @@ class DLTRecorder(threading.Thread): device = self.context_client.GetDevice(device_id) topology_id = self.find_topology_for_device(device_id) if topology_id: - LOGGER.debug('DEVICE_INFO({:s}), DEVICE_ID ({:s})'.format(grpc_message_to_json_string(device), str(device_id))) + LOGGER.debug('DEVICE_INFO({:s}), DEVICE_ID ({:s})'.format(grpc_message_to_json_string(device), grpc_message_to_json_string(device_id))) dlt_record_sender.add_device(topology_id, device) else: -- GitLab From f1f7ce2fdbeb6ac1812a1b816e6406d90bc07aba Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 10:31:02 +0200 Subject: [PATCH 418/602] debugging --- src/interdomain/service/topology_abstractor/DltRecordSender.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index 7710b9473..eb3503580 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -16,6 +16,7 @@ import logging from typing import Dict, List, Optional, Tuple from common.proto.context_pb2 import Device, Link, Service, Slice, TopologyId from common.proto.dlt_connector_pb2 import DltDeviceId, DltLinkId, DltServiceId, DltSliceId +from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from dlt.connector.client.DltConnectorClient import DltConnectorClient from .Types import DltRecordTypes @@ -66,7 +67,7 @@ class DltRecordSender: topology_id,dlt_record = self.dlt_record_uuid_to_data[dlt_record_uuid] if isinstance(dlt_record, Device): device_id = self.context_client.SetDevice(dlt_record) # Se retriggerea el Evento. - LOGGER.debug('DEVICE_ID: ({:s})'.format(str(device_id))) + LOGGER.debug('DEVICE_ID: ({:s})'.format(grpc_message_to_json_string(device_id))) if self.dlt_connector_client is None: continue dlt_device_id = DltDeviceId() dlt_device_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member -- GitLab From bd90b6ed483f594f419bbfdfc493ebfc717f0c93 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 10:45:41 +0200 Subject: [PATCH 419/602] debugging --- .../service/topology_abstractor/DltRecordSender.py | 4 ++-- src/interdomain/service/topology_abstractor/DltRecorder.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index eb3503580..26adee518 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -66,8 +66,8 @@ class DltRecordSender: for dlt_record_uuid in self.dlt_record_uuids: topology_id,dlt_record = self.dlt_record_uuid_to_data[dlt_record_uuid] if isinstance(dlt_record, Device): - device_id = self.context_client.SetDevice(dlt_record) # Se retriggerea el Evento. - LOGGER.debug('DEVICE_ID: ({:s})'.format(grpc_message_to_json_string(device_id))) + #device_id = self.context_client.SetDevice(dlt_record) # Se retriggerea el Evento. + #LOGGER.debug('DEVICE_ID: ({:s})'.format(grpc_message_to_json_string(device_id))) if self.dlt_connector_client is None: continue dlt_device_id = DltDeviceId() dlt_device_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index 2adac1726..209be30d1 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -118,7 +118,7 @@ class DLTRecorder(threading.Thread): if ((context_uuid == DEFAULT_CONTEXT_NAME) or (context_name == DEFAULT_CONTEXT_NAME)) and \ (topology_uuid not in topology_uuids) and (topology_name not in topology_uuids): for device in topology_details.devices: - LOGGER.debug('DEVICE INFO({:s})'.format(grpc_message_to_json_string(device))) + #LOGGER.debug('DEVICE INFO({:s})'.format(grpc_message_to_json_string(device))) dlt_record_sender.add_device(topology_id, device) for link in topology_details.links: @@ -150,7 +150,7 @@ class DLTRecorder(threading.Thread): device = self.context_client.GetDevice(device_id) topology_id = self.find_topology_for_device(device_id) if topology_id: - LOGGER.debug('DEVICE_INFO({:s}), DEVICE_ID ({:s})'.format(grpc_message_to_json_string(device), grpc_message_to_json_string(device_id))) + LOGGER.debug('DEVICE_INFO({:s}), DEVICE_ID ({:s})'.format(str(device.device_id.device_uuid.uuid), grpc_message_to_json_string(device_id))) dlt_record_sender.add_device(topology_id, device) else: -- GitLab From edd4b3c2c671abbde66e29a5986cd276f6f97f99 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 10:46:53 +0200 Subject: [PATCH 420/602] debugging --- src/interdomain/service/topology_abstractor/DltRecordSender.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index 26adee518..b49af3310 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -66,7 +66,7 @@ class DltRecordSender: for dlt_record_uuid in self.dlt_record_uuids: topology_id,dlt_record = self.dlt_record_uuid_to_data[dlt_record_uuid] if isinstance(dlt_record, Device): - #device_id = self.context_client.SetDevice(dlt_record) # Se retriggerea el Evento. + device_id = self.context_client.SetDevice(dlt_record) # Se retriggerea el Evento. #LOGGER.debug('DEVICE_ID: ({:s})'.format(grpc_message_to_json_string(device_id))) if self.dlt_connector_client is None: continue dlt_device_id = DltDeviceId() -- GitLab From 185aecaea1322062ae602f32018e2b2be2b02e03 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 10:55:06 +0200 Subject: [PATCH 421/602] Debugging --- .../service/topology_abstractor/DltRecordSender.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index b49af3310..0a2019a78 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -66,7 +66,8 @@ class DltRecordSender: for dlt_record_uuid in self.dlt_record_uuids: topology_id,dlt_record = self.dlt_record_uuid_to_data[dlt_record_uuid] if isinstance(dlt_record, Device): - device_id = self.context_client.SetDevice(dlt_record) # Se retriggerea el Evento. + #device_id = self.context_client.SetDevice(dlt_record) # This causes events to be triggered infinitely. + device_id = dlt_record.device_id.device_uuid.uuid #LOGGER.debug('DEVICE_ID: ({:s})'.format(grpc_message_to_json_string(device_id))) if self.dlt_connector_client is None: continue dlt_device_id = DltDeviceId() @@ -74,21 +75,24 @@ class DltRecordSender: dlt_device_id.device_id.CopyFrom(device_id) # pylint: disable=no-member self.dlt_connector_client.RecordDevice(dlt_device_id) elif isinstance(dlt_record, Link): - link_id = self.context_client.SetLink(dlt_record) + #link_id = self.context_client.SetLink(dlt_record) + link_id = dlt_record.link_id.link_uuid.uuid if self.dlt_connector_client is None: continue dlt_link_id = DltLinkId() dlt_link_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member dlt_link_id.link_id.CopyFrom(link_id) # pylint: disable=no-member self.dlt_connector_client.RecordLink(dlt_link_id) elif isinstance(dlt_record, Service): - service_id = self.context_client.SetService(dlt_record) + #service_id = self.context_client.SetService(dlt_record) + service_id = dlt_record.service_id.service_uuid.uuid if self.dlt_connector_client is None: continue dlt_service_id = DltServiceId() dlt_service_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member dlt_service_id.service_id.CopyFrom(service_id) # pylint: disable=no-member self.dlt_connector_client.RecordService(dlt_service_id) elif isinstance(dlt_record, Slice): - slice_id = self.context_client.SetSlice(dlt_record) + #slice_id = self.context_client.SetSlice(dlt_record) + slice_id = dlt_record.slice_id.slice_uuid.uuid if self.dlt_connector_client is None: continue dlt_slice_id = DltSliceId() dlt_slice_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member -- GitLab From 587983c2a15aff2e927eb9713e0a8d1fad46eafe Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 11:03:17 +0200 Subject: [PATCH 422/602] debugging --- .../service/topology_abstractor/DltRecordSender.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index 0a2019a78..cfa51c928 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -67,7 +67,7 @@ class DltRecordSender: topology_id,dlt_record = self.dlt_record_uuid_to_data[dlt_record_uuid] if isinstance(dlt_record, Device): #device_id = self.context_client.SetDevice(dlt_record) # This causes events to be triggered infinitely. - device_id = dlt_record.device_id.device_uuid.uuid + device_id = dlt_record.device_id #LOGGER.debug('DEVICE_ID: ({:s})'.format(grpc_message_to_json_string(device_id))) if self.dlt_connector_client is None: continue dlt_device_id = DltDeviceId() @@ -76,7 +76,7 @@ class DltRecordSender: self.dlt_connector_client.RecordDevice(dlt_device_id) elif isinstance(dlt_record, Link): #link_id = self.context_client.SetLink(dlt_record) - link_id = dlt_record.link_id.link_uuid.uuid + link_id = dlt_record.link_id if self.dlt_connector_client is None: continue dlt_link_id = DltLinkId() dlt_link_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member @@ -84,7 +84,7 @@ class DltRecordSender: self.dlt_connector_client.RecordLink(dlt_link_id) elif isinstance(dlt_record, Service): #service_id = self.context_client.SetService(dlt_record) - service_id = dlt_record.service_id.service_uuid.uuid + service_id = dlt_record.service_id if self.dlt_connector_client is None: continue dlt_service_id = DltServiceId() dlt_service_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member @@ -92,7 +92,7 @@ class DltRecordSender: self.dlt_connector_client.RecordService(dlt_service_id) elif isinstance(dlt_record, Slice): #slice_id = self.context_client.SetSlice(dlt_record) - slice_id = dlt_record.slice_id.slice_uuid.uuid + slice_id = dlt_record.slice_id if self.dlt_connector_client is None: continue dlt_slice_id = DltSliceId() dlt_slice_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member -- GitLab From 59707d7347f02b040a6763031aa3aee854a4eb03 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 11:30:19 +0200 Subject: [PATCH 423/602] debugging --- src/interdomain/service/topology_abstractor/DltRecorder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index 209be30d1..700562b3a 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -118,7 +118,7 @@ class DLTRecorder(threading.Thread): if ((context_uuid == DEFAULT_CONTEXT_NAME) or (context_name == DEFAULT_CONTEXT_NAME)) and \ (topology_uuid not in topology_uuids) and (topology_name not in topology_uuids): for device in topology_details.devices: - #LOGGER.debug('DEVICE INFO({:s})'.format(grpc_message_to_json_string(device))) + LOGGER.debug('DEVICE INFO({:s})'.format(grpc_message_to_json_string(device))) dlt_record_sender.add_device(topology_id, device) for link in topology_details.links: -- GitLab From 6a73ac1f68d1381d0910bfc5fad6fcc2fc2079e2 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 11:56:16 +0200 Subject: [PATCH 424/602] Debugging --- src/interdomain/service/topology_abstractor/DltRecorder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index 700562b3a..0e94159c4 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -118,7 +118,7 @@ class DLTRecorder(threading.Thread): if ((context_uuid == DEFAULT_CONTEXT_NAME) or (context_name == DEFAULT_CONTEXT_NAME)) and \ (topology_uuid not in topology_uuids) and (topology_name not in topology_uuids): for device in topology_details.devices: - LOGGER.debug('DEVICE INFO({:s})'.format(grpc_message_to_json_string(device))) + LOGGER.debug('DEVICE_INFO_TOPO({:s})'.format(grpc_message_to_json_string(device))) dlt_record_sender.add_device(topology_id, device) for link in topology_details.links: -- GitLab From a8912315c07aa882b40774b9471728cfda821b1b Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 29 Jul 2024 11:45:16 +0000 Subject: [PATCH 425/602] Changes to resolve pipeline test error. - added create_kpi_id_request() in kpi_manger test_mesages.py --- src/kpi_manager/tests/test_kpi_manager.py | 2 +- src/kpi_manager/tests/test_messages.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/kpi_manager/tests/test_kpi_manager.py b/src/kpi_manager/tests/test_kpi_manager.py index b41e5139d..f0d9526d3 100755 --- a/src/kpi_manager/tests/test_kpi_manager.py +++ b/src/kpi_manager/tests/test_kpi_manager.py @@ -37,7 +37,7 @@ from kpi_manager.tests.test_messages import create_kpi_descriptor_request, creat from kpi_manager.service.KpiManagerService import KpiManagerService from kpi_manager.client.KpiManagerClient import KpiManagerClient from kpi_manager.tests.test_messages import create_kpi_descriptor_request -from kpi_value_writer.tests.test_messages import create_kpi_id_request +from kpi_manager.tests.test_messages import create_kpi_id_request #from monitoring.service.NameMapping import NameMapping diff --git a/src/kpi_manager/tests/test_messages.py b/src/kpi_manager/tests/test_messages.py index 870660658..7b5c45859 100644 --- a/src/kpi_manager/tests/test_messages.py +++ b/src/kpi_manager/tests/test_messages.py @@ -18,6 +18,12 @@ from common.proto.kpi_sample_types_pb2 import KpiSampleType from common.proto.context_pb2 import DeviceId, LinkId, ServiceId, SliceId,\ ConnectionId, EndPointId + +def create_kpi_id_request(): + _create_kpi_id = kpi_manager_pb2.KpiId() + _create_kpi_id.kpi_id.uuid = str(uuid.uuid4()) + return _create_kpi_id + def create_kpi_descriptor_request(descriptor_name: str = "Test_name"): _create_kpi_request = kpi_manager_pb2.KpiDescriptor() _create_kpi_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) -- GitLab From 8503a835ba6a889cdb47a8666a3abb60fd63242a Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 13:55:08 +0200 Subject: [PATCH 426/602] Debugging --- .../connector/client/DltConnectorClient.py | 36 +++++++++---------- src/dlt/connector/client/DltGatewayClient.py | 20 +++++------ .../DltConnectorServiceServicerImpl.py | 28 +++++++-------- .../topology_abstractor/DltRecordSender.py | 10 +++--- 4 files changed, 47 insertions(+), 47 deletions(-) diff --git a/src/dlt/connector/client/DltConnectorClient.py b/src/dlt/connector/client/DltConnectorClient.py index e383217d8..e71cf0bd7 100644 --- a/src/dlt/connector/client/DltConnectorClient.py +++ b/src/dlt/connector/client/DltConnectorClient.py @@ -48,64 +48,64 @@ class DltConnectorClient: self.stub = None @RETRY_DECORATOR - def RecordAll(self, request : TopologyId) -> Empty: + async def RecordAll(self, request : TopologyId) -> Empty: LOGGER.debug('RecordAll request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordAll(request) + response = await self.stub.RecordAll(request) LOGGER.debug('RecordAll result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordAllDevices(self, request : TopologyId) -> Empty: + async def RecordAllDevices(self, request : TopologyId) -> Empty: LOGGER.debug('RecordAllDevices request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordAllDevices(request) + response = await self.stub.RecordAllDevices(request) LOGGER.debug('RecordAllDevices result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordDevice(self, request : DltDeviceId) -> Empty: + async def RecordDevice(self, request : DltDeviceId) -> Empty: LOGGER.debug('RecordDevice request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordDevice(request) + response = await self.stub.RecordDevice(request) LOGGER.debug('RecordDevice result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordAllLinks(self, request : TopologyId) -> Empty: + async def RecordAllLinks(self, request : TopologyId) -> Empty: LOGGER.debug('RecordAllLinks request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordAllLinks(request) + response = await self.stub.RecordAllLinks(request) LOGGER.debug('RecordAllLinks result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordLink(self, request : DltLinkId) -> Empty: + async def RecordLink(self, request : DltLinkId) -> Empty: LOGGER.debug('RecordLink request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordLink(request) + response = await self.stub.RecordLink(request) LOGGER.debug('RecordLink result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordAllServices(self, request : TopologyId) -> Empty: + async def RecordAllServices(self, request : TopologyId) -> Empty: LOGGER.debug('RecordAllServices request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordAllServices(request) + response = await self.stub.RecordAllServices(request) LOGGER.debug('RecordAllServices result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordService(self, request : DltServiceId) -> Empty: + async def RecordService(self, request : DltServiceId) -> Empty: LOGGER.debug('RecordService request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordService(request) + response = await self.stub.RecordService(request) LOGGER.debug('RecordService result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordAllSlices(self, request : TopologyId) -> Empty: + async def RecordAllSlices(self, request : TopologyId) -> Empty: LOGGER.debug('RecordAllSlices request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordAllSlices(request) + response = await self.stub.RecordAllSlices(request) LOGGER.debug('RecordAllSlices result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordSlice(self, request : DltSliceId) -> Empty: + async def RecordSlice(self, request : DltSliceId) -> Empty: LOGGER.debug('RecordSlice request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordSlice(request) + response = await self.stub.RecordSlice(request) LOGGER.debug('RecordSlice result: {:s}'.format(grpc_message_to_json_string(response))) return response diff --git a/src/dlt/connector/client/DltGatewayClient.py b/src/dlt/connector/client/DltGatewayClient.py index cde278517..b04e08d7f 100644 --- a/src/dlt/connector/client/DltGatewayClient.py +++ b/src/dlt/connector/client/DltGatewayClient.py @@ -49,36 +49,36 @@ class DltGatewayClient: self.stub = None @RETRY_DECORATOR - def RecordToDlt(self, request : DltRecord) -> DltRecordStatus: + async def RecordToDlt(self, request : DltRecord) -> DltRecordStatus: LOGGER.debug('RecordToDlt request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordToDlt(request) + response = await self.stub.RecordToDlt(request) LOGGER.debug('RecordToDlt result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def GetFromDlt(self, request : DltRecordId) -> DltRecord: + async def GetFromDlt(self, request : DltRecordId) -> DltRecord: LOGGER.debug('GetFromDlt request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.GetFromDlt(request) + response = await self.stub.GetFromDlt(request) LOGGER.debug('GetFromDlt result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def SubscribeToDlt(self, request : DltRecordSubscription) -> Iterator[DltRecordEvent]: + async def SubscribeToDlt(self, request : DltRecordSubscription) -> Iterator[DltRecordEvent]: LOGGER.debug('SubscribeToDlt request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.SubscribeToDlt(request) + response = await self.stub.SubscribeToDlt(request) LOGGER.debug('SubscribeToDlt result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def GetDltStatus(self, request : TeraFlowController) -> DltPeerStatus: + async def GetDltStatus(self, request : TeraFlowController) -> DltPeerStatus: LOGGER.debug('GetDltStatus request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.GetDltStatus(request) + response = await self.stub.GetDltStatus(request) LOGGER.debug('GetDltStatus result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def GetDltPeers(self, request : Empty) -> DltPeerStatusList: + async def GetDltPeers(self, request : Empty) -> DltPeerStatusList: LOGGER.debug('GetDltPeers request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.GetDltPeers(request) + response = await self.stub.GetDltPeers(request) LOGGER.debug('GetDltPeers result: {:s}'.format(grpc_message_to_json_string(response))) return response diff --git a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py index c05d46b48..df5e8fd08 100644 --- a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py +++ b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py @@ -35,22 +35,22 @@ class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): LOGGER.debug('Servicer Created') @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordAll(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: + async def RecordAll(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordAllDevices(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: + async def RecordAllDevices(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordDevice(self, request : DltDeviceId, context : grpc.ServicerContext) -> Empty: + async def RecordDevice(self, request : DltDeviceId, context : grpc.ServicerContext) -> Empty: data_json = None if not request.delete: context_client = ContextClient() device = context_client.GetDevice(request.device_id) data_json = grpc_message_to_json_string(device) - self._record_entity( + await self._record_entity( request.topology_id.topology_uuid.uuid, DltRecordTypeEnum.DLTRECORDTYPE_DEVICE, request.device_id.device_uuid.uuid, request.delete, data_json) return Empty() @@ -60,53 +60,53 @@ class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordLink(self, request : DltLinkId, context : grpc.ServicerContext) -> Empty: + async def RecordLink(self, request : DltLinkId, context : grpc.ServicerContext) -> Empty: data_json = None if not request.delete: context_client = ContextClient() link = context_client.GetLink(request.link_id) data_json = grpc_message_to_json_string(link) - self._record_entity( + await self._record_entity( request.topology_id.topology_uuid.uuid, DltRecordTypeEnum.DLTRECORDTYPE_LINK, request.link_id.link_uuid.uuid, request.delete, data_json) return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordAllServices(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: + async def RecordAllServices(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordService(self, request : DltServiceId, context : grpc.ServicerContext) -> Empty: + async def RecordService(self, request : DltServiceId, context : grpc.ServicerContext) -> Empty: data_json = None if not request.delete: context_client = ContextClient() service = context_client.GetService(request.service_id) data_json = grpc_message_to_json_string(service) - self._record_entity( + await self._record_entity( request.topology_id.topology_uuid.uuid, DltRecordTypeEnum.DLTRECORDTYPE_SERVICE, request.service_id.service_uuid.uuid, request.delete, data_json) return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordAllSlices(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: + async def RecordAllSlices(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordSlice(self, request : DltSliceId, context : grpc.ServicerContext) -> Empty: + async def RecordSlice(self, request : DltSliceId, context : grpc.ServicerContext) -> Empty: data_json = None if not request.delete: context_client = ContextClient() slice_ = context_client.GetSlice(request.slice_id) data_json = grpc_message_to_json_string(slice_) - self._record_entity( + await self._record_entity( request.topology_id.topology_uuid.uuid, DltRecordTypeEnum.DLTRECORDTYPE_SLICE, request.slice_id.slice_uuid.uuid, request.delete, data_json) return Empty() - def _record_entity( + async def _record_entity( self, dlt_domain_uuid : str, dlt_record_type : DltRecordTypeEnum, dlt_record_uuid : str, delete : bool, data_json : Optional[str] = None ) -> None: @@ -143,6 +143,6 @@ class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): str_dlt_record = grpc_message_to_json_string(dlt_record) LOGGER.debug('[_record_entity] sent dlt_record = {:s}'.format(str_dlt_record)) - dlt_record_status = dltgateway_client.RecordToDlt(dlt_record) + dlt_record_status = await dltgateway_client.RecordToDlt(dlt_record) str_dlt_record_status = grpc_message_to_json_string(dlt_record_status) LOGGER.debug('[_record_entity] recv dlt_record_status = {:s}'.format(str_dlt_record_status)) diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index cfa51c928..c17878e0e 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -62,7 +62,7 @@ class DltRecordSender: record_uuid = '{:s}:slice:{:s}/{:s}'.format(topology_uuid, context_uuid, slice_uuid) self._add_record(record_uuid, (topology_id, slice_)) - def commit(self) -> None: + async def commit(self) -> None: for dlt_record_uuid in self.dlt_record_uuids: topology_id,dlt_record = self.dlt_record_uuid_to_data[dlt_record_uuid] if isinstance(dlt_record, Device): @@ -73,7 +73,7 @@ class DltRecordSender: dlt_device_id = DltDeviceId() dlt_device_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member dlt_device_id.device_id.CopyFrom(device_id) # pylint: disable=no-member - self.dlt_connector_client.RecordDevice(dlt_device_id) + await self.dlt_connector_client.RecordDevice(dlt_device_id) elif isinstance(dlt_record, Link): #link_id = self.context_client.SetLink(dlt_record) link_id = dlt_record.link_id @@ -81,7 +81,7 @@ class DltRecordSender: dlt_link_id = DltLinkId() dlt_link_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member dlt_link_id.link_id.CopyFrom(link_id) # pylint: disable=no-member - self.dlt_connector_client.RecordLink(dlt_link_id) + await self.dlt_connector_client.RecordLink(dlt_link_id) elif isinstance(dlt_record, Service): #service_id = self.context_client.SetService(dlt_record) service_id = dlt_record.service_id @@ -89,7 +89,7 @@ class DltRecordSender: dlt_service_id = DltServiceId() dlt_service_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member dlt_service_id.service_id.CopyFrom(service_id) # pylint: disable=no-member - self.dlt_connector_client.RecordService(dlt_service_id) + await self.dlt_connector_client.RecordService(dlt_service_id) elif isinstance(dlt_record, Slice): #slice_id = self.context_client.SetSlice(dlt_record) slice_id = dlt_record.slice_id @@ -97,6 +97,6 @@ class DltRecordSender: dlt_slice_id = DltSliceId() dlt_slice_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member dlt_slice_id.slice_id.CopyFrom(slice_id) # pylint: disable=no-member - self.dlt_connector_client.RecordSlice(dlt_slice_id) + await self.dlt_connector_client.RecordSlice(dlt_slice_id) else: LOGGER.error('Unsupported Record({:s})'.format(str(dlt_record))) -- GitLab From 77f239659bfb284464ea6675f349b389fad77c67 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 14:10:41 +0200 Subject: [PATCH 427/602] Debugging --- .../connector/client/DltConnectorClient.py | 2 +- .../client/DltEventsCollector copy.py | 95 +++++++++++++++++++ .../connector/client/DltEventsCollector.py | 82 ++++++++-------- src/dlt/connector/client/DltGatewayClient.py | 2 +- src/dlt/connector/client/async.py | 74 +++++++++++++++ 5 files changed, 215 insertions(+), 40 deletions(-) create mode 100644 src/dlt/connector/client/DltEventsCollector copy.py create mode 100644 src/dlt/connector/client/async.py diff --git a/src/dlt/connector/client/DltConnectorClient.py b/src/dlt/connector/client/DltConnectorClient.py index e71cf0bd7..7cfb6b594 100644 --- a/src/dlt/connector/client/DltConnectorClient.py +++ b/src/dlt/connector/client/DltConnectorClient.py @@ -39,7 +39,7 @@ class DltConnectorClient: LOGGER.debug('Channel created') def connect(self): - self.channel = grpc.insecure_channel(self.endpoint) + self.channel = grpc.aio.insecure_channel(self.endpoint) self.stub = DltConnectorServiceStub(self.channel) def close(self): diff --git a/src/dlt/connector/client/DltEventsCollector copy.py b/src/dlt/connector/client/DltEventsCollector copy.py new file mode 100644 index 000000000..9fac60b7c --- /dev/null +++ b/src/dlt/connector/client/DltEventsCollector copy.py @@ -0,0 +1,95 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +from typing import Callable, Optional +import asyncio +import grpc, logging, queue, threading, time +from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordSubscription +from common.tools.grpc.Tools import grpc_message_to_json_string +from dlt.connector.client.DltGatewayClient import DltGatewayClient + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +# This class accepts an event_handler method as attribute that can be used to pre-process and +# filter events before they reach the events_queue. Depending on the handler, the supported +# behaviors are: +# - If the handler is not set, the events are transparently added to the events_queue. +# - If returns None for an event, the event is not stored in the events_queue. +# - If returns a DltRecordEvent object for an event, the returned event is stored in the events_queue. +# - Other combinations are not supported. + +class DltEventsCollector(threading.Thread): + def __init__( + self, dltgateway_client : DltGatewayClient, + log_events_received : bool = False, + event_handler : Optional[Callable[[DltRecordEvent], Optional[DltRecordEvent]]] = None, + ) -> None: + super().__init__(name='DltEventsCollector', daemon=True) + self._dltgateway_client = dltgateway_client + self._log_events_received = log_events_received + self._event_handler = event_handler + self._events_queue = queue.Queue() + self._terminate = threading.Event() + self._dltgateway_stream = None + + def run(self) -> None: + event_handler = self._event_handler + if event_handler is None: event_handler = lambda e: e + self._terminate.clear() + while not self._terminate.is_set(): + try: + subscription = DltRecordSubscription() # bu default subscribe to all + self._dltgateway_stream = self._dltgateway_client.SubscribeToDlt(subscription) + for event in self._dltgateway_stream: + if self._log_events_received: + LOGGER.info('[_collect] event: {:s}'.format(grpc_message_to_json_string(event))) + event = event_handler(event) + if event is None: continue + if not isinstance(event, DltRecordEvent): + # pylint: disable=broad-exception-raised + raise Exception('Unsupported return type: {:s}'.format(str(event))) + self._events_queue.put_nowait(event) + except grpc.RpcError as e: + if e.code() == grpc.StatusCode.UNAVAILABLE: # pylint: disable=no-member + time.sleep(0.5) + continue + elif e.code() == grpc.StatusCode.CANCELLED: # pylint: disable=no-member + break + else: + raise # pragma: no cover + + def get_event(self, block : bool = True, timeout : float = 0.1): + try: + return self._events_queue.get(block=block, timeout=timeout) + except queue.Empty: # pylint: disable=catching-non-exception + return None + + def get_events(self, block : bool = True, timeout : float = 0.1, count : int = None): + events = [] + if count is None: + while True: + event = self.get_event(block=block, timeout=timeout) + if event is None: break + events.append(event) + else: + for _ in range(count): + event = self.get_event(block=block, timeout=timeout) + if event is None: continue + events.append(event) + return sorted(events, key=lambda e: e.event.timestamp.timestamp) + + def stop(self): + self._terminate.set() + if self._dltgateway_stream is not None: self._dltgateway_stream.cancel() diff --git a/src/dlt/connector/client/DltEventsCollector.py b/src/dlt/connector/client/DltEventsCollector.py index e59784a4d..39cf993f3 100644 --- a/src/dlt/connector/client/DltEventsCollector.py +++ b/src/dlt/connector/client/DltEventsCollector.py @@ -13,7 +13,9 @@ # limitations under the License. from typing import Callable, Optional -import grpc, logging, queue, threading, time +import asyncio +import grpc +import logging from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordSubscription from common.tools.grpc.Tools import grpc_message_to_json_string from dlt.connector.client.DltGatewayClient import DltGatewayClient @@ -21,74 +23,78 @@ from dlt.connector.client.DltGatewayClient import DltGatewayClient LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) -# This class accepts an event_handler method as attribute that can be used to pre-process and -# filter events before they reach the events_queue. Depending on the handler, the supported -# behaviors are: -# - If the handler is not set, the events are transparently added to the events_queue. -# - If returns None for an event, the event is not stored in the events_queue. -# - If returns a DltRecordEvent object for an event, the returned event is stored in the events_queue. -# - Other combinations are not supported. - -class DltEventsCollector(threading.Thread): +class DltEventsCollector: def __init__( - self, dltgateway_client : DltGatewayClient, - log_events_received : bool = False, - event_handler : Optional[Callable[[DltRecordEvent], Optional[DltRecordEvent]]] = None, + self, dltgateway_client: DltGatewayClient, + log_events_received: bool = False, + event_handler: Optional[Callable[[DltRecordEvent], Optional[DltRecordEvent]]] = None, ) -> None: - super().__init__(name='DltEventsCollector', daemon=True) self._dltgateway_client = dltgateway_client self._log_events_received = log_events_received self._event_handler = event_handler - self._events_queue = queue.Queue() - self._terminate = threading.Event() + self._events_queue = asyncio.Queue() + self._terminate = asyncio.Event() self._dltgateway_stream = None - def run(self) -> None: + async def start(self) -> None: event_handler = self._event_handler - if event_handler is None: event_handler = lambda e: e + if event_handler is None: + event_handler = lambda e: e self._terminate.clear() while not self._terminate.is_set(): try: - subscription = DltRecordSubscription() # bu default subscribe to all - self._dltgateway_stream = self._dltgateway_client.SubscribeToDlt(subscription) - for event in self._dltgateway_stream: + subscription = DltRecordSubscription() # by default subscribe to all + self._dltgateway_stream = await self._dltgateway_client.SubscribeToDlt(subscription) + async for event in self._dltgateway_stream: if self._log_events_received: LOGGER.info('[_collect] event: {:s}'.format(grpc_message_to_json_string(event))) event = event_handler(event) - if event is None: continue + if event is None: + continue if not isinstance(event, DltRecordEvent): - # pylint: disable=broad-exception-raised raise Exception('Unsupported return type: {:s}'.format(str(event))) - self._events_queue.put_nowait(event) + await self._events_queue.put(event) except grpc.RpcError as e: - if e.code() == grpc.StatusCode.UNAVAILABLE: # pylint: disable=no-member - time.sleep(0.5) + if e.code() == grpc.StatusCode.UNAVAILABLE: # pylint: disable=no-member + await asyncio.sleep(0.5) continue - elif e.code() == grpc.StatusCode.CANCELLED: # pylint: disable=no-member + elif e.code() == grpc.StatusCode.CANCELLED: # pylint: disable=no-member break else: - raise # pragma: no cover + raise # pragma: no cover - def get_event(self, block : bool = True, timeout : float = 0.1): + async def get_event(self, block: bool = True, timeout: float = 0.1): try: - return self._events_queue.get(block=block, timeout=timeout) - except queue.Empty: # pylint: disable=catching-non-exception + return await asyncio.wait_for(self._events_queue.get(), timeout) + except asyncio.TimeoutError: return None - def get_events(self, block : bool = True, timeout : float = 0.1, count : int = None): + async def get_events(self, block: bool = True, timeout: float = 0.1, count: int = None): events = [] if count is None: while True: - event = self.get_event(block=block, timeout=timeout) - if event is None: break + event = await self.get_event(block=block, timeout=timeout) + if event is None: + break events.append(event) else: for _ in range(count): - event = self.get_event(block=block, timeout=timeout) - if event is None: continue + event = await self.get_event(block=block, timeout=timeout) + if event is None: + continue events.append(event) return sorted(events, key=lambda e: e.event.timestamp.timestamp) - def stop(self): + async def stop(self): self._terminate.set() - if self._dltgateway_stream is not None: self._dltgateway_stream.cancel() + if self._dltgateway_stream is not None: + await self._dltgateway_stream.cancel() + +# Usage example +async def main(): + gateway_client = DltGatewayClient() + collector = DltEventsCollector(gateway_client) + await collector.start() + +# Start the event loop +asyncio.run(main()) diff --git a/src/dlt/connector/client/DltGatewayClient.py b/src/dlt/connector/client/DltGatewayClient.py index b04e08d7f..f9b37a2db 100644 --- a/src/dlt/connector/client/DltGatewayClient.py +++ b/src/dlt/connector/client/DltGatewayClient.py @@ -40,7 +40,7 @@ class DltGatewayClient: LOGGER.debug('Channel created') def connect(self): - self.channel = grpc.insecure_channel(self.endpoint) + self.channel = grpc.aio.insecure_channel(self.endpoint) self.stub = DltGatewayServiceStub(self.channel) def close(self): diff --git a/src/dlt/connector/client/async.py b/src/dlt/connector/client/async.py new file mode 100644 index 000000000..e38f124c2 --- /dev/null +++ b/src/dlt/connector/client/async.py @@ -0,0 +1,74 @@ +# DltGatewayClient.py + +import grpc +import logging +from typing import Iterator +from common.proto.context_pb2 import Empty, TeraFlowController +from common.proto.dlt_gateway_pb2 import ( + DltPeerStatus, DltPeerStatusList, DltRecord, DltRecordEvent, DltRecordId, DltRecordStatus, DltRecordSubscription +) +from common.proto.dlt_gateway_pb2_grpc import DltGatewayServiceStub +from common.tools.client.RetryDecorator import retry, delay_exponential +from common.tools.grpc.Tools import grpc_message_to_json_string +from dlt.connector.Config import DLT_GATEWAY_HOST, DLT_GATEWAY_PORT + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) +MAX_RETRIES = 15 +DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) +RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') + +class DltGatewayClient: + def __init__(self, host=None, port=None): + if not host: host = DLT_GATEWAY_HOST + if not port: port = DLT_GATEWAY_PORT + self.endpoint = '{:s}:{:s}'.format(str(host), str(port)) + LOGGER.debug('Creating channel to {:s}...'.format(self.endpoint)) + self.channel = None + self.stub = None + self.connect() + LOGGER.debug('Channel created') + + def connect(self): + self.channel = grpc.aio.insecure_channel(self.endpoint) + self.stub = DltGatewayServiceStub(self.channel) + + def close(self): + if self.channel is not None: self.channel.close() + self.channel = None + self.stub = None + + @RETRY_DECORATOR + async def RecordToDlt(self, request: DltRecord) -> DltRecordStatus: + LOGGER.debug('RecordToDlt request: {:s}'.format(grpc_message_to_json_string(request))) + response = await self.stub.RecordToDlt(request) + LOGGER.debug('RecordToDlt result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + async def GetFromDlt(self, request: DltRecordId) -> DltRecord: + LOGGER.debug('GetFromDlt request: {:s}'.format(grpc_message_to_json_string(request))) + response = await self.stub.GetFromDlt(request) + LOGGER.debug('GetFromDlt result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + async def SubscribeToDlt(self, request: DltRecordSubscription) -> Iterator[DltRecordEvent]: + LOGGER.debug('SubscribeToDlt request: {:s}'.format(grpc_message_to_json_string(request))) + response = await self.stub.SubscribeToDlt(request) + LOGGER.debug('SubscribeToDlt result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + async def GetDltStatus(self, request: TeraFlowController) -> DltPeerStatus: + LOGGER.debug('GetDltStatus request: {:s}'.format(grpc_message_to_json_string(request))) + response = await self.stub.GetDltStatus(request) + LOGGER.debug('GetDltStatus result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + async def GetDltPeers(self, request: Empty) -> DltPeerStatusList: + LOGGER.debug('GetDltPeers request: {:s}'.format(grpc_message_to_json_string(request))) + response = await self.stub.GetDltPeers(request) + LOGGER.debug('GetDltPeers result: {:s}'.format(grpc_message_to_json_string(response))) + return response -- GitLab From c41f38d9ad608ee1252b9fe0e538d2e617c034e8 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 14:16:14 +0200 Subject: [PATCH 428/602] debugging --- src/dlt/connector/client/DltEventsCollector.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/dlt/connector/client/DltEventsCollector.py b/src/dlt/connector/client/DltEventsCollector.py index 39cf993f3..31eaf8542 100644 --- a/src/dlt/connector/client/DltEventsCollector.py +++ b/src/dlt/connector/client/DltEventsCollector.py @@ -36,7 +36,7 @@ class DltEventsCollector: self._terminate = asyncio.Event() self._dltgateway_stream = None - async def start(self) -> None: + async def run(self) -> None: event_handler = self._event_handler if event_handler is None: event_handler = lambda e: e @@ -90,11 +90,3 @@ class DltEventsCollector: if self._dltgateway_stream is not None: await self._dltgateway_stream.cancel() -# Usage example -async def main(): - gateway_client = DltGatewayClient() - collector = DltEventsCollector(gateway_client) - await collector.start() - -# Start the event loop -asyncio.run(main()) -- GitLab From ebb001dbafbc5cf740490d321c3ba16ddd4bd97f Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 14:20:58 +0200 Subject: [PATCH 429/602] debugging --- .../DltEventDispatcher copy.py | 209 ++++++++++++++++++ .../event_dispatcher/DltEventDispatcher.py | 86 +++---- 2 files changed, 245 insertions(+), 50 deletions(-) create mode 100644 src/dlt/connector/service/event_dispatcher/DltEventDispatcher copy.py diff --git a/src/dlt/connector/service/event_dispatcher/DltEventDispatcher copy.py b/src/dlt/connector/service/event_dispatcher/DltEventDispatcher copy.py new file mode 100644 index 000000000..779bae9c1 --- /dev/null +++ b/src/dlt/connector/service/event_dispatcher/DltEventDispatcher copy.py @@ -0,0 +1,209 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 grpc, json, logging, threading +from typing import Any, Dict, Set +from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME +from common.proto.context_pb2 import ContextId, Device, EventTypeEnum, Link, Slice, TopologyId +from common.proto.dlt_connector_pb2 import DltSliceId +from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordOperationEnum, DltRecordTypeEnum +from common.tools.context_queries.Context import create_context +from common.tools.context_queries.Device import add_device_to_topology +from common.tools.context_queries.Link import add_link_to_topology +from common.tools.context_queries.Topology import create_topology +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Context import json_context_id +from common.tools.object_factory.Topology import json_topology_id +from context.client.ContextClient import ContextClient +from dlt.connector.client.DltConnectorClient import DltConnectorClient +from dlt.connector.client.DltEventsCollector import DltEventsCollector +from dlt.connector.client.DltGatewayClient import DltGatewayClient +from interdomain.client.InterdomainClient import InterdomainClient + +LOGGER = logging.getLogger(__name__) + +GET_EVENT_TIMEOUT = 0.5 + +ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) + +class Clients: + def __init__(self) -> None: + self.context_client = ContextClient() + self.dlt_connector_client = DltConnectorClient() + self.dlt_gateway_client = DltGatewayClient() + self.interdomain_client = InterdomainClient() + + def close(self) -> None: + self.interdomain_client.close() + self.dlt_gateway_client.close() + self.dlt_connector_client.close() + self.context_client.close() + +class DltEventDispatcher(threading.Thread): + def __init__(self) -> None: + LOGGER.debug('Creating connector...') + super().__init__(name='DltEventDispatcher', daemon=True) + self._terminate = threading.Event() + LOGGER.debug('Connector created') + + def start(self) -> None: + self._terminate.clear() + return super().start() + + def stop(self): + self._terminate.set() + + def run(self) -> None: + clients = Clients() + create_context(clients.context_client, DEFAULT_CONTEXT_NAME) + create_topology(clients.context_client, DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME) + create_topology(clients.context_client, DEFAULT_CONTEXT_NAME, INTERDOMAIN_TOPOLOGY_NAME) + + dlt_events_collector = DltEventsCollector(clients.dlt_gateway_client, log_events_received=True) + dlt_events_collector.start() + + while not self._terminate.is_set(): + event = dlt_events_collector.get_event(block=True, timeout=GET_EVENT_TIMEOUT) + if event is None: continue + + existing_topology_ids = clients.context_client.ListTopologyIds(ADMIN_CONTEXT_ID) + local_domain_uuids = { + topology_id.topology_uuid.uuid for topology_id in existing_topology_ids.topology_ids + } + local_domain_uuids.discard(DEFAULT_TOPOLOGY_NAME) + local_domain_uuids.discard(INTERDOMAIN_TOPOLOGY_NAME) + + self.dispatch_event(clients, local_domain_uuids, event) + + dlt_events_collector.stop() + clients.close() + + def dispatch_event(self, clients : Clients, local_domain_uuids : Set[str], event : DltRecordEvent) -> None: + record_type : DltRecordTypeEnum = event.record_id.type # {UNDEFINED/CONTEXT/TOPOLOGY/DEVICE/LINK/SERVICE/SLICE} + if record_type == DltRecordTypeEnum.DLTRECORDTYPE_DEVICE: + self._dispatch_device(clients, local_domain_uuids, event) + elif record_type == DltRecordTypeEnum.DLTRECORDTYPE_LINK: + self._dispatch_link(clients, local_domain_uuids, event) + elif record_type == DltRecordTypeEnum.DLTRECORDTYPE_SLICE: + self._dispatch_slice(clients, local_domain_uuids, event) + else: + raise NotImplementedError('EventType: {:s}'.format(grpc_message_to_json_string(event))) + + def _dispatch_device(self, clients : Clients, local_domain_uuids : Set[str], event : DltRecordEvent) -> None: + domain_uuid : str = event.record_id.domain_uuid.uuid + + if domain_uuid in local_domain_uuids: + MSG = '[_dispatch_device] Ignoring DLT event received (local): {:s}' + LOGGER.info(MSG.format(grpc_message_to_json_string(event))) + return + + MSG = '[_dispatch_device] DLT event received (remote): {:s}' + LOGGER.info(MSG.format(grpc_message_to_json_string(event))) + + event_type : EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} + if event_type in {EventTypeEnum.EVENTTYPE_CREATE, EventTypeEnum.EVENTTYPE_UPDATE}: + LOGGER.info('[_dispatch_device] event.record_id={:s}'.format(grpc_message_to_json_string(event.record_id))) + record = clients.dlt_gateway_client.GetFromDlt(event.record_id) + LOGGER.info('[_dispatch_device] record={:s}'.format(grpc_message_to_json_string(record))) + + create_context(clients.context_client, domain_uuid) + create_topology(clients.context_client, domain_uuid, DEFAULT_TOPOLOGY_NAME) + device = Device(**json.loads(record.data_json)) + clients.context_client.SetDevice(device) + device_uuid = device.device_id.device_uuid.uuid # pylint: disable=no-member + add_device_to_topology(clients.context_client, ADMIN_CONTEXT_ID, INTERDOMAIN_TOPOLOGY_NAME, device_uuid) + domain_context_id = ContextId(**json_context_id(domain_uuid)) + add_device_to_topology(clients.context_client, domain_context_id, DEFAULT_TOPOLOGY_NAME, device_uuid) + elif event_type in {EventTypeEnum.EVENTTYPE_DELETE}: + raise NotImplementedError('Delete Device') + + def _dispatch_link(self, clients : Clients, local_domain_uuids : Set[str], event : DltRecordEvent) -> None: + domain_uuid : str = event.record_id.domain_uuid.uuid + + if domain_uuid in local_domain_uuids: + MSG = '[_dispatch_link] Ignoring DLT event received (local): {:s}' + LOGGER.info(MSG.format(grpc_message_to_json_string(event))) + return + + MSG = '[_dispatch_link] DLT event received (remote): {:s}' + LOGGER.info(MSG.format(grpc_message_to_json_string(event))) + + event_type : EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} + if event_type in {EventTypeEnum.EVENTTYPE_CREATE, EventTypeEnum.EVENTTYPE_UPDATE}: + LOGGER.info('[_dispatch_link] event.record_id={:s}'.format(grpc_message_to_json_string(event.record_id))) + record = clients.dlt_gateway_client.GetFromDlt(event.record_id) + LOGGER.info('[_dispatch_link] record={:s}'.format(grpc_message_to_json_string(record))) + + link = Link(**json.loads(record.data_json)) + clients.context_client.SetLink(link) + link_uuid = link.link_id.link_uuid.uuid # pylint: disable=no-member + add_link_to_topology(clients.context_client, ADMIN_CONTEXT_ID, INTERDOMAIN_TOPOLOGY_NAME, link_uuid) + elif event_type in {EventTypeEnum.EVENTTYPE_DELETE}: + raise NotImplementedError('Delete Link') + + def _dispatch_slice(self, clients : Clients, local_domain_uuids : Set[str], event : DltRecordEvent) -> None: + event_type : EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} + domain_uuid : str = event.record_id.domain_uuid.uuid + + LOGGER.info('[_dispatch_slice] event.record_id={:s}'.format(grpc_message_to_json_string(event.record_id))) + record = clients.dlt_gateway_client.GetFromDlt(event.record_id) + LOGGER.info('[_dispatch_slice] record={:s}'.format(grpc_message_to_json_string(record))) + + slice_ = Slice(**json.loads(record.data_json)) + + context_uuid = slice_.slice_id.context_id.context_uuid.uuid + owner_uuid = slice_.slice_owner.owner_uuid.uuid + create_context(clients.context_client, context_uuid) + create_topology(clients.context_client, context_uuid, DEFAULT_TOPOLOGY_NAME) + + if domain_uuid in local_domain_uuids: + # it is for "me" + if event_type in {EventTypeEnum.EVENTTYPE_CREATE, EventTypeEnum.EVENTTYPE_UPDATE}: + try: + db_slice = clients.context_client.GetSlice(slice_.slice_id) + # exists + db_json_slice = grpc_message_to_json_string(db_slice) + except grpc.RpcError: + # not exists + db_json_slice = None + + _json_slice = grpc_message_to_json_string(slice_) + if db_json_slice != _json_slice: + # not exists or is different... + slice_id = clients.interdomain_client.RequestSlice(slice_) + topology_id = TopologyId(**json_topology_id(domain_uuid)) + dlt_slice_id = DltSliceId() + dlt_slice_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member + dlt_slice_id.slice_id.CopyFrom(slice_id) # pylint: disable=no-member + clients.dlt_connector_client.RecordSlice(dlt_slice_id) + + elif event_type in {EventTypeEnum.EVENTTYPE_DELETE}: + raise NotImplementedError('Delete Slice') + elif owner_uuid in local_domain_uuids: + # it is owned by me + # just update it locally + LOGGER.info('[_dispatch_slice] updating locally') + + local_slice = Slice() + local_slice.CopyFrom(slice_) + + # pylint: disable=no-member + del local_slice.slice_service_ids[:] # they are from remote domains so will not be present locally + del local_slice.slice_subslice_ids[:] # they are from remote domains so will not be present locally + + clients.context_client.SetSlice(local_slice) + else: + MSG = '[_dispatch_slice] Ignoring DLT event received (remote): {:s}' + LOGGER.info(MSG.format(grpc_message_to_json_string(event))) + diff --git a/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py b/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py index 779bae9c1..76104e2b7 100644 --- a/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py +++ b/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py @@ -1,23 +1,11 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 grpc, json, logging, threading +import asyncio +import logging +import json from typing import Any, Dict, Set from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME from common.proto.context_pb2 import ContextId, Device, EventTypeEnum, Link, Slice, TopologyId from common.proto.dlt_connector_pb2 import DltSliceId -from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordOperationEnum, DltRecordTypeEnum +from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordTypeEnum from common.tools.context_queries.Context import create_context from common.tools.context_queries.Device import add_device_to_topology from common.tools.context_queries.Link import add_link_to_topology @@ -50,31 +38,30 @@ class Clients: self.dlt_connector_client.close() self.context_client.close() -class DltEventDispatcher(threading.Thread): +class DltEventDispatcher: def __init__(self) -> None: LOGGER.debug('Creating connector...') - super().__init__(name='DltEventDispatcher', daemon=True) - self._terminate = threading.Event() + self._terminate = asyncio.Event() LOGGER.debug('Connector created') - def start(self) -> None: + async def start(self) -> None: self._terminate.clear() - return super().start() + await self.run() - def stop(self): + async def stop(self): self._terminate.set() - def run(self) -> None: + async def run(self) -> None: clients = Clients() create_context(clients.context_client, DEFAULT_CONTEXT_NAME) create_topology(clients.context_client, DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME) create_topology(clients.context_client, DEFAULT_CONTEXT_NAME, INTERDOMAIN_TOPOLOGY_NAME) dlt_events_collector = DltEventsCollector(clients.dlt_gateway_client, log_events_received=True) - dlt_events_collector.start() + await dlt_events_collector.run() while not self._terminate.is_set(): - event = dlt_events_collector.get_event(block=True, timeout=GET_EVENT_TIMEOUT) + event = await dlt_events_collector.get_event(block=True, timeout=GET_EVENT_TIMEOUT) if event is None: continue existing_topology_ids = clients.context_client.ListTopologyIds(ADMIN_CONTEXT_ID) @@ -84,24 +71,24 @@ class DltEventDispatcher(threading.Thread): local_domain_uuids.discard(DEFAULT_TOPOLOGY_NAME) local_domain_uuids.discard(INTERDOMAIN_TOPOLOGY_NAME) - self.dispatch_event(clients, local_domain_uuids, event) + await self.dispatch_event(clients, local_domain_uuids, event) - dlt_events_collector.stop() + await dlt_events_collector.stop() clients.close() - def dispatch_event(self, clients : Clients, local_domain_uuids : Set[str], event : DltRecordEvent) -> None: - record_type : DltRecordTypeEnum = event.record_id.type # {UNDEFINED/CONTEXT/TOPOLOGY/DEVICE/LINK/SERVICE/SLICE} + async def dispatch_event(self, clients: Clients, local_domain_uuids: Set[str], event: DltRecordEvent) -> None: + record_type: DltRecordTypeEnum = event.record_id.type # {UNDEFINED/CONTEXT/TOPOLOGY/DEVICE/LINK/SERVICE/SLICE} if record_type == DltRecordTypeEnum.DLTRECORDTYPE_DEVICE: - self._dispatch_device(clients, local_domain_uuids, event) + await self._dispatch_device(clients, local_domain_uuids, event) elif record_type == DltRecordTypeEnum.DLTRECORDTYPE_LINK: - self._dispatch_link(clients, local_domain_uuids, event) + await self._dispatch_link(clients, local_domain_uuids, event) elif record_type == DltRecordTypeEnum.DLTRECORDTYPE_SLICE: - self._dispatch_slice(clients, local_domain_uuids, event) + await self._dispatch_slice(clients, local_domain_uuids, event) else: raise NotImplementedError('EventType: {:s}'.format(grpc_message_to_json_string(event))) - def _dispatch_device(self, clients : Clients, local_domain_uuids : Set[str], event : DltRecordEvent) -> None: - domain_uuid : str = event.record_id.domain_uuid.uuid + async def _dispatch_device(self, clients: Clients, local_domain_uuids: Set[str], event: DltRecordEvent) -> None: + domain_uuid: str = event.record_id.domain_uuid.uuid if domain_uuid in local_domain_uuids: MSG = '[_dispatch_device] Ignoring DLT event received (local): {:s}' @@ -111,25 +98,25 @@ class DltEventDispatcher(threading.Thread): MSG = '[_dispatch_device] DLT event received (remote): {:s}' LOGGER.info(MSG.format(grpc_message_to_json_string(event))) - event_type : EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} + event_type: EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} if event_type in {EventTypeEnum.EVENTTYPE_CREATE, EventTypeEnum.EVENTTYPE_UPDATE}: LOGGER.info('[_dispatch_device] event.record_id={:s}'.format(grpc_message_to_json_string(event.record_id))) - record = clients.dlt_gateway_client.GetFromDlt(event.record_id) + record = await clients.dlt_gateway_client.GetFromDlt(event.record_id) LOGGER.info('[_dispatch_device] record={:s}'.format(grpc_message_to_json_string(record))) create_context(clients.context_client, domain_uuid) create_topology(clients.context_client, domain_uuid, DEFAULT_TOPOLOGY_NAME) device = Device(**json.loads(record.data_json)) clients.context_client.SetDevice(device) - device_uuid = device.device_id.device_uuid.uuid # pylint: disable=no-member + device_uuid = device.device_id.device_uuid.uuid # pylint: disable=no-member add_device_to_topology(clients.context_client, ADMIN_CONTEXT_ID, INTERDOMAIN_TOPOLOGY_NAME, device_uuid) domain_context_id = ContextId(**json_context_id(domain_uuid)) add_device_to_topology(clients.context_client, domain_context_id, DEFAULT_TOPOLOGY_NAME, device_uuid) elif event_type in {EventTypeEnum.EVENTTYPE_DELETE}: raise NotImplementedError('Delete Device') - def _dispatch_link(self, clients : Clients, local_domain_uuids : Set[str], event : DltRecordEvent) -> None: - domain_uuid : str = event.record_id.domain_uuid.uuid + async def _dispatch_link(self, clients: Clients, local_domain_uuids: Set[str], event: DltRecordEvent) -> None: + domain_uuid: str = event.record_id.domain_uuid.uuid if domain_uuid in local_domain_uuids: MSG = '[_dispatch_link] Ignoring DLT event received (local): {:s}' @@ -139,25 +126,25 @@ class DltEventDispatcher(threading.Thread): MSG = '[_dispatch_link] DLT event received (remote): {:s}' LOGGER.info(MSG.format(grpc_message_to_json_string(event))) - event_type : EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} + event_type: EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} if event_type in {EventTypeEnum.EVENTTYPE_CREATE, EventTypeEnum.EVENTTYPE_UPDATE}: LOGGER.info('[_dispatch_link] event.record_id={:s}'.format(grpc_message_to_json_string(event.record_id))) - record = clients.dlt_gateway_client.GetFromDlt(event.record_id) + record = await clients.dlt_gateway_client.GetFromDlt(event.record_id) LOGGER.info('[_dispatch_link] record={:s}'.format(grpc_message_to_json_string(record))) link = Link(**json.loads(record.data_json)) clients.context_client.SetLink(link) - link_uuid = link.link_id.link_uuid.uuid # pylint: disable=no-member + link_uuid = link.link_id.link_uuid.uuid # pylint: disable=no-member add_link_to_topology(clients.context_client, ADMIN_CONTEXT_ID, INTERDOMAIN_TOPOLOGY_NAME, link_uuid) elif event_type in {EventTypeEnum.EVENTTYPE_DELETE}: raise NotImplementedError('Delete Link') - def _dispatch_slice(self, clients : Clients, local_domain_uuids : Set[str], event : DltRecordEvent) -> None: - event_type : EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} - domain_uuid : str = event.record_id.domain_uuid.uuid + async def _dispatch_slice(self, clients: Clients, local_domain_uuids: Set[str], event: DltRecordEvent) -> None: + event_type: EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} + domain_uuid: str = event.record_id.domain_uuid.uuid LOGGER.info('[_dispatch_slice] event.record_id={:s}'.format(grpc_message_to_json_string(event.record_id))) - record = clients.dlt_gateway_client.GetFromDlt(event.record_id) + record = await clients.dlt_gateway_client.GetFromDlt(event.record_id) LOGGER.info('[_dispatch_slice] record={:s}'.format(grpc_message_to_json_string(record))) slice_ = Slice(**json.loads(record.data_json)) @@ -185,7 +172,7 @@ class DltEventDispatcher(threading.Thread): topology_id = TopologyId(**json_topology_id(domain_uuid)) dlt_slice_id = DltSliceId() dlt_slice_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member - dlt_slice_id.slice_id.CopyFrom(slice_id) # pylint: disable=no-member + dlt_slice_id.slice_id.CopyFrom(slice_id) # pylint: disable=no-member clients.dlt_connector_client.RecordSlice(dlt_slice_id) elif event_type in {EventTypeEnum.EVENTTYPE_DELETE}: @@ -199,11 +186,10 @@ class DltEventDispatcher(threading.Thread): local_slice.CopyFrom(slice_) # pylint: disable=no-member - del local_slice.slice_service_ids[:] # they are from remote domains so will not be present locally - del local_slice.slice_subslice_ids[:] # they are from remote domains so will not be present locally + del local_slice.slice_service_ids[:] # they are from remote domains so will not be present locally + del local_slice.slice_subslice_ids[:] # they are from remote domains so will not be present locally clients.context_client.SetSlice(local_slice) else: MSG = '[_dispatch_slice] Ignoring DLT event received (remote): {:s}' LOGGER.info(MSG.format(grpc_message_to_json_string(event))) - -- GitLab From 2f93875892a5c6c489cabf2267629475fb7c0cf6 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 14:35:52 +0200 Subject: [PATCH 430/602] debugging --- src/interdomain/service/__main__.py | 16 +- .../topology_abstractor/DltRecorder copy.py | 166 ++++++++++++++++++ .../topology_abstractor/DltRecorder.py | 89 +++++----- 3 files changed, 222 insertions(+), 49 deletions(-) create mode 100644 src/interdomain/service/topology_abstractor/DltRecorder copy.py diff --git a/src/interdomain/service/__main__.py b/src/interdomain/service/__main__.py index 8c392821e..3f5ccd183 100644 --- a/src/interdomain/service/__main__.py +++ b/src/interdomain/service/__main__.py @@ -13,6 +13,8 @@ # limitations under the License. import logging, signal, sys, threading +import asyncio + from prometheus_client import start_http_server from common.Constants import ServiceNameEnum from common.Settings import ( @@ -27,6 +29,12 @@ from .RemoteDomainClients import RemoteDomainClients terminate = threading.Event() LOGGER : logging.Logger = None + +async def run_dlt_recorder(dlt_recorder): + await dlt_recorder.start() + await terminate.wait() + await dlt_recorder.stop() + def signal_handler(signal, frame): # pylint: disable=redefined-outer-name LOGGER.warning('Terminate signal received') terminate.set() @@ -76,7 +84,9 @@ def main(): if dlt_enabled: LOGGER.info('Starting DLT functionality...') dlt_recorder = DLTRecorder() - dlt_recorder.start() + #dlt_recorder.start() + loop = asyncio.get_event_loop() + loop.run_until_complete(run_dlt_recorder(dlt_recorder)) # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=1.0): pass @@ -85,7 +95,9 @@ def main(): # if topology_abstractor_enabled: # topology_abstractor.stop() if dlt_enabled: - dlt_recorder.stop() + #dlt_recorder.stop() + loop.run_until_complete(dlt_recorder.stop()) + loop.close() grpc_service.stop() remote_domain_clients.stop() diff --git a/src/interdomain/service/topology_abstractor/DltRecorder copy.py b/src/interdomain/service/topology_abstractor/DltRecorder copy.py new file mode 100644 index 000000000..0e94159c4 --- /dev/null +++ b/src/interdomain/service/topology_abstractor/DltRecorder copy.py @@ -0,0 +1,166 @@ +import logging +import threading +from typing import Dict, Optional + +from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum +from common.Settings import ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_environment_variables, get_env_var_name +from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, DeviceId, EndPointId, Link, LinkId, LinkEvent, TopologyId, TopologyEvent +from common.tools.context_queries.Context import create_context +from common.tools.context_queries.Device import get_uuids_of_devices_in_topology +from common.tools.context_queries.Topology import create_missing_topologies +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.object_factory.Context import json_context_id +from common.tools.object_factory.Device import json_device_id +from common.tools.object_factory.Topology import json_topology_id +from context.client.ContextClient import ContextClient +from context.client.EventsCollector import EventsCollector +from dlt.connector.client.DltConnectorClient import DltConnectorClient +from .DltRecordSender import DltRecordSender +from .Types import EventTypes + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) +INTERDOMAIN_TOPOLOGY_ID = TopologyId(**json_topology_id(INTERDOMAIN_TOPOLOGY_NAME, context_id=ADMIN_CONTEXT_ID)) + + +class DLTRecorder(threading.Thread): + def __init__(self) -> None: + super().__init__(daemon=True) + self.terminate = threading.Event() + self.context_client = ContextClient() + self.context_event_collector = EventsCollector(self.context_client) + self.topology_cache: Dict[str, TopologyId] = {} + + def stop(self): + self.terminate.set() + + def run(self) -> None: + self.context_client.connect() + create_context(self.context_client, DEFAULT_CONTEXT_NAME) + self.create_topologies() + self.context_event_collector.start() + + while not self.terminate.is_set(): + event = self.context_event_collector.get_event(timeout=0.1) + if event is None: + continue + LOGGER.info('Processing Event({:s})...'.format(grpc_message_to_json_string(event))) + self.update_record(event) + + self.context_event_collector.stop() + self.context_client.close() + + def create_topologies(self): + topology_uuids = [DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME] + create_missing_topologies(self.context_client, ADMIN_CONTEXT_ID, topology_uuids) + + def get_dlt_connector_client(self) -> Optional[DltConnectorClient]: + # Always enable DLT for testing + dlt_connector_client = DltConnectorClient() + dlt_connector_client.connect() + return dlt_connector_client + # env_vars = find_environment_variables([ + # get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_HOST), + # get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), + # ]) + # if len(env_vars) == 2: + # dlt_connector_client = DltConnectorClient() + # dlt_connector_client.connect() + # return dlt_connector_client + # return None + + def update_record(self, event: EventTypes) -> None: + dlt_connector_client = self.get_dlt_connector_client() + dlt_record_sender = DltRecordSender(self.context_client, dlt_connector_client) + + if isinstance(event, ContextEvent): + LOGGER.debug('Processing ContextEvent({:s})'.format(grpc_message_to_json_string(event))) + LOGGER.warning('Ignoring ContextEvent({:s})'.format(grpc_message_to_json_string(event))) + + elif isinstance(event, TopologyEvent): + LOGGER.debug('Processing TopologyEvent({:s})'.format(grpc_message_to_json_string(event))) + self.process_topology_event(event, dlt_record_sender) + + elif isinstance(event, DeviceEvent): + LOGGER.debug('Processing DeviceEvent({:s})'.format(grpc_message_to_json_string(event))) + self.process_device_event(event, dlt_record_sender) + + elif isinstance(event, LinkEvent): + LOGGER.debug('Processing LinkEvent({:s})'.format(grpc_message_to_json_string(event))) + self.process_link_event(event, dlt_record_sender) + + else: + LOGGER.warning('Unsupported Event({:s})'.format(grpc_message_to_json_string(event))) + + dlt_record_sender.commit() + if dlt_connector_client is not None: + dlt_connector_client.close() + + def process_topology_event(self, event: TopologyEvent, dlt_record_sender: DltRecordSender) -> None: + topology_id = event.topology_id + topology_uuid = topology_id.topology_uuid.uuid + context_id = topology_id.context_id + context_uuid = context_id.context_uuid.uuid + topology_uuids = {DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME} + + context = self.context_client.GetContext(context_id) + context_name = context.name + + topology_details = self.context_client.GetTopologyDetails(topology_id) + topology_name = topology_details.name + + self.topology_cache[topology_uuid] = topology_id + + LOGGER.debug('TOPOLOGY Details({:s})'.format(grpc_message_to_json_string(topology_details))) + + if ((context_uuid == DEFAULT_CONTEXT_NAME) or (context_name == DEFAULT_CONTEXT_NAME)) and \ + (topology_uuid not in topology_uuids) and (topology_name not in topology_uuids): + for device in topology_details.devices: + LOGGER.debug('DEVICE_INFO_TOPO({:s})'.format(grpc_message_to_json_string(device))) + dlt_record_sender.add_device(topology_id, device) + + for link in topology_details.links: + dlt_record_sender.add_link(topology_id, link) + + else: + MSG = 'Ignoring ({:s}/{:s})({:s}/{:s}) TopologyEvent({:s})' + args = context_uuid, context_name, topology_uuid, topology_name, grpc_message_to_json_string(event) + LOGGER.warning(MSG.format(*args)) + + def find_topology_for_device(self, device_id: DeviceId) -> Optional[TopologyId]: + for topology_uuid, topology_id in self.topology_cache.items(): + details = self.context_client.GetTopologyDetails(topology_id) + for device in details.devices: + if device.device_id == device_id: + return topology_id + return None + + def find_topology_for_link(self, link_id: LinkId) -> Optional[TopologyId]: + for topology_uuid, topology_id in self.topology_cache.items(): + details = self.context_client.GetTopologyDetails(topology_id) + for link in details.links: + if link.link_id == link_id: + return topology_id + return None + + def process_device_event(self, event: DeviceEvent, dlt_record_sender: DltRecordSender) -> None: + device_id = event.device_id + device = self.context_client.GetDevice(device_id) + topology_id = self.find_topology_for_device(device_id) + if topology_id: + LOGGER.debug('DEVICE_INFO({:s}), DEVICE_ID ({:s})'.format(str(device.device_id.device_uuid.uuid), grpc_message_to_json_string(device_id))) + + dlt_record_sender.add_device(topology_id, device) + else: + LOGGER.warning(f"Topology not found for device {device_id.device_uuid.uuid}") + + def process_link_event(self, event: LinkEvent, dlt_record_sender: DltRecordSender) -> None: + link_id = event.link_id + link = self.context_client.GetLink(link_id) + topology_id = self.find_topology_for_link(link_id) + if topology_id: + dlt_record_sender.add_link(topology_id, link) + else: + LOGGER.warning(f"Topology not found for link {link_id.link_uuid.uuid}") diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index 0e94159c4..96c97f5a2 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -1,10 +1,12 @@ +# DltRecorder.py + import logging -import threading +import asyncio from typing import Dict, Optional from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum from common.Settings import ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_environment_variables, get_env_var_name -from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, DeviceId, EndPointId, Link, LinkId, LinkEvent, TopologyId, TopologyEvent +from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, EndPointId, Link, LinkId, LinkEvent, TopologyId, TopologyEvent from common.tools.context_queries.Context import create_context from common.tools.context_queries.Device import get_uuids_of_devices_in_topology from common.tools.context_queries.Topology import create_missing_topologies @@ -25,54 +27,47 @@ ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) INTERDOMAIN_TOPOLOGY_ID = TopologyId(**json_topology_id(INTERDOMAIN_TOPOLOGY_NAME, context_id=ADMIN_CONTEXT_ID)) -class DLTRecorder(threading.Thread): +class DLTRecorder: def __init__(self) -> None: - super().__init__(daemon=True) - self.terminate = threading.Event() + self.terminate_event = asyncio.Event() self.context_client = ContextClient() self.context_event_collector = EventsCollector(self.context_client) self.topology_cache: Dict[str, TopologyId] = {} - def stop(self): - self.terminate.set() + async def stop(self): + self.terminate_event.set() + + async def start(self) -> None: + await self.run() - def run(self) -> None: - self.context_client.connect() + async def run(self) -> None: + await self.context_client.connect() create_context(self.context_client, DEFAULT_CONTEXT_NAME) self.create_topologies() - self.context_event_collector.start() + await self.context_event_collector.start() - while not self.terminate.is_set(): - event = self.context_event_collector.get_event(timeout=0.1) + while not self.terminate_event.is_set(): + event = await self.context_event_collector.get_event(timeout=0.1) if event is None: continue LOGGER.info('Processing Event({:s})...'.format(grpc_message_to_json_string(event))) - self.update_record(event) + await self.update_record(event) - self.context_event_collector.stop() - self.context_client.close() + await self.context_event_collector.stop() + await self.context_client.close() def create_topologies(self): topology_uuids = [DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME] create_missing_topologies(self.context_client, ADMIN_CONTEXT_ID, topology_uuids) - def get_dlt_connector_client(self) -> Optional[DltConnectorClient]: + async def get_dlt_connector_client(self) -> Optional[DltConnectorClient]: # Always enable DLT for testing dlt_connector_client = DltConnectorClient() - dlt_connector_client.connect() + await dlt_connector_client.connect() return dlt_connector_client - # env_vars = find_environment_variables([ - # get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_HOST), - # get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), - # ]) - # if len(env_vars) == 2: - # dlt_connector_client = DltConnectorClient() - # dlt_connector_client.connect() - # return dlt_connector_client - # return None - - def update_record(self, event: EventTypes) -> None: - dlt_connector_client = self.get_dlt_connector_client() + + async def update_record(self, event: EventTypes) -> None: + dlt_connector_client = await self.get_dlt_connector_client() dlt_record_sender = DltRecordSender(self.context_client, dlt_connector_client) if isinstance(event, ContextEvent): @@ -81,34 +76,34 @@ class DLTRecorder(threading.Thread): elif isinstance(event, TopologyEvent): LOGGER.debug('Processing TopologyEvent({:s})'.format(grpc_message_to_json_string(event))) - self.process_topology_event(event, dlt_record_sender) + await self.process_topology_event(event, dlt_record_sender) elif isinstance(event, DeviceEvent): LOGGER.debug('Processing DeviceEvent({:s})'.format(grpc_message_to_json_string(event))) - self.process_device_event(event, dlt_record_sender) + await self.process_device_event(event, dlt_record_sender) elif isinstance(event, LinkEvent): LOGGER.debug('Processing LinkEvent({:s})'.format(grpc_message_to_json_string(event))) - self.process_link_event(event, dlt_record_sender) + await self.process_link_event(event, dlt_record_sender) else: LOGGER.warning('Unsupported Event({:s})'.format(grpc_message_to_json_string(event))) - dlt_record_sender.commit() + await dlt_record_sender.commit() if dlt_connector_client is not None: - dlt_connector_client.close() + await dlt_connector_client.close() - def process_topology_event(self, event: TopologyEvent, dlt_record_sender: DltRecordSender) -> None: + async def process_topology_event(self, event: TopologyEvent, dlt_record_sender: DltRecordSender) -> None: topology_id = event.topology_id topology_uuid = topology_id.topology_uuid.uuid context_id = topology_id.context_id context_uuid = context_id.context_uuid.uuid topology_uuids = {DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME} - context = self.context_client.GetContext(context_id) + context = await self.context_client.GetContext(context_id) context_name = context.name - topology_details = self.context_client.GetTopologyDetails(topology_id) + topology_details = await self.context_client.GetTopologyDetails(topology_id) topology_name = topology_details.name self.topology_cache[topology_uuid] = topology_id @@ -129,26 +124,26 @@ class DLTRecorder(threading.Thread): args = context_uuid, context_name, topology_uuid, topology_name, grpc_message_to_json_string(event) LOGGER.warning(MSG.format(*args)) - def find_topology_for_device(self, device_id: DeviceId) -> Optional[TopologyId]: + async def find_topology_for_device(self, device_id: DeviceId) -> Optional[TopologyId]: for topology_uuid, topology_id in self.topology_cache.items(): - details = self.context_client.GetTopologyDetails(topology_id) + details = await self.context_client.GetTopologyDetails(topology_id) for device in details.devices: if device.device_id == device_id: return topology_id return None - def find_topology_for_link(self, link_id: LinkId) -> Optional[TopologyId]: + async def find_topology_for_link(self, link_id: LinkId) -> Optional[TopologyId]: for topology_uuid, topology_id in self.topology_cache.items(): - details = self.context_client.GetTopologyDetails(topology_id) + details = await self.context_client.GetTopologyDetails(topology_id) for link in details.links: if link.link_id == link_id: return topology_id return None - def process_device_event(self, event: DeviceEvent, dlt_record_sender: DltRecordSender) -> None: + async def process_device_event(self, event: DeviceEvent, dlt_record_sender: DltRecordSender) -> None: device_id = event.device_id - device = self.context_client.GetDevice(device_id) - topology_id = self.find_topology_for_device(device_id) + device = await self.context_client.GetDevice(device_id) + topology_id = await self.find_topology_for_device(device_id) if topology_id: LOGGER.debug('DEVICE_INFO({:s}), DEVICE_ID ({:s})'.format(str(device.device_id.device_uuid.uuid), grpc_message_to_json_string(device_id))) @@ -156,10 +151,10 @@ class DLTRecorder(threading.Thread): else: LOGGER.warning(f"Topology not found for device {device_id.device_uuid.uuid}") - def process_link_event(self, event: LinkEvent, dlt_record_sender: DltRecordSender) -> None: + async def process_link_event(self, event: LinkEvent, dlt_record_sender: DltRecordSender) -> None: link_id = event.link_id - link = self.context_client.GetLink(link_id) - topology_id = self.find_topology_for_link(link_id) + link = await self.context_client.GetLink(link_id) + topology_id = await self.find_topology_for_link(link_id) if topology_id: dlt_record_sender.add_link(topology_id, link) else: -- GitLab From 29b3023e543bb63f69cb1e043faca7be1768a610 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 14:41:08 +0200 Subject: [PATCH 431/602] Debugging --- src/interdomain/service/topology_abstractor/DltRecorder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index 96c97f5a2..9ed1aa750 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -6,7 +6,7 @@ from typing import Dict, Optional from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum from common.Settings import ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_environment_variables, get_env_var_name -from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, EndPointId, Link, LinkId, LinkEvent, TopologyId, TopologyEvent +from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceId, DeviceEvent, EndPointId, Link, LinkId, LinkEvent, TopologyId, TopologyEvent from common.tools.context_queries.Context import create_context from common.tools.context_queries.Device import get_uuids_of_devices_in_topology from common.tools.context_queries.Topology import create_missing_topologies -- GitLab From 420053974ae4c4ad48e4699d85ffa31c83ba1538 Mon Sep 17 00:00:00 2001 From: diazjj Date: Mon, 29 Jul 2024 14:59:08 +0200 Subject: [PATCH 432/602] Revert "Debugging" This reverts commit 8503a835ba6a889cdb47a8666a3abb60fd63242a. --- .../connector/client/DltConnectorClient.py | 38 ++-- .../client/DltEventsCollector copy.py | 95 -------- .../connector/client/DltEventsCollector.py | 74 ++++--- src/dlt/connector/client/DltGatewayClient.py | 22 +- src/dlt/connector/client/async.py | 74 ------- .../DltConnectorServiceServicerImpl.py | 28 +-- .../DltEventDispatcher copy.py | 209 ------------------ .../event_dispatcher/DltEventDispatcher.py | 86 ++++--- src/interdomain/service/__main__.py | 16 +- .../topology_abstractor/DltRecordSender.py | 10 +- .../topology_abstractor/DltRecorder copy.py | 166 -------------- .../topology_abstractor/DltRecorder.py | 89 ++++---- 12 files changed, 186 insertions(+), 721 deletions(-) delete mode 100644 src/dlt/connector/client/DltEventsCollector copy.py delete mode 100644 src/dlt/connector/client/async.py delete mode 100644 src/dlt/connector/service/event_dispatcher/DltEventDispatcher copy.py delete mode 100644 src/interdomain/service/topology_abstractor/DltRecorder copy.py diff --git a/src/dlt/connector/client/DltConnectorClient.py b/src/dlt/connector/client/DltConnectorClient.py index 7cfb6b594..e383217d8 100644 --- a/src/dlt/connector/client/DltConnectorClient.py +++ b/src/dlt/connector/client/DltConnectorClient.py @@ -39,7 +39,7 @@ class DltConnectorClient: LOGGER.debug('Channel created') def connect(self): - self.channel = grpc.aio.insecure_channel(self.endpoint) + self.channel = grpc.insecure_channel(self.endpoint) self.stub = DltConnectorServiceStub(self.channel) def close(self): @@ -48,64 +48,64 @@ class DltConnectorClient: self.stub = None @RETRY_DECORATOR - async def RecordAll(self, request : TopologyId) -> Empty: + def RecordAll(self, request : TopologyId) -> Empty: LOGGER.debug('RecordAll request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordAll(request) + response = self.stub.RecordAll(request) LOGGER.debug('RecordAll result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def RecordAllDevices(self, request : TopologyId) -> Empty: + def RecordAllDevices(self, request : TopologyId) -> Empty: LOGGER.debug('RecordAllDevices request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordAllDevices(request) + response = self.stub.RecordAllDevices(request) LOGGER.debug('RecordAllDevices result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def RecordDevice(self, request : DltDeviceId) -> Empty: + def RecordDevice(self, request : DltDeviceId) -> Empty: LOGGER.debug('RecordDevice request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordDevice(request) + response = self.stub.RecordDevice(request) LOGGER.debug('RecordDevice result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def RecordAllLinks(self, request : TopologyId) -> Empty: + def RecordAllLinks(self, request : TopologyId) -> Empty: LOGGER.debug('RecordAllLinks request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordAllLinks(request) + response = self.stub.RecordAllLinks(request) LOGGER.debug('RecordAllLinks result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def RecordLink(self, request : DltLinkId) -> Empty: + def RecordLink(self, request : DltLinkId) -> Empty: LOGGER.debug('RecordLink request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordLink(request) + response = self.stub.RecordLink(request) LOGGER.debug('RecordLink result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def RecordAllServices(self, request : TopologyId) -> Empty: + def RecordAllServices(self, request : TopologyId) -> Empty: LOGGER.debug('RecordAllServices request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordAllServices(request) + response = self.stub.RecordAllServices(request) LOGGER.debug('RecordAllServices result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def RecordService(self, request : DltServiceId) -> Empty: + def RecordService(self, request : DltServiceId) -> Empty: LOGGER.debug('RecordService request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordService(request) + response = self.stub.RecordService(request) LOGGER.debug('RecordService result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def RecordAllSlices(self, request : TopologyId) -> Empty: + def RecordAllSlices(self, request : TopologyId) -> Empty: LOGGER.debug('RecordAllSlices request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordAllSlices(request) + response = self.stub.RecordAllSlices(request) LOGGER.debug('RecordAllSlices result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def RecordSlice(self, request : DltSliceId) -> Empty: + def RecordSlice(self, request : DltSliceId) -> Empty: LOGGER.debug('RecordSlice request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordSlice(request) + response = self.stub.RecordSlice(request) LOGGER.debug('RecordSlice result: {:s}'.format(grpc_message_to_json_string(response))) return response diff --git a/src/dlt/connector/client/DltEventsCollector copy.py b/src/dlt/connector/client/DltEventsCollector copy.py deleted file mode 100644 index 9fac60b7c..000000000 --- a/src/dlt/connector/client/DltEventsCollector copy.py +++ /dev/null @@ -1,95 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. - -from typing import Callable, Optional -import asyncio -import grpc, logging, queue, threading, time -from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordSubscription -from common.tools.grpc.Tools import grpc_message_to_json_string -from dlt.connector.client.DltGatewayClient import DltGatewayClient - -LOGGER = logging.getLogger(__name__) -LOGGER.setLevel(logging.DEBUG) - -# This class accepts an event_handler method as attribute that can be used to pre-process and -# filter events before they reach the events_queue. Depending on the handler, the supported -# behaviors are: -# - If the handler is not set, the events are transparently added to the events_queue. -# - If returns None for an event, the event is not stored in the events_queue. -# - If returns a DltRecordEvent object for an event, the returned event is stored in the events_queue. -# - Other combinations are not supported. - -class DltEventsCollector(threading.Thread): - def __init__( - self, dltgateway_client : DltGatewayClient, - log_events_received : bool = False, - event_handler : Optional[Callable[[DltRecordEvent], Optional[DltRecordEvent]]] = None, - ) -> None: - super().__init__(name='DltEventsCollector', daemon=True) - self._dltgateway_client = dltgateway_client - self._log_events_received = log_events_received - self._event_handler = event_handler - self._events_queue = queue.Queue() - self._terminate = threading.Event() - self._dltgateway_stream = None - - def run(self) -> None: - event_handler = self._event_handler - if event_handler is None: event_handler = lambda e: e - self._terminate.clear() - while not self._terminate.is_set(): - try: - subscription = DltRecordSubscription() # bu default subscribe to all - self._dltgateway_stream = self._dltgateway_client.SubscribeToDlt(subscription) - for event in self._dltgateway_stream: - if self._log_events_received: - LOGGER.info('[_collect] event: {:s}'.format(grpc_message_to_json_string(event))) - event = event_handler(event) - if event is None: continue - if not isinstance(event, DltRecordEvent): - # pylint: disable=broad-exception-raised - raise Exception('Unsupported return type: {:s}'.format(str(event))) - self._events_queue.put_nowait(event) - except grpc.RpcError as e: - if e.code() == grpc.StatusCode.UNAVAILABLE: # pylint: disable=no-member - time.sleep(0.5) - continue - elif e.code() == grpc.StatusCode.CANCELLED: # pylint: disable=no-member - break - else: - raise # pragma: no cover - - def get_event(self, block : bool = True, timeout : float = 0.1): - try: - return self._events_queue.get(block=block, timeout=timeout) - except queue.Empty: # pylint: disable=catching-non-exception - return None - - def get_events(self, block : bool = True, timeout : float = 0.1, count : int = None): - events = [] - if count is None: - while True: - event = self.get_event(block=block, timeout=timeout) - if event is None: break - events.append(event) - else: - for _ in range(count): - event = self.get_event(block=block, timeout=timeout) - if event is None: continue - events.append(event) - return sorted(events, key=lambda e: e.event.timestamp.timestamp) - - def stop(self): - self._terminate.set() - if self._dltgateway_stream is not None: self._dltgateway_stream.cancel() diff --git a/src/dlt/connector/client/DltEventsCollector.py b/src/dlt/connector/client/DltEventsCollector.py index 31eaf8542..e59784a4d 100644 --- a/src/dlt/connector/client/DltEventsCollector.py +++ b/src/dlt/connector/client/DltEventsCollector.py @@ -13,9 +13,7 @@ # limitations under the License. from typing import Callable, Optional -import asyncio -import grpc -import logging +import grpc, logging, queue, threading, time from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordSubscription from common.tools.grpc.Tools import grpc_message_to_json_string from dlt.connector.client.DltGatewayClient import DltGatewayClient @@ -23,70 +21,74 @@ from dlt.connector.client.DltGatewayClient import DltGatewayClient LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) -class DltEventsCollector: +# This class accepts an event_handler method as attribute that can be used to pre-process and +# filter events before they reach the events_queue. Depending on the handler, the supported +# behaviors are: +# - If the handler is not set, the events are transparently added to the events_queue. +# - If returns None for an event, the event is not stored in the events_queue. +# - If returns a DltRecordEvent object for an event, the returned event is stored in the events_queue. +# - Other combinations are not supported. + +class DltEventsCollector(threading.Thread): def __init__( - self, dltgateway_client: DltGatewayClient, - log_events_received: bool = False, - event_handler: Optional[Callable[[DltRecordEvent], Optional[DltRecordEvent]]] = None, + self, dltgateway_client : DltGatewayClient, + log_events_received : bool = False, + event_handler : Optional[Callable[[DltRecordEvent], Optional[DltRecordEvent]]] = None, ) -> None: + super().__init__(name='DltEventsCollector', daemon=True) self._dltgateway_client = dltgateway_client self._log_events_received = log_events_received self._event_handler = event_handler - self._events_queue = asyncio.Queue() - self._terminate = asyncio.Event() + self._events_queue = queue.Queue() + self._terminate = threading.Event() self._dltgateway_stream = None - async def run(self) -> None: + def run(self) -> None: event_handler = self._event_handler - if event_handler is None: - event_handler = lambda e: e + if event_handler is None: event_handler = lambda e: e self._terminate.clear() while not self._terminate.is_set(): try: - subscription = DltRecordSubscription() # by default subscribe to all - self._dltgateway_stream = await self._dltgateway_client.SubscribeToDlt(subscription) - async for event in self._dltgateway_stream: + subscription = DltRecordSubscription() # bu default subscribe to all + self._dltgateway_stream = self._dltgateway_client.SubscribeToDlt(subscription) + for event in self._dltgateway_stream: if self._log_events_received: LOGGER.info('[_collect] event: {:s}'.format(grpc_message_to_json_string(event))) event = event_handler(event) - if event is None: - continue + if event is None: continue if not isinstance(event, DltRecordEvent): + # pylint: disable=broad-exception-raised raise Exception('Unsupported return type: {:s}'.format(str(event))) - await self._events_queue.put(event) + self._events_queue.put_nowait(event) except grpc.RpcError as e: - if e.code() == grpc.StatusCode.UNAVAILABLE: # pylint: disable=no-member - await asyncio.sleep(0.5) + if e.code() == grpc.StatusCode.UNAVAILABLE: # pylint: disable=no-member + time.sleep(0.5) continue - elif e.code() == grpc.StatusCode.CANCELLED: # pylint: disable=no-member + elif e.code() == grpc.StatusCode.CANCELLED: # pylint: disable=no-member break else: - raise # pragma: no cover + raise # pragma: no cover - async def get_event(self, block: bool = True, timeout: float = 0.1): + def get_event(self, block : bool = True, timeout : float = 0.1): try: - return await asyncio.wait_for(self._events_queue.get(), timeout) - except asyncio.TimeoutError: + return self._events_queue.get(block=block, timeout=timeout) + except queue.Empty: # pylint: disable=catching-non-exception return None - async def get_events(self, block: bool = True, timeout: float = 0.1, count: int = None): + def get_events(self, block : bool = True, timeout : float = 0.1, count : int = None): events = [] if count is None: while True: - event = await self.get_event(block=block, timeout=timeout) - if event is None: - break + event = self.get_event(block=block, timeout=timeout) + if event is None: break events.append(event) else: for _ in range(count): - event = await self.get_event(block=block, timeout=timeout) - if event is None: - continue + event = self.get_event(block=block, timeout=timeout) + if event is None: continue events.append(event) return sorted(events, key=lambda e: e.event.timestamp.timestamp) - async def stop(self): + def stop(self): self._terminate.set() - if self._dltgateway_stream is not None: - await self._dltgateway_stream.cancel() - + if self._dltgateway_stream is not None: self._dltgateway_stream.cancel() diff --git a/src/dlt/connector/client/DltGatewayClient.py b/src/dlt/connector/client/DltGatewayClient.py index f9b37a2db..cde278517 100644 --- a/src/dlt/connector/client/DltGatewayClient.py +++ b/src/dlt/connector/client/DltGatewayClient.py @@ -40,7 +40,7 @@ class DltGatewayClient: LOGGER.debug('Channel created') def connect(self): - self.channel = grpc.aio.insecure_channel(self.endpoint) + self.channel = grpc.insecure_channel(self.endpoint) self.stub = DltGatewayServiceStub(self.channel) def close(self): @@ -49,36 +49,36 @@ class DltGatewayClient: self.stub = None @RETRY_DECORATOR - async def RecordToDlt(self, request : DltRecord) -> DltRecordStatus: + def RecordToDlt(self, request : DltRecord) -> DltRecordStatus: LOGGER.debug('RecordToDlt request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordToDlt(request) + response = self.stub.RecordToDlt(request) LOGGER.debug('RecordToDlt result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def GetFromDlt(self, request : DltRecordId) -> DltRecord: + def GetFromDlt(self, request : DltRecordId) -> DltRecord: LOGGER.debug('GetFromDlt request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.GetFromDlt(request) + response = self.stub.GetFromDlt(request) LOGGER.debug('GetFromDlt result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def SubscribeToDlt(self, request : DltRecordSubscription) -> Iterator[DltRecordEvent]: + def SubscribeToDlt(self, request : DltRecordSubscription) -> Iterator[DltRecordEvent]: LOGGER.debug('SubscribeToDlt request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.SubscribeToDlt(request) + response = self.stub.SubscribeToDlt(request) LOGGER.debug('SubscribeToDlt result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def GetDltStatus(self, request : TeraFlowController) -> DltPeerStatus: + def GetDltStatus(self, request : TeraFlowController) -> DltPeerStatus: LOGGER.debug('GetDltStatus request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.GetDltStatus(request) + response = self.stub.GetDltStatus(request) LOGGER.debug('GetDltStatus result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def GetDltPeers(self, request : Empty) -> DltPeerStatusList: + def GetDltPeers(self, request : Empty) -> DltPeerStatusList: LOGGER.debug('GetDltPeers request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.GetDltPeers(request) + response = self.stub.GetDltPeers(request) LOGGER.debug('GetDltPeers result: {:s}'.format(grpc_message_to_json_string(response))) return response diff --git a/src/dlt/connector/client/async.py b/src/dlt/connector/client/async.py deleted file mode 100644 index e38f124c2..000000000 --- a/src/dlt/connector/client/async.py +++ /dev/null @@ -1,74 +0,0 @@ -# DltGatewayClient.py - -import grpc -import logging -from typing import Iterator -from common.proto.context_pb2 import Empty, TeraFlowController -from common.proto.dlt_gateway_pb2 import ( - DltPeerStatus, DltPeerStatusList, DltRecord, DltRecordEvent, DltRecordId, DltRecordStatus, DltRecordSubscription -) -from common.proto.dlt_gateway_pb2_grpc import DltGatewayServiceStub -from common.tools.client.RetryDecorator import retry, delay_exponential -from common.tools.grpc.Tools import grpc_message_to_json_string -from dlt.connector.Config import DLT_GATEWAY_HOST, DLT_GATEWAY_PORT - -LOGGER = logging.getLogger(__name__) -LOGGER.setLevel(logging.DEBUG) -MAX_RETRIES = 15 -DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) -RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') - -class DltGatewayClient: - def __init__(self, host=None, port=None): - if not host: host = DLT_GATEWAY_HOST - if not port: port = DLT_GATEWAY_PORT - self.endpoint = '{:s}:{:s}'.format(str(host), str(port)) - LOGGER.debug('Creating channel to {:s}...'.format(self.endpoint)) - self.channel = None - self.stub = None - self.connect() - LOGGER.debug('Channel created') - - def connect(self): - self.channel = grpc.aio.insecure_channel(self.endpoint) - self.stub = DltGatewayServiceStub(self.channel) - - def close(self): - if self.channel is not None: self.channel.close() - self.channel = None - self.stub = None - - @RETRY_DECORATOR - async def RecordToDlt(self, request: DltRecord) -> DltRecordStatus: - LOGGER.debug('RecordToDlt request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordToDlt(request) - LOGGER.debug('RecordToDlt result: {:s}'.format(grpc_message_to_json_string(response))) - return response - - @RETRY_DECORATOR - async def GetFromDlt(self, request: DltRecordId) -> DltRecord: - LOGGER.debug('GetFromDlt request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.GetFromDlt(request) - LOGGER.debug('GetFromDlt result: {:s}'.format(grpc_message_to_json_string(response))) - return response - - @RETRY_DECORATOR - async def SubscribeToDlt(self, request: DltRecordSubscription) -> Iterator[DltRecordEvent]: - LOGGER.debug('SubscribeToDlt request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.SubscribeToDlt(request) - LOGGER.debug('SubscribeToDlt result: {:s}'.format(grpc_message_to_json_string(response))) - return response - - @RETRY_DECORATOR - async def GetDltStatus(self, request: TeraFlowController) -> DltPeerStatus: - LOGGER.debug('GetDltStatus request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.GetDltStatus(request) - LOGGER.debug('GetDltStatus result: {:s}'.format(grpc_message_to_json_string(response))) - return response - - @RETRY_DECORATOR - async def GetDltPeers(self, request: Empty) -> DltPeerStatusList: - LOGGER.debug('GetDltPeers request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.GetDltPeers(request) - LOGGER.debug('GetDltPeers result: {:s}'.format(grpc_message_to_json_string(response))) - return response diff --git a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py index df5e8fd08..c05d46b48 100644 --- a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py +++ b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py @@ -35,22 +35,22 @@ class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): LOGGER.debug('Servicer Created') @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - async def RecordAll(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: + def RecordAll(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - async def RecordAllDevices(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: + def RecordAllDevices(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - async def RecordDevice(self, request : DltDeviceId, context : grpc.ServicerContext) -> Empty: + def RecordDevice(self, request : DltDeviceId, context : grpc.ServicerContext) -> Empty: data_json = None if not request.delete: context_client = ContextClient() device = context_client.GetDevice(request.device_id) data_json = grpc_message_to_json_string(device) - await self._record_entity( + self._record_entity( request.topology_id.topology_uuid.uuid, DltRecordTypeEnum.DLTRECORDTYPE_DEVICE, request.device_id.device_uuid.uuid, request.delete, data_json) return Empty() @@ -60,53 +60,53 @@ class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - async def RecordLink(self, request : DltLinkId, context : grpc.ServicerContext) -> Empty: + def RecordLink(self, request : DltLinkId, context : grpc.ServicerContext) -> Empty: data_json = None if not request.delete: context_client = ContextClient() link = context_client.GetLink(request.link_id) data_json = grpc_message_to_json_string(link) - await self._record_entity( + self._record_entity( request.topology_id.topology_uuid.uuid, DltRecordTypeEnum.DLTRECORDTYPE_LINK, request.link_id.link_uuid.uuid, request.delete, data_json) return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - async def RecordAllServices(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: + def RecordAllServices(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - async def RecordService(self, request : DltServiceId, context : grpc.ServicerContext) -> Empty: + def RecordService(self, request : DltServiceId, context : grpc.ServicerContext) -> Empty: data_json = None if not request.delete: context_client = ContextClient() service = context_client.GetService(request.service_id) data_json = grpc_message_to_json_string(service) - await self._record_entity( + self._record_entity( request.topology_id.topology_uuid.uuid, DltRecordTypeEnum.DLTRECORDTYPE_SERVICE, request.service_id.service_uuid.uuid, request.delete, data_json) return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - async def RecordAllSlices(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: + def RecordAllSlices(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - async def RecordSlice(self, request : DltSliceId, context : grpc.ServicerContext) -> Empty: + def RecordSlice(self, request : DltSliceId, context : grpc.ServicerContext) -> Empty: data_json = None if not request.delete: context_client = ContextClient() slice_ = context_client.GetSlice(request.slice_id) data_json = grpc_message_to_json_string(slice_) - await self._record_entity( + self._record_entity( request.topology_id.topology_uuid.uuid, DltRecordTypeEnum.DLTRECORDTYPE_SLICE, request.slice_id.slice_uuid.uuid, request.delete, data_json) return Empty() - async def _record_entity( + def _record_entity( self, dlt_domain_uuid : str, dlt_record_type : DltRecordTypeEnum, dlt_record_uuid : str, delete : bool, data_json : Optional[str] = None ) -> None: @@ -143,6 +143,6 @@ class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): str_dlt_record = grpc_message_to_json_string(dlt_record) LOGGER.debug('[_record_entity] sent dlt_record = {:s}'.format(str_dlt_record)) - dlt_record_status = await dltgateway_client.RecordToDlt(dlt_record) + dlt_record_status = dltgateway_client.RecordToDlt(dlt_record) str_dlt_record_status = grpc_message_to_json_string(dlt_record_status) LOGGER.debug('[_record_entity] recv dlt_record_status = {:s}'.format(str_dlt_record_status)) diff --git a/src/dlt/connector/service/event_dispatcher/DltEventDispatcher copy.py b/src/dlt/connector/service/event_dispatcher/DltEventDispatcher copy.py deleted file mode 100644 index 779bae9c1..000000000 --- a/src/dlt/connector/service/event_dispatcher/DltEventDispatcher copy.py +++ /dev/null @@ -1,209 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 grpc, json, logging, threading -from typing import Any, Dict, Set -from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME -from common.proto.context_pb2 import ContextId, Device, EventTypeEnum, Link, Slice, TopologyId -from common.proto.dlt_connector_pb2 import DltSliceId -from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordOperationEnum, DltRecordTypeEnum -from common.tools.context_queries.Context import create_context -from common.tools.context_queries.Device import add_device_to_topology -from common.tools.context_queries.Link import add_link_to_topology -from common.tools.context_queries.Topology import create_topology -from common.tools.grpc.Tools import grpc_message_to_json_string -from common.tools.object_factory.Context import json_context_id -from common.tools.object_factory.Topology import json_topology_id -from context.client.ContextClient import ContextClient -from dlt.connector.client.DltConnectorClient import DltConnectorClient -from dlt.connector.client.DltEventsCollector import DltEventsCollector -from dlt.connector.client.DltGatewayClient import DltGatewayClient -from interdomain.client.InterdomainClient import InterdomainClient - -LOGGER = logging.getLogger(__name__) - -GET_EVENT_TIMEOUT = 0.5 - -ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) - -class Clients: - def __init__(self) -> None: - self.context_client = ContextClient() - self.dlt_connector_client = DltConnectorClient() - self.dlt_gateway_client = DltGatewayClient() - self.interdomain_client = InterdomainClient() - - def close(self) -> None: - self.interdomain_client.close() - self.dlt_gateway_client.close() - self.dlt_connector_client.close() - self.context_client.close() - -class DltEventDispatcher(threading.Thread): - def __init__(self) -> None: - LOGGER.debug('Creating connector...') - super().__init__(name='DltEventDispatcher', daemon=True) - self._terminate = threading.Event() - LOGGER.debug('Connector created') - - def start(self) -> None: - self._terminate.clear() - return super().start() - - def stop(self): - self._terminate.set() - - def run(self) -> None: - clients = Clients() - create_context(clients.context_client, DEFAULT_CONTEXT_NAME) - create_topology(clients.context_client, DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME) - create_topology(clients.context_client, DEFAULT_CONTEXT_NAME, INTERDOMAIN_TOPOLOGY_NAME) - - dlt_events_collector = DltEventsCollector(clients.dlt_gateway_client, log_events_received=True) - dlt_events_collector.start() - - while not self._terminate.is_set(): - event = dlt_events_collector.get_event(block=True, timeout=GET_EVENT_TIMEOUT) - if event is None: continue - - existing_topology_ids = clients.context_client.ListTopologyIds(ADMIN_CONTEXT_ID) - local_domain_uuids = { - topology_id.topology_uuid.uuid for topology_id in existing_topology_ids.topology_ids - } - local_domain_uuids.discard(DEFAULT_TOPOLOGY_NAME) - local_domain_uuids.discard(INTERDOMAIN_TOPOLOGY_NAME) - - self.dispatch_event(clients, local_domain_uuids, event) - - dlt_events_collector.stop() - clients.close() - - def dispatch_event(self, clients : Clients, local_domain_uuids : Set[str], event : DltRecordEvent) -> None: - record_type : DltRecordTypeEnum = event.record_id.type # {UNDEFINED/CONTEXT/TOPOLOGY/DEVICE/LINK/SERVICE/SLICE} - if record_type == DltRecordTypeEnum.DLTRECORDTYPE_DEVICE: - self._dispatch_device(clients, local_domain_uuids, event) - elif record_type == DltRecordTypeEnum.DLTRECORDTYPE_LINK: - self._dispatch_link(clients, local_domain_uuids, event) - elif record_type == DltRecordTypeEnum.DLTRECORDTYPE_SLICE: - self._dispatch_slice(clients, local_domain_uuids, event) - else: - raise NotImplementedError('EventType: {:s}'.format(grpc_message_to_json_string(event))) - - def _dispatch_device(self, clients : Clients, local_domain_uuids : Set[str], event : DltRecordEvent) -> None: - domain_uuid : str = event.record_id.domain_uuid.uuid - - if domain_uuid in local_domain_uuids: - MSG = '[_dispatch_device] Ignoring DLT event received (local): {:s}' - LOGGER.info(MSG.format(grpc_message_to_json_string(event))) - return - - MSG = '[_dispatch_device] DLT event received (remote): {:s}' - LOGGER.info(MSG.format(grpc_message_to_json_string(event))) - - event_type : EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} - if event_type in {EventTypeEnum.EVENTTYPE_CREATE, EventTypeEnum.EVENTTYPE_UPDATE}: - LOGGER.info('[_dispatch_device] event.record_id={:s}'.format(grpc_message_to_json_string(event.record_id))) - record = clients.dlt_gateway_client.GetFromDlt(event.record_id) - LOGGER.info('[_dispatch_device] record={:s}'.format(grpc_message_to_json_string(record))) - - create_context(clients.context_client, domain_uuid) - create_topology(clients.context_client, domain_uuid, DEFAULT_TOPOLOGY_NAME) - device = Device(**json.loads(record.data_json)) - clients.context_client.SetDevice(device) - device_uuid = device.device_id.device_uuid.uuid # pylint: disable=no-member - add_device_to_topology(clients.context_client, ADMIN_CONTEXT_ID, INTERDOMAIN_TOPOLOGY_NAME, device_uuid) - domain_context_id = ContextId(**json_context_id(domain_uuid)) - add_device_to_topology(clients.context_client, domain_context_id, DEFAULT_TOPOLOGY_NAME, device_uuid) - elif event_type in {EventTypeEnum.EVENTTYPE_DELETE}: - raise NotImplementedError('Delete Device') - - def _dispatch_link(self, clients : Clients, local_domain_uuids : Set[str], event : DltRecordEvent) -> None: - domain_uuid : str = event.record_id.domain_uuid.uuid - - if domain_uuid in local_domain_uuids: - MSG = '[_dispatch_link] Ignoring DLT event received (local): {:s}' - LOGGER.info(MSG.format(grpc_message_to_json_string(event))) - return - - MSG = '[_dispatch_link] DLT event received (remote): {:s}' - LOGGER.info(MSG.format(grpc_message_to_json_string(event))) - - event_type : EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} - if event_type in {EventTypeEnum.EVENTTYPE_CREATE, EventTypeEnum.EVENTTYPE_UPDATE}: - LOGGER.info('[_dispatch_link] event.record_id={:s}'.format(grpc_message_to_json_string(event.record_id))) - record = clients.dlt_gateway_client.GetFromDlt(event.record_id) - LOGGER.info('[_dispatch_link] record={:s}'.format(grpc_message_to_json_string(record))) - - link = Link(**json.loads(record.data_json)) - clients.context_client.SetLink(link) - link_uuid = link.link_id.link_uuid.uuid # pylint: disable=no-member - add_link_to_topology(clients.context_client, ADMIN_CONTEXT_ID, INTERDOMAIN_TOPOLOGY_NAME, link_uuid) - elif event_type in {EventTypeEnum.EVENTTYPE_DELETE}: - raise NotImplementedError('Delete Link') - - def _dispatch_slice(self, clients : Clients, local_domain_uuids : Set[str], event : DltRecordEvent) -> None: - event_type : EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} - domain_uuid : str = event.record_id.domain_uuid.uuid - - LOGGER.info('[_dispatch_slice] event.record_id={:s}'.format(grpc_message_to_json_string(event.record_id))) - record = clients.dlt_gateway_client.GetFromDlt(event.record_id) - LOGGER.info('[_dispatch_slice] record={:s}'.format(grpc_message_to_json_string(record))) - - slice_ = Slice(**json.loads(record.data_json)) - - context_uuid = slice_.slice_id.context_id.context_uuid.uuid - owner_uuid = slice_.slice_owner.owner_uuid.uuid - create_context(clients.context_client, context_uuid) - create_topology(clients.context_client, context_uuid, DEFAULT_TOPOLOGY_NAME) - - if domain_uuid in local_domain_uuids: - # it is for "me" - if event_type in {EventTypeEnum.EVENTTYPE_CREATE, EventTypeEnum.EVENTTYPE_UPDATE}: - try: - db_slice = clients.context_client.GetSlice(slice_.slice_id) - # exists - db_json_slice = grpc_message_to_json_string(db_slice) - except grpc.RpcError: - # not exists - db_json_slice = None - - _json_slice = grpc_message_to_json_string(slice_) - if db_json_slice != _json_slice: - # not exists or is different... - slice_id = clients.interdomain_client.RequestSlice(slice_) - topology_id = TopologyId(**json_topology_id(domain_uuid)) - dlt_slice_id = DltSliceId() - dlt_slice_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member - dlt_slice_id.slice_id.CopyFrom(slice_id) # pylint: disable=no-member - clients.dlt_connector_client.RecordSlice(dlt_slice_id) - - elif event_type in {EventTypeEnum.EVENTTYPE_DELETE}: - raise NotImplementedError('Delete Slice') - elif owner_uuid in local_domain_uuids: - # it is owned by me - # just update it locally - LOGGER.info('[_dispatch_slice] updating locally') - - local_slice = Slice() - local_slice.CopyFrom(slice_) - - # pylint: disable=no-member - del local_slice.slice_service_ids[:] # they are from remote domains so will not be present locally - del local_slice.slice_subslice_ids[:] # they are from remote domains so will not be present locally - - clients.context_client.SetSlice(local_slice) - else: - MSG = '[_dispatch_slice] Ignoring DLT event received (remote): {:s}' - LOGGER.info(MSG.format(grpc_message_to_json_string(event))) - diff --git a/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py b/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py index 76104e2b7..779bae9c1 100644 --- a/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py +++ b/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py @@ -1,11 +1,23 @@ -import asyncio -import logging -import json +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 grpc, json, logging, threading from typing import Any, Dict, Set from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME from common.proto.context_pb2 import ContextId, Device, EventTypeEnum, Link, Slice, TopologyId from common.proto.dlt_connector_pb2 import DltSliceId -from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordTypeEnum +from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordOperationEnum, DltRecordTypeEnum from common.tools.context_queries.Context import create_context from common.tools.context_queries.Device import add_device_to_topology from common.tools.context_queries.Link import add_link_to_topology @@ -38,30 +50,31 @@ class Clients: self.dlt_connector_client.close() self.context_client.close() -class DltEventDispatcher: +class DltEventDispatcher(threading.Thread): def __init__(self) -> None: LOGGER.debug('Creating connector...') - self._terminate = asyncio.Event() + super().__init__(name='DltEventDispatcher', daemon=True) + self._terminate = threading.Event() LOGGER.debug('Connector created') - async def start(self) -> None: + def start(self) -> None: self._terminate.clear() - await self.run() + return super().start() - async def stop(self): + def stop(self): self._terminate.set() - async def run(self) -> None: + def run(self) -> None: clients = Clients() create_context(clients.context_client, DEFAULT_CONTEXT_NAME) create_topology(clients.context_client, DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME) create_topology(clients.context_client, DEFAULT_CONTEXT_NAME, INTERDOMAIN_TOPOLOGY_NAME) dlt_events_collector = DltEventsCollector(clients.dlt_gateway_client, log_events_received=True) - await dlt_events_collector.run() + dlt_events_collector.start() while not self._terminate.is_set(): - event = await dlt_events_collector.get_event(block=True, timeout=GET_EVENT_TIMEOUT) + event = dlt_events_collector.get_event(block=True, timeout=GET_EVENT_TIMEOUT) if event is None: continue existing_topology_ids = clients.context_client.ListTopologyIds(ADMIN_CONTEXT_ID) @@ -71,24 +84,24 @@ class DltEventDispatcher: local_domain_uuids.discard(DEFAULT_TOPOLOGY_NAME) local_domain_uuids.discard(INTERDOMAIN_TOPOLOGY_NAME) - await self.dispatch_event(clients, local_domain_uuids, event) + self.dispatch_event(clients, local_domain_uuids, event) - await dlt_events_collector.stop() + dlt_events_collector.stop() clients.close() - async def dispatch_event(self, clients: Clients, local_domain_uuids: Set[str], event: DltRecordEvent) -> None: - record_type: DltRecordTypeEnum = event.record_id.type # {UNDEFINED/CONTEXT/TOPOLOGY/DEVICE/LINK/SERVICE/SLICE} + def dispatch_event(self, clients : Clients, local_domain_uuids : Set[str], event : DltRecordEvent) -> None: + record_type : DltRecordTypeEnum = event.record_id.type # {UNDEFINED/CONTEXT/TOPOLOGY/DEVICE/LINK/SERVICE/SLICE} if record_type == DltRecordTypeEnum.DLTRECORDTYPE_DEVICE: - await self._dispatch_device(clients, local_domain_uuids, event) + self._dispatch_device(clients, local_domain_uuids, event) elif record_type == DltRecordTypeEnum.DLTRECORDTYPE_LINK: - await self._dispatch_link(clients, local_domain_uuids, event) + self._dispatch_link(clients, local_domain_uuids, event) elif record_type == DltRecordTypeEnum.DLTRECORDTYPE_SLICE: - await self._dispatch_slice(clients, local_domain_uuids, event) + self._dispatch_slice(clients, local_domain_uuids, event) else: raise NotImplementedError('EventType: {:s}'.format(grpc_message_to_json_string(event))) - async def _dispatch_device(self, clients: Clients, local_domain_uuids: Set[str], event: DltRecordEvent) -> None: - domain_uuid: str = event.record_id.domain_uuid.uuid + def _dispatch_device(self, clients : Clients, local_domain_uuids : Set[str], event : DltRecordEvent) -> None: + domain_uuid : str = event.record_id.domain_uuid.uuid if domain_uuid in local_domain_uuids: MSG = '[_dispatch_device] Ignoring DLT event received (local): {:s}' @@ -98,25 +111,25 @@ class DltEventDispatcher: MSG = '[_dispatch_device] DLT event received (remote): {:s}' LOGGER.info(MSG.format(grpc_message_to_json_string(event))) - event_type: EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} + event_type : EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} if event_type in {EventTypeEnum.EVENTTYPE_CREATE, EventTypeEnum.EVENTTYPE_UPDATE}: LOGGER.info('[_dispatch_device] event.record_id={:s}'.format(grpc_message_to_json_string(event.record_id))) - record = await clients.dlt_gateway_client.GetFromDlt(event.record_id) + record = clients.dlt_gateway_client.GetFromDlt(event.record_id) LOGGER.info('[_dispatch_device] record={:s}'.format(grpc_message_to_json_string(record))) create_context(clients.context_client, domain_uuid) create_topology(clients.context_client, domain_uuid, DEFAULT_TOPOLOGY_NAME) device = Device(**json.loads(record.data_json)) clients.context_client.SetDevice(device) - device_uuid = device.device_id.device_uuid.uuid # pylint: disable=no-member + device_uuid = device.device_id.device_uuid.uuid # pylint: disable=no-member add_device_to_topology(clients.context_client, ADMIN_CONTEXT_ID, INTERDOMAIN_TOPOLOGY_NAME, device_uuid) domain_context_id = ContextId(**json_context_id(domain_uuid)) add_device_to_topology(clients.context_client, domain_context_id, DEFAULT_TOPOLOGY_NAME, device_uuid) elif event_type in {EventTypeEnum.EVENTTYPE_DELETE}: raise NotImplementedError('Delete Device') - async def _dispatch_link(self, clients: Clients, local_domain_uuids: Set[str], event: DltRecordEvent) -> None: - domain_uuid: str = event.record_id.domain_uuid.uuid + def _dispatch_link(self, clients : Clients, local_domain_uuids : Set[str], event : DltRecordEvent) -> None: + domain_uuid : str = event.record_id.domain_uuid.uuid if domain_uuid in local_domain_uuids: MSG = '[_dispatch_link] Ignoring DLT event received (local): {:s}' @@ -126,25 +139,25 @@ class DltEventDispatcher: MSG = '[_dispatch_link] DLT event received (remote): {:s}' LOGGER.info(MSG.format(grpc_message_to_json_string(event))) - event_type: EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} + event_type : EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} if event_type in {EventTypeEnum.EVENTTYPE_CREATE, EventTypeEnum.EVENTTYPE_UPDATE}: LOGGER.info('[_dispatch_link] event.record_id={:s}'.format(grpc_message_to_json_string(event.record_id))) - record = await clients.dlt_gateway_client.GetFromDlt(event.record_id) + record = clients.dlt_gateway_client.GetFromDlt(event.record_id) LOGGER.info('[_dispatch_link] record={:s}'.format(grpc_message_to_json_string(record))) link = Link(**json.loads(record.data_json)) clients.context_client.SetLink(link) - link_uuid = link.link_id.link_uuid.uuid # pylint: disable=no-member + link_uuid = link.link_id.link_uuid.uuid # pylint: disable=no-member add_link_to_topology(clients.context_client, ADMIN_CONTEXT_ID, INTERDOMAIN_TOPOLOGY_NAME, link_uuid) elif event_type in {EventTypeEnum.EVENTTYPE_DELETE}: raise NotImplementedError('Delete Link') - async def _dispatch_slice(self, clients: Clients, local_domain_uuids: Set[str], event: DltRecordEvent) -> None: - event_type: EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} - domain_uuid: str = event.record_id.domain_uuid.uuid + def _dispatch_slice(self, clients : Clients, local_domain_uuids : Set[str], event : DltRecordEvent) -> None: + event_type : EventTypeEnum = event.event.event_type # {UNDEFINED/CREATE/UPDATE/REMOVE} + domain_uuid : str = event.record_id.domain_uuid.uuid LOGGER.info('[_dispatch_slice] event.record_id={:s}'.format(grpc_message_to_json_string(event.record_id))) - record = await clients.dlt_gateway_client.GetFromDlt(event.record_id) + record = clients.dlt_gateway_client.GetFromDlt(event.record_id) LOGGER.info('[_dispatch_slice] record={:s}'.format(grpc_message_to_json_string(record))) slice_ = Slice(**json.loads(record.data_json)) @@ -172,7 +185,7 @@ class DltEventDispatcher: topology_id = TopologyId(**json_topology_id(domain_uuid)) dlt_slice_id = DltSliceId() dlt_slice_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member - dlt_slice_id.slice_id.CopyFrom(slice_id) # pylint: disable=no-member + dlt_slice_id.slice_id.CopyFrom(slice_id) # pylint: disable=no-member clients.dlt_connector_client.RecordSlice(dlt_slice_id) elif event_type in {EventTypeEnum.EVENTTYPE_DELETE}: @@ -186,10 +199,11 @@ class DltEventDispatcher: local_slice.CopyFrom(slice_) # pylint: disable=no-member - del local_slice.slice_service_ids[:] # they are from remote domains so will not be present locally - del local_slice.slice_subslice_ids[:] # they are from remote domains so will not be present locally + del local_slice.slice_service_ids[:] # they are from remote domains so will not be present locally + del local_slice.slice_subslice_ids[:] # they are from remote domains so will not be present locally clients.context_client.SetSlice(local_slice) else: MSG = '[_dispatch_slice] Ignoring DLT event received (remote): {:s}' LOGGER.info(MSG.format(grpc_message_to_json_string(event))) + diff --git a/src/interdomain/service/__main__.py b/src/interdomain/service/__main__.py index 3f5ccd183..8c392821e 100644 --- a/src/interdomain/service/__main__.py +++ b/src/interdomain/service/__main__.py @@ -13,8 +13,6 @@ # limitations under the License. import logging, signal, sys, threading -import asyncio - from prometheus_client import start_http_server from common.Constants import ServiceNameEnum from common.Settings import ( @@ -29,12 +27,6 @@ from .RemoteDomainClients import RemoteDomainClients terminate = threading.Event() LOGGER : logging.Logger = None - -async def run_dlt_recorder(dlt_recorder): - await dlt_recorder.start() - await terminate.wait() - await dlt_recorder.stop() - def signal_handler(signal, frame): # pylint: disable=redefined-outer-name LOGGER.warning('Terminate signal received') terminate.set() @@ -84,9 +76,7 @@ def main(): if dlt_enabled: LOGGER.info('Starting DLT functionality...') dlt_recorder = DLTRecorder() - #dlt_recorder.start() - loop = asyncio.get_event_loop() - loop.run_until_complete(run_dlt_recorder(dlt_recorder)) + dlt_recorder.start() # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=1.0): pass @@ -95,9 +85,7 @@ def main(): # if topology_abstractor_enabled: # topology_abstractor.stop() if dlt_enabled: - #dlt_recorder.stop() - loop.run_until_complete(dlt_recorder.stop()) - loop.close() + dlt_recorder.stop() grpc_service.stop() remote_domain_clients.stop() diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index c17878e0e..cfa51c928 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -62,7 +62,7 @@ class DltRecordSender: record_uuid = '{:s}:slice:{:s}/{:s}'.format(topology_uuid, context_uuid, slice_uuid) self._add_record(record_uuid, (topology_id, slice_)) - async def commit(self) -> None: + def commit(self) -> None: for dlt_record_uuid in self.dlt_record_uuids: topology_id,dlt_record = self.dlt_record_uuid_to_data[dlt_record_uuid] if isinstance(dlt_record, Device): @@ -73,7 +73,7 @@ class DltRecordSender: dlt_device_id = DltDeviceId() dlt_device_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member dlt_device_id.device_id.CopyFrom(device_id) # pylint: disable=no-member - await self.dlt_connector_client.RecordDevice(dlt_device_id) + self.dlt_connector_client.RecordDevice(dlt_device_id) elif isinstance(dlt_record, Link): #link_id = self.context_client.SetLink(dlt_record) link_id = dlt_record.link_id @@ -81,7 +81,7 @@ class DltRecordSender: dlt_link_id = DltLinkId() dlt_link_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member dlt_link_id.link_id.CopyFrom(link_id) # pylint: disable=no-member - await self.dlt_connector_client.RecordLink(dlt_link_id) + self.dlt_connector_client.RecordLink(dlt_link_id) elif isinstance(dlt_record, Service): #service_id = self.context_client.SetService(dlt_record) service_id = dlt_record.service_id @@ -89,7 +89,7 @@ class DltRecordSender: dlt_service_id = DltServiceId() dlt_service_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member dlt_service_id.service_id.CopyFrom(service_id) # pylint: disable=no-member - await self.dlt_connector_client.RecordService(dlt_service_id) + self.dlt_connector_client.RecordService(dlt_service_id) elif isinstance(dlt_record, Slice): #slice_id = self.context_client.SetSlice(dlt_record) slice_id = dlt_record.slice_id @@ -97,6 +97,6 @@ class DltRecordSender: dlt_slice_id = DltSliceId() dlt_slice_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member dlt_slice_id.slice_id.CopyFrom(slice_id) # pylint: disable=no-member - await self.dlt_connector_client.RecordSlice(dlt_slice_id) + self.dlt_connector_client.RecordSlice(dlt_slice_id) else: LOGGER.error('Unsupported Record({:s})'.format(str(dlt_record))) diff --git a/src/interdomain/service/topology_abstractor/DltRecorder copy.py b/src/interdomain/service/topology_abstractor/DltRecorder copy.py deleted file mode 100644 index 0e94159c4..000000000 --- a/src/interdomain/service/topology_abstractor/DltRecorder copy.py +++ /dev/null @@ -1,166 +0,0 @@ -import logging -import threading -from typing import Dict, Optional - -from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum -from common.Settings import ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_environment_variables, get_env_var_name -from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, DeviceId, EndPointId, Link, LinkId, LinkEvent, TopologyId, TopologyEvent -from common.tools.context_queries.Context import create_context -from common.tools.context_queries.Device import get_uuids_of_devices_in_topology -from common.tools.context_queries.Topology import create_missing_topologies -from common.tools.grpc.Tools import grpc_message_to_json_string -from common.tools.object_factory.Context import json_context_id -from common.tools.object_factory.Device import json_device_id -from common.tools.object_factory.Topology import json_topology_id -from context.client.ContextClient import ContextClient -from context.client.EventsCollector import EventsCollector -from dlt.connector.client.DltConnectorClient import DltConnectorClient -from .DltRecordSender import DltRecordSender -from .Types import EventTypes - -LOGGER = logging.getLogger(__name__) -LOGGER.setLevel(logging.DEBUG) - -ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) -INTERDOMAIN_TOPOLOGY_ID = TopologyId(**json_topology_id(INTERDOMAIN_TOPOLOGY_NAME, context_id=ADMIN_CONTEXT_ID)) - - -class DLTRecorder(threading.Thread): - def __init__(self) -> None: - super().__init__(daemon=True) - self.terminate = threading.Event() - self.context_client = ContextClient() - self.context_event_collector = EventsCollector(self.context_client) - self.topology_cache: Dict[str, TopologyId] = {} - - def stop(self): - self.terminate.set() - - def run(self) -> None: - self.context_client.connect() - create_context(self.context_client, DEFAULT_CONTEXT_NAME) - self.create_topologies() - self.context_event_collector.start() - - while not self.terminate.is_set(): - event = self.context_event_collector.get_event(timeout=0.1) - if event is None: - continue - LOGGER.info('Processing Event({:s})...'.format(grpc_message_to_json_string(event))) - self.update_record(event) - - self.context_event_collector.stop() - self.context_client.close() - - def create_topologies(self): - topology_uuids = [DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME] - create_missing_topologies(self.context_client, ADMIN_CONTEXT_ID, topology_uuids) - - def get_dlt_connector_client(self) -> Optional[DltConnectorClient]: - # Always enable DLT for testing - dlt_connector_client = DltConnectorClient() - dlt_connector_client.connect() - return dlt_connector_client - # env_vars = find_environment_variables([ - # get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_HOST), - # get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), - # ]) - # if len(env_vars) == 2: - # dlt_connector_client = DltConnectorClient() - # dlt_connector_client.connect() - # return dlt_connector_client - # return None - - def update_record(self, event: EventTypes) -> None: - dlt_connector_client = self.get_dlt_connector_client() - dlt_record_sender = DltRecordSender(self.context_client, dlt_connector_client) - - if isinstance(event, ContextEvent): - LOGGER.debug('Processing ContextEvent({:s})'.format(grpc_message_to_json_string(event))) - LOGGER.warning('Ignoring ContextEvent({:s})'.format(grpc_message_to_json_string(event))) - - elif isinstance(event, TopologyEvent): - LOGGER.debug('Processing TopologyEvent({:s})'.format(grpc_message_to_json_string(event))) - self.process_topology_event(event, dlt_record_sender) - - elif isinstance(event, DeviceEvent): - LOGGER.debug('Processing DeviceEvent({:s})'.format(grpc_message_to_json_string(event))) - self.process_device_event(event, dlt_record_sender) - - elif isinstance(event, LinkEvent): - LOGGER.debug('Processing LinkEvent({:s})'.format(grpc_message_to_json_string(event))) - self.process_link_event(event, dlt_record_sender) - - else: - LOGGER.warning('Unsupported Event({:s})'.format(grpc_message_to_json_string(event))) - - dlt_record_sender.commit() - if dlt_connector_client is not None: - dlt_connector_client.close() - - def process_topology_event(self, event: TopologyEvent, dlt_record_sender: DltRecordSender) -> None: - topology_id = event.topology_id - topology_uuid = topology_id.topology_uuid.uuid - context_id = topology_id.context_id - context_uuid = context_id.context_uuid.uuid - topology_uuids = {DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME} - - context = self.context_client.GetContext(context_id) - context_name = context.name - - topology_details = self.context_client.GetTopologyDetails(topology_id) - topology_name = topology_details.name - - self.topology_cache[topology_uuid] = topology_id - - LOGGER.debug('TOPOLOGY Details({:s})'.format(grpc_message_to_json_string(topology_details))) - - if ((context_uuid == DEFAULT_CONTEXT_NAME) or (context_name == DEFAULT_CONTEXT_NAME)) and \ - (topology_uuid not in topology_uuids) and (topology_name not in topology_uuids): - for device in topology_details.devices: - LOGGER.debug('DEVICE_INFO_TOPO({:s})'.format(grpc_message_to_json_string(device))) - dlt_record_sender.add_device(topology_id, device) - - for link in topology_details.links: - dlt_record_sender.add_link(topology_id, link) - - else: - MSG = 'Ignoring ({:s}/{:s})({:s}/{:s}) TopologyEvent({:s})' - args = context_uuid, context_name, topology_uuid, topology_name, grpc_message_to_json_string(event) - LOGGER.warning(MSG.format(*args)) - - def find_topology_for_device(self, device_id: DeviceId) -> Optional[TopologyId]: - for topology_uuid, topology_id in self.topology_cache.items(): - details = self.context_client.GetTopologyDetails(topology_id) - for device in details.devices: - if device.device_id == device_id: - return topology_id - return None - - def find_topology_for_link(self, link_id: LinkId) -> Optional[TopologyId]: - for topology_uuid, topology_id in self.topology_cache.items(): - details = self.context_client.GetTopologyDetails(topology_id) - for link in details.links: - if link.link_id == link_id: - return topology_id - return None - - def process_device_event(self, event: DeviceEvent, dlt_record_sender: DltRecordSender) -> None: - device_id = event.device_id - device = self.context_client.GetDevice(device_id) - topology_id = self.find_topology_for_device(device_id) - if topology_id: - LOGGER.debug('DEVICE_INFO({:s}), DEVICE_ID ({:s})'.format(str(device.device_id.device_uuid.uuid), grpc_message_to_json_string(device_id))) - - dlt_record_sender.add_device(topology_id, device) - else: - LOGGER.warning(f"Topology not found for device {device_id.device_uuid.uuid}") - - def process_link_event(self, event: LinkEvent, dlt_record_sender: DltRecordSender) -> None: - link_id = event.link_id - link = self.context_client.GetLink(link_id) - topology_id = self.find_topology_for_link(link_id) - if topology_id: - dlt_record_sender.add_link(topology_id, link) - else: - LOGGER.warning(f"Topology not found for link {link_id.link_uuid.uuid}") diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index 9ed1aa750..0e94159c4 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -1,12 +1,10 @@ -# DltRecorder.py - import logging -import asyncio +import threading from typing import Dict, Optional from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum from common.Settings import ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_environment_variables, get_env_var_name -from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceId, DeviceEvent, EndPointId, Link, LinkId, LinkEvent, TopologyId, TopologyEvent +from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, DeviceId, EndPointId, Link, LinkId, LinkEvent, TopologyId, TopologyEvent from common.tools.context_queries.Context import create_context from common.tools.context_queries.Device import get_uuids_of_devices_in_topology from common.tools.context_queries.Topology import create_missing_topologies @@ -27,47 +25,54 @@ ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) INTERDOMAIN_TOPOLOGY_ID = TopologyId(**json_topology_id(INTERDOMAIN_TOPOLOGY_NAME, context_id=ADMIN_CONTEXT_ID)) -class DLTRecorder: +class DLTRecorder(threading.Thread): def __init__(self) -> None: - self.terminate_event = asyncio.Event() + super().__init__(daemon=True) + self.terminate = threading.Event() self.context_client = ContextClient() self.context_event_collector = EventsCollector(self.context_client) self.topology_cache: Dict[str, TopologyId] = {} - async def stop(self): - self.terminate_event.set() - - async def start(self) -> None: - await self.run() + def stop(self): + self.terminate.set() - async def run(self) -> None: - await self.context_client.connect() + def run(self) -> None: + self.context_client.connect() create_context(self.context_client, DEFAULT_CONTEXT_NAME) self.create_topologies() - await self.context_event_collector.start() + self.context_event_collector.start() - while not self.terminate_event.is_set(): - event = await self.context_event_collector.get_event(timeout=0.1) + while not self.terminate.is_set(): + event = self.context_event_collector.get_event(timeout=0.1) if event is None: continue LOGGER.info('Processing Event({:s})...'.format(grpc_message_to_json_string(event))) - await self.update_record(event) + self.update_record(event) - await self.context_event_collector.stop() - await self.context_client.close() + self.context_event_collector.stop() + self.context_client.close() def create_topologies(self): topology_uuids = [DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME] create_missing_topologies(self.context_client, ADMIN_CONTEXT_ID, topology_uuids) - async def get_dlt_connector_client(self) -> Optional[DltConnectorClient]: + def get_dlt_connector_client(self) -> Optional[DltConnectorClient]: # Always enable DLT for testing dlt_connector_client = DltConnectorClient() - await dlt_connector_client.connect() + dlt_connector_client.connect() return dlt_connector_client - - async def update_record(self, event: EventTypes) -> None: - dlt_connector_client = await self.get_dlt_connector_client() + # env_vars = find_environment_variables([ + # get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_HOST), + # get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), + # ]) + # if len(env_vars) == 2: + # dlt_connector_client = DltConnectorClient() + # dlt_connector_client.connect() + # return dlt_connector_client + # return None + + def update_record(self, event: EventTypes) -> None: + dlt_connector_client = self.get_dlt_connector_client() dlt_record_sender = DltRecordSender(self.context_client, dlt_connector_client) if isinstance(event, ContextEvent): @@ -76,34 +81,34 @@ class DLTRecorder: elif isinstance(event, TopologyEvent): LOGGER.debug('Processing TopologyEvent({:s})'.format(grpc_message_to_json_string(event))) - await self.process_topology_event(event, dlt_record_sender) + self.process_topology_event(event, dlt_record_sender) elif isinstance(event, DeviceEvent): LOGGER.debug('Processing DeviceEvent({:s})'.format(grpc_message_to_json_string(event))) - await self.process_device_event(event, dlt_record_sender) + self.process_device_event(event, dlt_record_sender) elif isinstance(event, LinkEvent): LOGGER.debug('Processing LinkEvent({:s})'.format(grpc_message_to_json_string(event))) - await self.process_link_event(event, dlt_record_sender) + self.process_link_event(event, dlt_record_sender) else: LOGGER.warning('Unsupported Event({:s})'.format(grpc_message_to_json_string(event))) - await dlt_record_sender.commit() + dlt_record_sender.commit() if dlt_connector_client is not None: - await dlt_connector_client.close() + dlt_connector_client.close() - async def process_topology_event(self, event: TopologyEvent, dlt_record_sender: DltRecordSender) -> None: + def process_topology_event(self, event: TopologyEvent, dlt_record_sender: DltRecordSender) -> None: topology_id = event.topology_id topology_uuid = topology_id.topology_uuid.uuid context_id = topology_id.context_id context_uuid = context_id.context_uuid.uuid topology_uuids = {DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME} - context = await self.context_client.GetContext(context_id) + context = self.context_client.GetContext(context_id) context_name = context.name - topology_details = await self.context_client.GetTopologyDetails(topology_id) + topology_details = self.context_client.GetTopologyDetails(topology_id) topology_name = topology_details.name self.topology_cache[topology_uuid] = topology_id @@ -124,26 +129,26 @@ class DLTRecorder: args = context_uuid, context_name, topology_uuid, topology_name, grpc_message_to_json_string(event) LOGGER.warning(MSG.format(*args)) - async def find_topology_for_device(self, device_id: DeviceId) -> Optional[TopologyId]: + def find_topology_for_device(self, device_id: DeviceId) -> Optional[TopologyId]: for topology_uuid, topology_id in self.topology_cache.items(): - details = await self.context_client.GetTopologyDetails(topology_id) + details = self.context_client.GetTopologyDetails(topology_id) for device in details.devices: if device.device_id == device_id: return topology_id return None - async def find_topology_for_link(self, link_id: LinkId) -> Optional[TopologyId]: + def find_topology_for_link(self, link_id: LinkId) -> Optional[TopologyId]: for topology_uuid, topology_id in self.topology_cache.items(): - details = await self.context_client.GetTopologyDetails(topology_id) + details = self.context_client.GetTopologyDetails(topology_id) for link in details.links: if link.link_id == link_id: return topology_id return None - async def process_device_event(self, event: DeviceEvent, dlt_record_sender: DltRecordSender) -> None: + def process_device_event(self, event: DeviceEvent, dlt_record_sender: DltRecordSender) -> None: device_id = event.device_id - device = await self.context_client.GetDevice(device_id) - topology_id = await self.find_topology_for_device(device_id) + device = self.context_client.GetDevice(device_id) + topology_id = self.find_topology_for_device(device_id) if topology_id: LOGGER.debug('DEVICE_INFO({:s}), DEVICE_ID ({:s})'.format(str(device.device_id.device_uuid.uuid), grpc_message_to_json_string(device_id))) @@ -151,10 +156,10 @@ class DLTRecorder: else: LOGGER.warning(f"Topology not found for device {device_id.device_uuid.uuid}") - async def process_link_event(self, event: LinkEvent, dlt_record_sender: DltRecordSender) -> None: + def process_link_event(self, event: LinkEvent, dlt_record_sender: DltRecordSender) -> None: link_id = event.link_id - link = await self.context_client.GetLink(link_id) - topology_id = await self.find_topology_for_link(link_id) + link = self.context_client.GetLink(link_id) + topology_id = self.find_topology_for_link(link_id) if topology_id: dlt_record_sender.add_link(topology_id, link) else: -- GitLab From 0190accb0e4b575d0d019c84fc27d9391a97d014 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 29 Jul 2024 13:32:00 +0000 Subject: [PATCH 433/602] To resolve the "test_GetKpiDescriptor" test fail issue. - Test was failing due to a "NotFoundException." - Replaced with None and made approriate changes in files (Kpi_DB.py and KpiManagerServiceImpl) to handle the None value. --- src/kpi_manager/database/Kpi_DB.py | 5 +++-- src/kpi_manager/service/KpiManagerServiceServicerImpl.py | 9 +++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/kpi_manager/database/Kpi_DB.py b/src/kpi_manager/database/Kpi_DB.py index dcd28489b..4b6064070 100644 --- a/src/kpi_manager/database/Kpi_DB.py +++ b/src/kpi_manager/database/Kpi_DB.py @@ -85,8 +85,9 @@ class KpiDB: # LOGGER.debug(f"{model.__name__} ID found: {str(entity)}") return entity else: - LOGGER.debug(f"{model.__name__} ID not found: {str(id_to_search)}") - raise NotFoundException (model.__name__, id_to_search, extra_details=["Row not found with ID"] ) + LOGGER.debug(f"{model.__name__} ID not found, No matching row: {str(id_to_search)}") + print("{:} ID not found, No matching row: {:}".format(model.__name__, id_to_search)) + return None except Exception as e: session.rollback() LOGGER.debug(f"Failed to retrieve {model.__name__} ID. {str(e)}") diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py index bea2c78b4..fd2247482 100644 --- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -52,8 +52,13 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): try: kpi_id_to_search = request.kpi_id.uuid row = self.kpi_db_obj.search_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search) - response = KpiModel.convert_row_to_KpiDescriptor(row) - return response + if row is None: + print ('No matching row found for kpi id: {:}'.format(kpi_id_to_search)) + LOGGER.info('No matching row found kpi id: {:}'.format(kpi_id_to_search)) + return Empty() + else: + response = KpiModel.convert_row_to_KpiDescriptor(row) + return response except Exception as e: print ('Unable to search kpi id. {:}'.format(e)) LOGGER.info('Unable to search kpi id. {:}'.format(e)) -- GitLab From 56ebd5dc725502862611b66e06f5fe33f3d57a20 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 09:45:49 +0000 Subject: [PATCH 434/602] Foreced changes in KpiValueWriter to handle gRPC empty return message. --- src/kpi_value_writer/service/KpiValueWriter.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index 26bab4465..022126fd0 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -33,7 +33,6 @@ from .MetricWriterToPrometheus import MetricWriterToPrometheus LOGGER = logging.getLogger(__name__) ACTIVE_CONSUMERS = [] -METRIC_WRITER = MetricWriterToPrometheus() class KpiValueWriter(GenericGrpcService): def __init__(self, cls_name : str = __name__) -> None: @@ -48,12 +47,14 @@ class KpiValueWriter(GenericGrpcService): @staticmethod def KafkaConsumer(): + kpi_manager_client = KpiManagerClient() + metric_writer = MetricWriterToPrometheus() + kafka_consumer = KafkaConsumer( { 'bootstrap.servers' : KafkaConfig.SERVER_IP.value, 'group.id' : __class__, 'auto.offset.reset' : 'latest'} - ) - kpi_manager_client = KpiManagerClient() + ) kafka_consumer.subscribe([KafkaTopic.VALUE.value]) LOGGER.debug("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) print("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) @@ -72,13 +73,13 @@ class KpiValueWriter(GenericGrpcService): kpi_value.ParseFromString(raw_kpi.value()) LOGGER.info("Received KPI : {:}".format(kpi_value)) print("Received KPI : {:}".format(kpi_value)) - KpiValueWriter.get_kpi_descriptor(kpi_value, kpi_manager_client) + KpiValueWriter.get_kpi_descriptor(kpi_value, kpi_manager_client, metric_writer) except Exception as e: print("Error detail: {:}".format(e)) continue @staticmethod - def get_kpi_descriptor(kpi_value: str, kpi_manager_client ): + def get_kpi_descriptor(kpi_value: str, kpi_manager_client, metric_writer): print("--- START -----") kpi_id = KpiId() @@ -89,12 +90,11 @@ class KpiValueWriter(GenericGrpcService): try: kpi_descriptor_object = KpiDescriptor() kpi_descriptor_object = kpi_manager_client.GetKpiDescriptor(kpi_id) + # TODO: why kpi_descriptor_object recevies a KpiDescriptor type object not Empty type object??? if kpi_descriptor_object.kpi_id.kpi_id.uuid == kpi_id.kpi_id.uuid: - # print("kpi descriptor received: {:}".format(kpi_descriptor_object)) - # if isinstance (kpi_descriptor_object, KpiDescriptor): LOGGER.info("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) print("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) - METRIC_WRITER.create_and_expose_cooked_kpi(kpi_descriptor_object, kpi_value) + metric_writer.create_and_expose_cooked_kpi(kpi_descriptor_object, kpi_value) else: LOGGER.info("No KPI Descriptor found in DB for Kpi ID: {:}".format(kpi_id)) print("No KPI Descriptor found in DB for Kpi ID: {:}".format(kpi_id)) -- GitLab From 13ab01f8581f3bd7fcbaeb65c2867a6a1cc675e8 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 09:55:51 +0000 Subject: [PATCH 435/602] updated imports to resolve error generated by unit test. - Imports are updated in test_kpi_value_writer.py --- src/kpi_value_writer/tests/test_kpi_value_writer.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/kpi_value_writer/tests/test_kpi_value_writer.py b/src/kpi_value_writer/tests/test_kpi_value_writer.py index 572495d48..40593af97 100755 --- a/src/kpi_value_writer/tests/test_kpi_value_writer.py +++ b/src/kpi_value_writer/tests/test_kpi_value_writer.py @@ -14,11 +14,12 @@ import logging from kpi_value_writer.service.KpiValueWriter import KpiValueWriter +from kpi_value_writer.tests.test_messages import create_kpi_id_request, create_kpi_descriptor_request + from common.tools.kafka.Variables import KafkaTopic -from kpi_manager.client.KpiManagerClient import KpiManagerClient -from kpi_manager.tests.test_messages import create_kpi_descriptor_request from common.proto.kpi_manager_pb2 import KpiDescriptor -from kpi_value_writer.tests.test_messages import create_kpi_id_request +from kpi_manager.client.KpiManagerClient import KpiManagerClient + LOGGER = logging.getLogger(__name__) -- GitLab From ecea8dac36976bb7c7ce0ec656637e1edf5fc66e Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 14:14:18 +0000 Subject: [PATCH 436/602] Kafka deployment script is integrated with TFS deplyment script. - Kafka env variables are created in my_deply.sh, kafka.sh and all.sh --- deploy/all.sh | 3 ++ deploy/kafka.sh | 83 ++++++++++++++++++++++++++++++------------------- deploy/tfs.sh | 20 +++++++++++- 3 files changed, 73 insertions(+), 33 deletions(-) diff --git a/deploy/all.sh b/deploy/all.sh index f93cd92ac..e9b33b469 100755 --- a/deploy/all.sh +++ b/deploy/all.sh @@ -215,6 +215,9 @@ export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"} # Deploy QuestDB ./deploy/qdb.sh +# Deploy Apache Kafka +./deploy/kafka.sh + # Expose Dashboard ./deploy/expose_dashboard.sh diff --git a/deploy/kafka.sh b/deploy/kafka.sh index 4a91bfc9e..b2f2f1f9e 100755 --- a/deploy/kafka.sh +++ b/deploy/kafka.sh @@ -20,50 +20,69 @@ # If not already set, set the namespace where Apache Kafka will be deployed. export KFK_NAMESPACE=${KFK_NAMESPACE:-"kafka"} +# If not already set, set the port Apache Kafka server will be exposed to. +export KFK_SERVER_PORT=${KFK_SERVER_PORT:-"9092"} + +# If not already set, if flag is YES, Apache Kafka will be redeployed and all topics will be lost. +export KFK_REDEPLOY=${KFK_REDEPLOY:-""} + ######################################################################################################################## # Automated steps start here ######################################################################################################################## -# Constants -TMP_FOLDER="./tmp" -KFK_MANIFESTS_PATH="manifests/kafka" -KFK_ZOOKEEPER_MANIFEST="01-zookeeper.yaml" -KFK_MANIFEST="02-kafka.yaml" + # Constants + TMP_FOLDER="./tmp" + KFK_MANIFESTS_PATH="manifests/kafka" + KFK_ZOOKEEPER_MANIFEST="01-zookeeper.yaml" + KFK_MANIFEST="02-kafka.yaml" + + # Create a tmp folder for files modified during the deployment + TMP_MANIFESTS_FOLDER="${TMP_FOLDER}/${KFK_NAMESPACE}/manifests" + mkdir -p ${TMP_MANIFESTS_FOLDER} -# Create a tmp folder for files modified during the deployment -TMP_MANIFESTS_FOLDER="${TMP_FOLDER}/${KFK_NAMESPACE}/manifests" -mkdir -p ${TMP_MANIFESTS_FOLDER} +function kafka_deploy() { + # copy zookeeper and kafka manifest files to temporary manifest location + cp "${KFK_MANIFESTS_PATH}/${KFK_ZOOKEEPER_MANIFEST}" "${TMP_MANIFESTS_FOLDER}/${KFK_ZOOKEEPER_MANIFEST}" + cp "${KFK_MANIFESTS_PATH}/${KFK_MANIFEST}" "${TMP_MANIFESTS_FOLDER}/${KFK_MANIFEST}" -# copy zookeeper and kafka manifest files to temporary manifest location -cp "${KFK_MANIFESTS_PATH}/${KFK_ZOOKEEPER_MANIFEST}" "${TMP_MANIFESTS_FOLDER}/${KFK_ZOOKEEPER_MANIFEST}" -cp "${KFK_MANIFESTS_PATH}/${KFK_MANIFEST}" "${TMP_MANIFESTS_FOLDER}/${KFK_MANIFEST}" + # echo "Apache Kafka Namespace" + echo ">>> Delete Apache Kafka Namespace" + kubectl delete namespace ${KFK_NAMESPACE} --ignore-not-found -echo "Apache Kafka Namespace" -echo ">>> Delete Apache Kafka Namespace" -kubectl delete namespace ${KFK_NAMESPACE} --ignore-not-found + echo ">>> Create Apache Kafka Namespace" + kubectl create namespace ${KFK_NAMESPACE} -echo ">>> Create Apache Kafka Namespace" -kubectl create namespace ${KFK_NAMESPACE} + # echo ">>> Deplying Apache Kafka Zookeeper" + # Kafka zookeeper service should be deployed before the kafka service + kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/${KFK_ZOOKEEPER_MANIFEST}" -echo ">>> Deplying Apache Kafka Zookeeper" -# Kafka zookeeper service should be deployed before the kafka service -kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/${KFK_ZOOKEEPER_MANIFEST}" + KFK_ZOOKEEPER_SERVICE="zookeeper-service" # this command may be replaced with command to extract service name automatically + KFK_ZOOKEEPER_IP=$(kubectl --namespace ${KFK_NAMESPACE} get service ${KFK_ZOOKEEPER_SERVICE} -o 'jsonpath={.spec.clusterIP}') -KFK_ZOOKEEPER_SERVICE="zookeeper-service" # this command may be replaced with command to extract service name automatically -KFK_ZOOKEEPER_IP=$(kubectl --namespace ${KFK_NAMESPACE} get service ${KFK_ZOOKEEPER_SERVICE} -o 'jsonpath={.spec.clusterIP}') + # Kafka service should be deployed after the zookeeper service + sed -i "s//${KFK_ZOOKEEPER_IP}/" "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST" -# Kafka service should be deployed after the zookeeper service -sed -i "s//${KFK_ZOOKEEPER_IP}/" "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST" + # echo ">>> Deploying Apache Kafka Broker" + kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST" -echo ">>> Deploying Apache Kafka Broker" -kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST" + # echo ">>> Verifing Apache Kafka deployment" + sleep 5 + # KFK_PODS_STATUS=$(kubectl --namespace ${KFK_NAMESPACE} get pods) + # if echo "$KFK_PODS_STATUS" | grep -qEv 'STATUS|Running'; then + # echo "Deployment Error: \n $KFK_PODS_STATUS" + # else + # echo "$KFK_PODS_STATUS" + # fi +} -echo ">>> Verifing Apache Kafka deployment" -sleep 10 -KFK_PODS_STATUS=$(kubectl --namespace ${KFK_NAMESPACE} get pods) -if echo "$KFK_PODS_STATUS" | grep -qEv 'STATUS|Running'; then - echo "Deployment Error: \n $KFK_PODS_STATUS" +echo "Apache Kafka" +echo ">>> Checking if Apache Kafka is deployed ... " +if [ "$KFK_REDEPLOY" == "YES" ]; then + kafka_deploy +elif kubectl get --namespace ${KFK_NAMESPACE} deployments.apps &> /dev/null; then + echo ">>> Apache Kafka already present; skipping step..." else - echo "$KFK_PODS_STATUS" -fi \ No newline at end of file + kafka_deploy +fi +echo diff --git a/deploy/tfs.sh b/deploy/tfs.sh index 62f36a2c1..d92d789e3 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -115,6 +115,17 @@ export PROM_EXT_PORT_HTTP=${PROM_EXT_PORT_HTTP:-"9090"} export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"} +# ----- Apache Kafka ------------------------------------------------------ + +# If not already set, set the namespace where Apache Kafka will be deployed. +export KFK_NAMESPACE=${KFK_NAMESPACE:-"kafka"} + +# If not already set, set the port Apache Kafka server will be exposed to. +export KFK_SERVER_PORT=${KFK_SERVER_PORT:-"9092"} + +# If not already set, if flag is YES, Apache Kafka will be redeployed and topic will be lost. +export KFK_REDEPLOY=${KFK_REDEPLOY:-""} + ######################################################################################################################## # Automated steps start here ######################################################################################################################## @@ -147,7 +158,7 @@ kubectl create secret generic crdb-data --namespace ${TFS_K8S_NAMESPACE} --type= --from-literal=CRDB_SSLMODE=require printf "\n" -echo "Create secret with CockroachDB data for KPI Management" +echo "Create secret with CockroachDB data for KPI Management microservices" CRDB_SQL_PORT=$(kubectl --namespace ${CRDB_NAMESPACE} get service cockroachdb-public -o 'jsonpath={.spec.ports[?(@.name=="sql")].port}') CRDB_DATABASE_KPI_MGMT="tfs_kpi_mgmt" # TODO: change by specific configurable environment variable kubectl create secret generic crdb-kpi-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ @@ -159,6 +170,13 @@ kubectl create secret generic crdb-kpi-data --namespace ${TFS_K8S_NAMESPACE} --t --from-literal=CRDB_SSLMODE=require printf "\n" +echo "Create secret with Apache Kafka kfk-kpi-data for KPI and Telemetry microservices" +KFK_SERVER_PORT=$(kubectl --namespace ${KFK_NAMESPACE} get service kafka-service -o 'jsonpath={.spec.ports[0].port}') +kubectl create secret generic kfk-kpi-data --namespace ${KFK_NAMESPACE} --type='Opaque' \ + --from-literal=KFK_NAMESPACE=${KFK_NAMESPACE} \ + --from-literal=KFK_SERVER_PORT=${KFK_NAMESPACE} +printf "\n" + echo "Create secret with NATS data" NATS_CLIENT_PORT=$(kubectl --namespace ${NATS_NAMESPACE} get service ${NATS_NAMESPACE} -o 'jsonpath={.spec.ports[?(@.name=="client")].port}') if [ -z "$NATS_CLIENT_PORT" ]; then -- GitLab From a866c39b4b7959dcd0cca03415901653c2994c3c Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 14:43:57 +0000 Subject: [PATCH 437/602] Kafka secret added to kpi_value_api/kpi_value_writer - improvements to accuratly read the env variables --- deploy/kafka.sh | 2 +- deploy/tfs.sh | 4 ++-- manifests/kpi_value_apiservice.yaml | 3 +++ manifests/kpi_value_writerservice.yaml | 3 +++ 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/deploy/kafka.sh b/deploy/kafka.sh index b2f2f1f9e..21ba89408 100755 --- a/deploy/kafka.sh +++ b/deploy/kafka.sh @@ -81,7 +81,7 @@ echo ">>> Checking if Apache Kafka is deployed ... " if [ "$KFK_REDEPLOY" == "YES" ]; then kafka_deploy elif kubectl get --namespace ${KFK_NAMESPACE} deployments.apps &> /dev/null; then - echo ">>> Apache Kafka already present; skipping step..." + echo ">>> Apache Kafka already present; skipping step." else kafka_deploy fi diff --git a/deploy/tfs.sh b/deploy/tfs.sh index d92d789e3..4ecfaae99 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -172,9 +172,9 @@ printf "\n" echo "Create secret with Apache Kafka kfk-kpi-data for KPI and Telemetry microservices" KFK_SERVER_PORT=$(kubectl --namespace ${KFK_NAMESPACE} get service kafka-service -o 'jsonpath={.spec.ports[0].port}') -kubectl create secret generic kfk-kpi-data --namespace ${KFK_NAMESPACE} --type='Opaque' \ +kubectl create secret generic kfk-kpi-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ --from-literal=KFK_NAMESPACE=${KFK_NAMESPACE} \ - --from-literal=KFK_SERVER_PORT=${KFK_NAMESPACE} + --from-literal=KFK_SERVER_PORT=${KFK_SERVER_PORT} printf "\n" echo "Create secret with NATS data" diff --git a/manifests/kpi_value_apiservice.yaml b/manifests/kpi_value_apiservice.yaml index 74eb90f67..e4dcb0054 100644 --- a/manifests/kpi_value_apiservice.yaml +++ b/manifests/kpi_value_apiservice.yaml @@ -39,6 +39,9 @@ spec: env: - name: LOG_LEVEL value: "INFO" + envFrom: + - secretRef: + name: kfk-kpi-data readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:30020"] diff --git a/manifests/kpi_value_writerservice.yaml b/manifests/kpi_value_writerservice.yaml index 8a8e44ec2..e21e36f48 100644 --- a/manifests/kpi_value_writerservice.yaml +++ b/manifests/kpi_value_writerservice.yaml @@ -39,6 +39,9 @@ spec: env: - name: LOG_LEVEL value: "INFO" + envFrom: + - secretRef: + name: kfk-kpi-data readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:30030"] -- GitLab From 45f1addf94e5a933728021f3051894f4d95b2467 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 14:49:57 +0000 Subject: [PATCH 438/602] dynamically creates the kafka server address with env variables. - get the values of KAFKA_NAMESPACE and KFK_SERVER_PORT to create KAFKA server address. --- src/common/tools/kafka/Variables.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 24ae2cff7..89ac42f90 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -16,14 +16,18 @@ import logging from enum import Enum from confluent_kafka import KafkaException from confluent_kafka.admin import AdminClient, NewTopic +from common.Settings import get_setting LOGGER = logging.getLogger(__name__) +KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' class KafkaConfig(Enum): + KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = get_setting('KFK_SERVER_PORT') # SERVER_IP = "127.0.0.1:9092" - SERVER_IP = "kafka-service.kafka.svc.cluster.local:9092" - ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_IP}) + server_address = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) + ADMIN_CLIENT = AdminClient({'bootstrap.servers': server_address}) class KafkaTopic(Enum): REQUEST = 'topic_request' -- GitLab From 58408ee6479c01a920703c5e9fdec154f5a4a236 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 15:14:40 +0000 Subject: [PATCH 439/602] Some improvements to Kpi Manager test and messages file. - comment is added in Kpi DB file for future reference. --- src/kpi_manager/database/Kpi_DB.py | 3 +- src/kpi_manager/tests/test_kpi_db.py | 4 +- src/kpi_manager/tests/test_kpi_manager.py | 148 +++++----------------- 3 files changed, 34 insertions(+), 121 deletions(-) diff --git a/src/kpi_manager/database/Kpi_DB.py b/src/kpi_manager/database/Kpi_DB.py index 4b6064070..530abe457 100644 --- a/src/kpi_manager/database/Kpi_DB.py +++ b/src/kpi_manager/database/Kpi_DB.py @@ -34,14 +34,15 @@ class KpiDB: def create_database(self) -> None: if not sqlalchemy_utils.database_exists(self.db_engine.url): - LOGGER.debug("Database created. {:}".format(self.db_engine.url)) sqlalchemy_utils.create_database(self.db_engine.url) + LOGGER.debug("Database created. {:}".format(self.db_engine.url)) def drop_database(self) -> None: if sqlalchemy_utils.database_exists(self.db_engine.url): sqlalchemy_utils.drop_database(self.db_engine.url) def create_tables(self): + # TODO: use "get_tables(declatrative class obj)" method of "sqlalchemy_utils" to verify tables. try: KpiModel.metadata.create_all(self.db_engine) # type: ignore LOGGER.debug("Tables created in the DB Name: {:}".format(self.db_name)) diff --git a/src/kpi_manager/tests/test_kpi_db.py b/src/kpi_manager/tests/test_kpi_db.py index e961c12ba..d4a57f836 100644 --- a/src/kpi_manager/tests/test_kpi_db.py +++ b/src/kpi_manager/tests/test_kpi_db.py @@ -21,8 +21,8 @@ LOGGER = logging.getLogger(__name__) def test_verify_databases_and_Tables(): LOGGER.info('>>> test_verify_Tables : START <<< ') kpiDBobj = KpiDB() - kpiDBobj.drop_database() - kpiDBobj.verify_tables() + # kpiDBobj.drop_database() + # kpiDBobj.verify_tables() kpiDBobj.create_database() kpiDBobj.create_tables() kpiDBobj.verify_tables() diff --git a/src/kpi_manager/tests/test_kpi_manager.py b/src/kpi_manager/tests/test_kpi_manager.py index f0d9526d3..da149e3fe 100755 --- a/src/kpi_manager/tests/test_kpi_manager.py +++ b/src/kpi_manager/tests/test_kpi_manager.py @@ -17,7 +17,7 @@ import os, pytest import logging from typing import Union -#from common.proto.context_pb2 import Empty +from common.proto.context_pb2 import Empty from common.Constants import ServiceNameEnum from common.Settings import ( ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_service_port_grpc) @@ -26,12 +26,6 @@ from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList from common.tools.service.GenericGrpcService import GenericGrpcService -#from context.client.ContextClient import ContextClient - -# from device.service.driver_api.DriverFactory import DriverFactory -# 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_filter_request, create_kpi_descriptor_request_a from kpi_manager.service.KpiManagerService import KpiManagerService @@ -39,12 +33,6 @@ from kpi_manager.client.KpiManagerClient import KpiManagerClient from kpi_manager.tests.test_messages import create_kpi_descriptor_request from kpi_manager.tests.test_messages import create_kpi_id_request - -#from monitoring.service.NameMapping import NameMapping - -#os.environ['DEVICE_EMULATED_ONLY'] = 'TRUE' -#from device.service.drivers import DRIVERS - ########################### # Tests Setup ########################### @@ -55,8 +43,6 @@ KPIMANAGER_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # t os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(KPIMANAGER_SERVICE_PORT) -# METRICSDB_HOSTNAME = os.environ.get('METRICSDB_HOSTNAME'){} - LOGGER = logging.getLogger(__name__) class MockContextService(GenericGrpcService): @@ -70,84 +56,10 @@ class MockContextService(GenericGrpcService): self.context_servicer = MockServicerImpl_Context() add_ContextServiceServicer_to_server(self.context_servicer, self.server) -# @pytest.fixture(scope='session') -# def context_service(): -# LOGGER.info('Initializing MockContextService...') -# _service = MockContextService(MOCKSERVICE_PORT) -# _service.start() - -# LOGGER.info('Yielding MockContextService...') -# yield _service - -# LOGGER.info('Terminating MockContextService...') -# _service.context_servicer.msg_broker.terminate() -# _service.stop() - -# LOGGER.info('Terminated MockContextService...') - -# @pytest.fixture(scope='session') -# def context_client(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument -# LOGGER.info('Initializing ContextClient...') -# _client = ContextClient() - -# LOGGER.info('Yielding ContextClient...') -# yield _client - -# LOGGER.info('Closing ContextClient...') -# _client.close() - -# LOGGER.info('Closed ContextClient...') - -# @pytest.fixture(scope='session') -# def device_service(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument -# LOGGER.info('Initializing DeviceService...') -# driver_factory = DriverFactory(DRIVERS) -# driver_instance_cache = DriverInstanceCache(driver_factory) -# _service = DeviceService(driver_instance_cache) -# _service.start() - -# # yield the server, when test finishes, execution will resume to stop it -# LOGGER.info('Yielding DeviceService...') -# yield _service - -# LOGGER.info('Terminating DeviceService...') -# _service.stop() - -# LOGGER.info('Terminated DeviceService...') - -# @pytest.fixture(scope='session') -# def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument -# LOGGER.info('Initializing DeviceClient...') -# _client = DeviceClient() - -# LOGGER.info('Yielding DeviceClient...') -# yield _client - -# LOGGER.info('Closing DeviceClient...') -# _client.close() - -# LOGGER.info('Closed DeviceClient...') - -# @pytest.fixture(scope='session') -# def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument -# LOGGER.info('Initializing DeviceClient...') -# _client = DeviceClient() - -# LOGGER.info('Yielding DeviceClient...') -# yield _client - -# LOGGER.info('Closing DeviceClient...') -# _client.close() - -# LOGGER.info('Closed DeviceClient...') - # This fixture will be requested by test cases and last during testing session @pytest.fixture(scope='session') def kpi_manager_service(): LOGGER.info('Initializing KpiManagerService...') - #name_mapping = NameMapping() - # _service = MonitoringService(name_mapping) - # _service = KpiManagerService(name_mapping) _service = KpiManagerService() _service.start() @@ -194,22 +106,22 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab ########################### # ---------- 3rd Iteration Tests ---------------- -# def test_SetKpiDescriptor(kpi_manager_client): -# LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ") -# response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) -# LOGGER.info("Response gRPC message object: {:}".format(response)) -# assert isinstance(response, KpiId) +def test_SetKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ") + 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_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) -# # deleting KPI -# del_response = kpi_manager_client.DeleteKpiDescriptor(response_id) -# # select KPI -# kpi_manager_client.GetKpiDescriptor(response_id) -# LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response)) -# assert isinstance(del_response, Empty) +def test_DeleteKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ") + # adding KPI + response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + # deleting KPI + del_response = kpi_manager_client.DeleteKpiDescriptor(response_id) + # select KPI + kpi_manager_client.GetKpiDescriptor(response_id) + LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response)) + assert isinstance(del_response, Empty) def test_GetKpiDescriptor(kpi_manager_client): LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") @@ -225,21 +137,21 @@ def test_GetKpiDescriptor(kpi_manager_client): assert isinstance(response, KpiDescriptor) -# def test_SelectKpiDescriptor(kpi_manager_client): -# LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ") -# # adding KPI -# kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) -# # select KPI(s) -# response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request()) -# LOGGER.info("Response gRPC message object: {:}".format(response)) -# assert isinstance(response, KpiDescriptorList) +def test_SelectKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ") + # adding KPI + kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + # select KPI(s) + response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request()) + LOGGER.info("Response gRPC message object: {:}".format(response)) + assert isinstance(response, KpiDescriptorList) -# def test_set_list_of_KPIs(kpi_manager_client): -# LOGGER.debug(" >>> test_set_list_of_KPIs: START <<< ") -# KPIs_TO_SEARCH = ["node_in_power_total", "node_in_current_total", "node_out_power_total"] -# # adding KPI -# for kpi in KPIs_TO_SEARCH: -# kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a(kpi)) +def test_set_list_of_KPIs(kpi_manager_client): + LOGGER.debug(" >>> test_set_list_of_KPIs: START <<< ") + KPIs_TO_SEARCH = ["node_in_power_total", "node_in_current_total", "node_out_power_total"] + # adding KPI + for kpi in KPIs_TO_SEARCH: + kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a(kpi)) # ---------- 2nd Iteration Tests ----------------- -- GitLab From bdcb5c01852b63399adffed7b635b19119cc73c1 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 31 Jul 2024 12:30:39 +0000 Subject: [PATCH 440/602] Changes to resolve Kafka server error - KFK_SERVER_ADDRESS_TEMPLATE now defined inside the class KafkaConfig. - variable renamed to "SERVER_ADDRESS" from "server_address" --- src/common/tools/kafka/Variables.py | 13 +++++++------ .../service/KpiValueApiServiceServicerImpl.py | 2 +- src/kpi_value_writer/service/KpiValueWriter.py | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 89ac42f90..9abc32b3e 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -20,14 +20,14 @@ from common.Settings import get_setting LOGGER = logging.getLogger(__name__) -KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' class KafkaConfig(Enum): - KFK_NAMESPACE = get_setting('KFK_NAMESPACE') - KFK_PORT = get_setting('KFK_SERVER_PORT') - # SERVER_IP = "127.0.0.1:9092" - server_address = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) - ADMIN_CLIENT = AdminClient({'bootstrap.servers': server_address}) + KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' + KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = get_setting('KFK_SERVER_PORT') + # SERVER_ADDRESS = "127.0.0.1:9092" + SERVER_ADDRESS = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) + ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) class KafkaTopic(Enum): REQUEST = 'topic_request' @@ -42,6 +42,7 @@ class KafkaTopic(Enum): Method to create Kafka topics defined as class members """ all_topics = [member.value for member in KafkaTopic] + LOGGER.debug("Kafka server address is: {:} ".format(KafkaConfig.SERVER_ADDRESS.value)) if( KafkaTopic.create_new_topic_if_not_exists( all_topics )): LOGGER.debug("All topics are created sucsessfully") return True diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index d27de54f3..1559457d7 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -38,7 +38,7 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): ) -> Empty: LOGGER.debug('StoreKpiValues: Received gRPC message object: {:}'.format(request)) producer_obj = KafkaProducer({ - 'bootstrap.servers' : KafkaConfig.SERVER_IP.value + 'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value }) for kpi_value in request.kpi_value_list: kpi_value_to_produce : Tuple [str, Any, Any] = ( diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index 022126fd0..5e2b6babe 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -51,10 +51,10 @@ class KpiValueWriter(GenericGrpcService): metric_writer = MetricWriterToPrometheus() kafka_consumer = KafkaConsumer( - { 'bootstrap.servers' : KafkaConfig.SERVER_IP.value, + { 'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value, 'group.id' : __class__, 'auto.offset.reset' : 'latest'} - ) + ) kafka_consumer.subscribe([KafkaTopic.VALUE.value]) LOGGER.debug("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) print("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) -- GitLab From 34f8bb97487572bb01143ac022fe9d477e007bde Mon Sep 17 00:00:00 2001 From: diazjj Date: Wed, 31 Jul 2024 16:42:57 +0200 Subject: [PATCH 441/602] Async refactoring of the code. Initial --- src/common/method_wrappers/Decorator.py | 46 ++++++++ .../tools/service/GenericGrpcServiceAsync.py | 72 ++++++++++++ .../connector/client/DltConnectorClient.py | 70 +++++++---- .../client/DltConnectorClientSync.py | 111 ++++++++++++++++++ .../connector/client/DltEventsCollector.py | 4 +- src/dlt/connector/client/DltGatewayClient.py | 57 ++++++--- .../connector/client/DltGatewayClientEvent.py | 57 +++++++++ .../connector/service/DltConnectorService.py | 9 +- .../DltConnectorServiceServicerImpl.py | 96 +++++++++------ src/dlt/connector/service/__main__.py | 30 +++-- .../event_dispatcher/DltEventDispatcher.py | 8 +- .../topology_abstractor/DltRecordSender.py | 85 ++++++++------ .../topology_abstractor/DltRecorder.py | 86 +++++++++----- 13 files changed, 565 insertions(+), 166 deletions(-) create mode 100644 src/common/tools/service/GenericGrpcServiceAsync.py create mode 100644 src/dlt/connector/client/DltConnectorClientSync.py create mode 100644 src/dlt/connector/client/DltGatewayClientEvent.py diff --git a/src/common/method_wrappers/Decorator.py b/src/common/method_wrappers/Decorator.py index 71b3999bf..bfda31ec9 100644 --- a/src/common/method_wrappers/Decorator.py +++ b/src/common/method_wrappers/Decorator.py @@ -12,6 +12,20 @@ # See the License for the specific language governing permissions and # limitations under the License. +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 grpc, json, logging, threading from enum import Enum from prettytable import PrettyTable @@ -235,3 +249,35 @@ def safe_and_metered_rpc_method(metrics_pool : MetricsPool, logger : logging.Log grpc_context.abort(grpc.StatusCode.INTERNAL, str(e)) return inner_wrapper return outer_wrapper + +def safe_and_metered_rpc_method_async(metrics_pool: MetricsPool, logger: logging.Logger): + def outer_wrapper(func): + method_name = func.__name__ + metrics = metrics_pool.get_metrics(method_name) + histogram_duration, counter_started, counter_completed, counter_failed = metrics + + async def inner_wrapper(self, request, grpc_context: grpc.aio.ServicerContext): + counter_started.inc() + try: + logger.debug('{:s} request: {:s}'.format(method_name, grpc_message_to_json_string(request))) + reply = await func(self, request, grpc_context) + logger.debug('{:s} reply: {:s}'.format(method_name, grpc_message_to_json_string(reply))) + counter_completed.inc() + return reply + except ServiceException as e: # pragma: no cover (ServiceException not thrown) + if e.code not in [grpc.StatusCode.NOT_FOUND, grpc.StatusCode.ALREADY_EXISTS]: + # Assume not found or already exists is just a condition, not an error + logger.exception('{:s} exception'.format(method_name)) + counter_failed.inc() + else: + counter_completed.inc() + await grpc_context.abort(e.code, e.details) + except Exception as e: # pragma: no cover, pylint: disable=broad-except + logger.exception('{:s} exception'.format(method_name)) + counter_failed.inc() + await grpc_context.abort(grpc.StatusCode.INTERNAL, str(e)) + + return inner_wrapper + + return outer_wrapper + diff --git a/src/common/tools/service/GenericGrpcServiceAsync.py b/src/common/tools/service/GenericGrpcServiceAsync.py new file mode 100644 index 000000000..488d86177 --- /dev/null +++ b/src/common/tools/service/GenericGrpcServiceAsync.py @@ -0,0 +1,72 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +from typing import Optional, Union +import grpc +import logging +from concurrent import futures +from grpc_health.v1.health import HealthServicer, OVERALL_HEALTH +from grpc_health.v1.health_pb2 import HealthCheckResponse +from grpc_health.v1.health_pb2_grpc import add_HealthServicer_to_server +from common.Settings import get_grpc_bind_address, get_grpc_grace_period, get_grpc_max_workers + +class GenericGrpcServiceAsync: + def __init__( + self, bind_port: Union[str, int], bind_address: Optional[str] = None, max_workers: Optional[int] = None, + grace_period: Optional[int] = None, enable_health_servicer: bool = True, cls_name: str = __name__ + ) -> None: + self.logger = logging.getLogger(cls_name) + self.bind_port = bind_port + self.bind_address = get_grpc_bind_address() if bind_address is None else bind_address + self.max_workers = get_grpc_max_workers() if max_workers is None else max_workers + self.grace_period = get_grpc_grace_period() if grace_period is None else grace_period + self.enable_health_servicer = enable_health_servicer + self.endpoint = None + self.health_servicer = None + self.pool = None + self.server = None + + async def install_servicers(self): + pass + + async def start(self): + self.endpoint = '{:s}:{:s}'.format(str(self.bind_address), str(self.bind_port)) + self.logger.info('Starting Service (tentative endpoint: {:s}, max_workers: {:s})...'.format( + str(self.endpoint), str(self.max_workers))) + + self.pool = futures.ThreadPoolExecutor(max_workers=self.max_workers) + self.server = grpc.aio.server(self.pool) + + await self.install_servicers() # Ensure this is awaited + + if self.enable_health_servicer: + self.health_servicer = HealthServicer( + experimental_non_blocking=True, experimental_thread_pool=futures.ThreadPoolExecutor(max_workers=1)) + add_HealthServicer_to_server(self.health_servicer, self.server) + + self.bind_port = self.server.add_insecure_port(self.endpoint) + self.endpoint = '{:s}:{:s}'.format(str(self.bind_address), str(self.bind_port)) + self.logger.info('Listening on {:s}...'.format(str(self.endpoint))) + await self.server.start() + if self.enable_health_servicer: + self.health_servicer.set(OVERALL_HEALTH, HealthCheckResponse.SERVING) + + self.logger.debug('Service started') + + async def stop(self): + self.logger.debug('Stopping service (grace period {:s} seconds)...'.format(str(self.grace_period))) + if self.enable_health_servicer: + self.health_servicer.enter_graceful_shutdown() + await self.server.stop(self.grace_period) + self.logger.debug('Service stopped') diff --git a/src/dlt/connector/client/DltConnectorClient.py b/src/dlt/connector/client/DltConnectorClient.py index e383217d8..a2224dd32 100644 --- a/src/dlt/connector/client/DltConnectorClient.py +++ b/src/dlt/connector/client/DltConnectorClient.py @@ -12,7 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -import grpc, logging +# DltConnectorClient.py + +import grpc +import logging +import asyncio + from common.Constants import ServiceNameEnum from common.Settings import get_service_host, get_service_port_grpc from common.proto.context_pb2 import Empty, TopologyId @@ -35,77 +40,90 @@ class DltConnectorClient: LOGGER.debug('Creating channel to {:s}...'.format(self.endpoint)) self.channel = None self.stub = None - self.connect() - LOGGER.debug('Channel created') + #self.connect() + #LOGGER.debug('Channel created') - def connect(self): - self.channel = grpc.insecure_channel(self.endpoint) + async def connect(self): + self.channel = grpc.aio.insecure_channel(self.endpoint) self.stub = DltConnectorServiceStub(self.channel) + LOGGER.debug('Channel created') - def close(self): - if self.channel is not None: self.channel.close() + async def close(self): + if self.channel is not None: + await self.channel.close() self.channel = None self.stub = None @RETRY_DECORATOR - def RecordAll(self, request : TopologyId) -> Empty: + async def RecordAll(self, request: TopologyId) -> Empty: LOGGER.debug('RecordAll request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordAll(request) + response = await self.stub.RecordAll(request) LOGGER.debug('RecordAll result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordAllDevices(self, request : TopologyId) -> Empty: + async def RecordAllDevices(self, request: TopologyId) -> Empty: LOGGER.debug('RecordAllDevices request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordAllDevices(request) + response = await self.stub.RecordAllDevices(request) LOGGER.debug('RecordAllDevices result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordDevice(self, request : DltDeviceId) -> Empty: - LOGGER.debug('RecordDevice request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordDevice(request) + # async def RecordDevice(self, request: DltDeviceId) -> Empty: + # LOGGER.debug('RECORD_DEVICE request received: {:s}'.format(grpc_message_to_json_string(request))) + + # Simulate some asynchronous processing delay + # await asyncio.sleep(2) # Simulates processing time + + # Create a dummy response (Empty message) + # response = Empty() + + # LOGGER.debug('RECORD_DEVICE processing complete for request: {:s}'.format(grpc_message_to_json_string(request))) + # return response + async def RecordDevice(self, request: DltDeviceId) -> Empty: + LOGGER.debug('RECORD_DEVICE request: {:s}'.format(grpc_message_to_json_string(request))) + response = await self.stub.RecordDevice(request) LOGGER.debug('RecordDevice result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordAllLinks(self, request : TopologyId) -> Empty: + async def RecordAllLinks(self, request: TopologyId) -> Empty: LOGGER.debug('RecordAllLinks request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordAllLinks(request) + response = await self.stub.RecordAllLinks(request) LOGGER.debug('RecordAllLinks result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordLink(self, request : DltLinkId) -> Empty: + async def RecordLink(self, request: DltLinkId) -> Empty: LOGGER.debug('RecordLink request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordLink(request) + response = await self.stub.RecordLink(request) LOGGER.debug('RecordLink result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordAllServices(self, request : TopologyId) -> Empty: + async def RecordAllServices(self, request: TopologyId) -> Empty: LOGGER.debug('RecordAllServices request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordAllServices(request) + response = await self.stub.RecordAllServices(request) LOGGER.debug('RecordAllServices result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordService(self, request : DltServiceId) -> Empty: + async def RecordService(self, request: DltServiceId) -> Empty: LOGGER.debug('RecordService request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordService(request) + response = await self.stub.RecordService(request) LOGGER.debug('RecordService result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordAllSlices(self, request : TopologyId) -> Empty: + async def RecordAllSlices(self, request: TopologyId) -> Empty: LOGGER.debug('RecordAllSlices request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordAllSlices(request) + response = await self.stub.RecordAllSlices(request) LOGGER.debug('RecordAllSlices result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordSlice(self, request : DltSliceId) -> Empty: + async def RecordSlice(self, request: DltSliceId) -> Empty: LOGGER.debug('RecordSlice request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordSlice(request) + response = await self.stub.RecordSlice(request) LOGGER.debug('RecordSlice result: {:s}'.format(grpc_message_to_json_string(response))) return response diff --git a/src/dlt/connector/client/DltConnectorClientSync.py b/src/dlt/connector/client/DltConnectorClientSync.py new file mode 100644 index 000000000..a633e89bd --- /dev/null +++ b/src/dlt/connector/client/DltConnectorClientSync.py @@ -0,0 +1,111 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 grpc, logging +from common.Constants import ServiceNameEnum +from common.Settings import get_service_host, get_service_port_grpc +from common.proto.context_pb2 import Empty, TopologyId +from common.proto.dlt_connector_pb2 import DltDeviceId, DltLinkId, DltServiceId, DltSliceId +from common.proto.dlt_connector_pb2_grpc import DltConnectorServiceStub +from common.tools.client.RetryDecorator import retry, delay_exponential +from common.tools.grpc.Tools import grpc_message_to_json_string + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) +MAX_RETRIES = 15 +DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) +RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') + +class DltConnectorClientSync: + def __init__(self, host=None, port=None): + if not host: host = get_service_host(ServiceNameEnum.DLT) + if not port: port = get_service_port_grpc(ServiceNameEnum.DLT) + self.endpoint = '{:s}:{:s}'.format(str(host), str(port)) + LOGGER.debug('Creating channel to {:s}...'.format(self.endpoint)) + self.channel = None + self.stub = None + self.connect() + LOGGER.debug('Channel created') + + def connect(self): + self.channel = grpc.insecure_channel(self.endpoint) + self.stub = DltConnectorServiceStub(self.channel) + + def close(self): + if self.channel is not None: self.channel.close() + self.channel = None + self.stub = None + + @RETRY_DECORATOR + def RecordAll(self, request : TopologyId) -> Empty: + LOGGER.debug('RecordAll request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.RecordAll(request) + LOGGER.debug('RecordAll result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def RecordAllDevices(self, request : TopologyId) -> Empty: + LOGGER.debug('RecordAllDevices request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.RecordAllDevices(request) + LOGGER.debug('RecordAllDevices result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def RecordDevice(self, request : DltDeviceId) -> Empty: + LOGGER.debug('RecordDevice request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.RecordDevice(request) + LOGGER.debug('RecordDevice result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def RecordAllLinks(self, request : TopologyId) -> Empty: + LOGGER.debug('RecordAllLinks request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.RecordAllLinks(request) + LOGGER.debug('RecordAllLinks result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def RecordLink(self, request : DltLinkId) -> Empty: + LOGGER.debug('RecordLink request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.RecordLink(request) + LOGGER.debug('RecordLink result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def RecordAllServices(self, request : TopologyId) -> Empty: + LOGGER.debug('RecordAllServices request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.RecordAllServices(request) + LOGGER.debug('RecordAllServices result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def RecordService(self, request : DltServiceId) -> Empty: + LOGGER.debug('RecordService request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.RecordService(request) + LOGGER.debug('RecordService result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def RecordAllSlices(self, request : TopologyId) -> Empty: + LOGGER.debug('RecordAllSlices request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.RecordAllSlices(request) + LOGGER.debug('RecordAllSlices result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def RecordSlice(self, request : DltSliceId) -> Empty: + LOGGER.debug('RecordSlice request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.RecordSlice(request) + LOGGER.debug('RecordSlice result: {:s}'.format(grpc_message_to_json_string(response))) + return response diff --git a/src/dlt/connector/client/DltEventsCollector.py b/src/dlt/connector/client/DltEventsCollector.py index e59784a4d..2e38d0445 100644 --- a/src/dlt/connector/client/DltEventsCollector.py +++ b/src/dlt/connector/client/DltEventsCollector.py @@ -16,7 +16,7 @@ from typing import Callable, Optional import grpc, logging, queue, threading, time from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordSubscription from common.tools.grpc.Tools import grpc_message_to_json_string -from dlt.connector.client.DltGatewayClient import DltGatewayClient +from dlt.connector.client.DltGatewayClientEvent import DltGatewayClientEvent LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -31,7 +31,7 @@ LOGGER.setLevel(logging.DEBUG) class DltEventsCollector(threading.Thread): def __init__( - self, dltgateway_client : DltGatewayClient, + self, dltgateway_client : DltGatewayClientEvent, log_events_received : bool = False, event_handler : Optional[Callable[[DltRecordEvent], Optional[DltRecordEvent]]] = None, ) -> None: diff --git a/src/dlt/connector/client/DltGatewayClient.py b/src/dlt/connector/client/DltGatewayClient.py index cde278517..2690dfb66 100644 --- a/src/dlt/connector/client/DltGatewayClient.py +++ b/src/dlt/connector/client/DltGatewayClient.py @@ -12,8 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Iterator -import grpc, logging + + +import grpc +import logging +import asyncio +from typing import Iterator, List from common.proto.context_pb2 import Empty, TeraFlowController from common.proto.dlt_gateway_pb2 import ( DltPeerStatus, DltPeerStatusList, DltRecord, DltRecordEvent, DltRecordId, DltRecordStatus, DltRecordSubscription) @@ -36,29 +40,50 @@ class DltGatewayClient: LOGGER.debug('Creating channel to {:s}...'.format(self.endpoint)) self.channel = None self.stub = None - self.connect() - LOGGER.debug('Channel created') + #self.connect() + self.message_queue: List[DltRecord] = [] + #LOGGER.debug('Channel created') + - def connect(self): - self.channel = grpc.insecure_channel(self.endpoint) + async def connect(self): + self.channel = grpc.aio.insecure_channel(self.endpoint) self.stub = DltGatewayServiceStub(self.channel) + LOGGER.debug('Channel created') - def close(self): - if self.channel is not None: self.channel.close() + async def close(self): + if self.channel is not None: + await self.channel.close() self.channel = None self.stub = None + # async def dummy_process(self, request: DltRecord): + # # Simulate processing delay + # await asyncio.sleep(2) + # return DltRecordStatus(status="DLTRECORDSTATUS_SUCCEEDED", record_id=request.record_id) + + @RETRY_DECORATOR - def RecordToDlt(self, request : DltRecord) -> DltRecordStatus: + async def RecordToDlt(self, request : DltRecord) -> DltRecordStatus: LOGGER.debug('RecordToDlt request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordToDlt(request) + response = await self.stub.RecordToDlt(request) LOGGER.debug('RecordToDlt result: {:s}'.format(grpc_message_to_json_string(response))) return response + + # @RETRY_DECORATOR + # async def RecordToDlt(self, request: DltRecord) -> DltRecordStatus: + # self.message_queue.append(request) + # LOGGER.debug(f'RecordToDlt request: {grpc_message_to_json_string(request)}') + # LOGGER.debug(f'Queue length before processing: {len(self.message_queue)}') + # response = await self.dummy_process(request) + # LOGGER.debug(f'RecordToDlt result: {grpc_message_to_json_string(response)}') + # self.message_queue.remove(request) + # LOGGER.debug(f'Queue length after processing: {len(self.message_queue)}') + # return response @RETRY_DECORATOR - def GetFromDlt(self, request : DltRecordId) -> DltRecord: + async def GetFromDlt(self, request : DltRecordId) -> DltRecord: LOGGER.debug('GetFromDlt request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.GetFromDlt(request) + response = await self.stub.GetFromDlt(request) LOGGER.debug('GetFromDlt result: {:s}'.format(grpc_message_to_json_string(response))) return response @@ -70,15 +95,15 @@ class DltGatewayClient: return response @RETRY_DECORATOR - def GetDltStatus(self, request : TeraFlowController) -> DltPeerStatus: + async def GetDltStatus(self, request : TeraFlowController) -> DltPeerStatus: LOGGER.debug('GetDltStatus request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.GetDltStatus(request) + response = await self.stub.GetDltStatus(request) LOGGER.debug('GetDltStatus result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def GetDltPeers(self, request : Empty) -> DltPeerStatusList: + async def GetDltPeers(self, request : Empty) -> DltPeerStatusList: LOGGER.debug('GetDltPeers request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.GetDltPeers(request) + response = await self.stub.GetDltPeers(request) LOGGER.debug('GetDltPeers result: {:s}'.format(grpc_message_to_json_string(response))) return response diff --git a/src/dlt/connector/client/DltGatewayClientEvent.py b/src/dlt/connector/client/DltGatewayClientEvent.py new file mode 100644 index 000000000..6cbaf1a27 --- /dev/null +++ b/src/dlt/connector/client/DltGatewayClientEvent.py @@ -0,0 +1,57 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 grpc +import logging +from typing import Iterator +from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordSubscription +from common.proto.dlt_gateway_pb2_grpc import DltGatewayServiceStub +from common.tools.client.RetryDecorator import retry, delay_exponential +from common.tools.grpc.Tools import grpc_message_to_json_string +from dlt.connector.Config import DLT_GATEWAY_HOST, DLT_GATEWAY_PORT + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) +MAX_RETRIES = 15 +DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) +RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') + +class DltGatewayClientEvent: + def __init__(self, host=None, port=None): + if not host: host = DLT_GATEWAY_HOST + if not port: port = DLT_GATEWAY_PORT + self.endpoint = '{:s}:{:s}'.format(str(host), str(port)) + LOGGER.debug('Creating channel to {:s}...'.format(self.endpoint)) + self.channel = None + self.stub = None + self.connect() + LOGGER.debug('Channel created') + + def connect(self): + self.channel = grpc.insecure_channel(self.endpoint) + self.stub = DltGatewayServiceStub(self.channel) + + def close(self): + if self.channel is not None: + self.channel.close() + self.channel = None + self.stub = None + + @RETRY_DECORATOR + def SubscribeToDlt(self, request: DltRecordSubscription) -> Iterator[DltRecordEvent]: + LOGGER.debug('SubscribeToDlt request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.SubscribeToDlt(request) + LOGGER.debug('SubscribeToDlt result: {:s}'.format(grpc_message_to_json_string(response))) + return response diff --git a/src/dlt/connector/service/DltConnectorService.py b/src/dlt/connector/service/DltConnectorService.py index 7e99cb8f8..601d3e70d 100644 --- a/src/dlt/connector/service/DltConnectorService.py +++ b/src/dlt/connector/service/DltConnectorService.py @@ -14,15 +14,16 @@ from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc -from common.tools.service.GenericGrpcService import GenericGrpcService +from common.tools.service.GenericGrpcServiceAsync import GenericGrpcServiceAsync from common.proto.dlt_connector_pb2_grpc import add_DltConnectorServiceServicer_to_server from .DltConnectorServiceServicerImpl import DltConnectorServiceServicerImpl -class DltConnectorService(GenericGrpcService): +class DltConnectorService(GenericGrpcServiceAsync): def __init__(self, cls_name: str = __name__) -> None: port = get_service_port_grpc(ServiceNameEnum.DLT) super().__init__(port, cls_name=cls_name) self.dltconnector_servicer = DltConnectorServiceServicerImpl() - def install_servicers(self): - add_DltConnectorServiceServicer_to_server(self.dltconnector_servicer, self.server) + async def install_servicers(self): + await self.dltconnector_servicer.initialize() + add_DltConnectorServiceServicer_to_server(self.dltconnector_servicer, self.server) \ No newline at end of file diff --git a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py index c05d46b48..46c58e063 100644 --- a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py +++ b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py @@ -12,9 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -import grpc, logging +import grpc +import asyncio +from grpc.aio import ServicerContext +import logging from typing import Optional -from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method +from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method_async from common.proto.context_pb2 import Empty, TopologyId from common.proto.dlt_connector_pb2 import DltDeviceId, DltLinkId, DltServiceId, DltSliceId from common.proto.dlt_connector_pb2_grpc import DltConnectorServiceServicer @@ -32,94 +35,109 @@ METRICS_POOL = MetricsPool('DltConnector', 'RPC') class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): def __init__(self): LOGGER.debug('Creating Servicer...') + self.dltgateway_client = DltGatewayClient() LOGGER.debug('Servicer Created') - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordAll(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: + async def initialize(self): + await self.dltgateway_client.connect() + + @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) + async def RecordAll(self, request: TopologyId, context: ServicerContext) -> Empty: return Empty() - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordAllDevices(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: + @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) + async def RecordAllDevices(self, request: TopologyId, context: ServicerContext) -> Empty: return Empty() - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordDevice(self, request : DltDeviceId, context : grpc.ServicerContext) -> Empty: + @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) + # async def RecordDevice(self, request: DltDeviceId, context: ServicerContext) -> Empty: + # LOGGER.debug('Received RecordDevice request: {:s}'.format(grpc_message_to_json_string(request))) + # try: + # if not request.delete: + # LOGGER.debug('Processing RecordDevice request: {:s}'.format(grpc_message_to_json_string(request))) + # # Perform any dummy operation or simply log the request + # LOGGER.debug('Processed RecordDevice request: {:s}'.format(grpc_message_to_json_string(request))) + # except Exception as e: + # LOGGER.error(f"Error processing RecordDevice: {e}") + # return Empty() + async def RecordDevice(self, request: DltDeviceId, context: ServicerContext) -> Empty: data_json = None - if not request.delete: + LOGGER.debug('RECORD_DEVICE = {:s}'.format(grpc_message_to_json_string(request))) + if not request.delete: context_client = ContextClient() device = context_client.GetDevice(request.device_id) data_json = grpc_message_to_json_string(device) - self._record_entity( + await self._record_entity( request.topology_id.topology_uuid.uuid, DltRecordTypeEnum.DLTRECORDTYPE_DEVICE, request.device_id.device_uuid.uuid, request.delete, data_json) return Empty() - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordAllLinks(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: + @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) + async def RecordAllLinks(self, request: TopologyId, context: ServicerContext) -> Empty: return Empty() - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordLink(self, request : DltLinkId, context : grpc.ServicerContext) -> Empty: + @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) + async def RecordLink(self, request: DltLinkId, context: ServicerContext) -> Empty: data_json = None + LOGGER.debug('RECORD_LINK = {:s}'.format(grpc_message_to_json_string(request))) + if not request.delete: context_client = ContextClient() link = context_client.GetLink(request.link_id) data_json = grpc_message_to_json_string(link) - self._record_entity( + await self._record_entity( request.topology_id.topology_uuid.uuid, DltRecordTypeEnum.DLTRECORDTYPE_LINK, request.link_id.link_uuid.uuid, request.delete, data_json) return Empty() - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordAllServices(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: + @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) + async def RecordAllServices(self, request: TopologyId, context: ServicerContext) -> Empty: return Empty() - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordService(self, request : DltServiceId, context : grpc.ServicerContext) -> Empty: + @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) + async def RecordService(self, request: DltServiceId, context: ServicerContext) -> Empty: data_json = None if not request.delete: context_client = ContextClient() service = context_client.GetService(request.service_id) data_json = grpc_message_to_json_string(service) - self._record_entity( + await self._record_entity( request.topology_id.topology_uuid.uuid, DltRecordTypeEnum.DLTRECORDTYPE_SERVICE, request.service_id.service_uuid.uuid, request.delete, data_json) return Empty() - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordAllSlices(self, request : TopologyId, context : grpc.ServicerContext) -> Empty: + @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) + async def RecordAllSlices(self, request: TopologyId, context: ServicerContext) -> Empty: return Empty() - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def RecordSlice(self, request : DltSliceId, context : grpc.ServicerContext) -> Empty: + @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) + async def RecordSlice(self, request: DltSliceId, context: ServicerContext) -> Empty: data_json = None if not request.delete: context_client = ContextClient() slice_ = context_client.GetSlice(request.slice_id) data_json = grpc_message_to_json_string(slice_) - self._record_entity( + await self._record_entity( request.topology_id.topology_uuid.uuid, DltRecordTypeEnum.DLTRECORDTYPE_SLICE, request.slice_id.slice_uuid.uuid, request.delete, data_json) return Empty() - def _record_entity( - self, dlt_domain_uuid : str, dlt_record_type : DltRecordTypeEnum, dlt_record_uuid : str, delete : bool, - data_json : Optional[str] = None + async def _record_entity( + self, dlt_domain_uuid: str, dlt_record_type: DltRecordTypeEnum, dlt_record_uuid: str, delete: bool, + data_json: Optional[str] = None ) -> None: - dltgateway_client = DltGatewayClient() - dlt_record_id = DltRecordId() - dlt_record_id.domain_uuid.uuid = dlt_domain_uuid # pylint: disable=no-member - dlt_record_id.type = dlt_record_type - dlt_record_id.record_uuid.uuid = dlt_record_uuid # pylint: disable=no-member + dlt_record_id.domain_uuid.uuid = dlt_domain_uuid # pylint: disable=no-member + dlt_record_id.type = dlt_record_type + dlt_record_id.record_uuid.uuid = dlt_record_uuid # pylint: disable=no-member str_dlt_record_id = grpc_message_to_json_string(dlt_record_id) LOGGER.debug('[_record_entity] sent dlt_record_id = {:s}'.format(str_dlt_record_id)) - dlt_record = dltgateway_client.GetFromDlt(dlt_record_id) + dlt_record = await self.dltgateway_client.GetFromDlt(dlt_record_id) str_dlt_record = grpc_message_to_json_string(dlt_record) LOGGER.debug('[_record_entity] recv dlt_record = {:s}'.format(str_dlt_record)) @@ -127,22 +145,24 @@ class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): LOGGER.debug('[_record_entity] exists = {:s}'.format(str(exists))) dlt_record = DltRecord() - dlt_record.record_id.CopyFrom(dlt_record_id) # pylint: disable=no-member + dlt_record.record_id.CopyFrom(dlt_record_id) # pylint: disable=no-member if delete and exists: dlt_record.operation = DltRecordOperationEnum.DLTRECORDOPERATION_DELETE elif not delete and exists: dlt_record.operation = DltRecordOperationEnum.DLTRECORDOPERATION_UPDATE - if data_json is None: raise Exception('data_json must be provided when updating') + if data_json is None: + raise Exception('data_json must be provided when updating') dlt_record.data_json = data_json elif not delete and not exists: dlt_record.operation = DltRecordOperationEnum.DLTRECORDOPERATION_ADD - if data_json is None: raise Exception('data_json must be provided when adding') + if data_json is None: + raise Exception('data_json must be provided when adding') dlt_record.data_json = data_json else: return str_dlt_record = grpc_message_to_json_string(dlt_record) LOGGER.debug('[_record_entity] sent dlt_record = {:s}'.format(str_dlt_record)) - dlt_record_status = dltgateway_client.RecordToDlt(dlt_record) + dlt_record_status = await self.dltgateway_client.RecordToDlt(dlt_record) str_dlt_record_status = grpc_message_to_json_string(dlt_record_status) LOGGER.debug('[_record_entity] recv dlt_record_status = {:s}'.format(str_dlt_record_status)) diff --git a/src/dlt/connector/service/__main__.py b/src/dlt/connector/service/__main__.py index b13f4257b..09f525ed4 100644 --- a/src/dlt/connector/service/__main__.py +++ b/src/dlt/connector/service/__main__.py @@ -12,7 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, signal, sys, threading + +import logging +import signal +import sys +import threading +import asyncio from prometheus_client import start_http_server from common.Constants import ServiceNameEnum from common.Settings import ( @@ -22,25 +27,25 @@ from .event_dispatcher.DltEventDispatcher import DltEventDispatcher from .DltConnectorService import DltConnectorService terminate = threading.Event() -LOGGER : logging.Logger = None +LOGGER: logging.Logger = None -def signal_handler(signal, frame): # pylint: disable=redefined-outer-name +def signal_handler(signal, frame): LOGGER.warning('Terminate signal received') terminate.set() -def main(): - global LOGGER # pylint: disable=global-statement +async def main(): + global LOGGER log_level = get_log_level() logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") LOGGER = logging.getLogger(__name__) wait_for_environment_variables([ - get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST ), + get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST), get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), ]) - signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) LOGGER.info('Starting...') @@ -53,17 +58,16 @@ def main(): event_dispatcher = DltEventDispatcher() event_dispatcher.start() - # Context Event dispatcher - # Starting DLT connector service grpc_service = DltConnectorService() - grpc_service.start() + await grpc_service.start() # Wait for Ctrl+C or termination signal - while not terminate.wait(timeout=1.0): pass + while not terminate.wait(timeout=1.0): + await asyncio.sleep(1.0) LOGGER.info('Terminating...') - grpc_service.stop() + await grpc_service.stop() event_dispatcher.stop() event_dispatcher.join() @@ -71,4 +75,4 @@ def main(): return 0 if __name__ == '__main__': - sys.exit(main()) + asyncio.run(main()) diff --git a/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py b/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py index 779bae9c1..29e8c096d 100644 --- a/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py +++ b/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py @@ -26,9 +26,9 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient -from dlt.connector.client.DltConnectorClient import DltConnectorClient +from dlt.connector.client.DltConnectorClientSync import DltConnectorClientSync from dlt.connector.client.DltEventsCollector import DltEventsCollector -from dlt.connector.client.DltGatewayClient import DltGatewayClient +from dlt.connector.client.DltGatewayClientEvent import DltGatewayClientEvent from interdomain.client.InterdomainClient import InterdomainClient LOGGER = logging.getLogger(__name__) @@ -40,8 +40,8 @@ ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) class Clients: def __init__(self) -> None: self.context_client = ContextClient() - self.dlt_connector_client = DltConnectorClient() - self.dlt_gateway_client = DltGatewayClient() + self.dlt_connector_client = DltConnectorClientSync() + self.dlt_gateway_client = DltGatewayClientEvent() self.interdomain_client = InterdomainClient() def close(self) -> None: diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index cfa51c928..d6d5ef0f6 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -12,91 +12,108 @@ # See the License for the specific language governing permissions and # limitations under the License. +# DltRecordSender.py + import logging +import asyncio + + from typing import Dict, List, Optional, Tuple from common.proto.context_pb2 import Device, Link, Service, Slice, TopologyId from common.proto.dlt_connector_pb2 import DltDeviceId, DltLinkId, DltServiceId, DltSliceId from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from dlt.connector.client.DltConnectorClient import DltConnectorClient -from .Types import DltRecordTypes LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) class DltRecordSender: - def __init__(self, context_client : ContextClient, dlt_connector_client : Optional[DltConnectorClient]) -> None: + def __init__(self, context_client: ContextClient) -> None: self.context_client = context_client - self.dlt_connector_client = dlt_connector_client - self.dlt_record_uuids : List[str] = list() - self.dlt_record_uuid_to_data : Dict[str, Tuple[TopologyId, DltRecordTypes]] = dict() + LOGGER.debug('Creating Servicer...') + self.dlt_connector_client = DltConnectorClient() + LOGGER.debug('Servicer Created') + self.dlt_record_uuids: List[str] = list() + self.dlt_record_uuid_to_data: Dict[str, Tuple[TopologyId, object]] = dict() + + async def initialize(self): + await self.dlt_connector_client.connect() - def _add_record(self, record_uuid : str, data : Tuple[TopologyId, DltRecordTypes]) -> None: + def _add_record(self, record_uuid: str, data: Tuple[TopologyId, object]) -> None: if record_uuid in self.dlt_record_uuid_to_data: return self.dlt_record_uuid_to_data[record_uuid] = data self.dlt_record_uuids.append(record_uuid) - def add_device(self, topology_id : TopologyId, device : Device) -> None: + def add_device(self, topology_id: TopologyId, device: Device) -> None: topology_uuid = topology_id.topology_uuid.uuid device_uuid = device.device_id.device_uuid.uuid - record_uuid = '{:s}:device:{:s}'.format(topology_uuid, device_uuid) + record_uuid = f'{topology_uuid}:device:{device_uuid}' self._add_record(record_uuid, (topology_id, device)) - def add_link(self, topology_id : TopologyId, link : Link) -> None: + def add_link(self, topology_id: TopologyId, link: Link) -> None: topology_uuid = topology_id.topology_uuid.uuid link_uuid = link.link_id.link_uuid.uuid - record_uuid = '{:s}:link:{:s}'.format(topology_uuid, link_uuid) + record_uuid = f'{topology_uuid}:link:{link_uuid}' self._add_record(record_uuid, (topology_id, link)) - def add_service(self, topology_id : TopologyId, service : Service) -> None: + def add_service(self, topology_id: TopologyId, service: Service) -> None: topology_uuid = topology_id.topology_uuid.uuid context_uuid = service.service_id.context_id.context_uuid.uuid service_uuid = service.service_id.service_uuid.uuid - record_uuid = '{:s}:service:{:s}/{:s}'.format(topology_uuid, context_uuid, service_uuid) + record_uuid = f'{topology_uuid}:service:{context_uuid}/{service_uuid}' self._add_record(record_uuid, (topology_id, service)) - def add_slice(self, topology_id : TopologyId, slice_ : Slice) -> None: + def add_slice(self, topology_id: TopologyId, slice_: Slice) -> None: topology_uuid = topology_id.topology_uuid.uuid context_uuid = slice_.slice_id.context_id.context_uuid.uuid slice_uuid = slice_.slice_id.slice_uuid.uuid - record_uuid = '{:s}:slice:{:s}/{:s}'.format(topology_uuid, context_uuid, slice_uuid) + record_uuid = f'{topology_uuid}:slice:{context_uuid}/{slice_uuid}' self._add_record(record_uuid, (topology_id, slice_)) - def commit(self) -> None: + async def commit(self) -> None: + if not self.dlt_connector_client: + LOGGER.error('DLT Connector Client is None, cannot commit records.') + return + tasks = [] # List to hold all the async tasks + for dlt_record_uuid in self.dlt_record_uuids: - topology_id,dlt_record = self.dlt_record_uuid_to_data[dlt_record_uuid] + topology_id, dlt_record = self.dlt_record_uuid_to_data[dlt_record_uuid] if isinstance(dlt_record, Device): - #device_id = self.context_client.SetDevice(dlt_record) # This causes events to be triggered infinitely. device_id = dlt_record.device_id - #LOGGER.debug('DEVICE_ID: ({:s})'.format(grpc_message_to_json_string(device_id))) if self.dlt_connector_client is None: continue dlt_device_id = DltDeviceId() - dlt_device_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member - dlt_device_id.device_id.CopyFrom(device_id) # pylint: disable=no-member - self.dlt_connector_client.RecordDevice(dlt_device_id) + dlt_device_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member + dlt_device_id.device_id.CopyFrom(device_id) # pylint: disable=no-member + tasks.append(self.dlt_connector_client.RecordDevice(dlt_device_id)) +# await self.dlt_connector_client.RecordDevice(dlt_device_id) elif isinstance(dlt_record, Link): - #link_id = self.context_client.SetLink(dlt_record) link_id = dlt_record.link_id if self.dlt_connector_client is None: continue dlt_link_id = DltLinkId() - dlt_link_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member - dlt_link_id.link_id.CopyFrom(link_id) # pylint: disable=no-member - self.dlt_connector_client.RecordLink(dlt_link_id) + dlt_link_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member + dlt_link_id.link_id.CopyFrom(link_id) # pylint: disable=no-member + tasks.append(self.dlt_connector_client.RecordLink(dlt_link_id)) + #await self.dlt_connector_client.RecordLink(dlt_link_id) elif isinstance(dlt_record, Service): - #service_id = self.context_client.SetService(dlt_record) service_id = dlt_record.service_id if self.dlt_connector_client is None: continue dlt_service_id = DltServiceId() - dlt_service_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member - dlt_service_id.service_id.CopyFrom(service_id) # pylint: disable=no-member - self.dlt_connector_client.RecordService(dlt_service_id) + dlt_service_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member + dlt_service_id.service_id.CopyFrom(service_id) # pylint: disable=no-member + tasks.append(self.dlt_connector_client.RecordService(dlt_service_id)) + #await self.dlt_connector_client.RecordService(dlt_service_id) elif isinstance(dlt_record, Slice): - #slice_id = self.context_client.SetSlice(dlt_record) slice_id = dlt_record.slice_id if self.dlt_connector_client is None: continue dlt_slice_id = DltSliceId() - dlt_slice_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member - dlt_slice_id.slice_id.CopyFrom(slice_id) # pylint: disable=no-member - self.dlt_connector_client.RecordSlice(dlt_slice_id) + dlt_slice_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member + dlt_slice_id.slice_id.CopyFrom(slice_id) # pylint: disable=no-member + tasks.append(self.dlt_connector_client.RecordSlice(dlt_slice_id)) + #await self.dlt_connector_client.RecordSlice(dlt_slice_id) else: - LOGGER.error('Unsupported Record({:s})'.format(str(dlt_record))) + LOGGER.error(f'Unsupported Record({str(dlt_record)})') + + if tasks: + await asyncio.gather(*tasks) # Run all the tasks concurrently + diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index 0e94159c4..c5660e43d 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -1,5 +1,20 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging import threading +import asyncio from typing import Dict, Optional from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum @@ -14,7 +29,6 @@ from common.tools.object_factory.Device import json_device_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient from context.client.EventsCollector import EventsCollector -from dlt.connector.client.DltConnectorClient import DltConnectorClient from .DltRecordSender import DltRecordSender from .Types import EventTypes @@ -37,43 +51,54 @@ class DLTRecorder(threading.Thread): self.terminate.set() def run(self) -> None: + asyncio.run(self._run()) + + async def _run(self) -> None: self.context_client.connect() create_context(self.context_client, DEFAULT_CONTEXT_NAME) - self.create_topologies() + #self.create_topologies() self.context_event_collector.start() + + tasks = [] + batch_timeout = 1 # Time in seconds to wait before processing whatever tasks are available while not self.terminate.is_set(): event = self.context_event_collector.get_event(timeout=0.1) if event is None: continue LOGGER.info('Processing Event({:s})...'.format(grpc_message_to_json_string(event))) - self.update_record(event) + task = asyncio.create_task(self.update_record(event)) + tasks.append(task) + LOGGER.debug('Task for event scheduled.') + # Limit the number of concurrent tasks + # If we have enough tasks or it's time to process them + if len(tasks) >= 10 or (tasks and len(tasks) > 0 and await asyncio.sleep(batch_timeout)): + try: + await asyncio.gather(*tasks) + except Exception as e: + LOGGER.error(f"Error while processing tasks: {e}") + finally: + tasks = [] # Clear the list after processing + await asyncio.gather(*tasks) + tasks = [] # Clear the list after processing + # Process any remaining tasks when stopping + if tasks: + try: + await asyncio.gather(*tasks) + except Exception as e: + LOGGER.error(f"Error while processing remaining tasks: {e}") self.context_event_collector.stop() self.context_client.close() - def create_topologies(self): - topology_uuids = [DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME] - create_missing_topologies(self.context_client, ADMIN_CONTEXT_ID, topology_uuids) - - def get_dlt_connector_client(self) -> Optional[DltConnectorClient]: - # Always enable DLT for testing - dlt_connector_client = DltConnectorClient() - dlt_connector_client.connect() - return dlt_connector_client - # env_vars = find_environment_variables([ - # get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_HOST), - # get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), - # ]) - # if len(env_vars) == 2: - # dlt_connector_client = DltConnectorClient() - # dlt_connector_client.connect() - # return dlt_connector_client - # return None - - def update_record(self, event: EventTypes) -> None: - dlt_connector_client = self.get_dlt_connector_client() - dlt_record_sender = DltRecordSender(self.context_client, dlt_connector_client) + #def create_topologies(self): + #topology_uuids = [DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME] + #create_missing_topologies(self.context_client, ADMIN_CONTEXT_ID, topology_uuids) + + async def update_record(self, event: EventTypes) -> None: + dlt_record_sender = DltRecordSender(self.context_client) + await dlt_record_sender.initialize() # Ensure DltRecordSender is initialized asynchronously + LOGGER.debug('STARTING processing event: {:s}'.format(grpc_message_to_json_string(event))) if isinstance(event, ContextEvent): LOGGER.debug('Processing ContextEvent({:s})'.format(grpc_message_to_json_string(event))) @@ -84,7 +109,7 @@ class DLTRecorder(threading.Thread): self.process_topology_event(event, dlt_record_sender) elif isinstance(event, DeviceEvent): - LOGGER.debug('Processing DeviceEvent({:s})'.format(grpc_message_to_json_string(event))) + LOGGER.debug('Processing DeviceEvent ASYNC({:s})'.format(grpc_message_to_json_string(event))) self.process_device_event(event, dlt_record_sender) elif isinstance(event, LinkEvent): @@ -94,9 +119,10 @@ class DLTRecorder(threading.Thread): else: LOGGER.warning('Unsupported Event({:s})'.format(grpc_message_to_json_string(event))) - dlt_record_sender.commit() - if dlt_connector_client is not None: - dlt_connector_client.close() + await dlt_record_sender.commit() + #await asyncio.sleep(2) # Simulates processing time + LOGGER.debug('Finished processing event: {:s}'.format(grpc_message_to_json_string(event))) + def process_topology_event(self, event: TopologyEvent, dlt_record_sender: DltRecordSender) -> None: topology_id = event.topology_id @@ -117,6 +143,7 @@ class DLTRecorder(threading.Thread): if ((context_uuid == DEFAULT_CONTEXT_NAME) or (context_name == DEFAULT_CONTEXT_NAME)) and \ (topology_uuid not in topology_uuids) and (topology_name not in topology_uuids): + LOGGER.debug('DEVICES({:s})'.format(grpc_message_to_json_string(topology_details.devices))) for device in topology_details.devices: LOGGER.debug('DEVICE_INFO_TOPO({:s})'.format(grpc_message_to_json_string(device))) dlt_record_sender.add_device(topology_id, device) @@ -164,3 +191,4 @@ class DLTRecorder(threading.Thread): dlt_record_sender.add_link(topology_id, link) else: LOGGER.warning(f"Topology not found for link {link_id.link_uuid.uuid}") + -- GitLab From 706777124ea90accd341480bb18b761c89473f17 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 1 Aug 2024 12:53:52 +0000 Subject: [PATCH 442/602] changes to manage Kafka enviornment variable efficiently - KFK_SERVER_PORT and KFK_REDOPLY added into my_deploy.sh file. - refines kafka env variables import --- my_deploy.sh | 5 +++++ src/common/tools/kafka/Variables.py | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/my_deploy.sh b/my_deploy.sh index b89df7481..45e0d1301 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -181,3 +181,8 @@ export GRAF_EXT_PORT_HTTP="3000" # Set the namespace where Apache Kafka will be deployed. export KFK_NAMESPACE="kafka" +# Set the port Apache Kafka server will be exposed to. +export KFK_SERVER_PORT="9092" + +# Set the flag to YES for redeploying of Apache Kafka +export KFK_REDEPLOY="" diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 9abc32b3e..e3ee2016a 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -23,11 +23,11 @@ LOGGER = logging.getLogger(__name__) class KafkaConfig(Enum): KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' - KFK_NAMESPACE = get_setting('KFK_NAMESPACE') - KFK_PORT = get_setting('KFK_SERVER_PORT') - # SERVER_ADDRESS = "127.0.0.1:9092" + KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = get_setting('KFK_SERVER_PORT') + # SERVER_ADDRESS = "127.0.0.1:9092" SERVER_ADDRESS = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) - ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) + ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) class KafkaTopic(Enum): REQUEST = 'topic_request' -- GitLab From 494b4cd712b559ce0d04225379d309dca07e2f07 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 09:41:59 +0000 Subject: [PATCH 443/602] Improvement in SelectKpiValues method. - Added "GetKpiSampleType" method to extract KpiSampleType based on KpiId. - Added PromtheusConnect method to query Prometheus from prometheus_api_client library. - KpiManagerClient added in DockerFile - prometheus_api_client added in requirement file. --- src/kpi_value_api/Dockerfile | 2 + src/kpi_value_api/requirements.in | 1 + .../service/KpiValueApiServiceServicerImpl.py | 93 ++++++++++++------- .../service/MetricWriterToPrometheus.py | 2 +- 4 files changed, 66 insertions(+), 32 deletions(-) diff --git a/src/kpi_value_api/Dockerfile b/src/kpi_value_api/Dockerfile index 7dd8d307b..25b8da931 100644 --- a/src/kpi_value_api/Dockerfile +++ b/src/kpi_value_api/Dockerfile @@ -63,6 +63,8 @@ RUN python3 -m pip install -r requirements.txt # Add component files into working directory WORKDIR /var/teraflow COPY src/kpi_value_api/. kpi_value_api/ +COPY src/kpi_manager/__init__.py kpi_manager/__init__.py +COPY src/kpi_manager/client/. kpi_manager/client/ # Start the service ENTRYPOINT ["python", "-m", "kpi_value_api.service"] diff --git a/src/kpi_value_api/requirements.in b/src/kpi_value_api/requirements.in index 7e4694109..f5695906a 100644 --- a/src/kpi_value_api/requirements.in +++ b/src/kpi_value_api/requirements.in @@ -14,3 +14,4 @@ confluent-kafka==2.3.* requests==2.27.* +prometheus-api-client==0.5.3 \ No newline at end of file diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index 1559457d7..b2ebecad0 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -12,18 +12,23 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, grpc, requests +import logging, grpc from typing import Tuple, Any -from datetime import datetime from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from common.proto.context_pb2 import Empty +from common.proto.kpi_sample_types_pb2 import KpiSampleType +from common.proto.kpi_manager_pb2 import KpiDescriptor, KpiId from common.proto.kpi_value_api_pb2_grpc import KpiValueAPIServiceServicer from common.proto.kpi_value_api_pb2 import KpiValueList, KpiValueFilter, KpiValue, KpiValueType from confluent_kafka import Producer as KafkaProducer +from prometheus_api_client import PrometheusConnect +from prometheus_api_client.utils import parse_datetime + +from kpi_manager.client.KpiManagerClient import KpiManagerClient LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('KpiValueAPI', 'NBIgRPC') @@ -63,40 +68,67 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): ) -> KpiValueList: LOGGER.debug('StoreKpiValues: Received gRPC message object: {:}'.format(request)) response = KpiValueList() - metrics = [kpi.kpi_id for kpi in request.kpi_id] - start_timestamps = [timestamp for timestamp in request.start_timestamp] - end_timestamps = [timestamp for timestamp in request.end_timestamp] - results = [] + + kpi_manager_client = KpiManagerClient() + prom_connect = PrometheusConnect(url=PROM_URL) - for start, end in zip(start_timestamps, end_timestamps): - start_str = datetime.fromtimestamp(start.seconds).isoformat() + "Z" - end_str = datetime.fromtimestamp(end.seconds).isoformat() + "Z" + metrics = [self.GetKpiSampleType(kpi, kpi_manager_client) for kpi in request.kpi_id] + start_timestamps = [parse_datetime(timestamp) for timestamp in request.start_timestamp] + end_timestamps = [parse_datetime(timestamp) for timestamp in request.end_timestamp] + prom_response = [] + for start_time, end_time in zip(start_timestamps, end_timestamps): for metric in metrics: - url = f'{PROM_URL}/api/v1/query_range' - params = { - 'query': metric, - 'start': start_str, - 'end' : end_str, - 'step' : '30s' # or any other step you need - } - response = requests.get(url, params=params) - if response.status_code == 200: - data = response.json() - for result in data['data']['result']: - for value in result['values']: - kpi_value = KpiValue( - kpi_id=metric, - timestamp=str(seconds=value[0]), - kpi_value_type=self._convert_value_to_kpi_value_type(value[1]) - ) - results.append(kpi_value) + # print(start_time, end_time, metric) + prom_response.append( + prom_connect.custom_query_range( + query = metric, # this is the metric name and label config + start_time = start_time, + end_time = end_time, + step = 30, # or any other step value (missing in gRPC Filter request) + ) + ) + + for single_resposne in prom_response: + # print ("{:}".format(single_resposne)) + for record in single_resposne: + # print("Record >>> kpi: {:} >>> time & values set: {:}".format(record['metric']['__name__'], record['values'])) + for value in record['values']: + # print("{:} - {:}".format(record['metric']['__name__'], value)) + kpi_value = KpiValue() + kpi_value.kpi_id.kpi_id = record['metric']['__name__'], + kpi_value.timestamp = value[0], + kpi_value.kpi_value_type = self.ConverValueToKpiValueType(value[1]) + response.kpi_value_list.append(kpi_value) + return response + + def GetKpiSampleType(self, kpi_value: str, kpi_manager_client): + print("--- START -----") - def _convert_value_to_kpi_value_type(self, value): + kpi_id = KpiId() + kpi_id.kpi_id.uuid = kpi_value.kpi_id.kpi_id.uuid + # print("KpiId generated: {:}".format(kpi_id)) + + try: + kpi_descriptor_object = KpiDescriptor() + kpi_descriptor_object = kpi_manager_client.GetKpiDescriptor(kpi_id) + # TODO: why kpi_descriptor_object recevies a KpiDescriptor type object not Empty type object??? + if kpi_descriptor_object.kpi_id.kpi_id.uuid == kpi_id.kpi_id.uuid: + LOGGER.info("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) + print("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) + return KpiSampleType.Name(kpi_descriptor_object.kpi_sample_type) # extract and return the name of KpiSampleType + else: + LOGGER.info("No KPI Descriptor found in DB for Kpi ID: {:}".format(kpi_id)) + print("No KPI Descriptor found in DB for Kpi ID: {:}".format(kpi_id)) + except Exception as e: + LOGGER.info("Unable to get KpiDescriptor. Error: {:}".format(e)) + print ("Unable to get KpiDescriptor. Error: {:}".format(e)) + + def ConverValueToKpiValueType(self, value): # Check if the value is an integer (int64) try: - int64_value = int(value) - return KpiValueType(int64Val=int64_value) + int_value = int(value) + return KpiValueType(int64Val=int_value) except ValueError: pass # Check if the value is a float @@ -112,7 +144,6 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): # If none of the above, treat it as a string return KpiValueType(stringVal=value) - def delivery_callback(self, err, msg): if err: LOGGER.debug('Message delivery failed: {:}'.format(err)) else: LOGGER.debug('Message delivered to topic {:}'.format(msg.topic())) diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py index b68116478..40bffa06e 100644 --- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py +++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py @@ -93,4 +93,4 @@ class MetricWriterToPrometheus: print("Metric {:} is already registered. Skipping.".format(metric_name)) else: LOGGER.error("Error while pushing metric: {}".format(e)) - raise \ No newline at end of file + raise -- GitLab From aca1fe1b241353c4aad9e5fa7dccb99a131794a2 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 09:58:58 +0000 Subject: [PATCH 444/602] Temporarly defines the static value of env variables to test the working of microservice. - KFK_NAMESPACE and KFK_PORT --- src/common/tools/kafka/Variables.py | 6 ++++-- src/kpi_value_writer/service/MetricWriterToPrometheus.py | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index e3ee2016a..168957a26 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -23,8 +23,10 @@ LOGGER = logging.getLogger(__name__) class KafkaConfig(Enum): KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' - KFK_NAMESPACE = get_setting('KFK_NAMESPACE') - KFK_PORT = get_setting('KFK_SERVER_PORT') + KFK_NAMESPACE = 'kafka' + # KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = '9092' + # KFK_PORT = get_setting('KFK_SERVER_PORT') # SERVER_ADDRESS = "127.0.0.1:9092" SERVER_ADDRESS = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py index 40bffa06e..81324b759 100644 --- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py +++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py @@ -94,3 +94,4 @@ class MetricWriterToPrometheus: else: LOGGER.error("Error while pushing metric: {}".format(e)) raise + -- GitLab From d8687c1cdcbe4289c74bd814c0f510cbbe22547a Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 10:04:31 +0000 Subject: [PATCH 445/602] minor changes in code. - refine Kpi_DB.py methods. - improve description of messages. - imporve the text description. --- src/kpi_manager/database/Kpi_DB.py | 4 +--- src/kpi_value_api/tests/messages.py | 5 +++-- src/kpi_value_writer/service/MetricWriterToPrometheus.py | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/kpi_manager/database/Kpi_DB.py b/src/kpi_manager/database/Kpi_DB.py index 530abe457..49ad9c9b5 100644 --- a/src/kpi_manager/database/Kpi_DB.py +++ b/src/kpi_manager/database/Kpi_DB.py @@ -70,8 +70,7 @@ class KpiDB: session.rollback() if "psycopg2.errors.UniqueViolation" in str(e): LOGGER.error(f"Unique key voilation: {row.__class__.__name__} table. {str(e)}") - raise AlreadyExistsException(row.__class__.__name__, row, - extra_details=["Unique key voilation: {:}".format(e)] ) + raise AlreadyExistsException(row.__class__.__name__, row, extra_details=["Unique key voilation: {:}".format(e)] ) else: LOGGER.error(f"Failed to insert new row into {row.__class__.__name__} table. {str(e)}") raise OperationFailedException ("Deletion by column id", extra_details=["unable to delete row {:}".format(e)]) @@ -90,7 +89,6 @@ class KpiDB: print("{:} ID not found, No matching row: {:}".format(model.__name__, id_to_search)) return None except Exception as e: - session.rollback() LOGGER.debug(f"Failed to retrieve {model.__name__} ID. {str(e)}") raise OperationFailedException ("search by column id", extra_details=["unable to search row {:}".format(e)]) finally: diff --git a/src/kpi_value_api/tests/messages.py b/src/kpi_value_api/tests/messages.py index c2a1cbb0b..d8ad14bd4 100644 --- a/src/kpi_value_api/tests/messages.py +++ b/src/kpi_value_api/tests/messages.py @@ -18,8 +18,9 @@ from common.proto.kpi_value_api_pb2 import KpiValue, KpiValueList def create_kpi_value_list(): _create_kpi_value_list = KpiValueList() - # To run this experiment sucessfully, already existing UUID in KPI DB in necessary. - # because the UUID is used to get the descriptor form KPI DB. + # To run this experiment sucessfully, add an existing UUID of a KPI Descriptor from the KPI DB. + # This UUID is used to get the descriptor form the KPI DB. If the Kpi ID does not exists, + # some part of the code won't execute. EXISTING_KPI_IDs = ["725ce3ad-ac67-4373-bd35-8cd9d6a86e09", str(uuid.uuid4()), str(uuid.uuid4())] diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py index 81324b759..f1d079783 100644 --- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py +++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py @@ -63,8 +63,8 @@ class MetricWriterToPrometheus: def create_and_expose_cooked_kpi(self, kpi_descriptor: KpiDescriptor, kpi_value: KpiValue): # merge both gRPC messages into single varible. cooked_kpi = self.merge_kpi_descriptor_and_kpi_value(kpi_descriptor, kpi_value) - tags_to_exclude = {'kpi_description', 'kpi_sample_type', 'kpi_value'} # extracted values will be used as metric tag - metric_tags = [tag for tag in cooked_kpi.keys() if tag not in tags_to_exclude] + tags_to_exclude = {'kpi_description', 'kpi_sample_type', 'kpi_value'} + metric_tags = [tag for tag in cooked_kpi.keys() if tag not in tags_to_exclude] # These values will be used as metric tags metric_name = cooked_kpi['kpi_sample_type'] try: if metric_name not in PROM_METRICS: # Only register the metric, when it doesn't exists -- GitLab From 624a1817fc3faec5f99b044edf54b5d4f5281458 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 14:07:29 +0000 Subject: [PATCH 446/602] Cleaning unit test and messages files. - unused imports and functions are removed --- src/kpi_manager/tests/test_kpi_manager.py | 66 ------------------- .../tests/test_kpi_value_writer.py | 23 +------ 2 files changed, 1 insertion(+), 88 deletions(-) diff --git a/src/kpi_manager/tests/test_kpi_manager.py b/src/kpi_manager/tests/test_kpi_manager.py index da149e3fe..219fdadee 100755 --- a/src/kpi_manager/tests/test_kpi_manager.py +++ b/src/kpi_manager/tests/test_kpi_manager.py @@ -93,13 +93,6 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab # Prepare Environment, should be the first test ################################################## -# # ERROR on this test --- -# def test_prepare_environment( -# context_client : ContextClient, # pylint: disable=redefined-outer-name,unused-argument -# ): -# context_id = json_context_id(DEFAULT_CONTEXT_NAME) -# context_client.SetContext(Context(**json_context(DEFAULT_CONTEXT_NAME))) -# context_client.SetTopology(Topology(**json_topology(DEFAULT_TOPOLOGY_NAME, context_id=context_id))) ########################### # Tests Implementation of Kpi Manager @@ -152,62 +145,3 @@ def test_set_list_of_KPIs(kpi_manager_client): # adding KPI for kpi in KPIs_TO_SEARCH: kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a(kpi)) - - -# ---------- 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()) -# LOGGER.info("Response gRPC message object: {:}".format(response)) -# assert isinstance(response, KpiDescriptor) - -# def test_DeleteKpiDescriptor(kpi_manager_client): -# LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ") -# response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) -# del_response = kpi_manager_client.DeleteKpiDescriptor(response) -# kpi_manager_client.GetKpiDescriptor(response) -# LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response)) -# assert isinstance(del_response, Empty) - -# def test_SelectKpiDescriptor(kpi_manager_client): -# LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ") -# kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a()) -# response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request_a()) -# LOGGER.info("Response gRPC message object: {:}".format(response)) -# assert isinstance(response, KpiDescriptorList) - -# ------------- INITIAL TESTs ---------------- -# Test case that makes use of client fixture to test server's CreateKpi method -# def test_set_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name -# # make call to server -# LOGGER.warning('test_create_kpi requesting') -# for i in range(3): -# response = kpi_manager_client.SetKpiDescriptor(create_kpi_request(str(i+1))) -# LOGGER.debug(str(response)) -# assert isinstance(response, KpiId) - -# # Test case that makes use of client fixture to test server's DeleteKpi method -# def test_delete_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name -# # make call to server -# LOGGER.warning('delete_kpi requesting') -# response = kpi_manager_client.SetKpiDescriptor(create_kpi_request('4')) -# response = kpi_manager_client.DeleteKpiDescriptor(response) -# LOGGER.debug(str(response)) -# assert isinstance(response, Empty) - -# # Test case that makes use of client fixture to test server's GetKpiDescriptor method -# def test_select_kpi_descriptor(kpi_manager_client): # pylint: disable=redefined-outer-name -# LOGGER.warning('test_selectkpidescritor begin') -# response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request()) -# LOGGER.debug(str(response)) -# assert isinstance(response, KpiDescriptorList) diff --git a/src/kpi_value_writer/tests/test_kpi_value_writer.py b/src/kpi_value_writer/tests/test_kpi_value_writer.py index 40593af97..fce043d7f 100755 --- a/src/kpi_value_writer/tests/test_kpi_value_writer.py +++ b/src/kpi_value_writer/tests/test_kpi_value_writer.py @@ -14,32 +14,12 @@ import logging from kpi_value_writer.service.KpiValueWriter import KpiValueWriter -from kpi_value_writer.tests.test_messages import create_kpi_id_request, create_kpi_descriptor_request from common.tools.kafka.Variables import KafkaTopic -from common.proto.kpi_manager_pb2 import KpiDescriptor -from kpi_manager.client.KpiManagerClient import KpiManagerClient -LOGGER = logging.getLogger(__name__) - -# def test_GetKpiDescriptor(): -# LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") -# kpi_manager_client = KpiManagerClient() -# # adding KPI -# LOGGER.info(" --->>> calling SetKpiDescriptor ") -# response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) -# # get KPI -# LOGGER.info(" --->>> calling GetKpiDescriptor with response ID") -# response = kpi_manager_client.GetKpiDescriptor(response_id) -# LOGGER.info("Response gRPC message object: {:}".format(response)) - -# LOGGER.info(" --->>> calling GetKpiDescriptor with random ID") -# rand_response = kpi_manager_client.GetKpiDescriptor(create_kpi_id_request()) -# LOGGER.info("Response gRPC message object: {:}".format(rand_response)) -# LOGGER.info("\n------------------ TEST FINISHED ---------------------\n") -# assert isinstance(response, KpiDescriptor) +LOGGER = logging.getLogger(__name__) # -------- Initial Test ---------------- def test_validate_kafka_topics(): @@ -50,4 +30,3 @@ def test_validate_kafka_topics(): def test_KafkaConsumer(): LOGGER.debug(" --->>> test_kafka_consumer: START <<<--- ") KpiValueWriter.RunKafkaConsumer() - -- GitLab From 793f7ffa826859536507b804e31738be453a53b6 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 14:09:52 +0000 Subject: [PATCH 447/602] Updated Promtheus URL - PROM_URL variable is updated with FQDN of Prometheus. --- src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index b2ebecad0..5e7c3d139 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -32,7 +32,7 @@ from kpi_manager.client.KpiManagerClient import KpiManagerClient LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('KpiValueAPI', 'NBIgRPC') -PROM_URL = "http://localhost:9090" +PROM_URL = "http://prometheus-k8s.monitoring.svc.cluster.local:9090" # TODO: updated with the env variables class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): def __init__(self): @@ -79,7 +79,8 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): prom_response = [] for start_time, end_time in zip(start_timestamps, end_timestamps): for metric in metrics: - # print(start_time, end_time, metric) + print(start_time, end_time, metric) + LOGGER.debug(">>> Query: {:}".format(metric)) prom_response.append( prom_connect.custom_query_range( query = metric, # this is the metric name and label config -- GitLab From 557efe071666d99c8f7ed34695c820368c494373 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 15:15:03 +0000 Subject: [PATCH 448/602] changes in README files. - README files of kpi manager/value writer/api are updated to reflect new changes. --- src/kpi_manager/README.md | 27 +++++++++++---------------- src/kpi_value_api/README.md | 23 +++++++++++++++++++++++ src/kpi_value_writer/README.md | 32 ++++++++++---------------------- 3 files changed, 44 insertions(+), 38 deletions(-) create mode 100644 src/kpi_value_api/README.md diff --git a/src/kpi_manager/README.md b/src/kpi_manager/README.md index c1feadcc4..6e9b56d93 100644 --- a/src/kpi_manager/README.md +++ b/src/kpi_manager/README.md @@ -1,29 +1,24 @@ # How to locally run and test KPI manager micro-service -## --- File links need to be updated. --- ### Pre-requisets -The following requirements should be fulfilled before the execuation of KPI management service. +Ensure the following requirements are met before executing the KPI management service: -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_management/kpi_manager/database/tests/KpiDBtests.py) python file enlist the functions to create tables and database and -[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. +1. A virtual enviornment exist with all the required packages listed in ["requirements.in"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_manager/requirements.in) sucessfully installed. +2. Verify the creation of required database and table. The +[KPI DB test](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_manager/tests/test_kpi_db.py) python file lists the functions to create tables and the database. The +[KPI Engine](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_manager/database/KpiEngine.py) file contains the DB string. ### Messages format templates -["Messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/kpi_manager/tests/test_messages.py) python file enlist the basic gRPC messages format used during the testing. +The ["messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_manager/tests/test_messages.py) python file contains templates for creating gRPC messages. -### Test file -["KPI management test"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/kpi_manager/tests/test_kpi_manager.py) python file enlist different tests conducted during the experiment. +### Unit test file +The ["KPI manager test"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_manager/tests/test_kpi_manager.py) python file lists various tests conducted to validate functionality. ### 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. Call `verify_tables` to verify the existence of KPI table. -2. Call the gRPC method `SetKpiDescriptor(KpiDescriptor)->KpiId` to add the KpiDescriptor in `Kpi` DB. `KpiDescriptor` and `KpiId` are both pre-defined gRPC message types. +2. Call the gRPC method `SetKpiDescriptor(KpiDescriptor)->KpiId` to add the KpiDescriptor to the `Kpi` DB. `KpiDescriptor` and `KpiId` are both pre-defined gRPC message types. -3. Call `GetKpiDescriptor(KpiId)->KpiDescriptor` to read the `KpiDescriptor` from DB and `DeleteKpiDescriptor(KpiId)` to delete the `KpiDescriptor` from DB. +3. Call `GetKpiDescriptor(KpiId)->KpiDescriptor` to read the `KpiDescriptor` from the DB and `DeleteKpiDescriptor(KpiId)` to delete the `KpiDescriptor` from the DB. -4. Call `SelectKpiDescriptor(KpiDescriptorFilter)->KpiDescriptorList` to get all `KpiDescriptor` objects that matches the filter criteria. `KpiDescriptorFilter` and `KpiDescriptorList` are pre-defined gRPC message types. - -## For KPI composer and KPI writer -The functionalities of KPI composer and writer is heavily dependent upon Telemetery service. Therfore, these services has other pre-requsites that are mention [here](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/telemetry/requirements.in). +4. Call `SelectKpiDescriptor(KpiDescriptorFilter)->KpiDescriptorList` to get all `KpiDescriptor` objects that matches filter criteria. `KpiDescriptorFilter` and `KpiDescriptorList` are pre-defined gRPC message types. diff --git a/src/kpi_value_api/README.md b/src/kpi_value_api/README.md new file mode 100644 index 000000000..70ba2c5e7 --- /dev/null +++ b/src/kpi_value_api/README.md @@ -0,0 +1,23 @@ +# How to locally run and test KPI Value API micro-service + +### Pre-requisets +Ensure the following requirements are met before executing the KPI Value API service. + +1. The KPI Manger service is running and Apache Kafka is running. + +2. A virtual enviornment exist with all the required packages listed in ["requirements.in"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_api/requirements.in) file sucessfully installed. + +3. Call the ["create_all_topics()"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/common/tools/kafka/Variables.py) function to verify the existence of all required topics on kafka. + +### Messages format templates +The ["messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_api/tests/messages.py) python file contains templates for creating gRPC messages. + +### Unit test file +The ["KPI Value API test"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_api/tests/test_kpi_value_api.py) python file enlist various tests conducted to validate functionality. + +### Flow of execution (Kpi Maanager Service functions) +1. Call the `create_new_topic_if_not_exists()` method to create any new topics if needed. + +2. Call `StoreKpiValues(KpiValueList)` to produce `Kpi Value` on a Kafka Topic. (The `KpiValueWriter` microservice will consume and process the `Kpi Value`) + +3. Call `SelectKpiValues(KpiValueFilter) -> KpiValueList` to read metric from the Prometheus DB. diff --git a/src/kpi_value_writer/README.md b/src/kpi_value_writer/README.md index 72ba6e559..c45a0e395 100644 --- a/src/kpi_value_writer/README.md +++ b/src/kpi_value_writer/README.md @@ -1,29 +1,17 @@ -# How to locally run and test KPI manager micro-service +# How to locally run and test the KPI Value Writer micro-service -## --- File links need to be updated. --- ### Pre-requisets -The following requirements should be fulfilled before the execuation of KPI management service. +Ensure the following requirements are meet before executing the KPI Value Writer service> -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_management/kpi_manager/database/tests/KpiDBtests.py) python file enlist the functions to create tables and database and -[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. +1. The KPI Manger and KPI Value API services are running and Apache Kafka is running. -### Messages format templates -["Messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/kpi_manager/tests/test_messages.py) python file enlist the basic gRPC messages format used during the testing. - -### Test file -["KPI management test"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/kpi_manager/tests/test_kpi_manager.py) python file enlist 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. Call `verify_tables` to verify the existence of KPI table. +2. A Virtual enviornment exist with all the required packages listed in the ["requirements.in"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_writer/requirements.in) file installed sucessfully. -2. Call the gRPC method `SetKpiDescriptor(KpiDescriptor)->KpiId` to add the KpiDescriptor in `Kpi` DB. `KpiDescriptor` and `KpiId` are both pre-defined gRPC message types. - -3. Call `GetKpiDescriptor(KpiId)->KpiDescriptor` to read the `KpiDescriptor` from DB and `DeleteKpiDescriptor(KpiId)` to delete the `KpiDescriptor` from DB. +### Messages format templates +The ["messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_writer/tests/test_messages.py) python file contains the templates to create gRPC messages. -4. Call `SelectKpiDescriptor(KpiDescriptorFilter)->KpiDescriptorList` to get all `KpiDescriptor` objects that matches the filter criteria. `KpiDescriptorFilter` and `KpiDescriptorList` are pre-defined gRPC message types. +### Unit test file +The ["KPI Value API test"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_writer/tests/test_kpi_value_writer.py) python file enlist various tests conducted to validate functionality. -## For KPI composer and KPI writer -The functionalities of KPI composer and writer is heavily dependent upon Telemetery service. Therfore, these services has other pre-requsites that are mention [here](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/telemetry/requirements.in). \ No newline at end of file +### Flow of execution +1. Call the `RunKafkaConsumer` method from the `KpiValueWriter` class to start consuming the `KPI Value` generated by the `KPI Value API` or `Telemetry`. For every valid `KPI Value` consumer from Kafka, it invokes the `PrometheusWriter` class to prepare and push the metric to the Promethues DB. -- GitLab From f8eea9eafb582828e0dd14393f2f212a7bb79009 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 5 Aug 2024 12:13:34 +0000 Subject: [PATCH 449/602] Changes are made to restructure the Telemetry DB operations. - TelemetryEngine.py is updated. - TelemetryModel.py is refined. - Optimized DB operation were added in TelemetryDB.py --- src/telemetry/database/TelemetryDB.py | 137 ++++++++++ src/telemetry/database/TelemetryDBmanager.py | 248 ------------------- src/telemetry/database/TelemetryEngine.py | 39 +-- src/telemetry/database/TelemetryModel.py | 23 +- src/telemetry/database/managementDB.py | 138 ----------- 5 files changed, 160 insertions(+), 425 deletions(-) create mode 100644 src/telemetry/database/TelemetryDB.py delete mode 100644 src/telemetry/database/TelemetryDBmanager.py delete mode 100644 src/telemetry/database/managementDB.py diff --git a/src/telemetry/database/TelemetryDB.py b/src/telemetry/database/TelemetryDB.py new file mode 100644 index 000000000..b5b0c4c7e --- /dev/null +++ b/src/telemetry/database/TelemetryDB.py @@ -0,0 +1,137 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging +import sqlalchemy_utils +from sqlalchemy.orm import sessionmaker +from telemetry.database.TelemetryModel import Collector as CollectorModel +from telemetry.database.TelemetryEngine import TelemetryEngine +from common.method_wrappers.ServiceExceptions import ( + OperationFailedException, AlreadyExistsException ) + +LOGGER = logging.getLogger(__name__) +DB_NAME = "tfs_telemetry" + +class TelemetryDBmanager: + def __init__(self): + self.db_engine = TelemetryEngine.get_engine() + if self.db_engine is None: + LOGGER.error('Unable to get SQLAlchemy DB Engine...') + return False + self.db_name = DB_NAME + self.Session = sessionmaker(bind=self.db_engine) + + def create_database(self): + if not sqlalchemy_utils.database_exists(self.db_engine.url): + LOGGER.debug("Database created. {:}".format(self.db_engine.url)) + sqlalchemy_utils.create_database(self.db_engine.url) + + def drop_database(self) -> None: + if sqlalchemy_utils.database_exists(self.db_engine.url): + sqlalchemy_utils.drop_database(self.db_engine.url) + + def create_tables(self): + try: + CollectorModel.metadata.create_all(self.db_engine) # type: ignore + LOGGER.debug("Tables created in the database: {:}".format(self.db_name)) + except Exception as e: + LOGGER.debug("Tables cannot be created in the database. {:s}".format(str(e))) + raise OperationFailedException ("Tables can't be created", extra_details=["unable to create table {:}".format(e)]) + + def verify_tables(self): + try: + with self.db_engine.connect() as connection: + result = connection.execute("SHOW TABLES;") + tables = result.fetchall() + LOGGER.info("Tables in DB: {:}".format(tables)) + except Exception as e: + LOGGER.info("Unable to fetch Table names. {:s}".format(str(e))) + +# ----------------- CURD METHODs --------------------- + + def add_row_to_db(self, row): + session = self.Session() + try: + session.add(row) + session.commit() + LOGGER.debug(f"Row inserted into {row.__class__.__name__} table.") + return True + except Exception as e: + session.rollback() + if "psycopg2.errors.UniqueViolation" in str(e): + LOGGER.error(f"Unique key voilation: {row.__class__.__name__} table. {str(e)}") + raise AlreadyExistsException(row.__class__.__name__, row, + extra_details=["Unique key voilation: {:}".format(e)] ) + else: + LOGGER.error(f"Failed to insert new row into {row.__class__.__name__} table. {str(e)}") + raise OperationFailedException ("Deletion by column id", extra_details=["unable to delete row {:}".format(e)]) + finally: + session.close() + + def search_db_row_by_id(self, model, col_name, id_to_search): + session = self.Session() + try: + entity = session.query(model).filter_by(**{col_name: id_to_search}).first() + if entity: + # LOGGER.debug(f"{model.__name__} ID found: {str(entity)}") + return entity + else: + LOGGER.debug(f"{model.__name__} ID not found, No matching row: {str(id_to_search)}") + print("{:} ID not found, No matching row: {:}".format(model.__name__, id_to_search)) + return None + except Exception as e: + session.rollback() + LOGGER.debug(f"Failed to retrieve {model.__name__} ID. {str(e)}") + raise OperationFailedException ("search by column id", extra_details=["unable to search row {:}".format(e)]) + finally: + session.close() + + def delete_db_row_by_id(self, model, col_name, id_to_search): + session = self.Session() + try: + record = session.query(model).filter_by(**{col_name: id_to_search}).first() + if record: + session.delete(record) + session.commit() + LOGGER.debug("Deleted %s with %s: %s", model.__name__, col_name, id_to_search) + else: + LOGGER.debug("%s with %s %s not found", model.__name__, col_name, id_to_search) + return None + except Exception as e: + session.rollback() + LOGGER.error("Error deleting %s with %s %s: %s", model.__name__, col_name, id_to_search, e) + raise OperationFailedException ("Deletion by column id", extra_details=["unable to delete row {:}".format(e)]) + finally: + session.close() + + def select_with_filter(self, model, filter_object): + session = self.Session() + try: + query = session.query(CollectorModel) + # Apply filters based on the filter_object + if filter_object.kpi_id: + query = query.filter(CollectorModel.kpi_id.in_([k.kpi_id.uuid for k in filter_object.kpi_id])) + result = query.all() + + if result: + LOGGER.debug(f"Fetched filtered rows from {model.__name__} table with filters: {filter_object}") # - Results: {result} + else: + LOGGER.debug(f"No matching row found in {model.__name__} table with filters: {filter_object}") + return result + except Exception as e: + LOGGER.error(f"Error fetching filtered rows from {model.__name__} table with filters {filter_object} ::: {e}") + raise OperationFailedException ("Select by filter", extra_details=["unable to apply the filter {:}".format(e)]) + finally: + session.close() + diff --git a/src/telemetry/database/TelemetryDBmanager.py b/src/telemetry/database/TelemetryDBmanager.py deleted file mode 100644 index b558180a9..000000000 --- a/src/telemetry/database/TelemetryDBmanager.py +++ /dev/null @@ -1,248 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging, time -import sqlalchemy -from sqlalchemy import inspect, MetaData, Table -from sqlalchemy.orm import sessionmaker -from telemetry.database.TelemetryModel import Collector as CollectorModel -from telemetry.database.TelemetryModel import Kpi as KpiModel -from sqlalchemy.ext.declarative import declarative_base -from telemetry.database.TelemetryEngine import TelemetryEngine -from common.proto.kpi_manager_pb2 import KpiDescriptor, KpiId -from common.proto.telemetry_frontend_pb2 import Collector, CollectorId -from sqlalchemy.exc import SQLAlchemyError -from telemetry.database.TelemetryModel import Base - -LOGGER = logging.getLogger(__name__) -DB_NAME = "telemetryfrontend" - -class TelemetryDBmanager: - def __init__(self): - self.db_engine = TelemetryEngine.get_engine() - if self.db_engine is None: - LOGGER.error('Unable to get SQLAlchemy DB Engine...') - return False - self.db_name = DB_NAME - self.Session = sessionmaker(bind=self.db_engine) - - def create_database(self): - try: - # with self.db_engine.connect() as connection: - # connection.execute(f"CREATE DATABASE {self.db_name};") - TelemetryEngine.create_database(self.db_engine) - LOGGER.info('TelemetryDBmanager initalized DB Name: {:}'.format(self.db_name)) - return True - except Exception as e: # pylint: disable=bare-except # pragma: no cover - LOGGER.exception('Failed to check/create the database: {:s}'.format(str(e))) - return False - - def create_tables(self): - try: - Base.metadata.create_all(self.db_engine) # type: ignore - LOGGER.info("Tables created in database ({:}) the as per Models".format(self.db_name)) - except Exception as e: - LOGGER.info("Tables cannot be created in the TelemetryFrontend database. {:s}".format(str(e))) - - def verify_tables(self): - try: - with self.db_engine.connect() as connection: - result = connection.execute("SHOW TABLES;") - tables = result.fetchall() - LOGGER.info("Tables in DB: {:}".format(tables)) - except Exception as e: - LOGGER.info("Unable to fetch Table names. {:s}".format(str(e))) - - def drop_table(self, table_to_drop: str): - try: - inspector = inspect(self.db_engine) - existing_tables = inspector.get_table_names() - if table_to_drop in existing_tables: - table = Table(table_to_drop, MetaData(), autoload_with=self.db_engine) - table.drop(self.db_engine) - LOGGER.info("Tables delete in the DB Name: {:}".format(self.db_name)) - else: - LOGGER.warning("No table {:} in database {:} ".format(table_to_drop, DB_NAME)) - except Exception as e: - LOGGER.info("Tables cannot be deleted in the {:} database. {:s}".format(DB_NAME, str(e))) - - def list_databases(self): - query = "SHOW DATABASES" - with self.db_engine.connect() as connection: - result = connection.execute(query) - databases = [row[0] for row in result] - LOGGER.info("List of available DBs: {:}".format(databases)) - -# ------------------ INSERT METHODs -------------------------------------- - - def inser_kpi(self, request: KpiDescriptor): - session = self.Session() - try: - # Create a new Kpi instance - 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.service_id.service_uuid.uuid - kpi_to_insert.endpoint_id = request.device_id.device_uuid.uuid - kpi_to_insert.service_id = request.slice_id.slice_uuid.uuid - kpi_to_insert.slice_id = request.endpoint_id.endpoint_uuid.uuid - kpi_to_insert.connection_id = request.connection_id.connection_uuid.uuid - # kpi_to_insert.link_id = request.link_id.link_id.uuid - # Add the instance to the session - session.add(kpi_to_insert) - session.commit() - LOGGER.info("Row inserted into kpi table: {:}".format(kpi_to_insert.kpi_id)) - except Exception as e: - session.rollback() - LOGGER.info("Failed to insert new kpi. {:s}".format(str(e))) - finally: - # Close the session - session.close() - - # Function to insert a row into the Collector model - def insert_collector(self, request: Collector): - session = self.Session() - try: - # Create a new Collector instance - collector_to_insert = CollectorModel() - collector_to_insert.collector_id = request.collector_id.collector_id.uuid - collector_to_insert.kpi_id = request.kpi_id.kpi_id.uuid - collector_to_insert.collector = "Test collector description" - collector_to_insert.sampling_duration_s = request.duration_s - collector_to_insert.sampling_interval_s = request.interval_s - collector_to_insert.start_timestamp = time.time() - collector_to_insert.end_timestamp = time.time() - - session.add(collector_to_insert) - session.commit() - LOGGER.info("Row inserted into collector table: {:}".format(collector_to_insert.collector_id)) - except Exception as e: - session.rollback() - LOGGER.info("Failed to insert new collector. {:s}".format(str(e))) - finally: - # Close the session - session.close() - -# ------------------ GET METHODs -------------------------------------- - - def get_kpi_descriptor(self, request: KpiId): - session = self.Session() - try: - kpi_id_to_search = request.kpi_id.uuid - kpi = session.query(KpiModel).filter_by(kpi_id=kpi_id_to_search).first() - if kpi: - LOGGER.info("kpi ID found: {:s}".format(str(kpi))) - return kpi - else: - LOGGER.warning("Kpi ID not found {:s}".format(str(kpi_id_to_search))) - return None - except Exception as e: - session.rollback() - LOGGER.info("Failed to retrieve KPI ID. {:s}".format(str(e))) - raise - finally: - session.close() - - def get_collector(self, request: CollectorId): - session = self.Session() - try: - collector_id_to_search = request.collector_id.uuid - collector = session.query(CollectorModel).filter_by(collector_id=collector_id_to_search).first() - if collector: - LOGGER.info("collector ID found: {:s}".format(str(collector))) - return collector - else: - LOGGER.warning("collector ID not found{:s}".format(str(collector_id_to_search))) - return None - except Exception as e: - session.rollback() - LOGGER.info("Failed to retrieve collector ID. {:s}".format(str(e))) - raise - finally: - session.close() - - # ------------------ SELECT METHODs -------------------------------------- - - def select_kpi_descriptor(self, **filters): - session = self.Session() - try: - query = session.query(KpiModel) - for column, value in filters.items(): - query = query.filter(getattr(KpiModel, column) == value) - result = query.all() - if len(result) != 0: - LOGGER.info("Fetched filtered rows from KPI table with filters : {:s}".format(str(result))) - else: - LOGGER.warning("No matching row found : {:s}".format(str(result))) - return result - except SQLAlchemyError as e: - LOGGER.error("Error fetching filtered rows from KPI table with filters {:}: {:}".format(filters, e)) - return [] - finally: - session.close() - - def select_collector(self, **filters): - session = self.Session() - try: - query = session.query(CollectorModel) - for column, value in filters.items(): - query = query.filter(getattr(CollectorModel, column) == value) - result = query.all() - if len(result) != 0: - LOGGER.info("Fetched filtered rows from KPI table with filters : {:s}".format(str(result))) - else: - LOGGER.warning("No matching row found : {:s}".format(str(result))) - return result - except SQLAlchemyError as e: - LOGGER.error("Error fetching filtered rows from KPI table with filters {:}: {:}".format(filters, e)) - return [] - finally: - session.close() - -# ------------------ DELETE METHODs -------------------------------------- - - def delete_kpi_descriptor(self, request: KpiId): - session = self.Session() - try: - kpi_id_to_delete = request.kpi_id.uuid - kpi = session.query(KpiModel).filter_by(kpi_id=kpi_id_to_delete).first() - if kpi: - session.delete(kpi) - session.commit() - LOGGER.info("Deleted KPI with kpi_id: %s", kpi_id_to_delete) - else: - LOGGER.warning("KPI with kpi_id %s not found", kpi_id_to_delete) - except SQLAlchemyError as e: - session.rollback() - LOGGER.error("Error deleting KPI with kpi_id %s: %s", kpi_id_to_delete, e) - finally: - session.close() - - def delete_collector(self, request: CollectorId): - session = self.Session() - try: - collector_id_to_delete = request.collector_id.uuid - collector = session.query(CollectorModel).filter_by(collector_id=collector_id_to_delete).first() - if collector: - session.delete(collector) - session.commit() - LOGGER.info("Deleted collector with collector_id: %s", collector_id_to_delete) - else: - LOGGER.warning("collector with collector_id %s not found", collector_id_to_delete) - except SQLAlchemyError as e: - session.rollback() - LOGGER.error("Error deleting collector with collector_id %s: %s", collector_id_to_delete, e) - finally: - session.close() \ No newline at end of file diff --git a/src/telemetry/database/TelemetryEngine.py b/src/telemetry/database/TelemetryEngine.py index a563fa09f..bd7cda599 100644 --- a/src/telemetry/database/TelemetryEngine.py +++ b/src/telemetry/database/TelemetryEngine.py @@ -12,34 +12,28 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, sqlalchemy, sqlalchemy_utils -# from common.Settings import get_setting +import logging, sqlalchemy +from common.Settings import get_setting LOGGER = logging.getLogger(__name__) -APP_NAME = 'tfs' -ECHO = False # False: No dump SQL commands and transactions executed CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' # CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' class TelemetryEngine: - # def __init__(self): - # self.engine = self.get_engine() @staticmethod def get_engine() -> sqlalchemy.engine.Engine: - CRDB_NAMESPACE = "crdb" - CRDB_SQL_PORT = "26257" - CRDB_DATABASE = "telemetryfrontend" - CRDB_USERNAME = "tfs" - CRDB_PASSWORD = "tfs123" - CRDB_SSLMODE = "require" - crdb_uri = CRDB_URI_TEMPLATE.format( - CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) - # crdb_uri = CRDB_URI_TEMPLATE.format( - # CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) + crdb_uri = get_setting('CRDB_URI', default=None) + if crdb_uri is None: + CRDB_NAMESPACE = "crdb" + CRDB_SQL_PORT = "26257" + CRDB_DATABASE = "telemetryfrontend" + CRDB_USERNAME = "tfs" + CRDB_PASSWORD = "tfs123" + CRDB_SSLMODE = "require" + crdb_uri = CRDB_URI_TEMPLATE.format( + CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) try: - # engine = sqlalchemy.create_engine( - # crdb_uri, connect_args={'application_name': APP_NAME}, echo=ECHO, future=True) engine = sqlalchemy.create_engine(crdb_uri, echo=False) LOGGER.info(' TelemetryDBmanager initalized with DB URL: {:}'.format(crdb_uri)) except: # pylint: disable=bare-except # pragma: no cover @@ -47,13 +41,4 @@ class TelemetryEngine: return None # type: ignore return engine # type: ignore - @staticmethod - def create_database(engine : sqlalchemy.engine.Engine) -> None: - if not sqlalchemy_utils.database_exists(engine.url): - LOGGER.info("Database created. {:}".format(engine.url)) - sqlalchemy_utils.create_database(engine.url) - @staticmethod - def drop_database(engine : sqlalchemy.engine.Engine) -> None: - if sqlalchemy_utils.database_exists(engine.url): - sqlalchemy_utils.drop_database(engine.url) diff --git a/src/telemetry/database/TelemetryModel.py b/src/telemetry/database/TelemetryModel.py index be4f0969c..95f692e4b 100644 --- a/src/telemetry/database/TelemetryModel.py +++ b/src/telemetry/database/TelemetryModel.py @@ -14,9 +14,7 @@ import logging from sqlalchemy.dialects.postgresql import UUID -from sqlalchemy import Column, Integer, String, Float, Text, ForeignKey -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import sessionmaker, relationship +from sqlalchemy import Column, String, Float from sqlalchemy.orm import registry logging.basicConfig(level=logging.INFO) @@ -24,22 +22,23 @@ LOGGER = logging.getLogger(__name__) # Create a base class for declarative models Base = registry().generate_base() -# Base = declarative_base() class Collector(Base): __tablename__ = 'collector' collector_id = Column(UUID(as_uuid=False), primary_key=True) - kpi_id = Column(UUID(as_uuid=False)) - collector_decription = Column(String) - sampling_duration_s = Column(Float) - sampling_interval_s = Column(Float) - start_timestamp = Column(Float) - end_timestamp = Column(Float) - + kpi_id = Column(UUID(as_uuid=False), nullable=False) + collector_decription = Column(String , nullable=False) + sampling_duration_s = Column(Float , nullable=False) + sampling_interval_s = Column(Float , nullable=False) + start_timestamp = Column(Float , nullable=False) + end_timestamp = Column(Float , nullable=False) + # helps in logging the information def __repr__(self): return (f"") \ No newline at end of file + f"end_timestamp='{self.end_timestamp}')>") + +# add method to convert gRPC requests to rows if necessary... diff --git a/src/telemetry/database/managementDB.py b/src/telemetry/database/managementDB.py deleted file mode 100644 index f79126f27..000000000 --- a/src/telemetry/database/managementDB.py +++ /dev/null @@ -1,138 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging, time -import sqlalchemy -import sqlalchemy_utils -from sqlalchemy.orm import sessionmaker -from sqlalchemy.ext.declarative import declarative_base -from telemetry.database.TelemetryEngine import TelemetryEngine -from telemetry.database.TelemetryModel import Base - -LOGGER = logging.getLogger(__name__) -DB_NAME = "telemetryfrontend" - -# # Create a base class for declarative models -# Base = declarative_base() - -class managementDB: - def __init__(self): - self.db_engine = TelemetryEngine.get_engine() - if self.db_engine is None: - LOGGER.error('Unable to get SQLAlchemy DB Engine...') - return False - self.db_name = DB_NAME - self.Session = sessionmaker(bind=self.db_engine) - - @staticmethod - def create_database(engine : sqlalchemy.engine.Engine) -> None: - if not sqlalchemy_utils.database_exists(engine.url): - LOGGER.info("Database created. {:}".format(engine.url)) - sqlalchemy_utils.create_database(engine.url) - - @staticmethod - def drop_database(engine : sqlalchemy.engine.Engine) -> None: - if sqlalchemy_utils.database_exists(engine.url): - sqlalchemy_utils.drop_database(engine.url) - - # def create_database(self): - # try: - # with self.db_engine.connect() as connection: - # connection.execute(f"CREATE DATABASE {self.db_name};") - # LOGGER.info('managementDB initalizes database. Name: {self.db_name}') - # return True - # except: - # LOGGER.exception('Failed to check/create the database: {:s}'.format(str(self.db_engine.url))) - # return False - - @staticmethod - def create_tables(engine : sqlalchemy.engine.Engine): - try: - Base.metadata.create_all(engine) # type: ignore - LOGGER.info("Tables created in the DB Name: {:}".format(DB_NAME)) - except Exception as e: - LOGGER.info("Tables cannot be created in the TelemetryFrontend database. {:s}".format(str(e))) - - def verify_tables(self): - try: - with self.db_engine.connect() as connection: - result = connection.execute("SHOW TABLES;") - tables = result.fetchall() # type: ignore - LOGGER.info("Tables verified: {:}".format(tables)) - except Exception as e: - LOGGER.info("Unable to fetch Table names. {:s}".format(str(e))) - - @staticmethod - def add_row_to_db(self, row): - session = self.Session() - try: - session.add(row) - session.commit() - LOGGER.info(f"Row inserted into {row.__class__.__name__} table.") - except Exception as e: - session.rollback() - LOGGER.error(f"Failed to insert new row into {row.__class__.__name__} table. {str(e)}") - finally: - session.close() - - def search_db_row_by_id(self, model, col_name, id_to_search): - session = self.Session() - try: - entity = session.query(model).filter_by(**{col_name: id_to_search}).first() - if entity: - LOGGER.info(f"{model.__name__} ID found: {str(entity)}") - return entity - else: - LOGGER.warning(f"{model.__name__} ID not found: {str(id_to_search)}") - return None - except Exception as e: - session.rollback() - LOGGER.info(f"Failed to retrieve {model.__name__} ID. {str(e)}") - raise - finally: - session.close() - - def delete_db_row_by_id(self, model, col_name, id_to_search): - session = self.Session() - try: - record = session.query(model).filter_by(**{col_name: id_to_search}).first() - if record: - session.delete(record) - session.commit() - LOGGER.info("Deleted %s with %s: %s", model.__name__, col_name, id_to_search) - else: - LOGGER.warning("%s with %s %s not found", model.__name__, col_name, id_to_search) - except Exception as e: - session.rollback() - LOGGER.error("Error deleting %s with %s %s: %s", model.__name__, col_name, id_to_search, e) - finally: - session.close() - - def select_with_filter(self, model, **filters): - session = self.Session() - try: - query = session.query(model) - for column, value in filters.items(): - query = query.filter(getattr(model, column) == value) # type: ignore - result = query.all() - if result: - LOGGER.info(f"Fetched filtered rows from {model.__name__} table with filters: {filters}") # - Results: {result} - else: - LOGGER.warning(f"No matching row found in {model.__name__} table with filters: {filters}") - return result - except Exception as e: - LOGGER.error(f"Error fetching filtered rows from {model.__name__} table with filters {filters} ::: {e}") - return [] - finally: - session.close() \ No newline at end of file -- GitLab From 4ad2af23a660334ae42986316584f410c6c16613 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 5 Aug 2024 13:05:25 +0000 Subject: [PATCH 450/602] chanegs to sucessfully executes the DB test. - updated test file to log DEBUG cmd - change the class name of "TelemetryDBmanager" to "TelemeterDB" - corrected the DB name - move messages.py and test files to correcte location. --- scripts/run_tests_locally-telemetry-DB.sh | 4 +- src/telemetry/database/TelemetryEngine.py | 4 +- .../{TelemetryDB.py => Telemetry_DB.py} | 10 +- src/telemetry/database/tests/__init__.py | 13 - .../database/tests/telemetryDBtests.py | 86 ----- src/telemetry/database/tests/temp_DB.py | 327 ------------------ .../{database => }/tests/messages.py | 0 .../test_telemetryDB.py} | 16 +- 8 files changed, 20 insertions(+), 440 deletions(-) rename src/telemetry/database/{TelemetryDB.py => Telemetry_DB.py} (96%) delete mode 100644 src/telemetry/database/tests/__init__.py delete mode 100644 src/telemetry/database/tests/telemetryDBtests.py delete mode 100644 src/telemetry/database/tests/temp_DB.py rename src/telemetry/{database => }/tests/messages.py (100%) rename src/telemetry/{database/tests/managementDBtests.py => tests/test_telemetryDB.py} (59%) diff --git a/scripts/run_tests_locally-telemetry-DB.sh b/scripts/run_tests_locally-telemetry-DB.sh index bb1c48b76..4b9a41760 100755 --- a/scripts/run_tests_locally-telemetry-DB.sh +++ b/scripts/run_tests_locally-telemetry-DB.sh @@ -22,5 +22,5 @@ cd $PROJECTDIR/src # kpi_manager/tests/test_unitary.py RCFILE=$PROJECTDIR/coverage/.coveragerc -python3 -m pytest --log-cli-level=INFO --verbose \ - telemetry/database/tests/telemetryDBtests.py +python3 -m pytest --log-level=DEBUG --log-cli-level=debug --verbose \ + telemetry/tests/test_telemetryDB.py diff --git a/src/telemetry/database/TelemetryEngine.py b/src/telemetry/database/TelemetryEngine.py index bd7cda599..965b7c38d 100644 --- a/src/telemetry/database/TelemetryEngine.py +++ b/src/telemetry/database/TelemetryEngine.py @@ -27,7 +27,7 @@ class TelemetryEngine: if crdb_uri is None: CRDB_NAMESPACE = "crdb" CRDB_SQL_PORT = "26257" - CRDB_DATABASE = "telemetryfrontend" + CRDB_DATABASE = "tfs-telemetry" CRDB_USERNAME = "tfs" CRDB_PASSWORD = "tfs123" CRDB_SSLMODE = "require" @@ -35,7 +35,7 @@ class TelemetryEngine: CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) try: engine = sqlalchemy.create_engine(crdb_uri, echo=False) - LOGGER.info(' TelemetryDBmanager initalized with DB URL: {:}'.format(crdb_uri)) + LOGGER.info(' TelemetryDB initalized with DB URL: {:}'.format(crdb_uri)) except: # pylint: disable=bare-except # pragma: no cover LOGGER.exception('Failed to connect to database: {:s}'.format(str(crdb_uri))) return None # type: ignore diff --git a/src/telemetry/database/TelemetryDB.py b/src/telemetry/database/Telemetry_DB.py similarity index 96% rename from src/telemetry/database/TelemetryDB.py rename to src/telemetry/database/Telemetry_DB.py index b5b0c4c7e..ec7da9e40 100644 --- a/src/telemetry/database/TelemetryDB.py +++ b/src/telemetry/database/Telemetry_DB.py @@ -14,6 +14,7 @@ import logging import sqlalchemy_utils +from sqlalchemy import inspect from sqlalchemy.orm import sessionmaker from telemetry.database.TelemetryModel import Collector as CollectorModel from telemetry.database.TelemetryEngine import TelemetryEngine @@ -23,7 +24,7 @@ from common.method_wrappers.ServiceExceptions import ( LOGGER = logging.getLogger(__name__) DB_NAME = "tfs_telemetry" -class TelemetryDBmanager: +class TelemetryDB: def __init__(self): self.db_engine = TelemetryEngine.get_engine() if self.db_engine is None: @@ -51,10 +52,9 @@ class TelemetryDBmanager: def verify_tables(self): try: - with self.db_engine.connect() as connection: - result = connection.execute("SHOW TABLES;") - tables = result.fetchall() - LOGGER.info("Tables in DB: {:}".format(tables)) + inspect_object = inspect(self.db_engine) + if(inspect_object.has_table('collector', None)): + LOGGER.info("Table exists in DB: {:}".format(self.db_name)) except Exception as e: LOGGER.info("Unable to fetch Table names. {:s}".format(str(e))) diff --git a/src/telemetry/database/tests/__init__.py b/src/telemetry/database/tests/__init__.py deleted file mode 100644 index 839e45e3b..000000000 --- a/src/telemetry/database/tests/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. \ No newline at end of file diff --git a/src/telemetry/database/tests/telemetryDBtests.py b/src/telemetry/database/tests/telemetryDBtests.py deleted file mode 100644 index 0d2211064..000000000 --- a/src/telemetry/database/tests/telemetryDBtests.py +++ /dev/null @@ -1,86 +0,0 @@ - -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging -from typing import Any -from sqlalchemy.ext.declarative import declarative_base -from telemetry.database.TelemetryDBmanager import TelemetryDBmanager -from telemetry.database.TelemetryEngine import TelemetryEngine -from telemetry.database.tests import temp_DB -from .messages import create_kpi_request, create_collector_request, \ - create_kpi_id_request, create_kpi_filter_request, \ - create_collector_id_request, create_collector_filter_request - -logging.basicConfig(level=logging.INFO) -LOGGER = logging.getLogger(__name__) - - -# def test_temp_DB(): -# temp_DB.main() - -def test_telemetry_object_creation(): - LOGGER.info('--- test_telemetry_object_creation: START') - - LOGGER.info('>>> Creating TelemetryDBmanager Object <<< ') - TelemetryDBmanagerObj = TelemetryDBmanager() - TelemetryEngine.create_database(TelemetryDBmanagerObj.db_engine) # creates 'frontend' db, if it doesnot exists. - - LOGGER.info('>>> Creating database <<< ') - TelemetryDBmanagerObj.create_database() - - LOGGER.info('>>> verifing database <<< ') - TelemetryDBmanagerObj.list_databases() - - # # LOGGER.info('>>> Droping Tables: ') - # # TelemetryDBmanagerObj.drop_table("table_naem_here") - - LOGGER.info('>>> Creating Tables <<< ') - TelemetryDBmanagerObj.create_tables() - - LOGGER.info('>>> Verifing Table creation <<< ') - TelemetryDBmanagerObj.verify_tables() - - # LOGGER.info('>>> TESTING: Row Insertion Operation: kpi Table <<<') - # kpi_obj = create_kpi_request() - # TelemetryDBmanagerObj.inser_kpi(kpi_obj) - - # LOGGER.info('>>> TESTING: Row Insertion Operation: collector Table <<<') - # collector_obj = create_collector_request() - # TelemetryDBmanagerObj.insert_collector(collector_obj) - - # LOGGER.info('>>> TESTING: Get KpiDescriptor <<<') - # kpi_id_obj = create_kpi_id_request() - # TelemetryDBmanagerObj.get_kpi_descriptor(kpi_id_obj) - - # LOGGER.info('>>> TESTING: Select Collector <<<') - # collector_id_obj = create_collector_id_request() - # TelemetryDBmanagerObj.get_collector(collector_id_obj) - - # LOGGER.info('>>> TESTING: Applying kpi filter <<< ') - # kpi_filter : dict[str, Any] = create_kpi_filter_request() - # TelemetryDBmanagerObj.select_kpi_descriptor(**kpi_filter) - - # LOGGER.info('>>> TESTING: Applying collector filter <<<') - # collector_filter : dict[str, Any] = create_collector_filter_request() - # TelemetryDBmanagerObj.select_collector(**collector_filter) - - # LOGGER.info('>>> TESTING: Delete KpiDescriptor ') - # kpi_id_obj = create_kpi_id_request() - # TelemetryDBmanagerObj.delete_kpi_descriptor(kpi_id_obj) - - # LOGGER.info('>>> TESTING: Delete Collector ') - # collector_id_obj = create_collector_id_request() - # TelemetryDBmanagerObj.delete_collector(collector_id_obj) - \ No newline at end of file diff --git a/src/telemetry/database/tests/temp_DB.py b/src/telemetry/database/tests/temp_DB.py deleted file mode 100644 index 089d35424..000000000 --- a/src/telemetry/database/tests/temp_DB.py +++ /dev/null @@ -1,327 +0,0 @@ -from sqlalchemy import create_engine, Column, String, Integer, Text, Float, ForeignKey -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import sessionmaker, relationship -from sqlalchemy.dialects.postgresql import UUID -import logging - -LOGGER = logging.getLogger(__name__) -Base = declarative_base() - -class Kpi(Base): - __tablename__ = 'kpi' - - kpi_id = Column(UUID(as_uuid=False), primary_key=True) - kpi_description = Column(Text) - 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) - - collectors = relationship('Collector', back_populates='kpi') - - def __repr__(self): - return (f"") - -class Collector(Base): - __tablename__ = 'collector' - - collector_id = Column(UUID(as_uuid=False), primary_key=True) - kpi_id = Column(UUID(as_uuid=False), ForeignKey('kpi.kpi_id')) - collector = Column(String) - sampling_duration_s = Column(Float) - sampling_interval_s = Column(Float) - start_timestamp = Column(Float) - end_timestamp = Column(Float) - - kpi = relationship('Kpi', back_populates='collectors') - - def __repr__(self): - return (f"") - -class DatabaseManager: - def __init__(self, db_url, db_name): - self.engine = create_engine(db_url) - self.db_name = db_name - self.Session = sessionmaker(bind=self.engine) - LOGGER.info("DatabaseManager initialized with DB URL: %s and DB Name: %s", db_url, db_name) - - def create_database(self): - try: - with self.engine.connect() as connection: - connection.execute(f"CREATE DATABASE {self.db_name};") - LOGGER.info("Database '%s' created successfully.", self.db_name) - except Exception as e: - LOGGER.error("Error creating database '%s': %s", self.db_name, e) - finally: - LOGGER.info("create_database method execution finished.") - - def create_tables(self): - try: - Base.metadata.create_all(self.engine) - LOGGER.info("Tables created successfully.") - except Exception as e: - LOGGER.error("Error creating tables: %s", e) - finally: - LOGGER.info("create_tables method execution finished.") - - def verify_table_creation(self): - try: - with self.engine.connect() as connection: - result = connection.execute("SHOW TABLES;") - tables = result.fetchall() - LOGGER.info("Tables verified: %s", tables) - return tables - except Exception as e: - LOGGER.error("Error verifying table creation: %s", e) - return [] - finally: - LOGGER.info("verify_table_creation method execution finished.") - - def insert_row_kpi(self, kpi_data): - session = self.Session() - try: - new_kpi = Kpi(**kpi_data) - session.add(new_kpi) - session.commit() - LOGGER.info("Inserted row into KPI table: %s", kpi_data) - except Exception as e: - session.rollback() - LOGGER.error("Error inserting row into KPI table: %s", e) - finally: - session.close() - LOGGER.info("insert_row_kpi method execution finished.") - - def insert_row_collector(self, collector_data): - session = self.Session() - try: - new_collector = Collector(**collector_data) - session.add(new_collector) - session.commit() - LOGGER.info("Inserted row into Collector table: %s", collector_data) - except Exception as e: - session.rollback() - LOGGER.error("Error inserting row into Collector table: %s", e) - finally: - session.close() - LOGGER.info("insert_row_collector method execution finished.") - - def verify_insertion_kpi(self, kpi_id): - session = self.Session() - try: - kpi = session.query(Kpi).filter_by(kpi_id=kpi_id).first() - LOGGER.info("Verified insertion in KPI table for kpi_id: %s, Result: %s", kpi_id, kpi) - return kpi - except Exception as e: - LOGGER.error("Error verifying insertion in KPI table for kpi_id %s: %s", kpi_id, e) - return None - finally: - session.close() - LOGGER.info("verify_insertion_kpi method execution finished.") - - def verify_insertion_collector(self, collector_id): - session = self.Session() - try: - collector = session.query(Collector).filter_by(collector_id=collector_id).first() - LOGGER.info("Verified insertion in Collector table for collector_id: %s, Result: %s", collector_id, collector) - return collector - except Exception as e: - LOGGER.error("Error verifying insertion in Collector table for collector_id %s: %s", collector_id, e) - return None - finally: - session.close() - LOGGER.info("verify_insertion_collector method execution finished.") - - def get_all_kpi_rows(self): - session = self.Session() - try: - kpi_rows = session.query(Kpi).all() - LOGGER.info("Fetched all rows from KPI table: %s", kpi_rows) - return kpi_rows - except Exception as e: - LOGGER.error("Error fetching all rows from KPI table: %s", e) - return [] - finally: - session.close() - LOGGER.info("get_all_kpi_rows method execution finished.") - - def get_all_collector_rows(self): - session = self.Session() - try: - collector_rows = session.query(Collector).all() - LOGGER.info("Fetched all rows from Collector table: %s", collector_rows) - return collector_rows - except Exception as e: - LOGGER.error("Error fetching all rows from Collector table: %s", e) - return [] - finally: - session.close() - LOGGER.info("get_all_collector_rows method execution finished.") - - def get_filtered_kpi_rows(self, **filters): - session = self.Session() - try: - query = session.query(Kpi) - for column, value in filters.items(): - query = query.filter(getattr(Kpi, column) == value) - result = query.all() - LOGGER.info("Fetched filtered rows from KPI table with filters ---------- : {:s}".format(str(result))) - return result - except NoResultFound: - LOGGER.warning("No results found in KPI table with filters %s", filters) - return [] - except Exception as e: - LOGGER.error("Error fetching filtered rows from KPI table with filters %s: %s", filters, e) - return [] - finally: - session.close() - LOGGER.info("get_filtered_kpi_rows method execution finished.") - - def get_filtered_collector_rows(self, **filters): - session = self.Session() - try: - query = session.query(Collector) - for column, value in filters.items(): - query = query.filter(getattr(Collector, column) == value) - result = query.all() - LOGGER.info("Fetched filtered rows from Collector table with filters %s: %s", filters, result) - return result - except NoResultFound: - LOGGER.warning("No results found in Collector table with filters %s", filters) - return [] - except Exception as e: - LOGGER.error("Error fetching filtered rows from Collector table with filters %s: %s", filters, e) - return [] - finally: - session.close() - LOGGER.info("get_filtered_collector_rows method execution finished.") - - def delete_kpi_by_id(self, kpi_id): - session = self.Session() - try: - kpi = session.query(Kpi).filter_by(kpi_id=kpi_id).first() - if kpi: - session.delete(kpi) - session.commit() - LOGGER.info("Deleted KPI with kpi_id: %s", kpi_id) - else: - LOGGER.warning("KPI with kpi_id %s not found", kpi_id) - except SQLAlchemyError as e: - session.rollback() - LOGGER.error("Error deleting KPI with kpi_id %s: %s", kpi_id, e) - finally: - session.close() - LOGGER.info("delete_kpi_by_id method execution finished.") - - def delete_collector_by_id(self, collector_id): - session = self.Session() - try: - collector = session.query(Collector).filter_by(collector_id=collector_id).first() - if collector: - session.delete(collector) - session.commit() - LOGGER.info("Deleted Collector with collector_id: %s", collector_id) - else: - LOGGER.warning("Collector with collector_id %s not found", collector_id) - except SQLAlchemyError as e: - session.rollback() - LOGGER.error("Error deleting Collector with collector_id %s: %s", collector_id, e) - finally: - session.close() - LOGGER.info("delete_collector_by_id method execution finished.") - - -# Example Usage -def main(): - CRDB_SQL_PORT = "26257" - CRDB_DATABASE = "telemetryfrontend" - CRDB_USERNAME = "tfs" - CRDB_PASSWORD = "tfs123" - CRDB_SSLMODE = "require" - CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' - crdb_uri = CRDB_URI_TEMPLATE.format( - CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) - # db_url = "cockroachdb://username:password@localhost:26257/" - # db_name = "yourdatabase" - db_manager = DatabaseManager(crdb_uri, CRDB_DATABASE) - - # Create database - db_manager.create_database() - - # Update db_url to include the new database name - db_manager.engine = create_engine(f"{crdb_uri}") - db_manager.Session = sessionmaker(bind=db_manager.engine) - - # Create tables - db_manager.create_tables() - - # Verify table creation - tables = db_manager.verify_table_creation() - LOGGER.info('Tables in the database: {:s}'.format(str(tables))) - - # Insert a row into the KPI table - kpi_data = { - 'kpi_id': '123e4567-e89b-12d3-a456-426614174100', - 'kpi_description': 'Sample KPI', - 'kpi_sample_type': 1, - 'device_id': 'device_1', - 'endpoint_id': 'endpoint_1', - 'service_id': 'service_1', - 'slice_id': 'slice_1', - 'connection_id': 'conn_1', - 'link_id': 'link_1' - } - db_manager.insert_row_kpi(kpi_data) - - # Insert a row into the Collector table - collector_data = { - 'collector_id': '123e4567-e89b-12d3-a456-426614174101', - 'kpi_id': '123e4567-e89b-12d3-a456-426614174000', - 'collector': 'Collector 1', - 'sampling_duration_s': 60.0, - 'sampling_interval_s': 10.0, - 'start_timestamp': 1625247600.0, - 'end_timestamp': 1625247660.0 - } - db_manager.insert_row_collector(collector_data) - - # Verify insertion into KPI table - kpi = db_manager.verify_insertion_kpi('123e4567-e89b-12d3-a456-426614174000') - print("Inserted KPI:", kpi) - - # Verify insertion into Collector table - collector = db_manager.verify_insertion_collector('123e4567-e89b-12d3-a456-426614174001') - print("Inserted Collector:", collector) - - # Get all rows from KPI table - all_kpi_rows = db_manager.get_all_kpi_rows() - LOGGER.info("All KPI Rows: %s", all_kpi_rows) - - # Get all rows from Collector table - all_collector_rows = db_manager.get_all_collector_rows() - LOGGER.info("All Collector Rows: %s", all_collector_rows) - - # Get filtered rows from KPI table - filtered_kpi_rows = db_manager.get_filtered_kpi_rows(kpi_description='Sample KPI') - LOGGER.info("Filtered KPI Rows: %s", filtered_kpi_rows) - - # Get filtered rows from Collector table - filtered_collector_rows = db_manager.get_filtered_collector_rows(collector='Collector 1') - LOGGER.info("Filtered Collector Rows: %s", filtered_collector_rows) - - # Delete a KPI by kpi_id - kpi_id_to_delete = '123e4567-e89b-12d3-a456-426614174000' - db_manager.delete_kpi_by_id(kpi_id_to_delete) - - # Delete a Collector by collector_id - collector_id_to_delete = '123e4567-e89b-12d3-a456-426614174001' - db_manager.delete_collector_by_id(collector_id_to_delete) diff --git a/src/telemetry/database/tests/messages.py b/src/telemetry/tests/messages.py similarity index 100% rename from src/telemetry/database/tests/messages.py rename to src/telemetry/tests/messages.py diff --git a/src/telemetry/database/tests/managementDBtests.py b/src/telemetry/tests/test_telemetryDB.py similarity index 59% rename from src/telemetry/database/tests/managementDBtests.py rename to src/telemetry/tests/test_telemetryDB.py index 24138abe4..c4976f8c2 100644 --- a/src/telemetry/database/tests/managementDBtests.py +++ b/src/telemetry/tests/test_telemetryDB.py @@ -13,10 +13,16 @@ # limitations under the License. -from telemetry.database.managementDB import managementDB -from telemetry.database.tests.messages import create_collector_model_object +import logging +from telemetry.database.Telemetry_DB import TelemetryDB +LOGGER = logging.getLogger(__name__) -def test_add_row_to_db(): - managementDBobj = managementDB() - managementDBobj.add_row_to_db(create_collector_model_object()) \ No newline at end of file +def test_verify_databases_and_tables(): + LOGGER.info('>>> test_verify_databases_and_tables : START <<< ') + TelemetryDBobj = TelemetryDB() + TelemetryDBobj.drop_database() + TelemetryDBobj.verify_tables() + TelemetryDBobj.create_database() + TelemetryDBobj.create_tables() + TelemetryDBobj.verify_tables() \ No newline at end of file -- GitLab From 99efde2c048cb45fa9d9709f938db9e0f7d903aa Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 09:45:49 +0000 Subject: [PATCH 451/602] Foreced changes in KpiValueWriter to handle gRPC empty return message. --- src/kpi_value_writer/service/KpiValueWriter.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index 26bab4465..022126fd0 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -33,7 +33,6 @@ from .MetricWriterToPrometheus import MetricWriterToPrometheus LOGGER = logging.getLogger(__name__) ACTIVE_CONSUMERS = [] -METRIC_WRITER = MetricWriterToPrometheus() class KpiValueWriter(GenericGrpcService): def __init__(self, cls_name : str = __name__) -> None: @@ -48,12 +47,14 @@ class KpiValueWriter(GenericGrpcService): @staticmethod def KafkaConsumer(): + kpi_manager_client = KpiManagerClient() + metric_writer = MetricWriterToPrometheus() + kafka_consumer = KafkaConsumer( { 'bootstrap.servers' : KafkaConfig.SERVER_IP.value, 'group.id' : __class__, 'auto.offset.reset' : 'latest'} - ) - kpi_manager_client = KpiManagerClient() + ) kafka_consumer.subscribe([KafkaTopic.VALUE.value]) LOGGER.debug("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) print("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) @@ -72,13 +73,13 @@ class KpiValueWriter(GenericGrpcService): kpi_value.ParseFromString(raw_kpi.value()) LOGGER.info("Received KPI : {:}".format(kpi_value)) print("Received KPI : {:}".format(kpi_value)) - KpiValueWriter.get_kpi_descriptor(kpi_value, kpi_manager_client) + KpiValueWriter.get_kpi_descriptor(kpi_value, kpi_manager_client, metric_writer) except Exception as e: print("Error detail: {:}".format(e)) continue @staticmethod - def get_kpi_descriptor(kpi_value: str, kpi_manager_client ): + def get_kpi_descriptor(kpi_value: str, kpi_manager_client, metric_writer): print("--- START -----") kpi_id = KpiId() @@ -89,12 +90,11 @@ class KpiValueWriter(GenericGrpcService): try: kpi_descriptor_object = KpiDescriptor() kpi_descriptor_object = kpi_manager_client.GetKpiDescriptor(kpi_id) + # TODO: why kpi_descriptor_object recevies a KpiDescriptor type object not Empty type object??? if kpi_descriptor_object.kpi_id.kpi_id.uuid == kpi_id.kpi_id.uuid: - # print("kpi descriptor received: {:}".format(kpi_descriptor_object)) - # if isinstance (kpi_descriptor_object, KpiDescriptor): LOGGER.info("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) print("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) - METRIC_WRITER.create_and_expose_cooked_kpi(kpi_descriptor_object, kpi_value) + metric_writer.create_and_expose_cooked_kpi(kpi_descriptor_object, kpi_value) else: LOGGER.info("No KPI Descriptor found in DB for Kpi ID: {:}".format(kpi_id)) print("No KPI Descriptor found in DB for Kpi ID: {:}".format(kpi_id)) -- GitLab From 11fe02e18ea4106f0492902c07a8deab78d23e32 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 09:55:51 +0000 Subject: [PATCH 452/602] updated imports to resolve error generated by unit test. - Imports are updated in test_kpi_value_writer.py --- src/kpi_value_writer/tests/test_kpi_value_writer.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/kpi_value_writer/tests/test_kpi_value_writer.py b/src/kpi_value_writer/tests/test_kpi_value_writer.py index 572495d48..40593af97 100755 --- a/src/kpi_value_writer/tests/test_kpi_value_writer.py +++ b/src/kpi_value_writer/tests/test_kpi_value_writer.py @@ -14,11 +14,12 @@ import logging from kpi_value_writer.service.KpiValueWriter import KpiValueWriter +from kpi_value_writer.tests.test_messages import create_kpi_id_request, create_kpi_descriptor_request + from common.tools.kafka.Variables import KafkaTopic -from kpi_manager.client.KpiManagerClient import KpiManagerClient -from kpi_manager.tests.test_messages import create_kpi_descriptor_request from common.proto.kpi_manager_pb2 import KpiDescriptor -from kpi_value_writer.tests.test_messages import create_kpi_id_request +from kpi_manager.client.KpiManagerClient import KpiManagerClient + LOGGER = logging.getLogger(__name__) -- GitLab From 00a0bcc447eded1e1f6f6586bda4878f036a1f47 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 14:14:18 +0000 Subject: [PATCH 453/602] Kafka deployment script is integrated with TFS deplyment script. - Kafka env variables are created in my_deply.sh, kafka.sh and all.sh --- deploy/all.sh | 3 ++ deploy/kafka.sh | 83 ++++++++++++++++++++++++++++++------------------- deploy/tfs.sh | 20 +++++++++++- 3 files changed, 73 insertions(+), 33 deletions(-) diff --git a/deploy/all.sh b/deploy/all.sh index f93cd92ac..e9b33b469 100755 --- a/deploy/all.sh +++ b/deploy/all.sh @@ -215,6 +215,9 @@ export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"} # Deploy QuestDB ./deploy/qdb.sh +# Deploy Apache Kafka +./deploy/kafka.sh + # Expose Dashboard ./deploy/expose_dashboard.sh diff --git a/deploy/kafka.sh b/deploy/kafka.sh index 4a91bfc9e..b2f2f1f9e 100755 --- a/deploy/kafka.sh +++ b/deploy/kafka.sh @@ -20,50 +20,69 @@ # If not already set, set the namespace where Apache Kafka will be deployed. export KFK_NAMESPACE=${KFK_NAMESPACE:-"kafka"} +# If not already set, set the port Apache Kafka server will be exposed to. +export KFK_SERVER_PORT=${KFK_SERVER_PORT:-"9092"} + +# If not already set, if flag is YES, Apache Kafka will be redeployed and all topics will be lost. +export KFK_REDEPLOY=${KFK_REDEPLOY:-""} + ######################################################################################################################## # Automated steps start here ######################################################################################################################## -# Constants -TMP_FOLDER="./tmp" -KFK_MANIFESTS_PATH="manifests/kafka" -KFK_ZOOKEEPER_MANIFEST="01-zookeeper.yaml" -KFK_MANIFEST="02-kafka.yaml" + # Constants + TMP_FOLDER="./tmp" + KFK_MANIFESTS_PATH="manifests/kafka" + KFK_ZOOKEEPER_MANIFEST="01-zookeeper.yaml" + KFK_MANIFEST="02-kafka.yaml" + + # Create a tmp folder for files modified during the deployment + TMP_MANIFESTS_FOLDER="${TMP_FOLDER}/${KFK_NAMESPACE}/manifests" + mkdir -p ${TMP_MANIFESTS_FOLDER} -# Create a tmp folder for files modified during the deployment -TMP_MANIFESTS_FOLDER="${TMP_FOLDER}/${KFK_NAMESPACE}/manifests" -mkdir -p ${TMP_MANIFESTS_FOLDER} +function kafka_deploy() { + # copy zookeeper and kafka manifest files to temporary manifest location + cp "${KFK_MANIFESTS_PATH}/${KFK_ZOOKEEPER_MANIFEST}" "${TMP_MANIFESTS_FOLDER}/${KFK_ZOOKEEPER_MANIFEST}" + cp "${KFK_MANIFESTS_PATH}/${KFK_MANIFEST}" "${TMP_MANIFESTS_FOLDER}/${KFK_MANIFEST}" -# copy zookeeper and kafka manifest files to temporary manifest location -cp "${KFK_MANIFESTS_PATH}/${KFK_ZOOKEEPER_MANIFEST}" "${TMP_MANIFESTS_FOLDER}/${KFK_ZOOKEEPER_MANIFEST}" -cp "${KFK_MANIFESTS_PATH}/${KFK_MANIFEST}" "${TMP_MANIFESTS_FOLDER}/${KFK_MANIFEST}" + # echo "Apache Kafka Namespace" + echo ">>> Delete Apache Kafka Namespace" + kubectl delete namespace ${KFK_NAMESPACE} --ignore-not-found -echo "Apache Kafka Namespace" -echo ">>> Delete Apache Kafka Namespace" -kubectl delete namespace ${KFK_NAMESPACE} --ignore-not-found + echo ">>> Create Apache Kafka Namespace" + kubectl create namespace ${KFK_NAMESPACE} -echo ">>> Create Apache Kafka Namespace" -kubectl create namespace ${KFK_NAMESPACE} + # echo ">>> Deplying Apache Kafka Zookeeper" + # Kafka zookeeper service should be deployed before the kafka service + kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/${KFK_ZOOKEEPER_MANIFEST}" -echo ">>> Deplying Apache Kafka Zookeeper" -# Kafka zookeeper service should be deployed before the kafka service -kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/${KFK_ZOOKEEPER_MANIFEST}" + KFK_ZOOKEEPER_SERVICE="zookeeper-service" # this command may be replaced with command to extract service name automatically + KFK_ZOOKEEPER_IP=$(kubectl --namespace ${KFK_NAMESPACE} get service ${KFK_ZOOKEEPER_SERVICE} -o 'jsonpath={.spec.clusterIP}') -KFK_ZOOKEEPER_SERVICE="zookeeper-service" # this command may be replaced with command to extract service name automatically -KFK_ZOOKEEPER_IP=$(kubectl --namespace ${KFK_NAMESPACE} get service ${KFK_ZOOKEEPER_SERVICE} -o 'jsonpath={.spec.clusterIP}') + # Kafka service should be deployed after the zookeeper service + sed -i "s//${KFK_ZOOKEEPER_IP}/" "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST" -# Kafka service should be deployed after the zookeeper service -sed -i "s//${KFK_ZOOKEEPER_IP}/" "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST" + # echo ">>> Deploying Apache Kafka Broker" + kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST" -echo ">>> Deploying Apache Kafka Broker" -kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST" + # echo ">>> Verifing Apache Kafka deployment" + sleep 5 + # KFK_PODS_STATUS=$(kubectl --namespace ${KFK_NAMESPACE} get pods) + # if echo "$KFK_PODS_STATUS" | grep -qEv 'STATUS|Running'; then + # echo "Deployment Error: \n $KFK_PODS_STATUS" + # else + # echo "$KFK_PODS_STATUS" + # fi +} -echo ">>> Verifing Apache Kafka deployment" -sleep 10 -KFK_PODS_STATUS=$(kubectl --namespace ${KFK_NAMESPACE} get pods) -if echo "$KFK_PODS_STATUS" | grep -qEv 'STATUS|Running'; then - echo "Deployment Error: \n $KFK_PODS_STATUS" +echo "Apache Kafka" +echo ">>> Checking if Apache Kafka is deployed ... " +if [ "$KFK_REDEPLOY" == "YES" ]; then + kafka_deploy +elif kubectl get --namespace ${KFK_NAMESPACE} deployments.apps &> /dev/null; then + echo ">>> Apache Kafka already present; skipping step..." else - echo "$KFK_PODS_STATUS" -fi \ No newline at end of file + kafka_deploy +fi +echo diff --git a/deploy/tfs.sh b/deploy/tfs.sh index 62f36a2c1..d92d789e3 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -115,6 +115,17 @@ export PROM_EXT_PORT_HTTP=${PROM_EXT_PORT_HTTP:-"9090"} export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"} +# ----- Apache Kafka ------------------------------------------------------ + +# If not already set, set the namespace where Apache Kafka will be deployed. +export KFK_NAMESPACE=${KFK_NAMESPACE:-"kafka"} + +# If not already set, set the port Apache Kafka server will be exposed to. +export KFK_SERVER_PORT=${KFK_SERVER_PORT:-"9092"} + +# If not already set, if flag is YES, Apache Kafka will be redeployed and topic will be lost. +export KFK_REDEPLOY=${KFK_REDEPLOY:-""} + ######################################################################################################################## # Automated steps start here ######################################################################################################################## @@ -147,7 +158,7 @@ kubectl create secret generic crdb-data --namespace ${TFS_K8S_NAMESPACE} --type= --from-literal=CRDB_SSLMODE=require printf "\n" -echo "Create secret with CockroachDB data for KPI Management" +echo "Create secret with CockroachDB data for KPI Management microservices" CRDB_SQL_PORT=$(kubectl --namespace ${CRDB_NAMESPACE} get service cockroachdb-public -o 'jsonpath={.spec.ports[?(@.name=="sql")].port}') CRDB_DATABASE_KPI_MGMT="tfs_kpi_mgmt" # TODO: change by specific configurable environment variable kubectl create secret generic crdb-kpi-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ @@ -159,6 +170,13 @@ kubectl create secret generic crdb-kpi-data --namespace ${TFS_K8S_NAMESPACE} --t --from-literal=CRDB_SSLMODE=require printf "\n" +echo "Create secret with Apache Kafka kfk-kpi-data for KPI and Telemetry microservices" +KFK_SERVER_PORT=$(kubectl --namespace ${KFK_NAMESPACE} get service kafka-service -o 'jsonpath={.spec.ports[0].port}') +kubectl create secret generic kfk-kpi-data --namespace ${KFK_NAMESPACE} --type='Opaque' \ + --from-literal=KFK_NAMESPACE=${KFK_NAMESPACE} \ + --from-literal=KFK_SERVER_PORT=${KFK_NAMESPACE} +printf "\n" + echo "Create secret with NATS data" NATS_CLIENT_PORT=$(kubectl --namespace ${NATS_NAMESPACE} get service ${NATS_NAMESPACE} -o 'jsonpath={.spec.ports[?(@.name=="client")].port}') if [ -z "$NATS_CLIENT_PORT" ]; then -- GitLab From cb0475227d2c8dce5ea2646f43d0d61d3a564181 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 14:43:57 +0000 Subject: [PATCH 454/602] Kafka secret added to kpi_value_api/kpi_value_writer - improvements to accuratly read the env variables --- deploy/kafka.sh | 2 +- deploy/tfs.sh | 4 ++-- manifests/kpi_value_apiservice.yaml | 3 +++ manifests/kpi_value_writerservice.yaml | 3 +++ 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/deploy/kafka.sh b/deploy/kafka.sh index b2f2f1f9e..21ba89408 100755 --- a/deploy/kafka.sh +++ b/deploy/kafka.sh @@ -81,7 +81,7 @@ echo ">>> Checking if Apache Kafka is deployed ... " if [ "$KFK_REDEPLOY" == "YES" ]; then kafka_deploy elif kubectl get --namespace ${KFK_NAMESPACE} deployments.apps &> /dev/null; then - echo ">>> Apache Kafka already present; skipping step..." + echo ">>> Apache Kafka already present; skipping step." else kafka_deploy fi diff --git a/deploy/tfs.sh b/deploy/tfs.sh index d92d789e3..4ecfaae99 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -172,9 +172,9 @@ printf "\n" echo "Create secret with Apache Kafka kfk-kpi-data for KPI and Telemetry microservices" KFK_SERVER_PORT=$(kubectl --namespace ${KFK_NAMESPACE} get service kafka-service -o 'jsonpath={.spec.ports[0].port}') -kubectl create secret generic kfk-kpi-data --namespace ${KFK_NAMESPACE} --type='Opaque' \ +kubectl create secret generic kfk-kpi-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ --from-literal=KFK_NAMESPACE=${KFK_NAMESPACE} \ - --from-literal=KFK_SERVER_PORT=${KFK_NAMESPACE} + --from-literal=KFK_SERVER_PORT=${KFK_SERVER_PORT} printf "\n" echo "Create secret with NATS data" diff --git a/manifests/kpi_value_apiservice.yaml b/manifests/kpi_value_apiservice.yaml index 74eb90f67..e4dcb0054 100644 --- a/manifests/kpi_value_apiservice.yaml +++ b/manifests/kpi_value_apiservice.yaml @@ -39,6 +39,9 @@ spec: env: - name: LOG_LEVEL value: "INFO" + envFrom: + - secretRef: + name: kfk-kpi-data readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:30020"] diff --git a/manifests/kpi_value_writerservice.yaml b/manifests/kpi_value_writerservice.yaml index 8a8e44ec2..e21e36f48 100644 --- a/manifests/kpi_value_writerservice.yaml +++ b/manifests/kpi_value_writerservice.yaml @@ -39,6 +39,9 @@ spec: env: - name: LOG_LEVEL value: "INFO" + envFrom: + - secretRef: + name: kfk-kpi-data readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:30030"] -- GitLab From 65ce509df776a35867047740d572ec56e56eae7a Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 14:49:57 +0000 Subject: [PATCH 455/602] dynamically creates the kafka server address with env variables. - get the values of KAFKA_NAMESPACE and KFK_SERVER_PORT to create KAFKA server address. --- src/common/tools/kafka/Variables.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 24ae2cff7..89ac42f90 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -16,14 +16,18 @@ import logging from enum import Enum from confluent_kafka import KafkaException from confluent_kafka.admin import AdminClient, NewTopic +from common.Settings import get_setting LOGGER = logging.getLogger(__name__) +KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' class KafkaConfig(Enum): + KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = get_setting('KFK_SERVER_PORT') # SERVER_IP = "127.0.0.1:9092" - SERVER_IP = "kafka-service.kafka.svc.cluster.local:9092" - ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_IP}) + server_address = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) + ADMIN_CLIENT = AdminClient({'bootstrap.servers': server_address}) class KafkaTopic(Enum): REQUEST = 'topic_request' -- GitLab From 559c3cba0b6b9f654409a034763eaab0a9585121 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 15:14:40 +0000 Subject: [PATCH 456/602] Some improvements to Kpi Manager test and messages file. - comment is added in Kpi DB file for future reference. --- src/kpi_manager/database/Kpi_DB.py | 3 +- src/kpi_manager/tests/test_kpi_db.py | 4 +- src/kpi_manager/tests/test_kpi_manager.py | 148 +++++----------------- 3 files changed, 34 insertions(+), 121 deletions(-) diff --git a/src/kpi_manager/database/Kpi_DB.py b/src/kpi_manager/database/Kpi_DB.py index 4b6064070..530abe457 100644 --- a/src/kpi_manager/database/Kpi_DB.py +++ b/src/kpi_manager/database/Kpi_DB.py @@ -34,14 +34,15 @@ class KpiDB: def create_database(self) -> None: if not sqlalchemy_utils.database_exists(self.db_engine.url): - LOGGER.debug("Database created. {:}".format(self.db_engine.url)) sqlalchemy_utils.create_database(self.db_engine.url) + LOGGER.debug("Database created. {:}".format(self.db_engine.url)) def drop_database(self) -> None: if sqlalchemy_utils.database_exists(self.db_engine.url): sqlalchemy_utils.drop_database(self.db_engine.url) def create_tables(self): + # TODO: use "get_tables(declatrative class obj)" method of "sqlalchemy_utils" to verify tables. try: KpiModel.metadata.create_all(self.db_engine) # type: ignore LOGGER.debug("Tables created in the DB Name: {:}".format(self.db_name)) diff --git a/src/kpi_manager/tests/test_kpi_db.py b/src/kpi_manager/tests/test_kpi_db.py index e961c12ba..d4a57f836 100644 --- a/src/kpi_manager/tests/test_kpi_db.py +++ b/src/kpi_manager/tests/test_kpi_db.py @@ -21,8 +21,8 @@ LOGGER = logging.getLogger(__name__) def test_verify_databases_and_Tables(): LOGGER.info('>>> test_verify_Tables : START <<< ') kpiDBobj = KpiDB() - kpiDBobj.drop_database() - kpiDBobj.verify_tables() + # kpiDBobj.drop_database() + # kpiDBobj.verify_tables() kpiDBobj.create_database() kpiDBobj.create_tables() kpiDBobj.verify_tables() diff --git a/src/kpi_manager/tests/test_kpi_manager.py b/src/kpi_manager/tests/test_kpi_manager.py index f0d9526d3..da149e3fe 100755 --- a/src/kpi_manager/tests/test_kpi_manager.py +++ b/src/kpi_manager/tests/test_kpi_manager.py @@ -17,7 +17,7 @@ import os, pytest import logging from typing import Union -#from common.proto.context_pb2 import Empty +from common.proto.context_pb2 import Empty from common.Constants import ServiceNameEnum from common.Settings import ( ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_service_port_grpc) @@ -26,12 +26,6 @@ from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList from common.tools.service.GenericGrpcService import GenericGrpcService -#from context.client.ContextClient import ContextClient - -# from device.service.driver_api.DriverFactory import DriverFactory -# 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_filter_request, create_kpi_descriptor_request_a from kpi_manager.service.KpiManagerService import KpiManagerService @@ -39,12 +33,6 @@ from kpi_manager.client.KpiManagerClient import KpiManagerClient from kpi_manager.tests.test_messages import create_kpi_descriptor_request from kpi_manager.tests.test_messages import create_kpi_id_request - -#from monitoring.service.NameMapping import NameMapping - -#os.environ['DEVICE_EMULATED_ONLY'] = 'TRUE' -#from device.service.drivers import DRIVERS - ########################### # Tests Setup ########################### @@ -55,8 +43,6 @@ KPIMANAGER_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # t os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(KPIMANAGER_SERVICE_PORT) -# METRICSDB_HOSTNAME = os.environ.get('METRICSDB_HOSTNAME'){} - LOGGER = logging.getLogger(__name__) class MockContextService(GenericGrpcService): @@ -70,84 +56,10 @@ class MockContextService(GenericGrpcService): self.context_servicer = MockServicerImpl_Context() add_ContextServiceServicer_to_server(self.context_servicer, self.server) -# @pytest.fixture(scope='session') -# def context_service(): -# LOGGER.info('Initializing MockContextService...') -# _service = MockContextService(MOCKSERVICE_PORT) -# _service.start() - -# LOGGER.info('Yielding MockContextService...') -# yield _service - -# LOGGER.info('Terminating MockContextService...') -# _service.context_servicer.msg_broker.terminate() -# _service.stop() - -# LOGGER.info('Terminated MockContextService...') - -# @pytest.fixture(scope='session') -# def context_client(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument -# LOGGER.info('Initializing ContextClient...') -# _client = ContextClient() - -# LOGGER.info('Yielding ContextClient...') -# yield _client - -# LOGGER.info('Closing ContextClient...') -# _client.close() - -# LOGGER.info('Closed ContextClient...') - -# @pytest.fixture(scope='session') -# def device_service(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument -# LOGGER.info('Initializing DeviceService...') -# driver_factory = DriverFactory(DRIVERS) -# driver_instance_cache = DriverInstanceCache(driver_factory) -# _service = DeviceService(driver_instance_cache) -# _service.start() - -# # yield the server, when test finishes, execution will resume to stop it -# LOGGER.info('Yielding DeviceService...') -# yield _service - -# LOGGER.info('Terminating DeviceService...') -# _service.stop() - -# LOGGER.info('Terminated DeviceService...') - -# @pytest.fixture(scope='session') -# def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument -# LOGGER.info('Initializing DeviceClient...') -# _client = DeviceClient() - -# LOGGER.info('Yielding DeviceClient...') -# yield _client - -# LOGGER.info('Closing DeviceClient...') -# _client.close() - -# LOGGER.info('Closed DeviceClient...') - -# @pytest.fixture(scope='session') -# def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument -# LOGGER.info('Initializing DeviceClient...') -# _client = DeviceClient() - -# LOGGER.info('Yielding DeviceClient...') -# yield _client - -# LOGGER.info('Closing DeviceClient...') -# _client.close() - -# LOGGER.info('Closed DeviceClient...') - # This fixture will be requested by test cases and last during testing session @pytest.fixture(scope='session') def kpi_manager_service(): LOGGER.info('Initializing KpiManagerService...') - #name_mapping = NameMapping() - # _service = MonitoringService(name_mapping) - # _service = KpiManagerService(name_mapping) _service = KpiManagerService() _service.start() @@ -194,22 +106,22 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab ########################### # ---------- 3rd Iteration Tests ---------------- -# def test_SetKpiDescriptor(kpi_manager_client): -# LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ") -# response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) -# LOGGER.info("Response gRPC message object: {:}".format(response)) -# assert isinstance(response, KpiId) +def test_SetKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ") + 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_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) -# # deleting KPI -# del_response = kpi_manager_client.DeleteKpiDescriptor(response_id) -# # select KPI -# kpi_manager_client.GetKpiDescriptor(response_id) -# LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response)) -# assert isinstance(del_response, Empty) +def test_DeleteKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ") + # adding KPI + response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + # deleting KPI + del_response = kpi_manager_client.DeleteKpiDescriptor(response_id) + # select KPI + kpi_manager_client.GetKpiDescriptor(response_id) + LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response)) + assert isinstance(del_response, Empty) def test_GetKpiDescriptor(kpi_manager_client): LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") @@ -225,21 +137,21 @@ def test_GetKpiDescriptor(kpi_manager_client): assert isinstance(response, KpiDescriptor) -# def test_SelectKpiDescriptor(kpi_manager_client): -# LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ") -# # adding KPI -# kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) -# # select KPI(s) -# response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request()) -# LOGGER.info("Response gRPC message object: {:}".format(response)) -# assert isinstance(response, KpiDescriptorList) +def test_SelectKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ") + # adding KPI + kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + # select KPI(s) + response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request()) + LOGGER.info("Response gRPC message object: {:}".format(response)) + assert isinstance(response, KpiDescriptorList) -# def test_set_list_of_KPIs(kpi_manager_client): -# LOGGER.debug(" >>> test_set_list_of_KPIs: START <<< ") -# KPIs_TO_SEARCH = ["node_in_power_total", "node_in_current_total", "node_out_power_total"] -# # adding KPI -# for kpi in KPIs_TO_SEARCH: -# kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a(kpi)) +def test_set_list_of_KPIs(kpi_manager_client): + LOGGER.debug(" >>> test_set_list_of_KPIs: START <<< ") + KPIs_TO_SEARCH = ["node_in_power_total", "node_in_current_total", "node_out_power_total"] + # adding KPI + for kpi in KPIs_TO_SEARCH: + kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a(kpi)) # ---------- 2nd Iteration Tests ----------------- -- GitLab From 298d4b7f9fa90701051224dd76590b6b539c8831 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 31 Jul 2024 12:30:39 +0000 Subject: [PATCH 457/602] Changes to resolve Kafka server error - KFK_SERVER_ADDRESS_TEMPLATE now defined inside the class KafkaConfig. - variable renamed to "SERVER_ADDRESS" from "server_address" --- src/common/tools/kafka/Variables.py | 13 +++++++------ .../service/KpiValueApiServiceServicerImpl.py | 2 +- src/kpi_value_writer/service/KpiValueWriter.py | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 89ac42f90..9abc32b3e 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -20,14 +20,14 @@ from common.Settings import get_setting LOGGER = logging.getLogger(__name__) -KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' class KafkaConfig(Enum): - KFK_NAMESPACE = get_setting('KFK_NAMESPACE') - KFK_PORT = get_setting('KFK_SERVER_PORT') - # SERVER_IP = "127.0.0.1:9092" - server_address = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) - ADMIN_CLIENT = AdminClient({'bootstrap.servers': server_address}) + KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' + KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = get_setting('KFK_SERVER_PORT') + # SERVER_ADDRESS = "127.0.0.1:9092" + SERVER_ADDRESS = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) + ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) class KafkaTopic(Enum): REQUEST = 'topic_request' @@ -42,6 +42,7 @@ class KafkaTopic(Enum): Method to create Kafka topics defined as class members """ all_topics = [member.value for member in KafkaTopic] + LOGGER.debug("Kafka server address is: {:} ".format(KafkaConfig.SERVER_ADDRESS.value)) if( KafkaTopic.create_new_topic_if_not_exists( all_topics )): LOGGER.debug("All topics are created sucsessfully") return True diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index d27de54f3..1559457d7 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -38,7 +38,7 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): ) -> Empty: LOGGER.debug('StoreKpiValues: Received gRPC message object: {:}'.format(request)) producer_obj = KafkaProducer({ - 'bootstrap.servers' : KafkaConfig.SERVER_IP.value + 'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value }) for kpi_value in request.kpi_value_list: kpi_value_to_produce : Tuple [str, Any, Any] = ( diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index 022126fd0..5e2b6babe 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -51,10 +51,10 @@ class KpiValueWriter(GenericGrpcService): metric_writer = MetricWriterToPrometheus() kafka_consumer = KafkaConsumer( - { 'bootstrap.servers' : KafkaConfig.SERVER_IP.value, + { 'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value, 'group.id' : __class__, 'auto.offset.reset' : 'latest'} - ) + ) kafka_consumer.subscribe([KafkaTopic.VALUE.value]) LOGGER.debug("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) print("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) -- GitLab From 62031ac8df70d1540008d93ead429de8467155c9 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 1 Aug 2024 12:53:52 +0000 Subject: [PATCH 458/602] changes to manage Kafka enviornment variable efficiently - KFK_SERVER_PORT and KFK_REDOPLY added into my_deploy.sh file. - refines kafka env variables import --- my_deploy.sh | 5 +++++ src/common/tools/kafka/Variables.py | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/my_deploy.sh b/my_deploy.sh index b89df7481..45e0d1301 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -181,3 +181,8 @@ export GRAF_EXT_PORT_HTTP="3000" # Set the namespace where Apache Kafka will be deployed. export KFK_NAMESPACE="kafka" +# Set the port Apache Kafka server will be exposed to. +export KFK_SERVER_PORT="9092" + +# Set the flag to YES for redeploying of Apache Kafka +export KFK_REDEPLOY="" diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 9abc32b3e..e3ee2016a 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -23,11 +23,11 @@ LOGGER = logging.getLogger(__name__) class KafkaConfig(Enum): KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' - KFK_NAMESPACE = get_setting('KFK_NAMESPACE') - KFK_PORT = get_setting('KFK_SERVER_PORT') - # SERVER_ADDRESS = "127.0.0.1:9092" + KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = get_setting('KFK_SERVER_PORT') + # SERVER_ADDRESS = "127.0.0.1:9092" SERVER_ADDRESS = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) - ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) + ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) class KafkaTopic(Enum): REQUEST = 'topic_request' -- GitLab From 464c5888516ffa254eb3d92d9799ef94f3bfec01 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 09:41:59 +0000 Subject: [PATCH 459/602] Improvement in SelectKpiValues method. - Added "GetKpiSampleType" method to extract KpiSampleType based on KpiId. - Added PromtheusConnect method to query Prometheus from prometheus_api_client library. - KpiManagerClient added in DockerFile - prometheus_api_client added in requirement file. --- src/kpi_value_api/Dockerfile | 2 + src/kpi_value_api/requirements.in | 1 + .../service/KpiValueApiServiceServicerImpl.py | 93 ++++++++++++------- .../service/MetricWriterToPrometheus.py | 2 +- 4 files changed, 66 insertions(+), 32 deletions(-) diff --git a/src/kpi_value_api/Dockerfile b/src/kpi_value_api/Dockerfile index 7dd8d307b..25b8da931 100644 --- a/src/kpi_value_api/Dockerfile +++ b/src/kpi_value_api/Dockerfile @@ -63,6 +63,8 @@ RUN python3 -m pip install -r requirements.txt # Add component files into working directory WORKDIR /var/teraflow COPY src/kpi_value_api/. kpi_value_api/ +COPY src/kpi_manager/__init__.py kpi_manager/__init__.py +COPY src/kpi_manager/client/. kpi_manager/client/ # Start the service ENTRYPOINT ["python", "-m", "kpi_value_api.service"] diff --git a/src/kpi_value_api/requirements.in b/src/kpi_value_api/requirements.in index 7e4694109..f5695906a 100644 --- a/src/kpi_value_api/requirements.in +++ b/src/kpi_value_api/requirements.in @@ -14,3 +14,4 @@ confluent-kafka==2.3.* requests==2.27.* +prometheus-api-client==0.5.3 \ No newline at end of file diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index 1559457d7..b2ebecad0 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -12,18 +12,23 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, grpc, requests +import logging, grpc from typing import Tuple, Any -from datetime import datetime from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from common.proto.context_pb2 import Empty +from common.proto.kpi_sample_types_pb2 import KpiSampleType +from common.proto.kpi_manager_pb2 import KpiDescriptor, KpiId from common.proto.kpi_value_api_pb2_grpc import KpiValueAPIServiceServicer from common.proto.kpi_value_api_pb2 import KpiValueList, KpiValueFilter, KpiValue, KpiValueType from confluent_kafka import Producer as KafkaProducer +from prometheus_api_client import PrometheusConnect +from prometheus_api_client.utils import parse_datetime + +from kpi_manager.client.KpiManagerClient import KpiManagerClient LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('KpiValueAPI', 'NBIgRPC') @@ -63,40 +68,67 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): ) -> KpiValueList: LOGGER.debug('StoreKpiValues: Received gRPC message object: {:}'.format(request)) response = KpiValueList() - metrics = [kpi.kpi_id for kpi in request.kpi_id] - start_timestamps = [timestamp for timestamp in request.start_timestamp] - end_timestamps = [timestamp for timestamp in request.end_timestamp] - results = [] + + kpi_manager_client = KpiManagerClient() + prom_connect = PrometheusConnect(url=PROM_URL) - for start, end in zip(start_timestamps, end_timestamps): - start_str = datetime.fromtimestamp(start.seconds).isoformat() + "Z" - end_str = datetime.fromtimestamp(end.seconds).isoformat() + "Z" + metrics = [self.GetKpiSampleType(kpi, kpi_manager_client) for kpi in request.kpi_id] + start_timestamps = [parse_datetime(timestamp) for timestamp in request.start_timestamp] + end_timestamps = [parse_datetime(timestamp) for timestamp in request.end_timestamp] + prom_response = [] + for start_time, end_time in zip(start_timestamps, end_timestamps): for metric in metrics: - url = f'{PROM_URL}/api/v1/query_range' - params = { - 'query': metric, - 'start': start_str, - 'end' : end_str, - 'step' : '30s' # or any other step you need - } - response = requests.get(url, params=params) - if response.status_code == 200: - data = response.json() - for result in data['data']['result']: - for value in result['values']: - kpi_value = KpiValue( - kpi_id=metric, - timestamp=str(seconds=value[0]), - kpi_value_type=self._convert_value_to_kpi_value_type(value[1]) - ) - results.append(kpi_value) + # print(start_time, end_time, metric) + prom_response.append( + prom_connect.custom_query_range( + query = metric, # this is the metric name and label config + start_time = start_time, + end_time = end_time, + step = 30, # or any other step value (missing in gRPC Filter request) + ) + ) + + for single_resposne in prom_response: + # print ("{:}".format(single_resposne)) + for record in single_resposne: + # print("Record >>> kpi: {:} >>> time & values set: {:}".format(record['metric']['__name__'], record['values'])) + for value in record['values']: + # print("{:} - {:}".format(record['metric']['__name__'], value)) + kpi_value = KpiValue() + kpi_value.kpi_id.kpi_id = record['metric']['__name__'], + kpi_value.timestamp = value[0], + kpi_value.kpi_value_type = self.ConverValueToKpiValueType(value[1]) + response.kpi_value_list.append(kpi_value) + return response + + def GetKpiSampleType(self, kpi_value: str, kpi_manager_client): + print("--- START -----") - def _convert_value_to_kpi_value_type(self, value): + kpi_id = KpiId() + kpi_id.kpi_id.uuid = kpi_value.kpi_id.kpi_id.uuid + # print("KpiId generated: {:}".format(kpi_id)) + + try: + kpi_descriptor_object = KpiDescriptor() + kpi_descriptor_object = kpi_manager_client.GetKpiDescriptor(kpi_id) + # TODO: why kpi_descriptor_object recevies a KpiDescriptor type object not Empty type object??? + if kpi_descriptor_object.kpi_id.kpi_id.uuid == kpi_id.kpi_id.uuid: + LOGGER.info("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) + print("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) + return KpiSampleType.Name(kpi_descriptor_object.kpi_sample_type) # extract and return the name of KpiSampleType + else: + LOGGER.info("No KPI Descriptor found in DB for Kpi ID: {:}".format(kpi_id)) + print("No KPI Descriptor found in DB for Kpi ID: {:}".format(kpi_id)) + except Exception as e: + LOGGER.info("Unable to get KpiDescriptor. Error: {:}".format(e)) + print ("Unable to get KpiDescriptor. Error: {:}".format(e)) + + def ConverValueToKpiValueType(self, value): # Check if the value is an integer (int64) try: - int64_value = int(value) - return KpiValueType(int64Val=int64_value) + int_value = int(value) + return KpiValueType(int64Val=int_value) except ValueError: pass # Check if the value is a float @@ -112,7 +144,6 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): # If none of the above, treat it as a string return KpiValueType(stringVal=value) - def delivery_callback(self, err, msg): if err: LOGGER.debug('Message delivery failed: {:}'.format(err)) else: LOGGER.debug('Message delivered to topic {:}'.format(msg.topic())) diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py index b68116478..40bffa06e 100644 --- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py +++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py @@ -93,4 +93,4 @@ class MetricWriterToPrometheus: print("Metric {:} is already registered. Skipping.".format(metric_name)) else: LOGGER.error("Error while pushing metric: {}".format(e)) - raise \ No newline at end of file + raise -- GitLab From 1079b634130e913eb195471f7626f21297c7206d Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 09:58:58 +0000 Subject: [PATCH 460/602] Temporarly defines the static value of env variables to test the working of microservice. - KFK_NAMESPACE and KFK_PORT --- src/common/tools/kafka/Variables.py | 6 ++++-- src/kpi_value_writer/service/MetricWriterToPrometheus.py | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index e3ee2016a..168957a26 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -23,8 +23,10 @@ LOGGER = logging.getLogger(__name__) class KafkaConfig(Enum): KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' - KFK_NAMESPACE = get_setting('KFK_NAMESPACE') - KFK_PORT = get_setting('KFK_SERVER_PORT') + KFK_NAMESPACE = 'kafka' + # KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = '9092' + # KFK_PORT = get_setting('KFK_SERVER_PORT') # SERVER_ADDRESS = "127.0.0.1:9092" SERVER_ADDRESS = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py index 40bffa06e..81324b759 100644 --- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py +++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py @@ -94,3 +94,4 @@ class MetricWriterToPrometheus: else: LOGGER.error("Error while pushing metric: {}".format(e)) raise + -- GitLab From e9843299d390bcd45495bb3bd5a333e91e215be0 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 10:04:31 +0000 Subject: [PATCH 461/602] minor changes in code. - refine Kpi_DB.py methods. - improve description of messages. - imporve the text description. --- src/kpi_manager/database/Kpi_DB.py | 4 +--- src/kpi_value_api/tests/messages.py | 5 +++-- src/kpi_value_writer/service/MetricWriterToPrometheus.py | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/kpi_manager/database/Kpi_DB.py b/src/kpi_manager/database/Kpi_DB.py index 530abe457..49ad9c9b5 100644 --- a/src/kpi_manager/database/Kpi_DB.py +++ b/src/kpi_manager/database/Kpi_DB.py @@ -70,8 +70,7 @@ class KpiDB: session.rollback() if "psycopg2.errors.UniqueViolation" in str(e): LOGGER.error(f"Unique key voilation: {row.__class__.__name__} table. {str(e)}") - raise AlreadyExistsException(row.__class__.__name__, row, - extra_details=["Unique key voilation: {:}".format(e)] ) + raise AlreadyExistsException(row.__class__.__name__, row, extra_details=["Unique key voilation: {:}".format(e)] ) else: LOGGER.error(f"Failed to insert new row into {row.__class__.__name__} table. {str(e)}") raise OperationFailedException ("Deletion by column id", extra_details=["unable to delete row {:}".format(e)]) @@ -90,7 +89,6 @@ class KpiDB: print("{:} ID not found, No matching row: {:}".format(model.__name__, id_to_search)) return None except Exception as e: - session.rollback() LOGGER.debug(f"Failed to retrieve {model.__name__} ID. {str(e)}") raise OperationFailedException ("search by column id", extra_details=["unable to search row {:}".format(e)]) finally: diff --git a/src/kpi_value_api/tests/messages.py b/src/kpi_value_api/tests/messages.py index c2a1cbb0b..d8ad14bd4 100644 --- a/src/kpi_value_api/tests/messages.py +++ b/src/kpi_value_api/tests/messages.py @@ -18,8 +18,9 @@ from common.proto.kpi_value_api_pb2 import KpiValue, KpiValueList def create_kpi_value_list(): _create_kpi_value_list = KpiValueList() - # To run this experiment sucessfully, already existing UUID in KPI DB in necessary. - # because the UUID is used to get the descriptor form KPI DB. + # To run this experiment sucessfully, add an existing UUID of a KPI Descriptor from the KPI DB. + # This UUID is used to get the descriptor form the KPI DB. If the Kpi ID does not exists, + # some part of the code won't execute. EXISTING_KPI_IDs = ["725ce3ad-ac67-4373-bd35-8cd9d6a86e09", str(uuid.uuid4()), str(uuid.uuid4())] diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py index 81324b759..f1d079783 100644 --- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py +++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py @@ -63,8 +63,8 @@ class MetricWriterToPrometheus: def create_and_expose_cooked_kpi(self, kpi_descriptor: KpiDescriptor, kpi_value: KpiValue): # merge both gRPC messages into single varible. cooked_kpi = self.merge_kpi_descriptor_and_kpi_value(kpi_descriptor, kpi_value) - tags_to_exclude = {'kpi_description', 'kpi_sample_type', 'kpi_value'} # extracted values will be used as metric tag - metric_tags = [tag for tag in cooked_kpi.keys() if tag not in tags_to_exclude] + tags_to_exclude = {'kpi_description', 'kpi_sample_type', 'kpi_value'} + metric_tags = [tag for tag in cooked_kpi.keys() if tag not in tags_to_exclude] # These values will be used as metric tags metric_name = cooked_kpi['kpi_sample_type'] try: if metric_name not in PROM_METRICS: # Only register the metric, when it doesn't exists -- GitLab From 255602f59a6a3474f9baaa6fc335e54d24030a5d Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 14:07:29 +0000 Subject: [PATCH 462/602] Cleaning unit test and messages files. - unused imports and functions are removed --- src/kpi_manager/tests/test_kpi_manager.py | 66 ------------------- .../tests/test_kpi_value_writer.py | 23 +------ 2 files changed, 1 insertion(+), 88 deletions(-) diff --git a/src/kpi_manager/tests/test_kpi_manager.py b/src/kpi_manager/tests/test_kpi_manager.py index da149e3fe..219fdadee 100755 --- a/src/kpi_manager/tests/test_kpi_manager.py +++ b/src/kpi_manager/tests/test_kpi_manager.py @@ -93,13 +93,6 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab # Prepare Environment, should be the first test ################################################## -# # ERROR on this test --- -# def test_prepare_environment( -# context_client : ContextClient, # pylint: disable=redefined-outer-name,unused-argument -# ): -# context_id = json_context_id(DEFAULT_CONTEXT_NAME) -# context_client.SetContext(Context(**json_context(DEFAULT_CONTEXT_NAME))) -# context_client.SetTopology(Topology(**json_topology(DEFAULT_TOPOLOGY_NAME, context_id=context_id))) ########################### # Tests Implementation of Kpi Manager @@ -152,62 +145,3 @@ def test_set_list_of_KPIs(kpi_manager_client): # adding KPI for kpi in KPIs_TO_SEARCH: kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a(kpi)) - - -# ---------- 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()) -# LOGGER.info("Response gRPC message object: {:}".format(response)) -# assert isinstance(response, KpiDescriptor) - -# def test_DeleteKpiDescriptor(kpi_manager_client): -# LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ") -# response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) -# del_response = kpi_manager_client.DeleteKpiDescriptor(response) -# kpi_manager_client.GetKpiDescriptor(response) -# LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response)) -# assert isinstance(del_response, Empty) - -# def test_SelectKpiDescriptor(kpi_manager_client): -# LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ") -# kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a()) -# response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request_a()) -# LOGGER.info("Response gRPC message object: {:}".format(response)) -# assert isinstance(response, KpiDescriptorList) - -# ------------- INITIAL TESTs ---------------- -# Test case that makes use of client fixture to test server's CreateKpi method -# def test_set_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name -# # make call to server -# LOGGER.warning('test_create_kpi requesting') -# for i in range(3): -# response = kpi_manager_client.SetKpiDescriptor(create_kpi_request(str(i+1))) -# LOGGER.debug(str(response)) -# assert isinstance(response, KpiId) - -# # Test case that makes use of client fixture to test server's DeleteKpi method -# def test_delete_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name -# # make call to server -# LOGGER.warning('delete_kpi requesting') -# response = kpi_manager_client.SetKpiDescriptor(create_kpi_request('4')) -# response = kpi_manager_client.DeleteKpiDescriptor(response) -# LOGGER.debug(str(response)) -# assert isinstance(response, Empty) - -# # Test case that makes use of client fixture to test server's GetKpiDescriptor method -# def test_select_kpi_descriptor(kpi_manager_client): # pylint: disable=redefined-outer-name -# LOGGER.warning('test_selectkpidescritor begin') -# response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request()) -# LOGGER.debug(str(response)) -# assert isinstance(response, KpiDescriptorList) diff --git a/src/kpi_value_writer/tests/test_kpi_value_writer.py b/src/kpi_value_writer/tests/test_kpi_value_writer.py index 40593af97..fce043d7f 100755 --- a/src/kpi_value_writer/tests/test_kpi_value_writer.py +++ b/src/kpi_value_writer/tests/test_kpi_value_writer.py @@ -14,32 +14,12 @@ import logging from kpi_value_writer.service.KpiValueWriter import KpiValueWriter -from kpi_value_writer.tests.test_messages import create_kpi_id_request, create_kpi_descriptor_request from common.tools.kafka.Variables import KafkaTopic -from common.proto.kpi_manager_pb2 import KpiDescriptor -from kpi_manager.client.KpiManagerClient import KpiManagerClient -LOGGER = logging.getLogger(__name__) - -# def test_GetKpiDescriptor(): -# LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") -# kpi_manager_client = KpiManagerClient() -# # adding KPI -# LOGGER.info(" --->>> calling SetKpiDescriptor ") -# response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) -# # get KPI -# LOGGER.info(" --->>> calling GetKpiDescriptor with response ID") -# response = kpi_manager_client.GetKpiDescriptor(response_id) -# LOGGER.info("Response gRPC message object: {:}".format(response)) - -# LOGGER.info(" --->>> calling GetKpiDescriptor with random ID") -# rand_response = kpi_manager_client.GetKpiDescriptor(create_kpi_id_request()) -# LOGGER.info("Response gRPC message object: {:}".format(rand_response)) -# LOGGER.info("\n------------------ TEST FINISHED ---------------------\n") -# assert isinstance(response, KpiDescriptor) +LOGGER = logging.getLogger(__name__) # -------- Initial Test ---------------- def test_validate_kafka_topics(): @@ -50,4 +30,3 @@ def test_validate_kafka_topics(): def test_KafkaConsumer(): LOGGER.debug(" --->>> test_kafka_consumer: START <<<--- ") KpiValueWriter.RunKafkaConsumer() - -- GitLab From c9db34a8f3597eb06f37301283dc90cce8c218cc Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 14:09:52 +0000 Subject: [PATCH 463/602] Updated Promtheus URL - PROM_URL variable is updated with FQDN of Prometheus. --- src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index b2ebecad0..5e7c3d139 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -32,7 +32,7 @@ from kpi_manager.client.KpiManagerClient import KpiManagerClient LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('KpiValueAPI', 'NBIgRPC') -PROM_URL = "http://localhost:9090" +PROM_URL = "http://prometheus-k8s.monitoring.svc.cluster.local:9090" # TODO: updated with the env variables class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): def __init__(self): @@ -79,7 +79,8 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): prom_response = [] for start_time, end_time in zip(start_timestamps, end_timestamps): for metric in metrics: - # print(start_time, end_time, metric) + print(start_time, end_time, metric) + LOGGER.debug(">>> Query: {:}".format(metric)) prom_response.append( prom_connect.custom_query_range( query = metric, # this is the metric name and label config -- GitLab From d41319c74229c8142016b5ccf5556386acddc8ab Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 15:15:03 +0000 Subject: [PATCH 464/602] changes in README files. - README files of kpi manager/value writer/api are updated to reflect new changes. --- src/kpi_manager/README.md | 27 +++++++++++---------------- src/kpi_value_api/README.md | 23 +++++++++++++++++++++++ src/kpi_value_writer/README.md | 32 ++++++++++---------------------- 3 files changed, 44 insertions(+), 38 deletions(-) create mode 100644 src/kpi_value_api/README.md diff --git a/src/kpi_manager/README.md b/src/kpi_manager/README.md index c1feadcc4..6e9b56d93 100644 --- a/src/kpi_manager/README.md +++ b/src/kpi_manager/README.md @@ -1,29 +1,24 @@ # How to locally run and test KPI manager micro-service -## --- File links need to be updated. --- ### Pre-requisets -The following requirements should be fulfilled before the execuation of KPI management service. +Ensure the following requirements are met before executing the KPI management service: -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_management/kpi_manager/database/tests/KpiDBtests.py) python file enlist the functions to create tables and database and -[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. +1. A virtual enviornment exist with all the required packages listed in ["requirements.in"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_manager/requirements.in) sucessfully installed. +2. Verify the creation of required database and table. The +[KPI DB test](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_manager/tests/test_kpi_db.py) python file lists the functions to create tables and the database. The +[KPI Engine](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_manager/database/KpiEngine.py) file contains the DB string. ### Messages format templates -["Messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/kpi_manager/tests/test_messages.py) python file enlist the basic gRPC messages format used during the testing. +The ["messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_manager/tests/test_messages.py) python file contains templates for creating gRPC messages. -### Test file -["KPI management test"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/kpi_manager/tests/test_kpi_manager.py) python file enlist different tests conducted during the experiment. +### Unit test file +The ["KPI manager test"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_manager/tests/test_kpi_manager.py) python file lists various tests conducted to validate functionality. ### 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. Call `verify_tables` to verify the existence of KPI table. -2. Call the gRPC method `SetKpiDescriptor(KpiDescriptor)->KpiId` to add the KpiDescriptor in `Kpi` DB. `KpiDescriptor` and `KpiId` are both pre-defined gRPC message types. +2. Call the gRPC method `SetKpiDescriptor(KpiDescriptor)->KpiId` to add the KpiDescriptor to the `Kpi` DB. `KpiDescriptor` and `KpiId` are both pre-defined gRPC message types. -3. Call `GetKpiDescriptor(KpiId)->KpiDescriptor` to read the `KpiDescriptor` from DB and `DeleteKpiDescriptor(KpiId)` to delete the `KpiDescriptor` from DB. +3. Call `GetKpiDescriptor(KpiId)->KpiDescriptor` to read the `KpiDescriptor` from the DB and `DeleteKpiDescriptor(KpiId)` to delete the `KpiDescriptor` from the DB. -4. Call `SelectKpiDescriptor(KpiDescriptorFilter)->KpiDescriptorList` to get all `KpiDescriptor` objects that matches the filter criteria. `KpiDescriptorFilter` and `KpiDescriptorList` are pre-defined gRPC message types. - -## For KPI composer and KPI writer -The functionalities of KPI composer and writer is heavily dependent upon Telemetery service. Therfore, these services has other pre-requsites that are mention [here](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/telemetry/requirements.in). +4. Call `SelectKpiDescriptor(KpiDescriptorFilter)->KpiDescriptorList` to get all `KpiDescriptor` objects that matches filter criteria. `KpiDescriptorFilter` and `KpiDescriptorList` are pre-defined gRPC message types. diff --git a/src/kpi_value_api/README.md b/src/kpi_value_api/README.md new file mode 100644 index 000000000..70ba2c5e7 --- /dev/null +++ b/src/kpi_value_api/README.md @@ -0,0 +1,23 @@ +# How to locally run and test KPI Value API micro-service + +### Pre-requisets +Ensure the following requirements are met before executing the KPI Value API service. + +1. The KPI Manger service is running and Apache Kafka is running. + +2. A virtual enviornment exist with all the required packages listed in ["requirements.in"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_api/requirements.in) file sucessfully installed. + +3. Call the ["create_all_topics()"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/common/tools/kafka/Variables.py) function to verify the existence of all required topics on kafka. + +### Messages format templates +The ["messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_api/tests/messages.py) python file contains templates for creating gRPC messages. + +### Unit test file +The ["KPI Value API test"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_api/tests/test_kpi_value_api.py) python file enlist various tests conducted to validate functionality. + +### Flow of execution (Kpi Maanager Service functions) +1. Call the `create_new_topic_if_not_exists()` method to create any new topics if needed. + +2. Call `StoreKpiValues(KpiValueList)` to produce `Kpi Value` on a Kafka Topic. (The `KpiValueWriter` microservice will consume and process the `Kpi Value`) + +3. Call `SelectKpiValues(KpiValueFilter) -> KpiValueList` to read metric from the Prometheus DB. diff --git a/src/kpi_value_writer/README.md b/src/kpi_value_writer/README.md index 72ba6e559..c45a0e395 100644 --- a/src/kpi_value_writer/README.md +++ b/src/kpi_value_writer/README.md @@ -1,29 +1,17 @@ -# How to locally run and test KPI manager micro-service +# How to locally run and test the KPI Value Writer micro-service -## --- File links need to be updated. --- ### Pre-requisets -The following requirements should be fulfilled before the execuation of KPI management service. +Ensure the following requirements are meet before executing the KPI Value Writer service> -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_management/kpi_manager/database/tests/KpiDBtests.py) python file enlist the functions to create tables and database and -[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. +1. The KPI Manger and KPI Value API services are running and Apache Kafka is running. -### Messages format templates -["Messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/kpi_manager/tests/test_messages.py) python file enlist the basic gRPC messages format used during the testing. - -### Test file -["KPI management test"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/kpi_manager/tests/test_kpi_manager.py) python file enlist 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. Call `verify_tables` to verify the existence of KPI table. +2. A Virtual enviornment exist with all the required packages listed in the ["requirements.in"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_writer/requirements.in) file installed sucessfully. -2. Call the gRPC method `SetKpiDescriptor(KpiDescriptor)->KpiId` to add the KpiDescriptor in `Kpi` DB. `KpiDescriptor` and `KpiId` are both pre-defined gRPC message types. - -3. Call `GetKpiDescriptor(KpiId)->KpiDescriptor` to read the `KpiDescriptor` from DB and `DeleteKpiDescriptor(KpiId)` to delete the `KpiDescriptor` from DB. +### Messages format templates +The ["messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_writer/tests/test_messages.py) python file contains the templates to create gRPC messages. -4. Call `SelectKpiDescriptor(KpiDescriptorFilter)->KpiDescriptorList` to get all `KpiDescriptor` objects that matches the filter criteria. `KpiDescriptorFilter` and `KpiDescriptorList` are pre-defined gRPC message types. +### Unit test file +The ["KPI Value API test"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_writer/tests/test_kpi_value_writer.py) python file enlist various tests conducted to validate functionality. -## For KPI composer and KPI writer -The functionalities of KPI composer and writer is heavily dependent upon Telemetery service. Therfore, these services has other pre-requsites that are mention [here](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/telemetry/requirements.in). \ No newline at end of file +### Flow of execution +1. Call the `RunKafkaConsumer` method from the `KpiValueWriter` class to start consuming the `KPI Value` generated by the `KPI Value API` or `Telemetry`. For every valid `KPI Value` consumer from Kafka, it invokes the `PrometheusWriter` class to prepare and push the metric to the Promethues DB. -- GitLab From fb30ffd2ef6051f93833d3cd74248d30d9a6598d Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 6 Aug 2024 14:57:33 +0000 Subject: [PATCH 465/602] updated Kafka deployment script. - --- deploy/kafka.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/deploy/kafka.sh b/deploy/kafka.sh index 21ba89408..f86108011 100755 --- a/deploy/kafka.sh +++ b/deploy/kafka.sh @@ -78,11 +78,13 @@ function kafka_deploy() { echo "Apache Kafka" echo ">>> Checking if Apache Kafka is deployed ... " -if [ "$KFK_REDEPLOY" == "YES" ]; then +if [ "$KFK_REDEPLOY" = "YES" ]; then + echo ">>> Redeploying kafka namespace" kafka_deploy -elif kubectl get --namespace ${KFK_NAMESPACE} deployments.apps &> /dev/null; then - echo ">>> Apache Kafka already present; skipping step." +elif kubectl get namespace "${KFK_NAMESPACE}" &> /dev/null; then + echo ">>> Apache Kafka already present; skipping step." else + echo ">>> Kafka namespace doesn't exists. Deploying kafka namespace" kafka_deploy fi echo -- GitLab From a2398152678ac4fad863b614dfa8ad4fb0fb364e Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 6 Aug 2024 15:04:27 +0000 Subject: [PATCH 466/602] updated FrontendTelemetery.proto file. - added start_time and end_time in proto. --- proto/telemetry_frontend.proto | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/proto/telemetry_frontend.proto b/proto/telemetry_frontend.proto index dbc1e8bf6..614d10cf0 100644 --- a/proto/telemetry_frontend.proto +++ b/proto/telemetry_frontend.proto @@ -19,9 +19,9 @@ import "context.proto"; import "kpi_manager.proto"; service TelemetryFrontendService { - rpc StartCollector (Collector ) returns (CollectorId ) {} - rpc StopCollector (CollectorId ) returns (context.Empty) {} - rpc SelectCollectors(CollectorFilter) returns (CollectorList) {} + rpc StartCollector (Collector ) returns (CollectorId ) {} + rpc StopCollector (CollectorId ) returns (context.Empty) {} + rpc SelectCollectors (CollectorFilter) returns (CollectorList) {} } message CollectorId { @@ -29,10 +29,12 @@ 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_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 + context.Timestamp start_time = 5; // Timestamp when Collector start execution + context.Timestamp end_time = 6; // Timestamp when Collector stop execution } message CollectorFilter { -- GitLab From ee9c2b6c1594980da3aececd021c653852df9adb Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 6 Aug 2024 15:10:17 +0000 Subject: [PATCH 467/602] changes in Telemetry Frontend service and client. - collector description is removed from TelemetryModel. - "ConvertCollectorToRow" is added in Telemetry Model class. - NameMapping is removed from service client and service. - TelemetryDB object name and import is updated with correct class name. - StartCollector is restructured. - "PublishRequestOnKafka" is restructured. --- src/telemetry/database/TelemetryModel.py | 29 +++-- .../service/TelemetryFrontendService.py | 5 +- .../TelemetryFrontendServiceServicerImpl.py | 107 +++++++----------- src/telemetry/frontend/tests/Messages.py | 3 +- 4 files changed, 66 insertions(+), 78 deletions(-) diff --git a/src/telemetry/database/TelemetryModel.py b/src/telemetry/database/TelemetryModel.py index 95f692e4b..1faf16e1a 100644 --- a/src/telemetry/database/TelemetryModel.py +++ b/src/telemetry/database/TelemetryModel.py @@ -28,17 +28,32 @@ class Collector(Base): collector_id = Column(UUID(as_uuid=False), primary_key=True) kpi_id = Column(UUID(as_uuid=False), nullable=False) - collector_decription = Column(String , nullable=False) sampling_duration_s = Column(Float , nullable=False) sampling_interval_s = Column(Float , nullable=False) - start_timestamp = Column(Float , nullable=False) - end_timestamp = Column(Float , nullable=False) + start_timestamp = Column(String , nullable=False) + end_timestamp = Column(String , nullable=False) # helps in logging the information def __repr__(self): - return (f"") + return (f"") + + @classmethod + def ConvertCollectorToRow(cls, request): + """ + Create an instance of collector rows from a request object. + Args: request: The request object containing collector gRPC message. + Returns: A row (an instance of Collector table) initialized with content of the request. + """ + return cls( + collector_id = request.collector_id.collector_id.uuid, + kpi_id = request.kpi_id.kpi_id.uuid, + sampling_duration_s = request.duration_s, + sampling_interval_s = request.interval_s, + start_timestamp = request.start_time.timestamp, + end_timestamp = request.end_time.timestamp + ) # add method to convert gRPC requests to rows if necessary... + diff --git a/src/telemetry/frontend/service/TelemetryFrontendService.py b/src/telemetry/frontend/service/TelemetryFrontendService.py index dc3f8df36..abd361aa0 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendService.py +++ b/src/telemetry/frontend/service/TelemetryFrontendService.py @@ -14,17 +14,16 @@ from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc -from monitoring.service.NameMapping import NameMapping from common.tools.service.GenericGrpcService import GenericGrpcService from common.proto.telemetry_frontend_pb2_grpc import add_TelemetryFrontendServiceServicer_to_server from telemetry.frontend.service.TelemetryFrontendServiceServicerImpl import TelemetryFrontendServiceServicerImpl class TelemetryFrontendService(GenericGrpcService): - def __init__(self, name_mapping : NameMapping, cls_name: str = __name__) -> None: + def __init__(self, cls_name: str = __name__) -> None: port = get_service_port_grpc(ServiceNameEnum.TELEMETRYFRONTEND) super().__init__(port, cls_name=cls_name) - self.telemetry_frontend_servicer = TelemetryFrontendServiceServicerImpl(name_mapping) + self.telemetry_frontend_servicer = TelemetryFrontendServiceServicerImpl() def install_servicers(self): add_TelemetryFrontendServiceServicer_to_server(self.telemetry_frontend_servicer, self.server) diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index e6830ad67..49641aae1 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -14,100 +14,74 @@ import ast import threading -import time from typing import Tuple, Any import grpc import logging +from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method +from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from confluent_kafka import Consumer as KafkaConsumer -from common.proto.context_pb2 import Empty -from monitoring.service.NameMapping import NameMapping from confluent_kafka import Producer as KafkaProducer -from confluent_kafka import KafkaException from confluent_kafka import KafkaError + +from common.proto.context_pb2 import Empty + from common.proto.telemetry_frontend_pb2 import CollectorId, Collector, CollectorFilter, CollectorList -from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.proto.telemetry_frontend_pb2_grpc import TelemetryFrontendServiceServicer - from telemetry.database.TelemetryModel import Collector as CollectorModel -from telemetry.database.managementDB import managementDB +from telemetry.database.Telemetry_DB import TelemetryDB + LOGGER = logging.getLogger(__name__) -METRICS_POOL = MetricsPool('Monitoring', 'TelemetryFrontend') -KAFKA_SERVER_IP = '127.0.0.1:9092' +METRICS_POOL = MetricsPool('TelemetryFrontend', 'NBIgRPC') ACTIVE_COLLECTORS = [] -KAFKA_TOPICS = {'request' : 'topic_request', - 'response': 'topic_response'} class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): - def __init__(self, name_mapping : NameMapping): + def __init__(self): LOGGER.info('Init TelemetryFrontendService') - self.managementDBobj = managementDB() - self.kafka_producer = KafkaProducer({'bootstrap.servers': KAFKA_SERVER_IP,}) - self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KAFKA_SERVER_IP, - 'group.id' : 'frontend', - 'auto.offset.reset' : 'latest'}) + self.DBobj = TelemetryDB() + self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value}) + self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value, + 'group.id' : 'frontend', + 'auto.offset.reset' : 'latest'}) - def add_collector_to_db(self, request: Collector ): # type: ignore - try: - # Create a new Collector instance - collector_to_insert = CollectorModel() - collector_to_insert.collector_id = request.collector_id.collector_id.uuid - collector_to_insert.kpi_id = request.kpi_id.kpi_id.uuid - # collector_to_insert.collector_decription= request.collector - collector_to_insert.sampling_duration_s = request.duration_s - collector_to_insert.sampling_interval_s = request.interval_s - collector_to_insert.start_timestamp = time.time() - collector_to_insert.end_timestamp = time.time() - managementDB.add_row_to_db(collector_to_insert) - except Exception as e: - LOGGER.info("Unable to create collectorModel class object. {:}".format(e)) - - # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StartCollector(self, request : Collector, grpc_context: grpc.ServicerContext # type: ignore ) -> CollectorId: # type: ignore - # push info to frontend db LOGGER.info ("gRPC message: {:}".format(request)) response = CollectorId() - _collector_id = str(request.collector_id.collector_id.uuid) - _collector_kpi_id = str(request.kpi_id.kpi_id.uuid) - _collector_duration = int(request.duration_s) - _collector_interval = int(request.interval_s) - # pushing Collector to DB - self.add_collector_to_db(request) - self.publish_to_kafka_request_topic(_collector_id, _collector_kpi_id, _collector_duration, _collector_interval) - # self.run_publish_to_kafka_request_topic(_collector_id, _collector_kpi_id, _collector_duration, _collector_interval) + + # TODO: Verify the presence of Kpi ID in KpiDB or assume that KPI ID already exists. + self.DBobj.add_row_to_db( + CollectorModel.ConvertCollectorToRow(request) + ) + self.PublishRequestOnKafka(request) + response.collector_id.uuid = request.collector_id.collector_id.uuid # type: ignore return response - - def run_publish_to_kafka_request_topic(self, msg_key: str, kpi: str, duration : int, interval: int): - # Add threading.Thread() response to dictonary and call start() in the next statement - threading.Thread(target=self.publish_to_kafka_request_topic, args=(msg_key, kpi, duration, interval)).start() - - def publish_to_kafka_request_topic(self, - collector_id: str, kpi: str, duration : int, interval: int - ): + + def PublishRequestOnKafka(self, collector_obj): """ - Method to generate collector request to Kafka topic. + Method to generate collector request on Kafka. """ - # time.sleep(5) - # producer_configs = { - # 'bootstrap.servers': KAFKA_SERVER_IP, - # } - # topic_request = "topic_request" - msg_value : Tuple [str, int, int] = (kpi, duration, interval) - # print ("Request generated: ", "Colletcor Id: ", collector_id, \ - # ", \nKPI: ", kpi, ", Duration: ", duration, ", Interval: ", interval) - # producerObj = KafkaProducer(producer_configs) - self.kafka_producer.produce(KAFKA_TOPICS['request'], key=collector_id, value= str(msg_value), callback=self.delivery_callback) - # producerObj.produce(KAFKA_TOPICS['request'], key=collector_id, value= str(msg_value), callback=self.delivery_callback) - LOGGER.info("Collector Request Generated: {:}, {:}, {:}, {:}".format(collector_id, kpi, duration, interval)) - # producerObj.produce(topic_request, key=collector_id, value= str(msg_value), callback=self.delivery_callback) + collector_id = collector_obj.collector_id.collector_id.uuid + collector_to_generate : Tuple [str, int, int] = ( + collector_obj.kpi_id.kpi_id.uuid, + collector_obj.duration_s, + collector_obj.interval_s + ) + self.kafka_producer.produce( + KafkaTopic.REQUEST.value, + key = collector_id, + value = str(collector_to_generate), + callback = self.delivery_callback + ) + LOGGER.info("Collector Request Generated: Collector Id: {:}, Value: {:}".format(collector_id, collector_to_generate)) ACTIVE_COLLECTORS.append(collector_id) self.kafka_producer.flush() - + def run_kafka_listener(self): # print ("--- STARTED: run_kafka_listener ---") threading.Thread(target=self.kafka_listener).start() @@ -201,4 +175,5 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): response.collector_list.append(collector_obj) return response except Exception as e: - LOGGER.info('Unable to process response {:}'.format(e)) \ No newline at end of file + LOGGER.info('Unable to process response {:}'.format(e)) + diff --git a/src/telemetry/frontend/tests/Messages.py b/src/telemetry/frontend/tests/Messages.py index 1205898d1..106c2a5a7 100644 --- a/src/telemetry/frontend/tests/Messages.py +++ b/src/telemetry/frontend/tests/Messages.py @@ -17,7 +17,6 @@ import random from common.proto import telemetry_frontend_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType - # ----------------------- "2nd" Iteration -------------------------------- def create_collector_id(): _collector_id = telemetry_frontend_pb2.CollectorId() @@ -32,7 +31,7 @@ def create_collector_id(): def create_collector_request(): _create_collector_request = telemetry_frontend_pb2.Collector() _create_collector_request.collector_id.collector_id.uuid = str(uuid.uuid4()) - _create_collector_request.kpi_id.kpi_id.uuid = "165d20c5-a446-42fa-812f-e2b7ed283c6f" + _create_collector_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) # _create_collector_request.collector = "collector description" _create_collector_request.duration_s = float(random.randint(8, 16)) _create_collector_request.interval_s = float(random.randint(2, 4)) -- GitLab From b76fe6df7957e54b074fb1ae33e9917a20f09f56 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 6 Aug 2024 15:12:42 +0000 Subject: [PATCH 468/602] Telemetry frontend test file updated. - pytest logging is changed to DEBUG. - ManagemetDB test is removed. - Irrelevent imports and methods are removed from the test file. - --- .../run_tests_locally-telemetry-frontend.sh | 2 +- scripts/run_tests_locally-telemetry-mgtDB.sh | 26 --- src/telemetry/frontend/tests/test_frontend.py | 169 +++++------------- 3 files changed, 45 insertions(+), 152 deletions(-) delete mode 100755 scripts/run_tests_locally-telemetry-mgtDB.sh diff --git a/scripts/run_tests_locally-telemetry-frontend.sh b/scripts/run_tests_locally-telemetry-frontend.sh index 7652ccb58..a2a1de523 100755 --- a/scripts/run_tests_locally-telemetry-frontend.sh +++ b/scripts/run_tests_locally-telemetry-frontend.sh @@ -24,5 +24,5 @@ cd $PROJECTDIR/src # python3 kpi_manager/tests/test_unitary.py RCFILE=$PROJECTDIR/coverage/.coveragerc -python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ +python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ telemetry/frontend/tests/test_frontend.py diff --git a/scripts/run_tests_locally-telemetry-mgtDB.sh b/scripts/run_tests_locally-telemetry-mgtDB.sh deleted file mode 100755 index 8b68104ea..000000000 --- a/scripts/run_tests_locally-telemetry-mgtDB.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. - - -PROJECTDIR=`pwd` - -cd $PROJECTDIR/src -# RCFILE=$PROJECTDIR/coverage/.coveragerc -# coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \ -# kpi_manager/tests/test_unitary.py - -RCFILE=$PROJECTDIR/coverage/.coveragerc -python3 -m pytest --log-cli-level=INFO --verbose \ - telemetry/database/tests/managementDBtests.py diff --git a/src/telemetry/frontend/tests/test_frontend.py b/src/telemetry/frontend/tests/test_frontend.py index 002cc4307..ca2d61370 100644 --- a/src/telemetry/frontend/tests/test_frontend.py +++ b/src/telemetry/frontend/tests/test_frontend.py @@ -13,129 +13,39 @@ # limitations under the License. import os -import time import pytest import logging -from typing import Union -from common.proto.context_pb2 import Empty +# from common.proto.context_pb2 import Empty from common.Constants import ServiceNameEnum from common.proto.telemetry_frontend_pb2 import CollectorId, CollectorList -from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server -from context.client.ContextClient import ContextClient -from common.tools.service.GenericGrpcService import GenericGrpcService -from common.tests.MockServicerImpl_Context import MockServicerImpl_Context + from common.Settings import ( get_service_port_grpc, get_env_var_name, ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC) from telemetry.frontend.client.TelemetryFrontendClient import TelemetryFrontendClient from telemetry.frontend.service.TelemetryFrontendService import TelemetryFrontendService -from telemetry.frontend.service.TelemetryFrontendServiceServicerImpl import TelemetryFrontendServiceServicerImpl -from telemetry.frontend.tests.Messages import ( create_collector_request, create_collector_filter) -from telemetry.database.managementDB import managementDB -from telemetry.database.TelemetryEngine import TelemetryEngine - -from device.client.DeviceClient import DeviceClient -from device.service.DeviceService import DeviceService -from device.service.driver_api.DriverFactory import DriverFactory -from device.service.driver_api.DriverInstanceCache import DriverInstanceCache - -from monitoring.service.NameMapping import NameMapping +from telemetry.frontend.tests.Messages import ( + create_collector_request, create_collector_filter) -os.environ['DEVICE_EMULATED_ONLY'] = 'TRUE' -from device.service.drivers import DRIVERS ########################### # Tests Setup ########################### LOCAL_HOST = '127.0.0.1' -MOCKSERVICE_PORT = 10000 -TELEMETRY_FRONTEND_PORT = str(MOCKSERVICE_PORT) + str(get_service_port_grpc(ServiceNameEnum.TELEMETRYFRONTEND)) +TELEMETRY_FRONTEND_PORT = str(get_service_port_grpc(ServiceNameEnum.TELEMETRYFRONTEND)) os.environ[get_env_var_name(ServiceNameEnum.TELEMETRYFRONTEND, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) os.environ[get_env_var_name(ServiceNameEnum.TELEMETRYFRONTEND, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(TELEMETRY_FRONTEND_PORT) LOGGER = logging.getLogger(__name__) -class MockContextService(GenericGrpcService): - # Mock Service implementing Context to simplify unitary tests of Monitoring - - def __init__(self, bind_port: Union[str, int]) -> None: - super().__init__(bind_port, LOCAL_HOST, enable_health_servicer=False, cls_name='MockService') - - # pylint: disable=attribute-defined-outside-init - def install_servicers(self): - self.context_servicer = MockServicerImpl_Context() - add_ContextServiceServicer_to_server(self.context_servicer, self.server) - -@pytest.fixture(scope='session') -def context_service(): - LOGGER.info('Initializing MockContextService...') - _service = MockContextService(MOCKSERVICE_PORT) - _service.start() - - LOGGER.info('Yielding MockContextService...') - yield _service - - LOGGER.info('Terminating MockContextService...') - _service.context_servicer.msg_broker.terminate() - _service.stop() - - LOGGER.info('Terminated MockContextService...') - -@pytest.fixture(scope='session') -def context_client(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument - LOGGER.info('Initializing ContextClient...') - _client = ContextClient() - - LOGGER.info('Yielding ContextClient...') - yield _client - - LOGGER.info('Closing ContextClient...') - _client.close() - - LOGGER.info('Closed ContextClient...') - -@pytest.fixture(scope='session') -def device_service(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument - LOGGER.info('Initializing DeviceService...') - driver_factory = DriverFactory(DRIVERS) - driver_instance_cache = DriverInstanceCache(driver_factory) - _service = DeviceService(driver_instance_cache) - _service.start() - - # yield the server, when test finishes, execution will resume to stop it - LOGGER.info('Yielding DeviceService...') - yield _service - - LOGGER.info('Terminating DeviceService...') - _service.stop() - - LOGGER.info('Terminated DeviceService...') - @pytest.fixture(scope='session') -def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument - LOGGER.info('Initializing DeviceClient...') - _client = DeviceClient() - - LOGGER.info('Yielding DeviceClient...') - yield _client - - LOGGER.info('Closing DeviceClient...') - _client.close() - - LOGGER.info('Closed DeviceClient...') - -@pytest.fixture(scope='session') -def telemetryFrontend_service( - context_service : MockContextService, - device_service : DeviceService - ): +def telemetryFrontend_service(): LOGGER.info('Initializing TelemetryFrontendService...') - name_mapping = NameMapping() - _service = TelemetryFrontendService(name_mapping) + _service = TelemetryFrontendService() _service.start() # yield the server, when test finishes, execution will resume to stop it @@ -168,37 +78,46 @@ def telemetryFrontend_client( # Tests Implementation of Telemetry Frontend ########################### -def test_verify_db_and_table(): - LOGGER.info(' >>> test_verify_database_and_tables START: <<< ') - _engine = TelemetryEngine.get_engine() - managementDB.create_database(_engine) - managementDB.create_tables(_engine) - +# ------- Re-structuring Test --------- def test_StartCollector(telemetryFrontend_client): LOGGER.info(' >>> test_StartCollector START: <<< ') response = telemetryFrontend_client.StartCollector(create_collector_request()) LOGGER.debug(str(response)) assert isinstance(response, CollectorId) -def test_run_kafka_listener(): - LOGGER.info(' >>> test_run_kafka_listener START: <<< ') - name_mapping = NameMapping() - TelemetryFrontendServiceObj = TelemetryFrontendServiceServicerImpl(name_mapping) - response = TelemetryFrontendServiceObj.run_kafka_listener() # Method "run_kafka_listener" is not define in frontend.proto - LOGGER.debug(str(response)) - assert isinstance(response, bool) - -def test_StopCollector(telemetryFrontend_client): - LOGGER.info(' >>> test_StopCollector START: <<< ') - _collector_id = telemetryFrontend_client.StartCollector(create_collector_request()) - time.sleep(3) # wait for small amount before call the stopCollecter() - response = telemetryFrontend_client.StopCollector(_collector_id) - LOGGER.debug(str(response)) - assert isinstance(response, Empty) - -def test_select_collectors(telemetryFrontend_client): - LOGGER.info(' >>> test_select_collector requesting <<< ') - response = telemetryFrontend_client.SelectCollectors(create_collector_filter()) - LOGGER.info('Received Rows after applying Filter: {:} '.format(response)) - LOGGER.debug(str(response)) - assert isinstance(response, CollectorList) \ No newline at end of file +# ------- previous test ---------------- + +# def test_verify_db_and_table(): +# LOGGER.info(' >>> test_verify_database_and_tables START: <<< ') +# _engine = TelemetryEngine.get_engine() +# managementDB.create_database(_engine) +# managementDB.create_tables(_engine) + +# def test_StartCollector(telemetryFrontend_client): +# LOGGER.info(' >>> test_StartCollector START: <<< ') +# response = telemetryFrontend_client.StartCollector(create_collector_request()) +# LOGGER.debug(str(response)) +# assert isinstance(response, CollectorId) + +# def test_run_kafka_listener(): +# LOGGER.info(' >>> test_run_kafka_listener START: <<< ') +# name_mapping = NameMapping() +# TelemetryFrontendServiceObj = TelemetryFrontendServiceServicerImpl(name_mapping) +# response = TelemetryFrontendServiceObj.run_kafka_listener() # Method "run_kafka_listener" is not define in frontend.proto +# LOGGER.debug(str(response)) +# assert isinstance(response, bool) + +# def test_StopCollector(telemetryFrontend_client): +# LOGGER.info(' >>> test_StopCollector START: <<< ') +# _collector_id = telemetryFrontend_client.StartCollector(create_collector_request()) +# time.sleep(3) # wait for small amount before call the stopCollecter() +# response = telemetryFrontend_client.StopCollector(_collector_id) +# LOGGER.debug(str(response)) +# assert isinstance(response, Empty) + +# def test_select_collectors(telemetryFrontend_client): +# LOGGER.info(' >>> test_select_collector requesting <<< ') +# response = telemetryFrontend_client.SelectCollectors(create_collector_filter()) +# LOGGER.info('Received Rows after applying Filter: {:} '.format(response)) +# LOGGER.debug(str(response)) +# assert isinstance(response, CollectorList) \ No newline at end of file -- GitLab From c32d13aa7bdd6cff015e61e38b3d1aeb1f6e892a Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 8 Aug 2024 09:32:37 +0000 Subject: [PATCH 469/602] Telemetry Frontend gRPC NBI Re-structuring - Changed the column type of the start and end timestamps to Float. - Added ConvertRowToCollector() in TelemetryModel. - Renamed the class variable from "DBobj" to "tele_db_obj". - Renamed the local variable from "collector_id" to "collector_uuid". - Added PublishStopRequestOnKafka() to publish the stop collector request on Kafka. - Improved the test files. --- src/telemetry/database/TelemetryModel.py | 24 +++++-- src/telemetry/database/Telemetry_DB.py | 6 +- .../TelemetryFrontendServiceServicerImpl.py | 64 +++++++++++++------ src/telemetry/frontend/tests/Messages.py | 54 ++-------------- src/telemetry/frontend/tests/test_frontend.py | 15 ++++- 5 files changed, 86 insertions(+), 77 deletions(-) diff --git a/src/telemetry/database/TelemetryModel.py b/src/telemetry/database/TelemetryModel.py index 1faf16e1a..611ce7e70 100644 --- a/src/telemetry/database/TelemetryModel.py +++ b/src/telemetry/database/TelemetryModel.py @@ -16,6 +16,7 @@ import logging from sqlalchemy.dialects.postgresql import UUID from sqlalchemy import Column, String, Float from sqlalchemy.orm import registry +from common.proto import telemetry_frontend_pb2 logging.basicConfig(level=logging.INFO) LOGGER = logging.getLogger(__name__) @@ -30,8 +31,8 @@ class Collector(Base): kpi_id = Column(UUID(as_uuid=False), nullable=False) sampling_duration_s = Column(Float , nullable=False) sampling_interval_s = Column(Float , nullable=False) - start_timestamp = Column(String , nullable=False) - end_timestamp = Column(String , nullable=False) + start_timestamp = Column(Float , nullable=False) + end_timestamp = Column(Float , nullable=False) # helps in logging the information def __repr__(self): @@ -42,7 +43,7 @@ class Collector(Base): @classmethod def ConvertCollectorToRow(cls, request): """ - Create an instance of collector rows from a request object. + Create an instance of Collector table rows from a request object. Args: request: The request object containing collector gRPC message. Returns: A row (an instance of Collector table) initialized with content of the request. """ @@ -55,5 +56,18 @@ class Collector(Base): end_timestamp = request.end_time.timestamp ) -# add method to convert gRPC requests to rows if necessary... - + @classmethod + def ConvertRowToCollector(cls, row): + """ + Create and return a dictionary representation of a Collector table instance. + Args: row: The Collector table instance (row) containing the data. + Returns: collector gRPC message initialized with the content of a row. + """ + response = telemetry_frontend_pb2.Collector() + response.collector_id.collector_id.uuid = row.collector_id + response.kpi_id.kpi_id.uuid = row.kpi_id + response.duration_s = row.sampling_duration_s + response.interval_s = row.sampling_interval_s + response.start_time.timestamp = row.start_timestamp + response.end_time.timestamp = row.end_timestamp + return response diff --git a/src/telemetry/database/Telemetry_DB.py b/src/telemetry/database/Telemetry_DB.py index ec7da9e40..32acfd73a 100644 --- a/src/telemetry/database/Telemetry_DB.py +++ b/src/telemetry/database/Telemetry_DB.py @@ -121,13 +121,13 @@ class TelemetryDB: query = session.query(CollectorModel) # Apply filters based on the filter_object if filter_object.kpi_id: - query = query.filter(CollectorModel.kpi_id.in_([k.kpi_id.uuid for k in filter_object.kpi_id])) + query = query.filter(CollectorModel.kpi_id.in_([k.kpi_id.uuid for k in filter_object.kpi_id])) result = query.all() - + # query should be added to return all rows if result: LOGGER.debug(f"Fetched filtered rows from {model.__name__} table with filters: {filter_object}") # - Results: {result} else: - LOGGER.debug(f"No matching row found in {model.__name__} table with filters: {filter_object}") + LOGGER.warning(f"No matching row found in {model.__name__} table with filters: {filter_object}") return result except Exception as e: LOGGER.error(f"Error fetching filtered rows from {model.__name__} table with filters {filter_object} ::: {e}") diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index 49641aae1..29c192bdf 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -34,18 +34,20 @@ from telemetry.database.Telemetry_DB import TelemetryDB LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('TelemetryFrontend', 'NBIgRPC') -ACTIVE_COLLECTORS = [] +ACTIVE_COLLECTORS = [] # keep and can be populated from DB class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): def __init__(self): LOGGER.info('Init TelemetryFrontendService') - self.DBobj = TelemetryDB() + self.tele_db_obj = TelemetryDB() self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value}) self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value, 'group.id' : 'frontend', 'auto.offset.reset' : 'latest'}) + # --->>> SECTION: StartCollector with all helper methods <<<--- + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StartCollector(self, request : Collector, grpc_context: grpc.ServicerContext # type: ignore @@ -54,7 +56,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): response = CollectorId() # TODO: Verify the presence of Kpi ID in KpiDB or assume that KPI ID already exists. - self.DBobj.add_row_to_db( + self.tele_db_obj.add_row_to_db( CollectorModel.ConvertCollectorToRow(request) ) self.PublishRequestOnKafka(request) @@ -66,7 +68,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): """ Method to generate collector request on Kafka. """ - collector_id = collector_obj.collector_id.collector_id.uuid + collector_uuid = collector_obj.collector_id.collector_id.uuid collector_to_generate : Tuple [str, int, int] = ( collector_obj.kpi_id.kpi_id.uuid, collector_obj.duration_s, @@ -74,12 +76,12 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): ) self.kafka_producer.produce( KafkaTopic.REQUEST.value, - key = collector_id, + key = collector_uuid, value = str(collector_to_generate), callback = self.delivery_callback ) - LOGGER.info("Collector Request Generated: Collector Id: {:}, Value: {:}".format(collector_id, collector_to_generate)) - ACTIVE_COLLECTORS.append(collector_id) + LOGGER.info("Collector Request Generated: Collector Id: {:}, Value: {:}".format(collector_uuid, collector_to_generate)) + ACTIVE_COLLECTORS.append(collector_uuid) self.kafka_producer.flush() def run_kafka_listener(self): @@ -141,39 +143,59 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): msg (Message): Kafka message object. """ if err: - print(f'Message delivery failed: {err}') + LOGGER.debug('Message delivery failed: {:}'.format(err)) + print('Message delivery failed: {:}'.format(err)) else: - print(f'Message delivered to topic {msg.topic()}') + LOGGER.debug('Message delivered to topic {:}'.format(msg.topic())) + print('Message delivered to topic {:}'.format(msg.topic())) + + # <<<--- SECTION: StopCollector with all helper methods --->>> @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StopCollector(self, request : CollectorId, grpc_context: grpc.ServicerContext # type: ignore ) -> Empty: # type: ignore LOGGER.info ("gRPC message: {:}".format(request)) - _collector_id = request.collector_id.uuid - self.publish_to_kafka_request_topic(_collector_id, "", -1, -1) + self.PublishStopRequestOnKafka(request) return Empty() + def PublishStopRequestOnKafka(self, collector_id): + """ + Method to generate stop collector request on Kafka. + """ + collector_uuid = collector_id.collector_id.uuid + collector_to_stop : Tuple [str, int, int] = ( + collector_uuid , -1, -1 + ) + self.kafka_producer.produce( + KafkaTopic.REQUEST.value, + key = collector_uuid, + value = str(collector_to_stop), + callback = self.delivery_callback + ) + LOGGER.info("Collector Stop Request Generated: Collector Id: {:}, Value: {:}".format(collector_uuid, collector_to_stop)) + try: + ACTIVE_COLLECTORS.remove(collector_uuid) + except ValueError: + LOGGER.warning('Collector ID {:} not found in active collector list'.format(collector_uuid)) + self.kafka_producer.flush() + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SelectCollectors(self, request : CollectorFilter, contextgrpc_context: grpc.ServicerContext # type: ignore ) -> CollectorList: # type: ignore LOGGER.info("gRPC message: {:}".format(request)) response = CollectorList() - filter_to_apply = dict() - filter_to_apply['kpi_id'] = request.kpi_id[0].kpi_id.uuid - # filter_to_apply['duration_s'] = request.duration_s[0] + try: - rows = self.managementDBobj.select_with_filter(CollectorModel, **filter_to_apply) + rows = self.tele_db_obj.select_with_filter(CollectorModel, request) except Exception as e: LOGGER.info('Unable to apply filter on kpi descriptor. {:}'.format(e)) try: - if len(rows) != 0: - for row in rows: - collector_obj = Collector() - collector_obj.collector_id.collector_id.uuid = row.collector_id - response.collector_list.append(collector_obj) + for row in rows: + collector_obj = CollectorModel.ConvertRowToCollector(row) + response.collector_list.append(collector_obj) return response except Exception as e: - LOGGER.info('Unable to process response {:}'.format(e)) + LOGGER.info('Unable to process filter response {:}'.format(e)) diff --git a/src/telemetry/frontend/tests/Messages.py b/src/telemetry/frontend/tests/Messages.py index 106c2a5a7..a0e93e8a1 100644 --- a/src/telemetry/frontend/tests/Messages.py +++ b/src/telemetry/frontend/tests/Messages.py @@ -16,67 +16,27 @@ import uuid import random from common.proto import telemetry_frontend_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType +from common.proto.kpi_manager_pb2 import KpiId # ----------------------- "2nd" Iteration -------------------------------- def create_collector_id(): _collector_id = telemetry_frontend_pb2.CollectorId() - _collector_id.collector_id.uuid = uuid.uuid4() + # _collector_id.collector_id.uuid = str(uuid.uuid4()) + _collector_id.collector_id.uuid = "5d45f53f-d567-429f-9427-9196ac72ff0c" return _collector_id -# def create_collector_id_a(coll_id_str : str): -# _collector_id = telemetry_frontend_pb2.CollectorId() -# _collector_id.collector_id.uuid = str(coll_id_str) -# return _collector_id - def create_collector_request(): _create_collector_request = telemetry_frontend_pb2.Collector() _create_collector_request.collector_id.collector_id.uuid = str(uuid.uuid4()) _create_collector_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) - # _create_collector_request.collector = "collector description" _create_collector_request.duration_s = float(random.randint(8, 16)) _create_collector_request.interval_s = float(random.randint(2, 4)) return _create_collector_request def create_collector_filter(): _create_collector_filter = telemetry_frontend_pb2.CollectorFilter() - new_kpi_id = _create_collector_filter.kpi_id.add() - new_kpi_id.kpi_id.uuid = "165d20c5-a446-42fa-812f-e2b7ed283c6f" + kpi_id_obj = KpiId() + # kpi_id_obj.kpi_id.uuid = str(uuid.uuid4()) + kpi_id_obj.kpi_id.uuid = "a7237fa3-caf4-479d-84b6-4d9f9738fb7f" + _create_collector_filter.kpi_id.append(kpi_id_obj) return _create_collector_filter - -# ----------------------- "First" Iteration -------------------------------- -# def create_collector_request_a(): -# _create_collector_request_a = telemetry_frontend_pb2.Collector() -# _create_collector_request_a.collector_id.collector_id.uuid = "-1" -# return _create_collector_request_a - -# def create_collector_request_b(str_kpi_id, coll_duration_s, coll_interval_s -# ) -> telemetry_frontend_pb2.Collector: -# _create_collector_request_b = telemetry_frontend_pb2.Collector() -# _create_collector_request_b.collector_id.collector_id.uuid = '1' -# _create_collector_request_b.kpi_id.kpi_id.uuid = str_kpi_id -# _create_collector_request_b.duration_s = coll_duration_s -# _create_collector_request_b.interval_s = coll_interval_s -# return _create_collector_request_b - -# def create_collector_filter(): -# _create_collector_filter = telemetry_frontend_pb2.CollectorFilter() -# new_collector_id = _create_collector_filter.collector_id.add() -# new_collector_id.collector_id.uuid = "COLL1" -# new_kpi_id = _create_collector_filter.kpi_id.add() -# new_kpi_id.kpi_id.uuid = "KPI1" -# new_device_id = _create_collector_filter.device_id.add() -# new_device_id.device_uuid.uuid = 'DEV1' -# new_service_id = _create_collector_filter.service_id.add() -# new_service_id.service_uuid.uuid = 'SERV1' -# new_slice_id = _create_collector_filter.slice_id.add() -# new_slice_id.slice_uuid.uuid = 'SLC1' -# new_endpoint_id = _create_collector_filter.endpoint_id.add() -# new_endpoint_id.endpoint_uuid.uuid = 'END1' -# new_connection_id = _create_collector_filter.connection_id.add() -# new_connection_id.connection_uuid.uuid = 'CON1' -# _create_collector_filter.kpi_sample_type.append(KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED) -# return _create_collector_filter - -# def create_collector_list(): -# _create_collector_list = telemetry_frontend_pb2.CollectorList() -# return _create_collector_list \ No newline at end of file diff --git a/src/telemetry/frontend/tests/test_frontend.py b/src/telemetry/frontend/tests/test_frontend.py index ca2d61370..d967e306a 100644 --- a/src/telemetry/frontend/tests/test_frontend.py +++ b/src/telemetry/frontend/tests/test_frontend.py @@ -19,6 +19,7 @@ import logging # from common.proto.context_pb2 import Empty from common.Constants import ServiceNameEnum from common.proto.telemetry_frontend_pb2 import CollectorId, CollectorList +from common.proto.context_pb2 import Empty from common.Settings import ( get_service_port_grpc, get_env_var_name, ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC) @@ -26,7 +27,7 @@ from common.Settings import ( from telemetry.frontend.client.TelemetryFrontendClient import TelemetryFrontendClient from telemetry.frontend.service.TelemetryFrontendService import TelemetryFrontendService from telemetry.frontend.tests.Messages import ( - create_collector_request, create_collector_filter) + create_collector_request, create_collector_id, create_collector_filter) ########################### @@ -85,6 +86,18 @@ def test_StartCollector(telemetryFrontend_client): LOGGER.debug(str(response)) assert isinstance(response, CollectorId) +def test_StopCollector(telemetryFrontend_client): + LOGGER.info(' >>> test_StopCollector START: <<< ') + response = telemetryFrontend_client.StopCollector(create_collector_id()) + LOGGER.debug(str(response)) + assert isinstance(response, Empty) + +def test_SelectCollectors(telemetryFrontend_client): + LOGGER.info(' >>> test_SelectCollectors START: <<< ') + response = telemetryFrontend_client.SelectCollectors(create_collector_filter()) + LOGGER.debug(str(response)) + assert isinstance(response, CollectorList) + # ------- previous test ---------------- # def test_verify_db_and_table(): -- GitLab From 1d01e32cbab19fffa17753327eacb82bad0106fe Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 8 Aug 2024 13:51:33 +0000 Subject: [PATCH 470/602] Telemetry Backend Re-structuring - BackendService is restructured according to the design in report. - ResponseListener is added in Frontend - Improvements in test and messages files --- .../service/TelemetryBackendService.py | 334 ++++++++---------- .../backend/tests/testTelemetryBackend.py | 30 +- .../TelemetryFrontendServiceServicerImpl.py | 168 +++++---- src/telemetry/frontend/tests/__init__.py | 14 - src/telemetry/frontend/tests/test_frontend.py | 8 + 5 files changed, 243 insertions(+), 311 deletions(-) delete mode 100644 src/telemetry/frontend/tests/__init__.py diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index d81be79db..937409d15 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -12,64 +12,52 @@ # See the License for the specific language governing permissions and # limitations under the License. -import ast +import json import time import random import logging -import requests import threading -from typing import Any, Tuple +from typing import Any, Dict from common.proto.context_pb2 import Empty from confluent_kafka import Producer as KafkaProducer from confluent_kafka import Consumer as KafkaConsumer -from confluent_kafka import KafkaException from confluent_kafka import KafkaError -from confluent_kafka.admin import AdminClient, NewTopic -from common.proto.telemetry_frontend_pb2 import Collector, CollectorId -from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method +from common.tools.kafka.Variables import KafkaConfig, KafkaTopic +from common.method_wrappers.Decorator import MetricsPool + LOGGER = logging.getLogger(__name__) -METRICS_POOL = MetricsPool('Telemetry', 'TelemetryBackend') -KAFKA_SERVER_IP = '127.0.0.1:9092' -# KAFKA_SERVER_IP = '10.152.183.175:30092' -ADMIN_KAFKA_CLIENT = AdminClient({'bootstrap.servers': KAFKA_SERVER_IP}) -KAFKA_TOPICS = {'request' : 'topic_request', 'response': 'topic_response', - 'raw' : 'topic_raw' , 'labeled' : 'topic_labeled'} -EXPORTER_ENDPOINT = "http://10.152.183.2:9100/metrics" -PRODUCER_CONFIG = {'bootstrap.servers': KAFKA_SERVER_IP,} +METRICS_POOL = MetricsPool('TelemetryBackend', 'backendService') +# EXPORTER_ENDPOINT = "http://10.152.183.2:9100/metrics" class TelemetryBackendService: """ - Class to listens for request on Kafka topic, fetches metrics and produces measured values to another Kafka topic. + Class listens for request on Kafka topic, fetches requested metrics from device. + Produces metrics on both RESPONSE and VALUE kafka topics. """ def __init__(self): LOGGER.info('Init TelemetryBackendService') + self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value}) + self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value, + 'group.id' : 'backend', + 'auto.offset.reset' : 'latest'}) self.running_threads = {} - - def run_kafka_listener(self)->bool: - threading.Thread(target=self.kafka_listener).start() - return True - - def kafka_listener(self): + + def RunRequestListener(self)->bool: + threading.Thread(target=self.RequestListener).start() + return True + + def RequestListener(self): """ listener for requests on Kafka topic. """ - conusmer_configs = { - 'bootstrap.servers' : KAFKA_SERVER_IP, - 'group.id' : 'backend', - 'auto.offset.reset' : 'latest' - } - # topic_request = "topic_request" - consumerObj = KafkaConsumer(conusmer_configs) - # consumerObj.subscribe([topic_request]) - consumerObj.subscribe([KAFKA_TOPICS['request']]) - + consumer = self.kafka_consumer + consumer.subscribe([KafkaTopic.REQUEST.value]) while True: - receive_msg = consumerObj.poll(2.0) + receive_msg = consumer.poll(2.0) if receive_msg is None: - # print (time.time(), " - Telemetry backend is listening on Kafka Topic: ", KAFKA_TOPICS['request']) # added for debugging purposes continue elif receive_msg.error(): if receive_msg.error().code() == KafkaError._PARTITION_EOF: @@ -77,177 +65,159 @@ class TelemetryBackendService: else: print("Consumer error: {}".format(receive_msg.error())) break - (kpi_id, duration, interval) = ast.literal_eval(receive_msg.value().decode('utf-8')) + + collector = json.loads(receive_msg.value().decode('utf-8')) collector_id = receive_msg.key().decode('utf-8') - if duration == -1 and interval == -1: - self.terminate_collector_backend(collector_id) - # threading.Thread(target=self.terminate_collector_backend, args=(collector_id)) + LOGGER.debug('Recevied Collector: {:} - {:}'.format(collector_id, collector)) + print('Recevied Collector: {:} - {:}'.format(collector_id, collector)) + + if collector['duration'] == -1 and collector['interval'] == -1: + self.TerminateCollectorBackend(collector_id) else: - self.run_initiate_collector_backend(collector_id, kpi_id, duration, interval) + self.RunInitiateCollectorBackend(collector_id, collector) + def TerminateCollectorBackend(self, collector_id): + if collector_id in self.running_threads: + thread, stop_event = self.running_threads[collector_id] + stop_event.set() + thread.join() + print ("Terminating backend (by StopCollector): Collector Id: ", collector_id) + del self.running_threads[collector_id] + self.GenerateCollectorResponse(collector_id, "-1", -1) # Termination confirmation to frontend. + else: + print ('Backend collector {:} not found'.format(collector_id)) - def run_initiate_collector_backend(self, collector_id: str, kpi_id: str, duration: int, interval: int): + def RunInitiateCollectorBackend(self, collector_id: str, collector: str): stop_event = threading.Event() - thread = threading.Thread(target=self.initiate_collector_backend, - args=(collector_id, kpi_id, duration, interval, stop_event)) + thread = threading.Thread(target=self.InitiateCollectorBackend, + args=(collector_id, collector, stop_event)) self.running_threads[collector_id] = (thread, stop_event) thread.start() - def initiate_collector_backend(self, collector_id, kpi_id, duration, interval, stop_event - ): # type: ignore + def InitiateCollectorBackend(self, collector_id, collector, stop_event): """ - Method to receive collector request attribues and initiates collecter backend. + Method receives collector request and initiates collecter backend. """ print("Initiating backend for collector: ", collector_id) start_time = time.time() while not stop_event.is_set(): - if time.time() - start_time >= duration: # condition to terminate backend + if time.time() - start_time >= collector['duration']: # condition to terminate backend print("Execuation duration completed: Terminating backend: Collector Id: ", collector_id, " - ", time.time() - start_time) - self.generate_kafka_response(collector_id, "-1", -1) - # write to Kafka to send the termination confirmation. + self.GenerateCollectorResponse(collector_id, "-1", -1) # Termination confirmation to frontend. break - # print ("Received KPI: ", kpi_id, ", Duration: ", duration, ", Fetch Interval: ", interval) - self.extract_kpi_value(collector_id, kpi_id) - # print ("Telemetry Backend running for KPI: ", kpi_id, "after FETCH INTERVAL: ", interval) - time.sleep(interval) + self.ExtractKpiValue(collector_id, collector['kpi_id']) + time.sleep(collector['interval']) - def extract_kpi_value(self, collector_id: str, kpi_id: str): + def ExtractKpiValue(self, collector_id: str, kpi_id: str): """ Method to extract kpi value. """ - measured_kpi_value = random.randint(1,100) # Should be extracted from exporter/stream - # measured_kpi_value = self.fetch_node_exporter_metrics() # exporter extracted metric value against default KPI - self.generate_kafka_response(collector_id, kpi_id , measured_kpi_value) + measured_kpi_value = random.randint(1,100) # TODO: To be extracted from a device + print ("Measured Kpi value: {:}".format(measured_kpi_value)) + # measured_kpi_value = self.fetch_node_exporter_metrics() # exporter extracted metric value against default KPI + self.GenerateCollectorResponse(collector_id, kpi_id , measured_kpi_value) - def generate_kafka_response(self, collector_id: str, kpi_id: str, kpi_value: Any): + def GenerateCollectorResponse(self, collector_id: str, kpi_id: str, measured_kpi_value: Any): """ Method to write response on Kafka topic """ - # topic_response = "topic_response" - msg_value : Tuple [str, Any] = (kpi_id, kpi_value) - msg_key = collector_id - producerObj = KafkaProducer(PRODUCER_CONFIG) - # producerObj.produce(topic_response, key=msg_key, value= str(msg_value), callback=self.delivery_callback) - producerObj.produce(KAFKA_TOPICS['response'], key=msg_key, value= str(msg_value), callback=TelemetryBackendService.delivery_callback) - producerObj.flush() - - def terminate_collector_backend(self, collector_id): - if collector_id in self.running_threads: - thread, stop_event = self.running_threads[collector_id] - stop_event.set() - thread.join() - print ("Terminating backend (by StopCollector): Collector Id: ", collector_id) - del self.running_threads[collector_id] - self.generate_kafka_response(collector_id, "-1", -1) - - def create_topic_if_not_exists(self, new_topics: list) -> bool: - """ - Method to create Kafka topic if it does not exist. - Args: - admin_client (AdminClient): Kafka admin client. - """ - for topic in new_topics: - try: - topic_metadata = ADMIN_KAFKA_CLIENT.list_topics(timeout=5) - if topic not in topic_metadata.topics: - # If the topic does not exist, create a new topic - print(f"Topic '{topic}' does not exist. Creating...") - LOGGER.warning("Topic {:} does not exist. Creating...".format(topic)) - new_topic = NewTopic(topic, num_partitions=1, replication_factor=1) - ADMIN_KAFKA_CLIENT.create_topics([new_topic]) - except KafkaException as e: - print(f"Failed to create topic: {e}") - return False - return True + producer = self.kafka_producer + kpi_value : Dict = { + "kpi_id" : kpi_id, + "kpi_value" : measured_kpi_value + } + producer.produce( + KafkaTopic.RESPONSE.value, + key = collector_id, + value = json.dumps(kpi_value), + callback = self.delivery_callback + ) + producer.flush() - @staticmethod - def delivery_callback( err, msg): + def delivery_callback(self, err, msg): """ Callback function to handle message delivery status. - Args: - err (KafkaError): Kafka error object. - msg (Message): Kafka message object. - """ - if err: - print(f'Message delivery failed: {err}') - else: - print(f'Message delivered to topic {msg.topic()}') - -# ----------- BELOW: Actual Implementation of Kafka Producer with Node Exporter ----------- - @staticmethod - def fetch_single_node_exporter_metric(): - """ - Method to fetch metrics from Node Exporter. - Returns: - str: Metrics fetched from Node Exporter. - """ - KPI = "node_network_receive_packets_total" - try: - response = requests.get(EXPORTER_ENDPOINT) # type: ignore - LOGGER.info("Request status {:}".format(response)) - if response.status_code == 200: - # print(f"Metrics fetched sucessfully...") - metrics = response.text - # Check if the desired metric is available in the response - if KPI in metrics: - KPI_VALUE = TelemetryBackendService.extract_metric_value(metrics, KPI) - # Extract the metric value - if KPI_VALUE is not None: - LOGGER.info("Extracted value of {:} is {:}".format(KPI, KPI_VALUE)) - print(f"Extracted value of {KPI} is: {KPI_VALUE}") - return KPI_VALUE - else: - LOGGER.info("Failed to fetch metrics. Status code: {:}".format(response.status_code)) - # print(f"Failed to fetch metrics. Status code: {response.status_code}") - return None - except Exception as e: - LOGGER.info("Failed to fetch metrics. Status code: {:}".format(e)) - # print(f"Failed to fetch metrics: {str(e)}") - return None - - @staticmethod - def extract_metric_value(metrics, metric_name): - """ - Method to extract the value of a metric from the metrics string. - Args: - metrics (str): Metrics string fetched from Exporter. - metric_name (str): Name of the metric to extract. - Returns: - float: Value of the extracted metric, or None if not found. - """ - try: - # Find the metric line containing the desired metric name - metric_line = next(line for line in metrics.split('\n') if line.startswith(metric_name)) - # Split the line to extract the metric value - metric_value = float(metric_line.split()[1]) - return metric_value - except StopIteration: - print(f"Metric '{metric_name}' not found in the metrics.") - return None - - @staticmethod - def stream_node_export_metrics_to_raw_topic(): - try: - while True: - response = requests.get(EXPORTER_ENDPOINT) - # print("Response Status {:} ".format(response)) - # LOGGER.info("Response Status {:} ".format(response)) - try: - if response.status_code == 200: - producerObj = KafkaProducer(PRODUCER_CONFIG) - producerObj.produce(KAFKA_TOPICS['raw'], key="raw", value= str(response.text), callback=TelemetryBackendService.delivery_callback) - producerObj.flush() - LOGGER.info("Produce to topic") - else: - LOGGER.info("Didn't received expected response. Status code: {:}".format(response.status_code)) - print(f"Didn't received expected response. Status code: {response.status_code}") - return None - time.sleep(15) - except Exception as e: - LOGGER.info("Failed to process response. Status code: {:}".format(e)) - return None - except Exception as e: - LOGGER.info("Failed to fetch metrics. Status code: {:}".format(e)) - print(f"Failed to fetch metrics: {str(e)}") - return None -# ----------- ABOVE: Actual Implementation of Kafka Producer with Node Exporter ----------- \ No newline at end of file + Args: err (KafkaError): Kafka error object. + msg (Message): Kafka message object. + """ + if err: print(f'Message delivery failed: {err}') + # else: print(f'Message delivered to topic {msg.topic()}') + +# # ----------- BELOW: Actual Implementation of Kafka Producer with Node Exporter ----------- +# @staticmethod +# def fetch_single_node_exporter_metric(): +# """ +# Method to fetch metrics from Node Exporter. +# Returns: +# str: Metrics fetched from Node Exporter. +# """ +# KPI = "node_network_receive_packets_total" +# try: +# response = requests.get(EXPORTER_ENDPOINT) # type: ignore +# LOGGER.info("Request status {:}".format(response)) +# if response.status_code == 200: +# # print(f"Metrics fetched sucessfully...") +# metrics = response.text +# # Check if the desired metric is available in the response +# if KPI in metrics: +# KPI_VALUE = TelemetryBackendService.extract_metric_value(metrics, KPI) +# # Extract the metric value +# if KPI_VALUE is not None: +# LOGGER.info("Extracted value of {:} is {:}".format(KPI, KPI_VALUE)) +# print(f"Extracted value of {KPI} is: {KPI_VALUE}") +# return KPI_VALUE +# else: +# LOGGER.info("Failed to fetch metrics. Status code: {:}".format(response.status_code)) +# # print(f"Failed to fetch metrics. Status code: {response.status_code}") +# return None +# except Exception as e: +# LOGGER.info("Failed to fetch metrics. Status code: {:}".format(e)) +# # print(f"Failed to fetch metrics: {str(e)}") +# return None + +# @staticmethod +# def extract_metric_value(metrics, metric_name): +# """ +# Method to extract the value of a metric from the metrics string. +# Args: +# metrics (str): Metrics string fetched from Exporter. +# metric_name (str): Name of the metric to extract. +# Returns: +# float: Value of the extracted metric, or None if not found. +# """ +# try: +# # Find the metric line containing the desired metric name +# metric_line = next(line for line in metrics.split('\n') if line.startswith(metric_name)) +# # Split the line to extract the metric value +# metric_value = float(metric_line.split()[1]) +# return metric_value +# except StopIteration: +# print(f"Metric '{metric_name}' not found in the metrics.") +# return None + +# @staticmethod +# def stream_node_export_metrics_to_raw_topic(): +# try: +# while True: +# response = requests.get(EXPORTER_ENDPOINT) +# # print("Response Status {:} ".format(response)) +# # LOGGER.info("Response Status {:} ".format(response)) +# try: +# if response.status_code == 200: +# producerObj = KafkaProducer(PRODUCER_CONFIG) +# producerObj.produce(KAFKA_TOPICS['raw'], key="raw", value= str(response.text), callback=TelemetryBackendService.delivery_callback) +# producerObj.flush() +# LOGGER.info("Produce to topic") +# else: +# LOGGER.info("Didn't received expected response. Status code: {:}".format(response.status_code)) +# print(f"Didn't received expected response. Status code: {response.status_code}") +# return None +# time.sleep(15) +# except Exception as e: +# LOGGER.info("Failed to process response. Status code: {:}".format(e)) +# return None +# except Exception as e: +# LOGGER.info("Failed to fetch metrics. Status code: {:}".format(e)) +# print(f"Failed to fetch metrics: {str(e)}") +# return None +# # ----------- ABOVE: Actual Implementation of Kafka Producer with Node Exporter ----------- \ No newline at end of file diff --git a/src/telemetry/backend/tests/testTelemetryBackend.py b/src/telemetry/backend/tests/testTelemetryBackend.py index d832e54e7..3d7ec82ac 100644 --- a/src/telemetry/backend/tests/testTelemetryBackend.py +++ b/src/telemetry/backend/tests/testTelemetryBackend.py @@ -12,15 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -import sys -print (sys.path) -sys.path.append('/home/tfs/tfs-ctrl') -import threading import logging -from typing import Tuple -# from common.proto.context_pb2 import Empty from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService + LOGGER = logging.getLogger(__name__) @@ -28,26 +23,9 @@ LOGGER = logging.getLogger(__name__) # Tests Implementation of Telemetry Backend ########################### -def test_verify_kafka_topics(): - LOGGER.info('test_verify_kafka_topics requesting') +def test_RunRequestListener(): + LOGGER.info('test_RunRequestListener') TelemetryBackendServiceObj = TelemetryBackendService() - KafkaTopics = ['topic_request', 'topic_response', 'topic_raw', 'topic_labled'] - response = TelemetryBackendServiceObj.create_topic_if_not_exists(KafkaTopics) + response = TelemetryBackendServiceObj.RunRequestListener() LOGGER.debug(str(response)) assert isinstance(response, bool) - -# def test_run_kafka_listener(): -# LOGGER.info('test_receive_kafka_request requesting') -# TelemetryBackendServiceObj = TelemetryBackendService() -# response = TelemetryBackendServiceObj.run_kafka_listener() -# LOGGER.debug(str(response)) -# assert isinstance(response, bool) - -# def test_fetch_node_exporter_metrics(): -# LOGGER.info(' >>> test_fetch_node_exporter_metrics START <<< ') -# TelemetryBackendService.fetch_single_node_exporter_metric() - -def test_stream_node_export_metrics_to_raw_topic(): - LOGGER.info(' >>> test_stream_node_export_metrics_to_raw_topic START <<< ') - threading.Thread(target=TelemetryBackendService.stream_node_export_metrics_to_raw_topic, args=()).start() - diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index 29c192bdf..e6a6d0cd5 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -12,25 +12,25 @@ # See the License for the specific language governing permissions and # limitations under the License. -import ast +import json import threading -from typing import Tuple, Any +from typing import Any, Dict import grpc import logging from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.tools.kafka.Variables import KafkaConfig, KafkaTopic -from confluent_kafka import Consumer as KafkaConsumer -from confluent_kafka import Producer as KafkaProducer -from confluent_kafka import KafkaError - from common.proto.context_pb2 import Empty - from common.proto.telemetry_frontend_pb2 import CollectorId, Collector, CollectorFilter, CollectorList from common.proto.telemetry_frontend_pb2_grpc import TelemetryFrontendServiceServicer + from telemetry.database.TelemetryModel import Collector as CollectorModel from telemetry.database.Telemetry_DB import TelemetryDB +from confluent_kafka import Consumer as KafkaConsumer +from confluent_kafka import Producer as KafkaProducer +from confluent_kafka import KafkaError + LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('TelemetryFrontend', 'NBIgRPC') @@ -46,8 +46,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): 'group.id' : 'frontend', 'auto.offset.reset' : 'latest'}) - # --->>> SECTION: StartCollector with all helper methods <<<--- - + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StartCollector(self, request : Collector, grpc_context: grpc.ServicerContext # type: ignore @@ -55,101 +54,35 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): LOGGER.info ("gRPC message: {:}".format(request)) response = CollectorId() - # TODO: Verify the presence of Kpi ID in KpiDB or assume that KPI ID already exists. + # TODO: Verify the presence of Kpi ID in KpiDB or assume that KPI ID already exists? self.tele_db_obj.add_row_to_db( CollectorModel.ConvertCollectorToRow(request) ) - self.PublishRequestOnKafka(request) + self.PublishStartRequestOnKafka(request) - response.collector_id.uuid = request.collector_id.collector_id.uuid # type: ignore + response.collector_id.uuid = request.collector_id.collector_id.uuid return response - def PublishRequestOnKafka(self, collector_obj): + def PublishStartRequestOnKafka(self, collector_obj): """ Method to generate collector request on Kafka. """ collector_uuid = collector_obj.collector_id.collector_id.uuid - collector_to_generate : Tuple [str, int, int] = ( - collector_obj.kpi_id.kpi_id.uuid, - collector_obj.duration_s, - collector_obj.interval_s - ) + collector_to_generate : Dict = { + "kpi_id" : collector_obj.kpi_id.kpi_id.uuid, + "duration": collector_obj.duration_s, + "interval": collector_obj.interval_s + } self.kafka_producer.produce( KafkaTopic.REQUEST.value, key = collector_uuid, - value = str(collector_to_generate), + value = json.dumps(collector_to_generate), callback = self.delivery_callback ) LOGGER.info("Collector Request Generated: Collector Id: {:}, Value: {:}".format(collector_uuid, collector_to_generate)) ACTIVE_COLLECTORS.append(collector_uuid) self.kafka_producer.flush() - - def run_kafka_listener(self): - # print ("--- STARTED: run_kafka_listener ---") - threading.Thread(target=self.kafka_listener).start() - return True - - def kafka_listener(self): - """ - listener for response on Kafka topic. - """ - # # print ("--- STARTED: kafka_listener ---") - # conusmer_configs = { - # 'bootstrap.servers' : KAFKA_SERVER_IP, - # 'group.id' : 'frontend', - # 'auto.offset.reset' : 'latest' - # } - # # topic_response = "topic_response" - - # consumerObj = KafkaConsumer(conusmer_configs) - self.kafka_consumer.subscribe([KAFKA_TOPICS['response']]) - # print (time.time()) - while True: - receive_msg = self.kafka_consumer.poll(2.0) - if receive_msg is None: - # print (" - Telemetry frontend listening on Kafka Topic: ", KAFKA_TOPICS['response']) # added for debugging purposes - continue - elif receive_msg.error(): - if receive_msg.error().code() == KafkaError._PARTITION_EOF: - continue - else: - print("Consumer error: {}".format(receive_msg.error())) - break - try: - collector_id = receive_msg.key().decode('utf-8') - if collector_id in ACTIVE_COLLECTORS: - (kpi_id, kpi_value) = ast.literal_eval(receive_msg.value().decode('utf-8')) - self.process_response(collector_id, kpi_id, kpi_value) - else: - print(f"collector id does not match.\nRespone ID: '{collector_id}' --- Active IDs: '{ACTIVE_COLLECTORS}' ") - except Exception as e: - print(f"No message key found: {str(e)}") - continue - # return None - def process_response(self, collector_id: str, kpi_id: str, kpi_value: Any): - if kpi_id == "-1" and kpi_value == -1: - # LOGGER.info("Sucessfully terminated Collector: {:}".format(collector_id)) - print ("Sucessfully terminated Collector: ", collector_id) - else: - print ("Frontend-Received values Collector Id:", collector_id, "-KPI:", kpi_id, "-VALUE:", kpi_value) - - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def delivery_callback(self, err, msg): - """ - Callback function to handle message delivery status. - Args: - err (KafkaError): Kafka error object. - msg (Message): Kafka message object. - """ - if err: - LOGGER.debug('Message delivery failed: {:}'.format(err)) - print('Message delivery failed: {:}'.format(err)) - else: - LOGGER.debug('Message delivered to topic {:}'.format(msg.topic())) - print('Message delivered to topic {:}'.format(msg.topic())) - - # <<<--- SECTION: StopCollector with all helper methods --->>> @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StopCollector(self, @@ -164,13 +97,15 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): Method to generate stop collector request on Kafka. """ collector_uuid = collector_id.collector_id.uuid - collector_to_stop : Tuple [str, int, int] = ( - collector_uuid , -1, -1 - ) + collector_to_stop : Dict = { + "kpi_id" : collector_uuid, + "duration": -1, + "interval": -1 + } self.kafka_producer.produce( KafkaTopic.REQUEST.value, key = collector_uuid, - value = str(collector_to_stop), + value = json.dumps(collector_to_stop), callback = self.delivery_callback ) LOGGER.info("Collector Stop Request Generated: Collector Id: {:}, Value: {:}".format(collector_uuid, collector_to_stop)) @@ -180,6 +115,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): LOGGER.warning('Collector ID {:} not found in active collector list'.format(collector_uuid)) self.kafka_producer.flush() + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SelectCollectors(self, request : CollectorFilter, contextgrpc_context: grpc.ServicerContext # type: ignore @@ -199,3 +135,57 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): except Exception as e: LOGGER.info('Unable to process filter response {:}'.format(e)) + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def delivery_callback(self, err, msg): + """ + Callback function to handle message delivery status. + Args: + err (KafkaError): Kafka error object. + msg (Message): Kafka message object. + """ + if err: + LOGGER.debug('Message delivery failed: {:}'.format(err)) + print('Message delivery failed: {:}'.format(err)) + # else: + # LOGGER.debug('Message delivered to topic {:}'.format(msg.topic())) + # print('Message delivered to topic {:}'.format(msg.topic())) + + # ---------- Independent Method --------------- + # Listener method is independent of any method (same lifetime as service) + # continously listens for responses + def RunResponseListener(self): + threading.Thread(target=self.ResponseListener).start() + return True + + def ResponseListener(self): + """ + listener for response on Kafka topic. + """ + self.kafka_consumer.subscribe([KafkaTopic.RESPONSE.value]) + while True: + receive_msg = self.kafka_consumer.poll(2.0) + if receive_msg is None: + continue + elif receive_msg.error(): + if receive_msg.error().code() == KafkaError._PARTITION_EOF: + continue + else: + print("Consumer error: {}".format(receive_msg.error())) + break + try: + collector_id = receive_msg.key().decode('utf-8') + if collector_id in ACTIVE_COLLECTORS: + kpi_value = json.loads(receive_msg.value().decode('utf-8')) + self.process_response(collector_id, kpi_value['kpi_id'], kpi_value['kpi_value']) + else: + print(f"collector id does not match.\nRespone ID: '{collector_id}' --- Active IDs: '{ACTIVE_COLLECTORS}' ") + except Exception as e: + print(f"Error extarcting msg key or value: {str(e)}") + continue + + def process_response(self, collector_id: str, kpi_id: str, kpi_value: Any): + if kpi_id == "-1" and kpi_value == -1: + print ("Backend termination confirmation for collector id: ", collector_id) + else: + print ("KPI Value: Collector Id:", collector_id, ", Kpi Id:", kpi_id, ", Value:", kpi_value) diff --git a/src/telemetry/frontend/tests/__init__.py b/src/telemetry/frontend/tests/__init__.py deleted file mode 100644 index 3ee6f7071..000000000 --- a/src/telemetry/frontend/tests/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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/telemetry/frontend/tests/test_frontend.py b/src/telemetry/frontend/tests/test_frontend.py index d967e306a..3f8f3ebc8 100644 --- a/src/telemetry/frontend/tests/test_frontend.py +++ b/src/telemetry/frontend/tests/test_frontend.py @@ -28,6 +28,7 @@ from telemetry.frontend.client.TelemetryFrontendClient import TelemetryFrontendC from telemetry.frontend.service.TelemetryFrontendService import TelemetryFrontendService from telemetry.frontend.tests.Messages import ( create_collector_request, create_collector_id, create_collector_filter) +from telemetry.frontend.service.TelemetryFrontendServiceServicerImpl import TelemetryFrontendServiceServicerImpl ########################### @@ -98,6 +99,13 @@ def test_SelectCollectors(telemetryFrontend_client): LOGGER.debug(str(response)) assert isinstance(response, CollectorList) +def test_RunResponseListener(): + LOGGER.info(' >>> test_RunResponseListener START: <<< ') + TelemetryFrontendServiceObj = TelemetryFrontendServiceServicerImpl() + response = TelemetryFrontendServiceObj.RunResponseListener() # becasue Method "run_kafka_listener" is not define in frontend.proto + LOGGER.debug(str(response)) + assert isinstance(response, bool) + # ------- previous test ---------------- # def test_verify_db_and_table(): -- GitLab From 939852723dae4b9948594626e0d5019d0afa14ea Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 8 Aug 2024 14:23:29 +0000 Subject: [PATCH 471/602] Telemetry Backend Service - GenerateRawMetrics() add --- .../backend/service/TelemetryBackendService.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 937409d15..048474d93 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -119,7 +119,7 @@ class TelemetryBackendService: def GenerateCollectorResponse(self, collector_id: str, kpi_id: str, measured_kpi_value: Any): """ - Method to write response on Kafka topic + Method to write kpi value on RESPONSE Kafka topic """ producer = self.kafka_producer kpi_value : Dict = { @@ -134,6 +134,22 @@ class TelemetryBackendService: ) producer.flush() + def GenerateRawMetric(self, metrics: Any): + """ + Method writes raw metrics on VALUE Kafka topic + """ + producer = self.kafka_producer + some_metric : Dict = { + "some_id" : metrics + } + producer.produce( + KafkaTopic.VALUE.value, + key = 'raw', + value = json.dumps(some_metric), + callback = self.delivery_callback + ) + producer.flush() + def delivery_callback(self, err, msg): """ Callback function to handle message delivery status. -- GitLab From 55dd580c3b2aa23db318c7f60d40b7d62ffd9ae0 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 8 Aug 2024 15:20:06 +0000 Subject: [PATCH 472/602] Changes in Telemetry backend service. - __main__ is added. - DockerFile added. - .gitlab-ci.yml file added. --- .gitlab-ci.yml | 3 +- src/telemetry/.gitlab-ci.yml | 142 +++++++++++++++++++++ src/telemetry/backend/Dockerfile | 69 ++++++++++ src/telemetry/backend/requirements.in | 15 +++ src/telemetry/backend/service/__main__.py | 51 ++++++++ src/telemetry/frontend/Dockerfile | 69 ++++++++++ src/telemetry/frontend/requirements.in | 15 +++ src/telemetry/frontend/service/__main__.py | 39 ++---- src/telemetry/telemetry_virenv.txt | 49 ------- 9 files changed, 372 insertions(+), 80 deletions(-) create mode 100644 src/telemetry/.gitlab-ci.yml create mode 100644 src/telemetry/backend/Dockerfile create mode 100644 src/telemetry/backend/requirements.in create mode 100644 src/telemetry/backend/service/__main__.py create mode 100644 src/telemetry/frontend/Dockerfile create mode 100644 src/telemetry/frontend/requirements.in delete mode 100644 src/telemetry/telemetry_virenv.txt diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0c5ff9325..42292dc37 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -48,6 +48,7 @@ include: - local: '/src/kpi_manager/.gitlab-ci.yml' - local: '/src/kpi_value_api/.gitlab-ci.yml' - local: '/src/kpi_value_writer/.gitlab-ci.yml' - + # - local: '/src/telemetry/frontend/.gitlab-ci.yml' + # - local: '/src/telemetry/backend/.gitlab-ci.yml' # This should be last one: end-to-end integration tests - local: '/src/tests/.gitlab-ci.yml' diff --git a/src/telemetry/.gitlab-ci.yml b/src/telemetry/.gitlab-ci.yml new file mode 100644 index 000000000..d2e7e8cf3 --- /dev/null +++ b/src/telemetry/.gitlab-ci.yml @@ -0,0 +1,142 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +# Build, tag, and push the Docker image to the GitLab Docker registry +build kpi-manager: + variables: + IMAGE_NAME: 'telemetry' # name of the microservice + IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) + stage: build + before_script: + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + script: + - docker buildx build -t "${IMAGE_NAME}-frontend:$IMAGE_TAG" -f ./src/$IMAGE_NAME/frontend/Dockerfile . + - docker buildx build -t "${IMAGE_NAME}-backend:$IMAGE_TAG" -f ./src/$IMAGE_NAME/backend/Dockerfile . + - docker tag "${IMAGE_NAME}-frontend:$IMAGE_TAG" "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-frontend:$IMAGE_TAG" + - docker tag "${IMAGE_NAME}-backend:$IMAGE_TAG" "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-backend:$IMAGE_TAG" + - docker push "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-frontend:$IMAGE_TAG" + - docker push "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-backend:$IMAGE_TAG" + after_script: + - docker images --filter="dangling=true" --quiet | xargs -r docker rmi + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' + - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' + - changes: + - src/common/**/*.py + - proto/*.proto + - src/$IMAGE_NAME/frontend/**/*.{py,in,yml} + - src/$IMAGE_NAME/frontend/Dockerfile + - src/$IMAGE_NAME/frontend/tests/*.py + - src/$IMAGE_NAME/backend/Dockerfile + - src/$IMAGE_NAME/backend/**/*.{py,in,yml} + - src/$IMAGE_NAME/backend/tests/*.py + - manifests/${IMAGE_NAME}service.yaml + - .gitlab-ci.yml + +# Apply unit test to the component +unit_test telemetry: + variables: + IMAGE_NAME: 'telemetry' # name of the microservice + IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) + stage: unit_test + needs: + - build telemetry + before_script: + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi + - if docker container ls | grep crdb; then docker rm -f crdb; else echo "CockroachDB container is not in the system"; fi + - if docker volume ls | grep crdb; then docker volume rm -f crdb; else echo "CockroachDB volume is not in the system"; fi + - if docker container ls | grep ${IMAGE_NAME}-frontend; then docker rm -f ${IMAGE_NAME}-frontend; else echo "${IMAGE_NAME}-frontend container is not in the system"; fi + - if docker container ls | grep ${IMAGE_NAME}-backend; then docker rm -f ${IMAGE_NAME}-backend; else echo "${IMAGE_NAME}-backend container is not in the system"; fi + - docker container prune -f + script: + - docker pull "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-backend:$IMAGE_TAG" + - docker pull "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-frontend:$IMAGE_TAG" + - docker pull "cockroachdb/cockroach:latest-v22.2" + - docker volume create crdb + - > + docker run --name crdb -d --network=teraflowbridge -p 26257:26257 -p 8080:8080 + --env COCKROACH_DATABASE=tfs_test --env COCKROACH_USER=tfs --env COCKROACH_PASSWORD=tfs123 + --volume "crdb:/cockroach/cockroach-data" + cockroachdb/cockroach:latest-v22.2 start-single-node + - echo "Waiting for initialization..." + - while ! docker logs crdb 2>&1 | grep -q 'finished creating default user \"tfs\"'; do sleep 1; done + - docker logs crdb + - docker ps -a + - CRDB_ADDRESS=$(docker inspect crdb --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") + - echo $CRDB_ADDRESS + - > + docker run --name $IMAGE_NAME -d -p 30010:30010 + --env "CRDB_URI=cockroachdb://tfs:tfs123@${CRDB_ADDRESS}:26257/tfs_test?sslmode=require" + --volume "$PWD/src/$IMAGE_NAME/tests:/opt/results" + --network=teraflowbridge + $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG + - docker ps -a + - sleep 5 + - docker logs $IMAGE_NAME + - > + docker exec -i $IMAGE_NAME bash -c + "coverage run -m pytest --log-level=INFO --verbose --junitxml=/opt/results/${IMAGE_NAME}_report.xml $IMAGE_NAME/tests/test_*.py" + - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing" + coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' + after_script: + - docker volume rm -f crdb + - docker network rm teraflowbridge + - docker volume prune --force + - docker image prune --force + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' + - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' + - changes: + - src/common/**/*.py + - proto/*.proto + - src/$IMAGE_NAME/**/*.{py,in,yml} + - src/$IMAGE_NAME/frontend/Dockerfile + - src/$IMAGE_NAME/frontend/tests/*.py + - src/$IMAGE_NAME/frontend/tests/Dockerfile + - src/$IMAGE_NAME/backend/Dockerfile + - src/$IMAGE_NAME/backend/tests/*.py + - src/$IMAGE_NAME/backend/tests/Dockerfile + - manifests/${IMAGE_NAME}service.yaml + - .gitlab-ci.yml + # artifacts: + # when: always + # reports: + # junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml + +## Deployment of the service in Kubernetes Cluster +#deploy context: +# variables: +# IMAGE_NAME: 'context' # name of the microservice +# IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) +# stage: deploy +# needs: +# - unit test context +# # - integ_test execute +# script: +# - 'sed -i "s/$IMAGE_NAME:.*/$IMAGE_NAME:$IMAGE_TAG/" manifests/${IMAGE_NAME}service.yaml' +# - kubectl version +# - kubectl get all +# - kubectl apply -f "manifests/${IMAGE_NAME}service.yaml" +# - kubectl get all +# # environment: +# # name: test +# # url: https://example.com +# # kubernetes: +# # namespace: test +# rules: +# - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' +# when: manual +# - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' +# when: manual diff --git a/src/telemetry/backend/Dockerfile b/src/telemetry/backend/Dockerfile new file mode 100644 index 000000000..eebfe24ab --- /dev/null +++ b/src/telemetry/backend/Dockerfile @@ -0,0 +1,69 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +FROM python:3.9-slim + +# Install dependencies +RUN apt-get --yes --quiet --quiet update && \ + apt-get --yes --quiet --quiet install wget g++ git && \ + rm -rf /var/lib/apt/lists/* + +# Set Python to show logs as they occur +ENV PYTHONUNBUFFERED=0 + +# Download the gRPC health probe +RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \ + chmod +x /bin/grpc_health_probe + +# Get generic Python packages +RUN python3 -m pip install --upgrade pip +RUN python3 -m pip install --upgrade setuptools wheel +RUN python3 -m pip install --upgrade pip-tools + +# Get common Python packages +# Note: this step enables sharing the previous Docker build steps among all the Python components +WORKDIR /var/teraflow +COPY common_requirements.in common_requirements.in +RUN pip-compile --quiet --output-file=common_requirements.txt common_requirements.in +RUN python3 -m pip install -r common_requirements.txt + +# Add common files into working directory +WORKDIR /var/teraflow/common +COPY src/common/. ./ +RUN rm -rf proto + +# Create proto sub-folder, copy .proto files, and generate Python code +RUN mkdir -p /var/teraflow/common/proto +WORKDIR /var/teraflow/common/proto +RUN touch __init__.py +COPY proto/*.proto ./ +RUN python3 -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. *.proto +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/telemetry/backend +WORKDIR /var/teraflow/telemetry/backend +COPY src/telemetry/backend/requirements.in requirements.in +RUN pip-compile --quiet --output-file=requirements.txt requirements.in +RUN python3 -m pip install -r requirements.txt + +# Add component files into working directory +WORKDIR /var/teraflow +COPY src/telemetry/__init__.py telemetry/__init__.py +COPY src/telemetry/backend/. telemetry/backend/ + +# Start the service +ENTRYPOINT ["python", "-m", "telemetry.backend.service"] diff --git a/src/telemetry/backend/requirements.in b/src/telemetry/backend/requirements.in new file mode 100644 index 000000000..e6a559be7 --- /dev/null +++ b/src/telemetry/backend/requirements.in @@ -0,0 +1,15 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +confluent-kafka==2.3.* diff --git a/src/telemetry/backend/service/__main__.py b/src/telemetry/backend/service/__main__.py new file mode 100644 index 000000000..4ad867331 --- /dev/null +++ b/src/telemetry/backend/service/__main__.py @@ -0,0 +1,51 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging, signal, sys, threading +from common.Settings import get_log_level +from .TelemetryBackendService import TelemetryBackendService + +terminate = threading.Event() +LOGGER = None + +def signal_handler(signal, frame): # pylint: disable=redefined-outer-name + LOGGER.warning('Terminate signal received') + terminate.set() + +def main(): + global LOGGER # pylint: disable=global-statement + + log_level = get_log_level() + logging.basicConfig(level=log_level) + LOGGER = logging.getLogger(__name__) + + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + + LOGGER.debug('Starting...') + + grpc_service = TelemetryBackendService() + grpc_service.start() + + # Wait for Ctrl+C or termination signal + while not terminate.wait(timeout=1.0): pass + + LOGGER.debug('Terminating...') + grpc_service.stop() + + LOGGER.debug('Bye') + return 0 + +if __name__ == '__main__': + sys.exit(main()) diff --git a/src/telemetry/frontend/Dockerfile b/src/telemetry/frontend/Dockerfile new file mode 100644 index 000000000..0c3e1a66a --- /dev/null +++ b/src/telemetry/frontend/Dockerfile @@ -0,0 +1,69 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +FROM python:3.9-slim + +# Install dependencies +RUN apt-get --yes --quiet --quiet update && \ + apt-get --yes --quiet --quiet install wget g++ git && \ + rm -rf /var/lib/apt/lists/* + +# Set Python to show logs as they occur +ENV PYTHONUNBUFFERED=0 + +# Download the gRPC health probe +RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \ + chmod +x /bin/grpc_health_probe + +# Get generic Python packages +RUN python3 -m pip install --upgrade pip +RUN python3 -m pip install --upgrade setuptools wheel +RUN python3 -m pip install --upgrade pip-tools + +# Get common Python packages +# Note: this step enables sharing the previous Docker build steps among all the Python components +WORKDIR /var/teraflow +COPY common_requirements.in common_requirements.in +RUN pip-compile --quiet --output-file=common_requirements.txt common_requirements.in +RUN python3 -m pip install -r common_requirements.txt + +# Add common files into working directory +WORKDIR /var/teraflow/common +COPY src/common/. ./ +RUN rm -rf proto + +# Create proto sub-folder, copy .proto files, and generate Python code +RUN mkdir -p /var/teraflow/common/proto +WORKDIR /var/teraflow/common/proto +RUN touch __init__.py +COPY proto/*.proto ./ +RUN python3 -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. *.proto +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/telemetry/frontend +WORKDIR /var/teraflow/telemetry/frontend +COPY src/telemetry/frontend/requirements.in requirements.in +RUN pip-compile --quiet --output-file=requirements.txt requirements.in +RUN python3 -m pip install -r requirements.txt + +# Add component files into working directory +WORKDIR /var/teraflow +COPY src/telemetry/__init__.py telemetry/__init__.py +COPY src/telemetry/frontend/. telemetry/frontend/ + +# Start the service +ENTRYPOINT ["python", "-m", "telemetry.frontend.service"] diff --git a/src/telemetry/frontend/requirements.in b/src/telemetry/frontend/requirements.in new file mode 100644 index 000000000..e6a559be7 --- /dev/null +++ b/src/telemetry/frontend/requirements.in @@ -0,0 +1,15 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +confluent-kafka==2.3.* diff --git a/src/telemetry/frontend/service/__main__.py b/src/telemetry/frontend/service/__main__.py index 3b0263706..238619f2e 100644 --- a/src/telemetry/frontend/service/__main__.py +++ b/src/telemetry/frontend/service/__main__.py @@ -12,16 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -import signal -import sys -import logging, threading -from prometheus_client import start_http_server -from monitoring.service.NameMapping import NameMapping +import logging, signal, sys, threading +from common.Settings import get_log_level from .TelemetryFrontendService import TelemetryFrontendService -from monitoring.service.EventTools import EventsDeviceCollector -from common.Settings import ( - get_log_level, wait_for_environment_variables, get_env_var_name, - get_metrics_port ) terminate = threading.Event() LOGGER = None @@ -31,42 +24,28 @@ def signal_handler(signal, frame): # pylint: disable=redefined-outer-name terminate.set() def main(): - global LOGGER + global LOGGER # pylint: disable=global-statement log_level = get_log_level() - logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") + logging.basicConfig(level=log_level) LOGGER = logging.getLogger(__name__) -# ------- will be added later -------------- - # wait_for_environment_variables([ - # get_env_var_name - - - # ]) -# ------- will be added later -------------- - signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) - LOGGER.info('Starting...') - - # Start metrics server - metrics_port = get_metrics_port() - start_http_server(metrics_port) - - name_mapping = NameMapping() + LOGGER.debug('Starting...') - grpc_service = TelemetryFrontendService(name_mapping) + grpc_service = TelemetryFrontendService() grpc_service.start() # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=1.0): pass - LOGGER.info('Terminating...') + LOGGER.debug('Terminating...') grpc_service.stop() - LOGGER.info('Bye') + LOGGER.debug('Bye') return 0 if __name__ == '__main__': - sys.exit(main()) \ No newline at end of file + sys.exit(main()) diff --git a/src/telemetry/telemetry_virenv.txt b/src/telemetry/telemetry_virenv.txt deleted file mode 100644 index e39f80b65..000000000 --- a/src/telemetry/telemetry_virenv.txt +++ /dev/null @@ -1,49 +0,0 @@ -anytree==2.8.0 -APScheduler==3.10.1 -attrs==23.2.0 -certifi==2024.2.2 -charset-normalizer==2.0.12 -colorama==0.4.6 -confluent-kafka==2.3.0 -coverage==6.3 -future-fstrings==1.2.0 -greenlet==3.0.3 -grpcio==1.47.5 -grpcio-health-checking==1.47.5 -grpcio-tools==1.47.5 -grpclib==0.4.4 -h2==4.1.0 -hpack==4.0.0 -hyperframe==6.0.1 -idna==3.7 -influx-line-protocol==0.1.4 -iniconfig==2.0.0 -kafka-python==2.0.2 -multidict==6.0.5 -networkx==3.3 -packaging==24.0 -pluggy==1.5.0 -prettytable==3.5.0 -prometheus-client==0.13.0 -protobuf==3.20.3 -psycopg2-binary==2.9.3 -py==1.11.0 -py-cpuinfo==9.0.0 -pytest==6.2.5 -pytest-benchmark==3.4.1 -pytest-depends==1.0.1 -python-dateutil==2.8.2 -python-json-logger==2.0.2 -pytz==2024.1 -questdb==1.0.1 -requests==2.27.1 -six==1.16.0 -SQLAlchemy==1.4.52 -sqlalchemy-cockroachdb==1.4.4 -SQLAlchemy-Utils==0.38.3 -toml==0.10.2 -typing_extensions==4.12.0 -tzlocal==5.2 -urllib3==1.26.18 -wcwidth==0.2.13 -xmltodict==0.12.0 -- GitLab From f9e63a8897d5cd23bff9aabe4829b68914979832 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 9 Aug 2024 07:37:32 +0000 Subject: [PATCH 473/602] Kafka deployment script in gitlab-ci.file - In Kafka.variables files: get_kafka_address() and get_admin_client() is added. - In KpiValueApiServerImpl Kafka Admin Client call is updated. - Kafka deployment script is added. --- scripts/run_tests_locally-kpi-value-API.sh | 3 ++- src/common/tools/kafka/Variables.py | 27 +++++++++++++------ src/kpi_value_api/.gitlab-ci.yml | 22 ++++++++++++++- .../service/KpiValueApiServiceServicerImpl.py | 2 +- 4 files changed, 43 insertions(+), 11 deletions(-) diff --git a/scripts/run_tests_locally-kpi-value-API.sh b/scripts/run_tests_locally-kpi-value-API.sh index 8dfbfb162..3953d2a89 100755 --- a/scripts/run_tests_locally-kpi-value-API.sh +++ b/scripts/run_tests_locally-kpi-value-API.sh @@ -19,7 +19,8 @@ PROJECTDIR=`pwd` cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc - +KAFKA_IP=$(docker inspect kafka --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") +KFK_SERVER_ADDRESS=${KAFKA_IP}:9092 # helpful pytest flags: --log-level=INFO -o log_cli=true --verbose --maxfail=1 --durations=0 python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG -o log_cli=true --verbose \ kpi_value_api/tests/test_kpi_value_api.py diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 168957a26..1abbe7d7e 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -20,16 +20,27 @@ from common.Settings import get_setting LOGGER = logging.getLogger(__name__) +KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' class KafkaConfig(Enum): - KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' - KFK_NAMESPACE = 'kafka' - # KFK_NAMESPACE = get_setting('KFK_NAMESPACE') - KFK_PORT = '9092' - # KFK_PORT = get_setting('KFK_SERVER_PORT') - # SERVER_ADDRESS = "127.0.0.1:9092" - SERVER_ADDRESS = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) - ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) + + @staticmethod + def get_kafka_address() -> str: + kafka_server_address = get_setting('KFK_SERVER_ADDRESS', default=None) + if kafka_server_address is None: + KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = get_setting('KFK_SERVER_PORT') + SERVER_ADDRESS = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) + return SERVER_ADDRESS + + @staticmethod + def get_admin_client(): + SERVER_ADDRESS = KafkaConfig.get_kafka_address() + LOGGER.debug("KAFKA_SERVER_ADDRESS {:}".format(SERVER_ADDRESS)) + # SERVER_ADDRESS = "127.0.0.1:9092" + ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) + return ADMIN_CLIENT + class KafkaTopic(Enum): REQUEST = 'topic_request' diff --git a/src/kpi_value_api/.gitlab-ci.yml b/src/kpi_value_api/.gitlab-ci.yml index 166e9d3cb..1919f0361 100644 --- a/src/kpi_value_api/.gitlab-ci.yml +++ b/src/kpi_value_api/.gitlab-ci.yml @@ -50,10 +50,30 @@ unit_test kpi-value-api: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi - if docker container ls | grep $IMAGE_NAME; then docker rm -f $IMAGE_NAME; else echo "$IMAGE_NAME container is not in the system"; fi + - if docker container ls | grep kafka; then docker rm -f kafka; else echo "Kafka container is not in the system"; fi + - if docker container ls | grep zookeeper; then docker rm -f zookeeper; else echo "Zookeeper container is not in the system"; fi - docker container prune -f script: - docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG" - - docker run --name $IMAGE_NAME -d -p 30020:30020 -v "$PWD/src/$IMAGE_NAME/tests:/opt/results" --network=teraflowbridge $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG + - docker pull "bitnami/zookeeper:latest" + - docker pull "bitnami/kafka:latest" + - > + docker run --name zookeeper -d --network=teraflowbridge -p 2181:2181 + bitnami/zookeeper:latest + - sleep 10 # Wait for Zookeeper to start + - docker run --name kafka -d --network=teraflowbridge -p 9092:9092 + --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 + --env ALLOW_PLAINTEXT_LISTENER=yes + bitnami/kafka:latest + - sleep 20 # Wait for Kafka to start + - KAFKA_IP=$(docker inspect kafka --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") + - echo $KAFKA_IP + - > + docker run --name $IMAGE_NAME -d -p 30020:30020 + --env "KFK_SERVER_ADDRESS=${KAFKA_IP}:9092" + --volume "$PWD/src/$IMAGE_NAME/tests:/opt/results" + --network=teraflowbridge + $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG - sleep 5 - docker ps -a - docker logs $IMAGE_NAME diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index 5e7c3d139..05ab63fdf 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -43,7 +43,7 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): ) -> Empty: LOGGER.debug('StoreKpiValues: Received gRPC message object: {:}'.format(request)) producer_obj = KafkaProducer({ - 'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value + 'bootstrap.servers' : KafkaConfig.get_admin_client() }) for kpi_value in request.kpi_value_list: kpi_value_to_produce : Tuple [str, Any, Any] = ( -- GitLab From be0d616701a1552e79768b7866a0e47aa908bd86 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 9 Aug 2024 08:06:23 +0000 Subject: [PATCH 474/602] Kafka deployment script in gitlab-ci.file (2) - Improvements in Kafka.variables files. - In KpiValueApiServiceImpl corrected the call from "admin_client()" to "kafka_address()" --- src/common/tools/kafka/Variables.py | 16 +++++++--------- .../service/KpiValueApiServiceServicerImpl.py | 2 +- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 1abbe7d7e..9d42f1550 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -28,16 +28,14 @@ class KafkaConfig(Enum): def get_kafka_address() -> str: kafka_server_address = get_setting('KFK_SERVER_ADDRESS', default=None) if kafka_server_address is None: - KFK_NAMESPACE = get_setting('KFK_NAMESPACE') - KFK_PORT = get_setting('KFK_SERVER_PORT') - SERVER_ADDRESS = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) - return SERVER_ADDRESS + KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = get_setting('KFK_SERVER_PORT') + kafka_server_address = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) + return kafka_server_address @staticmethod def get_admin_client(): SERVER_ADDRESS = KafkaConfig.get_kafka_address() - LOGGER.debug("KAFKA_SERVER_ADDRESS {:}".format(SERVER_ADDRESS)) - # SERVER_ADDRESS = "127.0.0.1:9092" ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) return ADMIN_CLIENT @@ -55,7 +53,7 @@ class KafkaTopic(Enum): Method to create Kafka topics defined as class members """ all_topics = [member.value for member in KafkaTopic] - LOGGER.debug("Kafka server address is: {:} ".format(KafkaConfig.SERVER_ADDRESS.value)) + LOGGER.debug("Kafka server address is: {:} ".format(KafkaConfig.get_kafka_address())) if( KafkaTopic.create_new_topic_if_not_exists( all_topics )): LOGGER.debug("All topics are created sucsessfully") return True @@ -73,14 +71,14 @@ class KafkaTopic(Enum): LOGGER.debug("Topics names to be verified and created: {:}".format(new_topics)) for topic in new_topics: try: - topic_metadata = KafkaConfig.ADMIN_CLIENT.value.list_topics(timeout=5) + topic_metadata = KafkaConfig.get_admin_client().list_topics(timeout=5) # LOGGER.debug("Existing topic list: {:}".format(topic_metadata.topics)) if topic not in topic_metadata.topics: # If the topic does not exist, create a new topic print("Topic {:} does not exist. Creating...".format(topic)) LOGGER.debug("Topic {:} does not exist. Creating...".format(topic)) new_topic = NewTopic(topic, num_partitions=1, replication_factor=1) - KafkaConfig.ADMIN_CLIENT.value.create_topics([new_topic]) + KafkaConfig.get_admin_client().create_topics([new_topic]) else: print("Topic name already exists: {:}".format(topic)) LOGGER.debug("Topic name already exists: {:}".format(topic)) diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index 05ab63fdf..3df8dd5b6 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -43,7 +43,7 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): ) -> Empty: LOGGER.debug('StoreKpiValues: Received gRPC message object: {:}'.format(request)) producer_obj = KafkaProducer({ - 'bootstrap.servers' : KafkaConfig.get_admin_client() + 'bootstrap.servers' : KafkaConfig.get_kafka_address() }) for kpi_value in request.kpi_value_list: kpi_value_to_produce : Tuple [str, Any, Any] = ( -- GitLab From 5b3ee127610828a3c85d18537b3de52da547fa8b Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 9 Aug 2024 09:08:34 +0000 Subject: [PATCH 475/602] Changes in KpiValueWriter - Kafka deployment script is added in .gitlab-ci file - call is changed to "get_kafka_address()" in KpiValueWriter.py --- src/kpi_value_writer/.gitlab-ci.yml | 24 ++++++++++++++++++- .../service/KpiValueWriter.py | 2 +- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/kpi_value_writer/.gitlab-ci.yml b/src/kpi_value_writer/.gitlab-ci.yml index 25619ce7f..2c300db0e 100644 --- a/src/kpi_value_writer/.gitlab-ci.yml +++ b/src/kpi_value_writer/.gitlab-ci.yml @@ -50,10 +50,30 @@ unit_test kpi-value-writer: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi - if docker container ls | grep $IMAGE_NAME; then docker rm -f $IMAGE_NAME; else echo "$IMAGE_NAME container is not in the system"; fi + - if docker container ls | grep kafka; then docker rm -f kafka; else echo "Kafka container is not in the system"; fi + - if docker container ls | grep zookeeper; then docker rm -f zookeeper; else echo "Zookeeper container is not in the system"; fi - docker container prune -f script: - docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG" - - docker run --name $IMAGE_NAME -d -p 30030:30030 -v "$PWD/src/$IMAGE_NAME/tests:/opt/results" --network=teraflowbridge $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG + - docker pull "bitnami/zookeeper:latest" + - docker pull "bitnami/kafka:latest" + - > + docker run --name zookeeper -d --network=teraflowbridge -p 2181:2181 + bitnami/zookeeper:latest + - sleep 10 # Wait for Zookeeper to start + - docker run --name kafka -d --network=teraflowbridge -p 9092:9092 + --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 + --env ALLOW_PLAINTEXT_LISTENER=yes + bitnami/kafka:latest + - sleep 20 # Wait for Kafka to start + - KAFKA_IP=$(docker inspect kafka --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") + - echo $KAFKA_IP + - > + docker run --name $IMAGE_NAME -d -p 30030:30030 + --env "KFK_SERVER_ADDRESS=${KAFKA_IP}:9092" + --volume "$PWD/src/$IMAGE_NAME/tests:/opt/results" + --network=teraflowbridge + $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG - sleep 5 - docker ps -a - docker logs $IMAGE_NAME @@ -64,6 +84,8 @@ unit_test kpi-value-writer: coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' after_script: - docker rm -f $IMAGE_NAME + - docker rm zookeeper + - docker rm kafka - docker network rm teraflowbridge rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index 5e2b6babe..5d1a98808 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -51,7 +51,7 @@ class KpiValueWriter(GenericGrpcService): metric_writer = MetricWriterToPrometheus() kafka_consumer = KafkaConsumer( - { 'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value, + { 'bootstrap.servers' : KafkaConfig.get_kafka_address(), 'group.id' : __class__, 'auto.offset.reset' : 'latest'} ) -- GitLab From 6ac3c400457271153f8066373199528982b7f7c0 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 9 Aug 2024 11:02:46 +0000 Subject: [PATCH 476/602] Changes to telemetry service - TelemetryBackendService name and port is added in constants - get_kafka_address() call added in TelemetryBackendService - kafk topics test added in telemetrybackend test file - get_kafka_address() call added in TelemetryBackendServiceImpl - kafk topics test added in telemetryfrontend test file - improvements in Telemetry gitlab-ci file + unit_test for telemetry backend and frontend added. + many other small changes --- src/common/Constants.py | 2 + src/telemetry/.gitlab-ci.yml | 148 ++++++++++++------ .../service/TelemetryBackendService.py | 4 +- .../backend/tests/testTelemetryBackend.py | 7 + .../TelemetryFrontendServiceServicerImpl.py | 4 +- src/telemetry/frontend/tests/test_frontend.py | 11 +- 6 files changed, 125 insertions(+), 51 deletions(-) diff --git a/src/common/Constants.py b/src/common/Constants.py index 767b21343..4b2bced95 100644 --- a/src/common/Constants.py +++ b/src/common/Constants.py @@ -65,6 +65,7 @@ class ServiceNameEnum(Enum): KPIVALUEAPI = 'kpi-value-api' KPIVALUEWRITER = 'kpi-value-writer' TELEMETRYFRONTEND = 'telemetry-frontend' + TELEMETRYBACKEND = 'telemetry-backend' # Used for test and debugging only DLT_GATEWAY = 'dltgateway' @@ -98,6 +99,7 @@ DEFAULT_SERVICE_GRPC_PORTS = { ServiceNameEnum.KPIVALUEAPI .value : 30020, ServiceNameEnum.KPIVALUEWRITER .value : 30030, ServiceNameEnum.TELEMETRYFRONTEND .value : 30050, + ServiceNameEnum.TELEMETRYBACKEND .value : 30060, # Used for test and debugging only ServiceNameEnum.DLT_GATEWAY .value : 50051, diff --git a/src/telemetry/.gitlab-ci.yml b/src/telemetry/.gitlab-ci.yml index d2e7e8cf3..1d63654d9 100644 --- a/src/telemetry/.gitlab-ci.yml +++ b/src/telemetry/.gitlab-ci.yml @@ -21,6 +21,8 @@ build kpi-manager: before_script: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY script: + # This first build tags the builder resulting image to prevent being removed by dangling image removal command + - docker buildx build -t "${IMAGE_NAME}-backend:${IMAGE_TAG}-builder" --target builder -f ./src/$IMAGE_NAME/backend/Dockerfile . - docker buildx build -t "${IMAGE_NAME}-frontend:$IMAGE_TAG" -f ./src/$IMAGE_NAME/frontend/Dockerfile . - docker buildx build -t "${IMAGE_NAME}-backend:$IMAGE_TAG" -f ./src/$IMAGE_NAME/backend/Dockerfile . - docker tag "${IMAGE_NAME}-frontend:$IMAGE_TAG" "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-frontend:$IMAGE_TAG" @@ -35,6 +37,7 @@ build kpi-manager: - changes: - src/common/**/*.py - proto/*.proto + - src/$IMAGE_NAME/.gitlab-ci.yml - src/$IMAGE_NAME/frontend/**/*.{py,in,yml} - src/$IMAGE_NAME/frontend/Dockerfile - src/$IMAGE_NAME/frontend/tests/*.py @@ -45,7 +48,75 @@ build kpi-manager: - .gitlab-ci.yml # Apply unit test to the component -unit_test telemetry: +unit_test telemetry-backend: + variables: + IMAGE_NAME: 'telemetry' # name of the microservice + IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) + stage: unit_test + needs: + - build telemetry + before_script: + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi + - if docker container ls | grep kafka; then docker rm -f kafka; else echo "Kafka container is not in the system"; fi + - if docker container ls | grep zookeeper; then docker rm -f zookeeper; else echo "Zookeeper container is not in the system"; fi + # - if docker container ls | grep ${IMAGE_NAME}-frontend; then docker rm -f ${IMAGE_NAME}-frontend; else echo "${IMAGE_NAME}-frontend container is not in the system"; fi + - if docker container ls | grep ${IMAGE_NAME}-backend; then docker rm -f ${IMAGE_NAME}-backend; else echo "${IMAGE_NAME}-backend container is not in the system"; fi + - docker container prune -f + script: + - docker pull "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-backend:$IMAGE_TAG" + - docker pull "bitnami/zookeeper:latest" + - docker pull "bitnami/kafka:latest" + - > + docker run --name zookeeper -d --network=teraflowbridge -p 2181:2181 + bitnami/zookeeper:latest + - sleep 10 # Wait for Zookeeper to start + - docker run --name kafka -d --network=teraflowbridge -p 9092:9092 + --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 + --env ALLOW_PLAINTEXT_LISTENER=yes + bitnami/kafka:latest + - sleep 20 # Wait for Kafka to start + - KAFKA_IP=$(docker inspect kafka --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") + - echo $KAFKA_IP + - > + docker run --name $IMAGE_NAME -d -p 30060:30060 + --env "KFK_SERVER_ADDRESS=${KAFKA_IP}:9092" + --volume "$PWD/src/$IMAGE_NAME/backend/tests:/opt/results" + --network=teraflowbridge + $CI_REGISTRY_IMAGE/${IMAGE_NAME}-backend:$IMAGE_TAG + - docker ps -a + - sleep 5 + - docker logs ${IMAGE_NAME}-backend + - > + docker exec -i ${IMAGE_NAME}-backend bash -c + "coverage run -m pytest --log-level=INFO --verbose --junitxml=/opt/results/${IMAGE_NAME}-backend_report.xml $IMAGE_NAME/backend/tests/test_*.py" + - docker exec -i ${IMAGE_NAME}-backend bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing" + coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' + after_script: + - docker network rm teraflowbridge + - docker volume prune --force + - docker image prune --force + - docker rm -f ${IMAGE_NAME}-backend + - docker rm -f zookeeper + - docker rm -f kafka + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' + - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' + - changes: + - src/common/**/*.py + - proto/*.proto + - src/$IMAGE_NAME/backend/**/*.{py,in,yml} + - src/$IMAGE_NAME/backend/Dockerfile + - src/$IMAGE_NAME/backend/tests/*.py + - manifests/${IMAGE_NAME}service.yaml + - .gitlab-ci.yml + artifacts: + when: always + reports: + junit: src/$IMAGE_NAME/backend/tests/${IMAGE_NAME}-backend_report.xml + +# Apply unit test to the component +unit_test telemetry-frontend: variables: IMAGE_NAME: 'telemetry' # name of the microservice IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) @@ -57,12 +128,14 @@ unit_test telemetry: - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi - if docker container ls | grep crdb; then docker rm -f crdb; else echo "CockroachDB container is not in the system"; fi - if docker volume ls | grep crdb; then docker volume rm -f crdb; else echo "CockroachDB volume is not in the system"; fi + - if docker container ls | grep kafka; then docker rm -f kafka; else echo "Kafka container is not in the system"; fi + - if docker container ls | grep zookeeper; then docker rm -f zookeeper; else echo "Zookeeper container is not in the system"; fi - if docker container ls | grep ${IMAGE_NAME}-frontend; then docker rm -f ${IMAGE_NAME}-frontend; else echo "${IMAGE_NAME}-frontend container is not in the system"; fi - - if docker container ls | grep ${IMAGE_NAME}-backend; then docker rm -f ${IMAGE_NAME}-backend; else echo "${IMAGE_NAME}-backend container is not in the system"; fi - docker container prune -f script: - - docker pull "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-backend:$IMAGE_TAG" - docker pull "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-frontend:$IMAGE_TAG" + - docker pull "bitnami/zookeeper:latest" + - docker pull "bitnami/kafka:latest" - docker pull "cockroachdb/cockroach:latest-v22.2" - docker volume create crdb - > @@ -77,66 +150,51 @@ unit_test telemetry: - CRDB_ADDRESS=$(docker inspect crdb --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") - echo $CRDB_ADDRESS - > - docker run --name $IMAGE_NAME -d -p 30010:30010 + docker run --name zookeeper -d --network=teraflowbridge -p 2181:2181 + bitnami/zookeeper:latest + - sleep 10 # Wait for Zookeeper to start + - docker run --name kafka -d --network=teraflowbridge -p 9092:9092 + --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 + --env ALLOW_PLAINTEXT_LISTENER=yes + bitnami/kafka:latest + - sleep 20 # Wait for Kafka to start + - KAFKA_IP=$(docker inspect kafka --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") + - echo $KAFKA_IP + - > + docker run --name $IMAGE_NAME -d -p 30050:30050 --env "CRDB_URI=cockroachdb://tfs:tfs123@${CRDB_ADDRESS}:26257/tfs_test?sslmode=require" - --volume "$PWD/src/$IMAGE_NAME/tests:/opt/results" + --env "KFK_SERVER_ADDRESS=${KAFKA_IP}:9092" + --volume "$PWD/src/$IMAGE_NAME/frontend/tests:/opt/results" --network=teraflowbridge - $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG + $CI_REGISTRY_IMAGE/${IMAGE_NAME}-frontend:$IMAGE_TAG - docker ps -a - sleep 5 - - docker logs $IMAGE_NAME + - docker logs ${IMAGE_NAME}-frontend - > - docker exec -i $IMAGE_NAME bash -c - "coverage run -m pytest --log-level=INFO --verbose --junitxml=/opt/results/${IMAGE_NAME}_report.xml $IMAGE_NAME/tests/test_*.py" - - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing" + docker exec -i ${IMAGE_NAME}-frontend bash -c + "coverage run -m pytest --log-level=INFO --verbose --junitxml=/opt/results/${IMAGE_NAME}-frontend_report.xml $IMAGE_NAME/frontend/tests/test_*.py" + - docker exec -i ${IMAGE_NAME}-frontend bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing" coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' after_script: - docker volume rm -f crdb - docker network rm teraflowbridge - docker volume prune --force - docker image prune --force + - docker rm -f ${IMAGE_NAME}-frontend + - docker rm -f zookeeper + - docker rm -f kafka rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' - changes: - src/common/**/*.py - proto/*.proto - - src/$IMAGE_NAME/**/*.{py,in,yml} + - src/$IMAGE_NAME/frontend/**/*.{py,in,yml} - src/$IMAGE_NAME/frontend/Dockerfile - src/$IMAGE_NAME/frontend/tests/*.py - - src/$IMAGE_NAME/frontend/tests/Dockerfile - - src/$IMAGE_NAME/backend/Dockerfile - - src/$IMAGE_NAME/backend/tests/*.py - - src/$IMAGE_NAME/backend/tests/Dockerfile - manifests/${IMAGE_NAME}service.yaml - .gitlab-ci.yml - # artifacts: - # when: always - # reports: - # junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml - -## Deployment of the service in Kubernetes Cluster -#deploy context: -# variables: -# IMAGE_NAME: 'context' # name of the microservice -# IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) -# stage: deploy -# needs: -# - unit test context -# # - integ_test execute -# script: -# - 'sed -i "s/$IMAGE_NAME:.*/$IMAGE_NAME:$IMAGE_TAG/" manifests/${IMAGE_NAME}service.yaml' -# - kubectl version -# - kubectl get all -# - kubectl apply -f "manifests/${IMAGE_NAME}service.yaml" -# - kubectl get all -# # environment: -# # name: test -# # url: https://example.com -# # kubernetes: -# # namespace: test -# rules: -# - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' -# when: manual -# - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' -# when: manual + artifacts: + when: always + reports: + junit: src/$IMAGE_NAME/frontend/tests/${IMAGE_NAME}-frontend_report.xml \ No newline at end of file diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 048474d93..6b9a6a8da 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -39,8 +39,8 @@ class TelemetryBackendService: def __init__(self): LOGGER.info('Init TelemetryBackendService') - self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value}) - self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value, + self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.get_kafka_address()}) + self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.get_kafka_address(), 'group.id' : 'backend', 'auto.offset.reset' : 'latest'}) self.running_threads = {} diff --git a/src/telemetry/backend/tests/testTelemetryBackend.py b/src/telemetry/backend/tests/testTelemetryBackend.py index 3d7ec82ac..95710ff88 100644 --- a/src/telemetry/backend/tests/testTelemetryBackend.py +++ b/src/telemetry/backend/tests/testTelemetryBackend.py @@ -13,6 +13,7 @@ # limitations under the License. import logging +from common.tools.kafka.Variables import KafkaTopic from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService @@ -23,6 +24,12 @@ LOGGER = logging.getLogger(__name__) # Tests Implementation of Telemetry Backend ########################### +# --- "test_validate_kafka_topics" should be run before the functionality tests --- +def test_validate_kafka_topics(): + LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ") + response = KafkaTopic.create_all_topics() + assert isinstance(response, bool) + def test_RunRequestListener(): LOGGER.info('test_RunRequestListener') TelemetryBackendServiceObj = TelemetryBackendService() diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index e6a6d0cd5..2b872dba3 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -41,8 +41,8 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): def __init__(self): LOGGER.info('Init TelemetryFrontendService') self.tele_db_obj = TelemetryDB() - self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value}) - self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value, + self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.get_kafka_address()}) + self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.get_kafka_address(), 'group.id' : 'frontend', 'auto.offset.reset' : 'latest'}) diff --git a/src/telemetry/frontend/tests/test_frontend.py b/src/telemetry/frontend/tests/test_frontend.py index 3f8f3ebc8..9c3f9d3a8 100644 --- a/src/telemetry/frontend/tests/test_frontend.py +++ b/src/telemetry/frontend/tests/test_frontend.py @@ -16,11 +16,10 @@ import os import pytest import logging -# from common.proto.context_pb2 import Empty from common.Constants import ServiceNameEnum from common.proto.telemetry_frontend_pb2 import CollectorId, CollectorList from common.proto.context_pb2 import Empty - +from common.tools.kafka.Variables import KafkaTopic from common.Settings import ( get_service_port_grpc, get_env_var_name, ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC) @@ -81,6 +80,13 @@ def telemetryFrontend_client( ########################### # ------- Re-structuring Test --------- +# --- "test_validate_kafka_topics" should be run before the functionality tests --- +def test_validate_kafka_topics(): + LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ") + response = KafkaTopic.create_all_topics() + assert isinstance(response, bool) + +# ----- core funtionality test ----- def test_StartCollector(telemetryFrontend_client): LOGGER.info(' >>> test_StartCollector START: <<< ') response = telemetryFrontend_client.StartCollector(create_collector_request()) @@ -99,6 +105,7 @@ def test_SelectCollectors(telemetryFrontend_client): LOGGER.debug(str(response)) assert isinstance(response, CollectorList) +# ----- Non-gRPC method tests ----- def test_RunResponseListener(): LOGGER.info(' >>> test_RunResponseListener START: <<< ') TelemetryFrontendServiceObj = TelemetryFrontendServiceServicerImpl() -- GitLab From 6c5c8ead0d98b25fa9750c72a6b5161f1e2ea1f5 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 9 Aug 2024 11:06:32 +0000 Subject: [PATCH 477/602] Telemetry fronend and backend ci tests activated --- .gitlab-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 42292dc37..115b33676 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -48,7 +48,6 @@ include: - local: '/src/kpi_manager/.gitlab-ci.yml' - local: '/src/kpi_value_api/.gitlab-ci.yml' - local: '/src/kpi_value_writer/.gitlab-ci.yml' - # - local: '/src/telemetry/frontend/.gitlab-ci.yml' - # - local: '/src/telemetry/backend/.gitlab-ci.yml' + - local: '/src/telemetry/.gitlab-ci.yml' # This should be last one: end-to-end integration tests - local: '/src/tests/.gitlab-ci.yml' -- GitLab From 97f34a6631e8fc8e01bceed960faa33c01f5475a Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 9 Aug 2024 11:09:30 +0000 Subject: [PATCH 478/602] Telemetry build added --- src/telemetry/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/telemetry/.gitlab-ci.yml b/src/telemetry/.gitlab-ci.yml index 1d63654d9..2a6b416be 100644 --- a/src/telemetry/.gitlab-ci.yml +++ b/src/telemetry/.gitlab-ci.yml @@ -13,7 +13,7 @@ # limitations under the License. # Build, tag, and push the Docker image to the GitLab Docker registry -build kpi-manager: +build telemetry: variables: IMAGE_NAME: 'telemetry' # name of the microservice IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) -- GitLab From ed34573b12e477902b32cc72e4fc8c9b151f56b5 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 9 Aug 2024 16:31:29 +0000 Subject: [PATCH 479/602] telemetry gitlab-ci file update. - docker build ... -target builder is removed --- src/telemetry/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/telemetry/.gitlab-ci.yml b/src/telemetry/.gitlab-ci.yml index 2a6b416be..78301fe07 100644 --- a/src/telemetry/.gitlab-ci.yml +++ b/src/telemetry/.gitlab-ci.yml @@ -22,7 +22,7 @@ build telemetry: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY script: # This first build tags the builder resulting image to prevent being removed by dangling image removal command - - docker buildx build -t "${IMAGE_NAME}-backend:${IMAGE_TAG}-builder" --target builder -f ./src/$IMAGE_NAME/backend/Dockerfile . + # - docker buildx build -t "${IMAGE_NAME}-backend:${IMAGE_TAG}-builder" --target builder -f ./src/$IMAGE_NAME/backend/Dockerfile . - docker buildx build -t "${IMAGE_NAME}-frontend:$IMAGE_TAG" -f ./src/$IMAGE_NAME/frontend/Dockerfile . - docker buildx build -t "${IMAGE_NAME}-backend:$IMAGE_TAG" -f ./src/$IMAGE_NAME/backend/Dockerfile . - docker tag "${IMAGE_NAME}-frontend:$IMAGE_TAG" "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-frontend:$IMAGE_TAG" -- GitLab From 3583671a734fcf24187f13c6896a9a47433e2cdd Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 10 Aug 2024 05:37:00 +0000 Subject: [PATCH 480/602] telemetry .gitlab.ci file - docker run --name ... cmd missing (backend/frontend) after image name. --- src/telemetry/.gitlab-ci.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/telemetry/.gitlab-ci.yml b/src/telemetry/.gitlab-ci.yml index 78301fe07..c7950eb91 100644 --- a/src/telemetry/.gitlab-ci.yml +++ b/src/telemetry/.gitlab-ci.yml @@ -79,7 +79,7 @@ unit_test telemetry-backend: - KAFKA_IP=$(docker inspect kafka --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") - echo $KAFKA_IP - > - docker run --name $IMAGE_NAME -d -p 30060:30060 + docker run --name $IMAGE_NAME-backend -d -p 30060:30060 --env "KFK_SERVER_ADDRESS=${KAFKA_IP}:9092" --volume "$PWD/src/$IMAGE_NAME/backend/tests:/opt/results" --network=teraflowbridge @@ -159,9 +159,11 @@ unit_test telemetry-frontend: bitnami/kafka:latest - sleep 20 # Wait for Kafka to start - KAFKA_IP=$(docker inspect kafka --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") - - echo $KAFKA_IP + - echo $KAFKA_IP + - docker logs zookeeper + - docker logs kafka - > - docker run --name $IMAGE_NAME -d -p 30050:30050 + docker run --name $IMAGE_NAME-frontend -d -p 30050:30050 --env "CRDB_URI=cockroachdb://tfs:tfs123@${CRDB_ADDRESS}:26257/tfs_test?sslmode=require" --env "KFK_SERVER_ADDRESS=${KAFKA_IP}:9092" --volume "$PWD/src/$IMAGE_NAME/frontend/tests:/opt/results" -- GitLab From 169715431aadd3c7dc26c6574dc80f097e83796b Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 10 Aug 2024 05:40:41 +0000 Subject: [PATCH 481/602] changes in kpi Value API/writer gitlab-ci files. - src/$IMAGE_NAME/tests/Dockerfile is removed from API. - -f is added in "docker rm -f zookeeper" and "docker rm -f kafka" in Writer file. --- src/kpi_value_api/.gitlab-ci.yml | 2 +- src/kpi_value_writer/.gitlab-ci.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/kpi_value_api/.gitlab-ci.yml b/src/kpi_value_api/.gitlab-ci.yml index 1919f0361..1a6f821ba 100644 --- a/src/kpi_value_api/.gitlab-ci.yml +++ b/src/kpi_value_api/.gitlab-ci.yml @@ -94,7 +94,7 @@ unit_test kpi-value-api: - src/$IMAGE_NAME/**/*.{py,in,yml} - src/$IMAGE_NAME/Dockerfile - src/$IMAGE_NAME/tests/*.py - - src/$IMAGE_NAME/tests/Dockerfile + # - src/$IMAGE_NAME/tests/Dockerfile # mayne not needed - manifests/${IMAGE_NAME}service.yaml - .gitlab-ci.yml artifacts: diff --git a/src/kpi_value_writer/.gitlab-ci.yml b/src/kpi_value_writer/.gitlab-ci.yml index 2c300db0e..9a2f9fd47 100644 --- a/src/kpi_value_writer/.gitlab-ci.yml +++ b/src/kpi_value_writer/.gitlab-ci.yml @@ -84,8 +84,8 @@ unit_test kpi-value-writer: coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' after_script: - docker rm -f $IMAGE_NAME - - docker rm zookeeper - - docker rm kafka + - docker rm -f zookeeper + - docker rm -f kafka - docker network rm teraflowbridge rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' -- GitLab From b7f60ecec6ae759a3d465afcb2a3e15a92114d61 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 10 Aug 2024 06:07:15 +0000 Subject: [PATCH 482/602] changes in Metric Writer to Prometheus. - start_http_server() call is move to main - CollectorRegistory variable is removed --- .../service/MetricWriterToPrometheus.py | 12 ++---------- src/kpi_value_writer/service/__main__.py | 3 +++ 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py index f1d079783..4e6106255 100644 --- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py +++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py @@ -18,7 +18,7 @@ import ast import time import threading import logging -from prometheus_client import start_http_server, Gauge, CollectorRegistry +from prometheus_client import Gauge, CollectorRegistry from common.proto.kpi_sample_types_pb2 import KpiSampleType from common.proto.kpi_value_api_pb2 import KpiValue @@ -26,7 +26,6 @@ from common.proto.kpi_manager_pb2 import KpiDescriptor LOGGER = logging.getLogger(__name__) PROM_METRICS = {} -PROM_REGISTERY = CollectorRegistry() class MetricWriterToPrometheus: ''' @@ -34,13 +33,7 @@ class MetricWriterToPrometheus: cooked KPI value = KpiDescriptor (gRPC message) + KpiValue (gRPC message) ''' def __init__(self): - # prometheus server address and configs - self.start_prometheus_client() pass - - def start_prometheus_client(self): - start_http_server(10808, registry=PROM_REGISTERY) - LOGGER.debug("Prometheus client is started on port 10808") def merge_kpi_descriptor_and_kpi_value(self, kpi_descriptor, kpi_value): # Creating a dictionary from the kpi_descriptor's attributes @@ -71,8 +64,7 @@ class MetricWriterToPrometheus: PROM_METRICS[metric_name] = Gauge ( metric_name, cooked_kpi['kpi_description'], - metric_tags, - registry=PROM_REGISTERY + metric_tags ) LOGGER.debug("Metric is created with labels: {:}".format(metric_tags)) PROM_METRICS[metric_name].labels( diff --git a/src/kpi_value_writer/service/__main__.py b/src/kpi_value_writer/service/__main__.py index aa67540fb..be9f8f29b 100644 --- a/src/kpi_value_writer/service/__main__.py +++ b/src/kpi_value_writer/service/__main__.py @@ -13,6 +13,7 @@ # limitations under the License. import logging, signal, sys, threading +from prometheus_client import start_http_server from kpi_value_writer.service.KpiValueWriter import KpiValueWriter from common.Settings import get_log_level @@ -38,6 +39,8 @@ def main(): grpc_service = KpiValueWriter() grpc_service.start() + start_http_server(10808) + LOGGER.debug("Prometheus client is started on port 10808") # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=1.0): pass -- GitLab From f9c0b68faecae549f104d67ef84675cdd2d1ed48 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 10 Aug 2024 06:32:53 +0000 Subject: [PATCH 483/602] Changes in Telemetry. - GenericGrpcService inheritance is added in Telemetry backend class. - Database folder were missing in working directory in DockerFile of Telemetry Frontend. --- src/telemetry/backend/service/TelemetryBackendService.py | 5 +++-- src/telemetry/frontend/Dockerfile | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 6b9a6a8da..991298d37 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -24,6 +24,8 @@ from confluent_kafka import Consumer as KafkaConsumer from confluent_kafka import KafkaError from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from common.method_wrappers.Decorator import MetricsPool +from common.tools.service.GenericGrpcService import GenericGrpcService + LOGGER = logging.getLogger(__name__) @@ -31,12 +33,11 @@ METRICS_POOL = MetricsPool('TelemetryBackend', 'backendService') # EXPORTER_ENDPOINT = "http://10.152.183.2:9100/metrics" -class TelemetryBackendService: +class TelemetryBackendService(GenericGrpcService): """ Class listens for request on Kafka topic, fetches requested metrics from device. Produces metrics on both RESPONSE and VALUE kafka topics. """ - def __init__(self): LOGGER.info('Init TelemetryBackendService') self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.get_kafka_address()}) diff --git a/src/telemetry/frontend/Dockerfile b/src/telemetry/frontend/Dockerfile index 0c3e1a66a..7125d31fe 100644 --- a/src/telemetry/frontend/Dockerfile +++ b/src/telemetry/frontend/Dockerfile @@ -64,6 +64,7 @@ RUN python3 -m pip install -r requirements.txt WORKDIR /var/teraflow COPY src/telemetry/__init__.py telemetry/__init__.py COPY src/telemetry/frontend/. telemetry/frontend/ +COPY src/telemetry/database/. telemetry/database/ # Start the service ENTRYPOINT ["python", "-m", "telemetry.frontend.service"] -- GitLab From b907871f4ab0f0cbfefdb23b8b323cecb3f5d325 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 10 Aug 2024 07:11:35 +0000 Subject: [PATCH 484/602] Changes on KPI Value Writer and Telemetry Backend - Renamed the method to "KafkaKpiConsumer" to avoid conflict with the "KafkaConsumer" import in KpiApiWriter. - Removed unnecessary imports in KpiWriterToProm. - Added `get_service_port_grpc` call and imports in the Telemetry backend service. - Added new libraries to `requirements.in` for Telemetry. --- src/kpi_value_writer/service/KpiValueWriter.py | 6 +++--- src/kpi_value_writer/service/MetricWriterToPrometheus.py | 8 ++++---- src/telemetry/backend/requirements.in | 4 ++++ src/telemetry/backend/service/TelemetryBackendService.py | 8 ++++++-- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index 5d1a98808..eba651674 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -41,18 +41,18 @@ class KpiValueWriter(GenericGrpcService): @staticmethod def RunKafkaConsumer(): - thread = threading.Thread(target=KpiValueWriter.KafkaConsumer, args=()) + thread = threading.Thread(target=KpiValueWriter.KafkaKpiConsumer, args=()) ACTIVE_CONSUMERS.append(thread) thread.start() @staticmethod - def KafkaConsumer(): + def KafkaKpiConsumer(): kpi_manager_client = KpiManagerClient() metric_writer = MetricWriterToPrometheus() kafka_consumer = KafkaConsumer( { 'bootstrap.servers' : KafkaConfig.get_kafka_address(), - 'group.id' : __class__, + 'group.id' : 'KpiValueWriter', 'auto.offset.reset' : 'latest'} ) kafka_consumer.subscribe([KafkaTopic.VALUE.value]) diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py index 4e6106255..a86b8f34e 100644 --- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py +++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py @@ -14,11 +14,11 @@ # read Kafka stream from Kafka topic -import ast -import time -import threading +# import ast +# import time +# import threading import logging -from prometheus_client import Gauge, CollectorRegistry +from prometheus_client import Gauge from common.proto.kpi_sample_types_pb2 import KpiSampleType from common.proto.kpi_value_api_pb2 import KpiValue diff --git a/src/telemetry/backend/requirements.in b/src/telemetry/backend/requirements.in index e6a559be7..1d22df11b 100644 --- a/src/telemetry/backend/requirements.in +++ b/src/telemetry/backend/requirements.in @@ -13,3 +13,7 @@ # limitations under the License. confluent-kafka==2.3.* +psycopg2-binary==2.9.* +SQLAlchemy==1.4.* +sqlalchemy-cockroachdb==1.4.* +SQLAlchemy-Utils==0.38.* \ No newline at end of file diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 991298d37..bb9f0a314 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -18,10 +18,12 @@ import random import logging import threading from typing import Any, Dict -from common.proto.context_pb2 import Empty +# from common.proto.context_pb2 import Empty from confluent_kafka import Producer as KafkaProducer from confluent_kafka import Consumer as KafkaConsumer from confluent_kafka import KafkaError +from common.Constants import ServiceNameEnum +from common.Settings import get_service_port_grpc from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from common.method_wrappers.Decorator import MetricsPool from common.tools.service.GenericGrpcService import GenericGrpcService @@ -38,8 +40,10 @@ class TelemetryBackendService(GenericGrpcService): Class listens for request on Kafka topic, fetches requested metrics from device. Produces metrics on both RESPONSE and VALUE kafka topics. """ - def __init__(self): + def __init__(self, cls_name : str = __name__) -> None: LOGGER.info('Init TelemetryBackendService') + port = get_service_port_grpc(ServiceNameEnum.TELEMETRYBACKEND) + super().__init__(port, cls_name=cls_name) self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.get_kafka_address()}) self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.get_kafka_address(), 'group.id' : 'backend', -- GitLab From cbe6880cfc2b064c04f4c23132dfea1e8132f5bc Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 10 Aug 2024 07:12:29 +0000 Subject: [PATCH 485/602] Added new libraries to requirements.in for Telemetry. --- src/telemetry/backend/requirements.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/telemetry/backend/requirements.in b/src/telemetry/backend/requirements.in index 1d22df11b..231dc04e8 100644 --- a/src/telemetry/backend/requirements.in +++ b/src/telemetry/backend/requirements.in @@ -16,4 +16,4 @@ confluent-kafka==2.3.* psycopg2-binary==2.9.* SQLAlchemy==1.4.* sqlalchemy-cockroachdb==1.4.* -SQLAlchemy-Utils==0.38.* \ No newline at end of file +SQLAlchemy-Utils==0.38.* -- GitLab From 9119dd59b0ec43d46cb9ec5ae033a66a9168b715 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sun, 11 Aug 2024 14:01:51 +0000 Subject: [PATCH 486/602] Changes in Telemetry. - tests file name is corrected. - Telmetry frontend and backend requriements.in is updated --- src/telemetry/backend/requirements.in | 4 -- .../backend/tests/test_TelemetryBackend.py | 38 +++++++++++++++++++ src/telemetry/frontend/requirements.in | 4 ++ 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 src/telemetry/backend/tests/test_TelemetryBackend.py diff --git a/src/telemetry/backend/requirements.in b/src/telemetry/backend/requirements.in index 231dc04e8..e6a559be7 100644 --- a/src/telemetry/backend/requirements.in +++ b/src/telemetry/backend/requirements.in @@ -13,7 +13,3 @@ # limitations under the License. confluent-kafka==2.3.* -psycopg2-binary==2.9.* -SQLAlchemy==1.4.* -sqlalchemy-cockroachdb==1.4.* -SQLAlchemy-Utils==0.38.* diff --git a/src/telemetry/backend/tests/test_TelemetryBackend.py b/src/telemetry/backend/tests/test_TelemetryBackend.py new file mode 100644 index 000000000..95710ff88 --- /dev/null +++ b/src/telemetry/backend/tests/test_TelemetryBackend.py @@ -0,0 +1,38 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging +from common.tools.kafka.Variables import KafkaTopic +from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService + + +LOGGER = logging.getLogger(__name__) + + +########################### +# Tests Implementation of Telemetry Backend +########################### + +# --- "test_validate_kafka_topics" should be run before the functionality tests --- +def test_validate_kafka_topics(): + LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ") + response = KafkaTopic.create_all_topics() + assert isinstance(response, bool) + +def test_RunRequestListener(): + LOGGER.info('test_RunRequestListener') + TelemetryBackendServiceObj = TelemetryBackendService() + response = TelemetryBackendServiceObj.RunRequestListener() + LOGGER.debug(str(response)) + assert isinstance(response, bool) diff --git a/src/telemetry/frontend/requirements.in b/src/telemetry/frontend/requirements.in index e6a559be7..231dc04e8 100644 --- a/src/telemetry/frontend/requirements.in +++ b/src/telemetry/frontend/requirements.in @@ -13,3 +13,7 @@ # limitations under the License. confluent-kafka==2.3.* +psycopg2-binary==2.9.* +SQLAlchemy==1.4.* +sqlalchemy-cockroachdb==1.4.* +SQLAlchemy-Utils==0.38.* -- GitLab From 1bb6e1bbd3a18f829baadeb4b74b5c23d226a770 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sun, 11 Aug 2024 15:18:06 +0000 Subject: [PATCH 487/602] Changes in KPI Manager KPI value API and value Writer. - updated cmd in test file of KPI manager - move kafka producer object to __init__ function. - write JSON object to Kafka - Read JSON object from Kafka - Slight to manage the affect of JSON object. - Static methods are removed. --- scripts/run_tests_locally-kpi-manager.sh | 2 +- src/common/tools/kafka/Variables.py | 2 +- .../service/KpiValueApiServiceServicerImpl.py | 42 ++++++++++++------- .../service/KpiValueWriter.py | 33 +++++++-------- .../service/MetricWriterToPrometheus.py | 12 +++--- .../tests/test_kpi_value_writer.py | 3 +- 6 files changed, 49 insertions(+), 45 deletions(-) diff --git a/scripts/run_tests_locally-kpi-manager.sh b/scripts/run_tests_locally-kpi-manager.sh index a6a24f90d..8a4ce8d95 100755 --- a/scripts/run_tests_locally-kpi-manager.sh +++ b/scripts/run_tests_locally-kpi-manager.sh @@ -24,7 +24,7 @@ cd $PROJECTDIR/src # python3 kpi_manager/tests/test_unitary.py RCFILE=$PROJECTDIR/coverage/.coveragerc -CRDB_SQL_ADDRESS=$(kubectl --namespace ${CRDB_NAMESPACE} get service cockroachdb-public -o 'jsonpath={.spec.clusterIP}') +CRDB_SQL_ADDRESS=$(kubectl get service cockroachdb-public --namespace ${CRDB_NAMESPACE} -o 'jsonpath={.spec.clusterIP}') export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_kpi_mgmt?sslmode=require" python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ kpi_manager/tests/test_kpi_manager.py diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 9d42f1550..5ada88a1e 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -55,7 +55,7 @@ class KafkaTopic(Enum): all_topics = [member.value for member in KafkaTopic] LOGGER.debug("Kafka server address is: {:} ".format(KafkaConfig.get_kafka_address())) if( KafkaTopic.create_new_topic_if_not_exists( all_topics )): - LOGGER.debug("All topics are created sucsessfully") + LOGGER.debug("All topics are created sucsessfully or Already Exists") return True else: LOGGER.debug("Error creating all topics") diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index 3df8dd5b6..4ea978faf 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -12,8 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, grpc -from typing import Tuple, Any +import logging, grpc, json +from typing import Dict from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.tools.kafka.Variables import KafkaConfig, KafkaTopic @@ -37,32 +37,42 @@ PROM_URL = "http://prometheus-k8s.monitoring.svc.cluster.local:9090" # TO class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): def __init__(self): LOGGER.debug('Init KpiValueApiService') - + self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.get_kafka_address()}) + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StoreKpiValues(self, request: KpiValueList, grpc_context: grpc.ServicerContext ) -> Empty: LOGGER.debug('StoreKpiValues: Received gRPC message object: {:}'.format(request)) - producer_obj = KafkaProducer({ - 'bootstrap.servers' : KafkaConfig.get_kafka_address() - }) + + producer = self.kafka_producer for kpi_value in request.kpi_value_list: - kpi_value_to_produce : Tuple [str, Any, Any] = ( - kpi_value.kpi_id.kpi_id, - kpi_value.timestamp, - kpi_value.kpi_value_type # kpi_value.kpi_value_type.(many options) how? - ) + kpi_value_to_produce : Dict = { + "kpi_uuid" : kpi_value.kpi_id.kpi_id.uuid, + "timestamp" : kpi_value.timestamp.timestamp, + "kpi_value_type" : self.ExtractKpiValueByType(kpi_value.kpi_value_type) + } LOGGER.debug('KPI to produce is {:}'.format(kpi_value_to_produce)) msg_key = "gRPC-kpivalueapi" # str(__class__.__name__) can be used - producer_obj.produce( + producer.produce( KafkaTopic.VALUE.value, key = msg_key, - value = kpi_value.SerializeToString(), # value = json.dumps(kpi_value_to_produce), + value = json.dumps(kpi_value_to_produce), callback = self.delivery_callback ) - producer_obj.flush() + producer.flush() return Empty() + def ExtractKpiValueByType(self, value): + attributes = [ 'floatVal' , 'int32Val' , 'uint32Val','int64Val', + 'uint64Val', 'stringVal', 'boolVal'] + for attr in attributes: + try: + return getattr(value, attr) + except (ValueError, TypeError, AttributeError): + continue + return None + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SelectKpiValues(self, request: KpiValueFilter, grpc_context: grpc.ServicerContext ) -> KpiValueList: @@ -130,13 +140,13 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): try: int_value = int(value) return KpiValueType(int64Val=int_value) - except ValueError: + except (ValueError, TypeError): pass # Check if the value is a float try: float_value = float(value) return KpiValueType(floatVal=float_value) - except ValueError: + except (ValueError, TypeError): pass # Check if the value is a boolean if value.lower() in ['true', 'false']: diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index eba651674..8b258a142 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import json import logging import threading from common.tools.kafka.Variables import KafkaConfig, KafkaTopic @@ -38,28 +39,25 @@ class KpiValueWriter(GenericGrpcService): def __init__(self, cls_name : str = __name__) -> None: port = get_service_port_grpc(ServiceNameEnum.KPIVALUEWRITER) super().__init__(port, cls_name=cls_name) + self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.get_kafka_address(), + 'group.id' : 'KpiValueWriter', + 'auto.offset.reset' : 'latest'}) - @staticmethod - def RunKafkaConsumer(): - thread = threading.Thread(target=KpiValueWriter.KafkaKpiConsumer, args=()) + def RunKafkaConsumer(self): + thread = threading.Thread(target=self.KafkaKpiConsumer, args=()) ACTIVE_CONSUMERS.append(thread) thread.start() - @staticmethod - def KafkaKpiConsumer(): + def KafkaKpiConsumer(self): kpi_manager_client = KpiManagerClient() metric_writer = MetricWriterToPrometheus() - kafka_consumer = KafkaConsumer( - { 'bootstrap.servers' : KafkaConfig.get_kafka_address(), - 'group.id' : 'KpiValueWriter', - 'auto.offset.reset' : 'latest'} - ) - kafka_consumer.subscribe([KafkaTopic.VALUE.value]) + consumer = self.kafka_consumer + consumer.subscribe([KafkaTopic.VALUE.value]) LOGGER.debug("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) print("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) while True: - raw_kpi = kafka_consumer.poll(1.0) + raw_kpi = consumer.poll(1.0) if raw_kpi is None: continue elif raw_kpi.error(): @@ -69,24 +67,21 @@ class KpiValueWriter(GenericGrpcService): print("Consumer error: {}".format(raw_kpi.error())) continue try: - kpi_value = KpiValue() - kpi_value.ParseFromString(raw_kpi.value()) + kpi_value = json.loads(raw_kpi.value().decode('utf-8')) LOGGER.info("Received KPI : {:}".format(kpi_value)) print("Received KPI : {:}".format(kpi_value)) - KpiValueWriter.get_kpi_descriptor(kpi_value, kpi_manager_client, metric_writer) + self.get_kpi_descriptor(kpi_value, kpi_manager_client, metric_writer) except Exception as e: print("Error detail: {:}".format(e)) continue - @staticmethod - def get_kpi_descriptor(kpi_value: str, kpi_manager_client, metric_writer): + def get_kpi_descriptor(self, kpi_value: str, kpi_manager_client, metric_writer): print("--- START -----") kpi_id = KpiId() - kpi_id.kpi_id.uuid = kpi_value.kpi_id.kpi_id.uuid + kpi_id.kpi_id.uuid = kpi_value['kpi_uuid'] print("KpiId generated: {:}".format(kpi_id)) # print("Kpi manger client created: {:}".format(kpi_manager_client)) - try: kpi_descriptor_object = KpiDescriptor() kpi_descriptor_object = kpi_manager_client.GetKpiDescriptor(kpi_id) diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py index a86b8f34e..85e618a4b 100644 --- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py +++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py @@ -14,10 +14,8 @@ # read Kafka stream from Kafka topic -# import ast -# import time -# import threading import logging +from typing import Dict from prometheus_client import Gauge from common.proto.kpi_sample_types_pb2 import KpiSampleType @@ -47,13 +45,13 @@ class MetricWriterToPrometheus: 'slice_id' : kpi_descriptor.slice_id.slice_uuid.uuid, 'connection_id' : kpi_descriptor.connection_id.connection_uuid.uuid, 'link_id' : kpi_descriptor.link_id.link_uuid.uuid, - 'time_stamp' : kpi_value.timestamp.timestamp, - 'kpi_value' : kpi_value.kpi_value_type.floatVal + 'time_stamp' : kpi_value['timestamp'], + 'kpi_value' : kpi_value['kpi_value_type'] } # LOGGER.debug("Cooked Kpi: {:}".format(cooked_kpi)) return cooked_kpi - def create_and_expose_cooked_kpi(self, kpi_descriptor: KpiDescriptor, kpi_value: KpiValue): + def create_and_expose_cooked_kpi(self, kpi_descriptor: KpiDescriptor, kpi_value: Dict): # merge both gRPC messages into single varible. cooked_kpi = self.merge_kpi_descriptor_and_kpi_value(kpi_descriptor, kpi_value) tags_to_exclude = {'kpi_description', 'kpi_sample_type', 'kpi_value'} @@ -76,7 +74,7 @@ class MetricWriterToPrometheus: connection_id = cooked_kpi['connection_id'], link_id = cooked_kpi['link_id'], time_stamp = cooked_kpi['time_stamp'], - ).set(float(cooked_kpi['kpi_value'])) + ).set(cooked_kpi['kpi_value']) LOGGER.debug("Metric pushed to the endpoints: {:}".format(PROM_METRICS[metric_name])) except ValueError as e: diff --git a/src/kpi_value_writer/tests/test_kpi_value_writer.py b/src/kpi_value_writer/tests/test_kpi_value_writer.py index fce043d7f..b784fae5d 100755 --- a/src/kpi_value_writer/tests/test_kpi_value_writer.py +++ b/src/kpi_value_writer/tests/test_kpi_value_writer.py @@ -29,4 +29,5 @@ def test_validate_kafka_topics(): def test_KafkaConsumer(): LOGGER.debug(" --->>> test_kafka_consumer: START <<<--- ") - KpiValueWriter.RunKafkaConsumer() + kpi_value_writer = KpiValueWriter() + kpi_value_writer.RunKafkaConsumer() -- GitLab From 88f5d25b442b35931a1aaeb34d26281db2297031 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sun, 11 Aug 2024 15:22:23 +0000 Subject: [PATCH 488/602] Minor Changes in Telemetry test file. - src folder refernce is removed from header --- .../backend/tests/testTelemetryBackend.py | 38 ------------------- .../backend/tests/test_TelemetryBackend.py | 2 +- 2 files changed, 1 insertion(+), 39 deletions(-) delete mode 100644 src/telemetry/backend/tests/testTelemetryBackend.py diff --git a/src/telemetry/backend/tests/testTelemetryBackend.py b/src/telemetry/backend/tests/testTelemetryBackend.py deleted file mode 100644 index 95710ff88..000000000 --- a/src/telemetry/backend/tests/testTelemetryBackend.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging -from common.tools.kafka.Variables import KafkaTopic -from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService - - -LOGGER = logging.getLogger(__name__) - - -########################### -# Tests Implementation of Telemetry Backend -########################### - -# --- "test_validate_kafka_topics" should be run before the functionality tests --- -def test_validate_kafka_topics(): - LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ") - response = KafkaTopic.create_all_topics() - assert isinstance(response, bool) - -def test_RunRequestListener(): - LOGGER.info('test_RunRequestListener') - TelemetryBackendServiceObj = TelemetryBackendService() - response = TelemetryBackendServiceObj.RunRequestListener() - LOGGER.debug(str(response)) - assert isinstance(response, bool) diff --git a/src/telemetry/backend/tests/test_TelemetryBackend.py b/src/telemetry/backend/tests/test_TelemetryBackend.py index 95710ff88..a2bbee540 100644 --- a/src/telemetry/backend/tests/test_TelemetryBackend.py +++ b/src/telemetry/backend/tests/test_TelemetryBackend.py @@ -14,7 +14,7 @@ import logging from common.tools.kafka.Variables import KafkaTopic -from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService +from telemetry.backend.service.TelemetryBackendService import TelemetryBackendService LOGGER = logging.getLogger(__name__) -- GitLab From 71a27ab78295ce62451e92187f0a84cd43c8a301 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 26 Aug 2024 10:48:48 +0000 Subject: [PATCH 489/602] Changes in Telemetry - Created the CRDB secret (`crdb-telemetry`). - Updated the IF conditions in the `$COMPONENT` deployment loop within the `tfs.sh` file according to telemetry service requirements. - Added the `Telemetryservice.yaml` file to the manifest folder. - Updated the CRDB URL in `TelemetryEngine.py`. - Made a minor formatting change in `TelemetryModel.py`. --- deploy/tfs.sh | 28 +++-- manifests/telemetryservice.yaml | 128 ++++++++++++++++++++++ src/telemetry/database/TelemetryEngine.py | 8 +- src/telemetry/database/TelemetryModel.py | 2 +- 4 files changed, 153 insertions(+), 13 deletions(-) create mode 100644 manifests/telemetryservice.yaml diff --git a/deploy/tfs.sh b/deploy/tfs.sh index 4ecfaae99..e72014418 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -170,7 +170,19 @@ kubectl create secret generic crdb-kpi-data --namespace ${TFS_K8S_NAMESPACE} --t --from-literal=CRDB_SSLMODE=require printf "\n" -echo "Create secret with Apache Kafka kfk-kpi-data for KPI and Telemetry microservices" +echo "Create secret with CockroachDB data for Telemetry microservices" +CRDB_SQL_PORT=$(kubectl --namespace ${CRDB_NAMESPACE} get service cockroachdb-public -o 'jsonpath={.spec.ports[?(@.name=="sql")].port}') +CRDB_DATABASE_TELEMETRY="tfs_telemetry" # TODO: change by specific configurable environment variable +kubectl create secret generic crdb-telemetry --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ + --from-literal=CRDB_NAMESPACE=${CRDB_NAMESPACE} \ + --from-literal=CRDB_SQL_PORT=${CRDB_SQL_PORT} \ + --from-literal=CRDB_DATABASE=${CRDB_DATABASE_TELEMETRY} \ + --from-literal=CRDB_USERNAME=${CRDB_USERNAME} \ + --from-literal=CRDB_PASSWORD=${CRDB_PASSWORD} \ + --from-literal=CRDB_SSLMODE=require +printf "\n" + +echo "Create secret with Apache Kafka data for KPI and Telemetry microservices" KFK_SERVER_PORT=$(kubectl --namespace ${KFK_NAMESPACE} get service kafka-service -o 'jsonpath={.spec.ports[0].port}') kubectl create secret generic kfk-kpi-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ --from-literal=KFK_NAMESPACE=${KFK_NAMESPACE} \ @@ -252,15 +264,17 @@ for COMPONENT in $TFS_COMPONENTS; do if [ "$COMPONENT" == "ztp" ] || [ "$COMPONENT" == "policy" ]; then $DOCKER_BUILD -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile ./src/"$COMPONENT"/ > "$BUILD_LOG" - elif [ "$COMPONENT" == "pathcomp" ]; then + elif [ "$COMPONENT" == "pathcomp" ] || [ "$COMPONENT" == "telemetry" ]; then BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-frontend.log" $DOCKER_BUILD -t "$COMPONENT-frontend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/frontend/Dockerfile . > "$BUILD_LOG" BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-backend.log" $DOCKER_BUILD -t "$COMPONENT-backend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/backend/Dockerfile . > "$BUILD_LOG" - # next command is redundant, but helpful to keep cache updated between rebuilds - IMAGE_NAME="$COMPONENT-backend:$TFS_IMAGE_TAG-builder" - $DOCKER_BUILD -t "$IMAGE_NAME" --target builder -f ./src/"$COMPONENT"/backend/Dockerfile . >> "$BUILD_LOG" + if [ "$COMPONENT" == "pathcomp" ]; then + # next command is redundant, but helpful to keep cache updated between rebuilds + IMAGE_NAME="$COMPONENT-backend:$TFS_IMAGE_TAG-builder" + $DOCKER_BUILD -t "$IMAGE_NAME" --target builder -f ./src/"$COMPONENT"/backend/Dockerfile . >> "$BUILD_LOG" + fi elif [ "$COMPONENT" == "dlt" ]; then BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-connector.log" $DOCKER_BUILD -t "$COMPONENT-connector:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/connector/Dockerfile . > "$BUILD_LOG" @@ -273,7 +287,7 @@ for COMPONENT in $TFS_COMPONENTS; do echo " Pushing Docker image to '$TFS_REGISTRY_IMAGES'..." - if [ "$COMPONENT" == "pathcomp" ]; then + if [ "$COMPONENT" == "pathcomp" ] || [ "$COMPONENT" == "telemetry" ]; then IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-frontend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-frontend.log" @@ -324,7 +338,7 @@ for COMPONENT in $TFS_COMPONENTS; do cp ./manifests/"${COMPONENT}"service.yaml "$MANIFEST" fi - if [ "$COMPONENT" == "pathcomp" ]; then + if [ "$COMPONENT" == "pathcomp" ] || [ "$COMPONENT" == "telemetry" ]; then IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-frontend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}-frontend:" "$MANIFEST" | cut -d ":" -f4) sed -E -i "s#image: $GITLAB_REPO_URL/$COMPONENT-frontend:${VERSION}#image: $IMAGE_URL#g" "$MANIFEST" diff --git a/manifests/telemetryservice.yaml b/manifests/telemetryservice.yaml new file mode 100644 index 000000000..2f9917499 --- /dev/null +++ b/manifests/telemetryservice.yaml @@ -0,0 +1,128 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: telemetryservice +spec: + selector: + matchLabels: + app: telemetryservice + #replicas: 1 + template: + metadata: + labels: + app: telemetryservice + spec: + terminationGracePeriodSeconds: 5 + containers: + - name: frontend + image: labs.etsi.org:5050/tfs/controller/telemetry-frontend:latest + imagePullPolicy: Always + ports: + - containerPort: 30050 + - containerPort: 9192 + env: + - name: LOG_LEVEL + value: "INFO" + envFrom: + - secretRef: + name: crdb-telemetry + - secretRef: + name: kfk-kpi-data + readinessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:30050"] + livenessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:30050"] + resources: + requests: + cpu: 250m + memory: 128Mi + limits: + cpu: 1000m + memory: 1024Mi + - name: backend + image: labs.etsi.org:5050/tfs/controller/telemetry-backend:latest + imagePullPolicy: Always + ports: + - containerPort: 30060 + - containerPort: 9192 + env: + - name: LOG_LEVEL + value: "INFO" + envFrom: + - secretRef: + name: kfk-kpi-data + readinessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:30060"] + livenessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:30060"] + resources: + requests: + cpu: 250m + memory: 128Mi + limits: + cpu: 1000m + memory: 1024Mi +--- +apiVersion: v1 +kind: Service +metadata: + name: telemetryservice + labels: + app: telemetryservice +spec: + type: ClusterIP + selector: + app: telemetryservice + ports: + - name: frontend-grpc + protocol: TCP + port: 30050 + targetPort: 30050 + - name: backend-grpc + protocol: TCP + port: 30060 + targetPort: 30060 + - name: metrics + protocol: TCP + port: 9192 + targetPort: 9192 +--- +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: telemetryservice-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: telemetryservice + minReplicas: 1 + maxReplicas: 20 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 80 + #behavior: + # scaleDown: + # stabilizationWindowSeconds: 30 diff --git a/src/telemetry/database/TelemetryEngine.py b/src/telemetry/database/TelemetryEngine.py index 965b7c38d..18ec2ddbc 100644 --- a/src/telemetry/database/TelemetryEngine.py +++ b/src/telemetry/database/TelemetryEngine.py @@ -17,8 +17,8 @@ from common.Settings import get_setting LOGGER = logging.getLogger(__name__) -CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' -# CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' +# CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' +CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' class TelemetryEngine: @staticmethod @@ -32,7 +32,7 @@ class TelemetryEngine: CRDB_PASSWORD = "tfs123" CRDB_SSLMODE = "require" crdb_uri = CRDB_URI_TEMPLATE.format( - CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) + CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) try: engine = sqlalchemy.create_engine(crdb_uri, echo=False) LOGGER.info(' TelemetryDB initalized with DB URL: {:}'.format(crdb_uri)) @@ -40,5 +40,3 @@ class TelemetryEngine: LOGGER.exception('Failed to connect to database: {:s}'.format(str(crdb_uri))) return None # type: ignore return engine # type: ignore - - diff --git a/src/telemetry/database/TelemetryModel.py b/src/telemetry/database/TelemetryModel.py index 611ce7e70..4e71ce813 100644 --- a/src/telemetry/database/TelemetryModel.py +++ b/src/telemetry/database/TelemetryModel.py @@ -63,7 +63,7 @@ class Collector(Base): Args: row: The Collector table instance (row) containing the data. Returns: collector gRPC message initialized with the content of a row. """ - response = telemetry_frontend_pb2.Collector() + response = telemetry_frontend_pb2.Collector() response.collector_id.collector_id.uuid = row.collector_id response.kpi_id.kpi_id.uuid = row.kpi_id response.duration_s = row.sampling_duration_s -- GitLab From 739f52a12f6cf816837e82ba84ea996712c409de Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 26 Aug 2024 14:56:03 +0000 Subject: [PATCH 490/602] Minor chanages in Telemetry. - Unnecessary echo statements are removed from .gitlab-ci.yml file. - "-e ALLOW_ANONYMOUS_LOGIN=yes" flag is added to allow unauthorized connection with the zookeeper. --- src/telemetry/.gitlab-ci.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/telemetry/.gitlab-ci.yml b/src/telemetry/.gitlab-ci.yml index c7950eb91..110a6490d 100644 --- a/src/telemetry/.gitlab-ci.yml +++ b/src/telemetry/.gitlab-ci.yml @@ -145,12 +145,13 @@ unit_test telemetry-frontend: cockroachdb/cockroach:latest-v22.2 start-single-node - echo "Waiting for initialization..." - while ! docker logs crdb 2>&1 | grep -q 'finished creating default user \"tfs\"'; do sleep 1; done - - docker logs crdb - - docker ps -a + # - docker logs crdb + # - docker ps -a - CRDB_ADDRESS=$(docker inspect crdb --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") - echo $CRDB_ADDRESS - > - docker run --name zookeeper -d --network=teraflowbridge -p 2181:2181 + docker run --name zookeeper -d --network=teraflowbridge -p 2181:2181 \ + -e ALLOW_ANONYMOUS_LOGIN=yes \ bitnami/zookeeper:latest - sleep 10 # Wait for Zookeeper to start - docker run --name kafka -d --network=teraflowbridge -p 9092:9092 @@ -160,8 +161,8 @@ unit_test telemetry-frontend: - sleep 20 # Wait for Kafka to start - KAFKA_IP=$(docker inspect kafka --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") - echo $KAFKA_IP - - docker logs zookeeper - - docker logs kafka + # - docker logs zookeeper + # - docker logs kafka - > docker run --name $IMAGE_NAME-frontend -d -p 30050:30050 --env "CRDB_URI=cockroachdb://tfs:tfs123@${CRDB_ADDRESS}:26257/tfs_test?sslmode=require" -- GitLab From 485d3178322cfc049fb9e12014bb15a5ecd5aa1e Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 27 Aug 2024 11:24:33 +0000 Subject: [PATCH 491/602] Initial Version of Analytics Component - Added the Analytics Frontend client and service with no logic implemented yet. - Added enums and ports for the Analytics frontend and backend in the constants. - Added test files and messages. - Added test execution scripts. --- .../run_tests_locally-analytics-frontend.sh | 23 +++++ src/analytics/README.md | 4 + src/analytics/__init__.py | 15 +++ src/analytics/frontend/Dockerfile | 70 ++++++++++++++ src/analytics/frontend/__init__.py | 15 +++ .../client/AnalyticsFrontendClient.py | 68 +++++++++++++ src/analytics/frontend/client/__init__.py | 14 +++ src/analytics/frontend/requirements.in | 21 ++++ .../service/AnalyticsFrontendService.py | 28 ++++++ .../AnalyticsFrontendServiceServicerImpl.py | 58 +++++++++++ src/analytics/frontend/service/__init__.py | 15 +++ src/analytics/frontend/service/__main__.py | 52 ++++++++++ src/analytics/frontend/tests/messages.py | 58 +++++++++++ src/analytics/frontend/tests/test_frontend.py | 95 +++++++++++++++++++ src/common/Constants.py | 6 ++ 15 files changed, 542 insertions(+) create mode 100755 scripts/run_tests_locally-analytics-frontend.sh create mode 100644 src/analytics/README.md create mode 100644 src/analytics/__init__.py create mode 100644 src/analytics/frontend/Dockerfile create mode 100644 src/analytics/frontend/__init__.py create mode 100644 src/analytics/frontend/client/AnalyticsFrontendClient.py create mode 100644 src/analytics/frontend/client/__init__.py create mode 100644 src/analytics/frontend/requirements.in create mode 100644 src/analytics/frontend/service/AnalyticsFrontendService.py create mode 100644 src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py create mode 100644 src/analytics/frontend/service/__init__.py create mode 100644 src/analytics/frontend/service/__main__.py create mode 100644 src/analytics/frontend/tests/messages.py create mode 100644 src/analytics/frontend/tests/test_frontend.py diff --git a/scripts/run_tests_locally-analytics-frontend.sh b/scripts/run_tests_locally-analytics-frontend.sh new file mode 100755 index 000000000..58fd062f2 --- /dev/null +++ b/scripts/run_tests_locally-analytics-frontend.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + + +PROJECTDIR=`pwd` + +cd $PROJECTDIR/src + +RCFILE=$PROJECTDIR/coverage/.coveragerc +python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ + analytics/frontend/tests/test_frontend.py diff --git a/src/analytics/README.md b/src/analytics/README.md new file mode 100644 index 000000000..9663e5321 --- /dev/null +++ b/src/analytics/README.md @@ -0,0 +1,4 @@ +# How to locally run and test Analytic service (To be added soon) + +### Pre-requisets +The following requirements should be fulfilled before the execuation of Telemetry service. diff --git a/src/analytics/__init__.py b/src/analytics/__init__.py new file mode 100644 index 000000000..234a1af65 --- /dev/null +++ b/src/analytics/__init__.py @@ -0,0 +1,15 @@ + +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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/analytics/frontend/Dockerfile b/src/analytics/frontend/Dockerfile new file mode 100644 index 000000000..f3b8838b2 --- /dev/null +++ b/src/analytics/frontend/Dockerfile @@ -0,0 +1,70 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +FROM python:3.9-slim + +# Install dependencies +RUN apt-get --yes --quiet --quiet update && \ + apt-get --yes --quiet --quiet install wget g++ git && \ + rm -rf /var/lib/apt/lists/* + +# Set Python to show logs as they occur +ENV PYTHONUNBUFFERED=0 + +# Download the gRPC health probe +RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \ + chmod +x /bin/grpc_health_probe + +# Get generic Python packages +RUN python3 -m pip install --upgrade pip +RUN python3 -m pip install --upgrade setuptools wheel +RUN python3 -m pip install --upgrade pip-tools + +# Get common Python packages +# Note: this step enables sharing the previous Docker build steps among all the Python components +WORKDIR /var/teraflow +COPY common_requirements.in common_requirements.in +RUN pip-compile --quiet --output-file=common_requirements.txt common_requirements.in +RUN python3 -m pip install -r common_requirements.txt + +# Add common files into working directory +WORKDIR /var/teraflow/common +COPY src/common/. ./ +RUN rm -rf proto + +# Create proto sub-folder, copy .proto files, and generate Python code +RUN mkdir -p /var/teraflow/common/proto +WORKDIR /var/teraflow/common/proto +RUN touch __init__.py +COPY proto/*.proto ./ +RUN python3 -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. *.proto +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/analytics/frontend +WORKDIR /var/analyticstelemetry/frontend +COPY src/analytics/frontend/requirements.in requirements.in +RUN pip-compile --quiet --output-file=requirements.txt requirements.in +RUN python3 -m pip install -r requirements.txt + +# Add component files into working directory +WORKDIR /var/teraflow +COPY src/analytics/__init__.py analytics/__init__.py +COPY src/analytics/frontend/. analytics/frontend/ +COPY src/analytics/database/. analytics/database/ + +# Start the service +ENTRYPOINT ["python", "-m", "analytics.frontend.service"] diff --git a/src/analytics/frontend/__init__.py b/src/analytics/frontend/__init__.py new file mode 100644 index 000000000..234a1af65 --- /dev/null +++ b/src/analytics/frontend/__init__.py @@ -0,0 +1,15 @@ + +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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/analytics/frontend/client/AnalyticsFrontendClient.py b/src/analytics/frontend/client/AnalyticsFrontendClient.py new file mode 100644 index 000000000..bfa8cae45 --- /dev/null +++ b/src/analytics/frontend/client/AnalyticsFrontendClient.py @@ -0,0 +1,68 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 grpc, logging +from common.Constants import ServiceNameEnum +from common.proto.context_pb2 import Empty +from common.proto.analytics_frontend_pb2_grpc import AnalyticsFrontendServiceStub +from common.proto.analytics_frontend_pb2 import AnalyzerId, Analyzer, AnalyzerFilter, AnalyzerList +from common.Settings import get_service_host, get_service_port_grpc +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.client.RetryDecorator import retry, delay_exponential + +LOGGER = logging.getLogger(__name__) +MAX_RETRIES = 10 +DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) +RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') + +class AnalyticsFrontendClient: + def __init__(self, host=None, port=None): + if not host: host = get_service_host(ServiceNameEnum.ANALYTICSFRONTEND) + if not port: port = get_service_port_grpc(ServiceNameEnum.ANALYTICSFRONTEND) + self.endpoint = '{:s}:{:s}'.format(str(host), str(port)) + LOGGER.debug('Creating channel to {:s}...'.format(str(self.endpoint))) + self.channel = None + self.stub = None + self.connect() + LOGGER.debug('Channel created') + + def connect(self): + self.channel = grpc.insecure_channel(self.endpoint) + self.stub = AnalyticsFrontendServiceStub(self.channel) + + def close(self): + if self.channel is not None: self.channel.close() + self.channel = None + self.stub = None + + @RETRY_DECORATOR + def StartAnalyzer (self, request: Analyzer) -> AnalyzerId: #type: ignore + LOGGER.debug('StartAnalyzer: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.StartAnalyzer(request) + LOGGER.debug('StartAnalyzer result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def StopAnalyzer(self, request : AnalyzerId) -> Empty: # type: ignore + LOGGER.debug('StopAnalyzer: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.StopAnalyzer(request) + LOGGER.debug('StopAnalyzer result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def SelectAnalyzers(self, request : AnalyzerFilter) -> AnalyzerList: # type: ignore + LOGGER.debug('SelectAnalyzers: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.SelectAnalyzers(request) + LOGGER.debug('SelectAnalyzers result: {:s}'.format(grpc_message_to_json_string(response))) + return response \ No newline at end of file diff --git a/src/analytics/frontend/client/__init__.py b/src/analytics/frontend/client/__init__.py new file mode 100644 index 000000000..3ee6f7071 --- /dev/null +++ b/src/analytics/frontend/client/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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/analytics/frontend/requirements.in b/src/analytics/frontend/requirements.in new file mode 100644 index 000000000..98cf96710 --- /dev/null +++ b/src/analytics/frontend/requirements.in @@ -0,0 +1,21 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +java==11.0.* +pyspark==3.5.2 +confluent-kafka==2.3.* +psycopg2-binary==2.9.* +SQLAlchemy==1.4.* +sqlalchemy-cockroachdb==1.4.* +SQLAlchemy-Utils==0.38.* \ No newline at end of file diff --git a/src/analytics/frontend/service/AnalyticsFrontendService.py b/src/analytics/frontend/service/AnalyticsFrontendService.py new file mode 100644 index 000000000..e702c0144 --- /dev/null +++ b/src/analytics/frontend/service/AnalyticsFrontendService.py @@ -0,0 +1,28 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +from common.Constants import ServiceNameEnum +from common.Settings import get_service_port_grpc +from common.tools.service.GenericGrpcService import GenericGrpcService +from common.proto.analytics_frontend_pb2_grpc import add_AnalyticsFrontendServiceServicer_to_server +from analytics.frontend.service.AnalyticsFrontendServiceServicerImpl import AnalyticsFrontendServiceServicerImpl + +class AnalyticsFrontendService(GenericGrpcService): + def __init__(self, cls_name: str = __name__): + port = get_service_port_grpc(ServiceNameEnum.ANALYTICSFRONTEND) + super().__init__(port, cls_name=cls_name) + self.analytics_frontend_servicer = AnalyticsFrontendServiceServicerImpl() + + def install_servicers(self): + add_AnalyticsFrontendServiceServicer_to_server(self.analytics_frontend_servicer, self.server) \ No newline at end of file diff --git a/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py new file mode 100644 index 000000000..b981c038b --- /dev/null +++ b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py @@ -0,0 +1,58 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging, grpc + +from common.proto.context_pb2 import Empty +from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method + +from common.proto.analytics_frontend_pb2 import Analyzer, AnalyzerId, AnalyzerFilter, AnalyzerList +from common.proto.analytics_frontend_pb2_grpc import AnalyticsFrontendServiceServicer + + +LOGGER = logging.getLogger(__name__) +METRICS_POOL = MetricsPool('AnalyticsFrontend', 'NBIgRPC') + + +class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer): + def __init__(self): + LOGGER.info('Init AnalyticsFrontendService') + + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def StartAnalyzer(self, + request : Analyzer, grpc_context: grpc.ServicerContext # type: ignore + ) -> AnalyzerId: # type: ignore + LOGGER.info ("At Service gRPC message: {:}".format(request)) + response = AnalyzerId() + + return response + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def StopAnalyzer(self, + request : AnalyzerId, grpc_context: grpc.ServicerContext # type: ignore + ) -> Empty: # type: ignore + LOGGER.info ("At Service gRPC message: {:}".format(request)) + + return Empty() + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def SelectAnalyzers(self, + request : AnalyzerFilter, contextgrpc_context: grpc.ServicerContext # type: ignore + ) -> AnalyzerList: # type: ignore + LOGGER.info("At Service gRPC message: {:}".format(request)) + response = AnalyzerList() + + return response diff --git a/src/analytics/frontend/service/__init__.py b/src/analytics/frontend/service/__init__.py new file mode 100644 index 000000000..234a1af65 --- /dev/null +++ b/src/analytics/frontend/service/__init__.py @@ -0,0 +1,15 @@ + +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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/analytics/frontend/service/__main__.py b/src/analytics/frontend/service/__main__.py new file mode 100644 index 000000000..e33a4c62b --- /dev/null +++ b/src/analytics/frontend/service/__main__.py @@ -0,0 +1,52 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging, signal, sys, threading +from common.Settings import get_log_level +from .AnalyticsFrontendService import AnalyticsFrontendService + + +terminate = threading.Event() +LOGGER = None + +def signal_handler(signal, frame): # pylint: disable=redefined-outer-name + LOGGER.warning('Terminate signal received') + terminate.set() + +def main(): + global LOGGER # pylint: disable=global-statement + + log_level = get_log_level() + logging.basicConfig(level=log_level) + LOGGER = logging.getLogger(__name__) + + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + + LOGGER.debug('Starting...') + + grpc_service = AnalyticsFrontendService() + grpc_service.start() + + # Wait for Ctrl+C or termination signal + while not terminate.wait(timeout=1.0): pass + + LOGGER.debug('Terminating...') + grpc_service.stop() + + LOGGER.debug('Bye') + return 0 + +if __name__ == '__main__': + sys.exit(main()) diff --git a/src/analytics/frontend/tests/messages.py b/src/analytics/frontend/tests/messages.py new file mode 100644 index 000000000..1aaf8dd47 --- /dev/null +++ b/src/analytics/frontend/tests/messages.py @@ -0,0 +1,58 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.kpi_manager_pb2 import KpiId +from common.proto.analytics_frontend_pb2 import ( AnalyzerOperationMode, AnalyzerId, + Analyzer, AnalyzerFilter ) + +def create_analyzer_id(): + _create_analyzer_id = AnalyzerId() + _create_analyzer_id.analyzer_id.uuid = str(uuid.uuid4()) + return _create_analyzer_id + +def create_analyzer(): + _create_analyzer = Analyzer() + + _create_analyzer.algorithm_name = "some_algo_name" + + _kpi_id = KpiId() + _kpi_id.kpi_id.uuid = str(uuid.uuid4()) # input IDs to analyze + _create_analyzer.input_kpi_ids.append(_kpi_id) + _kpi_id.kpi_id.uuid = str(uuid.uuid4()) # output IDs after analysis + _create_analyzer.output_kpi_ids.append(_kpi_id) + + _create_analyzer.operation_mode = AnalyzerOperationMode.ANALYZEROPERATIONMODE_STREAMING + + return _create_analyzer + +def create_analyzer_filter(): + _create_analyzer_filter = AnalyzerFilter() + + _analyzer_id_obj = AnalyzerId() + _analyzer_id_obj.analyzer_id.uuid = str(uuid.uuid4()) + _create_analyzer_filter.analyzer_id.append(_analyzer_id_obj) + + _create_analyzer_filter.algorithm_names.append('Algorithum1') + + _input_kpi_id_obj = KpiId() + _input_kpi_id_obj.kpi_id.uuid = str(uuid.uuid4()) + _create_analyzer_filter.input_kpi_ids.append(_input_kpi_id_obj) + + _output_kpi_id_obj = KpiId() + _output_kpi_id_obj.kpi_id.uuid = str(uuid.uuid4()) + _create_analyzer_filter.output_kpi_ids.append(_output_kpi_id_obj) + + return _create_analyzer_filter + diff --git a/src/analytics/frontend/tests/test_frontend.py b/src/analytics/frontend/tests/test_frontend.py new file mode 100644 index 000000000..ae7875b86 --- /dev/null +++ b/src/analytics/frontend/tests/test_frontend.py @@ -0,0 +1,95 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 os +import pytest +import logging + +from common.Constants import ServiceNameEnum +from common.proto.context_pb2 import Empty +from common.Settings import ( get_service_port_grpc, get_env_var_name, + ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC ) + +from common.proto.analytics_frontend_pb2 import AnalyzerId, AnalyzerList +from analytics.frontend.client.AnalyticsFrontendClient import AnalyticsFrontendClient +from analytics.frontend.service.AnalyticsFrontendService import AnalyticsFrontendService +from analytics.frontend.tests.messages import ( create_analyzer_id, create_analyzer, + create_analyzer_filter ) + +########################### +# Tests Setup +########################### + +LOCAL_HOST = '127.0.0.1' + +ANALYTICS_FRONTEND_PORT = str(get_service_port_grpc(ServiceNameEnum.ANALYTICSFRONTEND)) +os.environ[get_env_var_name(ServiceNameEnum.ANALYTICSFRONTEND, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) +os.environ[get_env_var_name(ServiceNameEnum.ANALYTICSFRONTEND, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(ANALYTICS_FRONTEND_PORT) + +LOGGER = logging.getLogger(__name__) + +@pytest.fixture(scope='session') +def analyticsFrontend_service(): + LOGGER.info('Initializing AnalyticsFrontendService...') + + _service = AnalyticsFrontendService() + _service.start() + + # yield the server, when test finishes, execution will resume to stop it + LOGGER.info('Yielding AnalyticsFrontendService...') + yield _service + + LOGGER.info('Terminating AnalyticsFrontendService...') + _service.stop() + + LOGGER.info('Terminated AnalyticsFrontendService...') + +@pytest.fixture(scope='session') +def analyticsFrontend_client(analyticsFrontend_service : AnalyticsFrontendService): + LOGGER.info('Initializing AnalyticsFrontendClient...') + + _client = AnalyticsFrontendClient() + + # yield the server, when test finishes, execution will resume to stop it + LOGGER.info('Yielding AnalyticsFrontendClient...') + yield _client + + LOGGER.info('Closing AnalyticsFrontendClient...') + _client.close() + + LOGGER.info('Closed AnalyticsFrontendClient...') + + +########################### +# Tests Implementation of Analytics Frontend +########################### + +# ----- core funtionality test ----- +def test_StartAnalytic(analyticsFrontend_client): + LOGGER.info(' >>> test_StartAnalytic START: <<< ') + response = analyticsFrontend_client.StartAnalyzer(create_analyzer()) + LOGGER.debug(str(response)) + assert isinstance(response, AnalyzerId) + +def test_StopAnalytic(analyticsFrontend_client): + LOGGER.info(' >>> test_StopAnalytic START: <<< ') + response = analyticsFrontend_client.StopAnalyzer(create_analyzer_id()) + LOGGER.debug(str(response)) + assert isinstance(response, Empty) + +def test_SelectAnalytics(analyticsFrontend_client): + LOGGER.info(' >>> test_SelectAnalytics START: <<< ') + response = analyticsFrontend_client.SelectAnalyzers(create_analyzer_filter()) + LOGGER.debug(str(response)) + assert isinstance(response, AnalyzerList) \ No newline at end of file diff --git a/src/common/Constants.py b/src/common/Constants.py index 767b21343..74490321f 100644 --- a/src/common/Constants.py +++ b/src/common/Constants.py @@ -65,6 +65,9 @@ class ServiceNameEnum(Enum): KPIVALUEAPI = 'kpi-value-api' KPIVALUEWRITER = 'kpi-value-writer' TELEMETRYFRONTEND = 'telemetry-frontend' + TELEMETRYBACKEND = 'telemetry-backend' + ANALYTICSFRONTEND = 'analytics-frontend' + ANALYTICSBACKEND = 'analytics-backend' # Used for test and debugging only DLT_GATEWAY = 'dltgateway' @@ -98,6 +101,9 @@ DEFAULT_SERVICE_GRPC_PORTS = { ServiceNameEnum.KPIVALUEAPI .value : 30020, ServiceNameEnum.KPIVALUEWRITER .value : 30030, ServiceNameEnum.TELEMETRYFRONTEND .value : 30050, + ServiceNameEnum.TELEMETRYBACKEND .value : 30060, + ServiceNameEnum.ANALYTICSFRONTEND .value : 30080, + ServiceNameEnum.ANALYTICSBACKEND .value : 30090, # Used for test and debugging only ServiceNameEnum.DLT_GATEWAY .value : 50051, -- GitLab From 8072cdfb1f53b091a5ea43659dcb1b26313247f4 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 5 Aug 2024 12:13:34 +0000 Subject: [PATCH 492/602] Changes are made to restructure the Telemetry DB operations. - TelemetryEngine.py is updated. - TelemetryModel.py is refined. - Optimized DB operation were added in TelemetryDB.py --- src/telemetry/database/TelemetryDB.py | 137 ++++++++++ src/telemetry/database/TelemetryDBmanager.py | 248 ------------------- src/telemetry/database/TelemetryEngine.py | 39 +-- src/telemetry/database/TelemetryModel.py | 23 +- src/telemetry/database/managementDB.py | 138 ----------- 5 files changed, 160 insertions(+), 425 deletions(-) create mode 100644 src/telemetry/database/TelemetryDB.py delete mode 100644 src/telemetry/database/TelemetryDBmanager.py delete mode 100644 src/telemetry/database/managementDB.py diff --git a/src/telemetry/database/TelemetryDB.py b/src/telemetry/database/TelemetryDB.py new file mode 100644 index 000000000..b5b0c4c7e --- /dev/null +++ b/src/telemetry/database/TelemetryDB.py @@ -0,0 +1,137 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging +import sqlalchemy_utils +from sqlalchemy.orm import sessionmaker +from telemetry.database.TelemetryModel import Collector as CollectorModel +from telemetry.database.TelemetryEngine import TelemetryEngine +from common.method_wrappers.ServiceExceptions import ( + OperationFailedException, AlreadyExistsException ) + +LOGGER = logging.getLogger(__name__) +DB_NAME = "tfs_telemetry" + +class TelemetryDBmanager: + def __init__(self): + self.db_engine = TelemetryEngine.get_engine() + if self.db_engine is None: + LOGGER.error('Unable to get SQLAlchemy DB Engine...') + return False + self.db_name = DB_NAME + self.Session = sessionmaker(bind=self.db_engine) + + def create_database(self): + if not sqlalchemy_utils.database_exists(self.db_engine.url): + LOGGER.debug("Database created. {:}".format(self.db_engine.url)) + sqlalchemy_utils.create_database(self.db_engine.url) + + def drop_database(self) -> None: + if sqlalchemy_utils.database_exists(self.db_engine.url): + sqlalchemy_utils.drop_database(self.db_engine.url) + + def create_tables(self): + try: + CollectorModel.metadata.create_all(self.db_engine) # type: ignore + LOGGER.debug("Tables created in the database: {:}".format(self.db_name)) + except Exception as e: + LOGGER.debug("Tables cannot be created in the database. {:s}".format(str(e))) + raise OperationFailedException ("Tables can't be created", extra_details=["unable to create table {:}".format(e)]) + + def verify_tables(self): + try: + with self.db_engine.connect() as connection: + result = connection.execute("SHOW TABLES;") + tables = result.fetchall() + LOGGER.info("Tables in DB: {:}".format(tables)) + except Exception as e: + LOGGER.info("Unable to fetch Table names. {:s}".format(str(e))) + +# ----------------- CURD METHODs --------------------- + + def add_row_to_db(self, row): + session = self.Session() + try: + session.add(row) + session.commit() + LOGGER.debug(f"Row inserted into {row.__class__.__name__} table.") + return True + except Exception as e: + session.rollback() + if "psycopg2.errors.UniqueViolation" in str(e): + LOGGER.error(f"Unique key voilation: {row.__class__.__name__} table. {str(e)}") + raise AlreadyExistsException(row.__class__.__name__, row, + extra_details=["Unique key voilation: {:}".format(e)] ) + else: + LOGGER.error(f"Failed to insert new row into {row.__class__.__name__} table. {str(e)}") + raise OperationFailedException ("Deletion by column id", extra_details=["unable to delete row {:}".format(e)]) + finally: + session.close() + + def search_db_row_by_id(self, model, col_name, id_to_search): + session = self.Session() + try: + entity = session.query(model).filter_by(**{col_name: id_to_search}).first() + if entity: + # LOGGER.debug(f"{model.__name__} ID found: {str(entity)}") + return entity + else: + LOGGER.debug(f"{model.__name__} ID not found, No matching row: {str(id_to_search)}") + print("{:} ID not found, No matching row: {:}".format(model.__name__, id_to_search)) + return None + except Exception as e: + session.rollback() + LOGGER.debug(f"Failed to retrieve {model.__name__} ID. {str(e)}") + raise OperationFailedException ("search by column id", extra_details=["unable to search row {:}".format(e)]) + finally: + session.close() + + def delete_db_row_by_id(self, model, col_name, id_to_search): + session = self.Session() + try: + record = session.query(model).filter_by(**{col_name: id_to_search}).first() + if record: + session.delete(record) + session.commit() + LOGGER.debug("Deleted %s with %s: %s", model.__name__, col_name, id_to_search) + else: + LOGGER.debug("%s with %s %s not found", model.__name__, col_name, id_to_search) + return None + except Exception as e: + session.rollback() + LOGGER.error("Error deleting %s with %s %s: %s", model.__name__, col_name, id_to_search, e) + raise OperationFailedException ("Deletion by column id", extra_details=["unable to delete row {:}".format(e)]) + finally: + session.close() + + def select_with_filter(self, model, filter_object): + session = self.Session() + try: + query = session.query(CollectorModel) + # Apply filters based on the filter_object + if filter_object.kpi_id: + query = query.filter(CollectorModel.kpi_id.in_([k.kpi_id.uuid for k in filter_object.kpi_id])) + result = query.all() + + if result: + LOGGER.debug(f"Fetched filtered rows from {model.__name__} table with filters: {filter_object}") # - Results: {result} + else: + LOGGER.debug(f"No matching row found in {model.__name__} table with filters: {filter_object}") + return result + except Exception as e: + LOGGER.error(f"Error fetching filtered rows from {model.__name__} table with filters {filter_object} ::: {e}") + raise OperationFailedException ("Select by filter", extra_details=["unable to apply the filter {:}".format(e)]) + finally: + session.close() + diff --git a/src/telemetry/database/TelemetryDBmanager.py b/src/telemetry/database/TelemetryDBmanager.py deleted file mode 100644 index b558180a9..000000000 --- a/src/telemetry/database/TelemetryDBmanager.py +++ /dev/null @@ -1,248 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging, time -import sqlalchemy -from sqlalchemy import inspect, MetaData, Table -from sqlalchemy.orm import sessionmaker -from telemetry.database.TelemetryModel import Collector as CollectorModel -from telemetry.database.TelemetryModel import Kpi as KpiModel -from sqlalchemy.ext.declarative import declarative_base -from telemetry.database.TelemetryEngine import TelemetryEngine -from common.proto.kpi_manager_pb2 import KpiDescriptor, KpiId -from common.proto.telemetry_frontend_pb2 import Collector, CollectorId -from sqlalchemy.exc import SQLAlchemyError -from telemetry.database.TelemetryModel import Base - -LOGGER = logging.getLogger(__name__) -DB_NAME = "telemetryfrontend" - -class TelemetryDBmanager: - def __init__(self): - self.db_engine = TelemetryEngine.get_engine() - if self.db_engine is None: - LOGGER.error('Unable to get SQLAlchemy DB Engine...') - return False - self.db_name = DB_NAME - self.Session = sessionmaker(bind=self.db_engine) - - def create_database(self): - try: - # with self.db_engine.connect() as connection: - # connection.execute(f"CREATE DATABASE {self.db_name};") - TelemetryEngine.create_database(self.db_engine) - LOGGER.info('TelemetryDBmanager initalized DB Name: {:}'.format(self.db_name)) - return True - except Exception as e: # pylint: disable=bare-except # pragma: no cover - LOGGER.exception('Failed to check/create the database: {:s}'.format(str(e))) - return False - - def create_tables(self): - try: - Base.metadata.create_all(self.db_engine) # type: ignore - LOGGER.info("Tables created in database ({:}) the as per Models".format(self.db_name)) - except Exception as e: - LOGGER.info("Tables cannot be created in the TelemetryFrontend database. {:s}".format(str(e))) - - def verify_tables(self): - try: - with self.db_engine.connect() as connection: - result = connection.execute("SHOW TABLES;") - tables = result.fetchall() - LOGGER.info("Tables in DB: {:}".format(tables)) - except Exception as e: - LOGGER.info("Unable to fetch Table names. {:s}".format(str(e))) - - def drop_table(self, table_to_drop: str): - try: - inspector = inspect(self.db_engine) - existing_tables = inspector.get_table_names() - if table_to_drop in existing_tables: - table = Table(table_to_drop, MetaData(), autoload_with=self.db_engine) - table.drop(self.db_engine) - LOGGER.info("Tables delete in the DB Name: {:}".format(self.db_name)) - else: - LOGGER.warning("No table {:} in database {:} ".format(table_to_drop, DB_NAME)) - except Exception as e: - LOGGER.info("Tables cannot be deleted in the {:} database. {:s}".format(DB_NAME, str(e))) - - def list_databases(self): - query = "SHOW DATABASES" - with self.db_engine.connect() as connection: - result = connection.execute(query) - databases = [row[0] for row in result] - LOGGER.info("List of available DBs: {:}".format(databases)) - -# ------------------ INSERT METHODs -------------------------------------- - - def inser_kpi(self, request: KpiDescriptor): - session = self.Session() - try: - # Create a new Kpi instance - 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.service_id.service_uuid.uuid - kpi_to_insert.endpoint_id = request.device_id.device_uuid.uuid - kpi_to_insert.service_id = request.slice_id.slice_uuid.uuid - kpi_to_insert.slice_id = request.endpoint_id.endpoint_uuid.uuid - kpi_to_insert.connection_id = request.connection_id.connection_uuid.uuid - # kpi_to_insert.link_id = request.link_id.link_id.uuid - # Add the instance to the session - session.add(kpi_to_insert) - session.commit() - LOGGER.info("Row inserted into kpi table: {:}".format(kpi_to_insert.kpi_id)) - except Exception as e: - session.rollback() - LOGGER.info("Failed to insert new kpi. {:s}".format(str(e))) - finally: - # Close the session - session.close() - - # Function to insert a row into the Collector model - def insert_collector(self, request: Collector): - session = self.Session() - try: - # Create a new Collector instance - collector_to_insert = CollectorModel() - collector_to_insert.collector_id = request.collector_id.collector_id.uuid - collector_to_insert.kpi_id = request.kpi_id.kpi_id.uuid - collector_to_insert.collector = "Test collector description" - collector_to_insert.sampling_duration_s = request.duration_s - collector_to_insert.sampling_interval_s = request.interval_s - collector_to_insert.start_timestamp = time.time() - collector_to_insert.end_timestamp = time.time() - - session.add(collector_to_insert) - session.commit() - LOGGER.info("Row inserted into collector table: {:}".format(collector_to_insert.collector_id)) - except Exception as e: - session.rollback() - LOGGER.info("Failed to insert new collector. {:s}".format(str(e))) - finally: - # Close the session - session.close() - -# ------------------ GET METHODs -------------------------------------- - - def get_kpi_descriptor(self, request: KpiId): - session = self.Session() - try: - kpi_id_to_search = request.kpi_id.uuid - kpi = session.query(KpiModel).filter_by(kpi_id=kpi_id_to_search).first() - if kpi: - LOGGER.info("kpi ID found: {:s}".format(str(kpi))) - return kpi - else: - LOGGER.warning("Kpi ID not found {:s}".format(str(kpi_id_to_search))) - return None - except Exception as e: - session.rollback() - LOGGER.info("Failed to retrieve KPI ID. {:s}".format(str(e))) - raise - finally: - session.close() - - def get_collector(self, request: CollectorId): - session = self.Session() - try: - collector_id_to_search = request.collector_id.uuid - collector = session.query(CollectorModel).filter_by(collector_id=collector_id_to_search).first() - if collector: - LOGGER.info("collector ID found: {:s}".format(str(collector))) - return collector - else: - LOGGER.warning("collector ID not found{:s}".format(str(collector_id_to_search))) - return None - except Exception as e: - session.rollback() - LOGGER.info("Failed to retrieve collector ID. {:s}".format(str(e))) - raise - finally: - session.close() - - # ------------------ SELECT METHODs -------------------------------------- - - def select_kpi_descriptor(self, **filters): - session = self.Session() - try: - query = session.query(KpiModel) - for column, value in filters.items(): - query = query.filter(getattr(KpiModel, column) == value) - result = query.all() - if len(result) != 0: - LOGGER.info("Fetched filtered rows from KPI table with filters : {:s}".format(str(result))) - else: - LOGGER.warning("No matching row found : {:s}".format(str(result))) - return result - except SQLAlchemyError as e: - LOGGER.error("Error fetching filtered rows from KPI table with filters {:}: {:}".format(filters, e)) - return [] - finally: - session.close() - - def select_collector(self, **filters): - session = self.Session() - try: - query = session.query(CollectorModel) - for column, value in filters.items(): - query = query.filter(getattr(CollectorModel, column) == value) - result = query.all() - if len(result) != 0: - LOGGER.info("Fetched filtered rows from KPI table with filters : {:s}".format(str(result))) - else: - LOGGER.warning("No matching row found : {:s}".format(str(result))) - return result - except SQLAlchemyError as e: - LOGGER.error("Error fetching filtered rows from KPI table with filters {:}: {:}".format(filters, e)) - return [] - finally: - session.close() - -# ------------------ DELETE METHODs -------------------------------------- - - def delete_kpi_descriptor(self, request: KpiId): - session = self.Session() - try: - kpi_id_to_delete = request.kpi_id.uuid - kpi = session.query(KpiModel).filter_by(kpi_id=kpi_id_to_delete).first() - if kpi: - session.delete(kpi) - session.commit() - LOGGER.info("Deleted KPI with kpi_id: %s", kpi_id_to_delete) - else: - LOGGER.warning("KPI with kpi_id %s not found", kpi_id_to_delete) - except SQLAlchemyError as e: - session.rollback() - LOGGER.error("Error deleting KPI with kpi_id %s: %s", kpi_id_to_delete, e) - finally: - session.close() - - def delete_collector(self, request: CollectorId): - session = self.Session() - try: - collector_id_to_delete = request.collector_id.uuid - collector = session.query(CollectorModel).filter_by(collector_id=collector_id_to_delete).first() - if collector: - session.delete(collector) - session.commit() - LOGGER.info("Deleted collector with collector_id: %s", collector_id_to_delete) - else: - LOGGER.warning("collector with collector_id %s not found", collector_id_to_delete) - except SQLAlchemyError as e: - session.rollback() - LOGGER.error("Error deleting collector with collector_id %s: %s", collector_id_to_delete, e) - finally: - session.close() \ No newline at end of file diff --git a/src/telemetry/database/TelemetryEngine.py b/src/telemetry/database/TelemetryEngine.py index a563fa09f..bd7cda599 100644 --- a/src/telemetry/database/TelemetryEngine.py +++ b/src/telemetry/database/TelemetryEngine.py @@ -12,34 +12,28 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, sqlalchemy, sqlalchemy_utils -# from common.Settings import get_setting +import logging, sqlalchemy +from common.Settings import get_setting LOGGER = logging.getLogger(__name__) -APP_NAME = 'tfs' -ECHO = False # False: No dump SQL commands and transactions executed CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' # CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' class TelemetryEngine: - # def __init__(self): - # self.engine = self.get_engine() @staticmethod def get_engine() -> sqlalchemy.engine.Engine: - CRDB_NAMESPACE = "crdb" - CRDB_SQL_PORT = "26257" - CRDB_DATABASE = "telemetryfrontend" - CRDB_USERNAME = "tfs" - CRDB_PASSWORD = "tfs123" - CRDB_SSLMODE = "require" - crdb_uri = CRDB_URI_TEMPLATE.format( - CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) - # crdb_uri = CRDB_URI_TEMPLATE.format( - # CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) + crdb_uri = get_setting('CRDB_URI', default=None) + if crdb_uri is None: + CRDB_NAMESPACE = "crdb" + CRDB_SQL_PORT = "26257" + CRDB_DATABASE = "telemetryfrontend" + CRDB_USERNAME = "tfs" + CRDB_PASSWORD = "tfs123" + CRDB_SSLMODE = "require" + crdb_uri = CRDB_URI_TEMPLATE.format( + CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) try: - # engine = sqlalchemy.create_engine( - # crdb_uri, connect_args={'application_name': APP_NAME}, echo=ECHO, future=True) engine = sqlalchemy.create_engine(crdb_uri, echo=False) LOGGER.info(' TelemetryDBmanager initalized with DB URL: {:}'.format(crdb_uri)) except: # pylint: disable=bare-except # pragma: no cover @@ -47,13 +41,4 @@ class TelemetryEngine: return None # type: ignore return engine # type: ignore - @staticmethod - def create_database(engine : sqlalchemy.engine.Engine) -> None: - if not sqlalchemy_utils.database_exists(engine.url): - LOGGER.info("Database created. {:}".format(engine.url)) - sqlalchemy_utils.create_database(engine.url) - @staticmethod - def drop_database(engine : sqlalchemy.engine.Engine) -> None: - if sqlalchemy_utils.database_exists(engine.url): - sqlalchemy_utils.drop_database(engine.url) diff --git a/src/telemetry/database/TelemetryModel.py b/src/telemetry/database/TelemetryModel.py index be4f0969c..95f692e4b 100644 --- a/src/telemetry/database/TelemetryModel.py +++ b/src/telemetry/database/TelemetryModel.py @@ -14,9 +14,7 @@ import logging from sqlalchemy.dialects.postgresql import UUID -from sqlalchemy import Column, Integer, String, Float, Text, ForeignKey -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import sessionmaker, relationship +from sqlalchemy import Column, String, Float from sqlalchemy.orm import registry logging.basicConfig(level=logging.INFO) @@ -24,22 +22,23 @@ LOGGER = logging.getLogger(__name__) # Create a base class for declarative models Base = registry().generate_base() -# Base = declarative_base() class Collector(Base): __tablename__ = 'collector' collector_id = Column(UUID(as_uuid=False), primary_key=True) - kpi_id = Column(UUID(as_uuid=False)) - collector_decription = Column(String) - sampling_duration_s = Column(Float) - sampling_interval_s = Column(Float) - start_timestamp = Column(Float) - end_timestamp = Column(Float) - + kpi_id = Column(UUID(as_uuid=False), nullable=False) + collector_decription = Column(String , nullable=False) + sampling_duration_s = Column(Float , nullable=False) + sampling_interval_s = Column(Float , nullable=False) + start_timestamp = Column(Float , nullable=False) + end_timestamp = Column(Float , nullable=False) + # helps in logging the information def __repr__(self): return (f"") \ No newline at end of file + f"end_timestamp='{self.end_timestamp}')>") + +# add method to convert gRPC requests to rows if necessary... diff --git a/src/telemetry/database/managementDB.py b/src/telemetry/database/managementDB.py deleted file mode 100644 index f79126f27..000000000 --- a/src/telemetry/database/managementDB.py +++ /dev/null @@ -1,138 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging, time -import sqlalchemy -import sqlalchemy_utils -from sqlalchemy.orm import sessionmaker -from sqlalchemy.ext.declarative import declarative_base -from telemetry.database.TelemetryEngine import TelemetryEngine -from telemetry.database.TelemetryModel import Base - -LOGGER = logging.getLogger(__name__) -DB_NAME = "telemetryfrontend" - -# # Create a base class for declarative models -# Base = declarative_base() - -class managementDB: - def __init__(self): - self.db_engine = TelemetryEngine.get_engine() - if self.db_engine is None: - LOGGER.error('Unable to get SQLAlchemy DB Engine...') - return False - self.db_name = DB_NAME - self.Session = sessionmaker(bind=self.db_engine) - - @staticmethod - def create_database(engine : sqlalchemy.engine.Engine) -> None: - if not sqlalchemy_utils.database_exists(engine.url): - LOGGER.info("Database created. {:}".format(engine.url)) - sqlalchemy_utils.create_database(engine.url) - - @staticmethod - def drop_database(engine : sqlalchemy.engine.Engine) -> None: - if sqlalchemy_utils.database_exists(engine.url): - sqlalchemy_utils.drop_database(engine.url) - - # def create_database(self): - # try: - # with self.db_engine.connect() as connection: - # connection.execute(f"CREATE DATABASE {self.db_name};") - # LOGGER.info('managementDB initalizes database. Name: {self.db_name}') - # return True - # except: - # LOGGER.exception('Failed to check/create the database: {:s}'.format(str(self.db_engine.url))) - # return False - - @staticmethod - def create_tables(engine : sqlalchemy.engine.Engine): - try: - Base.metadata.create_all(engine) # type: ignore - LOGGER.info("Tables created in the DB Name: {:}".format(DB_NAME)) - except Exception as e: - LOGGER.info("Tables cannot be created in the TelemetryFrontend database. {:s}".format(str(e))) - - def verify_tables(self): - try: - with self.db_engine.connect() as connection: - result = connection.execute("SHOW TABLES;") - tables = result.fetchall() # type: ignore - LOGGER.info("Tables verified: {:}".format(tables)) - except Exception as e: - LOGGER.info("Unable to fetch Table names. {:s}".format(str(e))) - - @staticmethod - def add_row_to_db(self, row): - session = self.Session() - try: - session.add(row) - session.commit() - LOGGER.info(f"Row inserted into {row.__class__.__name__} table.") - except Exception as e: - session.rollback() - LOGGER.error(f"Failed to insert new row into {row.__class__.__name__} table. {str(e)}") - finally: - session.close() - - def search_db_row_by_id(self, model, col_name, id_to_search): - session = self.Session() - try: - entity = session.query(model).filter_by(**{col_name: id_to_search}).first() - if entity: - LOGGER.info(f"{model.__name__} ID found: {str(entity)}") - return entity - else: - LOGGER.warning(f"{model.__name__} ID not found: {str(id_to_search)}") - return None - except Exception as e: - session.rollback() - LOGGER.info(f"Failed to retrieve {model.__name__} ID. {str(e)}") - raise - finally: - session.close() - - def delete_db_row_by_id(self, model, col_name, id_to_search): - session = self.Session() - try: - record = session.query(model).filter_by(**{col_name: id_to_search}).first() - if record: - session.delete(record) - session.commit() - LOGGER.info("Deleted %s with %s: %s", model.__name__, col_name, id_to_search) - else: - LOGGER.warning("%s with %s %s not found", model.__name__, col_name, id_to_search) - except Exception as e: - session.rollback() - LOGGER.error("Error deleting %s with %s %s: %s", model.__name__, col_name, id_to_search, e) - finally: - session.close() - - def select_with_filter(self, model, **filters): - session = self.Session() - try: - query = session.query(model) - for column, value in filters.items(): - query = query.filter(getattr(model, column) == value) # type: ignore - result = query.all() - if result: - LOGGER.info(f"Fetched filtered rows from {model.__name__} table with filters: {filters}") # - Results: {result} - else: - LOGGER.warning(f"No matching row found in {model.__name__} table with filters: {filters}") - return result - except Exception as e: - LOGGER.error(f"Error fetching filtered rows from {model.__name__} table with filters {filters} ::: {e}") - return [] - finally: - session.close() \ No newline at end of file -- GitLab From 35ef2d9d5970923d90eebfe60fd6da43744ec745 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 5 Aug 2024 13:05:25 +0000 Subject: [PATCH 493/602] chanegs to sucessfully executes the DB test. - updated test file to log DEBUG cmd - change the class name of "TelemetryDBmanager" to "TelemeterDB" - corrected the DB name - move messages.py and test files to correcte location. --- scripts/run_tests_locally-telemetry-DB.sh | 4 +- src/telemetry/database/TelemetryEngine.py | 4 +- .../{TelemetryDB.py => Telemetry_DB.py} | 10 +- src/telemetry/database/tests/__init__.py | 13 - .../database/tests/telemetryDBtests.py | 86 ----- src/telemetry/database/tests/temp_DB.py | 327 ------------------ .../{database => }/tests/messages.py | 0 .../test_telemetryDB.py} | 16 +- 8 files changed, 20 insertions(+), 440 deletions(-) rename src/telemetry/database/{TelemetryDB.py => Telemetry_DB.py} (96%) delete mode 100644 src/telemetry/database/tests/__init__.py delete mode 100644 src/telemetry/database/tests/telemetryDBtests.py delete mode 100644 src/telemetry/database/tests/temp_DB.py rename src/telemetry/{database => }/tests/messages.py (100%) rename src/telemetry/{database/tests/managementDBtests.py => tests/test_telemetryDB.py} (59%) diff --git a/scripts/run_tests_locally-telemetry-DB.sh b/scripts/run_tests_locally-telemetry-DB.sh index bb1c48b76..4b9a41760 100755 --- a/scripts/run_tests_locally-telemetry-DB.sh +++ b/scripts/run_tests_locally-telemetry-DB.sh @@ -22,5 +22,5 @@ cd $PROJECTDIR/src # kpi_manager/tests/test_unitary.py RCFILE=$PROJECTDIR/coverage/.coveragerc -python3 -m pytest --log-cli-level=INFO --verbose \ - telemetry/database/tests/telemetryDBtests.py +python3 -m pytest --log-level=DEBUG --log-cli-level=debug --verbose \ + telemetry/tests/test_telemetryDB.py diff --git a/src/telemetry/database/TelemetryEngine.py b/src/telemetry/database/TelemetryEngine.py index bd7cda599..965b7c38d 100644 --- a/src/telemetry/database/TelemetryEngine.py +++ b/src/telemetry/database/TelemetryEngine.py @@ -27,7 +27,7 @@ class TelemetryEngine: if crdb_uri is None: CRDB_NAMESPACE = "crdb" CRDB_SQL_PORT = "26257" - CRDB_DATABASE = "telemetryfrontend" + CRDB_DATABASE = "tfs-telemetry" CRDB_USERNAME = "tfs" CRDB_PASSWORD = "tfs123" CRDB_SSLMODE = "require" @@ -35,7 +35,7 @@ class TelemetryEngine: CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) try: engine = sqlalchemy.create_engine(crdb_uri, echo=False) - LOGGER.info(' TelemetryDBmanager initalized with DB URL: {:}'.format(crdb_uri)) + LOGGER.info(' TelemetryDB initalized with DB URL: {:}'.format(crdb_uri)) except: # pylint: disable=bare-except # pragma: no cover LOGGER.exception('Failed to connect to database: {:s}'.format(str(crdb_uri))) return None # type: ignore diff --git a/src/telemetry/database/TelemetryDB.py b/src/telemetry/database/Telemetry_DB.py similarity index 96% rename from src/telemetry/database/TelemetryDB.py rename to src/telemetry/database/Telemetry_DB.py index b5b0c4c7e..ec7da9e40 100644 --- a/src/telemetry/database/TelemetryDB.py +++ b/src/telemetry/database/Telemetry_DB.py @@ -14,6 +14,7 @@ import logging import sqlalchemy_utils +from sqlalchemy import inspect from sqlalchemy.orm import sessionmaker from telemetry.database.TelemetryModel import Collector as CollectorModel from telemetry.database.TelemetryEngine import TelemetryEngine @@ -23,7 +24,7 @@ from common.method_wrappers.ServiceExceptions import ( LOGGER = logging.getLogger(__name__) DB_NAME = "tfs_telemetry" -class TelemetryDBmanager: +class TelemetryDB: def __init__(self): self.db_engine = TelemetryEngine.get_engine() if self.db_engine is None: @@ -51,10 +52,9 @@ class TelemetryDBmanager: def verify_tables(self): try: - with self.db_engine.connect() as connection: - result = connection.execute("SHOW TABLES;") - tables = result.fetchall() - LOGGER.info("Tables in DB: {:}".format(tables)) + inspect_object = inspect(self.db_engine) + if(inspect_object.has_table('collector', None)): + LOGGER.info("Table exists in DB: {:}".format(self.db_name)) except Exception as e: LOGGER.info("Unable to fetch Table names. {:s}".format(str(e))) diff --git a/src/telemetry/database/tests/__init__.py b/src/telemetry/database/tests/__init__.py deleted file mode 100644 index 839e45e3b..000000000 --- a/src/telemetry/database/tests/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. \ No newline at end of file diff --git a/src/telemetry/database/tests/telemetryDBtests.py b/src/telemetry/database/tests/telemetryDBtests.py deleted file mode 100644 index 0d2211064..000000000 --- a/src/telemetry/database/tests/telemetryDBtests.py +++ /dev/null @@ -1,86 +0,0 @@ - -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging -from typing import Any -from sqlalchemy.ext.declarative import declarative_base -from telemetry.database.TelemetryDBmanager import TelemetryDBmanager -from telemetry.database.TelemetryEngine import TelemetryEngine -from telemetry.database.tests import temp_DB -from .messages import create_kpi_request, create_collector_request, \ - create_kpi_id_request, create_kpi_filter_request, \ - create_collector_id_request, create_collector_filter_request - -logging.basicConfig(level=logging.INFO) -LOGGER = logging.getLogger(__name__) - - -# def test_temp_DB(): -# temp_DB.main() - -def test_telemetry_object_creation(): - LOGGER.info('--- test_telemetry_object_creation: START') - - LOGGER.info('>>> Creating TelemetryDBmanager Object <<< ') - TelemetryDBmanagerObj = TelemetryDBmanager() - TelemetryEngine.create_database(TelemetryDBmanagerObj.db_engine) # creates 'frontend' db, if it doesnot exists. - - LOGGER.info('>>> Creating database <<< ') - TelemetryDBmanagerObj.create_database() - - LOGGER.info('>>> verifing database <<< ') - TelemetryDBmanagerObj.list_databases() - - # # LOGGER.info('>>> Droping Tables: ') - # # TelemetryDBmanagerObj.drop_table("table_naem_here") - - LOGGER.info('>>> Creating Tables <<< ') - TelemetryDBmanagerObj.create_tables() - - LOGGER.info('>>> Verifing Table creation <<< ') - TelemetryDBmanagerObj.verify_tables() - - # LOGGER.info('>>> TESTING: Row Insertion Operation: kpi Table <<<') - # kpi_obj = create_kpi_request() - # TelemetryDBmanagerObj.inser_kpi(kpi_obj) - - # LOGGER.info('>>> TESTING: Row Insertion Operation: collector Table <<<') - # collector_obj = create_collector_request() - # TelemetryDBmanagerObj.insert_collector(collector_obj) - - # LOGGER.info('>>> TESTING: Get KpiDescriptor <<<') - # kpi_id_obj = create_kpi_id_request() - # TelemetryDBmanagerObj.get_kpi_descriptor(kpi_id_obj) - - # LOGGER.info('>>> TESTING: Select Collector <<<') - # collector_id_obj = create_collector_id_request() - # TelemetryDBmanagerObj.get_collector(collector_id_obj) - - # LOGGER.info('>>> TESTING: Applying kpi filter <<< ') - # kpi_filter : dict[str, Any] = create_kpi_filter_request() - # TelemetryDBmanagerObj.select_kpi_descriptor(**kpi_filter) - - # LOGGER.info('>>> TESTING: Applying collector filter <<<') - # collector_filter : dict[str, Any] = create_collector_filter_request() - # TelemetryDBmanagerObj.select_collector(**collector_filter) - - # LOGGER.info('>>> TESTING: Delete KpiDescriptor ') - # kpi_id_obj = create_kpi_id_request() - # TelemetryDBmanagerObj.delete_kpi_descriptor(kpi_id_obj) - - # LOGGER.info('>>> TESTING: Delete Collector ') - # collector_id_obj = create_collector_id_request() - # TelemetryDBmanagerObj.delete_collector(collector_id_obj) - \ No newline at end of file diff --git a/src/telemetry/database/tests/temp_DB.py b/src/telemetry/database/tests/temp_DB.py deleted file mode 100644 index 089d35424..000000000 --- a/src/telemetry/database/tests/temp_DB.py +++ /dev/null @@ -1,327 +0,0 @@ -from sqlalchemy import create_engine, Column, String, Integer, Text, Float, ForeignKey -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import sessionmaker, relationship -from sqlalchemy.dialects.postgresql import UUID -import logging - -LOGGER = logging.getLogger(__name__) -Base = declarative_base() - -class Kpi(Base): - __tablename__ = 'kpi' - - kpi_id = Column(UUID(as_uuid=False), primary_key=True) - kpi_description = Column(Text) - 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) - - collectors = relationship('Collector', back_populates='kpi') - - def __repr__(self): - return (f"") - -class Collector(Base): - __tablename__ = 'collector' - - collector_id = Column(UUID(as_uuid=False), primary_key=True) - kpi_id = Column(UUID(as_uuid=False), ForeignKey('kpi.kpi_id')) - collector = Column(String) - sampling_duration_s = Column(Float) - sampling_interval_s = Column(Float) - start_timestamp = Column(Float) - end_timestamp = Column(Float) - - kpi = relationship('Kpi', back_populates='collectors') - - def __repr__(self): - return (f"") - -class DatabaseManager: - def __init__(self, db_url, db_name): - self.engine = create_engine(db_url) - self.db_name = db_name - self.Session = sessionmaker(bind=self.engine) - LOGGER.info("DatabaseManager initialized with DB URL: %s and DB Name: %s", db_url, db_name) - - def create_database(self): - try: - with self.engine.connect() as connection: - connection.execute(f"CREATE DATABASE {self.db_name};") - LOGGER.info("Database '%s' created successfully.", self.db_name) - except Exception as e: - LOGGER.error("Error creating database '%s': %s", self.db_name, e) - finally: - LOGGER.info("create_database method execution finished.") - - def create_tables(self): - try: - Base.metadata.create_all(self.engine) - LOGGER.info("Tables created successfully.") - except Exception as e: - LOGGER.error("Error creating tables: %s", e) - finally: - LOGGER.info("create_tables method execution finished.") - - def verify_table_creation(self): - try: - with self.engine.connect() as connection: - result = connection.execute("SHOW TABLES;") - tables = result.fetchall() - LOGGER.info("Tables verified: %s", tables) - return tables - except Exception as e: - LOGGER.error("Error verifying table creation: %s", e) - return [] - finally: - LOGGER.info("verify_table_creation method execution finished.") - - def insert_row_kpi(self, kpi_data): - session = self.Session() - try: - new_kpi = Kpi(**kpi_data) - session.add(new_kpi) - session.commit() - LOGGER.info("Inserted row into KPI table: %s", kpi_data) - except Exception as e: - session.rollback() - LOGGER.error("Error inserting row into KPI table: %s", e) - finally: - session.close() - LOGGER.info("insert_row_kpi method execution finished.") - - def insert_row_collector(self, collector_data): - session = self.Session() - try: - new_collector = Collector(**collector_data) - session.add(new_collector) - session.commit() - LOGGER.info("Inserted row into Collector table: %s", collector_data) - except Exception as e: - session.rollback() - LOGGER.error("Error inserting row into Collector table: %s", e) - finally: - session.close() - LOGGER.info("insert_row_collector method execution finished.") - - def verify_insertion_kpi(self, kpi_id): - session = self.Session() - try: - kpi = session.query(Kpi).filter_by(kpi_id=kpi_id).first() - LOGGER.info("Verified insertion in KPI table for kpi_id: %s, Result: %s", kpi_id, kpi) - return kpi - except Exception as e: - LOGGER.error("Error verifying insertion in KPI table for kpi_id %s: %s", kpi_id, e) - return None - finally: - session.close() - LOGGER.info("verify_insertion_kpi method execution finished.") - - def verify_insertion_collector(self, collector_id): - session = self.Session() - try: - collector = session.query(Collector).filter_by(collector_id=collector_id).first() - LOGGER.info("Verified insertion in Collector table for collector_id: %s, Result: %s", collector_id, collector) - return collector - except Exception as e: - LOGGER.error("Error verifying insertion in Collector table for collector_id %s: %s", collector_id, e) - return None - finally: - session.close() - LOGGER.info("verify_insertion_collector method execution finished.") - - def get_all_kpi_rows(self): - session = self.Session() - try: - kpi_rows = session.query(Kpi).all() - LOGGER.info("Fetched all rows from KPI table: %s", kpi_rows) - return kpi_rows - except Exception as e: - LOGGER.error("Error fetching all rows from KPI table: %s", e) - return [] - finally: - session.close() - LOGGER.info("get_all_kpi_rows method execution finished.") - - def get_all_collector_rows(self): - session = self.Session() - try: - collector_rows = session.query(Collector).all() - LOGGER.info("Fetched all rows from Collector table: %s", collector_rows) - return collector_rows - except Exception as e: - LOGGER.error("Error fetching all rows from Collector table: %s", e) - return [] - finally: - session.close() - LOGGER.info("get_all_collector_rows method execution finished.") - - def get_filtered_kpi_rows(self, **filters): - session = self.Session() - try: - query = session.query(Kpi) - for column, value in filters.items(): - query = query.filter(getattr(Kpi, column) == value) - result = query.all() - LOGGER.info("Fetched filtered rows from KPI table with filters ---------- : {:s}".format(str(result))) - return result - except NoResultFound: - LOGGER.warning("No results found in KPI table with filters %s", filters) - return [] - except Exception as e: - LOGGER.error("Error fetching filtered rows from KPI table with filters %s: %s", filters, e) - return [] - finally: - session.close() - LOGGER.info("get_filtered_kpi_rows method execution finished.") - - def get_filtered_collector_rows(self, **filters): - session = self.Session() - try: - query = session.query(Collector) - for column, value in filters.items(): - query = query.filter(getattr(Collector, column) == value) - result = query.all() - LOGGER.info("Fetched filtered rows from Collector table with filters %s: %s", filters, result) - return result - except NoResultFound: - LOGGER.warning("No results found in Collector table with filters %s", filters) - return [] - except Exception as e: - LOGGER.error("Error fetching filtered rows from Collector table with filters %s: %s", filters, e) - return [] - finally: - session.close() - LOGGER.info("get_filtered_collector_rows method execution finished.") - - def delete_kpi_by_id(self, kpi_id): - session = self.Session() - try: - kpi = session.query(Kpi).filter_by(kpi_id=kpi_id).first() - if kpi: - session.delete(kpi) - session.commit() - LOGGER.info("Deleted KPI with kpi_id: %s", kpi_id) - else: - LOGGER.warning("KPI with kpi_id %s not found", kpi_id) - except SQLAlchemyError as e: - session.rollback() - LOGGER.error("Error deleting KPI with kpi_id %s: %s", kpi_id, e) - finally: - session.close() - LOGGER.info("delete_kpi_by_id method execution finished.") - - def delete_collector_by_id(self, collector_id): - session = self.Session() - try: - collector = session.query(Collector).filter_by(collector_id=collector_id).first() - if collector: - session.delete(collector) - session.commit() - LOGGER.info("Deleted Collector with collector_id: %s", collector_id) - else: - LOGGER.warning("Collector with collector_id %s not found", collector_id) - except SQLAlchemyError as e: - session.rollback() - LOGGER.error("Error deleting Collector with collector_id %s: %s", collector_id, e) - finally: - session.close() - LOGGER.info("delete_collector_by_id method execution finished.") - - -# Example Usage -def main(): - CRDB_SQL_PORT = "26257" - CRDB_DATABASE = "telemetryfrontend" - CRDB_USERNAME = "tfs" - CRDB_PASSWORD = "tfs123" - CRDB_SSLMODE = "require" - CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' - crdb_uri = CRDB_URI_TEMPLATE.format( - CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) - # db_url = "cockroachdb://username:password@localhost:26257/" - # db_name = "yourdatabase" - db_manager = DatabaseManager(crdb_uri, CRDB_DATABASE) - - # Create database - db_manager.create_database() - - # Update db_url to include the new database name - db_manager.engine = create_engine(f"{crdb_uri}") - db_manager.Session = sessionmaker(bind=db_manager.engine) - - # Create tables - db_manager.create_tables() - - # Verify table creation - tables = db_manager.verify_table_creation() - LOGGER.info('Tables in the database: {:s}'.format(str(tables))) - - # Insert a row into the KPI table - kpi_data = { - 'kpi_id': '123e4567-e89b-12d3-a456-426614174100', - 'kpi_description': 'Sample KPI', - 'kpi_sample_type': 1, - 'device_id': 'device_1', - 'endpoint_id': 'endpoint_1', - 'service_id': 'service_1', - 'slice_id': 'slice_1', - 'connection_id': 'conn_1', - 'link_id': 'link_1' - } - db_manager.insert_row_kpi(kpi_data) - - # Insert a row into the Collector table - collector_data = { - 'collector_id': '123e4567-e89b-12d3-a456-426614174101', - 'kpi_id': '123e4567-e89b-12d3-a456-426614174000', - 'collector': 'Collector 1', - 'sampling_duration_s': 60.0, - 'sampling_interval_s': 10.0, - 'start_timestamp': 1625247600.0, - 'end_timestamp': 1625247660.0 - } - db_manager.insert_row_collector(collector_data) - - # Verify insertion into KPI table - kpi = db_manager.verify_insertion_kpi('123e4567-e89b-12d3-a456-426614174000') - print("Inserted KPI:", kpi) - - # Verify insertion into Collector table - collector = db_manager.verify_insertion_collector('123e4567-e89b-12d3-a456-426614174001') - print("Inserted Collector:", collector) - - # Get all rows from KPI table - all_kpi_rows = db_manager.get_all_kpi_rows() - LOGGER.info("All KPI Rows: %s", all_kpi_rows) - - # Get all rows from Collector table - all_collector_rows = db_manager.get_all_collector_rows() - LOGGER.info("All Collector Rows: %s", all_collector_rows) - - # Get filtered rows from KPI table - filtered_kpi_rows = db_manager.get_filtered_kpi_rows(kpi_description='Sample KPI') - LOGGER.info("Filtered KPI Rows: %s", filtered_kpi_rows) - - # Get filtered rows from Collector table - filtered_collector_rows = db_manager.get_filtered_collector_rows(collector='Collector 1') - LOGGER.info("Filtered Collector Rows: %s", filtered_collector_rows) - - # Delete a KPI by kpi_id - kpi_id_to_delete = '123e4567-e89b-12d3-a456-426614174000' - db_manager.delete_kpi_by_id(kpi_id_to_delete) - - # Delete a Collector by collector_id - collector_id_to_delete = '123e4567-e89b-12d3-a456-426614174001' - db_manager.delete_collector_by_id(collector_id_to_delete) diff --git a/src/telemetry/database/tests/messages.py b/src/telemetry/tests/messages.py similarity index 100% rename from src/telemetry/database/tests/messages.py rename to src/telemetry/tests/messages.py diff --git a/src/telemetry/database/tests/managementDBtests.py b/src/telemetry/tests/test_telemetryDB.py similarity index 59% rename from src/telemetry/database/tests/managementDBtests.py rename to src/telemetry/tests/test_telemetryDB.py index 24138abe4..c4976f8c2 100644 --- a/src/telemetry/database/tests/managementDBtests.py +++ b/src/telemetry/tests/test_telemetryDB.py @@ -13,10 +13,16 @@ # limitations under the License. -from telemetry.database.managementDB import managementDB -from telemetry.database.tests.messages import create_collector_model_object +import logging +from telemetry.database.Telemetry_DB import TelemetryDB +LOGGER = logging.getLogger(__name__) -def test_add_row_to_db(): - managementDBobj = managementDB() - managementDBobj.add_row_to_db(create_collector_model_object()) \ No newline at end of file +def test_verify_databases_and_tables(): + LOGGER.info('>>> test_verify_databases_and_tables : START <<< ') + TelemetryDBobj = TelemetryDB() + TelemetryDBobj.drop_database() + TelemetryDBobj.verify_tables() + TelemetryDBobj.create_database() + TelemetryDBobj.create_tables() + TelemetryDBobj.verify_tables() \ No newline at end of file -- GitLab From 614e448337bcf51948bf6475d3c7e4821596b5dd Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 09:45:49 +0000 Subject: [PATCH 494/602] Foreced changes in KpiValueWriter to handle gRPC empty return message. --- src/kpi_value_writer/service/KpiValueWriter.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index 26bab4465..022126fd0 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -33,7 +33,6 @@ from .MetricWriterToPrometheus import MetricWriterToPrometheus LOGGER = logging.getLogger(__name__) ACTIVE_CONSUMERS = [] -METRIC_WRITER = MetricWriterToPrometheus() class KpiValueWriter(GenericGrpcService): def __init__(self, cls_name : str = __name__) -> None: @@ -48,12 +47,14 @@ class KpiValueWriter(GenericGrpcService): @staticmethod def KafkaConsumer(): + kpi_manager_client = KpiManagerClient() + metric_writer = MetricWriterToPrometheus() + kafka_consumer = KafkaConsumer( { 'bootstrap.servers' : KafkaConfig.SERVER_IP.value, 'group.id' : __class__, 'auto.offset.reset' : 'latest'} - ) - kpi_manager_client = KpiManagerClient() + ) kafka_consumer.subscribe([KafkaTopic.VALUE.value]) LOGGER.debug("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) print("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) @@ -72,13 +73,13 @@ class KpiValueWriter(GenericGrpcService): kpi_value.ParseFromString(raw_kpi.value()) LOGGER.info("Received KPI : {:}".format(kpi_value)) print("Received KPI : {:}".format(kpi_value)) - KpiValueWriter.get_kpi_descriptor(kpi_value, kpi_manager_client) + KpiValueWriter.get_kpi_descriptor(kpi_value, kpi_manager_client, metric_writer) except Exception as e: print("Error detail: {:}".format(e)) continue @staticmethod - def get_kpi_descriptor(kpi_value: str, kpi_manager_client ): + def get_kpi_descriptor(kpi_value: str, kpi_manager_client, metric_writer): print("--- START -----") kpi_id = KpiId() @@ -89,12 +90,11 @@ class KpiValueWriter(GenericGrpcService): try: kpi_descriptor_object = KpiDescriptor() kpi_descriptor_object = kpi_manager_client.GetKpiDescriptor(kpi_id) + # TODO: why kpi_descriptor_object recevies a KpiDescriptor type object not Empty type object??? if kpi_descriptor_object.kpi_id.kpi_id.uuid == kpi_id.kpi_id.uuid: - # print("kpi descriptor received: {:}".format(kpi_descriptor_object)) - # if isinstance (kpi_descriptor_object, KpiDescriptor): LOGGER.info("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) print("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) - METRIC_WRITER.create_and_expose_cooked_kpi(kpi_descriptor_object, kpi_value) + metric_writer.create_and_expose_cooked_kpi(kpi_descriptor_object, kpi_value) else: LOGGER.info("No KPI Descriptor found in DB for Kpi ID: {:}".format(kpi_id)) print("No KPI Descriptor found in DB for Kpi ID: {:}".format(kpi_id)) -- GitLab From a66af97b0404aa5815f3cda0bf1d8cf9240018ae Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 09:55:51 +0000 Subject: [PATCH 495/602] updated imports to resolve error generated by unit test. - Imports are updated in test_kpi_value_writer.py --- src/kpi_value_writer/tests/test_kpi_value_writer.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/kpi_value_writer/tests/test_kpi_value_writer.py b/src/kpi_value_writer/tests/test_kpi_value_writer.py index 572495d48..40593af97 100755 --- a/src/kpi_value_writer/tests/test_kpi_value_writer.py +++ b/src/kpi_value_writer/tests/test_kpi_value_writer.py @@ -14,11 +14,12 @@ import logging from kpi_value_writer.service.KpiValueWriter import KpiValueWriter +from kpi_value_writer.tests.test_messages import create_kpi_id_request, create_kpi_descriptor_request + from common.tools.kafka.Variables import KafkaTopic -from kpi_manager.client.KpiManagerClient import KpiManagerClient -from kpi_manager.tests.test_messages import create_kpi_descriptor_request from common.proto.kpi_manager_pb2 import KpiDescriptor -from kpi_value_writer.tests.test_messages import create_kpi_id_request +from kpi_manager.client.KpiManagerClient import KpiManagerClient + LOGGER = logging.getLogger(__name__) -- GitLab From befae34c31d9394884ad6858db8ef11e6f934dbd Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 14:14:18 +0000 Subject: [PATCH 496/602] Kafka deployment script is integrated with TFS deplyment script. - Kafka env variables are created in my_deply.sh, kafka.sh and all.sh --- deploy/all.sh | 3 ++ deploy/kafka.sh | 83 ++++++++++++++++++++++++++++++------------------- deploy/tfs.sh | 20 +++++++++++- 3 files changed, 73 insertions(+), 33 deletions(-) diff --git a/deploy/all.sh b/deploy/all.sh index f93cd92ac..e9b33b469 100755 --- a/deploy/all.sh +++ b/deploy/all.sh @@ -215,6 +215,9 @@ export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"} # Deploy QuestDB ./deploy/qdb.sh +# Deploy Apache Kafka +./deploy/kafka.sh + # Expose Dashboard ./deploy/expose_dashboard.sh diff --git a/deploy/kafka.sh b/deploy/kafka.sh index 4a91bfc9e..b2f2f1f9e 100755 --- a/deploy/kafka.sh +++ b/deploy/kafka.sh @@ -20,50 +20,69 @@ # If not already set, set the namespace where Apache Kafka will be deployed. export KFK_NAMESPACE=${KFK_NAMESPACE:-"kafka"} +# If not already set, set the port Apache Kafka server will be exposed to. +export KFK_SERVER_PORT=${KFK_SERVER_PORT:-"9092"} + +# If not already set, if flag is YES, Apache Kafka will be redeployed and all topics will be lost. +export KFK_REDEPLOY=${KFK_REDEPLOY:-""} + ######################################################################################################################## # Automated steps start here ######################################################################################################################## -# Constants -TMP_FOLDER="./tmp" -KFK_MANIFESTS_PATH="manifests/kafka" -KFK_ZOOKEEPER_MANIFEST="01-zookeeper.yaml" -KFK_MANIFEST="02-kafka.yaml" + # Constants + TMP_FOLDER="./tmp" + KFK_MANIFESTS_PATH="manifests/kafka" + KFK_ZOOKEEPER_MANIFEST="01-zookeeper.yaml" + KFK_MANIFEST="02-kafka.yaml" + + # Create a tmp folder for files modified during the deployment + TMP_MANIFESTS_FOLDER="${TMP_FOLDER}/${KFK_NAMESPACE}/manifests" + mkdir -p ${TMP_MANIFESTS_FOLDER} -# Create a tmp folder for files modified during the deployment -TMP_MANIFESTS_FOLDER="${TMP_FOLDER}/${KFK_NAMESPACE}/manifests" -mkdir -p ${TMP_MANIFESTS_FOLDER} +function kafka_deploy() { + # copy zookeeper and kafka manifest files to temporary manifest location + cp "${KFK_MANIFESTS_PATH}/${KFK_ZOOKEEPER_MANIFEST}" "${TMP_MANIFESTS_FOLDER}/${KFK_ZOOKEEPER_MANIFEST}" + cp "${KFK_MANIFESTS_PATH}/${KFK_MANIFEST}" "${TMP_MANIFESTS_FOLDER}/${KFK_MANIFEST}" -# copy zookeeper and kafka manifest files to temporary manifest location -cp "${KFK_MANIFESTS_PATH}/${KFK_ZOOKEEPER_MANIFEST}" "${TMP_MANIFESTS_FOLDER}/${KFK_ZOOKEEPER_MANIFEST}" -cp "${KFK_MANIFESTS_PATH}/${KFK_MANIFEST}" "${TMP_MANIFESTS_FOLDER}/${KFK_MANIFEST}" + # echo "Apache Kafka Namespace" + echo ">>> Delete Apache Kafka Namespace" + kubectl delete namespace ${KFK_NAMESPACE} --ignore-not-found -echo "Apache Kafka Namespace" -echo ">>> Delete Apache Kafka Namespace" -kubectl delete namespace ${KFK_NAMESPACE} --ignore-not-found + echo ">>> Create Apache Kafka Namespace" + kubectl create namespace ${KFK_NAMESPACE} -echo ">>> Create Apache Kafka Namespace" -kubectl create namespace ${KFK_NAMESPACE} + # echo ">>> Deplying Apache Kafka Zookeeper" + # Kafka zookeeper service should be deployed before the kafka service + kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/${KFK_ZOOKEEPER_MANIFEST}" -echo ">>> Deplying Apache Kafka Zookeeper" -# Kafka zookeeper service should be deployed before the kafka service -kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/${KFK_ZOOKEEPER_MANIFEST}" + KFK_ZOOKEEPER_SERVICE="zookeeper-service" # this command may be replaced with command to extract service name automatically + KFK_ZOOKEEPER_IP=$(kubectl --namespace ${KFK_NAMESPACE} get service ${KFK_ZOOKEEPER_SERVICE} -o 'jsonpath={.spec.clusterIP}') -KFK_ZOOKEEPER_SERVICE="zookeeper-service" # this command may be replaced with command to extract service name automatically -KFK_ZOOKEEPER_IP=$(kubectl --namespace ${KFK_NAMESPACE} get service ${KFK_ZOOKEEPER_SERVICE} -o 'jsonpath={.spec.clusterIP}') + # Kafka service should be deployed after the zookeeper service + sed -i "s//${KFK_ZOOKEEPER_IP}/" "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST" -# Kafka service should be deployed after the zookeeper service -sed -i "s//${KFK_ZOOKEEPER_IP}/" "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST" + # echo ">>> Deploying Apache Kafka Broker" + kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST" -echo ">>> Deploying Apache Kafka Broker" -kubectl --namespace ${KFK_NAMESPACE} apply -f "${TMP_MANIFESTS_FOLDER}/$KFK_MANIFEST" + # echo ">>> Verifing Apache Kafka deployment" + sleep 5 + # KFK_PODS_STATUS=$(kubectl --namespace ${KFK_NAMESPACE} get pods) + # if echo "$KFK_PODS_STATUS" | grep -qEv 'STATUS|Running'; then + # echo "Deployment Error: \n $KFK_PODS_STATUS" + # else + # echo "$KFK_PODS_STATUS" + # fi +} -echo ">>> Verifing Apache Kafka deployment" -sleep 10 -KFK_PODS_STATUS=$(kubectl --namespace ${KFK_NAMESPACE} get pods) -if echo "$KFK_PODS_STATUS" | grep -qEv 'STATUS|Running'; then - echo "Deployment Error: \n $KFK_PODS_STATUS" +echo "Apache Kafka" +echo ">>> Checking if Apache Kafka is deployed ... " +if [ "$KFK_REDEPLOY" == "YES" ]; then + kafka_deploy +elif kubectl get --namespace ${KFK_NAMESPACE} deployments.apps &> /dev/null; then + echo ">>> Apache Kafka already present; skipping step..." else - echo "$KFK_PODS_STATUS" -fi \ No newline at end of file + kafka_deploy +fi +echo diff --git a/deploy/tfs.sh b/deploy/tfs.sh index 62f36a2c1..d92d789e3 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -115,6 +115,17 @@ export PROM_EXT_PORT_HTTP=${PROM_EXT_PORT_HTTP:-"9090"} export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"} +# ----- Apache Kafka ------------------------------------------------------ + +# If not already set, set the namespace where Apache Kafka will be deployed. +export KFK_NAMESPACE=${KFK_NAMESPACE:-"kafka"} + +# If not already set, set the port Apache Kafka server will be exposed to. +export KFK_SERVER_PORT=${KFK_SERVER_PORT:-"9092"} + +# If not already set, if flag is YES, Apache Kafka will be redeployed and topic will be lost. +export KFK_REDEPLOY=${KFK_REDEPLOY:-""} + ######################################################################################################################## # Automated steps start here ######################################################################################################################## @@ -147,7 +158,7 @@ kubectl create secret generic crdb-data --namespace ${TFS_K8S_NAMESPACE} --type= --from-literal=CRDB_SSLMODE=require printf "\n" -echo "Create secret with CockroachDB data for KPI Management" +echo "Create secret with CockroachDB data for KPI Management microservices" CRDB_SQL_PORT=$(kubectl --namespace ${CRDB_NAMESPACE} get service cockroachdb-public -o 'jsonpath={.spec.ports[?(@.name=="sql")].port}') CRDB_DATABASE_KPI_MGMT="tfs_kpi_mgmt" # TODO: change by specific configurable environment variable kubectl create secret generic crdb-kpi-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ @@ -159,6 +170,13 @@ kubectl create secret generic crdb-kpi-data --namespace ${TFS_K8S_NAMESPACE} --t --from-literal=CRDB_SSLMODE=require printf "\n" +echo "Create secret with Apache Kafka kfk-kpi-data for KPI and Telemetry microservices" +KFK_SERVER_PORT=$(kubectl --namespace ${KFK_NAMESPACE} get service kafka-service -o 'jsonpath={.spec.ports[0].port}') +kubectl create secret generic kfk-kpi-data --namespace ${KFK_NAMESPACE} --type='Opaque' \ + --from-literal=KFK_NAMESPACE=${KFK_NAMESPACE} \ + --from-literal=KFK_SERVER_PORT=${KFK_NAMESPACE} +printf "\n" + echo "Create secret with NATS data" NATS_CLIENT_PORT=$(kubectl --namespace ${NATS_NAMESPACE} get service ${NATS_NAMESPACE} -o 'jsonpath={.spec.ports[?(@.name=="client")].port}') if [ -z "$NATS_CLIENT_PORT" ]; then -- GitLab From bde43f260a7c7abdc658bc77755cb4c78633d9a4 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 14:43:57 +0000 Subject: [PATCH 497/602] Kafka secret added to kpi_value_api/kpi_value_writer - improvements to accuratly read the env variables --- deploy/kafka.sh | 2 +- deploy/tfs.sh | 4 ++-- manifests/kpi_value_apiservice.yaml | 3 +++ manifests/kpi_value_writerservice.yaml | 3 +++ 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/deploy/kafka.sh b/deploy/kafka.sh index b2f2f1f9e..21ba89408 100755 --- a/deploy/kafka.sh +++ b/deploy/kafka.sh @@ -81,7 +81,7 @@ echo ">>> Checking if Apache Kafka is deployed ... " if [ "$KFK_REDEPLOY" == "YES" ]; then kafka_deploy elif kubectl get --namespace ${KFK_NAMESPACE} deployments.apps &> /dev/null; then - echo ">>> Apache Kafka already present; skipping step..." + echo ">>> Apache Kafka already present; skipping step." else kafka_deploy fi diff --git a/deploy/tfs.sh b/deploy/tfs.sh index d92d789e3..4ecfaae99 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -172,9 +172,9 @@ printf "\n" echo "Create secret with Apache Kafka kfk-kpi-data for KPI and Telemetry microservices" KFK_SERVER_PORT=$(kubectl --namespace ${KFK_NAMESPACE} get service kafka-service -o 'jsonpath={.spec.ports[0].port}') -kubectl create secret generic kfk-kpi-data --namespace ${KFK_NAMESPACE} --type='Opaque' \ +kubectl create secret generic kfk-kpi-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ --from-literal=KFK_NAMESPACE=${KFK_NAMESPACE} \ - --from-literal=KFK_SERVER_PORT=${KFK_NAMESPACE} + --from-literal=KFK_SERVER_PORT=${KFK_SERVER_PORT} printf "\n" echo "Create secret with NATS data" diff --git a/manifests/kpi_value_apiservice.yaml b/manifests/kpi_value_apiservice.yaml index 74eb90f67..e4dcb0054 100644 --- a/manifests/kpi_value_apiservice.yaml +++ b/manifests/kpi_value_apiservice.yaml @@ -39,6 +39,9 @@ spec: env: - name: LOG_LEVEL value: "INFO" + envFrom: + - secretRef: + name: kfk-kpi-data readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:30020"] diff --git a/manifests/kpi_value_writerservice.yaml b/manifests/kpi_value_writerservice.yaml index 8a8e44ec2..e21e36f48 100644 --- a/manifests/kpi_value_writerservice.yaml +++ b/manifests/kpi_value_writerservice.yaml @@ -39,6 +39,9 @@ spec: env: - name: LOG_LEVEL value: "INFO" + envFrom: + - secretRef: + name: kfk-kpi-data readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:30030"] -- GitLab From 5f8f4d5ec041bf8f1221881448eb5724743b252b Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 14:49:57 +0000 Subject: [PATCH 498/602] dynamically creates the kafka server address with env variables. - get the values of KAFKA_NAMESPACE and KFK_SERVER_PORT to create KAFKA server address. --- src/common/tools/kafka/Variables.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 24ae2cff7..89ac42f90 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -16,14 +16,18 @@ import logging from enum import Enum from confluent_kafka import KafkaException from confluent_kafka.admin import AdminClient, NewTopic +from common.Settings import get_setting LOGGER = logging.getLogger(__name__) +KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' class KafkaConfig(Enum): + KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = get_setting('KFK_SERVER_PORT') # SERVER_IP = "127.0.0.1:9092" - SERVER_IP = "kafka-service.kafka.svc.cluster.local:9092" - ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_IP}) + server_address = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) + ADMIN_CLIENT = AdminClient({'bootstrap.servers': server_address}) class KafkaTopic(Enum): REQUEST = 'topic_request' -- GitLab From daadb074bb3f003450d9a3a4de5cfe5ba2eed86b Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 30 Jul 2024 15:14:40 +0000 Subject: [PATCH 499/602] Some improvements to Kpi Manager test and messages file. - comment is added in Kpi DB file for future reference. --- src/kpi_manager/database/Kpi_DB.py | 3 +- src/kpi_manager/tests/test_kpi_db.py | 4 +- src/kpi_manager/tests/test_kpi_manager.py | 148 +++++----------------- 3 files changed, 34 insertions(+), 121 deletions(-) diff --git a/src/kpi_manager/database/Kpi_DB.py b/src/kpi_manager/database/Kpi_DB.py index 4b6064070..530abe457 100644 --- a/src/kpi_manager/database/Kpi_DB.py +++ b/src/kpi_manager/database/Kpi_DB.py @@ -34,14 +34,15 @@ class KpiDB: def create_database(self) -> None: if not sqlalchemy_utils.database_exists(self.db_engine.url): - LOGGER.debug("Database created. {:}".format(self.db_engine.url)) sqlalchemy_utils.create_database(self.db_engine.url) + LOGGER.debug("Database created. {:}".format(self.db_engine.url)) def drop_database(self) -> None: if sqlalchemy_utils.database_exists(self.db_engine.url): sqlalchemy_utils.drop_database(self.db_engine.url) def create_tables(self): + # TODO: use "get_tables(declatrative class obj)" method of "sqlalchemy_utils" to verify tables. try: KpiModel.metadata.create_all(self.db_engine) # type: ignore LOGGER.debug("Tables created in the DB Name: {:}".format(self.db_name)) diff --git a/src/kpi_manager/tests/test_kpi_db.py b/src/kpi_manager/tests/test_kpi_db.py index e961c12ba..d4a57f836 100644 --- a/src/kpi_manager/tests/test_kpi_db.py +++ b/src/kpi_manager/tests/test_kpi_db.py @@ -21,8 +21,8 @@ LOGGER = logging.getLogger(__name__) def test_verify_databases_and_Tables(): LOGGER.info('>>> test_verify_Tables : START <<< ') kpiDBobj = KpiDB() - kpiDBobj.drop_database() - kpiDBobj.verify_tables() + # kpiDBobj.drop_database() + # kpiDBobj.verify_tables() kpiDBobj.create_database() kpiDBobj.create_tables() kpiDBobj.verify_tables() diff --git a/src/kpi_manager/tests/test_kpi_manager.py b/src/kpi_manager/tests/test_kpi_manager.py index f0d9526d3..da149e3fe 100755 --- a/src/kpi_manager/tests/test_kpi_manager.py +++ b/src/kpi_manager/tests/test_kpi_manager.py @@ -17,7 +17,7 @@ import os, pytest import logging from typing import Union -#from common.proto.context_pb2 import Empty +from common.proto.context_pb2 import Empty from common.Constants import ServiceNameEnum from common.Settings import ( ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_service_port_grpc) @@ -26,12 +26,6 @@ from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList from common.tools.service.GenericGrpcService import GenericGrpcService -#from context.client.ContextClient import ContextClient - -# from device.service.driver_api.DriverFactory import DriverFactory -# 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_filter_request, create_kpi_descriptor_request_a from kpi_manager.service.KpiManagerService import KpiManagerService @@ -39,12 +33,6 @@ from kpi_manager.client.KpiManagerClient import KpiManagerClient from kpi_manager.tests.test_messages import create_kpi_descriptor_request from kpi_manager.tests.test_messages import create_kpi_id_request - -#from monitoring.service.NameMapping import NameMapping - -#os.environ['DEVICE_EMULATED_ONLY'] = 'TRUE' -#from device.service.drivers import DRIVERS - ########################### # Tests Setup ########################### @@ -55,8 +43,6 @@ KPIMANAGER_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.KPIMANAGER) # t os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) os.environ[get_env_var_name(ServiceNameEnum.KPIMANAGER, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(KPIMANAGER_SERVICE_PORT) -# METRICSDB_HOSTNAME = os.environ.get('METRICSDB_HOSTNAME'){} - LOGGER = logging.getLogger(__name__) class MockContextService(GenericGrpcService): @@ -70,84 +56,10 @@ class MockContextService(GenericGrpcService): self.context_servicer = MockServicerImpl_Context() add_ContextServiceServicer_to_server(self.context_servicer, self.server) -# @pytest.fixture(scope='session') -# def context_service(): -# LOGGER.info('Initializing MockContextService...') -# _service = MockContextService(MOCKSERVICE_PORT) -# _service.start() - -# LOGGER.info('Yielding MockContextService...') -# yield _service - -# LOGGER.info('Terminating MockContextService...') -# _service.context_servicer.msg_broker.terminate() -# _service.stop() - -# LOGGER.info('Terminated MockContextService...') - -# @pytest.fixture(scope='session') -# def context_client(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument -# LOGGER.info('Initializing ContextClient...') -# _client = ContextClient() - -# LOGGER.info('Yielding ContextClient...') -# yield _client - -# LOGGER.info('Closing ContextClient...') -# _client.close() - -# LOGGER.info('Closed ContextClient...') - -# @pytest.fixture(scope='session') -# def device_service(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument -# LOGGER.info('Initializing DeviceService...') -# driver_factory = DriverFactory(DRIVERS) -# driver_instance_cache = DriverInstanceCache(driver_factory) -# _service = DeviceService(driver_instance_cache) -# _service.start() - -# # yield the server, when test finishes, execution will resume to stop it -# LOGGER.info('Yielding DeviceService...') -# yield _service - -# LOGGER.info('Terminating DeviceService...') -# _service.stop() - -# LOGGER.info('Terminated DeviceService...') - -# @pytest.fixture(scope='session') -# def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument -# LOGGER.info('Initializing DeviceClient...') -# _client = DeviceClient() - -# LOGGER.info('Yielding DeviceClient...') -# yield _client - -# LOGGER.info('Closing DeviceClient...') -# _client.close() - -# LOGGER.info('Closed DeviceClient...') - -# @pytest.fixture(scope='session') -# def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument -# LOGGER.info('Initializing DeviceClient...') -# _client = DeviceClient() - -# LOGGER.info('Yielding DeviceClient...') -# yield _client - -# LOGGER.info('Closing DeviceClient...') -# _client.close() - -# LOGGER.info('Closed DeviceClient...') - # This fixture will be requested by test cases and last during testing session @pytest.fixture(scope='session') def kpi_manager_service(): LOGGER.info('Initializing KpiManagerService...') - #name_mapping = NameMapping() - # _service = MonitoringService(name_mapping) - # _service = KpiManagerService(name_mapping) _service = KpiManagerService() _service.start() @@ -194,22 +106,22 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab ########################### # ---------- 3rd Iteration Tests ---------------- -# def test_SetKpiDescriptor(kpi_manager_client): -# LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ") -# response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) -# LOGGER.info("Response gRPC message object: {:}".format(response)) -# assert isinstance(response, KpiId) +def test_SetKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ") + 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_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) -# # deleting KPI -# del_response = kpi_manager_client.DeleteKpiDescriptor(response_id) -# # select KPI -# kpi_manager_client.GetKpiDescriptor(response_id) -# LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response)) -# assert isinstance(del_response, Empty) +def test_DeleteKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ") + # adding KPI + response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + # deleting KPI + del_response = kpi_manager_client.DeleteKpiDescriptor(response_id) + # select KPI + kpi_manager_client.GetKpiDescriptor(response_id) + LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response)) + assert isinstance(del_response, Empty) def test_GetKpiDescriptor(kpi_manager_client): LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") @@ -225,21 +137,21 @@ def test_GetKpiDescriptor(kpi_manager_client): assert isinstance(response, KpiDescriptor) -# def test_SelectKpiDescriptor(kpi_manager_client): -# LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ") -# # adding KPI -# kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) -# # select KPI(s) -# response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request()) -# LOGGER.info("Response gRPC message object: {:}".format(response)) -# assert isinstance(response, KpiDescriptorList) +def test_SelectKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ") + # adding KPI + kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + # select KPI(s) + response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request()) + LOGGER.info("Response gRPC message object: {:}".format(response)) + assert isinstance(response, KpiDescriptorList) -# def test_set_list_of_KPIs(kpi_manager_client): -# LOGGER.debug(" >>> test_set_list_of_KPIs: START <<< ") -# KPIs_TO_SEARCH = ["node_in_power_total", "node_in_current_total", "node_out_power_total"] -# # adding KPI -# for kpi in KPIs_TO_SEARCH: -# kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a(kpi)) +def test_set_list_of_KPIs(kpi_manager_client): + LOGGER.debug(" >>> test_set_list_of_KPIs: START <<< ") + KPIs_TO_SEARCH = ["node_in_power_total", "node_in_current_total", "node_out_power_total"] + # adding KPI + for kpi in KPIs_TO_SEARCH: + kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a(kpi)) # ---------- 2nd Iteration Tests ----------------- -- GitLab From e418d0861f191593de51b1f79475d5fae900cd65 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 31 Jul 2024 12:30:39 +0000 Subject: [PATCH 500/602] Changes to resolve Kafka server error - KFK_SERVER_ADDRESS_TEMPLATE now defined inside the class KafkaConfig. - variable renamed to "SERVER_ADDRESS" from "server_address" --- src/common/tools/kafka/Variables.py | 13 +++++++------ .../service/KpiValueApiServiceServicerImpl.py | 2 +- src/kpi_value_writer/service/KpiValueWriter.py | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 89ac42f90..9abc32b3e 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -20,14 +20,14 @@ from common.Settings import get_setting LOGGER = logging.getLogger(__name__) -KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' class KafkaConfig(Enum): - KFK_NAMESPACE = get_setting('KFK_NAMESPACE') - KFK_PORT = get_setting('KFK_SERVER_PORT') - # SERVER_IP = "127.0.0.1:9092" - server_address = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) - ADMIN_CLIENT = AdminClient({'bootstrap.servers': server_address}) + KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' + KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = get_setting('KFK_SERVER_PORT') + # SERVER_ADDRESS = "127.0.0.1:9092" + SERVER_ADDRESS = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) + ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) class KafkaTopic(Enum): REQUEST = 'topic_request' @@ -42,6 +42,7 @@ class KafkaTopic(Enum): Method to create Kafka topics defined as class members """ all_topics = [member.value for member in KafkaTopic] + LOGGER.debug("Kafka server address is: {:} ".format(KafkaConfig.SERVER_ADDRESS.value)) if( KafkaTopic.create_new_topic_if_not_exists( all_topics )): LOGGER.debug("All topics are created sucsessfully") return True diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index d27de54f3..1559457d7 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -38,7 +38,7 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): ) -> Empty: LOGGER.debug('StoreKpiValues: Received gRPC message object: {:}'.format(request)) producer_obj = KafkaProducer({ - 'bootstrap.servers' : KafkaConfig.SERVER_IP.value + 'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value }) for kpi_value in request.kpi_value_list: kpi_value_to_produce : Tuple [str, Any, Any] = ( diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index 022126fd0..5e2b6babe 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -51,10 +51,10 @@ class KpiValueWriter(GenericGrpcService): metric_writer = MetricWriterToPrometheus() kafka_consumer = KafkaConsumer( - { 'bootstrap.servers' : KafkaConfig.SERVER_IP.value, + { 'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value, 'group.id' : __class__, 'auto.offset.reset' : 'latest'} - ) + ) kafka_consumer.subscribe([KafkaTopic.VALUE.value]) LOGGER.debug("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) print("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) -- GitLab From 4dad45318c5640b6496918e06fc16ae8f4d4e8e5 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 1 Aug 2024 12:53:52 +0000 Subject: [PATCH 501/602] changes to manage Kafka enviornment variable efficiently - KFK_SERVER_PORT and KFK_REDOPLY added into my_deploy.sh file. - refines kafka env variables import --- my_deploy.sh | 5 +++++ src/common/tools/kafka/Variables.py | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/my_deploy.sh b/my_deploy.sh index b89df7481..45e0d1301 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -181,3 +181,8 @@ export GRAF_EXT_PORT_HTTP="3000" # Set the namespace where Apache Kafka will be deployed. export KFK_NAMESPACE="kafka" +# Set the port Apache Kafka server will be exposed to. +export KFK_SERVER_PORT="9092" + +# Set the flag to YES for redeploying of Apache Kafka +export KFK_REDEPLOY="" diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 9abc32b3e..e3ee2016a 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -23,11 +23,11 @@ LOGGER = logging.getLogger(__name__) class KafkaConfig(Enum): KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' - KFK_NAMESPACE = get_setting('KFK_NAMESPACE') - KFK_PORT = get_setting('KFK_SERVER_PORT') - # SERVER_ADDRESS = "127.0.0.1:9092" + KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = get_setting('KFK_SERVER_PORT') + # SERVER_ADDRESS = "127.0.0.1:9092" SERVER_ADDRESS = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) - ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) + ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) class KafkaTopic(Enum): REQUEST = 'topic_request' -- GitLab From 72c6e0e28edb051bdb34b0caa52f5a0eef86b683 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 09:41:59 +0000 Subject: [PATCH 502/602] Improvement in SelectKpiValues method. - Added "GetKpiSampleType" method to extract KpiSampleType based on KpiId. - Added PromtheusConnect method to query Prometheus from prometheus_api_client library. - KpiManagerClient added in DockerFile - prometheus_api_client added in requirement file. --- src/kpi_value_api/Dockerfile | 2 + src/kpi_value_api/requirements.in | 1 + .../service/KpiValueApiServiceServicerImpl.py | 93 ++++++++++++------- .../service/MetricWriterToPrometheus.py | 2 +- 4 files changed, 66 insertions(+), 32 deletions(-) diff --git a/src/kpi_value_api/Dockerfile b/src/kpi_value_api/Dockerfile index 7dd8d307b..25b8da931 100644 --- a/src/kpi_value_api/Dockerfile +++ b/src/kpi_value_api/Dockerfile @@ -63,6 +63,8 @@ RUN python3 -m pip install -r requirements.txt # Add component files into working directory WORKDIR /var/teraflow COPY src/kpi_value_api/. kpi_value_api/ +COPY src/kpi_manager/__init__.py kpi_manager/__init__.py +COPY src/kpi_manager/client/. kpi_manager/client/ # Start the service ENTRYPOINT ["python", "-m", "kpi_value_api.service"] diff --git a/src/kpi_value_api/requirements.in b/src/kpi_value_api/requirements.in index 7e4694109..f5695906a 100644 --- a/src/kpi_value_api/requirements.in +++ b/src/kpi_value_api/requirements.in @@ -14,3 +14,4 @@ confluent-kafka==2.3.* requests==2.27.* +prometheus-api-client==0.5.3 \ No newline at end of file diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index 1559457d7..b2ebecad0 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -12,18 +12,23 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, grpc, requests +import logging, grpc from typing import Tuple, Any -from datetime import datetime from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from common.proto.context_pb2 import Empty +from common.proto.kpi_sample_types_pb2 import KpiSampleType +from common.proto.kpi_manager_pb2 import KpiDescriptor, KpiId from common.proto.kpi_value_api_pb2_grpc import KpiValueAPIServiceServicer from common.proto.kpi_value_api_pb2 import KpiValueList, KpiValueFilter, KpiValue, KpiValueType from confluent_kafka import Producer as KafkaProducer +from prometheus_api_client import PrometheusConnect +from prometheus_api_client.utils import parse_datetime + +from kpi_manager.client.KpiManagerClient import KpiManagerClient LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('KpiValueAPI', 'NBIgRPC') @@ -63,40 +68,67 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): ) -> KpiValueList: LOGGER.debug('StoreKpiValues: Received gRPC message object: {:}'.format(request)) response = KpiValueList() - metrics = [kpi.kpi_id for kpi in request.kpi_id] - start_timestamps = [timestamp for timestamp in request.start_timestamp] - end_timestamps = [timestamp for timestamp in request.end_timestamp] - results = [] + + kpi_manager_client = KpiManagerClient() + prom_connect = PrometheusConnect(url=PROM_URL) - for start, end in zip(start_timestamps, end_timestamps): - start_str = datetime.fromtimestamp(start.seconds).isoformat() + "Z" - end_str = datetime.fromtimestamp(end.seconds).isoformat() + "Z" + metrics = [self.GetKpiSampleType(kpi, kpi_manager_client) for kpi in request.kpi_id] + start_timestamps = [parse_datetime(timestamp) for timestamp in request.start_timestamp] + end_timestamps = [parse_datetime(timestamp) for timestamp in request.end_timestamp] + prom_response = [] + for start_time, end_time in zip(start_timestamps, end_timestamps): for metric in metrics: - url = f'{PROM_URL}/api/v1/query_range' - params = { - 'query': metric, - 'start': start_str, - 'end' : end_str, - 'step' : '30s' # or any other step you need - } - response = requests.get(url, params=params) - if response.status_code == 200: - data = response.json() - for result in data['data']['result']: - for value in result['values']: - kpi_value = KpiValue( - kpi_id=metric, - timestamp=str(seconds=value[0]), - kpi_value_type=self._convert_value_to_kpi_value_type(value[1]) - ) - results.append(kpi_value) + # print(start_time, end_time, metric) + prom_response.append( + prom_connect.custom_query_range( + query = metric, # this is the metric name and label config + start_time = start_time, + end_time = end_time, + step = 30, # or any other step value (missing in gRPC Filter request) + ) + ) + + for single_resposne in prom_response: + # print ("{:}".format(single_resposne)) + for record in single_resposne: + # print("Record >>> kpi: {:} >>> time & values set: {:}".format(record['metric']['__name__'], record['values'])) + for value in record['values']: + # print("{:} - {:}".format(record['metric']['__name__'], value)) + kpi_value = KpiValue() + kpi_value.kpi_id.kpi_id = record['metric']['__name__'], + kpi_value.timestamp = value[0], + kpi_value.kpi_value_type = self.ConverValueToKpiValueType(value[1]) + response.kpi_value_list.append(kpi_value) + return response + + def GetKpiSampleType(self, kpi_value: str, kpi_manager_client): + print("--- START -----") - def _convert_value_to_kpi_value_type(self, value): + kpi_id = KpiId() + kpi_id.kpi_id.uuid = kpi_value.kpi_id.kpi_id.uuid + # print("KpiId generated: {:}".format(kpi_id)) + + try: + kpi_descriptor_object = KpiDescriptor() + kpi_descriptor_object = kpi_manager_client.GetKpiDescriptor(kpi_id) + # TODO: why kpi_descriptor_object recevies a KpiDescriptor type object not Empty type object??? + if kpi_descriptor_object.kpi_id.kpi_id.uuid == kpi_id.kpi_id.uuid: + LOGGER.info("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) + print("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object)) + return KpiSampleType.Name(kpi_descriptor_object.kpi_sample_type) # extract and return the name of KpiSampleType + else: + LOGGER.info("No KPI Descriptor found in DB for Kpi ID: {:}".format(kpi_id)) + print("No KPI Descriptor found in DB for Kpi ID: {:}".format(kpi_id)) + except Exception as e: + LOGGER.info("Unable to get KpiDescriptor. Error: {:}".format(e)) + print ("Unable to get KpiDescriptor. Error: {:}".format(e)) + + def ConverValueToKpiValueType(self, value): # Check if the value is an integer (int64) try: - int64_value = int(value) - return KpiValueType(int64Val=int64_value) + int_value = int(value) + return KpiValueType(int64Val=int_value) except ValueError: pass # Check if the value is a float @@ -112,7 +144,6 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): # If none of the above, treat it as a string return KpiValueType(stringVal=value) - def delivery_callback(self, err, msg): if err: LOGGER.debug('Message delivery failed: {:}'.format(err)) else: LOGGER.debug('Message delivered to topic {:}'.format(msg.topic())) diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py index b68116478..40bffa06e 100644 --- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py +++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py @@ -93,4 +93,4 @@ class MetricWriterToPrometheus: print("Metric {:} is already registered. Skipping.".format(metric_name)) else: LOGGER.error("Error while pushing metric: {}".format(e)) - raise \ No newline at end of file + raise -- GitLab From 8c5c12866f06410d765516981e5cfb4fb3c49063 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 09:58:58 +0000 Subject: [PATCH 503/602] Temporarly defines the static value of env variables to test the working of microservice. - KFK_NAMESPACE and KFK_PORT --- src/common/tools/kafka/Variables.py | 6 ++++-- src/kpi_value_writer/service/MetricWriterToPrometheus.py | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index e3ee2016a..168957a26 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -23,8 +23,10 @@ LOGGER = logging.getLogger(__name__) class KafkaConfig(Enum): KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' - KFK_NAMESPACE = get_setting('KFK_NAMESPACE') - KFK_PORT = get_setting('KFK_SERVER_PORT') + KFK_NAMESPACE = 'kafka' + # KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = '9092' + # KFK_PORT = get_setting('KFK_SERVER_PORT') # SERVER_ADDRESS = "127.0.0.1:9092" SERVER_ADDRESS = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py index 40bffa06e..81324b759 100644 --- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py +++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py @@ -94,3 +94,4 @@ class MetricWriterToPrometheus: else: LOGGER.error("Error while pushing metric: {}".format(e)) raise + -- GitLab From 05978993285c076c603dc7c8876e0a65557dbb74 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 10:04:31 +0000 Subject: [PATCH 504/602] minor changes in code. - refine Kpi_DB.py methods. - improve description of messages. - imporve the text description. --- src/kpi_manager/database/Kpi_DB.py | 4 +--- src/kpi_value_api/tests/messages.py | 5 +++-- src/kpi_value_writer/service/MetricWriterToPrometheus.py | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/kpi_manager/database/Kpi_DB.py b/src/kpi_manager/database/Kpi_DB.py index 530abe457..49ad9c9b5 100644 --- a/src/kpi_manager/database/Kpi_DB.py +++ b/src/kpi_manager/database/Kpi_DB.py @@ -70,8 +70,7 @@ class KpiDB: session.rollback() if "psycopg2.errors.UniqueViolation" in str(e): LOGGER.error(f"Unique key voilation: {row.__class__.__name__} table. {str(e)}") - raise AlreadyExistsException(row.__class__.__name__, row, - extra_details=["Unique key voilation: {:}".format(e)] ) + raise AlreadyExistsException(row.__class__.__name__, row, extra_details=["Unique key voilation: {:}".format(e)] ) else: LOGGER.error(f"Failed to insert new row into {row.__class__.__name__} table. {str(e)}") raise OperationFailedException ("Deletion by column id", extra_details=["unable to delete row {:}".format(e)]) @@ -90,7 +89,6 @@ class KpiDB: print("{:} ID not found, No matching row: {:}".format(model.__name__, id_to_search)) return None except Exception as e: - session.rollback() LOGGER.debug(f"Failed to retrieve {model.__name__} ID. {str(e)}") raise OperationFailedException ("search by column id", extra_details=["unable to search row {:}".format(e)]) finally: diff --git a/src/kpi_value_api/tests/messages.py b/src/kpi_value_api/tests/messages.py index c2a1cbb0b..d8ad14bd4 100644 --- a/src/kpi_value_api/tests/messages.py +++ b/src/kpi_value_api/tests/messages.py @@ -18,8 +18,9 @@ from common.proto.kpi_value_api_pb2 import KpiValue, KpiValueList def create_kpi_value_list(): _create_kpi_value_list = KpiValueList() - # To run this experiment sucessfully, already existing UUID in KPI DB in necessary. - # because the UUID is used to get the descriptor form KPI DB. + # To run this experiment sucessfully, add an existing UUID of a KPI Descriptor from the KPI DB. + # This UUID is used to get the descriptor form the KPI DB. If the Kpi ID does not exists, + # some part of the code won't execute. EXISTING_KPI_IDs = ["725ce3ad-ac67-4373-bd35-8cd9d6a86e09", str(uuid.uuid4()), str(uuid.uuid4())] diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py index 81324b759..f1d079783 100644 --- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py +++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py @@ -63,8 +63,8 @@ class MetricWriterToPrometheus: def create_and_expose_cooked_kpi(self, kpi_descriptor: KpiDescriptor, kpi_value: KpiValue): # merge both gRPC messages into single varible. cooked_kpi = self.merge_kpi_descriptor_and_kpi_value(kpi_descriptor, kpi_value) - tags_to_exclude = {'kpi_description', 'kpi_sample_type', 'kpi_value'} # extracted values will be used as metric tag - metric_tags = [tag for tag in cooked_kpi.keys() if tag not in tags_to_exclude] + tags_to_exclude = {'kpi_description', 'kpi_sample_type', 'kpi_value'} + metric_tags = [tag for tag in cooked_kpi.keys() if tag not in tags_to_exclude] # These values will be used as metric tags metric_name = cooked_kpi['kpi_sample_type'] try: if metric_name not in PROM_METRICS: # Only register the metric, when it doesn't exists -- GitLab From 108618942d60f463efddade3a13e502e3d1e8352 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 14:07:29 +0000 Subject: [PATCH 505/602] Cleaning unit test and messages files. - unused imports and functions are removed --- src/kpi_manager/tests/test_kpi_manager.py | 66 ------------------- .../tests/test_kpi_value_writer.py | 23 +------ 2 files changed, 1 insertion(+), 88 deletions(-) diff --git a/src/kpi_manager/tests/test_kpi_manager.py b/src/kpi_manager/tests/test_kpi_manager.py index da149e3fe..219fdadee 100755 --- a/src/kpi_manager/tests/test_kpi_manager.py +++ b/src/kpi_manager/tests/test_kpi_manager.py @@ -93,13 +93,6 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab # Prepare Environment, should be the first test ################################################## -# # ERROR on this test --- -# def test_prepare_environment( -# context_client : ContextClient, # pylint: disable=redefined-outer-name,unused-argument -# ): -# context_id = json_context_id(DEFAULT_CONTEXT_NAME) -# context_client.SetContext(Context(**json_context(DEFAULT_CONTEXT_NAME))) -# context_client.SetTopology(Topology(**json_topology(DEFAULT_TOPOLOGY_NAME, context_id=context_id))) ########################### # Tests Implementation of Kpi Manager @@ -152,62 +145,3 @@ def test_set_list_of_KPIs(kpi_manager_client): # adding KPI for kpi in KPIs_TO_SEARCH: kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a(kpi)) - - -# ---------- 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()) -# LOGGER.info("Response gRPC message object: {:}".format(response)) -# assert isinstance(response, KpiDescriptor) - -# def test_DeleteKpiDescriptor(kpi_manager_client): -# LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ") -# response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) -# del_response = kpi_manager_client.DeleteKpiDescriptor(response) -# kpi_manager_client.GetKpiDescriptor(response) -# LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response)) -# assert isinstance(del_response, Empty) - -# def test_SelectKpiDescriptor(kpi_manager_client): -# LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ") -# kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a()) -# response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request_a()) -# LOGGER.info("Response gRPC message object: {:}".format(response)) -# assert isinstance(response, KpiDescriptorList) - -# ------------- INITIAL TESTs ---------------- -# Test case that makes use of client fixture to test server's CreateKpi method -# def test_set_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name -# # make call to server -# LOGGER.warning('test_create_kpi requesting') -# for i in range(3): -# response = kpi_manager_client.SetKpiDescriptor(create_kpi_request(str(i+1))) -# LOGGER.debug(str(response)) -# assert isinstance(response, KpiId) - -# # Test case that makes use of client fixture to test server's DeleteKpi method -# def test_delete_kpi(kpi_manager_client): # pylint: disable=redefined-outer-name -# # make call to server -# LOGGER.warning('delete_kpi requesting') -# response = kpi_manager_client.SetKpiDescriptor(create_kpi_request('4')) -# response = kpi_manager_client.DeleteKpiDescriptor(response) -# LOGGER.debug(str(response)) -# assert isinstance(response, Empty) - -# # Test case that makes use of client fixture to test server's GetKpiDescriptor method -# def test_select_kpi_descriptor(kpi_manager_client): # pylint: disable=redefined-outer-name -# LOGGER.warning('test_selectkpidescritor begin') -# response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request()) -# LOGGER.debug(str(response)) -# assert isinstance(response, KpiDescriptorList) diff --git a/src/kpi_value_writer/tests/test_kpi_value_writer.py b/src/kpi_value_writer/tests/test_kpi_value_writer.py index 40593af97..fce043d7f 100755 --- a/src/kpi_value_writer/tests/test_kpi_value_writer.py +++ b/src/kpi_value_writer/tests/test_kpi_value_writer.py @@ -14,32 +14,12 @@ import logging from kpi_value_writer.service.KpiValueWriter import KpiValueWriter -from kpi_value_writer.tests.test_messages import create_kpi_id_request, create_kpi_descriptor_request from common.tools.kafka.Variables import KafkaTopic -from common.proto.kpi_manager_pb2 import KpiDescriptor -from kpi_manager.client.KpiManagerClient import KpiManagerClient -LOGGER = logging.getLogger(__name__) - -# def test_GetKpiDescriptor(): -# LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") -# kpi_manager_client = KpiManagerClient() -# # adding KPI -# LOGGER.info(" --->>> calling SetKpiDescriptor ") -# response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) -# # get KPI -# LOGGER.info(" --->>> calling GetKpiDescriptor with response ID") -# response = kpi_manager_client.GetKpiDescriptor(response_id) -# LOGGER.info("Response gRPC message object: {:}".format(response)) - -# LOGGER.info(" --->>> calling GetKpiDescriptor with random ID") -# rand_response = kpi_manager_client.GetKpiDescriptor(create_kpi_id_request()) -# LOGGER.info("Response gRPC message object: {:}".format(rand_response)) -# LOGGER.info("\n------------------ TEST FINISHED ---------------------\n") -# assert isinstance(response, KpiDescriptor) +LOGGER = logging.getLogger(__name__) # -------- Initial Test ---------------- def test_validate_kafka_topics(): @@ -50,4 +30,3 @@ def test_validate_kafka_topics(): def test_KafkaConsumer(): LOGGER.debug(" --->>> test_kafka_consumer: START <<<--- ") KpiValueWriter.RunKafkaConsumer() - -- GitLab From 4cd64ed72284b7ac07dd20cdfcd97a6e4f6d0606 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 14:09:52 +0000 Subject: [PATCH 506/602] Updated Promtheus URL - PROM_URL variable is updated with FQDN of Prometheus. --- src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index b2ebecad0..5e7c3d139 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -32,7 +32,7 @@ from kpi_manager.client.KpiManagerClient import KpiManagerClient LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('KpiValueAPI', 'NBIgRPC') -PROM_URL = "http://localhost:9090" +PROM_URL = "http://prometheus-k8s.monitoring.svc.cluster.local:9090" # TODO: updated with the env variables class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): def __init__(self): @@ -79,7 +79,8 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): prom_response = [] for start_time, end_time in zip(start_timestamps, end_timestamps): for metric in metrics: - # print(start_time, end_time, metric) + print(start_time, end_time, metric) + LOGGER.debug(">>> Query: {:}".format(metric)) prom_response.append( prom_connect.custom_query_range( query = metric, # this is the metric name and label config -- GitLab From 37e2bfc82d82e47c89f0783cc748f1d404640e56 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 2 Aug 2024 15:15:03 +0000 Subject: [PATCH 507/602] changes in README files. - README files of kpi manager/value writer/api are updated to reflect new changes. --- src/kpi_manager/README.md | 27 +++++++++++---------------- src/kpi_value_api/README.md | 23 +++++++++++++++++++++++ src/kpi_value_writer/README.md | 32 ++++++++++---------------------- 3 files changed, 44 insertions(+), 38 deletions(-) create mode 100644 src/kpi_value_api/README.md diff --git a/src/kpi_manager/README.md b/src/kpi_manager/README.md index c1feadcc4..6e9b56d93 100644 --- a/src/kpi_manager/README.md +++ b/src/kpi_manager/README.md @@ -1,29 +1,24 @@ # How to locally run and test KPI manager micro-service -## --- File links need to be updated. --- ### Pre-requisets -The following requirements should be fulfilled before the execuation of KPI management service. +Ensure the following requirements are met before executing the KPI management service: -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_management/kpi_manager/database/tests/KpiDBtests.py) python file enlist the functions to create tables and database and -[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. +1. A virtual enviornment exist with all the required packages listed in ["requirements.in"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_manager/requirements.in) sucessfully installed. +2. Verify the creation of required database and table. The +[KPI DB test](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_manager/tests/test_kpi_db.py) python file lists the functions to create tables and the database. The +[KPI Engine](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_manager/database/KpiEngine.py) file contains the DB string. ### Messages format templates -["Messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/kpi_manager/tests/test_messages.py) python file enlist the basic gRPC messages format used during the testing. +The ["messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_manager/tests/test_messages.py) python file contains templates for creating gRPC messages. -### Test file -["KPI management test"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/kpi_manager/tests/test_kpi_manager.py) python file enlist different tests conducted during the experiment. +### Unit test file +The ["KPI manager test"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_manager/tests/test_kpi_manager.py) python file lists various tests conducted to validate functionality. ### 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. Call `verify_tables` to verify the existence of KPI table. -2. Call the gRPC method `SetKpiDescriptor(KpiDescriptor)->KpiId` to add the KpiDescriptor in `Kpi` DB. `KpiDescriptor` and `KpiId` are both pre-defined gRPC message types. +2. Call the gRPC method `SetKpiDescriptor(KpiDescriptor)->KpiId` to add the KpiDescriptor to the `Kpi` DB. `KpiDescriptor` and `KpiId` are both pre-defined gRPC message types. -3. Call `GetKpiDescriptor(KpiId)->KpiDescriptor` to read the `KpiDescriptor` from DB and `DeleteKpiDescriptor(KpiId)` to delete the `KpiDescriptor` from DB. +3. Call `GetKpiDescriptor(KpiId)->KpiDescriptor` to read the `KpiDescriptor` from the DB and `DeleteKpiDescriptor(KpiId)` to delete the `KpiDescriptor` from the DB. -4. Call `SelectKpiDescriptor(KpiDescriptorFilter)->KpiDescriptorList` to get all `KpiDescriptor` objects that matches the filter criteria. `KpiDescriptorFilter` and `KpiDescriptorList` are pre-defined gRPC message types. - -## For KPI composer and KPI writer -The functionalities of KPI composer and writer is heavily dependent upon Telemetery service. Therfore, these services has other pre-requsites that are mention [here](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/telemetry/requirements.in). +4. Call `SelectKpiDescriptor(KpiDescriptorFilter)->KpiDescriptorList` to get all `KpiDescriptor` objects that matches filter criteria. `KpiDescriptorFilter` and `KpiDescriptorList` are pre-defined gRPC message types. diff --git a/src/kpi_value_api/README.md b/src/kpi_value_api/README.md new file mode 100644 index 000000000..70ba2c5e7 --- /dev/null +++ b/src/kpi_value_api/README.md @@ -0,0 +1,23 @@ +# How to locally run and test KPI Value API micro-service + +### Pre-requisets +Ensure the following requirements are met before executing the KPI Value API service. + +1. The KPI Manger service is running and Apache Kafka is running. + +2. A virtual enviornment exist with all the required packages listed in ["requirements.in"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_api/requirements.in) file sucessfully installed. + +3. Call the ["create_all_topics()"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/common/tools/kafka/Variables.py) function to verify the existence of all required topics on kafka. + +### Messages format templates +The ["messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_api/tests/messages.py) python file contains templates for creating gRPC messages. + +### Unit test file +The ["KPI Value API test"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_api/tests/test_kpi_value_api.py) python file enlist various tests conducted to validate functionality. + +### Flow of execution (Kpi Maanager Service functions) +1. Call the `create_new_topic_if_not_exists()` method to create any new topics if needed. + +2. Call `StoreKpiValues(KpiValueList)` to produce `Kpi Value` on a Kafka Topic. (The `KpiValueWriter` microservice will consume and process the `Kpi Value`) + +3. Call `SelectKpiValues(KpiValueFilter) -> KpiValueList` to read metric from the Prometheus DB. diff --git a/src/kpi_value_writer/README.md b/src/kpi_value_writer/README.md index 72ba6e559..c45a0e395 100644 --- a/src/kpi_value_writer/README.md +++ b/src/kpi_value_writer/README.md @@ -1,29 +1,17 @@ -# How to locally run and test KPI manager micro-service +# How to locally run and test the KPI Value Writer micro-service -## --- File links need to be updated. --- ### Pre-requisets -The following requirements should be fulfilled before the execuation of KPI management service. +Ensure the following requirements are meet before executing the KPI Value Writer service> -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_management/kpi_manager/database/tests/KpiDBtests.py) python file enlist the functions to create tables and database and -[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. +1. The KPI Manger and KPI Value API services are running and Apache Kafka is running. -### Messages format templates -["Messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/kpi_manager/tests/test_messages.py) python file enlist the basic gRPC messages format used during the testing. - -### Test file -["KPI management test"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/kpi_manager/tests/test_kpi_manager.py) python file enlist 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. Call `verify_tables` to verify the existence of KPI table. +2. A Virtual enviornment exist with all the required packages listed in the ["requirements.in"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_writer/requirements.in) file installed sucessfully. -2. Call the gRPC method `SetKpiDescriptor(KpiDescriptor)->KpiId` to add the KpiDescriptor in `Kpi` DB. `KpiDescriptor` and `KpiId` are both pre-defined gRPC message types. - -3. Call `GetKpiDescriptor(KpiId)->KpiDescriptor` to read the `KpiDescriptor` from DB and `DeleteKpiDescriptor(KpiId)` to delete the `KpiDescriptor` from DB. +### Messages format templates +The ["messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_writer/tests/test_messages.py) python file contains the templates to create gRPC messages. -4. Call `SelectKpiDescriptor(KpiDescriptorFilter)->KpiDescriptorList` to get all `KpiDescriptor` objects that matches the filter criteria. `KpiDescriptorFilter` and `KpiDescriptorList` are pre-defined gRPC message types. +### Unit test file +The ["KPI Value API test"](https://labs.etsi.org/rep/tfs/controller/-/blob/develop/src/kpi_value_writer/tests/test_kpi_value_writer.py) python file enlist various tests conducted to validate functionality. -## For KPI composer and KPI writer -The functionalities of KPI composer and writer is heavily dependent upon Telemetery service. Therfore, these services has other pre-requsites that are mention [here](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/telemetry/requirements.in). \ No newline at end of file +### Flow of execution +1. Call the `RunKafkaConsumer` method from the `KpiValueWriter` class to start consuming the `KPI Value` generated by the `KPI Value API` or `Telemetry`. For every valid `KPI Value` consumer from Kafka, it invokes the `PrometheusWriter` class to prepare and push the metric to the Promethues DB. -- GitLab From f4b9fa91d9de8ae3f89e89c2265686733cd8c00f Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 6 Aug 2024 14:57:33 +0000 Subject: [PATCH 508/602] updated Kafka deployment script. - --- deploy/kafka.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/deploy/kafka.sh b/deploy/kafka.sh index 21ba89408..f86108011 100755 --- a/deploy/kafka.sh +++ b/deploy/kafka.sh @@ -78,11 +78,13 @@ function kafka_deploy() { echo "Apache Kafka" echo ">>> Checking if Apache Kafka is deployed ... " -if [ "$KFK_REDEPLOY" == "YES" ]; then +if [ "$KFK_REDEPLOY" = "YES" ]; then + echo ">>> Redeploying kafka namespace" kafka_deploy -elif kubectl get --namespace ${KFK_NAMESPACE} deployments.apps &> /dev/null; then - echo ">>> Apache Kafka already present; skipping step." +elif kubectl get namespace "${KFK_NAMESPACE}" &> /dev/null; then + echo ">>> Apache Kafka already present; skipping step." else + echo ">>> Kafka namespace doesn't exists. Deploying kafka namespace" kafka_deploy fi echo -- GitLab From dcdceee0222acad9c2a909e1a681554262c4f7bf Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 6 Aug 2024 15:04:27 +0000 Subject: [PATCH 509/602] updated FrontendTelemetery.proto file. - added start_time and end_time in proto. --- proto/telemetry_frontend.proto | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/proto/telemetry_frontend.proto b/proto/telemetry_frontend.proto index dbc1e8bf6..614d10cf0 100644 --- a/proto/telemetry_frontend.proto +++ b/proto/telemetry_frontend.proto @@ -19,9 +19,9 @@ import "context.proto"; import "kpi_manager.proto"; service TelemetryFrontendService { - rpc StartCollector (Collector ) returns (CollectorId ) {} - rpc StopCollector (CollectorId ) returns (context.Empty) {} - rpc SelectCollectors(CollectorFilter) returns (CollectorList) {} + rpc StartCollector (Collector ) returns (CollectorId ) {} + rpc StopCollector (CollectorId ) returns (context.Empty) {} + rpc SelectCollectors (CollectorFilter) returns (CollectorList) {} } message CollectorId { @@ -29,10 +29,12 @@ 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_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 + context.Timestamp start_time = 5; // Timestamp when Collector start execution + context.Timestamp end_time = 6; // Timestamp when Collector stop execution } message CollectorFilter { -- GitLab From 9e741088fe875b8574c3a772c111d8caf8d62f08 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 6 Aug 2024 15:10:17 +0000 Subject: [PATCH 510/602] changes in Telemetry Frontend service and client. - collector description is removed from TelemetryModel. - "ConvertCollectorToRow" is added in Telemetry Model class. - NameMapping is removed from service client and service. - TelemetryDB object name and import is updated with correct class name. - StartCollector is restructured. - "PublishRequestOnKafka" is restructured. --- src/telemetry/database/TelemetryModel.py | 29 +++-- .../service/TelemetryFrontendService.py | 5 +- .../TelemetryFrontendServiceServicerImpl.py | 107 +++++++----------- src/telemetry/frontend/tests/Messages.py | 3 +- 4 files changed, 66 insertions(+), 78 deletions(-) diff --git a/src/telemetry/database/TelemetryModel.py b/src/telemetry/database/TelemetryModel.py index 95f692e4b..1faf16e1a 100644 --- a/src/telemetry/database/TelemetryModel.py +++ b/src/telemetry/database/TelemetryModel.py @@ -28,17 +28,32 @@ class Collector(Base): collector_id = Column(UUID(as_uuid=False), primary_key=True) kpi_id = Column(UUID(as_uuid=False), nullable=False) - collector_decription = Column(String , nullable=False) sampling_duration_s = Column(Float , nullable=False) sampling_interval_s = Column(Float , nullable=False) - start_timestamp = Column(Float , nullable=False) - end_timestamp = Column(Float , nullable=False) + start_timestamp = Column(String , nullable=False) + end_timestamp = Column(String , nullable=False) # helps in logging the information def __repr__(self): - return (f"") + return (f"") + + @classmethod + def ConvertCollectorToRow(cls, request): + """ + Create an instance of collector rows from a request object. + Args: request: The request object containing collector gRPC message. + Returns: A row (an instance of Collector table) initialized with content of the request. + """ + return cls( + collector_id = request.collector_id.collector_id.uuid, + kpi_id = request.kpi_id.kpi_id.uuid, + sampling_duration_s = request.duration_s, + sampling_interval_s = request.interval_s, + start_timestamp = request.start_time.timestamp, + end_timestamp = request.end_time.timestamp + ) # add method to convert gRPC requests to rows if necessary... + diff --git a/src/telemetry/frontend/service/TelemetryFrontendService.py b/src/telemetry/frontend/service/TelemetryFrontendService.py index dc3f8df36..abd361aa0 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendService.py +++ b/src/telemetry/frontend/service/TelemetryFrontendService.py @@ -14,17 +14,16 @@ from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc -from monitoring.service.NameMapping import NameMapping from common.tools.service.GenericGrpcService import GenericGrpcService from common.proto.telemetry_frontend_pb2_grpc import add_TelemetryFrontendServiceServicer_to_server from telemetry.frontend.service.TelemetryFrontendServiceServicerImpl import TelemetryFrontendServiceServicerImpl class TelemetryFrontendService(GenericGrpcService): - def __init__(self, name_mapping : NameMapping, cls_name: str = __name__) -> None: + def __init__(self, cls_name: str = __name__) -> None: port = get_service_port_grpc(ServiceNameEnum.TELEMETRYFRONTEND) super().__init__(port, cls_name=cls_name) - self.telemetry_frontend_servicer = TelemetryFrontendServiceServicerImpl(name_mapping) + self.telemetry_frontend_servicer = TelemetryFrontendServiceServicerImpl() def install_servicers(self): add_TelemetryFrontendServiceServicer_to_server(self.telemetry_frontend_servicer, self.server) diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index e6830ad67..49641aae1 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -14,100 +14,74 @@ import ast import threading -import time from typing import Tuple, Any import grpc import logging +from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method +from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from confluent_kafka import Consumer as KafkaConsumer -from common.proto.context_pb2 import Empty -from monitoring.service.NameMapping import NameMapping from confluent_kafka import Producer as KafkaProducer -from confluent_kafka import KafkaException from confluent_kafka import KafkaError + +from common.proto.context_pb2 import Empty + from common.proto.telemetry_frontend_pb2 import CollectorId, Collector, CollectorFilter, CollectorList -from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.proto.telemetry_frontend_pb2_grpc import TelemetryFrontendServiceServicer - from telemetry.database.TelemetryModel import Collector as CollectorModel -from telemetry.database.managementDB import managementDB +from telemetry.database.Telemetry_DB import TelemetryDB + LOGGER = logging.getLogger(__name__) -METRICS_POOL = MetricsPool('Monitoring', 'TelemetryFrontend') -KAFKA_SERVER_IP = '127.0.0.1:9092' +METRICS_POOL = MetricsPool('TelemetryFrontend', 'NBIgRPC') ACTIVE_COLLECTORS = [] -KAFKA_TOPICS = {'request' : 'topic_request', - 'response': 'topic_response'} class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): - def __init__(self, name_mapping : NameMapping): + def __init__(self): LOGGER.info('Init TelemetryFrontendService') - self.managementDBobj = managementDB() - self.kafka_producer = KafkaProducer({'bootstrap.servers': KAFKA_SERVER_IP,}) - self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KAFKA_SERVER_IP, - 'group.id' : 'frontend', - 'auto.offset.reset' : 'latest'}) + self.DBobj = TelemetryDB() + self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value}) + self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value, + 'group.id' : 'frontend', + 'auto.offset.reset' : 'latest'}) - def add_collector_to_db(self, request: Collector ): # type: ignore - try: - # Create a new Collector instance - collector_to_insert = CollectorModel() - collector_to_insert.collector_id = request.collector_id.collector_id.uuid - collector_to_insert.kpi_id = request.kpi_id.kpi_id.uuid - # collector_to_insert.collector_decription= request.collector - collector_to_insert.sampling_duration_s = request.duration_s - collector_to_insert.sampling_interval_s = request.interval_s - collector_to_insert.start_timestamp = time.time() - collector_to_insert.end_timestamp = time.time() - managementDB.add_row_to_db(collector_to_insert) - except Exception as e: - LOGGER.info("Unable to create collectorModel class object. {:}".format(e)) - - # @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StartCollector(self, request : Collector, grpc_context: grpc.ServicerContext # type: ignore ) -> CollectorId: # type: ignore - # push info to frontend db LOGGER.info ("gRPC message: {:}".format(request)) response = CollectorId() - _collector_id = str(request.collector_id.collector_id.uuid) - _collector_kpi_id = str(request.kpi_id.kpi_id.uuid) - _collector_duration = int(request.duration_s) - _collector_interval = int(request.interval_s) - # pushing Collector to DB - self.add_collector_to_db(request) - self.publish_to_kafka_request_topic(_collector_id, _collector_kpi_id, _collector_duration, _collector_interval) - # self.run_publish_to_kafka_request_topic(_collector_id, _collector_kpi_id, _collector_duration, _collector_interval) + + # TODO: Verify the presence of Kpi ID in KpiDB or assume that KPI ID already exists. + self.DBobj.add_row_to_db( + CollectorModel.ConvertCollectorToRow(request) + ) + self.PublishRequestOnKafka(request) + response.collector_id.uuid = request.collector_id.collector_id.uuid # type: ignore return response - - def run_publish_to_kafka_request_topic(self, msg_key: str, kpi: str, duration : int, interval: int): - # Add threading.Thread() response to dictonary and call start() in the next statement - threading.Thread(target=self.publish_to_kafka_request_topic, args=(msg_key, kpi, duration, interval)).start() - - def publish_to_kafka_request_topic(self, - collector_id: str, kpi: str, duration : int, interval: int - ): + + def PublishRequestOnKafka(self, collector_obj): """ - Method to generate collector request to Kafka topic. + Method to generate collector request on Kafka. """ - # time.sleep(5) - # producer_configs = { - # 'bootstrap.servers': KAFKA_SERVER_IP, - # } - # topic_request = "topic_request" - msg_value : Tuple [str, int, int] = (kpi, duration, interval) - # print ("Request generated: ", "Colletcor Id: ", collector_id, \ - # ", \nKPI: ", kpi, ", Duration: ", duration, ", Interval: ", interval) - # producerObj = KafkaProducer(producer_configs) - self.kafka_producer.produce(KAFKA_TOPICS['request'], key=collector_id, value= str(msg_value), callback=self.delivery_callback) - # producerObj.produce(KAFKA_TOPICS['request'], key=collector_id, value= str(msg_value), callback=self.delivery_callback) - LOGGER.info("Collector Request Generated: {:}, {:}, {:}, {:}".format(collector_id, kpi, duration, interval)) - # producerObj.produce(topic_request, key=collector_id, value= str(msg_value), callback=self.delivery_callback) + collector_id = collector_obj.collector_id.collector_id.uuid + collector_to_generate : Tuple [str, int, int] = ( + collector_obj.kpi_id.kpi_id.uuid, + collector_obj.duration_s, + collector_obj.interval_s + ) + self.kafka_producer.produce( + KafkaTopic.REQUEST.value, + key = collector_id, + value = str(collector_to_generate), + callback = self.delivery_callback + ) + LOGGER.info("Collector Request Generated: Collector Id: {:}, Value: {:}".format(collector_id, collector_to_generate)) ACTIVE_COLLECTORS.append(collector_id) self.kafka_producer.flush() - + def run_kafka_listener(self): # print ("--- STARTED: run_kafka_listener ---") threading.Thread(target=self.kafka_listener).start() @@ -201,4 +175,5 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): response.collector_list.append(collector_obj) return response except Exception as e: - LOGGER.info('Unable to process response {:}'.format(e)) \ No newline at end of file + LOGGER.info('Unable to process response {:}'.format(e)) + diff --git a/src/telemetry/frontend/tests/Messages.py b/src/telemetry/frontend/tests/Messages.py index 1205898d1..106c2a5a7 100644 --- a/src/telemetry/frontend/tests/Messages.py +++ b/src/telemetry/frontend/tests/Messages.py @@ -17,7 +17,6 @@ import random from common.proto import telemetry_frontend_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType - # ----------------------- "2nd" Iteration -------------------------------- def create_collector_id(): _collector_id = telemetry_frontend_pb2.CollectorId() @@ -32,7 +31,7 @@ def create_collector_id(): def create_collector_request(): _create_collector_request = telemetry_frontend_pb2.Collector() _create_collector_request.collector_id.collector_id.uuid = str(uuid.uuid4()) - _create_collector_request.kpi_id.kpi_id.uuid = "165d20c5-a446-42fa-812f-e2b7ed283c6f" + _create_collector_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) # _create_collector_request.collector = "collector description" _create_collector_request.duration_s = float(random.randint(8, 16)) _create_collector_request.interval_s = float(random.randint(2, 4)) -- GitLab From 97655a60341f791b221bc869417ad9c5e5cfc683 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 6 Aug 2024 15:12:42 +0000 Subject: [PATCH 511/602] Telemetry frontend test file updated. - pytest logging is changed to DEBUG. - ManagemetDB test is removed. - Irrelevent imports and methods are removed from the test file. - --- .../run_tests_locally-telemetry-frontend.sh | 2 +- scripts/run_tests_locally-telemetry-mgtDB.sh | 26 --- src/telemetry/frontend/tests/test_frontend.py | 169 +++++------------- 3 files changed, 45 insertions(+), 152 deletions(-) delete mode 100755 scripts/run_tests_locally-telemetry-mgtDB.sh diff --git a/scripts/run_tests_locally-telemetry-frontend.sh b/scripts/run_tests_locally-telemetry-frontend.sh index 7652ccb58..a2a1de523 100755 --- a/scripts/run_tests_locally-telemetry-frontend.sh +++ b/scripts/run_tests_locally-telemetry-frontend.sh @@ -24,5 +24,5 @@ cd $PROJECTDIR/src # python3 kpi_manager/tests/test_unitary.py RCFILE=$PROJECTDIR/coverage/.coveragerc -python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ +python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ telemetry/frontend/tests/test_frontend.py diff --git a/scripts/run_tests_locally-telemetry-mgtDB.sh b/scripts/run_tests_locally-telemetry-mgtDB.sh deleted file mode 100755 index 8b68104ea..000000000 --- a/scripts/run_tests_locally-telemetry-mgtDB.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. - - -PROJECTDIR=`pwd` - -cd $PROJECTDIR/src -# RCFILE=$PROJECTDIR/coverage/.coveragerc -# coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \ -# kpi_manager/tests/test_unitary.py - -RCFILE=$PROJECTDIR/coverage/.coveragerc -python3 -m pytest --log-cli-level=INFO --verbose \ - telemetry/database/tests/managementDBtests.py diff --git a/src/telemetry/frontend/tests/test_frontend.py b/src/telemetry/frontend/tests/test_frontend.py index 002cc4307..ca2d61370 100644 --- a/src/telemetry/frontend/tests/test_frontend.py +++ b/src/telemetry/frontend/tests/test_frontend.py @@ -13,129 +13,39 @@ # limitations under the License. import os -import time import pytest import logging -from typing import Union -from common.proto.context_pb2 import Empty +# from common.proto.context_pb2 import Empty from common.Constants import ServiceNameEnum from common.proto.telemetry_frontend_pb2 import CollectorId, CollectorList -from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server -from context.client.ContextClient import ContextClient -from common.tools.service.GenericGrpcService import GenericGrpcService -from common.tests.MockServicerImpl_Context import MockServicerImpl_Context + from common.Settings import ( get_service_port_grpc, get_env_var_name, ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC) from telemetry.frontend.client.TelemetryFrontendClient import TelemetryFrontendClient from telemetry.frontend.service.TelemetryFrontendService import TelemetryFrontendService -from telemetry.frontend.service.TelemetryFrontendServiceServicerImpl import TelemetryFrontendServiceServicerImpl -from telemetry.frontend.tests.Messages import ( create_collector_request, create_collector_filter) -from telemetry.database.managementDB import managementDB -from telemetry.database.TelemetryEngine import TelemetryEngine - -from device.client.DeviceClient import DeviceClient -from device.service.DeviceService import DeviceService -from device.service.driver_api.DriverFactory import DriverFactory -from device.service.driver_api.DriverInstanceCache import DriverInstanceCache - -from monitoring.service.NameMapping import NameMapping +from telemetry.frontend.tests.Messages import ( + create_collector_request, create_collector_filter) -os.environ['DEVICE_EMULATED_ONLY'] = 'TRUE' -from device.service.drivers import DRIVERS ########################### # Tests Setup ########################### LOCAL_HOST = '127.0.0.1' -MOCKSERVICE_PORT = 10000 -TELEMETRY_FRONTEND_PORT = str(MOCKSERVICE_PORT) + str(get_service_port_grpc(ServiceNameEnum.TELEMETRYFRONTEND)) +TELEMETRY_FRONTEND_PORT = str(get_service_port_grpc(ServiceNameEnum.TELEMETRYFRONTEND)) os.environ[get_env_var_name(ServiceNameEnum.TELEMETRYFRONTEND, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) os.environ[get_env_var_name(ServiceNameEnum.TELEMETRYFRONTEND, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(TELEMETRY_FRONTEND_PORT) LOGGER = logging.getLogger(__name__) -class MockContextService(GenericGrpcService): - # Mock Service implementing Context to simplify unitary tests of Monitoring - - def __init__(self, bind_port: Union[str, int]) -> None: - super().__init__(bind_port, LOCAL_HOST, enable_health_servicer=False, cls_name='MockService') - - # pylint: disable=attribute-defined-outside-init - def install_servicers(self): - self.context_servicer = MockServicerImpl_Context() - add_ContextServiceServicer_to_server(self.context_servicer, self.server) - -@pytest.fixture(scope='session') -def context_service(): - LOGGER.info('Initializing MockContextService...') - _service = MockContextService(MOCKSERVICE_PORT) - _service.start() - - LOGGER.info('Yielding MockContextService...') - yield _service - - LOGGER.info('Terminating MockContextService...') - _service.context_servicer.msg_broker.terminate() - _service.stop() - - LOGGER.info('Terminated MockContextService...') - -@pytest.fixture(scope='session') -def context_client(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument - LOGGER.info('Initializing ContextClient...') - _client = ContextClient() - - LOGGER.info('Yielding ContextClient...') - yield _client - - LOGGER.info('Closing ContextClient...') - _client.close() - - LOGGER.info('Closed ContextClient...') - -@pytest.fixture(scope='session') -def device_service(context_service : MockContextService): # pylint: disable=redefined-outer-name,unused-argument - LOGGER.info('Initializing DeviceService...') - driver_factory = DriverFactory(DRIVERS) - driver_instance_cache = DriverInstanceCache(driver_factory) - _service = DeviceService(driver_instance_cache) - _service.start() - - # yield the server, when test finishes, execution will resume to stop it - LOGGER.info('Yielding DeviceService...') - yield _service - - LOGGER.info('Terminating DeviceService...') - _service.stop() - - LOGGER.info('Terminated DeviceService...') - @pytest.fixture(scope='session') -def device_client(device_service : DeviceService): # pylint: disable=redefined-outer-name,unused-argument - LOGGER.info('Initializing DeviceClient...') - _client = DeviceClient() - - LOGGER.info('Yielding DeviceClient...') - yield _client - - LOGGER.info('Closing DeviceClient...') - _client.close() - - LOGGER.info('Closed DeviceClient...') - -@pytest.fixture(scope='session') -def telemetryFrontend_service( - context_service : MockContextService, - device_service : DeviceService - ): +def telemetryFrontend_service(): LOGGER.info('Initializing TelemetryFrontendService...') - name_mapping = NameMapping() - _service = TelemetryFrontendService(name_mapping) + _service = TelemetryFrontendService() _service.start() # yield the server, when test finishes, execution will resume to stop it @@ -168,37 +78,46 @@ def telemetryFrontend_client( # Tests Implementation of Telemetry Frontend ########################### -def test_verify_db_and_table(): - LOGGER.info(' >>> test_verify_database_and_tables START: <<< ') - _engine = TelemetryEngine.get_engine() - managementDB.create_database(_engine) - managementDB.create_tables(_engine) - +# ------- Re-structuring Test --------- def test_StartCollector(telemetryFrontend_client): LOGGER.info(' >>> test_StartCollector START: <<< ') response = telemetryFrontend_client.StartCollector(create_collector_request()) LOGGER.debug(str(response)) assert isinstance(response, CollectorId) -def test_run_kafka_listener(): - LOGGER.info(' >>> test_run_kafka_listener START: <<< ') - name_mapping = NameMapping() - TelemetryFrontendServiceObj = TelemetryFrontendServiceServicerImpl(name_mapping) - response = TelemetryFrontendServiceObj.run_kafka_listener() # Method "run_kafka_listener" is not define in frontend.proto - LOGGER.debug(str(response)) - assert isinstance(response, bool) - -def test_StopCollector(telemetryFrontend_client): - LOGGER.info(' >>> test_StopCollector START: <<< ') - _collector_id = telemetryFrontend_client.StartCollector(create_collector_request()) - time.sleep(3) # wait for small amount before call the stopCollecter() - response = telemetryFrontend_client.StopCollector(_collector_id) - LOGGER.debug(str(response)) - assert isinstance(response, Empty) - -def test_select_collectors(telemetryFrontend_client): - LOGGER.info(' >>> test_select_collector requesting <<< ') - response = telemetryFrontend_client.SelectCollectors(create_collector_filter()) - LOGGER.info('Received Rows after applying Filter: {:} '.format(response)) - LOGGER.debug(str(response)) - assert isinstance(response, CollectorList) \ No newline at end of file +# ------- previous test ---------------- + +# def test_verify_db_and_table(): +# LOGGER.info(' >>> test_verify_database_and_tables START: <<< ') +# _engine = TelemetryEngine.get_engine() +# managementDB.create_database(_engine) +# managementDB.create_tables(_engine) + +# def test_StartCollector(telemetryFrontend_client): +# LOGGER.info(' >>> test_StartCollector START: <<< ') +# response = telemetryFrontend_client.StartCollector(create_collector_request()) +# LOGGER.debug(str(response)) +# assert isinstance(response, CollectorId) + +# def test_run_kafka_listener(): +# LOGGER.info(' >>> test_run_kafka_listener START: <<< ') +# name_mapping = NameMapping() +# TelemetryFrontendServiceObj = TelemetryFrontendServiceServicerImpl(name_mapping) +# response = TelemetryFrontendServiceObj.run_kafka_listener() # Method "run_kafka_listener" is not define in frontend.proto +# LOGGER.debug(str(response)) +# assert isinstance(response, bool) + +# def test_StopCollector(telemetryFrontend_client): +# LOGGER.info(' >>> test_StopCollector START: <<< ') +# _collector_id = telemetryFrontend_client.StartCollector(create_collector_request()) +# time.sleep(3) # wait for small amount before call the stopCollecter() +# response = telemetryFrontend_client.StopCollector(_collector_id) +# LOGGER.debug(str(response)) +# assert isinstance(response, Empty) + +# def test_select_collectors(telemetryFrontend_client): +# LOGGER.info(' >>> test_select_collector requesting <<< ') +# response = telemetryFrontend_client.SelectCollectors(create_collector_filter()) +# LOGGER.info('Received Rows after applying Filter: {:} '.format(response)) +# LOGGER.debug(str(response)) +# assert isinstance(response, CollectorList) \ No newline at end of file -- GitLab From 9605c9a10a2c80682f146c897e7118b4cd3da499 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 8 Aug 2024 09:32:37 +0000 Subject: [PATCH 512/602] Telemetry Frontend gRPC NBI Re-structuring - Changed the column type of the start and end timestamps to Float. - Added ConvertRowToCollector() in TelemetryModel. - Renamed the class variable from "DBobj" to "tele_db_obj". - Renamed the local variable from "collector_id" to "collector_uuid". - Added PublishStopRequestOnKafka() to publish the stop collector request on Kafka. - Improved the test files. --- src/telemetry/database/TelemetryModel.py | 24 +++++-- src/telemetry/database/Telemetry_DB.py | 6 +- .../TelemetryFrontendServiceServicerImpl.py | 64 +++++++++++++------ src/telemetry/frontend/tests/Messages.py | 54 ++-------------- src/telemetry/frontend/tests/test_frontend.py | 15 ++++- 5 files changed, 86 insertions(+), 77 deletions(-) diff --git a/src/telemetry/database/TelemetryModel.py b/src/telemetry/database/TelemetryModel.py index 1faf16e1a..611ce7e70 100644 --- a/src/telemetry/database/TelemetryModel.py +++ b/src/telemetry/database/TelemetryModel.py @@ -16,6 +16,7 @@ import logging from sqlalchemy.dialects.postgresql import UUID from sqlalchemy import Column, String, Float from sqlalchemy.orm import registry +from common.proto import telemetry_frontend_pb2 logging.basicConfig(level=logging.INFO) LOGGER = logging.getLogger(__name__) @@ -30,8 +31,8 @@ class Collector(Base): kpi_id = Column(UUID(as_uuid=False), nullable=False) sampling_duration_s = Column(Float , nullable=False) sampling_interval_s = Column(Float , nullable=False) - start_timestamp = Column(String , nullable=False) - end_timestamp = Column(String , nullable=False) + start_timestamp = Column(Float , nullable=False) + end_timestamp = Column(Float , nullable=False) # helps in logging the information def __repr__(self): @@ -42,7 +43,7 @@ class Collector(Base): @classmethod def ConvertCollectorToRow(cls, request): """ - Create an instance of collector rows from a request object. + Create an instance of Collector table rows from a request object. Args: request: The request object containing collector gRPC message. Returns: A row (an instance of Collector table) initialized with content of the request. """ @@ -55,5 +56,18 @@ class Collector(Base): end_timestamp = request.end_time.timestamp ) -# add method to convert gRPC requests to rows if necessary... - + @classmethod + def ConvertRowToCollector(cls, row): + """ + Create and return a dictionary representation of a Collector table instance. + Args: row: The Collector table instance (row) containing the data. + Returns: collector gRPC message initialized with the content of a row. + """ + response = telemetry_frontend_pb2.Collector() + response.collector_id.collector_id.uuid = row.collector_id + response.kpi_id.kpi_id.uuid = row.kpi_id + response.duration_s = row.sampling_duration_s + response.interval_s = row.sampling_interval_s + response.start_time.timestamp = row.start_timestamp + response.end_time.timestamp = row.end_timestamp + return response diff --git a/src/telemetry/database/Telemetry_DB.py b/src/telemetry/database/Telemetry_DB.py index ec7da9e40..32acfd73a 100644 --- a/src/telemetry/database/Telemetry_DB.py +++ b/src/telemetry/database/Telemetry_DB.py @@ -121,13 +121,13 @@ class TelemetryDB: query = session.query(CollectorModel) # Apply filters based on the filter_object if filter_object.kpi_id: - query = query.filter(CollectorModel.kpi_id.in_([k.kpi_id.uuid for k in filter_object.kpi_id])) + query = query.filter(CollectorModel.kpi_id.in_([k.kpi_id.uuid for k in filter_object.kpi_id])) result = query.all() - + # query should be added to return all rows if result: LOGGER.debug(f"Fetched filtered rows from {model.__name__} table with filters: {filter_object}") # - Results: {result} else: - LOGGER.debug(f"No matching row found in {model.__name__} table with filters: {filter_object}") + LOGGER.warning(f"No matching row found in {model.__name__} table with filters: {filter_object}") return result except Exception as e: LOGGER.error(f"Error fetching filtered rows from {model.__name__} table with filters {filter_object} ::: {e}") diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index 49641aae1..29c192bdf 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -34,18 +34,20 @@ from telemetry.database.Telemetry_DB import TelemetryDB LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('TelemetryFrontend', 'NBIgRPC') -ACTIVE_COLLECTORS = [] +ACTIVE_COLLECTORS = [] # keep and can be populated from DB class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): def __init__(self): LOGGER.info('Init TelemetryFrontendService') - self.DBobj = TelemetryDB() + self.tele_db_obj = TelemetryDB() self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value}) self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value, 'group.id' : 'frontend', 'auto.offset.reset' : 'latest'}) + # --->>> SECTION: StartCollector with all helper methods <<<--- + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StartCollector(self, request : Collector, grpc_context: grpc.ServicerContext # type: ignore @@ -54,7 +56,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): response = CollectorId() # TODO: Verify the presence of Kpi ID in KpiDB or assume that KPI ID already exists. - self.DBobj.add_row_to_db( + self.tele_db_obj.add_row_to_db( CollectorModel.ConvertCollectorToRow(request) ) self.PublishRequestOnKafka(request) @@ -66,7 +68,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): """ Method to generate collector request on Kafka. """ - collector_id = collector_obj.collector_id.collector_id.uuid + collector_uuid = collector_obj.collector_id.collector_id.uuid collector_to_generate : Tuple [str, int, int] = ( collector_obj.kpi_id.kpi_id.uuid, collector_obj.duration_s, @@ -74,12 +76,12 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): ) self.kafka_producer.produce( KafkaTopic.REQUEST.value, - key = collector_id, + key = collector_uuid, value = str(collector_to_generate), callback = self.delivery_callback ) - LOGGER.info("Collector Request Generated: Collector Id: {:}, Value: {:}".format(collector_id, collector_to_generate)) - ACTIVE_COLLECTORS.append(collector_id) + LOGGER.info("Collector Request Generated: Collector Id: {:}, Value: {:}".format(collector_uuid, collector_to_generate)) + ACTIVE_COLLECTORS.append(collector_uuid) self.kafka_producer.flush() def run_kafka_listener(self): @@ -141,39 +143,59 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): msg (Message): Kafka message object. """ if err: - print(f'Message delivery failed: {err}') + LOGGER.debug('Message delivery failed: {:}'.format(err)) + print('Message delivery failed: {:}'.format(err)) else: - print(f'Message delivered to topic {msg.topic()}') + LOGGER.debug('Message delivered to topic {:}'.format(msg.topic())) + print('Message delivered to topic {:}'.format(msg.topic())) + + # <<<--- SECTION: StopCollector with all helper methods --->>> @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StopCollector(self, request : CollectorId, grpc_context: grpc.ServicerContext # type: ignore ) -> Empty: # type: ignore LOGGER.info ("gRPC message: {:}".format(request)) - _collector_id = request.collector_id.uuid - self.publish_to_kafka_request_topic(_collector_id, "", -1, -1) + self.PublishStopRequestOnKafka(request) return Empty() + def PublishStopRequestOnKafka(self, collector_id): + """ + Method to generate stop collector request on Kafka. + """ + collector_uuid = collector_id.collector_id.uuid + collector_to_stop : Tuple [str, int, int] = ( + collector_uuid , -1, -1 + ) + self.kafka_producer.produce( + KafkaTopic.REQUEST.value, + key = collector_uuid, + value = str(collector_to_stop), + callback = self.delivery_callback + ) + LOGGER.info("Collector Stop Request Generated: Collector Id: {:}, Value: {:}".format(collector_uuid, collector_to_stop)) + try: + ACTIVE_COLLECTORS.remove(collector_uuid) + except ValueError: + LOGGER.warning('Collector ID {:} not found in active collector list'.format(collector_uuid)) + self.kafka_producer.flush() + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SelectCollectors(self, request : CollectorFilter, contextgrpc_context: grpc.ServicerContext # type: ignore ) -> CollectorList: # type: ignore LOGGER.info("gRPC message: {:}".format(request)) response = CollectorList() - filter_to_apply = dict() - filter_to_apply['kpi_id'] = request.kpi_id[0].kpi_id.uuid - # filter_to_apply['duration_s'] = request.duration_s[0] + try: - rows = self.managementDBobj.select_with_filter(CollectorModel, **filter_to_apply) + rows = self.tele_db_obj.select_with_filter(CollectorModel, request) except Exception as e: LOGGER.info('Unable to apply filter on kpi descriptor. {:}'.format(e)) try: - if len(rows) != 0: - for row in rows: - collector_obj = Collector() - collector_obj.collector_id.collector_id.uuid = row.collector_id - response.collector_list.append(collector_obj) + for row in rows: + collector_obj = CollectorModel.ConvertRowToCollector(row) + response.collector_list.append(collector_obj) return response except Exception as e: - LOGGER.info('Unable to process response {:}'.format(e)) + LOGGER.info('Unable to process filter response {:}'.format(e)) diff --git a/src/telemetry/frontend/tests/Messages.py b/src/telemetry/frontend/tests/Messages.py index 106c2a5a7..a0e93e8a1 100644 --- a/src/telemetry/frontend/tests/Messages.py +++ b/src/telemetry/frontend/tests/Messages.py @@ -16,67 +16,27 @@ import uuid import random from common.proto import telemetry_frontend_pb2 from common.proto.kpi_sample_types_pb2 import KpiSampleType +from common.proto.kpi_manager_pb2 import KpiId # ----------------------- "2nd" Iteration -------------------------------- def create_collector_id(): _collector_id = telemetry_frontend_pb2.CollectorId() - _collector_id.collector_id.uuid = uuid.uuid4() + # _collector_id.collector_id.uuid = str(uuid.uuid4()) + _collector_id.collector_id.uuid = "5d45f53f-d567-429f-9427-9196ac72ff0c" return _collector_id -# def create_collector_id_a(coll_id_str : str): -# _collector_id = telemetry_frontend_pb2.CollectorId() -# _collector_id.collector_id.uuid = str(coll_id_str) -# return _collector_id - def create_collector_request(): _create_collector_request = telemetry_frontend_pb2.Collector() _create_collector_request.collector_id.collector_id.uuid = str(uuid.uuid4()) _create_collector_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) - # _create_collector_request.collector = "collector description" _create_collector_request.duration_s = float(random.randint(8, 16)) _create_collector_request.interval_s = float(random.randint(2, 4)) return _create_collector_request def create_collector_filter(): _create_collector_filter = telemetry_frontend_pb2.CollectorFilter() - new_kpi_id = _create_collector_filter.kpi_id.add() - new_kpi_id.kpi_id.uuid = "165d20c5-a446-42fa-812f-e2b7ed283c6f" + kpi_id_obj = KpiId() + # kpi_id_obj.kpi_id.uuid = str(uuid.uuid4()) + kpi_id_obj.kpi_id.uuid = "a7237fa3-caf4-479d-84b6-4d9f9738fb7f" + _create_collector_filter.kpi_id.append(kpi_id_obj) return _create_collector_filter - -# ----------------------- "First" Iteration -------------------------------- -# def create_collector_request_a(): -# _create_collector_request_a = telemetry_frontend_pb2.Collector() -# _create_collector_request_a.collector_id.collector_id.uuid = "-1" -# return _create_collector_request_a - -# def create_collector_request_b(str_kpi_id, coll_duration_s, coll_interval_s -# ) -> telemetry_frontend_pb2.Collector: -# _create_collector_request_b = telemetry_frontend_pb2.Collector() -# _create_collector_request_b.collector_id.collector_id.uuid = '1' -# _create_collector_request_b.kpi_id.kpi_id.uuid = str_kpi_id -# _create_collector_request_b.duration_s = coll_duration_s -# _create_collector_request_b.interval_s = coll_interval_s -# return _create_collector_request_b - -# def create_collector_filter(): -# _create_collector_filter = telemetry_frontend_pb2.CollectorFilter() -# new_collector_id = _create_collector_filter.collector_id.add() -# new_collector_id.collector_id.uuid = "COLL1" -# new_kpi_id = _create_collector_filter.kpi_id.add() -# new_kpi_id.kpi_id.uuid = "KPI1" -# new_device_id = _create_collector_filter.device_id.add() -# new_device_id.device_uuid.uuid = 'DEV1' -# new_service_id = _create_collector_filter.service_id.add() -# new_service_id.service_uuid.uuid = 'SERV1' -# new_slice_id = _create_collector_filter.slice_id.add() -# new_slice_id.slice_uuid.uuid = 'SLC1' -# new_endpoint_id = _create_collector_filter.endpoint_id.add() -# new_endpoint_id.endpoint_uuid.uuid = 'END1' -# new_connection_id = _create_collector_filter.connection_id.add() -# new_connection_id.connection_uuid.uuid = 'CON1' -# _create_collector_filter.kpi_sample_type.append(KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED) -# return _create_collector_filter - -# def create_collector_list(): -# _create_collector_list = telemetry_frontend_pb2.CollectorList() -# return _create_collector_list \ No newline at end of file diff --git a/src/telemetry/frontend/tests/test_frontend.py b/src/telemetry/frontend/tests/test_frontend.py index ca2d61370..d967e306a 100644 --- a/src/telemetry/frontend/tests/test_frontend.py +++ b/src/telemetry/frontend/tests/test_frontend.py @@ -19,6 +19,7 @@ import logging # from common.proto.context_pb2 import Empty from common.Constants import ServiceNameEnum from common.proto.telemetry_frontend_pb2 import CollectorId, CollectorList +from common.proto.context_pb2 import Empty from common.Settings import ( get_service_port_grpc, get_env_var_name, ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC) @@ -26,7 +27,7 @@ from common.Settings import ( from telemetry.frontend.client.TelemetryFrontendClient import TelemetryFrontendClient from telemetry.frontend.service.TelemetryFrontendService import TelemetryFrontendService from telemetry.frontend.tests.Messages import ( - create_collector_request, create_collector_filter) + create_collector_request, create_collector_id, create_collector_filter) ########################### @@ -85,6 +86,18 @@ def test_StartCollector(telemetryFrontend_client): LOGGER.debug(str(response)) assert isinstance(response, CollectorId) +def test_StopCollector(telemetryFrontend_client): + LOGGER.info(' >>> test_StopCollector START: <<< ') + response = telemetryFrontend_client.StopCollector(create_collector_id()) + LOGGER.debug(str(response)) + assert isinstance(response, Empty) + +def test_SelectCollectors(telemetryFrontend_client): + LOGGER.info(' >>> test_SelectCollectors START: <<< ') + response = telemetryFrontend_client.SelectCollectors(create_collector_filter()) + LOGGER.debug(str(response)) + assert isinstance(response, CollectorList) + # ------- previous test ---------------- # def test_verify_db_and_table(): -- GitLab From ce7fbb402c47698c74e8ffafcf9f97badb9e73c7 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 8 Aug 2024 13:51:33 +0000 Subject: [PATCH 513/602] Telemetry Backend Re-structuring - BackendService is restructured according to the design in report. - ResponseListener is added in Frontend - Improvements in test and messages files --- .../service/TelemetryBackendService.py | 334 ++++++++---------- .../backend/tests/testTelemetryBackend.py | 30 +- .../TelemetryFrontendServiceServicerImpl.py | 168 +++++---- src/telemetry/frontend/tests/__init__.py | 14 - src/telemetry/frontend/tests/test_frontend.py | 8 + 5 files changed, 243 insertions(+), 311 deletions(-) delete mode 100644 src/telemetry/frontend/tests/__init__.py diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index d81be79db..937409d15 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -12,64 +12,52 @@ # See the License for the specific language governing permissions and # limitations under the License. -import ast +import json import time import random import logging -import requests import threading -from typing import Any, Tuple +from typing import Any, Dict from common.proto.context_pb2 import Empty from confluent_kafka import Producer as KafkaProducer from confluent_kafka import Consumer as KafkaConsumer -from confluent_kafka import KafkaException from confluent_kafka import KafkaError -from confluent_kafka.admin import AdminClient, NewTopic -from common.proto.telemetry_frontend_pb2 import Collector, CollectorId -from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method +from common.tools.kafka.Variables import KafkaConfig, KafkaTopic +from common.method_wrappers.Decorator import MetricsPool + LOGGER = logging.getLogger(__name__) -METRICS_POOL = MetricsPool('Telemetry', 'TelemetryBackend') -KAFKA_SERVER_IP = '127.0.0.1:9092' -# KAFKA_SERVER_IP = '10.152.183.175:30092' -ADMIN_KAFKA_CLIENT = AdminClient({'bootstrap.servers': KAFKA_SERVER_IP}) -KAFKA_TOPICS = {'request' : 'topic_request', 'response': 'topic_response', - 'raw' : 'topic_raw' , 'labeled' : 'topic_labeled'} -EXPORTER_ENDPOINT = "http://10.152.183.2:9100/metrics" -PRODUCER_CONFIG = {'bootstrap.servers': KAFKA_SERVER_IP,} +METRICS_POOL = MetricsPool('TelemetryBackend', 'backendService') +# EXPORTER_ENDPOINT = "http://10.152.183.2:9100/metrics" class TelemetryBackendService: """ - Class to listens for request on Kafka topic, fetches metrics and produces measured values to another Kafka topic. + Class listens for request on Kafka topic, fetches requested metrics from device. + Produces metrics on both RESPONSE and VALUE kafka topics. """ def __init__(self): LOGGER.info('Init TelemetryBackendService') + self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value}) + self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value, + 'group.id' : 'backend', + 'auto.offset.reset' : 'latest'}) self.running_threads = {} - - def run_kafka_listener(self)->bool: - threading.Thread(target=self.kafka_listener).start() - return True - - def kafka_listener(self): + + def RunRequestListener(self)->bool: + threading.Thread(target=self.RequestListener).start() + return True + + def RequestListener(self): """ listener for requests on Kafka topic. """ - conusmer_configs = { - 'bootstrap.servers' : KAFKA_SERVER_IP, - 'group.id' : 'backend', - 'auto.offset.reset' : 'latest' - } - # topic_request = "topic_request" - consumerObj = KafkaConsumer(conusmer_configs) - # consumerObj.subscribe([topic_request]) - consumerObj.subscribe([KAFKA_TOPICS['request']]) - + consumer = self.kafka_consumer + consumer.subscribe([KafkaTopic.REQUEST.value]) while True: - receive_msg = consumerObj.poll(2.0) + receive_msg = consumer.poll(2.0) if receive_msg is None: - # print (time.time(), " - Telemetry backend is listening on Kafka Topic: ", KAFKA_TOPICS['request']) # added for debugging purposes continue elif receive_msg.error(): if receive_msg.error().code() == KafkaError._PARTITION_EOF: @@ -77,177 +65,159 @@ class TelemetryBackendService: else: print("Consumer error: {}".format(receive_msg.error())) break - (kpi_id, duration, interval) = ast.literal_eval(receive_msg.value().decode('utf-8')) + + collector = json.loads(receive_msg.value().decode('utf-8')) collector_id = receive_msg.key().decode('utf-8') - if duration == -1 and interval == -1: - self.terminate_collector_backend(collector_id) - # threading.Thread(target=self.terminate_collector_backend, args=(collector_id)) + LOGGER.debug('Recevied Collector: {:} - {:}'.format(collector_id, collector)) + print('Recevied Collector: {:} - {:}'.format(collector_id, collector)) + + if collector['duration'] == -1 and collector['interval'] == -1: + self.TerminateCollectorBackend(collector_id) else: - self.run_initiate_collector_backend(collector_id, kpi_id, duration, interval) + self.RunInitiateCollectorBackend(collector_id, collector) + def TerminateCollectorBackend(self, collector_id): + if collector_id in self.running_threads: + thread, stop_event = self.running_threads[collector_id] + stop_event.set() + thread.join() + print ("Terminating backend (by StopCollector): Collector Id: ", collector_id) + del self.running_threads[collector_id] + self.GenerateCollectorResponse(collector_id, "-1", -1) # Termination confirmation to frontend. + else: + print ('Backend collector {:} not found'.format(collector_id)) - def run_initiate_collector_backend(self, collector_id: str, kpi_id: str, duration: int, interval: int): + def RunInitiateCollectorBackend(self, collector_id: str, collector: str): stop_event = threading.Event() - thread = threading.Thread(target=self.initiate_collector_backend, - args=(collector_id, kpi_id, duration, interval, stop_event)) + thread = threading.Thread(target=self.InitiateCollectorBackend, + args=(collector_id, collector, stop_event)) self.running_threads[collector_id] = (thread, stop_event) thread.start() - def initiate_collector_backend(self, collector_id, kpi_id, duration, interval, stop_event - ): # type: ignore + def InitiateCollectorBackend(self, collector_id, collector, stop_event): """ - Method to receive collector request attribues and initiates collecter backend. + Method receives collector request and initiates collecter backend. """ print("Initiating backend for collector: ", collector_id) start_time = time.time() while not stop_event.is_set(): - if time.time() - start_time >= duration: # condition to terminate backend + if time.time() - start_time >= collector['duration']: # condition to terminate backend print("Execuation duration completed: Terminating backend: Collector Id: ", collector_id, " - ", time.time() - start_time) - self.generate_kafka_response(collector_id, "-1", -1) - # write to Kafka to send the termination confirmation. + self.GenerateCollectorResponse(collector_id, "-1", -1) # Termination confirmation to frontend. break - # print ("Received KPI: ", kpi_id, ", Duration: ", duration, ", Fetch Interval: ", interval) - self.extract_kpi_value(collector_id, kpi_id) - # print ("Telemetry Backend running for KPI: ", kpi_id, "after FETCH INTERVAL: ", interval) - time.sleep(interval) + self.ExtractKpiValue(collector_id, collector['kpi_id']) + time.sleep(collector['interval']) - def extract_kpi_value(self, collector_id: str, kpi_id: str): + def ExtractKpiValue(self, collector_id: str, kpi_id: str): """ Method to extract kpi value. """ - measured_kpi_value = random.randint(1,100) # Should be extracted from exporter/stream - # measured_kpi_value = self.fetch_node_exporter_metrics() # exporter extracted metric value against default KPI - self.generate_kafka_response(collector_id, kpi_id , measured_kpi_value) + measured_kpi_value = random.randint(1,100) # TODO: To be extracted from a device + print ("Measured Kpi value: {:}".format(measured_kpi_value)) + # measured_kpi_value = self.fetch_node_exporter_metrics() # exporter extracted metric value against default KPI + self.GenerateCollectorResponse(collector_id, kpi_id , measured_kpi_value) - def generate_kafka_response(self, collector_id: str, kpi_id: str, kpi_value: Any): + def GenerateCollectorResponse(self, collector_id: str, kpi_id: str, measured_kpi_value: Any): """ Method to write response on Kafka topic """ - # topic_response = "topic_response" - msg_value : Tuple [str, Any] = (kpi_id, kpi_value) - msg_key = collector_id - producerObj = KafkaProducer(PRODUCER_CONFIG) - # producerObj.produce(topic_response, key=msg_key, value= str(msg_value), callback=self.delivery_callback) - producerObj.produce(KAFKA_TOPICS['response'], key=msg_key, value= str(msg_value), callback=TelemetryBackendService.delivery_callback) - producerObj.flush() - - def terminate_collector_backend(self, collector_id): - if collector_id in self.running_threads: - thread, stop_event = self.running_threads[collector_id] - stop_event.set() - thread.join() - print ("Terminating backend (by StopCollector): Collector Id: ", collector_id) - del self.running_threads[collector_id] - self.generate_kafka_response(collector_id, "-1", -1) - - def create_topic_if_not_exists(self, new_topics: list) -> bool: - """ - Method to create Kafka topic if it does not exist. - Args: - admin_client (AdminClient): Kafka admin client. - """ - for topic in new_topics: - try: - topic_metadata = ADMIN_KAFKA_CLIENT.list_topics(timeout=5) - if topic not in topic_metadata.topics: - # If the topic does not exist, create a new topic - print(f"Topic '{topic}' does not exist. Creating...") - LOGGER.warning("Topic {:} does not exist. Creating...".format(topic)) - new_topic = NewTopic(topic, num_partitions=1, replication_factor=1) - ADMIN_KAFKA_CLIENT.create_topics([new_topic]) - except KafkaException as e: - print(f"Failed to create topic: {e}") - return False - return True + producer = self.kafka_producer + kpi_value : Dict = { + "kpi_id" : kpi_id, + "kpi_value" : measured_kpi_value + } + producer.produce( + KafkaTopic.RESPONSE.value, + key = collector_id, + value = json.dumps(kpi_value), + callback = self.delivery_callback + ) + producer.flush() - @staticmethod - def delivery_callback( err, msg): + def delivery_callback(self, err, msg): """ Callback function to handle message delivery status. - Args: - err (KafkaError): Kafka error object. - msg (Message): Kafka message object. - """ - if err: - print(f'Message delivery failed: {err}') - else: - print(f'Message delivered to topic {msg.topic()}') - -# ----------- BELOW: Actual Implementation of Kafka Producer with Node Exporter ----------- - @staticmethod - def fetch_single_node_exporter_metric(): - """ - Method to fetch metrics from Node Exporter. - Returns: - str: Metrics fetched from Node Exporter. - """ - KPI = "node_network_receive_packets_total" - try: - response = requests.get(EXPORTER_ENDPOINT) # type: ignore - LOGGER.info("Request status {:}".format(response)) - if response.status_code == 200: - # print(f"Metrics fetched sucessfully...") - metrics = response.text - # Check if the desired metric is available in the response - if KPI in metrics: - KPI_VALUE = TelemetryBackendService.extract_metric_value(metrics, KPI) - # Extract the metric value - if KPI_VALUE is not None: - LOGGER.info("Extracted value of {:} is {:}".format(KPI, KPI_VALUE)) - print(f"Extracted value of {KPI} is: {KPI_VALUE}") - return KPI_VALUE - else: - LOGGER.info("Failed to fetch metrics. Status code: {:}".format(response.status_code)) - # print(f"Failed to fetch metrics. Status code: {response.status_code}") - return None - except Exception as e: - LOGGER.info("Failed to fetch metrics. Status code: {:}".format(e)) - # print(f"Failed to fetch metrics: {str(e)}") - return None - - @staticmethod - def extract_metric_value(metrics, metric_name): - """ - Method to extract the value of a metric from the metrics string. - Args: - metrics (str): Metrics string fetched from Exporter. - metric_name (str): Name of the metric to extract. - Returns: - float: Value of the extracted metric, or None if not found. - """ - try: - # Find the metric line containing the desired metric name - metric_line = next(line for line in metrics.split('\n') if line.startswith(metric_name)) - # Split the line to extract the metric value - metric_value = float(metric_line.split()[1]) - return metric_value - except StopIteration: - print(f"Metric '{metric_name}' not found in the metrics.") - return None - - @staticmethod - def stream_node_export_metrics_to_raw_topic(): - try: - while True: - response = requests.get(EXPORTER_ENDPOINT) - # print("Response Status {:} ".format(response)) - # LOGGER.info("Response Status {:} ".format(response)) - try: - if response.status_code == 200: - producerObj = KafkaProducer(PRODUCER_CONFIG) - producerObj.produce(KAFKA_TOPICS['raw'], key="raw", value= str(response.text), callback=TelemetryBackendService.delivery_callback) - producerObj.flush() - LOGGER.info("Produce to topic") - else: - LOGGER.info("Didn't received expected response. Status code: {:}".format(response.status_code)) - print(f"Didn't received expected response. Status code: {response.status_code}") - return None - time.sleep(15) - except Exception as e: - LOGGER.info("Failed to process response. Status code: {:}".format(e)) - return None - except Exception as e: - LOGGER.info("Failed to fetch metrics. Status code: {:}".format(e)) - print(f"Failed to fetch metrics: {str(e)}") - return None -# ----------- ABOVE: Actual Implementation of Kafka Producer with Node Exporter ----------- \ No newline at end of file + Args: err (KafkaError): Kafka error object. + msg (Message): Kafka message object. + """ + if err: print(f'Message delivery failed: {err}') + # else: print(f'Message delivered to topic {msg.topic()}') + +# # ----------- BELOW: Actual Implementation of Kafka Producer with Node Exporter ----------- +# @staticmethod +# def fetch_single_node_exporter_metric(): +# """ +# Method to fetch metrics from Node Exporter. +# Returns: +# str: Metrics fetched from Node Exporter. +# """ +# KPI = "node_network_receive_packets_total" +# try: +# response = requests.get(EXPORTER_ENDPOINT) # type: ignore +# LOGGER.info("Request status {:}".format(response)) +# if response.status_code == 200: +# # print(f"Metrics fetched sucessfully...") +# metrics = response.text +# # Check if the desired metric is available in the response +# if KPI in metrics: +# KPI_VALUE = TelemetryBackendService.extract_metric_value(metrics, KPI) +# # Extract the metric value +# if KPI_VALUE is not None: +# LOGGER.info("Extracted value of {:} is {:}".format(KPI, KPI_VALUE)) +# print(f"Extracted value of {KPI} is: {KPI_VALUE}") +# return KPI_VALUE +# else: +# LOGGER.info("Failed to fetch metrics. Status code: {:}".format(response.status_code)) +# # print(f"Failed to fetch metrics. Status code: {response.status_code}") +# return None +# except Exception as e: +# LOGGER.info("Failed to fetch metrics. Status code: {:}".format(e)) +# # print(f"Failed to fetch metrics: {str(e)}") +# return None + +# @staticmethod +# def extract_metric_value(metrics, metric_name): +# """ +# Method to extract the value of a metric from the metrics string. +# Args: +# metrics (str): Metrics string fetched from Exporter. +# metric_name (str): Name of the metric to extract. +# Returns: +# float: Value of the extracted metric, or None if not found. +# """ +# try: +# # Find the metric line containing the desired metric name +# metric_line = next(line for line in metrics.split('\n') if line.startswith(metric_name)) +# # Split the line to extract the metric value +# metric_value = float(metric_line.split()[1]) +# return metric_value +# except StopIteration: +# print(f"Metric '{metric_name}' not found in the metrics.") +# return None + +# @staticmethod +# def stream_node_export_metrics_to_raw_topic(): +# try: +# while True: +# response = requests.get(EXPORTER_ENDPOINT) +# # print("Response Status {:} ".format(response)) +# # LOGGER.info("Response Status {:} ".format(response)) +# try: +# if response.status_code == 200: +# producerObj = KafkaProducer(PRODUCER_CONFIG) +# producerObj.produce(KAFKA_TOPICS['raw'], key="raw", value= str(response.text), callback=TelemetryBackendService.delivery_callback) +# producerObj.flush() +# LOGGER.info("Produce to topic") +# else: +# LOGGER.info("Didn't received expected response. Status code: {:}".format(response.status_code)) +# print(f"Didn't received expected response. Status code: {response.status_code}") +# return None +# time.sleep(15) +# except Exception as e: +# LOGGER.info("Failed to process response. Status code: {:}".format(e)) +# return None +# except Exception as e: +# LOGGER.info("Failed to fetch metrics. Status code: {:}".format(e)) +# print(f"Failed to fetch metrics: {str(e)}") +# return None +# # ----------- ABOVE: Actual Implementation of Kafka Producer with Node Exporter ----------- \ No newline at end of file diff --git a/src/telemetry/backend/tests/testTelemetryBackend.py b/src/telemetry/backend/tests/testTelemetryBackend.py index d832e54e7..3d7ec82ac 100644 --- a/src/telemetry/backend/tests/testTelemetryBackend.py +++ b/src/telemetry/backend/tests/testTelemetryBackend.py @@ -12,15 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -import sys -print (sys.path) -sys.path.append('/home/tfs/tfs-ctrl') -import threading import logging -from typing import Tuple -# from common.proto.context_pb2 import Empty from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService + LOGGER = logging.getLogger(__name__) @@ -28,26 +23,9 @@ LOGGER = logging.getLogger(__name__) # Tests Implementation of Telemetry Backend ########################### -def test_verify_kafka_topics(): - LOGGER.info('test_verify_kafka_topics requesting') +def test_RunRequestListener(): + LOGGER.info('test_RunRequestListener') TelemetryBackendServiceObj = TelemetryBackendService() - KafkaTopics = ['topic_request', 'topic_response', 'topic_raw', 'topic_labled'] - response = TelemetryBackendServiceObj.create_topic_if_not_exists(KafkaTopics) + response = TelemetryBackendServiceObj.RunRequestListener() LOGGER.debug(str(response)) assert isinstance(response, bool) - -# def test_run_kafka_listener(): -# LOGGER.info('test_receive_kafka_request requesting') -# TelemetryBackendServiceObj = TelemetryBackendService() -# response = TelemetryBackendServiceObj.run_kafka_listener() -# LOGGER.debug(str(response)) -# assert isinstance(response, bool) - -# def test_fetch_node_exporter_metrics(): -# LOGGER.info(' >>> test_fetch_node_exporter_metrics START <<< ') -# TelemetryBackendService.fetch_single_node_exporter_metric() - -def test_stream_node_export_metrics_to_raw_topic(): - LOGGER.info(' >>> test_stream_node_export_metrics_to_raw_topic START <<< ') - threading.Thread(target=TelemetryBackendService.stream_node_export_metrics_to_raw_topic, args=()).start() - diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index 29c192bdf..e6a6d0cd5 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -12,25 +12,25 @@ # See the License for the specific language governing permissions and # limitations under the License. -import ast +import json import threading -from typing import Tuple, Any +from typing import Any, Dict import grpc import logging from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.tools.kafka.Variables import KafkaConfig, KafkaTopic -from confluent_kafka import Consumer as KafkaConsumer -from confluent_kafka import Producer as KafkaProducer -from confluent_kafka import KafkaError - from common.proto.context_pb2 import Empty - from common.proto.telemetry_frontend_pb2 import CollectorId, Collector, CollectorFilter, CollectorList from common.proto.telemetry_frontend_pb2_grpc import TelemetryFrontendServiceServicer + from telemetry.database.TelemetryModel import Collector as CollectorModel from telemetry.database.Telemetry_DB import TelemetryDB +from confluent_kafka import Consumer as KafkaConsumer +from confluent_kafka import Producer as KafkaProducer +from confluent_kafka import KafkaError + LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('TelemetryFrontend', 'NBIgRPC') @@ -46,8 +46,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): 'group.id' : 'frontend', 'auto.offset.reset' : 'latest'}) - # --->>> SECTION: StartCollector with all helper methods <<<--- - + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StartCollector(self, request : Collector, grpc_context: grpc.ServicerContext # type: ignore @@ -55,101 +54,35 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): LOGGER.info ("gRPC message: {:}".format(request)) response = CollectorId() - # TODO: Verify the presence of Kpi ID in KpiDB or assume that KPI ID already exists. + # TODO: Verify the presence of Kpi ID in KpiDB or assume that KPI ID already exists? self.tele_db_obj.add_row_to_db( CollectorModel.ConvertCollectorToRow(request) ) - self.PublishRequestOnKafka(request) + self.PublishStartRequestOnKafka(request) - response.collector_id.uuid = request.collector_id.collector_id.uuid # type: ignore + response.collector_id.uuid = request.collector_id.collector_id.uuid return response - def PublishRequestOnKafka(self, collector_obj): + def PublishStartRequestOnKafka(self, collector_obj): """ Method to generate collector request on Kafka. """ collector_uuid = collector_obj.collector_id.collector_id.uuid - collector_to_generate : Tuple [str, int, int] = ( - collector_obj.kpi_id.kpi_id.uuid, - collector_obj.duration_s, - collector_obj.interval_s - ) + collector_to_generate : Dict = { + "kpi_id" : collector_obj.kpi_id.kpi_id.uuid, + "duration": collector_obj.duration_s, + "interval": collector_obj.interval_s + } self.kafka_producer.produce( KafkaTopic.REQUEST.value, key = collector_uuid, - value = str(collector_to_generate), + value = json.dumps(collector_to_generate), callback = self.delivery_callback ) LOGGER.info("Collector Request Generated: Collector Id: {:}, Value: {:}".format(collector_uuid, collector_to_generate)) ACTIVE_COLLECTORS.append(collector_uuid) self.kafka_producer.flush() - - def run_kafka_listener(self): - # print ("--- STARTED: run_kafka_listener ---") - threading.Thread(target=self.kafka_listener).start() - return True - - def kafka_listener(self): - """ - listener for response on Kafka topic. - """ - # # print ("--- STARTED: kafka_listener ---") - # conusmer_configs = { - # 'bootstrap.servers' : KAFKA_SERVER_IP, - # 'group.id' : 'frontend', - # 'auto.offset.reset' : 'latest' - # } - # # topic_response = "topic_response" - - # consumerObj = KafkaConsumer(conusmer_configs) - self.kafka_consumer.subscribe([KAFKA_TOPICS['response']]) - # print (time.time()) - while True: - receive_msg = self.kafka_consumer.poll(2.0) - if receive_msg is None: - # print (" - Telemetry frontend listening on Kafka Topic: ", KAFKA_TOPICS['response']) # added for debugging purposes - continue - elif receive_msg.error(): - if receive_msg.error().code() == KafkaError._PARTITION_EOF: - continue - else: - print("Consumer error: {}".format(receive_msg.error())) - break - try: - collector_id = receive_msg.key().decode('utf-8') - if collector_id in ACTIVE_COLLECTORS: - (kpi_id, kpi_value) = ast.literal_eval(receive_msg.value().decode('utf-8')) - self.process_response(collector_id, kpi_id, kpi_value) - else: - print(f"collector id does not match.\nRespone ID: '{collector_id}' --- Active IDs: '{ACTIVE_COLLECTORS}' ") - except Exception as e: - print(f"No message key found: {str(e)}") - continue - # return None - def process_response(self, collector_id: str, kpi_id: str, kpi_value: Any): - if kpi_id == "-1" and kpi_value == -1: - # LOGGER.info("Sucessfully terminated Collector: {:}".format(collector_id)) - print ("Sucessfully terminated Collector: ", collector_id) - else: - print ("Frontend-Received values Collector Id:", collector_id, "-KPI:", kpi_id, "-VALUE:", kpi_value) - - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) - def delivery_callback(self, err, msg): - """ - Callback function to handle message delivery status. - Args: - err (KafkaError): Kafka error object. - msg (Message): Kafka message object. - """ - if err: - LOGGER.debug('Message delivery failed: {:}'.format(err)) - print('Message delivery failed: {:}'.format(err)) - else: - LOGGER.debug('Message delivered to topic {:}'.format(msg.topic())) - print('Message delivered to topic {:}'.format(msg.topic())) - - # <<<--- SECTION: StopCollector with all helper methods --->>> @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StopCollector(self, @@ -164,13 +97,15 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): Method to generate stop collector request on Kafka. """ collector_uuid = collector_id.collector_id.uuid - collector_to_stop : Tuple [str, int, int] = ( - collector_uuid , -1, -1 - ) + collector_to_stop : Dict = { + "kpi_id" : collector_uuid, + "duration": -1, + "interval": -1 + } self.kafka_producer.produce( KafkaTopic.REQUEST.value, key = collector_uuid, - value = str(collector_to_stop), + value = json.dumps(collector_to_stop), callback = self.delivery_callback ) LOGGER.info("Collector Stop Request Generated: Collector Id: {:}, Value: {:}".format(collector_uuid, collector_to_stop)) @@ -180,6 +115,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): LOGGER.warning('Collector ID {:} not found in active collector list'.format(collector_uuid)) self.kafka_producer.flush() + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SelectCollectors(self, request : CollectorFilter, contextgrpc_context: grpc.ServicerContext # type: ignore @@ -199,3 +135,57 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): except Exception as e: LOGGER.info('Unable to process filter response {:}'.format(e)) + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def delivery_callback(self, err, msg): + """ + Callback function to handle message delivery status. + Args: + err (KafkaError): Kafka error object. + msg (Message): Kafka message object. + """ + if err: + LOGGER.debug('Message delivery failed: {:}'.format(err)) + print('Message delivery failed: {:}'.format(err)) + # else: + # LOGGER.debug('Message delivered to topic {:}'.format(msg.topic())) + # print('Message delivered to topic {:}'.format(msg.topic())) + + # ---------- Independent Method --------------- + # Listener method is independent of any method (same lifetime as service) + # continously listens for responses + def RunResponseListener(self): + threading.Thread(target=self.ResponseListener).start() + return True + + def ResponseListener(self): + """ + listener for response on Kafka topic. + """ + self.kafka_consumer.subscribe([KafkaTopic.RESPONSE.value]) + while True: + receive_msg = self.kafka_consumer.poll(2.0) + if receive_msg is None: + continue + elif receive_msg.error(): + if receive_msg.error().code() == KafkaError._PARTITION_EOF: + continue + else: + print("Consumer error: {}".format(receive_msg.error())) + break + try: + collector_id = receive_msg.key().decode('utf-8') + if collector_id in ACTIVE_COLLECTORS: + kpi_value = json.loads(receive_msg.value().decode('utf-8')) + self.process_response(collector_id, kpi_value['kpi_id'], kpi_value['kpi_value']) + else: + print(f"collector id does not match.\nRespone ID: '{collector_id}' --- Active IDs: '{ACTIVE_COLLECTORS}' ") + except Exception as e: + print(f"Error extarcting msg key or value: {str(e)}") + continue + + def process_response(self, collector_id: str, kpi_id: str, kpi_value: Any): + if kpi_id == "-1" and kpi_value == -1: + print ("Backend termination confirmation for collector id: ", collector_id) + else: + print ("KPI Value: Collector Id:", collector_id, ", Kpi Id:", kpi_id, ", Value:", kpi_value) diff --git a/src/telemetry/frontend/tests/__init__.py b/src/telemetry/frontend/tests/__init__.py deleted file mode 100644 index 3ee6f7071..000000000 --- a/src/telemetry/frontend/tests/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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/telemetry/frontend/tests/test_frontend.py b/src/telemetry/frontend/tests/test_frontend.py index d967e306a..3f8f3ebc8 100644 --- a/src/telemetry/frontend/tests/test_frontend.py +++ b/src/telemetry/frontend/tests/test_frontend.py @@ -28,6 +28,7 @@ from telemetry.frontend.client.TelemetryFrontendClient import TelemetryFrontendC from telemetry.frontend.service.TelemetryFrontendService import TelemetryFrontendService from telemetry.frontend.tests.Messages import ( create_collector_request, create_collector_id, create_collector_filter) +from telemetry.frontend.service.TelemetryFrontendServiceServicerImpl import TelemetryFrontendServiceServicerImpl ########################### @@ -98,6 +99,13 @@ def test_SelectCollectors(telemetryFrontend_client): LOGGER.debug(str(response)) assert isinstance(response, CollectorList) +def test_RunResponseListener(): + LOGGER.info(' >>> test_RunResponseListener START: <<< ') + TelemetryFrontendServiceObj = TelemetryFrontendServiceServicerImpl() + response = TelemetryFrontendServiceObj.RunResponseListener() # becasue Method "run_kafka_listener" is not define in frontend.proto + LOGGER.debug(str(response)) + assert isinstance(response, bool) + # ------- previous test ---------------- # def test_verify_db_and_table(): -- GitLab From df455e9164011098b8c664bd86dd63f421d41c1d Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 8 Aug 2024 14:23:29 +0000 Subject: [PATCH 514/602] Telemetry Backend Service - GenerateRawMetrics() add --- .../backend/service/TelemetryBackendService.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 937409d15..048474d93 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -119,7 +119,7 @@ class TelemetryBackendService: def GenerateCollectorResponse(self, collector_id: str, kpi_id: str, measured_kpi_value: Any): """ - Method to write response on Kafka topic + Method to write kpi value on RESPONSE Kafka topic """ producer = self.kafka_producer kpi_value : Dict = { @@ -134,6 +134,22 @@ class TelemetryBackendService: ) producer.flush() + def GenerateRawMetric(self, metrics: Any): + """ + Method writes raw metrics on VALUE Kafka topic + """ + producer = self.kafka_producer + some_metric : Dict = { + "some_id" : metrics + } + producer.produce( + KafkaTopic.VALUE.value, + key = 'raw', + value = json.dumps(some_metric), + callback = self.delivery_callback + ) + producer.flush() + def delivery_callback(self, err, msg): """ Callback function to handle message delivery status. -- GitLab From 706d284c9287700000ecc24852d35f60595f8196 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 8 Aug 2024 15:20:06 +0000 Subject: [PATCH 515/602] Changes in Telemetry backend service. - __main__ is added. - DockerFile added. - .gitlab-ci.yml file added. --- .gitlab-ci.yml | 3 +- src/telemetry/.gitlab-ci.yml | 142 +++++++++++++++++++++ src/telemetry/backend/Dockerfile | 69 ++++++++++ src/telemetry/backend/requirements.in | 15 +++ src/telemetry/backend/service/__main__.py | 51 ++++++++ src/telemetry/frontend/Dockerfile | 69 ++++++++++ src/telemetry/frontend/requirements.in | 15 +++ src/telemetry/frontend/service/__main__.py | 39 ++---- src/telemetry/telemetry_virenv.txt | 49 ------- 9 files changed, 372 insertions(+), 80 deletions(-) create mode 100644 src/telemetry/.gitlab-ci.yml create mode 100644 src/telemetry/backend/Dockerfile create mode 100644 src/telemetry/backend/requirements.in create mode 100644 src/telemetry/backend/service/__main__.py create mode 100644 src/telemetry/frontend/Dockerfile create mode 100644 src/telemetry/frontend/requirements.in delete mode 100644 src/telemetry/telemetry_virenv.txt diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0c5ff9325..42292dc37 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -48,6 +48,7 @@ include: - local: '/src/kpi_manager/.gitlab-ci.yml' - local: '/src/kpi_value_api/.gitlab-ci.yml' - local: '/src/kpi_value_writer/.gitlab-ci.yml' - + # - local: '/src/telemetry/frontend/.gitlab-ci.yml' + # - local: '/src/telemetry/backend/.gitlab-ci.yml' # This should be last one: end-to-end integration tests - local: '/src/tests/.gitlab-ci.yml' diff --git a/src/telemetry/.gitlab-ci.yml b/src/telemetry/.gitlab-ci.yml new file mode 100644 index 000000000..d2e7e8cf3 --- /dev/null +++ b/src/telemetry/.gitlab-ci.yml @@ -0,0 +1,142 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +# Build, tag, and push the Docker image to the GitLab Docker registry +build kpi-manager: + variables: + IMAGE_NAME: 'telemetry' # name of the microservice + IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) + stage: build + before_script: + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + script: + - docker buildx build -t "${IMAGE_NAME}-frontend:$IMAGE_TAG" -f ./src/$IMAGE_NAME/frontend/Dockerfile . + - docker buildx build -t "${IMAGE_NAME}-backend:$IMAGE_TAG" -f ./src/$IMAGE_NAME/backend/Dockerfile . + - docker tag "${IMAGE_NAME}-frontend:$IMAGE_TAG" "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-frontend:$IMAGE_TAG" + - docker tag "${IMAGE_NAME}-backend:$IMAGE_TAG" "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-backend:$IMAGE_TAG" + - docker push "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-frontend:$IMAGE_TAG" + - docker push "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-backend:$IMAGE_TAG" + after_script: + - docker images --filter="dangling=true" --quiet | xargs -r docker rmi + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' + - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' + - changes: + - src/common/**/*.py + - proto/*.proto + - src/$IMAGE_NAME/frontend/**/*.{py,in,yml} + - src/$IMAGE_NAME/frontend/Dockerfile + - src/$IMAGE_NAME/frontend/tests/*.py + - src/$IMAGE_NAME/backend/Dockerfile + - src/$IMAGE_NAME/backend/**/*.{py,in,yml} + - src/$IMAGE_NAME/backend/tests/*.py + - manifests/${IMAGE_NAME}service.yaml + - .gitlab-ci.yml + +# Apply unit test to the component +unit_test telemetry: + variables: + IMAGE_NAME: 'telemetry' # name of the microservice + IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) + stage: unit_test + needs: + - build telemetry + before_script: + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi + - if docker container ls | grep crdb; then docker rm -f crdb; else echo "CockroachDB container is not in the system"; fi + - if docker volume ls | grep crdb; then docker volume rm -f crdb; else echo "CockroachDB volume is not in the system"; fi + - if docker container ls | grep ${IMAGE_NAME}-frontend; then docker rm -f ${IMAGE_NAME}-frontend; else echo "${IMAGE_NAME}-frontend container is not in the system"; fi + - if docker container ls | grep ${IMAGE_NAME}-backend; then docker rm -f ${IMAGE_NAME}-backend; else echo "${IMAGE_NAME}-backend container is not in the system"; fi + - docker container prune -f + script: + - docker pull "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-backend:$IMAGE_TAG" + - docker pull "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-frontend:$IMAGE_TAG" + - docker pull "cockroachdb/cockroach:latest-v22.2" + - docker volume create crdb + - > + docker run --name crdb -d --network=teraflowbridge -p 26257:26257 -p 8080:8080 + --env COCKROACH_DATABASE=tfs_test --env COCKROACH_USER=tfs --env COCKROACH_PASSWORD=tfs123 + --volume "crdb:/cockroach/cockroach-data" + cockroachdb/cockroach:latest-v22.2 start-single-node + - echo "Waiting for initialization..." + - while ! docker logs crdb 2>&1 | grep -q 'finished creating default user \"tfs\"'; do sleep 1; done + - docker logs crdb + - docker ps -a + - CRDB_ADDRESS=$(docker inspect crdb --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") + - echo $CRDB_ADDRESS + - > + docker run --name $IMAGE_NAME -d -p 30010:30010 + --env "CRDB_URI=cockroachdb://tfs:tfs123@${CRDB_ADDRESS}:26257/tfs_test?sslmode=require" + --volume "$PWD/src/$IMAGE_NAME/tests:/opt/results" + --network=teraflowbridge + $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG + - docker ps -a + - sleep 5 + - docker logs $IMAGE_NAME + - > + docker exec -i $IMAGE_NAME bash -c + "coverage run -m pytest --log-level=INFO --verbose --junitxml=/opt/results/${IMAGE_NAME}_report.xml $IMAGE_NAME/tests/test_*.py" + - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing" + coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' + after_script: + - docker volume rm -f crdb + - docker network rm teraflowbridge + - docker volume prune --force + - docker image prune --force + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' + - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' + - changes: + - src/common/**/*.py + - proto/*.proto + - src/$IMAGE_NAME/**/*.{py,in,yml} + - src/$IMAGE_NAME/frontend/Dockerfile + - src/$IMAGE_NAME/frontend/tests/*.py + - src/$IMAGE_NAME/frontend/tests/Dockerfile + - src/$IMAGE_NAME/backend/Dockerfile + - src/$IMAGE_NAME/backend/tests/*.py + - src/$IMAGE_NAME/backend/tests/Dockerfile + - manifests/${IMAGE_NAME}service.yaml + - .gitlab-ci.yml + # artifacts: + # when: always + # reports: + # junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml + +## Deployment of the service in Kubernetes Cluster +#deploy context: +# variables: +# IMAGE_NAME: 'context' # name of the microservice +# IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) +# stage: deploy +# needs: +# - unit test context +# # - integ_test execute +# script: +# - 'sed -i "s/$IMAGE_NAME:.*/$IMAGE_NAME:$IMAGE_TAG/" manifests/${IMAGE_NAME}service.yaml' +# - kubectl version +# - kubectl get all +# - kubectl apply -f "manifests/${IMAGE_NAME}service.yaml" +# - kubectl get all +# # environment: +# # name: test +# # url: https://example.com +# # kubernetes: +# # namespace: test +# rules: +# - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' +# when: manual +# - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' +# when: manual diff --git a/src/telemetry/backend/Dockerfile b/src/telemetry/backend/Dockerfile new file mode 100644 index 000000000..eebfe24ab --- /dev/null +++ b/src/telemetry/backend/Dockerfile @@ -0,0 +1,69 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +FROM python:3.9-slim + +# Install dependencies +RUN apt-get --yes --quiet --quiet update && \ + apt-get --yes --quiet --quiet install wget g++ git && \ + rm -rf /var/lib/apt/lists/* + +# Set Python to show logs as they occur +ENV PYTHONUNBUFFERED=0 + +# Download the gRPC health probe +RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \ + chmod +x /bin/grpc_health_probe + +# Get generic Python packages +RUN python3 -m pip install --upgrade pip +RUN python3 -m pip install --upgrade setuptools wheel +RUN python3 -m pip install --upgrade pip-tools + +# Get common Python packages +# Note: this step enables sharing the previous Docker build steps among all the Python components +WORKDIR /var/teraflow +COPY common_requirements.in common_requirements.in +RUN pip-compile --quiet --output-file=common_requirements.txt common_requirements.in +RUN python3 -m pip install -r common_requirements.txt + +# Add common files into working directory +WORKDIR /var/teraflow/common +COPY src/common/. ./ +RUN rm -rf proto + +# Create proto sub-folder, copy .proto files, and generate Python code +RUN mkdir -p /var/teraflow/common/proto +WORKDIR /var/teraflow/common/proto +RUN touch __init__.py +COPY proto/*.proto ./ +RUN python3 -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. *.proto +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/telemetry/backend +WORKDIR /var/teraflow/telemetry/backend +COPY src/telemetry/backend/requirements.in requirements.in +RUN pip-compile --quiet --output-file=requirements.txt requirements.in +RUN python3 -m pip install -r requirements.txt + +# Add component files into working directory +WORKDIR /var/teraflow +COPY src/telemetry/__init__.py telemetry/__init__.py +COPY src/telemetry/backend/. telemetry/backend/ + +# Start the service +ENTRYPOINT ["python", "-m", "telemetry.backend.service"] diff --git a/src/telemetry/backend/requirements.in b/src/telemetry/backend/requirements.in new file mode 100644 index 000000000..e6a559be7 --- /dev/null +++ b/src/telemetry/backend/requirements.in @@ -0,0 +1,15 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +confluent-kafka==2.3.* diff --git a/src/telemetry/backend/service/__main__.py b/src/telemetry/backend/service/__main__.py new file mode 100644 index 000000000..4ad867331 --- /dev/null +++ b/src/telemetry/backend/service/__main__.py @@ -0,0 +1,51 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging, signal, sys, threading +from common.Settings import get_log_level +from .TelemetryBackendService import TelemetryBackendService + +terminate = threading.Event() +LOGGER = None + +def signal_handler(signal, frame): # pylint: disable=redefined-outer-name + LOGGER.warning('Terminate signal received') + terminate.set() + +def main(): + global LOGGER # pylint: disable=global-statement + + log_level = get_log_level() + logging.basicConfig(level=log_level) + LOGGER = logging.getLogger(__name__) + + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + + LOGGER.debug('Starting...') + + grpc_service = TelemetryBackendService() + grpc_service.start() + + # Wait for Ctrl+C or termination signal + while not terminate.wait(timeout=1.0): pass + + LOGGER.debug('Terminating...') + grpc_service.stop() + + LOGGER.debug('Bye') + return 0 + +if __name__ == '__main__': + sys.exit(main()) diff --git a/src/telemetry/frontend/Dockerfile b/src/telemetry/frontend/Dockerfile new file mode 100644 index 000000000..0c3e1a66a --- /dev/null +++ b/src/telemetry/frontend/Dockerfile @@ -0,0 +1,69 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +FROM python:3.9-slim + +# Install dependencies +RUN apt-get --yes --quiet --quiet update && \ + apt-get --yes --quiet --quiet install wget g++ git && \ + rm -rf /var/lib/apt/lists/* + +# Set Python to show logs as they occur +ENV PYTHONUNBUFFERED=0 + +# Download the gRPC health probe +RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \ + chmod +x /bin/grpc_health_probe + +# Get generic Python packages +RUN python3 -m pip install --upgrade pip +RUN python3 -m pip install --upgrade setuptools wheel +RUN python3 -m pip install --upgrade pip-tools + +# Get common Python packages +# Note: this step enables sharing the previous Docker build steps among all the Python components +WORKDIR /var/teraflow +COPY common_requirements.in common_requirements.in +RUN pip-compile --quiet --output-file=common_requirements.txt common_requirements.in +RUN python3 -m pip install -r common_requirements.txt + +# Add common files into working directory +WORKDIR /var/teraflow/common +COPY src/common/. ./ +RUN rm -rf proto + +# Create proto sub-folder, copy .proto files, and generate Python code +RUN mkdir -p /var/teraflow/common/proto +WORKDIR /var/teraflow/common/proto +RUN touch __init__.py +COPY proto/*.proto ./ +RUN python3 -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. *.proto +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/telemetry/frontend +WORKDIR /var/teraflow/telemetry/frontend +COPY src/telemetry/frontend/requirements.in requirements.in +RUN pip-compile --quiet --output-file=requirements.txt requirements.in +RUN python3 -m pip install -r requirements.txt + +# Add component files into working directory +WORKDIR /var/teraflow +COPY src/telemetry/__init__.py telemetry/__init__.py +COPY src/telemetry/frontend/. telemetry/frontend/ + +# Start the service +ENTRYPOINT ["python", "-m", "telemetry.frontend.service"] diff --git a/src/telemetry/frontend/requirements.in b/src/telemetry/frontend/requirements.in new file mode 100644 index 000000000..e6a559be7 --- /dev/null +++ b/src/telemetry/frontend/requirements.in @@ -0,0 +1,15 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +confluent-kafka==2.3.* diff --git a/src/telemetry/frontend/service/__main__.py b/src/telemetry/frontend/service/__main__.py index 3b0263706..238619f2e 100644 --- a/src/telemetry/frontend/service/__main__.py +++ b/src/telemetry/frontend/service/__main__.py @@ -12,16 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -import signal -import sys -import logging, threading -from prometheus_client import start_http_server -from monitoring.service.NameMapping import NameMapping +import logging, signal, sys, threading +from common.Settings import get_log_level from .TelemetryFrontendService import TelemetryFrontendService -from monitoring.service.EventTools import EventsDeviceCollector -from common.Settings import ( - get_log_level, wait_for_environment_variables, get_env_var_name, - get_metrics_port ) terminate = threading.Event() LOGGER = None @@ -31,42 +24,28 @@ def signal_handler(signal, frame): # pylint: disable=redefined-outer-name terminate.set() def main(): - global LOGGER + global LOGGER # pylint: disable=global-statement log_level = get_log_level() - logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") + logging.basicConfig(level=log_level) LOGGER = logging.getLogger(__name__) -# ------- will be added later -------------- - # wait_for_environment_variables([ - # get_env_var_name - - - # ]) -# ------- will be added later -------------- - signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) - LOGGER.info('Starting...') - - # Start metrics server - metrics_port = get_metrics_port() - start_http_server(metrics_port) - - name_mapping = NameMapping() + LOGGER.debug('Starting...') - grpc_service = TelemetryFrontendService(name_mapping) + grpc_service = TelemetryFrontendService() grpc_service.start() # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=1.0): pass - LOGGER.info('Terminating...') + LOGGER.debug('Terminating...') grpc_service.stop() - LOGGER.info('Bye') + LOGGER.debug('Bye') return 0 if __name__ == '__main__': - sys.exit(main()) \ No newline at end of file + sys.exit(main()) diff --git a/src/telemetry/telemetry_virenv.txt b/src/telemetry/telemetry_virenv.txt deleted file mode 100644 index e39f80b65..000000000 --- a/src/telemetry/telemetry_virenv.txt +++ /dev/null @@ -1,49 +0,0 @@ -anytree==2.8.0 -APScheduler==3.10.1 -attrs==23.2.0 -certifi==2024.2.2 -charset-normalizer==2.0.12 -colorama==0.4.6 -confluent-kafka==2.3.0 -coverage==6.3 -future-fstrings==1.2.0 -greenlet==3.0.3 -grpcio==1.47.5 -grpcio-health-checking==1.47.5 -grpcio-tools==1.47.5 -grpclib==0.4.4 -h2==4.1.0 -hpack==4.0.0 -hyperframe==6.0.1 -idna==3.7 -influx-line-protocol==0.1.4 -iniconfig==2.0.0 -kafka-python==2.0.2 -multidict==6.0.5 -networkx==3.3 -packaging==24.0 -pluggy==1.5.0 -prettytable==3.5.0 -prometheus-client==0.13.0 -protobuf==3.20.3 -psycopg2-binary==2.9.3 -py==1.11.0 -py-cpuinfo==9.0.0 -pytest==6.2.5 -pytest-benchmark==3.4.1 -pytest-depends==1.0.1 -python-dateutil==2.8.2 -python-json-logger==2.0.2 -pytz==2024.1 -questdb==1.0.1 -requests==2.27.1 -six==1.16.0 -SQLAlchemy==1.4.52 -sqlalchemy-cockroachdb==1.4.4 -SQLAlchemy-Utils==0.38.3 -toml==0.10.2 -typing_extensions==4.12.0 -tzlocal==5.2 -urllib3==1.26.18 -wcwidth==0.2.13 -xmltodict==0.12.0 -- GitLab From 466fd377d23f5931be7a033bb56e2d3943e77a11 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 9 Aug 2024 07:37:32 +0000 Subject: [PATCH 516/602] Kafka deployment script in gitlab-ci.file - In Kafka.variables files: get_kafka_address() and get_admin_client() is added. - In KpiValueApiServerImpl Kafka Admin Client call is updated. - Kafka deployment script is added. --- scripts/run_tests_locally-kpi-value-API.sh | 3 ++- src/common/tools/kafka/Variables.py | 27 +++++++++++++------ src/kpi_value_api/.gitlab-ci.yml | 22 ++++++++++++++- .../service/KpiValueApiServiceServicerImpl.py | 2 +- 4 files changed, 43 insertions(+), 11 deletions(-) diff --git a/scripts/run_tests_locally-kpi-value-API.sh b/scripts/run_tests_locally-kpi-value-API.sh index 8dfbfb162..3953d2a89 100755 --- a/scripts/run_tests_locally-kpi-value-API.sh +++ b/scripts/run_tests_locally-kpi-value-API.sh @@ -19,7 +19,8 @@ PROJECTDIR=`pwd` cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc - +KAFKA_IP=$(docker inspect kafka --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") +KFK_SERVER_ADDRESS=${KAFKA_IP}:9092 # helpful pytest flags: --log-level=INFO -o log_cli=true --verbose --maxfail=1 --durations=0 python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG -o log_cli=true --verbose \ kpi_value_api/tests/test_kpi_value_api.py diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 168957a26..1abbe7d7e 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -20,16 +20,27 @@ from common.Settings import get_setting LOGGER = logging.getLogger(__name__) +KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' class KafkaConfig(Enum): - KFK_SERVER_ADDRESS_TEMPLATE = 'kafka-service.{:s}.svc.cluster.local:{:s}' - KFK_NAMESPACE = 'kafka' - # KFK_NAMESPACE = get_setting('KFK_NAMESPACE') - KFK_PORT = '9092' - # KFK_PORT = get_setting('KFK_SERVER_PORT') - # SERVER_ADDRESS = "127.0.0.1:9092" - SERVER_ADDRESS = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) - ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) + + @staticmethod + def get_kafka_address() -> str: + kafka_server_address = get_setting('KFK_SERVER_ADDRESS', default=None) + if kafka_server_address is None: + KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = get_setting('KFK_SERVER_PORT') + SERVER_ADDRESS = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) + return SERVER_ADDRESS + + @staticmethod + def get_admin_client(): + SERVER_ADDRESS = KafkaConfig.get_kafka_address() + LOGGER.debug("KAFKA_SERVER_ADDRESS {:}".format(SERVER_ADDRESS)) + # SERVER_ADDRESS = "127.0.0.1:9092" + ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) + return ADMIN_CLIENT + class KafkaTopic(Enum): REQUEST = 'topic_request' diff --git a/src/kpi_value_api/.gitlab-ci.yml b/src/kpi_value_api/.gitlab-ci.yml index 166e9d3cb..1919f0361 100644 --- a/src/kpi_value_api/.gitlab-ci.yml +++ b/src/kpi_value_api/.gitlab-ci.yml @@ -50,10 +50,30 @@ unit_test kpi-value-api: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi - if docker container ls | grep $IMAGE_NAME; then docker rm -f $IMAGE_NAME; else echo "$IMAGE_NAME container is not in the system"; fi + - if docker container ls | grep kafka; then docker rm -f kafka; else echo "Kafka container is not in the system"; fi + - if docker container ls | grep zookeeper; then docker rm -f zookeeper; else echo "Zookeeper container is not in the system"; fi - docker container prune -f script: - docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG" - - docker run --name $IMAGE_NAME -d -p 30020:30020 -v "$PWD/src/$IMAGE_NAME/tests:/opt/results" --network=teraflowbridge $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG + - docker pull "bitnami/zookeeper:latest" + - docker pull "bitnami/kafka:latest" + - > + docker run --name zookeeper -d --network=teraflowbridge -p 2181:2181 + bitnami/zookeeper:latest + - sleep 10 # Wait for Zookeeper to start + - docker run --name kafka -d --network=teraflowbridge -p 9092:9092 + --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 + --env ALLOW_PLAINTEXT_LISTENER=yes + bitnami/kafka:latest + - sleep 20 # Wait for Kafka to start + - KAFKA_IP=$(docker inspect kafka --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") + - echo $KAFKA_IP + - > + docker run --name $IMAGE_NAME -d -p 30020:30020 + --env "KFK_SERVER_ADDRESS=${KAFKA_IP}:9092" + --volume "$PWD/src/$IMAGE_NAME/tests:/opt/results" + --network=teraflowbridge + $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG - sleep 5 - docker ps -a - docker logs $IMAGE_NAME diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index 5e7c3d139..05ab63fdf 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -43,7 +43,7 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): ) -> Empty: LOGGER.debug('StoreKpiValues: Received gRPC message object: {:}'.format(request)) producer_obj = KafkaProducer({ - 'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value + 'bootstrap.servers' : KafkaConfig.get_admin_client() }) for kpi_value in request.kpi_value_list: kpi_value_to_produce : Tuple [str, Any, Any] = ( -- GitLab From b53a76a56b4d9e662ce14149ca22706cdb092566 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 9 Aug 2024 08:06:23 +0000 Subject: [PATCH 517/602] Kafka deployment script in gitlab-ci.file (2) - Improvements in Kafka.variables files. - In KpiValueApiServiceImpl corrected the call from "admin_client()" to "kafka_address()" --- src/common/tools/kafka/Variables.py | 16 +++++++--------- .../service/KpiValueApiServiceServicerImpl.py | 2 +- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 1abbe7d7e..9d42f1550 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -28,16 +28,14 @@ class KafkaConfig(Enum): def get_kafka_address() -> str: kafka_server_address = get_setting('KFK_SERVER_ADDRESS', default=None) if kafka_server_address is None: - KFK_NAMESPACE = get_setting('KFK_NAMESPACE') - KFK_PORT = get_setting('KFK_SERVER_PORT') - SERVER_ADDRESS = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) - return SERVER_ADDRESS + KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = get_setting('KFK_SERVER_PORT') + kafka_server_address = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) + return kafka_server_address @staticmethod def get_admin_client(): SERVER_ADDRESS = KafkaConfig.get_kafka_address() - LOGGER.debug("KAFKA_SERVER_ADDRESS {:}".format(SERVER_ADDRESS)) - # SERVER_ADDRESS = "127.0.0.1:9092" ADMIN_CLIENT = AdminClient({'bootstrap.servers': SERVER_ADDRESS }) return ADMIN_CLIENT @@ -55,7 +53,7 @@ class KafkaTopic(Enum): Method to create Kafka topics defined as class members """ all_topics = [member.value for member in KafkaTopic] - LOGGER.debug("Kafka server address is: {:} ".format(KafkaConfig.SERVER_ADDRESS.value)) + LOGGER.debug("Kafka server address is: {:} ".format(KafkaConfig.get_kafka_address())) if( KafkaTopic.create_new_topic_if_not_exists( all_topics )): LOGGER.debug("All topics are created sucsessfully") return True @@ -73,14 +71,14 @@ class KafkaTopic(Enum): LOGGER.debug("Topics names to be verified and created: {:}".format(new_topics)) for topic in new_topics: try: - topic_metadata = KafkaConfig.ADMIN_CLIENT.value.list_topics(timeout=5) + topic_metadata = KafkaConfig.get_admin_client().list_topics(timeout=5) # LOGGER.debug("Existing topic list: {:}".format(topic_metadata.topics)) if topic not in topic_metadata.topics: # If the topic does not exist, create a new topic print("Topic {:} does not exist. Creating...".format(topic)) LOGGER.debug("Topic {:} does not exist. Creating...".format(topic)) new_topic = NewTopic(topic, num_partitions=1, replication_factor=1) - KafkaConfig.ADMIN_CLIENT.value.create_topics([new_topic]) + KafkaConfig.get_admin_client().create_topics([new_topic]) else: print("Topic name already exists: {:}".format(topic)) LOGGER.debug("Topic name already exists: {:}".format(topic)) diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index 05ab63fdf..3df8dd5b6 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -43,7 +43,7 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): ) -> Empty: LOGGER.debug('StoreKpiValues: Received gRPC message object: {:}'.format(request)) producer_obj = KafkaProducer({ - 'bootstrap.servers' : KafkaConfig.get_admin_client() + 'bootstrap.servers' : KafkaConfig.get_kafka_address() }) for kpi_value in request.kpi_value_list: kpi_value_to_produce : Tuple [str, Any, Any] = ( -- GitLab From 1f495c78b88d8e688ba33bca506dc942e30261a5 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 9 Aug 2024 09:08:34 +0000 Subject: [PATCH 518/602] Changes in KpiValueWriter - Kafka deployment script is added in .gitlab-ci file - call is changed to "get_kafka_address()" in KpiValueWriter.py --- src/kpi_value_writer/.gitlab-ci.yml | 24 ++++++++++++++++++- .../service/KpiValueWriter.py | 2 +- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/kpi_value_writer/.gitlab-ci.yml b/src/kpi_value_writer/.gitlab-ci.yml index 25619ce7f..2c300db0e 100644 --- a/src/kpi_value_writer/.gitlab-ci.yml +++ b/src/kpi_value_writer/.gitlab-ci.yml @@ -50,10 +50,30 @@ unit_test kpi-value-writer: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi - if docker container ls | grep $IMAGE_NAME; then docker rm -f $IMAGE_NAME; else echo "$IMAGE_NAME container is not in the system"; fi + - if docker container ls | grep kafka; then docker rm -f kafka; else echo "Kafka container is not in the system"; fi + - if docker container ls | grep zookeeper; then docker rm -f zookeeper; else echo "Zookeeper container is not in the system"; fi - docker container prune -f script: - docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG" - - docker run --name $IMAGE_NAME -d -p 30030:30030 -v "$PWD/src/$IMAGE_NAME/tests:/opt/results" --network=teraflowbridge $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG + - docker pull "bitnami/zookeeper:latest" + - docker pull "bitnami/kafka:latest" + - > + docker run --name zookeeper -d --network=teraflowbridge -p 2181:2181 + bitnami/zookeeper:latest + - sleep 10 # Wait for Zookeeper to start + - docker run --name kafka -d --network=teraflowbridge -p 9092:9092 + --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 + --env ALLOW_PLAINTEXT_LISTENER=yes + bitnami/kafka:latest + - sleep 20 # Wait for Kafka to start + - KAFKA_IP=$(docker inspect kafka --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") + - echo $KAFKA_IP + - > + docker run --name $IMAGE_NAME -d -p 30030:30030 + --env "KFK_SERVER_ADDRESS=${KAFKA_IP}:9092" + --volume "$PWD/src/$IMAGE_NAME/tests:/opt/results" + --network=teraflowbridge + $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG - sleep 5 - docker ps -a - docker logs $IMAGE_NAME @@ -64,6 +84,8 @@ unit_test kpi-value-writer: coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' after_script: - docker rm -f $IMAGE_NAME + - docker rm zookeeper + - docker rm kafka - docker network rm teraflowbridge rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index 5e2b6babe..5d1a98808 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -51,7 +51,7 @@ class KpiValueWriter(GenericGrpcService): metric_writer = MetricWriterToPrometheus() kafka_consumer = KafkaConsumer( - { 'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value, + { 'bootstrap.servers' : KafkaConfig.get_kafka_address(), 'group.id' : __class__, 'auto.offset.reset' : 'latest'} ) -- GitLab From dbb3690f68fbccc488edc0c9fe7ac455e891cdf7 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 9 Aug 2024 11:02:46 +0000 Subject: [PATCH 519/602] Changes to telemetry service - TelemetryBackendService name and port is added in constants - get_kafka_address() call added in TelemetryBackendService - kafk topics test added in telemetrybackend test file - get_kafka_address() call added in TelemetryBackendServiceImpl - kafk topics test added in telemetryfrontend test file - improvements in Telemetry gitlab-ci file + unit_test for telemetry backend and frontend added. + many other small changes --- src/telemetry/.gitlab-ci.yml | 148 ++++++++++++------ .../service/TelemetryBackendService.py | 4 +- .../backend/tests/testTelemetryBackend.py | 7 + .../TelemetryFrontendServiceServicerImpl.py | 4 +- src/telemetry/frontend/tests/test_frontend.py | 11 +- 5 files changed, 123 insertions(+), 51 deletions(-) diff --git a/src/telemetry/.gitlab-ci.yml b/src/telemetry/.gitlab-ci.yml index d2e7e8cf3..1d63654d9 100644 --- a/src/telemetry/.gitlab-ci.yml +++ b/src/telemetry/.gitlab-ci.yml @@ -21,6 +21,8 @@ build kpi-manager: before_script: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY script: + # This first build tags the builder resulting image to prevent being removed by dangling image removal command + - docker buildx build -t "${IMAGE_NAME}-backend:${IMAGE_TAG}-builder" --target builder -f ./src/$IMAGE_NAME/backend/Dockerfile . - docker buildx build -t "${IMAGE_NAME}-frontend:$IMAGE_TAG" -f ./src/$IMAGE_NAME/frontend/Dockerfile . - docker buildx build -t "${IMAGE_NAME}-backend:$IMAGE_TAG" -f ./src/$IMAGE_NAME/backend/Dockerfile . - docker tag "${IMAGE_NAME}-frontend:$IMAGE_TAG" "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-frontend:$IMAGE_TAG" @@ -35,6 +37,7 @@ build kpi-manager: - changes: - src/common/**/*.py - proto/*.proto + - src/$IMAGE_NAME/.gitlab-ci.yml - src/$IMAGE_NAME/frontend/**/*.{py,in,yml} - src/$IMAGE_NAME/frontend/Dockerfile - src/$IMAGE_NAME/frontend/tests/*.py @@ -45,7 +48,75 @@ build kpi-manager: - .gitlab-ci.yml # Apply unit test to the component -unit_test telemetry: +unit_test telemetry-backend: + variables: + IMAGE_NAME: 'telemetry' # name of the microservice + IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) + stage: unit_test + needs: + - build telemetry + before_script: + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi + - if docker container ls | grep kafka; then docker rm -f kafka; else echo "Kafka container is not in the system"; fi + - if docker container ls | grep zookeeper; then docker rm -f zookeeper; else echo "Zookeeper container is not in the system"; fi + # - if docker container ls | grep ${IMAGE_NAME}-frontend; then docker rm -f ${IMAGE_NAME}-frontend; else echo "${IMAGE_NAME}-frontend container is not in the system"; fi + - if docker container ls | grep ${IMAGE_NAME}-backend; then docker rm -f ${IMAGE_NAME}-backend; else echo "${IMAGE_NAME}-backend container is not in the system"; fi + - docker container prune -f + script: + - docker pull "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-backend:$IMAGE_TAG" + - docker pull "bitnami/zookeeper:latest" + - docker pull "bitnami/kafka:latest" + - > + docker run --name zookeeper -d --network=teraflowbridge -p 2181:2181 + bitnami/zookeeper:latest + - sleep 10 # Wait for Zookeeper to start + - docker run --name kafka -d --network=teraflowbridge -p 9092:9092 + --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 + --env ALLOW_PLAINTEXT_LISTENER=yes + bitnami/kafka:latest + - sleep 20 # Wait for Kafka to start + - KAFKA_IP=$(docker inspect kafka --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") + - echo $KAFKA_IP + - > + docker run --name $IMAGE_NAME -d -p 30060:30060 + --env "KFK_SERVER_ADDRESS=${KAFKA_IP}:9092" + --volume "$PWD/src/$IMAGE_NAME/backend/tests:/opt/results" + --network=teraflowbridge + $CI_REGISTRY_IMAGE/${IMAGE_NAME}-backend:$IMAGE_TAG + - docker ps -a + - sleep 5 + - docker logs ${IMAGE_NAME}-backend + - > + docker exec -i ${IMAGE_NAME}-backend bash -c + "coverage run -m pytest --log-level=INFO --verbose --junitxml=/opt/results/${IMAGE_NAME}-backend_report.xml $IMAGE_NAME/backend/tests/test_*.py" + - docker exec -i ${IMAGE_NAME}-backend bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing" + coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' + after_script: + - docker network rm teraflowbridge + - docker volume prune --force + - docker image prune --force + - docker rm -f ${IMAGE_NAME}-backend + - docker rm -f zookeeper + - docker rm -f kafka + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' + - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' + - changes: + - src/common/**/*.py + - proto/*.proto + - src/$IMAGE_NAME/backend/**/*.{py,in,yml} + - src/$IMAGE_NAME/backend/Dockerfile + - src/$IMAGE_NAME/backend/tests/*.py + - manifests/${IMAGE_NAME}service.yaml + - .gitlab-ci.yml + artifacts: + when: always + reports: + junit: src/$IMAGE_NAME/backend/tests/${IMAGE_NAME}-backend_report.xml + +# Apply unit test to the component +unit_test telemetry-frontend: variables: IMAGE_NAME: 'telemetry' # name of the microservice IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) @@ -57,12 +128,14 @@ unit_test telemetry: - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi - if docker container ls | grep crdb; then docker rm -f crdb; else echo "CockroachDB container is not in the system"; fi - if docker volume ls | grep crdb; then docker volume rm -f crdb; else echo "CockroachDB volume is not in the system"; fi + - if docker container ls | grep kafka; then docker rm -f kafka; else echo "Kafka container is not in the system"; fi + - if docker container ls | grep zookeeper; then docker rm -f zookeeper; else echo "Zookeeper container is not in the system"; fi - if docker container ls | grep ${IMAGE_NAME}-frontend; then docker rm -f ${IMAGE_NAME}-frontend; else echo "${IMAGE_NAME}-frontend container is not in the system"; fi - - if docker container ls | grep ${IMAGE_NAME}-backend; then docker rm -f ${IMAGE_NAME}-backend; else echo "${IMAGE_NAME}-backend container is not in the system"; fi - docker container prune -f script: - - docker pull "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-backend:$IMAGE_TAG" - docker pull "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-frontend:$IMAGE_TAG" + - docker pull "bitnami/zookeeper:latest" + - docker pull "bitnami/kafka:latest" - docker pull "cockroachdb/cockroach:latest-v22.2" - docker volume create crdb - > @@ -77,66 +150,51 @@ unit_test telemetry: - CRDB_ADDRESS=$(docker inspect crdb --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") - echo $CRDB_ADDRESS - > - docker run --name $IMAGE_NAME -d -p 30010:30010 + docker run --name zookeeper -d --network=teraflowbridge -p 2181:2181 + bitnami/zookeeper:latest + - sleep 10 # Wait for Zookeeper to start + - docker run --name kafka -d --network=teraflowbridge -p 9092:9092 + --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 + --env ALLOW_PLAINTEXT_LISTENER=yes + bitnami/kafka:latest + - sleep 20 # Wait for Kafka to start + - KAFKA_IP=$(docker inspect kafka --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") + - echo $KAFKA_IP + - > + docker run --name $IMAGE_NAME -d -p 30050:30050 --env "CRDB_URI=cockroachdb://tfs:tfs123@${CRDB_ADDRESS}:26257/tfs_test?sslmode=require" - --volume "$PWD/src/$IMAGE_NAME/tests:/opt/results" + --env "KFK_SERVER_ADDRESS=${KAFKA_IP}:9092" + --volume "$PWD/src/$IMAGE_NAME/frontend/tests:/opt/results" --network=teraflowbridge - $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG + $CI_REGISTRY_IMAGE/${IMAGE_NAME}-frontend:$IMAGE_TAG - docker ps -a - sleep 5 - - docker logs $IMAGE_NAME + - docker logs ${IMAGE_NAME}-frontend - > - docker exec -i $IMAGE_NAME bash -c - "coverage run -m pytest --log-level=INFO --verbose --junitxml=/opt/results/${IMAGE_NAME}_report.xml $IMAGE_NAME/tests/test_*.py" - - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing" + docker exec -i ${IMAGE_NAME}-frontend bash -c + "coverage run -m pytest --log-level=INFO --verbose --junitxml=/opt/results/${IMAGE_NAME}-frontend_report.xml $IMAGE_NAME/frontend/tests/test_*.py" + - docker exec -i ${IMAGE_NAME}-frontend bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing" coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' after_script: - docker volume rm -f crdb - docker network rm teraflowbridge - docker volume prune --force - docker image prune --force + - docker rm -f ${IMAGE_NAME}-frontend + - docker rm -f zookeeper + - docker rm -f kafka rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' - changes: - src/common/**/*.py - proto/*.proto - - src/$IMAGE_NAME/**/*.{py,in,yml} + - src/$IMAGE_NAME/frontend/**/*.{py,in,yml} - src/$IMAGE_NAME/frontend/Dockerfile - src/$IMAGE_NAME/frontend/tests/*.py - - src/$IMAGE_NAME/frontend/tests/Dockerfile - - src/$IMAGE_NAME/backend/Dockerfile - - src/$IMAGE_NAME/backend/tests/*.py - - src/$IMAGE_NAME/backend/tests/Dockerfile - manifests/${IMAGE_NAME}service.yaml - .gitlab-ci.yml - # artifacts: - # when: always - # reports: - # junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml - -## Deployment of the service in Kubernetes Cluster -#deploy context: -# variables: -# IMAGE_NAME: 'context' # name of the microservice -# IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) -# stage: deploy -# needs: -# - unit test context -# # - integ_test execute -# script: -# - 'sed -i "s/$IMAGE_NAME:.*/$IMAGE_NAME:$IMAGE_TAG/" manifests/${IMAGE_NAME}service.yaml' -# - kubectl version -# - kubectl get all -# - kubectl apply -f "manifests/${IMAGE_NAME}service.yaml" -# - kubectl get all -# # environment: -# # name: test -# # url: https://example.com -# # kubernetes: -# # namespace: test -# rules: -# - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' -# when: manual -# - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' -# when: manual + artifacts: + when: always + reports: + junit: src/$IMAGE_NAME/frontend/tests/${IMAGE_NAME}-frontend_report.xml \ No newline at end of file diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 048474d93..6b9a6a8da 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -39,8 +39,8 @@ class TelemetryBackendService: def __init__(self): LOGGER.info('Init TelemetryBackendService') - self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value}) - self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value, + self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.get_kafka_address()}) + self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.get_kafka_address(), 'group.id' : 'backend', 'auto.offset.reset' : 'latest'}) self.running_threads = {} diff --git a/src/telemetry/backend/tests/testTelemetryBackend.py b/src/telemetry/backend/tests/testTelemetryBackend.py index 3d7ec82ac..95710ff88 100644 --- a/src/telemetry/backend/tests/testTelemetryBackend.py +++ b/src/telemetry/backend/tests/testTelemetryBackend.py @@ -13,6 +13,7 @@ # limitations under the License. import logging +from common.tools.kafka.Variables import KafkaTopic from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService @@ -23,6 +24,12 @@ LOGGER = logging.getLogger(__name__) # Tests Implementation of Telemetry Backend ########################### +# --- "test_validate_kafka_topics" should be run before the functionality tests --- +def test_validate_kafka_topics(): + LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ") + response = KafkaTopic.create_all_topics() + assert isinstance(response, bool) + def test_RunRequestListener(): LOGGER.info('test_RunRequestListener') TelemetryBackendServiceObj = TelemetryBackendService() diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index e6a6d0cd5..2b872dba3 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -41,8 +41,8 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): def __init__(self): LOGGER.info('Init TelemetryFrontendService') self.tele_db_obj = TelemetryDB() - self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value}) - self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.SERVER_ADDRESS.value, + self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.get_kafka_address()}) + self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.get_kafka_address(), 'group.id' : 'frontend', 'auto.offset.reset' : 'latest'}) diff --git a/src/telemetry/frontend/tests/test_frontend.py b/src/telemetry/frontend/tests/test_frontend.py index 3f8f3ebc8..9c3f9d3a8 100644 --- a/src/telemetry/frontend/tests/test_frontend.py +++ b/src/telemetry/frontend/tests/test_frontend.py @@ -16,11 +16,10 @@ import os import pytest import logging -# from common.proto.context_pb2 import Empty from common.Constants import ServiceNameEnum from common.proto.telemetry_frontend_pb2 import CollectorId, CollectorList from common.proto.context_pb2 import Empty - +from common.tools.kafka.Variables import KafkaTopic from common.Settings import ( get_service_port_grpc, get_env_var_name, ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC) @@ -81,6 +80,13 @@ def telemetryFrontend_client( ########################### # ------- Re-structuring Test --------- +# --- "test_validate_kafka_topics" should be run before the functionality tests --- +def test_validate_kafka_topics(): + LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ") + response = KafkaTopic.create_all_topics() + assert isinstance(response, bool) + +# ----- core funtionality test ----- def test_StartCollector(telemetryFrontend_client): LOGGER.info(' >>> test_StartCollector START: <<< ') response = telemetryFrontend_client.StartCollector(create_collector_request()) @@ -99,6 +105,7 @@ def test_SelectCollectors(telemetryFrontend_client): LOGGER.debug(str(response)) assert isinstance(response, CollectorList) +# ----- Non-gRPC method tests ----- def test_RunResponseListener(): LOGGER.info(' >>> test_RunResponseListener START: <<< ') TelemetryFrontendServiceObj = TelemetryFrontendServiceServicerImpl() -- GitLab From fd6f40d88c60413cc411286818754195b9c1a5ca Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 9 Aug 2024 11:06:32 +0000 Subject: [PATCH 520/602] Telemetry fronend and backend ci tests activated --- .gitlab-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 42292dc37..115b33676 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -48,7 +48,6 @@ include: - local: '/src/kpi_manager/.gitlab-ci.yml' - local: '/src/kpi_value_api/.gitlab-ci.yml' - local: '/src/kpi_value_writer/.gitlab-ci.yml' - # - local: '/src/telemetry/frontend/.gitlab-ci.yml' - # - local: '/src/telemetry/backend/.gitlab-ci.yml' + - local: '/src/telemetry/.gitlab-ci.yml' # This should be last one: end-to-end integration tests - local: '/src/tests/.gitlab-ci.yml' -- GitLab From 2ef3ba3e3181fd23797fe9ed707b1dbbbae4a85a Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 9 Aug 2024 11:09:30 +0000 Subject: [PATCH 521/602] Telemetry build added --- src/telemetry/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/telemetry/.gitlab-ci.yml b/src/telemetry/.gitlab-ci.yml index 1d63654d9..2a6b416be 100644 --- a/src/telemetry/.gitlab-ci.yml +++ b/src/telemetry/.gitlab-ci.yml @@ -13,7 +13,7 @@ # limitations under the License. # Build, tag, and push the Docker image to the GitLab Docker registry -build kpi-manager: +build telemetry: variables: IMAGE_NAME: 'telemetry' # name of the microservice IMAGE_TAG: 'latest' # tag of the container image (production, development, etc) -- GitLab From 88bfacfb7ac904ff2eed954087f5f6d072ea05f8 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 9 Aug 2024 16:31:29 +0000 Subject: [PATCH 522/602] telemetry gitlab-ci file update. - docker build ... -target builder is removed --- src/telemetry/.gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/telemetry/.gitlab-ci.yml b/src/telemetry/.gitlab-ci.yml index 2a6b416be..78301fe07 100644 --- a/src/telemetry/.gitlab-ci.yml +++ b/src/telemetry/.gitlab-ci.yml @@ -22,7 +22,7 @@ build telemetry: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY script: # This first build tags the builder resulting image to prevent being removed by dangling image removal command - - docker buildx build -t "${IMAGE_NAME}-backend:${IMAGE_TAG}-builder" --target builder -f ./src/$IMAGE_NAME/backend/Dockerfile . + # - docker buildx build -t "${IMAGE_NAME}-backend:${IMAGE_TAG}-builder" --target builder -f ./src/$IMAGE_NAME/backend/Dockerfile . - docker buildx build -t "${IMAGE_NAME}-frontend:$IMAGE_TAG" -f ./src/$IMAGE_NAME/frontend/Dockerfile . - docker buildx build -t "${IMAGE_NAME}-backend:$IMAGE_TAG" -f ./src/$IMAGE_NAME/backend/Dockerfile . - docker tag "${IMAGE_NAME}-frontend:$IMAGE_TAG" "$CI_REGISTRY_IMAGE/${IMAGE_NAME}-frontend:$IMAGE_TAG" -- GitLab From 7c90ff4f6d2abdda7deb38c236230f111ad14afa Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 10 Aug 2024 05:37:00 +0000 Subject: [PATCH 523/602] telemetry .gitlab.ci file - docker run --name ... cmd missing (backend/frontend) after image name. --- src/telemetry/.gitlab-ci.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/telemetry/.gitlab-ci.yml b/src/telemetry/.gitlab-ci.yml index 78301fe07..c7950eb91 100644 --- a/src/telemetry/.gitlab-ci.yml +++ b/src/telemetry/.gitlab-ci.yml @@ -79,7 +79,7 @@ unit_test telemetry-backend: - KAFKA_IP=$(docker inspect kafka --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") - echo $KAFKA_IP - > - docker run --name $IMAGE_NAME -d -p 30060:30060 + docker run --name $IMAGE_NAME-backend -d -p 30060:30060 --env "KFK_SERVER_ADDRESS=${KAFKA_IP}:9092" --volume "$PWD/src/$IMAGE_NAME/backend/tests:/opt/results" --network=teraflowbridge @@ -159,9 +159,11 @@ unit_test telemetry-frontend: bitnami/kafka:latest - sleep 20 # Wait for Kafka to start - KAFKA_IP=$(docker inspect kafka --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") - - echo $KAFKA_IP + - echo $KAFKA_IP + - docker logs zookeeper + - docker logs kafka - > - docker run --name $IMAGE_NAME -d -p 30050:30050 + docker run --name $IMAGE_NAME-frontend -d -p 30050:30050 --env "CRDB_URI=cockroachdb://tfs:tfs123@${CRDB_ADDRESS}:26257/tfs_test?sslmode=require" --env "KFK_SERVER_ADDRESS=${KAFKA_IP}:9092" --volume "$PWD/src/$IMAGE_NAME/frontend/tests:/opt/results" -- GitLab From 14cc7a763f087f3323932d7095825db464992f05 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 10 Aug 2024 05:40:41 +0000 Subject: [PATCH 524/602] changes in kpi Value API/writer gitlab-ci files. - src/$IMAGE_NAME/tests/Dockerfile is removed from API. - -f is added in "docker rm -f zookeeper" and "docker rm -f kafka" in Writer file. --- src/kpi_value_api/.gitlab-ci.yml | 2 +- src/kpi_value_writer/.gitlab-ci.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/kpi_value_api/.gitlab-ci.yml b/src/kpi_value_api/.gitlab-ci.yml index 1919f0361..1a6f821ba 100644 --- a/src/kpi_value_api/.gitlab-ci.yml +++ b/src/kpi_value_api/.gitlab-ci.yml @@ -94,7 +94,7 @@ unit_test kpi-value-api: - src/$IMAGE_NAME/**/*.{py,in,yml} - src/$IMAGE_NAME/Dockerfile - src/$IMAGE_NAME/tests/*.py - - src/$IMAGE_NAME/tests/Dockerfile + # - src/$IMAGE_NAME/tests/Dockerfile # mayne not needed - manifests/${IMAGE_NAME}service.yaml - .gitlab-ci.yml artifacts: diff --git a/src/kpi_value_writer/.gitlab-ci.yml b/src/kpi_value_writer/.gitlab-ci.yml index 2c300db0e..9a2f9fd47 100644 --- a/src/kpi_value_writer/.gitlab-ci.yml +++ b/src/kpi_value_writer/.gitlab-ci.yml @@ -84,8 +84,8 @@ unit_test kpi-value-writer: coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/' after_script: - docker rm -f $IMAGE_NAME - - docker rm zookeeper - - docker rm kafka + - docker rm -f zookeeper + - docker rm -f kafka - docker network rm teraflowbridge rules: - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)' -- GitLab From 89e7755e7bcf5dc3a98aebc91b2e13dac686b3ea Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 10 Aug 2024 06:07:15 +0000 Subject: [PATCH 525/602] changes in Metric Writer to Prometheus. - start_http_server() call is move to main - CollectorRegistory variable is removed --- .../service/MetricWriterToPrometheus.py | 12 ++---------- src/kpi_value_writer/service/__main__.py | 3 +++ 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py index f1d079783..4e6106255 100644 --- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py +++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py @@ -18,7 +18,7 @@ import ast import time import threading import logging -from prometheus_client import start_http_server, Gauge, CollectorRegistry +from prometheus_client import Gauge, CollectorRegistry from common.proto.kpi_sample_types_pb2 import KpiSampleType from common.proto.kpi_value_api_pb2 import KpiValue @@ -26,7 +26,6 @@ from common.proto.kpi_manager_pb2 import KpiDescriptor LOGGER = logging.getLogger(__name__) PROM_METRICS = {} -PROM_REGISTERY = CollectorRegistry() class MetricWriterToPrometheus: ''' @@ -34,13 +33,7 @@ class MetricWriterToPrometheus: cooked KPI value = KpiDescriptor (gRPC message) + KpiValue (gRPC message) ''' def __init__(self): - # prometheus server address and configs - self.start_prometheus_client() pass - - def start_prometheus_client(self): - start_http_server(10808, registry=PROM_REGISTERY) - LOGGER.debug("Prometheus client is started on port 10808") def merge_kpi_descriptor_and_kpi_value(self, kpi_descriptor, kpi_value): # Creating a dictionary from the kpi_descriptor's attributes @@ -71,8 +64,7 @@ class MetricWriterToPrometheus: PROM_METRICS[metric_name] = Gauge ( metric_name, cooked_kpi['kpi_description'], - metric_tags, - registry=PROM_REGISTERY + metric_tags ) LOGGER.debug("Metric is created with labels: {:}".format(metric_tags)) PROM_METRICS[metric_name].labels( diff --git a/src/kpi_value_writer/service/__main__.py b/src/kpi_value_writer/service/__main__.py index aa67540fb..be9f8f29b 100644 --- a/src/kpi_value_writer/service/__main__.py +++ b/src/kpi_value_writer/service/__main__.py @@ -13,6 +13,7 @@ # limitations under the License. import logging, signal, sys, threading +from prometheus_client import start_http_server from kpi_value_writer.service.KpiValueWriter import KpiValueWriter from common.Settings import get_log_level @@ -38,6 +39,8 @@ def main(): grpc_service = KpiValueWriter() grpc_service.start() + start_http_server(10808) + LOGGER.debug("Prometheus client is started on port 10808") # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=1.0): pass -- GitLab From d1c99c6b51c30d40d08ad97ff145651e67601683 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 10 Aug 2024 06:32:53 +0000 Subject: [PATCH 526/602] Changes in Telemetry. - GenericGrpcService inheritance is added in Telemetry backend class. - Database folder were missing in working directory in DockerFile of Telemetry Frontend. --- src/telemetry/backend/service/TelemetryBackendService.py | 5 +++-- src/telemetry/frontend/Dockerfile | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 6b9a6a8da..991298d37 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -24,6 +24,8 @@ from confluent_kafka import Consumer as KafkaConsumer from confluent_kafka import KafkaError from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from common.method_wrappers.Decorator import MetricsPool +from common.tools.service.GenericGrpcService import GenericGrpcService + LOGGER = logging.getLogger(__name__) @@ -31,12 +33,11 @@ METRICS_POOL = MetricsPool('TelemetryBackend', 'backendService') # EXPORTER_ENDPOINT = "http://10.152.183.2:9100/metrics" -class TelemetryBackendService: +class TelemetryBackendService(GenericGrpcService): """ Class listens for request on Kafka topic, fetches requested metrics from device. Produces metrics on both RESPONSE and VALUE kafka topics. """ - def __init__(self): LOGGER.info('Init TelemetryBackendService') self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.get_kafka_address()}) diff --git a/src/telemetry/frontend/Dockerfile b/src/telemetry/frontend/Dockerfile index 0c3e1a66a..7125d31fe 100644 --- a/src/telemetry/frontend/Dockerfile +++ b/src/telemetry/frontend/Dockerfile @@ -64,6 +64,7 @@ RUN python3 -m pip install -r requirements.txt WORKDIR /var/teraflow COPY src/telemetry/__init__.py telemetry/__init__.py COPY src/telemetry/frontend/. telemetry/frontend/ +COPY src/telemetry/database/. telemetry/database/ # Start the service ENTRYPOINT ["python", "-m", "telemetry.frontend.service"] -- GitLab From 25f71f10e3ea26cb6a2fb11c32dcb86507255092 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 10 Aug 2024 07:11:35 +0000 Subject: [PATCH 527/602] Changes on KPI Value Writer and Telemetry Backend - Renamed the method to "KafkaKpiConsumer" to avoid conflict with the "KafkaConsumer" import in KpiApiWriter. - Removed unnecessary imports in KpiWriterToProm. - Added `get_service_port_grpc` call and imports in the Telemetry backend service. - Added new libraries to `requirements.in` for Telemetry. --- src/kpi_value_writer/service/KpiValueWriter.py | 6 +++--- src/kpi_value_writer/service/MetricWriterToPrometheus.py | 8 ++++---- src/telemetry/backend/requirements.in | 4 ++++ src/telemetry/backend/service/TelemetryBackendService.py | 8 ++++++-- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index 5d1a98808..eba651674 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -41,18 +41,18 @@ class KpiValueWriter(GenericGrpcService): @staticmethod def RunKafkaConsumer(): - thread = threading.Thread(target=KpiValueWriter.KafkaConsumer, args=()) + thread = threading.Thread(target=KpiValueWriter.KafkaKpiConsumer, args=()) ACTIVE_CONSUMERS.append(thread) thread.start() @staticmethod - def KafkaConsumer(): + def KafkaKpiConsumer(): kpi_manager_client = KpiManagerClient() metric_writer = MetricWriterToPrometheus() kafka_consumer = KafkaConsumer( { 'bootstrap.servers' : KafkaConfig.get_kafka_address(), - 'group.id' : __class__, + 'group.id' : 'KpiValueWriter', 'auto.offset.reset' : 'latest'} ) kafka_consumer.subscribe([KafkaTopic.VALUE.value]) diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py index 4e6106255..a86b8f34e 100644 --- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py +++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py @@ -14,11 +14,11 @@ # read Kafka stream from Kafka topic -import ast -import time -import threading +# import ast +# import time +# import threading import logging -from prometheus_client import Gauge, CollectorRegistry +from prometheus_client import Gauge from common.proto.kpi_sample_types_pb2 import KpiSampleType from common.proto.kpi_value_api_pb2 import KpiValue diff --git a/src/telemetry/backend/requirements.in b/src/telemetry/backend/requirements.in index e6a559be7..1d22df11b 100644 --- a/src/telemetry/backend/requirements.in +++ b/src/telemetry/backend/requirements.in @@ -13,3 +13,7 @@ # limitations under the License. confluent-kafka==2.3.* +psycopg2-binary==2.9.* +SQLAlchemy==1.4.* +sqlalchemy-cockroachdb==1.4.* +SQLAlchemy-Utils==0.38.* \ No newline at end of file diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index 991298d37..bb9f0a314 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -18,10 +18,12 @@ import random import logging import threading from typing import Any, Dict -from common.proto.context_pb2 import Empty +# from common.proto.context_pb2 import Empty from confluent_kafka import Producer as KafkaProducer from confluent_kafka import Consumer as KafkaConsumer from confluent_kafka import KafkaError +from common.Constants import ServiceNameEnum +from common.Settings import get_service_port_grpc from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from common.method_wrappers.Decorator import MetricsPool from common.tools.service.GenericGrpcService import GenericGrpcService @@ -38,8 +40,10 @@ class TelemetryBackendService(GenericGrpcService): Class listens for request on Kafka topic, fetches requested metrics from device. Produces metrics on both RESPONSE and VALUE kafka topics. """ - def __init__(self): + def __init__(self, cls_name : str = __name__) -> None: LOGGER.info('Init TelemetryBackendService') + port = get_service_port_grpc(ServiceNameEnum.TELEMETRYBACKEND) + super().__init__(port, cls_name=cls_name) self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.get_kafka_address()}) self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.get_kafka_address(), 'group.id' : 'backend', -- GitLab From 333b6d376e99dd129829073214b9cf36ee61acdd Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 10 Aug 2024 07:12:29 +0000 Subject: [PATCH 528/602] Added new libraries to requirements.in for Telemetry. --- src/telemetry/backend/requirements.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/telemetry/backend/requirements.in b/src/telemetry/backend/requirements.in index 1d22df11b..231dc04e8 100644 --- a/src/telemetry/backend/requirements.in +++ b/src/telemetry/backend/requirements.in @@ -16,4 +16,4 @@ confluent-kafka==2.3.* psycopg2-binary==2.9.* SQLAlchemy==1.4.* sqlalchemy-cockroachdb==1.4.* -SQLAlchemy-Utils==0.38.* \ No newline at end of file +SQLAlchemy-Utils==0.38.* -- GitLab From 622fe067f9943cfbccc7967511628d1ad0fb1cb6 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sun, 11 Aug 2024 14:01:51 +0000 Subject: [PATCH 529/602] Changes in Telemetry. - tests file name is corrected. - Telmetry frontend and backend requriements.in is updated --- src/telemetry/backend/requirements.in | 4 -- .../backend/tests/test_TelemetryBackend.py | 38 +++++++++++++++++++ src/telemetry/frontend/requirements.in | 4 ++ 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 src/telemetry/backend/tests/test_TelemetryBackend.py diff --git a/src/telemetry/backend/requirements.in b/src/telemetry/backend/requirements.in index 231dc04e8..e6a559be7 100644 --- a/src/telemetry/backend/requirements.in +++ b/src/telemetry/backend/requirements.in @@ -13,7 +13,3 @@ # limitations under the License. confluent-kafka==2.3.* -psycopg2-binary==2.9.* -SQLAlchemy==1.4.* -sqlalchemy-cockroachdb==1.4.* -SQLAlchemy-Utils==0.38.* diff --git a/src/telemetry/backend/tests/test_TelemetryBackend.py b/src/telemetry/backend/tests/test_TelemetryBackend.py new file mode 100644 index 000000000..95710ff88 --- /dev/null +++ b/src/telemetry/backend/tests/test_TelemetryBackend.py @@ -0,0 +1,38 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging +from common.tools.kafka.Variables import KafkaTopic +from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService + + +LOGGER = logging.getLogger(__name__) + + +########################### +# Tests Implementation of Telemetry Backend +########################### + +# --- "test_validate_kafka_topics" should be run before the functionality tests --- +def test_validate_kafka_topics(): + LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ") + response = KafkaTopic.create_all_topics() + assert isinstance(response, bool) + +def test_RunRequestListener(): + LOGGER.info('test_RunRequestListener') + TelemetryBackendServiceObj = TelemetryBackendService() + response = TelemetryBackendServiceObj.RunRequestListener() + LOGGER.debug(str(response)) + assert isinstance(response, bool) diff --git a/src/telemetry/frontend/requirements.in b/src/telemetry/frontend/requirements.in index e6a559be7..231dc04e8 100644 --- a/src/telemetry/frontend/requirements.in +++ b/src/telemetry/frontend/requirements.in @@ -13,3 +13,7 @@ # limitations under the License. confluent-kafka==2.3.* +psycopg2-binary==2.9.* +SQLAlchemy==1.4.* +sqlalchemy-cockroachdb==1.4.* +SQLAlchemy-Utils==0.38.* -- GitLab From 3de3bf9865aabccc9d5a2712fb59ccb4250349ca Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sun, 11 Aug 2024 15:18:06 +0000 Subject: [PATCH 530/602] Changes in KPI Manager KPI value API and value Writer. - updated cmd in test file of KPI manager - move kafka producer object to __init__ function. - write JSON object to Kafka - Read JSON object from Kafka - Slight to manage the affect of JSON object. - Static methods are removed. --- scripts/run_tests_locally-kpi-manager.sh | 2 +- src/common/tools/kafka/Variables.py | 2 +- .../service/KpiValueApiServiceServicerImpl.py | 42 ++++++++++++------- .../service/KpiValueWriter.py | 33 +++++++-------- .../service/MetricWriterToPrometheus.py | 12 +++--- .../tests/test_kpi_value_writer.py | 3 +- 6 files changed, 49 insertions(+), 45 deletions(-) diff --git a/scripts/run_tests_locally-kpi-manager.sh b/scripts/run_tests_locally-kpi-manager.sh index a6a24f90d..8a4ce8d95 100755 --- a/scripts/run_tests_locally-kpi-manager.sh +++ b/scripts/run_tests_locally-kpi-manager.sh @@ -24,7 +24,7 @@ cd $PROJECTDIR/src # python3 kpi_manager/tests/test_unitary.py RCFILE=$PROJECTDIR/coverage/.coveragerc -CRDB_SQL_ADDRESS=$(kubectl --namespace ${CRDB_NAMESPACE} get service cockroachdb-public -o 'jsonpath={.spec.clusterIP}') +CRDB_SQL_ADDRESS=$(kubectl get service cockroachdb-public --namespace ${CRDB_NAMESPACE} -o 'jsonpath={.spec.clusterIP}') export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_kpi_mgmt?sslmode=require" python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ kpi_manager/tests/test_kpi_manager.py diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 9d42f1550..5ada88a1e 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -55,7 +55,7 @@ class KafkaTopic(Enum): all_topics = [member.value for member in KafkaTopic] LOGGER.debug("Kafka server address is: {:} ".format(KafkaConfig.get_kafka_address())) if( KafkaTopic.create_new_topic_if_not_exists( all_topics )): - LOGGER.debug("All topics are created sucsessfully") + LOGGER.debug("All topics are created sucsessfully or Already Exists") return True else: LOGGER.debug("Error creating all topics") diff --git a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py index 3df8dd5b6..4ea978faf 100644 --- a/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py +++ b/src/kpi_value_api/service/KpiValueApiServiceServicerImpl.py @@ -12,8 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging, grpc -from typing import Tuple, Any +import logging, grpc, json +from typing import Dict from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.tools.kafka.Variables import KafkaConfig, KafkaTopic @@ -37,32 +37,42 @@ PROM_URL = "http://prometheus-k8s.monitoring.svc.cluster.local:9090" # TO class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): def __init__(self): LOGGER.debug('Init KpiValueApiService') - + self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.get_kafka_address()}) + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StoreKpiValues(self, request: KpiValueList, grpc_context: grpc.ServicerContext ) -> Empty: LOGGER.debug('StoreKpiValues: Received gRPC message object: {:}'.format(request)) - producer_obj = KafkaProducer({ - 'bootstrap.servers' : KafkaConfig.get_kafka_address() - }) + + producer = self.kafka_producer for kpi_value in request.kpi_value_list: - kpi_value_to_produce : Tuple [str, Any, Any] = ( - kpi_value.kpi_id.kpi_id, - kpi_value.timestamp, - kpi_value.kpi_value_type # kpi_value.kpi_value_type.(many options) how? - ) + kpi_value_to_produce : Dict = { + "kpi_uuid" : kpi_value.kpi_id.kpi_id.uuid, + "timestamp" : kpi_value.timestamp.timestamp, + "kpi_value_type" : self.ExtractKpiValueByType(kpi_value.kpi_value_type) + } LOGGER.debug('KPI to produce is {:}'.format(kpi_value_to_produce)) msg_key = "gRPC-kpivalueapi" # str(__class__.__name__) can be used - producer_obj.produce( + producer.produce( KafkaTopic.VALUE.value, key = msg_key, - value = kpi_value.SerializeToString(), # value = json.dumps(kpi_value_to_produce), + value = json.dumps(kpi_value_to_produce), callback = self.delivery_callback ) - producer_obj.flush() + producer.flush() return Empty() + def ExtractKpiValueByType(self, value): + attributes = [ 'floatVal' , 'int32Val' , 'uint32Val','int64Val', + 'uint64Val', 'stringVal', 'boolVal'] + for attr in attributes: + try: + return getattr(value, attr) + except (ValueError, TypeError, AttributeError): + continue + return None + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SelectKpiValues(self, request: KpiValueFilter, grpc_context: grpc.ServicerContext ) -> KpiValueList: @@ -130,13 +140,13 @@ class KpiValueApiServiceServicerImpl(KpiValueAPIServiceServicer): try: int_value = int(value) return KpiValueType(int64Val=int_value) - except ValueError: + except (ValueError, TypeError): pass # Check if the value is a float try: float_value = float(value) return KpiValueType(floatVal=float_value) - except ValueError: + except (ValueError, TypeError): pass # Check if the value is a boolean if value.lower() in ['true', 'false']: diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py index eba651674..8b258a142 100644 --- a/src/kpi_value_writer/service/KpiValueWriter.py +++ b/src/kpi_value_writer/service/KpiValueWriter.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import json import logging import threading from common.tools.kafka.Variables import KafkaConfig, KafkaTopic @@ -38,28 +39,25 @@ class KpiValueWriter(GenericGrpcService): def __init__(self, cls_name : str = __name__) -> None: port = get_service_port_grpc(ServiceNameEnum.KPIVALUEWRITER) super().__init__(port, cls_name=cls_name) + self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.get_kafka_address(), + 'group.id' : 'KpiValueWriter', + 'auto.offset.reset' : 'latest'}) - @staticmethod - def RunKafkaConsumer(): - thread = threading.Thread(target=KpiValueWriter.KafkaKpiConsumer, args=()) + def RunKafkaConsumer(self): + thread = threading.Thread(target=self.KafkaKpiConsumer, args=()) ACTIVE_CONSUMERS.append(thread) thread.start() - @staticmethod - def KafkaKpiConsumer(): + def KafkaKpiConsumer(self): kpi_manager_client = KpiManagerClient() metric_writer = MetricWriterToPrometheus() - kafka_consumer = KafkaConsumer( - { 'bootstrap.servers' : KafkaConfig.get_kafka_address(), - 'group.id' : 'KpiValueWriter', - 'auto.offset.reset' : 'latest'} - ) - kafka_consumer.subscribe([KafkaTopic.VALUE.value]) + consumer = self.kafka_consumer + consumer.subscribe([KafkaTopic.VALUE.value]) LOGGER.debug("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) print("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value)) while True: - raw_kpi = kafka_consumer.poll(1.0) + raw_kpi = consumer.poll(1.0) if raw_kpi is None: continue elif raw_kpi.error(): @@ -69,24 +67,21 @@ class KpiValueWriter(GenericGrpcService): print("Consumer error: {}".format(raw_kpi.error())) continue try: - kpi_value = KpiValue() - kpi_value.ParseFromString(raw_kpi.value()) + kpi_value = json.loads(raw_kpi.value().decode('utf-8')) LOGGER.info("Received KPI : {:}".format(kpi_value)) print("Received KPI : {:}".format(kpi_value)) - KpiValueWriter.get_kpi_descriptor(kpi_value, kpi_manager_client, metric_writer) + self.get_kpi_descriptor(kpi_value, kpi_manager_client, metric_writer) except Exception as e: print("Error detail: {:}".format(e)) continue - @staticmethod - def get_kpi_descriptor(kpi_value: str, kpi_manager_client, metric_writer): + def get_kpi_descriptor(self, kpi_value: str, kpi_manager_client, metric_writer): print("--- START -----") kpi_id = KpiId() - kpi_id.kpi_id.uuid = kpi_value.kpi_id.kpi_id.uuid + kpi_id.kpi_id.uuid = kpi_value['kpi_uuid'] print("KpiId generated: {:}".format(kpi_id)) # print("Kpi manger client created: {:}".format(kpi_manager_client)) - try: kpi_descriptor_object = KpiDescriptor() kpi_descriptor_object = kpi_manager_client.GetKpiDescriptor(kpi_id) diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py index a86b8f34e..85e618a4b 100644 --- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py +++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py @@ -14,10 +14,8 @@ # read Kafka stream from Kafka topic -# import ast -# import time -# import threading import logging +from typing import Dict from prometheus_client import Gauge from common.proto.kpi_sample_types_pb2 import KpiSampleType @@ -47,13 +45,13 @@ class MetricWriterToPrometheus: 'slice_id' : kpi_descriptor.slice_id.slice_uuid.uuid, 'connection_id' : kpi_descriptor.connection_id.connection_uuid.uuid, 'link_id' : kpi_descriptor.link_id.link_uuid.uuid, - 'time_stamp' : kpi_value.timestamp.timestamp, - 'kpi_value' : kpi_value.kpi_value_type.floatVal + 'time_stamp' : kpi_value['timestamp'], + 'kpi_value' : kpi_value['kpi_value_type'] } # LOGGER.debug("Cooked Kpi: {:}".format(cooked_kpi)) return cooked_kpi - def create_and_expose_cooked_kpi(self, kpi_descriptor: KpiDescriptor, kpi_value: KpiValue): + def create_and_expose_cooked_kpi(self, kpi_descriptor: KpiDescriptor, kpi_value: Dict): # merge both gRPC messages into single varible. cooked_kpi = self.merge_kpi_descriptor_and_kpi_value(kpi_descriptor, kpi_value) tags_to_exclude = {'kpi_description', 'kpi_sample_type', 'kpi_value'} @@ -76,7 +74,7 @@ class MetricWriterToPrometheus: connection_id = cooked_kpi['connection_id'], link_id = cooked_kpi['link_id'], time_stamp = cooked_kpi['time_stamp'], - ).set(float(cooked_kpi['kpi_value'])) + ).set(cooked_kpi['kpi_value']) LOGGER.debug("Metric pushed to the endpoints: {:}".format(PROM_METRICS[metric_name])) except ValueError as e: diff --git a/src/kpi_value_writer/tests/test_kpi_value_writer.py b/src/kpi_value_writer/tests/test_kpi_value_writer.py index fce043d7f..b784fae5d 100755 --- a/src/kpi_value_writer/tests/test_kpi_value_writer.py +++ b/src/kpi_value_writer/tests/test_kpi_value_writer.py @@ -29,4 +29,5 @@ def test_validate_kafka_topics(): def test_KafkaConsumer(): LOGGER.debug(" --->>> test_kafka_consumer: START <<<--- ") - KpiValueWriter.RunKafkaConsumer() + kpi_value_writer = KpiValueWriter() + kpi_value_writer.RunKafkaConsumer() -- GitLab From 162e29e19c09a91caf57f7a3be408517caefe1cb Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sun, 11 Aug 2024 15:22:23 +0000 Subject: [PATCH 531/602] Minor Changes in Telemetry test file. - src folder refernce is removed from header --- .../backend/tests/testTelemetryBackend.py | 38 ------------------- .../backend/tests/test_TelemetryBackend.py | 2 +- 2 files changed, 1 insertion(+), 39 deletions(-) delete mode 100644 src/telemetry/backend/tests/testTelemetryBackend.py diff --git a/src/telemetry/backend/tests/testTelemetryBackend.py b/src/telemetry/backend/tests/testTelemetryBackend.py deleted file mode 100644 index 95710ff88..000000000 --- a/src/telemetry/backend/tests/testTelemetryBackend.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging -from common.tools.kafka.Variables import KafkaTopic -from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService - - -LOGGER = logging.getLogger(__name__) - - -########################### -# Tests Implementation of Telemetry Backend -########################### - -# --- "test_validate_kafka_topics" should be run before the functionality tests --- -def test_validate_kafka_topics(): - LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ") - response = KafkaTopic.create_all_topics() - assert isinstance(response, bool) - -def test_RunRequestListener(): - LOGGER.info('test_RunRequestListener') - TelemetryBackendServiceObj = TelemetryBackendService() - response = TelemetryBackendServiceObj.RunRequestListener() - LOGGER.debug(str(response)) - assert isinstance(response, bool) diff --git a/src/telemetry/backend/tests/test_TelemetryBackend.py b/src/telemetry/backend/tests/test_TelemetryBackend.py index 95710ff88..a2bbee540 100644 --- a/src/telemetry/backend/tests/test_TelemetryBackend.py +++ b/src/telemetry/backend/tests/test_TelemetryBackend.py @@ -14,7 +14,7 @@ import logging from common.tools.kafka.Variables import KafkaTopic -from src.telemetry.backend.service.TelemetryBackendService import TelemetryBackendService +from telemetry.backend.service.TelemetryBackendService import TelemetryBackendService LOGGER = logging.getLogger(__name__) -- GitLab From bcc8c4901dd3173b2f941a52f310400c6fbffc8b Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 26 Aug 2024 10:48:48 +0000 Subject: [PATCH 532/602] Changes in Telemetry - Created the CRDB secret (`crdb-telemetry`). - Updated the IF conditions in the `$COMPONENT` deployment loop within the `tfs.sh` file according to telemetry service requirements. - Added the `Telemetryservice.yaml` file to the manifest folder. - Updated the CRDB URL in `TelemetryEngine.py`. - Made a minor formatting change in `TelemetryModel.py`. --- deploy/tfs.sh | 28 +++-- manifests/telemetryservice.yaml | 128 ++++++++++++++++++++++ src/telemetry/database/TelemetryEngine.py | 8 +- src/telemetry/database/TelemetryModel.py | 2 +- 4 files changed, 153 insertions(+), 13 deletions(-) create mode 100644 manifests/telemetryservice.yaml diff --git a/deploy/tfs.sh b/deploy/tfs.sh index 4ecfaae99..e72014418 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -170,7 +170,19 @@ kubectl create secret generic crdb-kpi-data --namespace ${TFS_K8S_NAMESPACE} --t --from-literal=CRDB_SSLMODE=require printf "\n" -echo "Create secret with Apache Kafka kfk-kpi-data for KPI and Telemetry microservices" +echo "Create secret with CockroachDB data for Telemetry microservices" +CRDB_SQL_PORT=$(kubectl --namespace ${CRDB_NAMESPACE} get service cockroachdb-public -o 'jsonpath={.spec.ports[?(@.name=="sql")].port}') +CRDB_DATABASE_TELEMETRY="tfs_telemetry" # TODO: change by specific configurable environment variable +kubectl create secret generic crdb-telemetry --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ + --from-literal=CRDB_NAMESPACE=${CRDB_NAMESPACE} \ + --from-literal=CRDB_SQL_PORT=${CRDB_SQL_PORT} \ + --from-literal=CRDB_DATABASE=${CRDB_DATABASE_TELEMETRY} \ + --from-literal=CRDB_USERNAME=${CRDB_USERNAME} \ + --from-literal=CRDB_PASSWORD=${CRDB_PASSWORD} \ + --from-literal=CRDB_SSLMODE=require +printf "\n" + +echo "Create secret with Apache Kafka data for KPI and Telemetry microservices" KFK_SERVER_PORT=$(kubectl --namespace ${KFK_NAMESPACE} get service kafka-service -o 'jsonpath={.spec.ports[0].port}') kubectl create secret generic kfk-kpi-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ --from-literal=KFK_NAMESPACE=${KFK_NAMESPACE} \ @@ -252,15 +264,17 @@ for COMPONENT in $TFS_COMPONENTS; do if [ "$COMPONENT" == "ztp" ] || [ "$COMPONENT" == "policy" ]; then $DOCKER_BUILD -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile ./src/"$COMPONENT"/ > "$BUILD_LOG" - elif [ "$COMPONENT" == "pathcomp" ]; then + elif [ "$COMPONENT" == "pathcomp" ] || [ "$COMPONENT" == "telemetry" ]; then BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-frontend.log" $DOCKER_BUILD -t "$COMPONENT-frontend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/frontend/Dockerfile . > "$BUILD_LOG" BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-backend.log" $DOCKER_BUILD -t "$COMPONENT-backend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/backend/Dockerfile . > "$BUILD_LOG" - # next command is redundant, but helpful to keep cache updated between rebuilds - IMAGE_NAME="$COMPONENT-backend:$TFS_IMAGE_TAG-builder" - $DOCKER_BUILD -t "$IMAGE_NAME" --target builder -f ./src/"$COMPONENT"/backend/Dockerfile . >> "$BUILD_LOG" + if [ "$COMPONENT" == "pathcomp" ]; then + # next command is redundant, but helpful to keep cache updated between rebuilds + IMAGE_NAME="$COMPONENT-backend:$TFS_IMAGE_TAG-builder" + $DOCKER_BUILD -t "$IMAGE_NAME" --target builder -f ./src/"$COMPONENT"/backend/Dockerfile . >> "$BUILD_LOG" + fi elif [ "$COMPONENT" == "dlt" ]; then BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-connector.log" $DOCKER_BUILD -t "$COMPONENT-connector:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/connector/Dockerfile . > "$BUILD_LOG" @@ -273,7 +287,7 @@ for COMPONENT in $TFS_COMPONENTS; do echo " Pushing Docker image to '$TFS_REGISTRY_IMAGES'..." - if [ "$COMPONENT" == "pathcomp" ]; then + if [ "$COMPONENT" == "pathcomp" ] || [ "$COMPONENT" == "telemetry" ]; then IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-frontend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-frontend.log" @@ -324,7 +338,7 @@ for COMPONENT in $TFS_COMPONENTS; do cp ./manifests/"${COMPONENT}"service.yaml "$MANIFEST" fi - if [ "$COMPONENT" == "pathcomp" ]; then + if [ "$COMPONENT" == "pathcomp" ] || [ "$COMPONENT" == "telemetry" ]; then IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-frontend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}-frontend:" "$MANIFEST" | cut -d ":" -f4) sed -E -i "s#image: $GITLAB_REPO_URL/$COMPONENT-frontend:${VERSION}#image: $IMAGE_URL#g" "$MANIFEST" diff --git a/manifests/telemetryservice.yaml b/manifests/telemetryservice.yaml new file mode 100644 index 000000000..2f9917499 --- /dev/null +++ b/manifests/telemetryservice.yaml @@ -0,0 +1,128 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: telemetryservice +spec: + selector: + matchLabels: + app: telemetryservice + #replicas: 1 + template: + metadata: + labels: + app: telemetryservice + spec: + terminationGracePeriodSeconds: 5 + containers: + - name: frontend + image: labs.etsi.org:5050/tfs/controller/telemetry-frontend:latest + imagePullPolicy: Always + ports: + - containerPort: 30050 + - containerPort: 9192 + env: + - name: LOG_LEVEL + value: "INFO" + envFrom: + - secretRef: + name: crdb-telemetry + - secretRef: + name: kfk-kpi-data + readinessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:30050"] + livenessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:30050"] + resources: + requests: + cpu: 250m + memory: 128Mi + limits: + cpu: 1000m + memory: 1024Mi + - name: backend + image: labs.etsi.org:5050/tfs/controller/telemetry-backend:latest + imagePullPolicy: Always + ports: + - containerPort: 30060 + - containerPort: 9192 + env: + - name: LOG_LEVEL + value: "INFO" + envFrom: + - secretRef: + name: kfk-kpi-data + readinessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:30060"] + livenessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:30060"] + resources: + requests: + cpu: 250m + memory: 128Mi + limits: + cpu: 1000m + memory: 1024Mi +--- +apiVersion: v1 +kind: Service +metadata: + name: telemetryservice + labels: + app: telemetryservice +spec: + type: ClusterIP + selector: + app: telemetryservice + ports: + - name: frontend-grpc + protocol: TCP + port: 30050 + targetPort: 30050 + - name: backend-grpc + protocol: TCP + port: 30060 + targetPort: 30060 + - name: metrics + protocol: TCP + port: 9192 + targetPort: 9192 +--- +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: telemetryservice-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: telemetryservice + minReplicas: 1 + maxReplicas: 20 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 80 + #behavior: + # scaleDown: + # stabilizationWindowSeconds: 30 diff --git a/src/telemetry/database/TelemetryEngine.py b/src/telemetry/database/TelemetryEngine.py index 965b7c38d..18ec2ddbc 100644 --- a/src/telemetry/database/TelemetryEngine.py +++ b/src/telemetry/database/TelemetryEngine.py @@ -17,8 +17,8 @@ from common.Settings import get_setting LOGGER = logging.getLogger(__name__) -CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' -# CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' +# CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' +CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' class TelemetryEngine: @staticmethod @@ -32,7 +32,7 @@ class TelemetryEngine: CRDB_PASSWORD = "tfs123" CRDB_SSLMODE = "require" crdb_uri = CRDB_URI_TEMPLATE.format( - CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) + CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) try: engine = sqlalchemy.create_engine(crdb_uri, echo=False) LOGGER.info(' TelemetryDB initalized with DB URL: {:}'.format(crdb_uri)) @@ -40,5 +40,3 @@ class TelemetryEngine: LOGGER.exception('Failed to connect to database: {:s}'.format(str(crdb_uri))) return None # type: ignore return engine # type: ignore - - diff --git a/src/telemetry/database/TelemetryModel.py b/src/telemetry/database/TelemetryModel.py index 611ce7e70..4e71ce813 100644 --- a/src/telemetry/database/TelemetryModel.py +++ b/src/telemetry/database/TelemetryModel.py @@ -63,7 +63,7 @@ class Collector(Base): Args: row: The Collector table instance (row) containing the data. Returns: collector gRPC message initialized with the content of a row. """ - response = telemetry_frontend_pb2.Collector() + response = telemetry_frontend_pb2.Collector() response.collector_id.collector_id.uuid = row.collector_id response.kpi_id.kpi_id.uuid = row.kpi_id response.duration_s = row.sampling_duration_s -- GitLab From 7e8ae67a9732ea8c519bac43f58f886df06642ba Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 26 Aug 2024 14:56:03 +0000 Subject: [PATCH 533/602] Minor chanages in Telemetry. - Unnecessary echo statements are removed from .gitlab-ci.yml file. - "-e ALLOW_ANONYMOUS_LOGIN=yes" flag is added to allow unauthorized connection with the zookeeper. --- src/telemetry/.gitlab-ci.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/telemetry/.gitlab-ci.yml b/src/telemetry/.gitlab-ci.yml index c7950eb91..110a6490d 100644 --- a/src/telemetry/.gitlab-ci.yml +++ b/src/telemetry/.gitlab-ci.yml @@ -145,12 +145,13 @@ unit_test telemetry-frontend: cockroachdb/cockroach:latest-v22.2 start-single-node - echo "Waiting for initialization..." - while ! docker logs crdb 2>&1 | grep -q 'finished creating default user \"tfs\"'; do sleep 1; done - - docker logs crdb - - docker ps -a + # - docker logs crdb + # - docker ps -a - CRDB_ADDRESS=$(docker inspect crdb --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") - echo $CRDB_ADDRESS - > - docker run --name zookeeper -d --network=teraflowbridge -p 2181:2181 + docker run --name zookeeper -d --network=teraflowbridge -p 2181:2181 \ + -e ALLOW_ANONYMOUS_LOGIN=yes \ bitnami/zookeeper:latest - sleep 10 # Wait for Zookeeper to start - docker run --name kafka -d --network=teraflowbridge -p 9092:9092 @@ -160,8 +161,8 @@ unit_test telemetry-frontend: - sleep 20 # Wait for Kafka to start - KAFKA_IP=$(docker inspect kafka --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}") - echo $KAFKA_IP - - docker logs zookeeper - - docker logs kafka + # - docker logs zookeeper + # - docker logs kafka - > docker run --name $IMAGE_NAME-frontend -d -p 30050:30050 --env "CRDB_URI=cockroachdb://tfs:tfs123@${CRDB_ADDRESS}:26257/tfs_test?sslmode=require" -- GitLab From 93fe4ea718d7bffa7ca73d996c023a5a4a0e7a5a Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 27 Aug 2024 15:31:23 +0000 Subject: [PATCH 534/602] change in Analytics proto file. - AnalyzerId is added in "Analyzer" message type. --- proto/analytics_frontend.proto | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/proto/analytics_frontend.proto b/proto/analytics_frontend.proto index 096c1ee03..801fcdbc4 100644 --- a/proto/analytics_frontend.proto +++ b/proto/analytics_frontend.proto @@ -35,10 +35,11 @@ enum AnalyzerOperationMode { } message Analyzer { - string algorithm_name = 1; // The algorithm to be executed - repeated kpi_manager.KpiId input_kpi_ids = 2; // The KPI Ids to be processed by the analyzer - repeated kpi_manager.KpiId output_kpi_ids = 3; // The KPI Ids produced by the analyzer - AnalyzerOperationMode operation_mode = 4; // Operation mode of the analyzer + AnalyzerId analyzer_id = 1; + string algorithm_name = 2; // The algorithm to be executed + repeated kpi_manager.KpiId input_kpi_ids = 3; // The KPI Ids to be processed by the analyzer + repeated kpi_manager.KpiId output_kpi_ids = 4; // The KPI Ids produced by the analyzer + AnalyzerOperationMode operation_mode = 5; // Operation mode of the analyzer // In batch mode... float batch_min_duration_s = 5; // ..., min duration to collect before executing batch -- GitLab From 8e9f2eaf39b9a35a788130063c79da53e15296e7 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 27 Aug 2024 15:35:53 +0000 Subject: [PATCH 535/602] changes in Analyzer proto file. - Assignement number was incorrect, 5 was assigned twice. --- proto/analytics_frontend.proto | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/proto/analytics_frontend.proto b/proto/analytics_frontend.proto index 801fcdbc4..45e910a70 100644 --- a/proto/analytics_frontend.proto +++ b/proto/analytics_frontend.proto @@ -42,10 +42,10 @@ message Analyzer { AnalyzerOperationMode operation_mode = 5; // Operation mode of the analyzer // In batch mode... - float batch_min_duration_s = 5; // ..., min duration to collect before executing batch - float batch_max_duration_s = 6; // ..., max duration collected to execute the batch - uint64 batch_min_size = 7; // ..., min number of samples to collect before executing batch - uint64 batch_max_size = 8; // ..., max number of samples collected to execute the batch + float batch_min_duration_s = 6; // ..., min duration to collect before executing batch + float batch_max_duration_s = 7; // ..., max duration collected to execute the batch + uint64 batch_min_size = 8; // ..., min number of samples to collect before executing batch + uint64 batch_max_size = 9; // ..., max number of samples collected to execute the batch } message AnalyzerFilter { -- GitLab From e0a77d5f43a2a539beffe8681835bfa7f80f827e Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 28 Aug 2024 09:58:22 +0000 Subject: [PATCH 536/602] Changes in Analytics Frontend. - Actul logic is added in StartAnalyzer method. - Actual logic is added in StopAnalyzer method. - Improvements in message formats. --- .../AnalyticsFrontendServiceServicerImpl.py | 80 +++++++++++++++++-- src/analytics/frontend/tests/messages.py | 16 +++- 2 files changed, 86 insertions(+), 10 deletions(-) diff --git a/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py index b981c038b..071890105 100644 --- a/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py +++ b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py @@ -13,22 +13,31 @@ # limitations under the License. -import logging, grpc +import logging, grpc, json +from typing import Dict +from confluent_kafka import Consumer as KafkaConsumer +from confluent_kafka import Producer as KafkaProducer +from confluent_kafka import KafkaError + +from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from common.proto.context_pb2 import Empty from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method - from common.proto.analytics_frontend_pb2 import Analyzer, AnalyzerId, AnalyzerFilter, AnalyzerList from common.proto.analytics_frontend_pb2_grpc import AnalyticsFrontendServiceServicer -LOGGER = logging.getLogger(__name__) -METRICS_POOL = MetricsPool('AnalyticsFrontend', 'NBIgRPC') - +LOGGER = logging.getLogger(__name__) +METRICS_POOL = MetricsPool('AnalyticsFrontend', 'NBIgRPC') +ACTIVE_ANALYZERS = [] # In case of sevice restarts, the list can be populated from the DB. class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer): def __init__(self): LOGGER.info('Init AnalyticsFrontendService') + self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.get_kafka_address()}) + self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.get_kafka_address(), + 'group.id' : 'analytics-frontend', + 'auto.offset.reset' : 'latest'}) @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) @@ -37,17 +46,64 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer): ) -> AnalyzerId: # type: ignore LOGGER.info ("At Service gRPC message: {:}".format(request)) response = AnalyzerId() - + self.PublishStartRequestOnKafka(request) return response - + + def PublishStartRequestOnKafka(self, analyzer_obj): + """ + Method to generate analyzer request on Kafka. + """ + analyzer_uuid = analyzer_obj.analyzer_id.analyzer_id.uuid + analyzer_to_generate : Dict = { + "algo_name" : analyzer_obj.algorithm_name, + "input_kpis" : [k.kpi_id.uuid for k in analyzer_obj.input_kpi_ids], + "output_kpis" : [k.kpi_id.uuid for k in analyzer_obj.output_kpi_ids], + "oper_mode" : analyzer_obj.operation_mode + } + self.kafka_producer.produce( + KafkaTopic.VALUE.value, + key = analyzer_uuid, + value = json.dumps(analyzer_to_generate), + callback = self.delivery_callback + ) + LOGGER.info("Analyzer Start Request Generated: Analyzer Id: {:}, Value: {:}".format(analyzer_uuid, analyzer_to_generate)) + ACTIVE_ANALYZERS.append(analyzer_uuid) + self.kafka_producer.flush() + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StopAnalyzer(self, request : AnalyzerId, grpc_context: grpc.ServicerContext # type: ignore ) -> Empty: # type: ignore LOGGER.info ("At Service gRPC message: {:}".format(request)) - + self.PublishStopRequestOnKafka(request) return Empty() + def PublishStopRequestOnKafka(self, analyzer_id): + """ + Method to generate stop analyzer request on Kafka. + """ + analyzer_uuid = analyzer_id.analyzer_id.uuid + analyzer_to_stop : Dict = { + "algo_name" : -1, + "input_kpis" : [], + "output_kpis" : [], + "oper_mode" : -1 + } + self.kafka_producer.produce( + KafkaTopic.VALUE.value, + key = analyzer_uuid, + value = json.dumps(analyzer_to_stop), + callback = self.delivery_callback + ) + LOGGER.info("Analyzer Stop Request Generated: Analyzer Id: {:}".format(analyzer_uuid)) + self.kafka_producer.flush() + try: + ACTIVE_ANALYZERS.remove(analyzer_uuid) + except ValueError: + LOGGER.warning('Analyzer ID {:} not found in active analyzers'.format(analyzer_uuid)) + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SelectAnalyzers(self, request : AnalyzerFilter, contextgrpc_context: grpc.ServicerContext # type: ignore @@ -56,3 +112,11 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer): response = AnalyzerList() return response + + def delivery_callback(self, err, msg): + if err: + LOGGER.debug('Message delivery failed: {:}'.format(err)) + print('Message delivery failed: {:}'.format(err)) + # else: + # LOGGER.debug('Message delivered to topic {:}'.format(msg.topic())) + # print('Message delivered to topic {:}'.format(msg.topic())) diff --git a/src/analytics/frontend/tests/messages.py b/src/analytics/frontend/tests/messages.py index 1aaf8dd47..04653857d 100644 --- a/src/analytics/frontend/tests/messages.py +++ b/src/analytics/frontend/tests/messages.py @@ -28,9 +28,15 @@ def create_analyzer(): _create_analyzer.algorithm_name = "some_algo_name" _kpi_id = KpiId() - _kpi_id.kpi_id.uuid = str(uuid.uuid4()) # input IDs to analyze + # input IDs to analyze + _kpi_id.kpi_id.uuid = str(uuid.uuid4()) _create_analyzer.input_kpi_ids.append(_kpi_id) - _kpi_id.kpi_id.uuid = str(uuid.uuid4()) # output IDs after analysis + _kpi_id.kpi_id.uuid = str(uuid.uuid4()) + _create_analyzer.input_kpi_ids.append(_kpi_id) + # output IDs after analysis + _kpi_id.kpi_id.uuid = str(uuid.uuid4()) + _create_analyzer.output_kpi_ids.append(_kpi_id) + _kpi_id.kpi_id.uuid = str(uuid.uuid4()) _create_analyzer.output_kpi_ids.append(_kpi_id) _create_analyzer.operation_mode = AnalyzerOperationMode.ANALYZEROPERATIONMODE_STREAMING @@ -49,10 +55,16 @@ def create_analyzer_filter(): _input_kpi_id_obj = KpiId() _input_kpi_id_obj.kpi_id.uuid = str(uuid.uuid4()) _create_analyzer_filter.input_kpi_ids.append(_input_kpi_id_obj) + # another input kpi Id + # _input_kpi_id_obj.kpi_id.uuid = str(uuid.uuid4()) + # _create_analyzer_filter.input_kpi_ids.append(_input_kpi_id_obj) _output_kpi_id_obj = KpiId() _output_kpi_id_obj.kpi_id.uuid = str(uuid.uuid4()) _create_analyzer_filter.output_kpi_ids.append(_output_kpi_id_obj) + # another output kpi Id + # _output_kpi_id_obj.kpi_id.uuid = str(uuid.uuid4()) + # _create_analyzer_filter.input_kpi_ids.append(_output_kpi_id_obj) return _create_analyzer_filter -- GitLab From 113a54ddefa6cf3ed0d2663b7f53a8e0d844633a Mon Sep 17 00:00:00 2001 From: jjdiaz Date: Wed, 28 Aug 2024 12:30:13 +0200 Subject: [PATCH 537/602] Async implementation --- .../topology_abstractor/DltRecorder.py | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index c5660e43d..418a53612 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -15,6 +15,7 @@ import logging import threading import asyncio +import time from typing import Dict, Optional from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum @@ -47,6 +48,12 @@ class DLTRecorder(threading.Thread): self.context_event_collector = EventsCollector(self.context_client) self.topology_cache: Dict[str, TopologyId] = {} + # Queues for each event type + self.create_event_queue = asyncio.Queue() + self.update_event_queue = asyncio.Queue() + self.remove_event_queue = asyncio.Queue() + + def stop(self): self.terminate.set() @@ -61,27 +68,29 @@ class DLTRecorder(threading.Thread): tasks = [] batch_timeout = 1 # Time in seconds to wait before processing whatever tasks are available + last_task_time = time.time() while not self.terminate.is_set(): event = self.context_event_collector.get_event(timeout=0.1) - if event is None: - continue - LOGGER.info('Processing Event({:s})...'.format(grpc_message_to_json_string(event))) - task = asyncio.create_task(self.update_record(event)) - tasks.append(task) - LOGGER.debug('Task for event scheduled.') - # Limit the number of concurrent tasks - # If we have enough tasks or it's time to process them - if len(tasks) >= 10 or (tasks and len(tasks) > 0 and await asyncio.sleep(batch_timeout)): + if event: + LOGGER.info('Processing Event({:s})...'.format(grpc_message_to_json_string(event))) + task = asyncio.create_task(self.update_record(event)) + tasks.append(task) + LOGGER.debug('Task for event scheduled.') + + # Update the last task time since we've added a new task + last_task_time = time.time() + + # Check if it's time to process the tasks or if we have enough tasks + if tasks and (len(tasks) >= 10 or (time.time() - last_task_time >= batch_timeout)): try: await asyncio.gather(*tasks) except Exception as e: LOGGER.error(f"Error while processing tasks: {e}") finally: tasks = [] # Clear the list after processing - await asyncio.gather(*tasks) - tasks = [] # Clear the list after processing - # Process any remaining tasks when stopping + + # Process any remaining tasks when stopping if tasks: try: await asyncio.gather(*tasks) @@ -91,10 +100,6 @@ class DLTRecorder(threading.Thread): self.context_event_collector.stop() self.context_client.close() - #def create_topologies(self): - #topology_uuids = [DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME] - #create_missing_topologies(self.context_client, ADMIN_CONTEXT_ID, topology_uuids) - async def update_record(self, event: EventTypes) -> None: dlt_record_sender = DltRecordSender(self.context_client) await dlt_record_sender.initialize() # Ensure DltRecordSender is initialized asynchronously -- GitLab From ea35c20d9777a2673fe4bbb0307e4a2262c582b2 Mon Sep 17 00:00:00 2001 From: jjdiaz Date: Wed, 28 Aug 2024 14:58:16 +0200 Subject: [PATCH 538/602] Async Implementation, Batches --- .../topology_abstractor/DltRecorder.py | 65 ++++++++++++------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index 418a53612..97b48628a 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -65,40 +65,55 @@ class DLTRecorder(threading.Thread): create_context(self.context_client, DEFAULT_CONTEXT_NAME) #self.create_topologies() self.context_event_collector.start() - - tasks = [] + + batch_timeout = 1 # Time in seconds to wait before processing whatever tasks are available last_task_time = time.time() - + while not self.terminate.is_set(): event = self.context_event_collector.get_event(timeout=0.1) if event: - LOGGER.info('Processing Event({:s})...'.format(grpc_message_to_json_string(event))) - task = asyncio.create_task(self.update_record(event)) - tasks.append(task) - LOGGER.debug('Task for event scheduled.') - - # Update the last task time since we've added a new task - last_task_time = time.time() - - # Check if it's time to process the tasks or if we have enough tasks - if tasks and (len(tasks) >= 10 or (time.time() - last_task_time >= batch_timeout)): - try: - await asyncio.gather(*tasks) - except Exception as e: - LOGGER.error(f"Error while processing tasks: {e}") - finally: - tasks = [] # Clear the list after processing - - # Process any remaining tasks when stopping + LOGGER.info('Received Event({:s})...'.format(grpc_message_to_json_string(event))) + + # Prioritize the event based on its type + if event.event.event_type == 1: # CREATE + await self.create_event_queue.put(event) + elif event.event.event_type == 2: # UPDATE + await self.update_event_queue.put(event) + elif event.event.event_type == 3: # REMOVE + await self.remove_event_queue.put(event) + + # Check if it's time to process the tasks or if we have enough tasks + current_time = time.time() + if current_time - last_task_time >= batch_timeout: + await self.process_events() + last_task_time = current_time # Reset the timer after processing + + self.context_event_collector.stop() + self.context_client.close() + + async def process_events(self): + # Process CREATE events first + await self.process_queue(self.create_event_queue) + # Then process UPDATE events + await self.process_queue(self.update_event_queue) + # Finally, process REMOVE events + await self.process_queue(self.remove_event_queue) + + async def process_queue(self, queue: asyncio.Queue): + tasks = [] + while not queue.empty(): + event = await queue.get() + LOGGER.info('Processing Event({:s}) from queue...'.format(grpc_message_to_json_string(event))) + task = asyncio.create_task(self.update_record(event)) + tasks.append(task) + + # Execute tasks concurrently if tasks: try: await asyncio.gather(*tasks) except Exception as e: - LOGGER.error(f"Error while processing remaining tasks: {e}") - - self.context_event_collector.stop() - self.context_client.close() + LOGGER.error(f"Error while processing tasks: {e}") async def update_record(self, event: EventTypes) -> None: dlt_record_sender = DltRecordSender(self.context_client) -- GitLab From 28bf80d3f22f3f38490ec96387dbaa414bd23557 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Wed, 28 Aug 2024 15:28:18 +0000 Subject: [PATCH 539/602] Changes in Analytic DB and Frontend - Created the Analytic Engine, Model, and DB files. - Added the DB connection. - Added `add_row_to_db` in `StartCollector`. - Added `delete_db_row_by_id` in `StopCollector`. - Improved message formatting. - Added a DB test file. --- scripts/run_tests_locally-analytics-DB.sh | 24 +++ .../run_tests_locally-analytics-frontend.sh | 3 +- src/analytics/database/AnalyzerEngine.py | 40 +++++ src/analytics/database/AnalyzerModel.py | 101 +++++++++++++ src/analytics/database/Analyzer_DB.py | 137 ++++++++++++++++++ src/analytics/database/__init__.py | 14 ++ .../AnalyticsFrontendServiceServicerImpl.py | 18 ++- src/analytics/frontend/tests/messages.py | 12 +- src/analytics/requirements.in | 21 +++ src/analytics/tests/test_analytics_db.py | 28 ++++ 10 files changed, 390 insertions(+), 8 deletions(-) create mode 100755 scripts/run_tests_locally-analytics-DB.sh create mode 100644 src/analytics/database/AnalyzerEngine.py create mode 100644 src/analytics/database/AnalyzerModel.py create mode 100644 src/analytics/database/Analyzer_DB.py create mode 100644 src/analytics/database/__init__.py create mode 100644 src/analytics/requirements.in create mode 100644 src/analytics/tests/test_analytics_db.py diff --git a/scripts/run_tests_locally-analytics-DB.sh b/scripts/run_tests_locally-analytics-DB.sh new file mode 100755 index 000000000..9df5068d6 --- /dev/null +++ b/scripts/run_tests_locally-analytics-DB.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + + +PROJECTDIR=`pwd` + +cd $PROJECTDIR/src +RCFILE=$PROJECTDIR/coverage/.coveragerc +CRDB_SQL_ADDRESS=$(kubectl get service cockroachdb-public --namespace crdb -o jsonpath='{.spec.clusterIP}') +export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_kpi_mgmt?sslmode=require" +python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ + analytics/tests/test_analytics_db.py diff --git a/scripts/run_tests_locally-analytics-frontend.sh b/scripts/run_tests_locally-analytics-frontend.sh index 58fd062f2..e30d30da6 100755 --- a/scripts/run_tests_locally-analytics-frontend.sh +++ b/scripts/run_tests_locally-analytics-frontend.sh @@ -17,7 +17,8 @@ PROJECTDIR=`pwd` cd $PROJECTDIR/src - RCFILE=$PROJECTDIR/coverage/.coveragerc +CRDB_SQL_ADDRESS=$(kubectl get service cockroachdb-public --namespace crdb -o jsonpath='{.spec.clusterIP}') +export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_kpi_mgmt?sslmode=require" python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ analytics/frontend/tests/test_frontend.py diff --git a/src/analytics/database/AnalyzerEngine.py b/src/analytics/database/AnalyzerEngine.py new file mode 100644 index 000000000..4bed9f93a --- /dev/null +++ b/src/analytics/database/AnalyzerEngine.py @@ -0,0 +1,40 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging, sqlalchemy +from common.Settings import get_setting + +LOGGER = logging.getLogger(__name__) +CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' + +class AnalyzerEngine: + @staticmethod + def get_engine() -> sqlalchemy.engine.Engine: + crdb_uri = get_setting('CRDB_URI', default=None) + if crdb_uri is None: + CRDB_NAMESPACE = "crdb" + CRDB_SQL_PORT = "26257" + CRDB_DATABASE = "tfs-analyzer" + CRDB_USERNAME = "tfs" + CRDB_PASSWORD = "tfs123" + CRDB_SSLMODE = "require" + crdb_uri = CRDB_URI_TEMPLATE.format( + CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) + try: + engine = sqlalchemy.create_engine(crdb_uri, echo=False) + LOGGER.info(' AnalyzerDB initalized with DB URL: {:}'.format(crdb_uri)) + except: + LOGGER.exception('Failed to connect to database: {:s}'.format(str(crdb_uri))) + return None + return engine diff --git a/src/analytics/database/AnalyzerModel.py b/src/analytics/database/AnalyzerModel.py new file mode 100644 index 000000000..0b66e04d0 --- /dev/null +++ b/src/analytics/database/AnalyzerModel.py @@ -0,0 +1,101 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging +import enum + +from sqlalchemy import Column, String, Float, Enum +from sqlalchemy.orm import registry +from common.proto import analytics_frontend_pb2 +from common.proto import kpi_manager_pb2 + +from sqlalchemy.dialects.postgresql import UUID, ARRAY + + +logging.basicConfig(level=logging.INFO) +LOGGER = logging.getLogger(__name__) + +# Create a base class for declarative models +Base = registry().generate_base() + +class AnalyzerOperationMode (enum.Enum): + BATCH = analytics_frontend_pb2.AnalyzerOperationMode.ANALYZEROPERATIONMODE_BATCH + STREAMING = analytics_frontend_pb2.AnalyzerOperationMode.ANALYZEROPERATIONMODE_STREAMING + +class Analyzer(Base): + __tablename__ = 'analyzer' + + analyzer_id = Column(UUID(as_uuid=False) , primary_key=True) + algorithm_name = Column(String , nullable=False) + input_kpi_ids = Column(ARRAY(UUID(as_uuid=False)) , nullable=False) + output_kpi_ids = Column(ARRAY(UUID(as_uuid=False)) , nullable=False) + operation_mode = Column(Enum(AnalyzerOperationMode), nullable=False) + batch_min_duration_s = Column(Float , nullable=False) + batch_max_duration_s = Column(Float , nullable=False) + bacth_min_size = Column(Float , nullable=False) + bacth_max_size = Column(Float , nullable=False) + + # helps in logging the information + def __repr__(self): + return (f"") + + @classmethod + def ConvertAnalyzerToRow(cls, request): + """ + Create an instance of Analyzer table rows from a request object. + Args: request: The request object containing analyzer gRPC message. + Returns: A row (an instance of Analyzer table) initialized with content of the request. + """ + return cls( + analyzer_id = request.analyzer_id.analyzer_id.uuid, + algorithm_name = request.algorithm_name, + input_kpi_ids = [k.kpi_id.uuid for k in request.input_kpi_ids], + output_kpi_ids = [k.kpi_id.uuid for k in request.output_kpi_ids], + operation_mode = AnalyzerOperationMode(request.operation_mode), # converts integer to coresponding Enum class member + batch_min_duration_s = request.batch_min_duration_s, + batch_max_duration_s = request.batch_max_duration_s, + bacth_min_size = request.batch_min_size, + bacth_max_size = request.batch_max_size + ) + + @classmethod + def ConvertRowToAnalyzer(cls, row): + """ + Create and return an Analyzer gRPC message initialized with the content of a row. + Args: row: The Analyzer table instance (row) containing the data. + Returns: An Analyzer gRPC message initialized with the content of the row. + """ + # Create an instance of the Analyzer message + response = analytics_frontend_pb2.Analyzer() + response.analyzer_id.analyzer_id.uuid = row.analyzer_id + response.algorithm_name = row.algorithm_name + response.operation_mode = row.operation_mode + + _kpi_id = kpi_manager_pb2.KpiId() + for input_kpi_id in row.input_kpi_ids: + _kpi_id.kpi_id.uuid = input_kpi_id + response.input_kpi_ids.append(_kpi_id) + for output_kpi_id in row.output_kpi_ids: + _kpi_id.kpi_id.uuid = output_kpi_id + response.output_kpi_ids.append(_kpi_id) + + response.batch_min_duration_s = row.batch_min_duration_s + response.batch_max_duration_s = row.batch_max_duration_s + response.batch_min_size = row.bacth_min_size + response.batch_max_size = row.bacth_max_size + return response diff --git a/src/analytics/database/Analyzer_DB.py b/src/analytics/database/Analyzer_DB.py new file mode 100644 index 000000000..896ba1100 --- /dev/null +++ b/src/analytics/database/Analyzer_DB.py @@ -0,0 +1,137 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging +import sqlalchemy_utils + +from sqlalchemy import inspect +from sqlalchemy.orm import sessionmaker + +from analytics.database.AnalyzerModel import Analyzer as AnalyzerModel +from analytics.database.AnalyzerEngine import AnalyzerEngine +from common.method_wrappers.ServiceExceptions import (OperationFailedException, AlreadyExistsException) + +LOGGER = logging.getLogger(__name__) +DB_NAME = "tfs_analyzer" # TODO: export name from enviornment variable + +class AnalyzerDB: + def __init__(self): + self.db_engine = AnalyzerEngine.get_engine() + if self.db_engine is None: + LOGGER.error('Unable to get SQLAlchemy DB Engine...') + return False + self.db_name = DB_NAME + self.Session = sessionmaker(bind=self.db_engine) + + def create_database(self): + if not sqlalchemy_utils.database_exists(self.db_engine.url): + LOGGER.debug("Database created. {:}".format(self.db_engine.url)) + sqlalchemy_utils.create_database(self.db_engine.url) + + def drop_database(self) -> None: + if sqlalchemy_utils.database_exists(self.db_engine.url): + sqlalchemy_utils.drop_database(self.db_engine.url) + + def create_tables(self): + try: + AnalyzerModel.metadata.create_all(self.db_engine) # type: ignore + LOGGER.debug("Tables created in the database: {:}".format(self.db_name)) + except Exception as e: + LOGGER.debug("Tables cannot be created in the database. {:s}".format(str(e))) + raise OperationFailedException ("Tables can't be created", extra_details=["unable to create table {:}".format(e)]) + + def verify_tables(self): + try: + inspect_object = inspect(self.db_engine) + if(inspect_object.has_table('analyzer', None)): + LOGGER.info("Table exists in DB: {:}".format(self.db_name)) + except Exception as e: + LOGGER.info("Unable to fetch Table names. {:s}".format(str(e))) + +# ----------------- CURD OPERATIONS --------------------- + + def add_row_to_db(self, row): + session = self.Session() + try: + session.add(row) + session.commit() + LOGGER.debug(f"Row inserted into {row.__class__.__name__} table.") + return True + except Exception as e: + session.rollback() + if "psycopg2.errors.UniqueViolation" in str(e): + LOGGER.error(f"Unique key voilation: {row.__class__.__name__} table. {str(e)}") + raise AlreadyExistsException(row.__class__.__name__, row, + extra_details=["Unique key voilation: {:}".format(e)] ) + else: + LOGGER.error(f"Failed to insert new row into {row.__class__.__name__} table. {str(e)}") + raise OperationFailedException ("Deletion by column id", extra_details=["unable to delete row {:}".format(e)]) + finally: + session.close() + + def search_db_row_by_id(self, model, col_name, id_to_search): + session = self.Session() + try: + entity = session.query(model).filter_by(**{col_name: id_to_search}).first() + if entity: + # LOGGER.debug(f"{model.__name__} ID found: {str(entity)}") + return entity + else: + LOGGER.debug(f"{model.__name__} ID not found, No matching row: {str(id_to_search)}") + print("{:} ID not found, No matching row: {:}".format(model.__name__, id_to_search)) + return None + except Exception as e: + session.rollback() + LOGGER.debug(f"Failed to retrieve {model.__name__} ID. {str(e)}") + raise OperationFailedException ("search by column id", extra_details=["unable to search row {:}".format(e)]) + finally: + session.close() + + def delete_db_row_by_id(self, model, col_name, id_to_search): + session = self.Session() + try: + record = session.query(model).filter_by(**{col_name: id_to_search}).first() + if record: + session.delete(record) + session.commit() + LOGGER.debug("Deleted %s with %s: %s", model.__name__, col_name, id_to_search) + else: + LOGGER.debug("%s with %s %s not found", model.__name__, col_name, id_to_search) + return None + except Exception as e: + session.rollback() + LOGGER.error("Error deleting %s with %s %s: %s", model.__name__, col_name, id_to_search, e) + raise OperationFailedException ("Deletion by column id", extra_details=["unable to delete row {:}".format(e)]) + finally: + session.close() + + def select_with_filter(self, model, filter_object): + session = self.Session() + try: + query = session.query(AnalyzerModel) + # Apply filters based on the filter_object + if filter_object.kpi_id: + query = query.filter(AnalyzerModel.kpi_id.in_([k.kpi_id.uuid for k in filter_object.kpi_id])) # Need to be updated + result = query.all() + # query should be added to return all rows + if result: + LOGGER.debug(f"Fetched filtered rows from {model.__name__} table with filters: {filter_object}") # - Results: {result} + else: + LOGGER.warning(f"No matching row found in {model.__name__} table with filters: {filter_object}") + return result + except Exception as e: + LOGGER.error(f"Error fetching filtered rows from {model.__name__} table with filters {filter_object} ::: {e}") + raise OperationFailedException ("Select by filter", extra_details=["unable to apply the filter {:}".format(e)]) + finally: + session.close() diff --git a/src/analytics/database/__init__.py b/src/analytics/database/__init__.py new file mode 100644 index 000000000..3ee6f7071 --- /dev/null +++ b/src/analytics/database/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py index 071890105..ccbef3599 100644 --- a/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py +++ b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py @@ -25,6 +25,8 @@ from common.proto.context_pb2 import Empty from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.proto.analytics_frontend_pb2 import Analyzer, AnalyzerId, AnalyzerFilter, AnalyzerList from common.proto.analytics_frontend_pb2_grpc import AnalyticsFrontendServiceServicer +from analytics.database.Analyzer_DB import AnalyzerDB +from analytics.database.AnalyzerModel import Analyzer as AnalyzerModel LOGGER = logging.getLogger(__name__) @@ -34,6 +36,7 @@ ACTIVE_ANALYZERS = [] # In case of sevice restarts, the list can be populated class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer): def __init__(self): LOGGER.info('Init AnalyticsFrontendService') + self.db_obj = AnalyzerDB() self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.get_kafka_address()}) self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.get_kafka_address(), 'group.id' : 'analytics-frontend', @@ -46,7 +49,13 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer): ) -> AnalyzerId: # type: ignore LOGGER.info ("At Service gRPC message: {:}".format(request)) response = AnalyzerId() + + self.db_obj.add_row_to_db( + AnalyzerModel.ConvertAnalyzerToRow(request) + ) self.PublishStartRequestOnKafka(request) + + response.analyzer_id.uuid = request.analyzer_id.analyzer_id.uuid return response def PublishStartRequestOnKafka(self, analyzer_obj): @@ -76,9 +85,16 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer): request : AnalyzerId, grpc_context: grpc.ServicerContext # type: ignore ) -> Empty: # type: ignore LOGGER.info ("At Service gRPC message: {:}".format(request)) + try: + analyzer_id_to_delete = request.analyzer_id.uuid + self.db_obj.delete_db_row_by_id( + AnalyzerModel, "analyzer_id", analyzer_id_to_delete + ) + except Exception as e: + LOGGER.warning('Unable to delete analyzer. Error: {:}'.format(e)) self.PublishStopRequestOnKafka(request) return Empty() - + def PublishStopRequestOnKafka(self, analyzer_id): """ Method to generate stop analyzer request on Kafka. diff --git a/src/analytics/frontend/tests/messages.py b/src/analytics/frontend/tests/messages.py index 04653857d..4c826e5c3 100644 --- a/src/analytics/frontend/tests/messages.py +++ b/src/analytics/frontend/tests/messages.py @@ -19,13 +19,15 @@ from common.proto.analytics_frontend_pb2 import ( AnalyzerOperationMode, Analyze def create_analyzer_id(): _create_analyzer_id = AnalyzerId() - _create_analyzer_id.analyzer_id.uuid = str(uuid.uuid4()) + # _create_analyzer_id.analyzer_id.uuid = str(uuid.uuid4()) + _create_analyzer_id.analyzer_id.uuid = "9baa306d-d91c-48c2-a92f-76a21bab35b6" return _create_analyzer_id def create_analyzer(): - _create_analyzer = Analyzer() - - _create_analyzer.algorithm_name = "some_algo_name" + _create_analyzer = Analyzer() + _create_analyzer.analyzer_id.analyzer_id.uuid = str(uuid.uuid4()) + _create_analyzer.algorithm_name = "some_algo_name" + _create_analyzer.operation_mode = AnalyzerOperationMode.ANALYZEROPERATIONMODE_STREAMING _kpi_id = KpiId() # input IDs to analyze @@ -39,8 +41,6 @@ def create_analyzer(): _kpi_id.kpi_id.uuid = str(uuid.uuid4()) _create_analyzer.output_kpi_ids.append(_kpi_id) - _create_analyzer.operation_mode = AnalyzerOperationMode.ANALYZEROPERATIONMODE_STREAMING - return _create_analyzer def create_analyzer_filter(): diff --git a/src/analytics/requirements.in b/src/analytics/requirements.in new file mode 100644 index 000000000..98cf96710 --- /dev/null +++ b/src/analytics/requirements.in @@ -0,0 +1,21 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +java==11.0.* +pyspark==3.5.2 +confluent-kafka==2.3.* +psycopg2-binary==2.9.* +SQLAlchemy==1.4.* +sqlalchemy-cockroachdb==1.4.* +SQLAlchemy-Utils==0.38.* \ No newline at end of file diff --git a/src/analytics/tests/test_analytics_db.py b/src/analytics/tests/test_analytics_db.py new file mode 100644 index 000000000..58e7d0167 --- /dev/null +++ b/src/analytics/tests/test_analytics_db.py @@ -0,0 +1,28 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging +from analytics.database.Analyzer_DB import AnalyzerDB + +LOGGER = logging.getLogger(__name__) + +def test_verify_databases_and_tables(): + LOGGER.info('>>> test_verify_databases_and_tables : START <<< ') + AnalyzerDBobj = AnalyzerDB() + # AnalyzerDBobj.drop_database() + # AnalyzerDBobj.verify_tables() + AnalyzerDBobj.create_database() + AnalyzerDBobj.create_tables() + AnalyzerDBobj.verify_tables() -- GitLab From 0c5d285636e88abaacdc5f44d70897cb63817763 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 3 Sep 2024 09:40:01 +0000 Subject: [PATCH 540/602] Analytics Backend Initial Version - Added CRDB secret. - Added test script. - Added `main` and `__init__.py` files. - Added Backend Service file. - Added Spark Streamer file (successfully consuming streams from Kafka Topics). - Added Tests folder and files. - Added requirements file. - Added ANALYTICS Kafka topics in `common.tools.kafka.variables` file. --- deploy/tfs.sh | 12 +++ .../run_tests_locally-analytics-backend.sh | 22 +++++ src/analytics/backend/__init__.py | 13 +++ src/analytics/backend/requirements.in | 17 ++++ .../service/AnalyticsBackendService.py | 29 +++++++ .../backend/service/SparkStreaming.py | 84 +++++++++++++++++++ src/analytics/backend/service/__init__.py | 13 +++ src/analytics/backend/service/__main__.py | 51 +++++++++++ src/analytics/backend/tests/__init__.py | 13 +++ src/analytics/backend/tests/messages.py | 15 ++++ src/analytics/backend/tests/test_backend.py | 37 ++++++++ src/common/tools/kafka/Variables.py | 13 +-- 12 files changed, 314 insertions(+), 5 deletions(-) create mode 100755 scripts/run_tests_locally-analytics-backend.sh create mode 100644 src/analytics/backend/__init__.py create mode 100644 src/analytics/backend/requirements.in create mode 100755 src/analytics/backend/service/AnalyticsBackendService.py create mode 100644 src/analytics/backend/service/SparkStreaming.py create mode 100644 src/analytics/backend/service/__init__.py create mode 100644 src/analytics/backend/service/__main__.py create mode 100644 src/analytics/backend/tests/__init__.py create mode 100644 src/analytics/backend/tests/messages.py create mode 100644 src/analytics/backend/tests/test_backend.py diff --git a/deploy/tfs.sh b/deploy/tfs.sh index e72014418..1aa32684b 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -179,6 +179,18 @@ kubectl create secret generic crdb-telemetry --namespace ${TFS_K8S_NAMESPACE} -- --from-literal=CRDB_DATABASE=${CRDB_DATABASE_TELEMETRY} \ --from-literal=CRDB_USERNAME=${CRDB_USERNAME} \ --from-literal=CRDB_PASSWORD=${CRDB_PASSWORD} \ + --from-literSLMODE=require +printf "\n" + +echo "Create secret with CockroachDB data for Analytics microservices" +CRDB_SQL_PORT=$(kubectl --namespace ${CRDB_NAMESPACE} get service cockroachdb-public -o 'jsonpath={.spec.ports[?(@.name=="sql")].port}') +CRDB_DATABASE_ANALYTICS="tfs_analytics" # TODO: change by specific configurable environment variable +kubectl create secret generic crdb-analytics --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ + --from-literal=CRDB_NAMESPACE=${CRDB_NAMESPACE} \ + --from-literal=CRDB_SQL_PORT=${CRDB_SQL_PORT} \ + --from-literal=CRDB_DATABASE=${CRDB_DATABASE_ANALYTICS} \ + --from-literal=CRDB_USERNAME=${CRDB_USERNAME} \ + --from-literal=CRDB_PASSWORD=${CRDB_PASSWORD} \ --from-literal=CRDB_SSLMODE=require printf "\n" diff --git a/scripts/run_tests_locally-analytics-backend.sh b/scripts/run_tests_locally-analytics-backend.sh new file mode 100755 index 000000000..24afd456d --- /dev/null +++ b/scripts/run_tests_locally-analytics-backend.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + + +PROJECTDIR=`pwd` + +cd $PROJECTDIR/src +RCFILE=$PROJECTDIR/coverage/.coveragerc +python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \ + analytics/backend/tests/test_backend.py diff --git a/src/analytics/backend/__init__.py b/src/analytics/backend/__init__.py new file mode 100644 index 000000000..bbfc943b6 --- /dev/null +++ b/src/analytics/backend/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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/analytics/backend/requirements.in b/src/analytics/backend/requirements.in new file mode 100644 index 000000000..5c2280c5d --- /dev/null +++ b/src/analytics/backend/requirements.in @@ -0,0 +1,17 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +java==11.0.* +pyspark==3.5.2 +confluent-kafka==2.3.* \ No newline at end of file diff --git a/src/analytics/backend/service/AnalyticsBackendService.py b/src/analytics/backend/service/AnalyticsBackendService.py new file mode 100755 index 000000000..84f1887c6 --- /dev/null +++ b/src/analytics/backend/service/AnalyticsBackendService.py @@ -0,0 +1,29 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 threading + +from common.tools.service.GenericGrpcService import GenericGrpcService +from analytics.backend.service.SparkStreaming import SparkStreamer + + +class AnalyticsBackendService(GenericGrpcService): + """ + Class listens for ... + """ + def __init__(self, cls_name : str = __name__) -> None: + pass + + def RunSparkStreamer(self): + threading.Thread(target=SparkStreamer).start() diff --git a/src/analytics/backend/service/SparkStreaming.py b/src/analytics/backend/service/SparkStreaming.py new file mode 100644 index 000000000..92cc9a842 --- /dev/null +++ b/src/analytics/backend/service/SparkStreaming.py @@ -0,0 +1,84 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging +from pyspark.sql import SparkSession +from pyspark.sql.types import StructType, StructField, StringType, ArrayType, IntegerType +from pyspark.sql.functions import from_json, col +from common.tools.kafka.Variables import KafkaConfig, KafkaTopic + +LOGGER = logging.getLogger(__name__) + +def DefiningSparkSession(): + # Create a Spark session with specific spark verions (3.5.0) + return SparkSession.builder \ + .appName("Analytics") \ + .config("spark.jars.packages", "org.apache.spark:spark-sql-kafka-0-10_2.12:3.5.0") \ + .getOrCreate() + +def SettingKafkaParameters(): # TODO: create get_kafka_consumer() in common with inputs (bootstrap server, subscribe, startingOffset and failOnDataLoss with default values) + return { + # "kafka.bootstrap.servers": '127.0.0.1:9092', + "kafka.bootstrap.servers": KafkaConfig.get_kafka_address(), + "subscribe" : KafkaTopic.ANALYTICS_REQUEST.value, + "startingOffsets" : 'latest', + "failOnDataLoss" : 'false' # Optional: Set to "true" to fail the query on data loss + } + +def DefiningRequestSchema(): + return StructType([ + StructField("algo_name", StringType() , True), + StructField("input_kpis", ArrayType(StringType()), True), + StructField("output_kpis", ArrayType(StringType()), True), + StructField("oper_mode", IntegerType() , True) + ]) + +def SparkStreamer(): + """ + Method to perform Spark operation Kafka stream. + NOTE: Kafka topic to be processesd should have atleast one row before initiating the spark session. + """ + kafka_params = SettingKafkaParameters() # Define the Kafka parameters + schema = DefiningRequestSchema() # Define the schema for the incoming JSON data + spark = DefiningSparkSession() # Define the spark session with app name and spark version + + try: + # Read data from Kafka + raw_stream_data = spark \ + .readStream \ + .format("kafka") \ + .options(**kafka_params) \ + .load() + + # Convert the value column from Kafka to a string + stream_data = raw_stream_data.selectExpr("CAST(value AS STRING)") + # Parse the JSON string into a DataFrame with the defined schema + parsed_stream_data = stream_data.withColumn("parsed_value", from_json(col("value"), schema)) + # Select the parsed fields + final_stream_data = parsed_stream_data.select("parsed_value.*") + + # Start the Spark streaming query + query = final_stream_data \ + .writeStream \ + .outputMode("append") \ + .format("console") # You can change this to other output modes or sinks + + # Start the query execution + query.start().awaitTermination() + except Exception as e: + print("Error in Spark streaming process: {:}".format(e)) + LOGGER.debug("Error in Spark streaming process: {:}".format(e)) + finally: + spark.stop() diff --git a/src/analytics/backend/service/__init__.py b/src/analytics/backend/service/__init__.py new file mode 100644 index 000000000..bbfc943b6 --- /dev/null +++ b/src/analytics/backend/service/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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/analytics/backend/service/__main__.py b/src/analytics/backend/service/__main__.py new file mode 100644 index 000000000..371b5a7ca --- /dev/null +++ b/src/analytics/backend/service/__main__.py @@ -0,0 +1,51 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging, signal, sys, threading +from common.Settings import get_log_level +from analytics.backend.service.AnalyticsBackendService import AnalyticsBackendService + +terminate = threading.Event() +LOGGER = None + +def signal_handler(signal, frame): # pylint: disable=redefined-outer-name + LOGGER.warning('Terminate signal received') + terminate.set() + +def main(): + global LOGGER # pylint: disable=global-statement + + log_level = get_log_level() + logging.basicConfig(level=log_level) + LOGGER = logging.getLogger(__name__) + + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + + LOGGER.debug('Starting...') + + grpc_service = AnalyticsBackendService() + grpc_service.start() + + # Wait for Ctrl+C or termination signal + while not terminate.wait(timeout=1.0): pass + + LOGGER.debug('Terminating...') + grpc_service.stop() + + LOGGER.debug('Bye') + return 0 + +if __name__ == '__main__': + sys.exit(main()) diff --git a/src/analytics/backend/tests/__init__.py b/src/analytics/backend/tests/__init__.py new file mode 100644 index 000000000..bbfc943b6 --- /dev/null +++ b/src/analytics/backend/tests/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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/analytics/backend/tests/messages.py b/src/analytics/backend/tests/messages.py new file mode 100644 index 000000000..5cf553eaa --- /dev/null +++ b/src/analytics/backend/tests/messages.py @@ -0,0 +1,15 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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/analytics/backend/tests/test_backend.py b/src/analytics/backend/tests/test_backend.py new file mode 100644 index 000000000..7a6175ecf --- /dev/null +++ b/src/analytics/backend/tests/test_backend.py @@ -0,0 +1,37 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging +from common.tools.kafka.Variables import KafkaTopic +from analytics.backend.service.AnalyticsBackendService import AnalyticsBackendService + + +LOGGER = logging.getLogger(__name__) + + +########################### +# Tests Implementation of Telemetry Backend +########################### + +# --- "test_validate_kafka_topics" should be run before the functionality tests --- +# def test_validate_kafka_topics(): +# LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ") +# response = KafkaTopic.create_all_topics() +# assert isinstance(response, bool) + +def test_SparkListener(): + LOGGER.info('test_RunRequestListener') + AnalyticsBackendServiceObj = AnalyticsBackendService() + response = AnalyticsBackendServiceObj.RunSparkStreamer() + LOGGER.debug(str(response)) diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 5ada88a1e..215913c0e 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -41,11 +41,14 @@ class KafkaConfig(Enum): class KafkaTopic(Enum): - REQUEST = 'topic_request' - RESPONSE = 'topic_response' - RAW = 'topic_raw' - LABELED = 'topic_labeled' - VALUE = 'topic_value' + # TODO: Later to be populated from ENV variable. + REQUEST = 'topic_request' + RESPONSE = 'topic_response' + RAW = 'topic_raw' + LABELED = 'topic_labeled' + VALUE = 'topic_value' + ANALYTICS_REQUEST = 'topic_request_analytics' + ANALYTICS_RESPONSE = 'topic_response_analytics' @staticmethod def create_all_topics() -> bool: -- GitLab From c8ad3a5cc6aea20d6cf87d8ebf0c8f54eeb28b31 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 3 Sep 2024 09:45:12 +0000 Subject: [PATCH 541/602] **Changes in Frontend** - Added the missing `map` in the `analytics_frontend.proto` file. - Removed `pyspark` and `java` from the `requirements.in` file, as they are not required for the Frontend. --- proto/analytics_frontend.proto | 20 ++++++++++---------- src/analytics/frontend/requirements.in | 2 -- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/proto/analytics_frontend.proto b/proto/analytics_frontend.proto index 45e910a70..bd28a21bf 100644 --- a/proto/analytics_frontend.proto +++ b/proto/analytics_frontend.proto @@ -36,16 +36,16 @@ enum AnalyzerOperationMode { message Analyzer { AnalyzerId analyzer_id = 1; - string algorithm_name = 2; // The algorithm to be executed - repeated kpi_manager.KpiId input_kpi_ids = 3; // The KPI Ids to be processed by the analyzer - repeated kpi_manager.KpiId output_kpi_ids = 4; // The KPI Ids produced by the analyzer - AnalyzerOperationMode operation_mode = 5; // Operation mode of the analyzer - - // In batch mode... - float batch_min_duration_s = 6; // ..., min duration to collect before executing batch - float batch_max_duration_s = 7; // ..., max duration collected to execute the batch - uint64 batch_min_size = 8; // ..., min number of samples to collect before executing batch - uint64 batch_max_size = 9; // ..., max number of samples collected to execute the batch + string algorithm_name = 2; // The algorithm to be executed + repeated kpi_manager.KpiId input_kpi_ids = 3; // The KPI Ids to be processed by the analyzer + repeated kpi_manager.KpiId output_kpi_ids = 4; // The KPI Ids produced by the analyzer + AnalyzerOperationMode operation_mode = 5; // Operation mode of the analyzer + map parameters = 6; + // In batch mode... + float batch_min_duration_s = 7; // ..., min duration to collect before executing batch + float batch_max_duration_s = 8; // ..., max duration collected to execute the batch + uint64 batch_min_size = 9; // ..., min number of samples to collect before executing batch + uint64 batch_max_size = 10; // ..., max number of samples collected to execute the batch } message AnalyzerFilter { diff --git a/src/analytics/frontend/requirements.in b/src/analytics/frontend/requirements.in index 98cf96710..1d22df11b 100644 --- a/src/analytics/frontend/requirements.in +++ b/src/analytics/frontend/requirements.in @@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -java==11.0.* -pyspark==3.5.2 confluent-kafka==2.3.* psycopg2-binary==2.9.* SQLAlchemy==1.4.* -- GitLab From 067ace160dcef4b3d07923bcece19bfef3f50a10 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 3 Sep 2024 13:54:24 +0000 Subject: [PATCH 542/602] Changes in Telemetry - Added Kafka Request Listener to listen for requests from the Analytics Frontend. - Updated `SparkStreamer.py` to consume and process streams from VALUE topics, and further filter rows based on KPIs in the `input_kpis` list. - Updated the frontend TOPIC from `VALUE` to `ANALYTICS_REQUEST`. - Updated messages to keep the KPI UUID consistent with the one generated by the Telemetry Backend service. --- .../service/AnalyticsBackendService.py | 42 +++++++++++++++++-- .../backend/service/SparkStreaming.py | 19 +++++---- src/analytics/backend/tests/test_backend.py | 11 ++++- .../AnalyticsFrontendServiceServicerImpl.py | 4 +- src/analytics/frontend/tests/messages.py | 4 ++ .../backend/tests/test_TelemetryBackend.py | 8 ++-- 6 files changed, 67 insertions(+), 21 deletions(-) diff --git a/src/analytics/backend/service/AnalyticsBackendService.py b/src/analytics/backend/service/AnalyticsBackendService.py index 84f1887c6..5331d027d 100755 --- a/src/analytics/backend/service/AnalyticsBackendService.py +++ b/src/analytics/backend/service/AnalyticsBackendService.py @@ -12,18 +12,52 @@ # See the License for the specific language governing permissions and # limitations under the License. -import threading +import json +import logging +import threading from common.tools.service.GenericGrpcService import GenericGrpcService from analytics.backend.service.SparkStreaming import SparkStreamer +from common.tools.kafka.Variables import KafkaConfig, KafkaTopic +from confluent_kafka import Consumer as KafkaConsumer +from confluent_kafka import KafkaError +LOGGER = logging.getLogger(__name__) class AnalyticsBackendService(GenericGrpcService): """ Class listens for ... """ def __init__(self, cls_name : str = __name__) -> None: - pass + self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.get_kafka_address(), + 'group.id' : 'analytics-frontend', + 'auto.offset.reset' : 'latest'}) + + def RunSparkStreamer(self, kpi_list): + threading.Thread(target=SparkStreamer, args=(kpi_list,)).start() + + def RunRequestListener(self)->bool: + threading.Thread(target=self.RequestListener).start() + return True - def RunSparkStreamer(self): - threading.Thread(target=SparkStreamer).start() + def RequestListener(self): + """ + listener for requests on Kafka topic. + """ + consumer = self.kafka_consumer + consumer.subscribe([KafkaTopic.ANALYTICS_REQUEST.value]) + while True: + receive_msg = consumer.poll(2.0) + if receive_msg is None: + continue + elif receive_msg.error(): + if receive_msg.error().code() == KafkaError._PARTITION_EOF: + continue + else: + print("Consumer error: {}".format(receive_msg.error())) + break + analyzer = json.loads(receive_msg.value().decode('utf-8')) + analyzer_id = receive_msg.key().decode('utf-8') + LOGGER.debug('Recevied Collector: {:} - {:}'.format(analyzer_id, analyzer)) + print('Recevied Collector: {:} - {:} - {:}'.format(analyzer_id, analyzer, analyzer['input_kpis'])) + self.RunSparkStreamer(analyzer['input_kpis']) # TODO: Add active analyzer to list diff --git a/src/analytics/backend/service/SparkStreaming.py b/src/analytics/backend/service/SparkStreaming.py index 92cc9a842..f42618a1c 100644 --- a/src/analytics/backend/service/SparkStreaming.py +++ b/src/analytics/backend/service/SparkStreaming.py @@ -15,7 +15,7 @@ import logging from pyspark.sql import SparkSession -from pyspark.sql.types import StructType, StructField, StringType, ArrayType, IntegerType +from pyspark.sql.types import StructType, StructField, StringType, DoubleType from pyspark.sql.functions import from_json, col from common.tools.kafka.Variables import KafkaConfig, KafkaTopic @@ -32,20 +32,19 @@ def SettingKafkaParameters(): # TODO: create get_kafka_consumer() in common w return { # "kafka.bootstrap.servers": '127.0.0.1:9092', "kafka.bootstrap.servers": KafkaConfig.get_kafka_address(), - "subscribe" : KafkaTopic.ANALYTICS_REQUEST.value, - "startingOffsets" : 'latest', + "subscribe" : KafkaTopic.VALUE.value, + "startingOffsets" : 'latest', "failOnDataLoss" : 'false' # Optional: Set to "true" to fail the query on data loss } def DefiningRequestSchema(): return StructType([ - StructField("algo_name", StringType() , True), - StructField("input_kpis", ArrayType(StringType()), True), - StructField("output_kpis", ArrayType(StringType()), True), - StructField("oper_mode", IntegerType() , True) + StructField("time_stamp" , StringType() , True), + StructField("kpi_id" , StringType() , True), + StructField("kpi_value" , DoubleType() , True) ]) -def SparkStreamer(): +def SparkStreamer(kpi_list): """ Method to perform Spark operation Kafka stream. NOTE: Kafka topic to be processesd should have atleast one row before initiating the spark session. @@ -68,9 +67,11 @@ def SparkStreamer(): parsed_stream_data = stream_data.withColumn("parsed_value", from_json(col("value"), schema)) # Select the parsed fields final_stream_data = parsed_stream_data.select("parsed_value.*") + # Filter the stream to only include rows where the kpi_id is in the kpi_list + filtered_stream_data = final_stream_data.filter(col("kpi_id").isin(kpi_list)) # Start the Spark streaming query - query = final_stream_data \ + query = filtered_stream_data \ .writeStream \ .outputMode("append") \ .format("console") # You can change this to other output modes or sinks diff --git a/src/analytics/backend/tests/test_backend.py b/src/analytics/backend/tests/test_backend.py index 7a6175ecf..426c89e54 100644 --- a/src/analytics/backend/tests/test_backend.py +++ b/src/analytics/backend/tests/test_backend.py @@ -30,8 +30,15 @@ LOGGER = logging.getLogger(__name__) # response = KafkaTopic.create_all_topics() # assert isinstance(response, bool) -def test_SparkListener(): +def test_RunRequestListener(): LOGGER.info('test_RunRequestListener') AnalyticsBackendServiceObj = AnalyticsBackendService() - response = AnalyticsBackendServiceObj.RunSparkStreamer() + response = AnalyticsBackendServiceObj.RunRequestListener() LOGGER.debug(str(response)) + + +# def test_SparkListener(): +# LOGGER.info('test_RunRequestListener') +# AnalyticsBackendServiceObj = AnalyticsBackendService() +# response = AnalyticsBackendServiceObj.RunSparkStreamer() +# LOGGER.debug(str(response)) diff --git a/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py index ccbef3599..0f9f4e146 100644 --- a/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py +++ b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py @@ -70,7 +70,7 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer): "oper_mode" : analyzer_obj.operation_mode } self.kafka_producer.produce( - KafkaTopic.VALUE.value, + KafkaTopic.ANALYTICS_REQUEST.value, key = analyzer_uuid, value = json.dumps(analyzer_to_generate), callback = self.delivery_callback @@ -107,7 +107,7 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer): "oper_mode" : -1 } self.kafka_producer.produce( - KafkaTopic.VALUE.value, + KafkaTopic.ANALYTICS_REQUEST.value, key = analyzer_uuid, value = json.dumps(analyzer_to_stop), callback = self.delivery_callback diff --git a/src/analytics/frontend/tests/messages.py b/src/analytics/frontend/tests/messages.py index 4c826e5c3..0a8300436 100644 --- a/src/analytics/frontend/tests/messages.py +++ b/src/analytics/frontend/tests/messages.py @@ -32,6 +32,10 @@ def create_analyzer(): _kpi_id = KpiId() # input IDs to analyze _kpi_id.kpi_id.uuid = str(uuid.uuid4()) + _kpi_id.kpi_id.uuid = "1e22f180-ba28-4641-b190-2287bf446666" + _create_analyzer.input_kpi_ids.append(_kpi_id) + _kpi_id.kpi_id.uuid = str(uuid.uuid4()) + _kpi_id.kpi_id.uuid = "6e22f180-ba28-4641-b190-2287bf448888" _create_analyzer.input_kpi_ids.append(_kpi_id) _kpi_id.kpi_id.uuid = str(uuid.uuid4()) _create_analyzer.input_kpi_ids.append(_kpi_id) diff --git a/src/telemetry/backend/tests/test_TelemetryBackend.py b/src/telemetry/backend/tests/test_TelemetryBackend.py index a2bbee540..24a1b35cc 100644 --- a/src/telemetry/backend/tests/test_TelemetryBackend.py +++ b/src/telemetry/backend/tests/test_TelemetryBackend.py @@ -25,10 +25,10 @@ LOGGER = logging.getLogger(__name__) ########################### # --- "test_validate_kafka_topics" should be run before the functionality tests --- -def test_validate_kafka_topics(): - LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ") - response = KafkaTopic.create_all_topics() - assert isinstance(response, bool) +# def test_validate_kafka_topics(): +# LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ") +# response = KafkaTopic.create_all_topics() +# assert isinstance(response, bool) def test_RunRequestListener(): LOGGER.info('test_RunRequestListener') -- GitLab From e7e36f7d71e974056b8f79c74cdd33ae276245b7 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Tue, 3 Sep 2024 15:48:37 +0000 Subject: [PATCH 543/602] Changes in Analytics Backend - SparkStreamer write Stream to Kafka topic ANALYTICS_RESPONSE. --- .../backend/service/SparkStreaming.py | 54 ++++++++++++++----- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/src/analytics/backend/service/SparkStreaming.py b/src/analytics/backend/service/SparkStreaming.py index f42618a1c..245a77d80 100644 --- a/src/analytics/backend/service/SparkStreaming.py +++ b/src/analytics/backend/service/SparkStreaming.py @@ -14,9 +14,9 @@ import logging -from pyspark.sql import SparkSession -from pyspark.sql.types import StructType, StructField, StringType, DoubleType -from pyspark.sql.functions import from_json, col +from pyspark.sql import SparkSession +from pyspark.sql.types import StructType, StructField, StringType, DoubleType +from pyspark.sql.functions import from_json, col from common.tools.kafka.Variables import KafkaConfig, KafkaTopic LOGGER = logging.getLogger(__name__) @@ -28,7 +28,7 @@ def DefiningSparkSession(): .config("spark.jars.packages", "org.apache.spark:spark-sql-kafka-0-10_2.12:3.5.0") \ .getOrCreate() -def SettingKafkaParameters(): # TODO: create get_kafka_consumer() in common with inputs (bootstrap server, subscribe, startingOffset and failOnDataLoss with default values) +def SettingKafkaConsumerParams(): # TODO: create get_kafka_consumer() in common with inputs (bootstrap server, subscribe, startingOffset and failOnDataLoss with default values) return { # "kafka.bootstrap.servers": '127.0.0.1:9092', "kafka.bootstrap.servers": KafkaConfig.get_kafka_address(), @@ -44,37 +44,63 @@ def DefiningRequestSchema(): StructField("kpi_value" , DoubleType() , True) ]) +def SettingKafkaProducerParams(): + return { + "kafka.bootstrap.servers" : KafkaConfig.get_kafka_address(), + "topic" : KafkaTopic.ANALYTICS_RESPONSE.value + } + def SparkStreamer(kpi_list): """ Method to perform Spark operation Kafka stream. NOTE: Kafka topic to be processesd should have atleast one row before initiating the spark session. """ - kafka_params = SettingKafkaParameters() # Define the Kafka parameters - schema = DefiningRequestSchema() # Define the schema for the incoming JSON data - spark = DefiningSparkSession() # Define the spark session with app name and spark version + kafka_producer_params = SettingKafkaConsumerParams() # Define the Kafka producer parameters + kafka_consumer_params = SettingKafkaConsumerParams() # Define the Kafka consumer parameters + schema = DefiningRequestSchema() # Define the schema for the incoming JSON data + spark = DefiningSparkSession() # Define the spark session with app name and spark version try: # Read data from Kafka raw_stream_data = spark \ .readStream \ .format("kafka") \ - .options(**kafka_params) \ + .options(**kafka_consumer_params) \ .load() # Convert the value column from Kafka to a string - stream_data = raw_stream_data.selectExpr("CAST(value AS STRING)") + stream_data = raw_stream_data.selectExpr("CAST(value AS STRING)") # Parse the JSON string into a DataFrame with the defined schema - parsed_stream_data = stream_data.withColumn("parsed_value", from_json(col("value"), schema)) + parsed_stream_data = stream_data.withColumn("parsed_value", from_json(col("value"), schema)) # Select the parsed fields - final_stream_data = parsed_stream_data.select("parsed_value.*") + final_stream_data = parsed_stream_data.select("parsed_value.*") # Filter the stream to only include rows where the kpi_id is in the kpi_list filtered_stream_data = final_stream_data.filter(col("kpi_id").isin(kpi_list)) - # Start the Spark streaming query query = filtered_stream_data \ + .selectExpr("CAST(kpi_id AS STRING) AS key", "to_json(struct(*)) AS value") \ .writeStream \ - .outputMode("append") \ - .format("console") # You can change this to other output modes or sinks + .format("kafka") \ + .option("kafka.bootstrap.servers", KafkaConfig.get_kafka_address()) \ + .option("topic", KafkaTopic.ANALYTICS_RESPONSE.value) \ + .option("checkpointLocation", "/home/tfs/sparkcheckpoint") \ + .outputMode("append") + + # Start the Spark streaming query and write the output to the Kafka topic + # query = filtered_stream_data \ + # .selectExpr("CAST(kpi_id AS STRING) AS key", "to_json(struct(*)) AS value") \ + # .writeStream \ + # .format("kafka") \ + # .option(**kafka_producer_params) \ + # .option("checkpointLocation", "sparkcheckpoint") \ + # .outputMode("append") \ + # .start() + + # Start the Spark streaming query + # query = filtered_stream_data \ + # .writeStream \ + # .outputMode("append") \ + # .format("console") # You can change this to other output modes or sinks # Start the query execution query.start().awaitTermination() -- GitLab From 983ab351c84e2a0a33f47e4e1dc649a9bf86f975 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 4 Sep 2024 07:23:24 +0000 Subject: [PATCH 544/602] Added some tests and new QKDDriver and Tool with error handling and more logging level --- deploy/tfs.sh | 14 +- my_deploy.sh | 6 +- src/common/DeviceTypes.py | 1 + src/context/proto | 1 + .../service/driver_api/driver_api/qkd_api.py | 246 +++ src/device/service/drivers/__init__.py | 2 +- .../service/drivers/qkd/LuxquantaDriver.py | 102 + src/device/service/drivers/qkd/QKDDriver.py | 12 +- src/device/service/drivers/qkd/QKDDriver2.py | 228 ++ src/device/service/drivers/qkd/Tools.py | 16 +- src/device/service/drivers/qkd/Tools2.py | 209 ++ .../qkd/integration/test_qkd_integration.py | 35 + ...test_qkd_luxquanta_retrieve_information.py | 177 ++ .../tests/qkd/mock_qkd_nodes/YangValidator.py | 42 + src/device/tests/qkd/mock_qkd_nodes/mock.py | 355 ++++ src/device/tests/qkd/mock_qkd_nodes/start.sh | 17 + .../yang/etsi-qkd-node-types.yang | 326 +++ .../yang/etsi-qkd-sdn-node.yang | 941 +++++++++ .../mock_qkd_nodes/yang/ietf-inet-types.yang | 458 ++++ .../mock_qkd_nodes/yang/ietf-yang-types.yang | 474 +++++ src/device/tests/qkd/unit/LICENSE | 21 + .../tests/qkd/unit/generated/context_pb2.py | 994 +++++++++ .../qkd/unit/generated/context_pb2_grpc.py | 1849 +++++++++++++++++ .../unit/retrieve_device_mock_information.py | 70 + .../qkd/unit/retrieve_qkd_information.py | 348 ++++ .../tests/qkd/unit/test_mock_qkd_node.py | 17 + .../tests/qkd/unit/test_qkd_compliance.py | 10 + .../tests/qkd/unit/test_qkd_configuration.py | 93 + .../tests/qkd/unit/test_qkd_error_hanling.py | 22 + .../qkd/unit/test_qkd_mock_connectivity.py | 24 + .../tests/qkd/unit/test_qkd_performance.py | 16 + .../tests/qkd/unit/test_qkd_security.py | 45 + .../tests/qkd/unit/test_qkd_subscription.py | 23 + src/device/tests/qkd/unit/validate_context.py | 31 + 34 files changed, 7204 insertions(+), 21 deletions(-) create mode 120000 src/context/proto create mode 100644 src/device/service/driver_api/driver_api/qkd_api.py create mode 100644 src/device/service/drivers/qkd/LuxquantaDriver.py create mode 100644 src/device/service/drivers/qkd/QKDDriver2.py create mode 100644 src/device/service/drivers/qkd/Tools2.py create mode 100644 src/device/tests/qkd/integration/test_qkd_integration.py create mode 100644 src/device/tests/qkd/integration/test_qkd_luxquanta_retrieve_information.py create mode 100644 src/device/tests/qkd/mock_qkd_nodes/YangValidator.py create mode 100644 src/device/tests/qkd/mock_qkd_nodes/mock.py create mode 100644 src/device/tests/qkd/mock_qkd_nodes/start.sh create mode 100644 src/device/tests/qkd/mock_qkd_nodes/yang/etsi-qkd-node-types.yang create mode 100644 src/device/tests/qkd/mock_qkd_nodes/yang/etsi-qkd-sdn-node.yang create mode 100644 src/device/tests/qkd/mock_qkd_nodes/yang/ietf-inet-types.yang create mode 100644 src/device/tests/qkd/mock_qkd_nodes/yang/ietf-yang-types.yang create mode 100644 src/device/tests/qkd/unit/LICENSE create mode 100644 src/device/tests/qkd/unit/generated/context_pb2.py create mode 100644 src/device/tests/qkd/unit/generated/context_pb2_grpc.py create mode 100644 src/device/tests/qkd/unit/retrieve_device_mock_information.py create mode 100644 src/device/tests/qkd/unit/retrieve_qkd_information.py create mode 100644 src/device/tests/qkd/unit/test_mock_qkd_node.py create mode 100644 src/device/tests/qkd/unit/test_qkd_compliance.py create mode 100644 src/device/tests/qkd/unit/test_qkd_configuration.py create mode 100644 src/device/tests/qkd/unit/test_qkd_error_hanling.py create mode 100644 src/device/tests/qkd/unit/test_qkd_mock_connectivity.py create mode 100644 src/device/tests/qkd/unit/test_qkd_performance.py create mode 100644 src/device/tests/qkd/unit/test_qkd_security.py create mode 100644 src/device/tests/qkd/unit/test_qkd_subscription.py create mode 100644 src/device/tests/qkd/unit/validate_context.py diff --git a/deploy/tfs.sh b/deploy/tfs.sh index 3fdbe77fb..e0d75dd28 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -212,24 +212,24 @@ for COMPONENT in $TFS_COMPONENTS; do BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}.log" if [ "$COMPONENT" == "ztp" ] || [ "$COMPONENT" == "policy" ]; then - $DOCKER_BUILD -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile ./src/"$COMPONENT"/ > "$BUILD_LOG" + $DOCKER_BUILD --network=host -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile ./src/"$COMPONENT"/ > "$BUILD_LOG" elif [ "$COMPONENT" == "pathcomp" ]; then BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-frontend.log" - $DOCKER_BUILD -t "$COMPONENT-frontend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/frontend/Dockerfile . > "$BUILD_LOG" + $DOCKER_BUILD --network=host -t "$COMPONENT-frontend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/frontend/Dockerfile . > "$BUILD_LOG" BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-backend.log" - $DOCKER_BUILD -t "$COMPONENT-backend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/backend/Dockerfile . > "$BUILD_LOG" + $DOCKER_BUILD --network=host -t "$COMPONENT-backend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/backend/Dockerfile . > "$BUILD_LOG" # next command is redundant, but helpful to keep cache updated between rebuilds IMAGE_NAME="$COMPONENT-backend:$TFS_IMAGE_TAG-builder" - $DOCKER_BUILD -t "$IMAGE_NAME" --target builder -f ./src/"$COMPONENT"/backend/Dockerfile . >> "$BUILD_LOG" + $DOCKER_BUILD --network=host -t "$IMAGE_NAME" --target builder -f ./src/"$COMPONENT"/backend/Dockerfile . >> "$BUILD_LOG" elif [ "$COMPONENT" == "dlt" ]; then BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-connector.log" - $DOCKER_BUILD -t "$COMPONENT-connector:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/connector/Dockerfile . > "$BUILD_LOG" + $DOCKER_BUILD --network=host -t "$COMPONENT-connector:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/connector/Dockerfile . > "$BUILD_LOG" BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-gateway.log" - $DOCKER_BUILD -t "$COMPONENT-gateway:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/gateway/Dockerfile . > "$BUILD_LOG" + $DOCKER_BUILD --network=host -t "$COMPONENT-gateway:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/gateway/Dockerfile . > "$BUILD_LOG" else - $DOCKER_BUILD -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile . > "$BUILD_LOG" + $DOCKER_BUILD --network=host -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile . > "$BUILD_LOG" fi echo " Pushing Docker image to '$TFS_REGISTRY_IMAGES'..." diff --git a/my_deploy.sh b/my_deploy.sh index 8417f6eae..3c8cc7ff3 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -20,7 +20,9 @@ export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/" # Set the list of components, separated by spaces, you want to build images for, and deploy. -export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_generator" +export TFS_COMPONENTS="context device pathcomp service slice nbi webui app" + +# export load_generator # Uncomment to activate Monitoring #export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" @@ -109,7 +111,7 @@ export CRDB_DEPLOY_MODE="single" export CRDB_DROP_DATABASE_IF_EXISTS="" # Disable flag for re-deploying CockroachDB from scratch. -export CRDB_REDEPLOY="" +export CRDB_REDEPLOY="YES" # ----- NATS ------------------------------------------------------------------- diff --git a/src/common/DeviceTypes.py b/src/common/DeviceTypes.py index 9ed321d53..23ebe19d6 100644 --- a/src/common/DeviceTypes.py +++ b/src/common/DeviceTypes.py @@ -47,6 +47,7 @@ class DeviceTypeEnum(Enum): PACKET_ROUTER = 'packet-router' PACKET_SWITCH = 'packet-switch' XR_CONSTELLATION = 'xr-constellation' + QKD_NODE = 'qkd-node' # ETSI TeraFlowSDN controller TERAFLOWSDN_CONTROLLER = 'teraflowsdn' diff --git a/src/context/proto b/src/context/proto new file mode 120000 index 000000000..0ae252a78 --- /dev/null +++ b/src/context/proto @@ -0,0 +1 @@ +../../proto/src/python \ No newline at end of file diff --git a/src/device/service/driver_api/driver_api/qkd_api.py b/src/device/service/driver_api/driver_api/qkd_api.py new file mode 100644 index 000000000..27b4718f0 --- /dev/null +++ b/src/device/service/driver_api/driver_api/qkd_api.py @@ -0,0 +1,246 @@ +import sys +import os +import grpc +import json +from flask import Flask, jsonify, request, abort +from common.proto.context_pb2 import Empty, ContextId, TopologyId, Uuid +from common.proto.context_pb2_grpc import ContextServiceStub +from device.service.driver_api.DriverInstanceCache import DriverInstanceCache, get_driver +from device.service.driver_api.DriverFactory import DriverFactory +from device.service.driver_api.FilterFields import FilterFieldEnum +from device.service.driver_api._Driver import _Driver +from device.service.drivers.qkd.QKDDriver2 import QKDDriver +app = Flask(__name__) + +# Add the directory containing the driver_api module to the system path +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../../..'))) + +# Initialize the DriverFactory and DriverInstanceCache +drivers_list = [ + (QKDDriver, [{'filter_field1': 'value1', 'filter_field2': 'value2'}]) +] + +driver_factory = DriverFactory(drivers_list) +driver_instance_cache = DriverInstanceCache(driver_factory) + + +def get_context_topology_info(): + try: + # Establish a gRPC channel + channel = grpc.insecure_channel('10.152.183.77:1010') # Update with the correct IP and port + stub = ContextServiceStub(channel) + + # Retrieve the context information + context_list = stub.ListContexts(Empty()) + contexts_info = [] + for context in context_list.contexts: + context_info = { + 'context_id': context.context_id.context_uuid.uuid, + 'context_name': context.name, + 'topologies': [] + } + + # Retrieve topology information for each context + topology_list = stub.ListTopologies(context.context_id) + for topology in topology_list.topologies: + topology_info = { + 'topology_id': topology.topology_id.topology_uuid.uuid, + 'topology_name': topology.name, + 'devices': [] + } + + # Retrieve detailed topology information + topology_details = stub.GetTopologyDetails(topology.topology_id) + for device in topology_details.devices: + device_info = { + 'device_id': device.device_id.device_uuid.uuid, + 'device_name': device.name, + 'device_type': device.device_type, + 'status': device.device_operational_status, + 'drivers': [driver for driver in device.device_drivers], + 'endpoints': [{ + 'uuid': endpoint.endpoint_id.endpoint_uuid.uuid, + 'name': endpoint.name, + 'type': endpoint.endpoint_type, + 'location': endpoint.endpoint_location + } for endpoint in device.device_endpoints], + 'configurations': [{ + 'key': config.custom.resource_key, + 'value': config.custom.resource_value + } for config in device.device_config.config_rules], + 'interfaces': [{ + 'id': interface.qkdi_id, + 'enabled': interface.enabled, + 'name': interface.name, + 'att_point': interface.qkdi_att_point, + 'capabilities': interface.qkdi_capabilities + } for interface in device.qkd_interfaces.qkd_interface], + 'applications': [{ + 'app_id': app.app_id, + 'app_qos': app.app_qos, + 'app_statistics': app.app_statistics, + 'backing_qkdl_id': app.backing_qkdl_id, + 'client_app_id': app.client_app_id + } for app in device.qkd_applications.qkd_app] + } + topology_info['devices'].append(device_info) + context_info['topologies'].append(topology_info) + contexts_info.append(context_info) + + return contexts_info + except grpc.RpcError as e: + app.logger.error(f"gRPC error: {e}") + abort(502, description=f"gRPC error: {e.details()}") + except Exception as e: + app.logger.error(f"Error retrieving context topology info: {e}") + abort(500, description="Internal Server Error") + + +def get_detailed_device_info(): + try: + context_info = get_context_topology_info() + detailed_info = [] + for context in context_info: + if context['context_name'] == 'admin': + for topology in context['topologies']: + if topology['topology_name'] == 'admin': + for device in topology['devices']: + driver = get_driver_instance(device) + if driver: + detailed_info.append({ + 'device_info': device, + 'driver_info': get_device_driver_info(driver) + }) + return detailed_info + except Exception as e: + app.logger.error(f"Error retrieving detailed device info: {e}") + abort(500, description="Internal Server Error") + + +def get_driver_instance(device): + device_uuid = device['device_id'] + driver_filter_fields = { + FilterFieldEnum.DEVICE_TYPE: device['device_type'], + FilterFieldEnum.DRIVER: device['drivers'], + } + connect_rules = {config['key']: config['value'] for config in device['configurations']} + + address = connect_rules.get('_connect/address', '127.0.0.1') + port = int(connect_rules.get('_connect/port', '0')) + settings = json.loads(connect_rules.get('_connect/settings', '{}')) + + try: + driver = driver_instance_cache.get( + device_uuid, filter_fields=driver_filter_fields, address=address, port=port, settings=settings) + if os.getenv('QKD_API_URL'): # Assume real QKD system if QKD_API_URL is set + if not driver.Connect(): + raise Exception("Failed to connect to real QKD system") + else: + driver.Connect() + return driver + except Exception as e: + app.logger.error(f"Failed to get driver instance for device {device_uuid}: {e}") + return None + + + +def get_device_driver_info(driver: _Driver): + try: + return { + 'initial_config': driver.GetInitialConfig(), + 'running_config': driver.GetConfig(), + 'subscriptions': list(driver.GetState(blocking=False)) + } + except Exception as e: + app.logger.error(f"Failed to retrieve driver information: {e}") + return {'error': str(e)} + + +@app.route('/qkd/devices', methods=['GET']) +def retrieve_qkd_devices(): + try: + context_info = get_context_topology_info() + return jsonify(context_info), 200 + except Exception as e: + app.logger.error(f"Error retrieving QKD devices: {e}") + return jsonify({'error': 'Internal Server Error'}), 500 + + +@app.route('/qkd/capabilities', methods=['GET']) +def get_qkd_capabilities(): + try: + context_info = get_context_topology_info() + for context in context_info: + if context['context_name'] == 'admin': + for topology in context['topologies']: + if topology['topology_name'] == 'admin': + for device in topology['devices']: + driver = get_driver_instance(device) + if driver: + capabilities = driver.get_qkd_capabilities() + return jsonify(capabilities), 200 + abort(404, description="No capabilities found") + except Exception as e: + app.logger.error(f"Error retrieving QKD capabilities: {e}") + return jsonify({'error': 'Internal Server Error'}), 500 + + +@app.route('/qkd/interfaces', methods=['GET']) +def get_qkd_interfaces(): + try: + context_info = get_context_topology_info() + for context in context_info: + if context['context_name'] == 'admin': + for topology in context['topologies']: + if topology['topology_name'] == 'admin': + for device in topology['devices']: + driver = get_driver_instance(device) + if driver: + interfaces = driver.get_qkd_interfaces() + return jsonify(interfaces), 200 + abort(404, description="No interfaces found") + except Exception as e: + app.logger.error(f"Error retrieving QKD interfaces: {e}") + return jsonify({'error': 'Internal Server Error'}), 500 + + +@app.route('/qkd/links', methods=['GET']) +def get_qkd_links(): + try: + context_info = get_context_topology_info() + for context in context_info: + if context['context_name'] == 'admin': + for topology in context['topologies']: + if topology['topology_name'] == 'admin': + for device in topology['devices']: + driver = get_driver_instance(device) + if driver: + links = driver.get_qkd_links() + return jsonify(links), 200 + abort(404, description="No links found") + except Exception as e: + app.logger.error(f"Error retrieving QKD links: {e}") + return jsonify({'error': 'Internal Server Error'}), 500 + + +@app.route('/qkd/applications', methods=['GET']) +def get_qkd_applications(): + try: + context_info = get_context_topology_info() + for context in context_info: + if context['context_name'] == 'admin': + for topology in context['topologies']: + if topology['topology_name'] == 'admin': + for device in topology['devices']: + driver = get_driver_instance(device) + if driver: + applications = driver.get_qkd_applications() + return jsonify(applications), 200 + abort(404, description="No applications found") + except Exception as e: + app.logger.error(f"Error retrieving QKD applications: {e}") + return jsonify({'error': 'Internal Server Error'}), 500 + + +if __name__ == '__main__': + app.run(debug=True, host='0.0.0.0', port=5000) diff --git a/src/device/service/drivers/__init__.py b/src/device/service/drivers/__init__.py index 573eb194e..a5e7f3771 100644 --- a/src/device/service/drivers/__init__.py +++ b/src/device/service/drivers/__init__.py @@ -180,7 +180,7 @@ if LOAD_ALL_DEVICE_DRIVERS: ])) if LOAD_ALL_DEVICE_DRIVERS: - from .qkd.QKDDriver import QKDDriver # pylint: disable=wrong-import-position + from .qkd.QKDDriver2 import QKDDriver # pylint: disable=wrong-import-position DRIVERS.append( (QKDDriver, [ { diff --git a/src/device/service/drivers/qkd/LuxquantaDriver.py b/src/device/service/drivers/qkd/LuxquantaDriver.py new file mode 100644 index 000000000..e1640e1c5 --- /dev/null +++ b/src/device/service/drivers/qkd/LuxquantaDriver.py @@ -0,0 +1,102 @@ +import grpc +import json +import requests +from common.proto.context_pb2 import DeviceId, DeviceOperationalStatusEnum, ConfigRule, ConfigRule_Custom, Empty, ContextId, TopologyId, Uuid, ConfigActionEnum +from common.proto.context_pb2_grpc import ContextServiceStub +from common.DeviceTypes import DeviceTypeEnum +from common.tools.grpc.ConfigRules import update_config_rule_custom + +def login_qkd(address, port, username, password): + url = f"http://{address}:{port}/login" + headers = {'Content-Type': 'application/x-www-form-urlencoded'} + data = {'username': username, 'password': password} + response = requests.post(url, headers=headers, data=data) + response.raise_for_status() + token = response.json().get('access_token') + return token + +def fetch_qkd_info(address, port, token, endpoint): + url = f"http://{address}:{port}{endpoint}" + headers = {'Authorization': f'Bearer {token}', 'accept': 'application/json'} + response = requests.get(url, headers=headers) + response.raise_for_status() + return response.json() + +def create_config_file(qkd_devices, filename): + json_structure = { + "contexts": [ + {"context_id": {"context_uuid": {"uuid": "admin"}}} + ], + "topologies": [ + {"topology_id": {"topology_uuid": {"uuid": "admin"}, "context_id": {"context_uuid": {"uuid": "admin"}}}} + ], + "devices": [], + "links": [] + } + + for device in qkd_devices: + device_entry = { + "device_id": {"device_uuid": {"uuid": device["uuid"]}}, + "device_type": "qkd-node", + "device_operational_status": DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED, + "device_drivers": [12], # Assuming 12 is the correct driver ID for QKD + "device_endpoints": [], + "device_config": {"config_rules": [ + {"action": ConfigActionEnum.CONFIGACTION_SET, "custom": {"resource_key": "_connect/address", "resource_value": device["address"]}}, + {"action": ConfigActionEnum.CONFIGACTION_SET, "custom": {"resource_key": "_connect/port", "resource_value": str(device["port"])}}, + {"action": ConfigActionEnum.CONFIGACTION_SET, "custom": {"resource_key": "_connect/settings", "resource_value": json.dumps({"scheme": "http", "token": device["token"]})}} + ]} + } + json_structure["devices"].append(device_entry) + + for interface in device["interfaces"]["qkd_interface"]: + endpoint_id = f"{device['address']}:{interface['qkdi_id']}" + device_entry["device_endpoints"].append({ + "device_id": {"device_uuid": {"uuid": device["uuid"]}}, + "endpoint_uuid": {"uuid": endpoint_id} + }) + + for link in device["links"]["qkd_links"]: + link_entry = { + "link_id": {"link_uuid": {"uuid": link["qkdl_id"]}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": device["uuid"]}}, "endpoint_uuid": {"uuid": f"{device['address']}:{link['qkdl_id']}"}} + # You need to fetch and add the other endpoint details similarly + ] + } + json_structure["links"].append(link_entry) + + with open(filename, 'w', encoding='utf-8') as f: + json.dump(json_structure, f, ensure_ascii=False, indent=4) + +def main(): + qkd_devices = [ + { + "uuid": "real_qkd1", + "address": "10.13.13.2", + "port": 5100, + "username": "admin", + "password": "password" + } + # Add more QKD devices if needed + ] + + # Step 1: Authenticate and get the JWT tokens for each QKD device + for qkd_device in qkd_devices: + qkd_device['token'] = login_qkd( + qkd_device['address'], qkd_device['port'], qkd_device['username'], qkd_device['password']) + + # Step 2: Fetch QKD device information + for qkd_device in qkd_devices: + qkd_device['capabilities'] = fetch_qkd_info(qkd_device['address'], qkd_device['port'], qkd_device['token'], '/restconf/data/etsi-qkd-sdn-node:qkd_node/qkdn_capabilities') + qkd_device['interfaces'] = fetch_qkd_info(qkd_device['address'], qkd_device['port'], qkd_device['token'], '/restconf/data/etsi-qkd-sdn-node:qkd_node/qkd_interfaces') + qkd_device['links'] = fetch_qkd_info(qkd_device['address'], qkd_device['port'], qkd_device['token'], '/restconf/data/etsi-qkd-sdn-node:qkd_node/qkd_links') + qkd_device['applications'] = fetch_qkd_info(qkd_device['address'], qkd_device['port'], qkd_device['token'], '/restconf/data/etsi-qkd-sdn-node:qkd_node/qkd_applications') + + # Step 3: Create config files for each QKD device + config_filename = "qkd_devices_config.json" + create_config_file(qkd_devices, config_filename) + print(f"Config file created: {config_filename}") + +if __name__ == "__main__": + main() diff --git a/src/device/service/drivers/qkd/QKDDriver.py b/src/device/service/drivers/qkd/QKDDriver.py index b8f7a8ebe..b304ec61a 100644 --- a/src/device/service/drivers/qkd/QKDDriver.py +++ b/src/device/service/drivers/qkd/QKDDriver.py @@ -26,6 +26,8 @@ class QKDDriver(_Driver): self.__qkd_root = '{:s}://{:s}:{:d}'.format(scheme, self.address, int(self.port)) self.__timeout = int(self.settings.get('timeout', 120)) self.__node_ids = set(self.settings.get('node_ids', [])) + token = self.settings.get('token') + self.__headers = {'Authorization': 'Bearer ' + token} self.__initial_data = None def Connect(self) -> bool: @@ -34,7 +36,11 @@ class QKDDriver(_Driver): if self.__started.is_set(): return True r = None try: - r = requests.get(url, timeout=self.__timeout, verify=False, auth=self.__auth) + LOGGER.info(f'requests.get("{url}", timeout={self.__timeout}, verify=False, auth={self.__auth}, headers={self.__headers})') + r = requests.get(url, timeout=self.__timeout, verify=False, auth=self.__auth, headers=self.__headers) + LOGGER.info(f'R: {r}') + LOGGER.info(f'Text: {r.text}') + LOGGER.info(f'Json: {r.json()}') except requests.exceptions.Timeout: LOGGER.exception('Timeout connecting {:s}'.format(str(self.__qkd_root))) return False @@ -67,7 +73,7 @@ class QKDDriver(_Driver): chk_string(str_resource_name, resource_key, allow_empty=False) results.extend(config_getter( self.__qkd_root, resource_key, timeout=self.__timeout, auth=self.__auth, - node_ids=self.__node_ids)) + node_ids=self.__node_ids, headers=self.__headers)) return results @@ -97,7 +103,7 @@ class QKDDriver(_Driver): data = create_connectivity_link( self.__qkd_root, link_uuid, node_id_src, interface_id_src, node_id_dst, interface_id_dst, virt_prev_hop, virt_next_hops, virt_bandwidth, - timeout=self.__timeout, auth=self.__auth + timeout=self.__timeout, auth=self.__auth, headers=self.__headers ) #data = create_connectivity_link( diff --git a/src/device/service/drivers/qkd/QKDDriver2.py b/src/device/service/drivers/qkd/QKDDriver2.py new file mode 100644 index 000000000..84d9f411e --- /dev/null +++ b/src/device/service/drivers/qkd/QKDDriver2.py @@ -0,0 +1,228 @@ +import os +import json +import logging +import requests +import threading +from requests.auth import HTTPBasicAuth +from typing import Any, List, Optional, Tuple, Union +from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method +from common.type_checkers.Checkers import chk_string, chk_type +from device.service.driver_api._Driver import _Driver +from .Tools2 import config_getter, create_connectivity_link + +LOGGER = logging.getLogger(__name__) + +DRIVER_NAME = 'qkd' +METRICS_POOL = MetricsPool('Device', 'Driver', labels={'driver': DRIVER_NAME}) + + +class QKDDriver(_Driver): + def __init__(self, address: str, port: int, **settings) -> None: + LOGGER.info(f"Initializing QKDDriver with address={address}, port={port}, settings={settings}") + super().__init__(DRIVER_NAME, address, port, **settings) + self.__lock = threading.Lock() + self.__started = threading.Event() + self.__terminate = threading.Event() + self.__auth = None + self.__headers = {} + self.__qkd_root = os.getenv('QKD_API_URL', '{:s}://{:s}:{:d}'.format(settings.get('scheme', 'http'), self.address, int(self.port))) + self.__timeout = int(self.settings.get('timeout', 120)) + self.__node_ids = set(self.settings.get('node_ids', [])) + self.__initial_data = None + + # Authentication settings + self.__username = settings.get('username') + self.__password = settings.get('password') + self.__use_jwt = settings.get('use_jwt', True) # Default to True if JWT is required + self.__token = settings.get('token') + + if self.__token: + self.__headers = {'Authorization': 'Bearer ' + self.__token} + elif self.__username and self.__password: + self.__auth = HTTPBasicAuth(self.__username, self.__password) + + LOGGER.info(f"QKDDriver initialized with QKD root URL: {self.__qkd_root}") + + def authenticate(self) -> bool: + if self.__use_jwt and not self.__token: + return self.__authenticate_with_jwt() + return True + + def __authenticate_with_jwt(self) -> bool: + login_url = f'{self.__qkd_root}/login' + payload = {'username': self.__username, 'password': self.__password} + + try: + LOGGER.info(f'Attempting to authenticate with JWT at {login_url}') + response = requests.post(login_url, data=payload, timeout=self.__timeout) + response.raise_for_status() + token = response.json().get('access_token') + if not token: + LOGGER.error('Failed to retrieve access token') + return False + self.__token = token # Store the token + self.__headers = {'Authorization': f'Bearer {token}'} + LOGGER.info('JWT authentication successful') + return True + except requests.exceptions.RequestException as e: + LOGGER.exception(f'JWT authentication failed: {e}') + return False + + def Connect(self) -> bool: + url = self.__qkd_root + '/restconf/data/etsi-qkd-sdn-node:qkd_node' + with self.__lock: + LOGGER.info(f"Starting connection to {url}") + if self.__started.is_set(): + LOGGER.info("Already connected, skipping re-connection.") + return True + + try: + if not self.__headers and not self.__auth: + LOGGER.info("No headers or auth found, calling authenticate.") + if not self.authenticate(): + return False + + LOGGER.info(f'Attempting to connect to {url} with headers {self.__headers} and timeout {self.__timeout}') + response = requests.get(url, timeout=self.__timeout, verify=False, headers=self.__headers, auth=self.__auth) + LOGGER.info(f'Received response: {response.status_code}, content: {response.text}') + response.raise_for_status() + self.__initial_data = response.json() + self.__started.set() + LOGGER.info('Connection successful') + return True + except requests.exceptions.RequestException as e: + LOGGER.error(f'Connection failed: {e}') + return False + + def Disconnect(self) -> bool: + LOGGER.info("Disconnecting QKDDriver") + with self.__lock: + self.__terminate.set() + LOGGER.info("QKDDriver disconnected successfully") + return True + + @metered_subclass_method(METRICS_POOL) + def GetInitialConfig(self) -> List[Tuple[str, Any]]: + LOGGER.info("Getting initial configuration") + with self.__lock: + if isinstance(self.__initial_data, dict): + initial_config = [('qkd_node', self.__initial_data.get('qkd_node', {}))] + LOGGER.info(f"Initial configuration: {initial_config}") + return initial_config + LOGGER.warning("Initial data is not a dictionary") + return [] + + @metered_subclass_method(METRICS_POOL) + def GetConfig(self, resource_keys: List[str] = []) -> List[Tuple[str, Union[Any, None, Exception]]]: + chk_type('resources', resource_keys, list) + LOGGER.info(f"Getting configuration for resource_keys: {resource_keys}") + results = [] + with self.__lock: + if not resource_keys: + resource_keys = ['capabilities', 'interfaces', 'links', 'endpoints', 'apps'] + for i, resource_key in enumerate(resource_keys): + chk_string(f'resource_key[{i}]', resource_key, allow_empty=False) + LOGGER.info(f"Retrieving resource key: {resource_key}") + resource_results = config_getter( + self.__qkd_root, resource_key, timeout=self.__timeout, headers=self.__headers, auth=self.__auth, + node_ids=self.__node_ids) + results.extend(resource_results) + LOGGER.info(f"Resource results for {resource_key}: {resource_results}") + LOGGER.info(f"Final configuration results: {results}") + return results + + @metered_subclass_method(METRICS_POOL) + def SetConfig(self, resources: List[Tuple[str, Any]]) -> List[Union[bool, Exception]]: + LOGGER.info(f"Setting configuration for resources: {resources}") + results = [] + if not resources: + LOGGER.warning("No resources provided for SetConfig") + return results + with self.__lock: + for resource_key, resource_value in resources: + LOGGER.info(f'Processing resource_key: {resource_key}, resource_value: {resource_value}') + + if resource_key.startswith('/link'): + try: + if not isinstance(resource_value, dict): + raise TypeError(f"Expected dictionary but got {type(resource_value).__name__}") + + link_uuid = resource_value.get('uuid') + node_id_src = resource_value.get('src_qkdn_id') + interface_id_src = resource_value.get('src_interface_id') + node_id_dst = resource_value.get('dst_qkdn_id') + interface_id_dst = resource_value.get('dst_interface_id') + virt_prev_hop = resource_value.get('virt_prev_hop') + virt_next_hops = resource_value.get('virt_next_hops') + virt_bandwidth = resource_value.get('virt_bandwidth') + + LOGGER.info(f"Creating connectivity link with UUID: {link_uuid}") + create_connectivity_link( + self.__qkd_root, link_uuid, node_id_src, interface_id_src, node_id_dst, interface_id_dst, + virt_prev_hop, virt_next_hops, virt_bandwidth, + headers=self.__headers, timeout=self.__timeout, auth=self.__auth + ) + results.append(True) + LOGGER.info(f"Connectivity link {link_uuid} created successfully") + except Exception as e: + LOGGER.exception(f'Unhandled error processing resource_key({resource_key})') + results.append(e) + else: + LOGGER.error(f'Invalid resource key detected: {resource_key}') + results.append(ValueError(f'Invalid resource key: {resource_key}')) + + LOGGER.info(f"SetConfig results: {results}") + return results + + @metered_subclass_method(METRICS_POOL) + def DeleteConfig(self, resources: List[Tuple[str, Any]]) -> List[Union[bool, Exception]]: + LOGGER.info(f"Deleting configuration for resources: {resources}") + results = [] + if not resources: + LOGGER.warning("No resources provided for DeleteConfig") + return results + with self.__lock: + for resource in resources: + LOGGER.info(f'Resource to delete: {resource}') + uuid = resource[1].get('uuid') + if uuid: + LOGGER.info(f'Resource with UUID {uuid} deleted successfully') + results.append(True) + else: + LOGGER.warning(f"UUID not found in resource: {resource}") + results.append(False) + LOGGER.info(f"DeleteConfig results: {results}") + return results + + @metered_subclass_method(METRICS_POOL) + def SubscribeState(self, subscriptions: List[Tuple[str, float, float]]) -> List[Union[bool, Exception]]: + LOGGER.info(f"Subscribing to state updates: {subscriptions}") + results = [True for _ in subscriptions] + LOGGER.info(f"Subscription results: {results}") + return results + + @metered_subclass_method(METRICS_POOL) + def UnsubscribeState(self, subscriptions: List[Tuple[str, float, float]]) -> List[Union[bool, Exception]]: + LOGGER.info(f"Unsubscribing from state updates: {subscriptions}") + results = [True for _ in subscriptions] + LOGGER.info(f"Unsubscription results: {results}") + return results + + @metered_subclass_method(METRICS_POOL) + def GetState(self, blocking=False, terminate: Optional[threading.Event] = None) -> Union[dict, list]: + LOGGER.info(f"GetState called with blocking={blocking}, terminate={terminate}") + url = self.__qkd_root + '/restconf/data/etsi-qkd-sdn-node:qkd_node' + try: + LOGGER.info(f"Making GET request to {url} to retrieve state") + response = requests.get(url, timeout=self.__timeout, verify=False, headers=self.__headers, auth=self.__auth) + LOGGER.info(f"Received state response: {response.status_code}, content: {response.text}") + response.raise_for_status() + state_data = response.json() + LOGGER.info(f"State data retrieved: {state_data}") + return state_data + except requests.exceptions.Timeout: + LOGGER.error(f'Timeout getting state from {self.__qkd_root}') + return [] + except Exception as e: + LOGGER.error(f'Exception getting state from {self.__qkd_root}: {e}') + return [] diff --git a/src/device/service/drivers/qkd/Tools.py b/src/device/service/drivers/qkd/Tools.py index 38e80ad50..bfdf3033a 100644 --- a/src/device/service/drivers/qkd/Tools.py +++ b/src/device/service/drivers/qkd/Tools.py @@ -21,7 +21,7 @@ def find_key(resource, key): def config_getter( root_url : str, resource_key : str, auth : Optional[HTTPBasicAuth] = None, timeout : Optional[int] = None, - node_ids : Set[str] = set() + node_ids : Set[str] = set(), headers={} ): # getting endpoints @@ -33,7 +33,7 @@ def config_getter( try: if resource_key in [RESOURCE_ENDPOINTS, RESOURCE_INTERFACES]: url += 'qkd_interfaces/' - r = requests.get(url, timeout=timeout, verify=False, auth=auth) + r = requests.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) interfaces = r.json()['qkd_interfaces']['qkd_interface'] # If it's a physical endpoint @@ -73,7 +73,7 @@ def config_getter( elif resource_key in [RESOURCE_LINKS, RESOURCE_NETWORK_INSTANCES]: url += 'qkd_links/' - r = requests.get(url, timeout=timeout, verify=False, auth=auth) + r = requests.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) links = r.json()['qkd_links']['qkd_link'] if resource_key == RESOURCE_LINKS: @@ -93,7 +93,7 @@ def config_getter( elif resource_key == RESOURCE_APPS: url += 'qkd_applications/' - r = requests.get(url, timeout=timeout, verify=False, auth=auth) + r = requests.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) apps = r.json()['qkd_applications']['qkd_app'] for app in apps: @@ -103,13 +103,13 @@ def config_getter( elif resource_key == RESOURCE_CAPABILITES: url += 'qkdn_capabilities/' - r = requests.get(url, timeout=timeout, verify=False, auth=auth) + r = requests.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) capabilities = r.json()['qkdn_capabilities'] result.append((resource_key, capabilities)) elif resource_key == RESOURCE_NODE: - r = requests.get(url, timeout=timeout, verify=False, auth=auth) + r = requests.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) node = r.json()['qkd_node'] result.append((resource_key, node)) @@ -128,7 +128,7 @@ def config_getter( def create_connectivity_link( root_url, link_uuid, node_id_src, interface_id_src, node_id_dst, interface_id_dst, virt_prev_hop = None, virt_next_hops = None, virt_bandwidth = None, - auth : Optional[HTTPBasicAuth] = None, timeout : Optional[int] = None + auth : Optional[HTTPBasicAuth] = None, timeout : Optional[int] = None, headers={} ): url = root_url + '/restconf/data/etsi-qkd-sdn-node:qkd_node/qkd_links/' @@ -155,5 +155,5 @@ def create_connectivity_link( data = {'qkd_links': {'qkd_link': [qkd_link]}} - requests.post(url, json=data) + requests.post(url, json=data, headers=headers) diff --git a/src/device/service/drivers/qkd/Tools2.py b/src/device/service/drivers/qkd/Tools2.py new file mode 100644 index 000000000..ea88799f4 --- /dev/null +++ b/src/device/service/drivers/qkd/Tools2.py @@ -0,0 +1,209 @@ +import json +import logging +import requests +from requests.auth import HTTPBasicAuth +from typing import Dict, Optional, Set, List, Tuple, Union, Any +from requests.adapters import HTTPAdapter +from urllib3.util.retry import Retry + +LOGGER = logging.getLogger(__name__) + +HTTP_OK_CODES = { + 200, # OK + 201, # Created + 202, # Accepted + 204, # No Content +} + +def get_request_session(retries=5, backoff_factor=1.0, status_forcelist=(500, 502, 504)): + """ + Creates a requests session with retries and backoff strategy. + """ + LOGGER.info(f"Creating request session with retries={retries}, backoff_factor={backoff_factor}, status_forcelist={status_forcelist}") + session = requests.Session() + retry = Retry( + total=retries, + read=retries, + connect=retries, + backoff_factor=backoff_factor, + status_forcelist=status_forcelist, + ) + adapter = HTTPAdapter(max_retries=retry) + session.mount('http://', adapter) + session.mount('https://', adapter) + LOGGER.info("Request session created successfully") + return session + +def find_key(resource, key): + """ + Extracts a specific key from a JSON resource. + """ + return json.loads(resource[1])[key] + +def verify_endpoint_existence(session, endpoint_uuid, root_url, headers): + """ + Verifies if the given endpoint exists. + """ + url = f"{root_url}/restconf/data/etsi-qkd-sdn-node:qkd_node/qkd_interfaces/qkd_interface={endpoint_uuid}" + r = session.get(url, headers=headers) + if r.status_code == 200 and r.json(): + return True + else: + LOGGER.error(f"Endpoint {endpoint_uuid} does not exist or is not accessible") + return False + +def config_getter( + root_url: str, resource_key: str, auth: Optional[HTTPBasicAuth] = None, timeout: Optional[int] = None, + node_ids: Set[str] = set(), headers: Dict[str, str] = {} +) -> List[Tuple[str, Union[Dict[str, Any], Exception]]]: + """ + Fetches configuration data from a QKD node for a specified resource key. + Returns a list of tuples containing the resource key and the corresponding data or exception. + """ + url = f"{root_url}/restconf/data/etsi-qkd-sdn-node:qkd_node/" + result = [] + session = get_request_session() + + LOGGER.info(f"Starting config_getter with root_url={root_url}, resource_key={resource_key}, headers={headers}") + + try: + if resource_key in ['endpoints', '__endpoints__', 'interfaces']: + url += 'qkd_interfaces/' + LOGGER.info(f"Making GET request to {url} with headers: {headers}") + r = session.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) + LOGGER.info(f"Received response: {r.status_code}, content: {r.text}") + r.raise_for_status() + interfaces = r.json().get('qkd_interfaces', {}).get('qkd_interface', []) + if not interfaces: + raise KeyError('qkd_interfaces') + for interface in interfaces: + if resource_key in ['endpoints', '__endpoints__']: + endpoint_uuid = f"{interface['qkdi_att_point'].get('device', 'N/A')}:{interface['qkdi_att_point'].get('port', 'N/A')}" + resource_key_with_uuid = f"/endpoints/endpoint[{endpoint_uuid}]" + interface['uuid'] = endpoint_uuid + result.append((resource_key_with_uuid, interface)) + else: + interface_uuid = f"{interface['qkdi_att_point'].get('device', 'N/A')}:{interface['qkdi_att_point'].get('port', 'N/A')}" + interface['uuid'] = interface_uuid + interface['name'] = interface_uuid + interface['enabled'] = True + resource_key_with_uuid = f"/interface[{interface['qkdi_id']}]" + result.append((resource_key_with_uuid, interface)) + + elif resource_key in ['links', '__links__', '__network_instances__', 'network_instances']: + url += 'qkd_links/' + LOGGER.info(f"Making GET request to {url} with headers: {headers}") + r = session.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) + LOGGER.info(f"Received response: {r.status_code}, content: {r.text}") + r.raise_for_status() + links = r.json().get('qkd_links', {}).get('qkd_link', []) + if not links: + LOGGER.warning(f"No links found in the response for 'qkd_links'") + + for link in links: + link_type = link.get('qkdl_type', 'Direct') + + if resource_key == 'links': + if link_type == 'Direct': + resource_key_with_uuid = f"/link[{link['qkdl_id']}]" + result.append((resource_key_with_uuid, link)) + else: + if link_type == 'Virtual': + resource_key_with_uuid = f"/service[{link['qkdl_id']}]" + result.append((resource_key_with_uuid, link)) + + elif resource_key in ['apps', '__apps__']: + url += 'qkd_applications/' + LOGGER.info(f"Making GET request to {url} with headers: {headers}") + r = session.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) + LOGGER.info(f"Received response: {r.status_code}, content: {r.text}") + r.raise_for_status() + apps = r.json().get('qkd_applications', {}).get('qkd_app', []) + if not apps: + raise KeyError('qkd_applications') + for app in apps: + app_resource_key = f"/app[{app['app_id']}]" + result.append((app_resource_key, app)) + + elif resource_key in ['capabilities', '__capabilities__']: + url += 'qkdn_capabilities/' + LOGGER.info(f"Making GET request to {url} with headers: {headers}") + r = session.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) + LOGGER.info(f"Received response: {r.status_code}, content: {r.text}") + r.raise_for_status() + capabilities = r.json() + result.append((resource_key, capabilities)) + + elif resource_key in ['node', '__node__']: + LOGGER.info(f"Making GET request to {url} with headers: {headers}") + r = session.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) + LOGGER.info(f"Received response: {r.status_code}, content: {r.text}") + r.raise_for_status() + node = r.json().get('qkd_node', {}) + result.append((resource_key, node)) + + else: + LOGGER.warning(f"Unknown resource key: {resource_key}") + result.append((resource_key, ValueError(f"Unknown resource key: {resource_key}"))) + + except requests.exceptions.RequestException as e: + LOGGER.error(f'Exception retrieving/parsing {resource_key} from {url}: {e}') + result.append((resource_key, e)) + + LOGGER.info(f"config_getter results for {resource_key}: {result}") + return result + +def create_connectivity_link( + root_url: str, link_uuid: str, node_id_src: str, interface_id_src: str, node_id_dst: str, interface_id_dst: str, + virt_prev_hop: Optional[str] = None, virt_next_hops: Optional[List[str]] = None, virt_bandwidth: Optional[int] = None, + auth: Optional[HTTPBasicAuth] = None, timeout: Optional[int] = None, headers: Dict[str, str] = {} +) -> Union[bool, Exception]: + """ + Creates a connectivity link between QKD nodes using the provided parameters. + """ + url = f"{root_url}/restconf/data/etsi-qkd-sdn-node:qkd_node/qkd_links/" + session = get_request_session() + + # Verify that endpoints exist before creating the link + if not (verify_endpoint_existence(session, interface_id_src, root_url, headers) and + verify_endpoint_existence(session, interface_id_dst, root_url, headers)): + LOGGER.error(f"Cannot create link {link_uuid} because one or both endpoints do not exist.") + return Exception(f"Endpoint verification failed for link {link_uuid}") + + is_virtual = bool(virt_prev_hop or virt_next_hops) + + qkd_link = { + 'qkdl_id': link_uuid, + 'qkdl_type': 'etsi-qkd-node-types:' + ('VIRT' if is_virtual else 'PHYS'), + 'qkdl_local': { + 'qkdn_id': node_id_src, + 'qkdi_id': interface_id_src + }, + 'qkdl_remote': { + 'qkdn_id': node_id_dst, + 'qkdi_id': interface_id_dst + } + } + + if is_virtual: + qkd_link['virt_prev_hop'] = virt_prev_hop + qkd_link['virt_next_hop'] = virt_next_hops or [] + qkd_link['virt_bandwidth'] = virt_bandwidth + + data = {'qkd_links': {'qkd_link': [qkd_link]}} + + LOGGER.info(f"Creating connectivity link with payload: {json.dumps(data)}") + + try: + r = session.post(url, json=data, timeout=timeout, verify=False, auth=auth, headers=headers) + LOGGER.info(f"Received response for link creation: {r.status_code}, content: {r.text}") + r.raise_for_status() + if r.status_code in HTTP_OK_CODES: + LOGGER.info(f"Link {link_uuid} created successfully.") + return True + else: + LOGGER.error(f"Failed to create link {link_uuid}, status code: {r.status_code}") + return False + except requests.exceptions.RequestException as e: + LOGGER.error(f"Exception creating link {link_uuid} with payload {json.dumps(data)}: {e}") + return e diff --git a/src/device/tests/qkd/integration/test_qkd_integration.py b/src/device/tests/qkd/integration/test_qkd_integration.py new file mode 100644 index 000000000..73477de0a --- /dev/null +++ b/src/device/tests/qkd/integration/test_qkd_integration.py @@ -0,0 +1,35 @@ +import pytest +from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver + +def test_end_to_end_workflow(): + driver = QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') + assert driver.Connect() is True + + # Retrieve initial configuration + config = driver.GetInitialConfig() + assert isinstance(config, dict) + assert 'qkd_node' in config + + # Define the new configuration + new_config = {'uuid': 'test', 'device': 'device1', 'port': 'port1'} + + # Use a valid resource key based on driver implementation + valid_resource_key = '/link/valid_resource_key' # Adjust this key as necessary + + try: + result = driver.SetConfig([(valid_resource_key, new_config)]) + + # Check for ValueErrors in results + if any(isinstance(res, ValueError) for res in result): + pytest.fail(f"SetConfig failed with error: {next(res for res in result if isinstance(res, ValueError))}") + + # Ensure result is a list of booleans + assert isinstance(result, list) + assert all(isinstance(res, bool) for res in result) + assert all(result) # Ensure all operations succeeded + except Exception as e: + pytest.fail(f"SetConfig failed: {e}") + + + + diff --git a/src/device/tests/qkd/integration/test_qkd_luxquanta_retrieve_information.py b/src/device/tests/qkd/integration/test_qkd_luxquanta_retrieve_information.py new file mode 100644 index 000000000..9364b8e5e --- /dev/null +++ b/src/device/tests/qkd/integration/test_qkd_luxquanta_retrieve_information.py @@ -0,0 +1,177 @@ +import pytest +import json +import logging +from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver + +# Set up logging +logging.basicConfig(level=logging.INFO) +LOGGER = logging.getLogger(__name__) + +class SafeJSONEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, Exception): + return {'error': str(obj), 'type': type(obj).__name__} + return super().default(obj) + +# Dictionary to store retrieved information +retrieved_info = { + "config_qkd1": None, + "config_qkd2": None, + "capabilities_qkd1": None, + "capabilities_qkd2": None, + "interfaces_qkd1": None, + "interfaces_qkd2": None, + "links_qkd1": None, + "links_qkd2": None, + "state_qkd1": None, + "state_qkd2": None, +} + +@pytest.fixture +def driver_qkd1(): + return QKDDriver(address='10.13.13.2', port=5100, username='admin', password='password', use_jwt=True) + +@pytest.fixture +def driver_qkd2(): + return QKDDriver(address='10.13.13.3', port=5100, username='admin', password='password', use_jwt=True) + +def log_data(label, data): + LOGGER.info(f"{label}: {json.dumps(data, indent=2, cls=SafeJSONEncoder)}") + +def get_jwt_token(driver): + try: + return driver._QKDDriver__headers.get('Authorization').split(' ')[1] + except (AttributeError, KeyError, TypeError): + return None + +def save_json_file(filename, data): + """Save data to a JSON file.""" + try: + with open(filename, 'w') as f: + json.dump(data, f, indent=2) + LOGGER.info(f"Successfully saved {filename}") + except Exception as e: + LOGGER.error(f"Failed to save {filename}: {e}") + +def test_retrieve_and_create_descriptor(driver_qkd1, driver_qkd2): + # Connect to both QKD nodes + assert driver_qkd1.Connect() + assert driver_qkd2.Connect() + + # Use the same JWT token for all requests + jwt_token = get_jwt_token(driver_qkd1) + assert jwt_token, "Failed to retrieve JWT token from QKD1" + + driver_qkd2._QKDDriver__headers['Authorization'] = f'Bearer {jwt_token}' + + # Retrieve initial configs + config_qkd1 = driver_qkd1.GetInitialConfig() + retrieved_info['config_qkd1'] = config_qkd1 + log_data("QKD1 Initial Config", config_qkd1) + assert config_qkd1, "Failed to retrieve initial configuration for QKD1" + + config_qkd2 = driver_qkd2.GetInitialConfig() + retrieved_info['config_qkd2'] = config_qkd2 + log_data("QKD2 Initial Config", config_qkd2) + assert config_qkd2, "Failed to retrieve initial configuration for QKD2" + + # Retrieve capabilities + capabilities_qkd1 = driver_qkd1.GetConfig(['capabilities']) + retrieved_info['capabilities_qkd1'] = capabilities_qkd1 + log_data("QKD1 Capabilities", capabilities_qkd1) + assert capabilities_qkd1, "Failed to retrieve capabilities for QKD1" + + capabilities_qkd2 = driver_qkd2.GetConfig(['capabilities']) + retrieved_info['capabilities_qkd2'] = capabilities_qkd2 + log_data("QKD2 Capabilities", capabilities_qkd2) + assert capabilities_qkd2, "Failed to retrieve capabilities for QKD2" + + # Retrieve interfaces + interfaces_qkd1 = driver_qkd1.GetConfig(['interfaces']) + retrieved_info['interfaces_qkd1'] = interfaces_qkd1 + log_data("QKD1 Interfaces", interfaces_qkd1) + assert interfaces_qkd1, "Failed to retrieve interfaces for QKD1" + + interfaces_qkd2 = driver_qkd2.GetConfig(['interfaces']) + retrieved_info['interfaces_qkd2'] = interfaces_qkd2 + log_data("QKD2 Interfaces", interfaces_qkd2) + assert interfaces_qkd2, "Failed to retrieve interfaces for QKD2" + + # Retrieve links + links_qkd1 = driver_qkd1.GetConfig(['links']) + retrieved_info['links_qkd1'] = links_qkd1 + log_data("QKD1 Links", links_qkd1) + assert links_qkd1, "Failed to retrieve links for QKD1" + + links_qkd2 = driver_qkd2.GetConfig(['links']) + retrieved_info['links_qkd2'] = links_qkd2 + log_data("QKD2 Links", links_qkd2) + assert links_qkd2, "Failed to retrieve links for QKD2" + + # Retrieve states + state_qkd1 = driver_qkd1.GetState() + retrieved_info['state_qkd1'] = state_qkd1 + log_data("QKD1 Current State", state_qkd1) + assert state_qkd1, "Failed to retrieve state for QKD1" + + state_qkd2 = driver_qkd2.GetState() + retrieved_info['state_qkd2'] = state_qkd2 + log_data("QKD2 Current State", state_qkd2) + assert state_qkd2, "Failed to retrieve state for QKD2" + + # Save retrieved information after all data retrieval + save_json_file('retrieved_info.json', retrieved_info) + + # Dynamically create the descriptor + descriptor = { + "contexts": [ + {"context_id": {"context_uuid": {"uuid": "admin"}}} + ], + "topologies": [ + {"topology_id": {"topology_uuid": {"uuid": "admin"}, "context_id": {"context_uuid": {"uuid": "admin"}}}} + ], + "devices": [], + "links": [] + } + + # Dynamically add device information + for config, token, interfaces, device_name, address, port in [ + (config_qkd1, jwt_token, interfaces_qkd1, "QKD1", "10.13.13.2", "5100"), + (config_qkd2, jwt_token, interfaces_qkd2, "QKD2", "10.13.13.3", "5100") + ]: + device_info = { + "device_id": {"device_uuid": {"uuid": device_name}}, + "device_type": "qkd-node", + "device_operational_status": 0, + "device_drivers": [12], # This could be dynamically determined if needed + "device_endpoints": [], + "device_config": { + "config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": address}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": port}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { + "scheme": "http", + "token": token if token else "N/A" + }}} + ] + } + } + + descriptor['devices'].append(device_info) + + # Dynamically create and add links based on retrieved links data + if links_qkd1 and links_qkd2: + for link_data in links_qkd1: + link_uuid = link_data[1].get('qkdl_id') + link_entry = { + "link_id": {"link_uuid": {"uuid": f"QKD1/{address}:{port}==QKD2/{links_qkd2[0][1]['qkdi_status']}/{port}"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "QKD1"}}, "endpoint_uuid": {"uuid": f"{address}:{port}"}}, + {"device_id": {"device_uuid": {"uuid": "QKD2"}}, "endpoint_uuid": {"uuid": f"{address}:{port}"}} + ] + } + descriptor['links'].append(link_entry) + + # Save the dynamically created descriptor + save_json_file('descriptor.json', descriptor) + log_data("Created Descriptor", descriptor) \ No newline at end of file diff --git a/src/device/tests/qkd/mock_qkd_nodes/YangValidator.py b/src/device/tests/qkd/mock_qkd_nodes/YangValidator.py new file mode 100644 index 000000000..2056d5df6 --- /dev/null +++ b/src/device/tests/qkd/mock_qkd_nodes/YangValidator.py @@ -0,0 +1,42 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 libyang, os +from typing import Dict, Optional + +YANG_DIR = os.path.join(os.path.dirname(__file__), 'yang') + +class YangValidator: + def __init__(self, main_module : str, dependency_modules : [str]) -> None: + self._yang_context = libyang.Context(YANG_DIR) + + self._yang_module = self._yang_context.load_module(main_module) + mods = [self._yang_context.load_module(mod) for mod in dependency_modules] + [self._yang_module] + + for mod in mods: + mod.feature_enable_all() + + + + def parse_to_dict(self, message : Dict) -> Dict: + dnode : Optional[libyang.DNode] = self._yang_module.parse_data_dict( + message, validate_present=True, validate=True, strict=True + ) + if dnode is None: raise Exception('Unable to parse Message({:s})'.format(str(message))) + message = dnode.print_dict() + dnode.free() + return message + + def destroy(self) -> None: + self._yang_context.destroy() diff --git a/src/device/tests/qkd/mock_qkd_nodes/mock.py b/src/device/tests/qkd/mock_qkd_nodes/mock.py new file mode 100644 index 000000000..b5d884197 --- /dev/null +++ b/src/device/tests/qkd/mock_qkd_nodes/mock.py @@ -0,0 +1,355 @@ +import os + +from flask import Flask, request +from YangValidator import YangValidator + +app = Flask(__name__) + + +yang_validator = YangValidator('etsi-qkd-sdn-node', ['etsi-qkd-node-types']) + + +nodes = { + '10.211.36.220:11111': {'node': { + 'qkdn_id': '00000001-0000-0000-0000-000000000000', + }, + 'qkdn_capabilities': { + }, + 'qkd_applications': { + 'qkd_app': [ + { + 'app_id': '00000001-0001-0000-0000-000000000000', + 'client_app_id': [], + 'app_statistics': { + 'statistics': [] + }, + 'app_qos': { + }, + 'backing_qkdl_id': [] + } + ] + }, + 'qkd_interfaces': { + 'qkd_interface': [ + { + 'qkdi_id': '100', + 'qkdi_att_point': { + }, + 'qkdi_capabilities': { + } + }, + { + 'qkdi_id': '101', + 'qkdi_att_point': { + 'device':'10.211.36.220', + 'port':'1001' + }, + 'qkdi_capabilities': { + } + } + ] + }, + 'qkd_links': { + 'qkd_link': [ + + ] + } + }, + + '10.211.36.220:22222': {'node': { + 'qkdn_id': '00000002-0000-0000-0000-000000000000', + }, + 'qkdn_capabilities': { + }, + 'qkd_applications': { + 'qkd_app': [ + { + 'app_id': '00000002-0001-0000-0000-000000000000', + 'client_app_id': [], + 'app_statistics': { + 'statistics': [] + }, + 'app_qos': { + }, + 'backing_qkdl_id': [] + } + ] + }, + 'qkd_interfaces': { + 'qkd_interface': [ + { + 'qkdi_id': '200', + 'qkdi_att_point': { + }, + 'qkdi_capabilities': { + } + }, + { + 'qkdi_id': '201', + 'qkdi_att_point': { + 'device':'10.211.36.220', + 'port':'2001' + }, + 'qkdi_capabilities': { + } + }, + { + 'qkdi_id': '202', + 'qkdi_att_point': { + 'device':'10.211.36.220', + 'port':'2002' + }, + 'qkdi_capabilities': { + } + } + ] + }, + 'qkd_links': { + 'qkd_link': [ + + ] + } + }, + + '10.211.36.220:33333': {'node': { + 'qkdn_id': '00000003-0000-0000-0000-000000000000', + }, + 'qkdn_capabilities': { + }, + 'qkd_applications': { + 'qkd_app': [ + { + 'app_id': '00000003-0001-0000-0000-000000000000', + 'client_app_id': [], + 'app_statistics': { + 'statistics': [] + }, + 'app_qos': { + }, + 'backing_qkdl_id': [] + } + ] + }, + 'qkd_interfaces': { + 'qkd_interface': [ + { + 'qkdi_id': '300', + 'qkdi_att_point': { + }, + 'qkdi_capabilities': { + } + }, + { + 'qkdi_id': '301', + 'qkdi_att_point': { + 'device':'10.211.36.220', + 'port':'3001' + }, + 'qkdi_capabilities': { + } + } + ] + }, + 'qkd_links': { + 'qkd_link': [ + + ] + } + } +} + + +def get_side_effect(url): + + steps = url.lstrip('https://').lstrip('http://').rstrip('/') + ip_port, _, _, header, *steps = steps.split('/') + + header_splitted = header.split(':') + + module = header_splitted[0] + assert(module == 'etsi-qkd-sdn-node') + + tree = {'qkd_node': nodes[ip_port]['node'].copy()} + + if len(header_splitted) == 1 or not header_splitted[1]: + value = nodes[ip_port].copy() + value.pop('node') + tree['qkd_node'].update(value) + + return tree, tree + + root = header_splitted[1] + assert(root == 'qkd_node') + + if not steps: + return tree, tree + + + endpoint, *steps = steps + + value = nodes[ip_port][endpoint] + + if not steps: + return_value = {endpoint:value} + tree['qkd_node'].update(return_value) + + return return_value, tree + + + + ''' + element, *steps = steps + + container, key = element.split('=') + + # value = value[container][key] + + if not steps: + return_value['qkd_node'][endpoint] = [value] + return return_value + + ''' + raise Exception('Url too long') + + + +def edit(from_dict, to_dict, create): + for key, value in from_dict.items(): + if isinstance(value, dict): + if key not in to_dict and create: + to_dict[key] = {} + edit(from_dict[key], to_dict[key], create) + elif isinstance(value, list): + to_dict[key].extend(value) + else: + to_dict[key] = value + + + +def edit_side_effect(url, json, create): + steps = url.lstrip('https://').lstrip('http://').rstrip('/') + ip_port, _, _, header, *steps = steps.split('/') + + module, root = header.split(':') + + assert(module == 'etsi-qkd-sdn-node') + assert(root == 'qkd_node') + + if not steps: + edit(json, nodes[ip_port]['node']) + return + + endpoint, *steps = steps + + if not steps: + edit(json[endpoint], nodes[ip_port][endpoint], create) + return + + + ''' + element, *steps = steps + + container, key = element.split('=') + + if not steps: + if key not in nodes[ip_port][endpoint][container] and create: + nodes[ip_port][endpoint][container][key] = {} + + edit(json, nodes[ip_port][endpoint][container][key], create) + return 0 + ''' + + raise Exception('Url too long') + + + + + + +@app.get('/', defaults={'path': ''}) +@app.get("/") +@app.get('/') +def get(path): + msg, msg_validate = get_side_effect(request.base_url) + print(msg_validate) + yang_validator.parse_to_dict(msg_validate) + return msg + + +@app.post('/', defaults={'path': ''}) +@app.post("/") +@app.post('/') +def post(path): + success = True + reason = '' + try: + edit_side_effect(request.base_url, request.json, True) + except Exception as e: + reason = str(e) + success = False + return {'success': success, 'reason': reason} + + + +@app.route('/', defaults={'path': ''}, methods=['PUT', 'PATCH']) +@app.route("/", methods=['PUT', 'PATCH']) +@app.route('/', methods=['PUT', 'PATCH']) +def patch(path): + success = True + reason = '' + try: + edit_side_effect(request.base_url, request.json, False) + except Exception as e: + reason = str(e) + success = False + return {'success': success, 'reason': reason} + + + + + +# import json +# from mock import requests +# import pyangbind.lib.pybindJSON as enc +# from pyangbind.lib.serialise import pybindJSONDecoder as dec +# from yang.sbi.qkd.templates.etsi_qkd_sdn_node import etsi_qkd_sdn_node + +# module = etsi_qkd_sdn_node() +# url = 'https://1.1.1.1/restconf/data/etsi-qkd-sdn-node:' + +# # Get node all info +# z = requests.get(url).json() +# var = dec.load_json(z, None, None, obj=module) +# print(enc.dumps(var)) + + +# Reset module variable because it is already filled +# module = etsi_qkd_sdn_node() + +# # Get node basic info +# node = module.qkd_node +# z = requests.get(url + 'qkd_node').json() +# var = dec.load_json(z, None, None, obj=node) +# print(enc.dumps(var)) + + +# # Get all apps +# apps = node.qkd_applications +# z = requests.get(url + 'qkd_node/qkd_applications').json() +# var = dec.load_json(z, None, None, obj=apps) +# print(enc.dumps(var)) + +# # Edit app 0 +# app = apps.qkd_app['00000000-0001-0000-0000-000000000000'] +# app.client_app_id = 'id_0' +# requests.put(url + 'qkd_node/qkd_applications/qkd_app=00000000-0001-0000-0000-000000000000', json=json.loads(enc.dumps(app))) + +# # Create app 1 +# app = apps.qkd_app.add('00000000-0001-0000-0000-000000000001') +# requests.post(url + 'qkd_node/qkd_applications/qkd_app=00000000-0001-0000-0000-000000000001', json=json.loads(enc.dumps(app))) + +# # Get all apps +# apps = node.qkd_applications +# z = requests.get(url + 'qkd_node/qkd_applications').json() +# var = dec.load_json(z, None, None, obj=apps) +# print(enc.dumps(var)) diff --git a/src/device/tests/qkd/mock_qkd_nodes/start.sh b/src/device/tests/qkd/mock_qkd_nodes/start.sh new file mode 100644 index 000000000..cf8ee7533 --- /dev/null +++ b/src/device/tests/qkd/mock_qkd_nodes/start.sh @@ -0,0 +1,17 @@ +#!/bin/bash +cd "$(dirname "$0")" + + +#!/bin/bash +killbg() { + for p in "${pids[@]}" ; do + kill "$p"; + done +} +trap killbg EXIT +pids=() +flask --app mock run --host 0.0.0.0 --port 11111 & +pids+=($!) +flask --app mock run --host 0.0.0.0 --port 22222 & +pids+=($!) +flask --app mock run --host 0.0.0.0 --port 33333 diff --git a/src/device/tests/qkd/mock_qkd_nodes/yang/etsi-qkd-node-types.yang b/src/device/tests/qkd/mock_qkd_nodes/yang/etsi-qkd-node-types.yang new file mode 100644 index 000000000..04bbd8a87 --- /dev/null +++ b/src/device/tests/qkd/mock_qkd_nodes/yang/etsi-qkd-node-types.yang @@ -0,0 +1,326 @@ +/* Copyright 2022 ETSI +Licensed under the BSD-3 Clause (https://forge.etsi.org/legal-matters) */ + +module etsi-qkd-node-types { + + yang-version "1"; + + namespace "urn:etsi:qkd:yang:etsi-qkd-node-types"; + + prefix "etsi-qkdn-types"; + + organization "ETSI ISG QKD"; + + contact + "https://www.etsi.org/committee/qkd + vicente@fi.upm.es"; + + description + "This module contains the base types created for + the software-defined QKD node information models + specified in ETSI GS QKD 015 V2.1.1 + - QKD-TECHNOLOGY-TYPES + - QKDN-STATUS-TYPES + - QKD-LINK-TYPES + - QKD-ROLE-TYPES + - QKD-APP-TYPES + - Wavelength + "; + + revision "2022-01-30" { + description + "Refinement of the YANG model to make it compatible with the ETSI ISG QKD 018. Minor fixes."; + } + + revision "2020-09-30" { + description + "First definition based on initial requirement analysis."; + } + + identity QKD-TECHNOLOGY-TYPES { + description "Quantum Key Distribution System base technology types."; + } + + identity CV-QKD { + base QKD-TECHNOLOGY-TYPES; + description "Continuous Variable base technology."; + } + + identity DV-QKD { + base QKD-TECHNOLOGY-TYPES; + description "Discrete Variable base technology."; + } + + identity DV-QKD-COW { + base QKD-TECHNOLOGY-TYPES; + description "COW base technology."; + } + + identity DV-QKD-2Ws { + base QKD-TECHNOLOGY-TYPES; + description "2-Ways base technology."; + } + + typedef qkd-technology-types { + type identityref { + base QKD-TECHNOLOGY-TYPES; + } + description "This type represents the base technology types of the SD-QKD system."; + } + + identity QKDN-STATUS-TYPES { + description "Base identity used to identify the SD-QKD node status."; + } + + identity NEW { + base QKDN-STATUS-TYPES; + description "The QKD node is installed."; + } + + identity OPERATING { + base QKDN-STATUS-TYPES; + description "The QKD node is up."; + } + + identity DOWN { + base QKDN-STATUS-TYPES; + description "The QKD node is not working as expected."; + } + + identity FAILURE { + base QKDN-STATUS-TYPES; + description "The QKD node cannot be accessed by SDN controller with communication failure."; + } + + identity OUT { + base QKDN-STATUS-TYPES; + description "The QKD node is switched off and uninstalled."; + } + + typedef qkdn-status-types { + type identityref { + base QKDN-STATUS-TYPES; + } + description "This type represents the status of the SD-QKD node."; + } + + identity QKD-LINK-TYPES { + description "QKD key association link types."; + } + + identity VIRT { + base QKD-LINK-TYPES; + description "Virtual Link."; + } + + identity PHYS { + base QKD-LINK-TYPES; + description "Physical Link."; + } + + typedef qkd-link-types { + type identityref { + base QKD-LINK-TYPES; + } + description "This type represents the key association link type between two SD-QKD nodes."; + } + + identity QKD-ROLE-TYPES { + description "QKD Role Type."; + } + + identity TRANSMITTER { + base QKD-ROLE-TYPES; + description "QKD module working as transmitter."; + } + + identity RECEIVER { + base QKD-ROLE-TYPES; + description "QKD module working as receiver."; + } + + identity TRANSCEIVER { + base QKD-ROLE-TYPES; + description "QKD System that can work as a transmitter or receiver."; + } + + typedef qkd-role-types { + type identityref { + base QKD-ROLE-TYPES; + } + description "This type represents the working mode of a SD-QKD module."; + } + + identity QKD-APP-TYPES { + description "Application types."; + } + + identity CLIENT { + base QKD-APP-TYPES; + description "Application working as client."; + } + + identity INTERNAL { + base QKD-APP-TYPES; + description "Internal QKD node application."; + } + + typedef qkd-app-types { + type identityref { + base QKD-APP-TYPES; + } + description "This type represents the application class consuming key from SD-QKD nodes."; + } + + identity PHYS-PERF-TYPES { + description "Physical performance types."; + } + + identity QBER { + base PHYS-PERF-TYPES; + description "Quantum Bit Error Rate."; + } + + identity SNR { + base PHYS-PERF-TYPES; + description "Signal to Noise Ratio."; + } + + typedef phys-perf-types { + type identityref { + base PHYS-PERF-TYPES; + } + description "This type represents physical performance types."; + } + + identity LINK-STATUS-TYPES { + description "Status of the key association QKD link (physical and virtual)."; + } + + identity ACTIVE { + base LINK-STATUS-TYPES; + description "Link actively generating keys."; + } + + identity PASSIVE { + base LINK-STATUS-TYPES; + description "No key generation on key association QKD link but a pool of keys + are still available."; + } + + identity PENDING { + base LINK-STATUS-TYPES; + description "Waiting for activation and no keys are available."; + } + + identity OFF { + base LINK-STATUS-TYPES; + description "No key generation and no keys are available."; + } + + typedef link-status-types { + type identityref { + base LINK-STATUS-TYPES; + } + description "This type represents the status of a key association QKD link, both physical and virtual."; + } + + /// + + identity IFACE-STATUS-TYPES { + description "Interface Status."; + } + + identity ENABLED { + base IFACE-STATUS-TYPES; + description "The interfaces is up."; + } + + identity DISABLED { + base IFACE-STATUS-TYPES; + description "The interfaces is down."; + } + + identity FAILED { + base IFACE-STATUS-TYPES; + description "The interfaces has failed."; + } + + typedef iface-status-types { + type identityref { + base IFACE-STATUS-TYPES; + } + description "This type represents the status of a interface between a SD-QKD node and a SD-QKD module."; + } + + identity APP-STATUS-TYPES { + description "Application types."; + } + + identity ON { + base APP-STATUS-TYPES; + description "The application is on."; + } + + identity DISCONNECTED { + base APP-STATUS-TYPES; + description "The application is disconnected."; + } + + identity OUT-OF-TIME { + base APP-STATUS-TYPES; + description "The application is out of time."; + } + + identity ZOMBIE { + base APP-STATUS-TYPES; + description "The application is in a zombie state."; + } + + typedef app-status-types { + type identityref { + base APP-STATUS-TYPES; + } + description "This type represents the status of an application consuming key from SD-QKD nodes."; + } + + identity SEVERITY-TYPES { + description "Error/Failure severity levels."; + } + + identity MAJOR { + base SEVERITY-TYPES; + description "Major error/failure."; + } + + identity MINOR { + base SEVERITY-TYPES; + description "Minor error/failure."; + } + + typedef severity-types { + type identityref { + base SEVERITY-TYPES; + } + description "This type represents the Error/Failure severity levels."; + } + + typedef wavelength { + type string { + pattern "([1-9][0-9]{0,3})"; + } + description + "A WDM channel number (starting at 1). For example: 20"; + } + + //Pattern from "A Yang Data Model for WSON Optical Networks". + typedef wavelength-range-type { + type string { + pattern "([1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?" + + "(,[1-9][0-9]{0,3}(-[1-9][0-9]{0,3})?)*)"; + } + description + "A list of WDM channel numbers (starting at 1) + in ascending order. For example: 1,12-20,40,50-80"; + } +} diff --git a/src/device/tests/qkd/mock_qkd_nodes/yang/etsi-qkd-sdn-node.yang b/src/device/tests/qkd/mock_qkd_nodes/yang/etsi-qkd-sdn-node.yang new file mode 100644 index 000000000..d07004cdc --- /dev/null +++ b/src/device/tests/qkd/mock_qkd_nodes/yang/etsi-qkd-sdn-node.yang @@ -0,0 +1,941 @@ +/* Copyright 2022 ETSI +Licensed under the BSD-3 Clause (https://forge.etsi.org/legal-matters) */ + +module etsi-qkd-sdn-node { + + yang-version "1"; + + namespace "urn:etsi:qkd:yang:etsi-qkd-node"; + + prefix "etsi-qkdn"; + + import ietf-yang-types { prefix "yang"; } + import ietf-inet-types { prefix "inet"; } + import etsi-qkd-node-types { prefix "etsi-qkdn-types"; } + + // meta + organization "ETSI ISG QKD"; + + contact + "https://www.etsi.org/committee/qkd + vicente@fi.upm.es"; + + description + "This module contains the groupings and containers composing + the software-defined QKD node information models + specified in ETSI GS QKD 015 V2.1.1"; + + revision "2022-01-30" { + description + "Refinement of the YANG model to make it compatible with the ETSI ISG QKD 018. Minor fixes."; + reference + "ETSI GS QKD 015 V2.1.1 (2022-01)"; + } + + revision "2020-09-30" { + description + "First definition based on initial requirement analysis."; + reference + "ETSI GS QKD 015 V1.1.1 (2021-03)"; + } + + grouping qkdn_id { + description "Grouping of qkdn_id leaf."; + + leaf qkdn_id { + type yang:uuid; + mandatory true; + description + "This value reflects the unique ID of the SD-QKD node."; + } + } + + grouping qkdn_version { + description "Grouping of qkdn_version leaf."; + + leaf qkdn_version { + type string; + description "Hardware or software version of the SD-QKD node."; + } + } + + grouping qkdn_location_id { + description "Grouping of qkdn_location_id leaf."; + + leaf qkdn_location_id { + type string; + default ""; + description + "This value enables the location of the secure + area that contains the SD-QKD node to be specified."; + } + } + + grouping qkdn_status { + description "Grouping of qkdn_status leaf."; + + leaf qkdn_status { + type etsi-qkdn-types:qkdn-status-types; + config false; + description "Status of the SD-QKD node."; + } + } + + grouping qkdn_capabilities { + description "Grouping of the capabilities of the SD-QKD node."; + + container qkdn_capabilities { + description "Capabilities of the SD-QKD node."; + + leaf link_stats_support { + type boolean; + default true; + description + "If true, this node exposes link-related statistics (secure key + generation rate-SKR, link consumption, status, QBER)."; + } + + leaf application_stats_support { + type boolean; + default true; + description "If true, this node exposes application related + statistics (application consumption, alerts)."; + } + + leaf key_relay_mode_enable { + type boolean; + default true; + description "If true, this node supports key relay (multi-hop) mode services."; + } + } + } + + grouping app_id { + description "Grouping of app_id leaf."; + + leaf app_id { + type yang:uuid; + description + "Unique ID that identifies a QKD application consisting of a set of entities + that are allowed to receive keys shared with each other from the SD-QKD nodes + they connect to. This value is similar to a key ID or key handle."; + } + } + + grouping app_basic { + description "Grouping of app's basic parameters."; + + uses app_id; + + leaf app_status { + type etsi-qkdn-types:app-status-types; + config false; + description "Status of the application."; + } + } + + grouping app_priority { + description "Grouping of app_priority leaf."; + + leaf app_priority { + type uint32; + default 0; + description "Priority of the association/application + might be defined by the user but usually + handled by a network administrator."; + } + } + + grouping app_details { + description "Grouping of app's details parameters."; + + leaf app_type { + type etsi-qkdn-types:qkd-app-types; + description "Type of the registered application. These + values, defined within the types module, can be client + (if an external applications requesting keys) + or internal (application is defined to maintain + the QKD - e.g. multi-hop, authentication or + other encryption operations)."; + } + + leaf server_app_id { + type inet:uri; + description "ID that identifies the entity that initiated the + creation of the QKD application to receive keys shared with one + or more specified target entity identified by client_app_id. + It is a client in the interface to the SD-QKD node and the name + server_app_id reflects that it requested the QKD application to + be initiated."; + } + + leaf-list client_app_id { + type inet:uri; + description "List of IDs that identifies the one or more + entities that are allowed to receive keys from SD-QKD + node(s) under the QKD application in addition to the + initiating entity identified by server_app_id."; + } + + uses app_priority; + } + + grouping local_qkdn_id { + description "Grouping of local_qkdn_id leaf."; + + leaf local_qkdn_id { + type yang:uuid; + description "Unique ID of the local SD-QKD node which + is providing QKD keys to the local application."; + } + } + + grouping app_time { + description "Grouping of app's time parameters."; + + leaf creation_time { + type yang:date-and-time; + config false; + description "Date and time of the service creation."; + } + + leaf expiration_time { + type yang:date-and-time; + description "Date and time of the service expiration."; + } + } + + grouping app_statistics { + description "Grouping of app's statistic parameters."; + + container app_statistics { + description "Statistical information relating to a specific statistic period of time."; + + list statistics { + key "end_time"; + config false; + description "List of statistics."; + + leaf end_time { + type yang:date-and-time; + config false; + description "End time for the statistic period."; + } + + leaf start_time { + type yang:date-and-time; + config false; + description "Start time for the statistic period."; + } + + leaf consumed_bits { + type uint32; + config false; + description "Consumed secret key amount (in bits) for a statistics collection period of time."; + } + } + } + } + + grouping app_qos { + description "Grouping of app's basic qos parameters."; + + container app_qos { + description "Requested Quality of Service."; + + leaf max_bandwidth { + type uint32; + description "Maximum bandwidth (in bits per second) allowed for + this specific application. Exceeding this value will raise an + error from the local key store to the appl. This value might + be internally configured (or by an admin) with a default value."; + } + + leaf min_bandwidth { + type uint32; + description "This value is an optional QoS parameter which + enables to require a minimum key rate (in bits per second) + for the application."; + } + + leaf jitter { + type uint32; + description "This value allows to specify the maximum jitter + (in msec) to be provided by the key delivery API for + applications requiring fast rekeying. This value can be + coordinated with the other QoS to provide a wide enough + QoS definition."; + } + + leaf ttl { + type uint32; + description "This value is used to specify the maximum time + (in seconds) that a key could be kept in the key store for + a given application without being used."; + } + } + } + + grouping augmented_app_qos { + description "Grouping of app's detailed qos parameters."; + + uses app_qos { + augment app_qos { + description "Augmentation of app's basic parameters with app's detailed qos parameters."; + + leaf clients_shared_path_enable { + type boolean; + default false; + description "If true, multiple clients for this + application might share keys to reduce service + impact (consumption)."; + } + + leaf clients_shared_keys_required { + type boolean; + default false; + description "If true, multiple clients for this application + might share keys to reduce service impact (consumption)."; + } + } + } + } + + grouping qkd_applications { + description "Grouping of the list of applications container."; + + container qkd_applications { + description "List of applications container."; + + list qkd_app { + key "app_id"; + description "List of applications that are currently registered + in the SD-QKD node. Any entity consuming QKD-derived keys (either + for internal or external purposes) is considered an application."; + + uses app_basic; + + uses app_details; + + uses app_time; + + uses app_statistics; + + uses augmented_app_qos; + + leaf-list backing_qkdl_id { + type yang:uuid; + description "Unique ID of the key association link which is + providing QKD keys to these applications."; + } + + uses local_qkdn_id; + + leaf remote_qkdn_id { + type yang:uuid; + description "Unique ID of the remote SD-QKD node which + is providing QKD keys to the remote application. + While unknown, the local SD-QKD will not be able to + provide keys to the local application."; + } + } + } + } + + grouping qkdi_status { + description "Grouping of qkdi_status leaf."; + + leaf qkdi_status { + type etsi-qkdn-types:iface-status-types; + config false; + description "Status of a QKD interface of the SD-QKD node."; + } + } + + grouping qkdi_model { + description "Grouping of qkdi_model leaf."; + + leaf qkdi_model { + type string; + description "Device model (vendor/device)."; + } + } + + grouping qkdi_type { + description "Grouping of qkdi_type leaf."; + + leaf qkdi_type { + type etsi-qkdn-types:qkd-technology-types; + description "Interface type (QKD technology)."; + } + } + + grouping qkdi_att_point { + description "Grouping of the interface attachment points to an optical switch."; + + container qkdi_att_point { + description "Interface attachment point to an optical switch."; + + leaf device { + type string; + description "Unique ID of the optical switch (or + passive component) to which the interface is connected."; + } + + leaf port { + type uint32; + description "Port ID of the device to which the interface + is connected."; + } + } + } + + grouping qkdi_id { + description "Grouping of qkdi_id leaf."; + + leaf qkdi_id { + type uint32; + description "Interface id. It is described as a locally unique number, + which is globally unique when combined with the SD-QKD node ID."; + } + } + + grouping qkd_interface_item { + description "Grouping of the interface parameters."; + + uses qkdi_id; + + uses qkdi_model; + + uses qkdi_type; + + uses qkdi_att_point; + + container qkdi_capabilities { + description "Capabilities of the QKD system (interface)."; + + leaf role_support { + type etsi-qkdn-types:qkd-role-types; + description "QKD node support for key relay mode services."; + } + + leaf wavelength_range { + type etsi-qkdn-types:wavelength-range-type; + description "Range of supported wavelengths (nm) (multiple + if it contains a tunable laser)."; + } + + leaf max_absorption { + type decimal64 { + fraction-digits 3; + } + description "Maximum absorption supported (in dB)."; + } + } + } + + grouping qkd_interfaces { + description "Grouping of the list of interfaces."; + + container qkd_interfaces { + description "List of interfaces container."; + + list qkd_interface { + key "qkdi_id"; + description "List of physical QKD modules in a secure location, + abstracted as interfaces of the SD-QKD node."; + + uses qkd_interface_item; + + uses qkdi_status; + + } + } + } + + grouping qkdl_id { + description "Grouping of qkdl_id leaf."; + + leaf qkdl_id { + type yang:uuid; + description "Unique ID of the QKD link (key association)."; + } + } + + grouping qkdl_status { + description "Grouping of qkdl_status leaf."; + + leaf qkdl_status { + type etsi-qkdn-types:link-status-types; + description "Status of the QKD key association link."; + } + } + + grouping common_performance { + description "Grouping of common performance parameters."; + + leaf expected_consumption { + type uint32; + config false; + description "Sum of all the application's bandwidth (in bits per + second) on this particular key association link."; + } + + leaf skr { + type uint32; + config false; + description "Secret key rate generation (in bits per second) + of the key association link."; + } + + leaf eskr { + type uint32; + config false; + description "Effective secret key rate (in bits per second) generation + of the key association link available after internal consumption."; + } + } + + grouping physical_link_perf { + description "Grouping of the list of physical performance parameters."; + + list phys_perf { + key "perf_type"; + config false; + description "List of physical performance parameters."; + + leaf perf_type { + type etsi-qkdn-types:phys-perf-types; + config false; + description "Type of the physical performance value to be + exposed to the controller."; + } + + leaf value { + type decimal64 { + fraction-digits 3; + } + config false; + description "Numerical value for the performance parameter + type specified above."; + } + } + } + + grouping virtual_link_spec { + description "Grouping of the virtual link's parameters."; + + leaf virt_prev_hop { + type yang:uuid; + description "Previous hop in a multi-hop/virtual key + association link config."; + } + + leaf-list virt_next_hop { + type yang:uuid; + description "Next hop(s) in a multihop/virtual key + association link config. Defined as a list for multicast + over shared sub-paths."; + } + + leaf virt_bandwidth { + type uint32; + description "Required bandwidth (in bits per second) for that key association link. + Used to reserve bandwidth from the physical QKD links to support the virtual key + association link as an internal application."; + } + } + + grouping physical_link_spec { + description "Grouping of the physical link's parameters."; + + leaf phys_channel_att { + type decimal64 { + fraction-digits 3; + } + description "Expected attenuation on the quantum channel (in dB) + between the Source/qkd_node and Destination/qkd_node."; + + } + + leaf phys_wavelength { + type etsi-qkdn-types:wavelength; + description "Wavelength (in nm) to be used for the quantum channel. + If the interface is not tunable, this configuration could be bypassed"; + } + + leaf phys_qkd_role { + type etsi-qkdn-types:qkd-role-types; + description "Transmitter/receiver mode for the QKD module. + If there is no multi-role support, this could be ignored."; + } + } + + grouping qkd_links { + description "Grouping of the list of links."; + + container qkd_links { + description "List of links container"; + + list qkd_link { + key "qkdl_id"; + description "List of (key association) links to other SD-QKD nodes in the network. + The links can be physical (direct quantum channel) or virtual multi-hop + connection doing key-relay through several nodes."; + + uses qkdl_id; + + uses qkdl_status; + + leaf qkdl_enable { + type boolean; + default true; + description "This value allows to enable of disable the key generation + process for a given link."; + + } + + container qkdl_local { + description "Source (local) node of the SD-QKD link."; + + leaf qkdn_id { + type yang:uuid; + description "Unique ID of the local SD-QKD node."; + } + + leaf qkdi_id { + type uint32; + description "Interface used to create the key association link."; + } + } + + container qkdl_remote { + description "Destination (remote) unique SD-QKD node."; + + leaf qkdn_id { + type yang:uuid; + description "Unique ID of the remote SD-QKD node. This value is + provided by the SDN controller when the key association link + request arrives."; + } + + leaf qkdi_id { + type uint32; + description "Interface used to create the link."; + } + } + + leaf qkdl_type { + type etsi-qkdn-types:qkd-link-types; + description "Key Association Link type: Virtual (multi-hop) or Direct."; + } + + leaf-list qkdl_applications { + type yang:uuid; + description "Applications which are consuming keys from + this key association link."; + } + + uses virtual_link_spec { + when "qkdl_type = 'etsi-qkd-node-types:VIRT'" { + description "Virtual key association link specific configuration."; + } + } + + uses physical_link_spec { + when "qkdl_type = 'etsi-qkd-node-types:PHYS'" { + description "Physical key association link specific configuration."; + } + } + + container qkdl_performance { + description "Container of link's performace parameters."; + + uses common_performance; + + uses physical_link_perf { + when "../qkdl_type = 'PHYS'" { + description "Performance of the specific physical link."; + } + } + } + } + } + } + + container qkd_node { + description + "Top module describing a software-defined QKD node (SD-QKD node)."; + + uses qkdn_id; + + uses qkdn_status; + + uses qkdn_version; + + uses qkdn_location_id; + + uses qkdn_capabilities; + + uses qkd_applications; + + uses qkd_interfaces; + + uses qkd_links; + } + + grouping message { + description "Grouping of message leaf."; + + leaf message { + type string; + description "Placeholder for the message."; + } + } + + grouping severity { + description "Grouping of severity leaf."; + + leaf severity { + type etsi-qkdn-types:severity-types; + description "Placeholder for the severity."; + } + } + + grouping reason { + description "Grouping of reason leaf."; + + leaf reason { + type string; + description "Auxiliary parameter to include additional + information about the reason for link failure."; + } + } + + notification sdqkdn_application_new { + description "Defined for the controller to detect new applications + requesting keys from a QKD node. This maps with the workflow shown + in clause 5.2 'QKD Application Registration'. Parameters such as + client and server app IDs, local QKD node identifier, priority and + QoS are sent in the notification."; + + container qkd_application { + description "'sdqkdn_application_new' notification's qkd_application parameters."; + + uses app_details; + + uses local_qkdn_id; + + uses augmented_app_qos; + + } + } + + notification sdqkdn_application_qos_update { + description "Notification that includes information about priority or + QoS changes on an existing and already registered application."; + + container qkd_application { + description "'sdqkdn_application_qos_update' notification's qkd_application parameters."; + + uses app_id; + + uses augmented_app_qos; + + uses app_priority; + + } + } + + notification sdqkdn_application_disconnected { + description "Includes the application identifier to inform that the + application is no longer registered and active in the QKD node."; + + container qkd_application { + description "'sdqkdn_application_disconnected' notification's qkd_application parameters."; + + uses app_id; + + } + } + + notification sdqkdn_interface_new { + description "Includes all the information about the new QKD system + installed in the secure location of a given QKD node."; + + container qkd_interface { + description "'sdqkdn_interface_new' notification's qkd_interface parameters."; + + uses qkd_interface_item; + + } + } + + notification sdqkdn_interface_down { + description "Identifies an interface within a QKD node which is not + working as expected, allowing additional information to be included + in a 'reason' string field."; + + container qkd_interface { + description "'sdqkdn_interface_down' notification's qkd_interface parameters."; + + uses qkdi_id; + + uses reason; + + } + } + + notification sdqkdn_interface_out { + description "Contains the ID of an interface which is switch off and + uninstall from a QKD node. This information can be gathered from this + notification or from regular polling from the controller's side."; + + container qkd_interface { + description "'sdqkdn_interface_out' notification's qkd_interface parameters."; + + uses qkdi_id; + + } + } + + notification sdqkdn_link_down { + description "As in the interface down event, this notification contains + the identifier of a given link which has gone down unexpectedly. + In addition, further information can be sent in the 'reason' field."; + + container qkd_link { + description "'sdqkdn_link_down' notification's qkd_link parameters."; + + uses qkdl_id; + + uses reason; + + } + } + + notification sdqkdn_link_perf_update { + description "This notification allows to inform of any mayor + modification in the performance of an active link. The identifier + of the link is sent together with the performance parameters of the link."; + + container qkd_link { + description "'sdqkdn_link_perf_update' notification's qkd_link parameters."; + + uses qkdl_id; + + container performance { + description "'sdqkdn_link_perf_update' notification's performance parameters."; + + uses common_performance; + + uses physical_link_perf; + + } + } + } + + notification sdqkdn_link_overloaded { + description "This notification is sent when the link cannot cope with the + demand. The link identifier is sent with the expected consumption and + general performance parameters."; + + container qkd_link { + description "'sdqkdn_link_overloaded' notification's qkd_link parameters."; + + uses qkdl_id; + + container performance { + description "'sdqkdn_link_overloaded' notification's performance parameters."; + + uses common_performance; + + } + } + } + + notification alarm { + description "'alarm' notification."; + + container link { + description "'alarm' notification's link parameters."; + + uses qkdl_id; + + uses qkdl_status; + + uses message; + + uses severity; + + } + + container interface { + description "'alarm' notification's interface parameters."; + + uses qkdi_id; + + uses qkdi_status; + + uses message; + + uses severity; + + } + + container application { + description "'alarm' notification's application parameters."; + + uses app_basic; + + uses message; + + uses severity; + + } + + } + + notification event { + description "'event' notification."; + + container link { + description "'alarm' notification's link parameters."; + + uses qkdl_id; + + uses qkdl_status; + + uses message; + + uses severity; + + } + + container interface { + description "'alarm' notification's interface parameters."; + + uses qkdi_id; + + uses qkdi_status; + + uses message; + + uses severity; + + } + + container application { + description "'alarm' notification's application parameters."; + + uses app_basic; + + uses message; + + uses severity; + + } + + } + +} diff --git a/src/device/tests/qkd/mock_qkd_nodes/yang/ietf-inet-types.yang b/src/device/tests/qkd/mock_qkd_nodes/yang/ietf-inet-types.yang new file mode 100644 index 000000000..eacefb636 --- /dev/null +++ b/src/device/tests/qkd/mock_qkd_nodes/yang/ietf-inet-types.yang @@ -0,0 +1,458 @@ +module ietf-inet-types { + + namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types"; + prefix "inet"; + + organization + "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; + + contact + "WG Web: + WG List: + + WG Chair: David Kessens + + + WG Chair: Juergen Schoenwaelder + + + Editor: Juergen Schoenwaelder + "; + + description + "This module contains a collection of generally useful derived + YANG data types for Internet addresses and related things. + + Copyright (c) 2013 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6991; see + the RFC itself for full legal notices."; + + revision 2013-07-15 { + description + "This revision adds the following new data types: + - ip-address-no-zone + - ipv4-address-no-zone + - ipv6-address-no-zone"; + reference + "RFC 6991: Common YANG Data Types"; + } + + revision 2010-09-24 { + description + "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + } + + /*** collection of types related to protocol fields ***/ + + typedef ip-version { + type enumeration { + enum unknown { + value "0"; + description + "An unknown or unspecified version of the Internet + protocol."; + } + enum ipv4 { + value "1"; + description + "The IPv4 protocol as defined in RFC 791."; + } + enum ipv6 { + value "2"; + description + "The IPv6 protocol as defined in RFC 2460."; + } + } + description + "This value represents the version of the IP protocol. + + In the value set and its semantics, this type is equivalent + to the InetVersion textual convention of the SMIv2."; + reference + "RFC 791: Internet Protocol + RFC 2460: Internet Protocol, Version 6 (IPv6) Specification + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + typedef dscp { + type uint8 { + range "0..63"; + } + description + "The dscp type represents a Differentiated Services Code Point + that may be used for marking packets in a traffic stream. + In the value set and its semantics, this type is equivalent + to the Dscp textual convention of the SMIv2."; + reference + "RFC 3289: Management Information Base for the Differentiated + Services Architecture + RFC 2474: Definition of the Differentiated Services Field + (DS Field) in the IPv4 and IPv6 Headers + RFC 2780: IANA Allocation Guidelines For Values In + the Internet Protocol and Related Headers"; + } + + typedef ipv6-flow-label { + type uint32 { + range "0..1048575"; + } + description + "The ipv6-flow-label type represents the flow identifier or Flow + Label in an IPv6 packet header that may be used to + discriminate traffic flows. + + In the value set and its semantics, this type is equivalent + to the IPv6FlowLabel textual convention of the SMIv2."; + reference + "RFC 3595: Textual Conventions for IPv6 Flow Label + RFC 2460: Internet Protocol, Version 6 (IPv6) Specification"; + } + + typedef port-number { + type uint16 { + range "0..65535"; + } + description + "The port-number type represents a 16-bit port number of an + Internet transport-layer protocol such as UDP, TCP, DCCP, or + SCTP. Port numbers are assigned by IANA. A current list of + all assignments is available from . + + Note that the port number value zero is reserved by IANA. In + situations where the value zero does not make sense, it can + be excluded by subtyping the port-number type. + In the value set and its semantics, this type is equivalent + to the InetPortNumber textual convention of the SMIv2."; + reference + "RFC 768: User Datagram Protocol + RFC 793: Transmission Control Protocol + RFC 4960: Stream Control Transmission Protocol + RFC 4340: Datagram Congestion Control Protocol (DCCP) + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + /*** collection of types related to autonomous systems ***/ + + typedef as-number { + type uint32; + description + "The as-number type represents autonomous system numbers + which identify an Autonomous System (AS). An AS is a set + of routers under a single technical administration, using + an interior gateway protocol and common metrics to route + packets within the AS, and using an exterior gateway + protocol to route packets to other ASes. IANA maintains + the AS number space and has delegated large parts to the + regional registries. + + Autonomous system numbers were originally limited to 16 + bits. BGP extensions have enlarged the autonomous system + number space to 32 bits. This type therefore uses an uint32 + base type without a range restriction in order to support + a larger autonomous system number space. + + In the value set and its semantics, this type is equivalent + to the InetAutonomousSystemNumber textual convention of + the SMIv2."; + reference + "RFC 1930: Guidelines for creation, selection, and registration + of an Autonomous System (AS) + RFC 4271: A Border Gateway Protocol 4 (BGP-4) + RFC 4001: Textual Conventions for Internet Network Addresses + RFC 6793: BGP Support for Four-Octet Autonomous System (AS) + Number Space"; + } + + /*** collection of types related to IP addresses and hostnames ***/ + + typedef ip-address { + type union { + type inet:ipv4-address; + type inet:ipv6-address; + } + description + "The ip-address type represents an IP address and is IP + version neutral. The format of the textual representation + implies the IP version. This type supports scoped addresses + by allowing zone identifiers in the address format."; + reference + "RFC 4007: IPv6 Scoped Address Architecture"; + } + + typedef ipv4-address { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '(%[\p{N}\p{L}]+)?'; + } + description + "The ipv4-address type represents an IPv4 address in + dotted-quad notation. The IPv4 address may include a zone + index, separated by a % sign. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format for the zone index is the numerical + format"; + } + + typedef ipv6-address { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(%[\p{N}\p{L}]+)?'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(%.+)?'; + } + description + "The ipv6-address type represents an IPv6 address in full, + mixed, shortened, and shortened-mixed notation. The IPv6 + address may include a zone index, separated by a % sign. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format of IPv6 addresses uses the textual + representation defined in Section 4 of RFC 5952. The + canonical format for the zone index is the numerical + format as described in Section 11.2 of RFC 4007."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + typedef ip-address-no-zone { + type union { + type inet:ipv4-address-no-zone; + type inet:ipv6-address-no-zone; + } + description + "The ip-address-no-zone type represents an IP address and is + IP version neutral. The format of the textual representation + implies the IP version. This type does not support scoped + addresses since it does not allow zone identifiers in the + address format."; + reference + "RFC 4007: IPv6 Scoped Address Architecture"; + } + + typedef ipv4-address-no-zone { + type inet:ipv4-address { + pattern '[0-9\.]*'; + } + description + "An IPv4 address without a zone index. This type, derived from + ipv4-address, may be used in situations where the zone is + known from the context and hence no zone index is needed."; + } + + typedef ipv6-address-no-zone { + type inet:ipv6-address { + pattern '[0-9a-fA-F:\.]*'; + } + description + "An IPv6 address without a zone index. This type, derived from + ipv6-address, may be used in situations where the zone is + known from the context and hence no zone index is needed."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + typedef ip-prefix { + type union { + type inet:ipv4-prefix; + type inet:ipv6-prefix; + } + description + "The ip-prefix type represents an IP prefix and is IP + version neutral. The format of the textual representations + implies the IP version."; + } + + typedef ipv4-prefix { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '/(([0-9])|([1-2][0-9])|(3[0-2]))'; + } + description + "The ipv4-prefix type represents an IPv4 address prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 32. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The canonical format of an IPv4 prefix has all bits of + the IPv4 address set to zero that are not part of the + IPv4 prefix."; + } + + typedef ipv6-prefix { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(/.+)'; + } + + description + "The ipv6-prefix type represents an IPv6 address prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 128. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The IPv6 address should have all bits that do not belong + to the prefix set to zero. + + The canonical format of an IPv6 prefix has all bits of + the IPv6 address set to zero that are not part of the + IPv6 prefix. Furthermore, the IPv6 address is represented + as defined in Section 4 of RFC 5952."; + reference + "RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + /*** collection of domain name and URI types ***/ + + typedef domain-name { + type string { + pattern + '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' + + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' + + '|\.'; + length "1..253"; + } + description + "The domain-name type represents a DNS domain name. The + name SHOULD be fully qualified whenever possible. + + Internet domain names are only loosely specified. Section + 3.5 of RFC 1034 recommends a syntax (modified in Section + 2.1 of RFC 1123). The pattern above is intended to allow + for current practice in domain name use, and some possible + future expansion. It is designed to hold various types of + domain names, including names used for A or AAAA records + (host names) and other records, such as SRV records. Note + that Internet host names have a stricter syntax (described + in RFC 952) than the DNS recommendations in RFCs 1034 and + 1123, and that systems that want to store host names in + schema nodes using the domain-name type are recommended to + adhere to this stricter standard to ensure interoperability. + + The encoding of DNS names in the DNS protocol is limited + to 255 characters. Since the encoding consists of labels + prefixed by a length bytes and there is a trailing NULL + byte, only 253 characters can appear in the textual dotted + notation. + + The description clause of schema nodes using the domain-name + type MUST describe when and how these names are resolved to + IP addresses. Note that the resolution of a domain-name value + may require to query multiple DNS records (e.g., A for IPv4 + and AAAA for IPv6). The order of the resolution process and + which DNS record takes precedence can either be defined + explicitly or may depend on the configuration of the + resolver. + + Domain-name values use the US-ASCII encoding. Their canonical + format uses lowercase US-ASCII characters. Internationalized + domain names MUST be A-labels as per RFC 5890."; + reference + "RFC 952: DoD Internet Host Table Specification + RFC 1034: Domain Names - Concepts and Facilities + RFC 1123: Requirements for Internet Hosts -- Application + and Support + RFC 2782: A DNS RR for specifying the location of services + (DNS SRV) + RFC 5890: Internationalized Domain Names in Applications + (IDNA): Definitions and Document Framework"; + } + + typedef host { + type union { + type inet:ip-address; + type inet:domain-name; + } + description + "The host type represents either an IP address or a DNS + domain name."; + } + + typedef uri { + type string; + description + "The uri type represents a Uniform Resource Identifier + (URI) as defined by STD 66. + + Objects using the uri type MUST be in US-ASCII encoding, + and MUST be normalized as described by RFC 3986 Sections + 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary + percent-encoding is removed, and all case-insensitive + characters are set to lowercase except for hexadecimal + digits, which are normalized to uppercase as described in + Section 6.2.2.1. + + The purpose of this normalization is to help provide + unique URIs. Note that this normalization is not + sufficient to provide uniqueness. Two URIs that are + textually distinct after this normalization may still be + equivalent. + + Objects using the uri type may restrict the schemes that + they permit. For example, 'data:' and 'urn:' schemes + might not be appropriate. + + A zero-length URI is not a valid URI. This can be used to + express 'URI absent' where required. + + In the value set and its semantics, this type is equivalent + to the Uri SMIv2 textual convention defined in RFC 5017."; + reference + "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax + RFC 3305: Report from the Joint W3C/IETF URI Planning Interest + Group: Uniform Resource Identifiers (URIs), URLs, + and Uniform Resource Names (URNs): Clarifications + and Recommendations + RFC 5017: MIB Textual Conventions for Uniform Resource + Identifiers (URIs)"; + } + +} diff --git a/src/device/tests/qkd/mock_qkd_nodes/yang/ietf-yang-types.yang b/src/device/tests/qkd/mock_qkd_nodes/yang/ietf-yang-types.yang new file mode 100644 index 000000000..ee58fa3ab --- /dev/null +++ b/src/device/tests/qkd/mock_qkd_nodes/yang/ietf-yang-types.yang @@ -0,0 +1,474 @@ +module ietf-yang-types { + + namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types"; + prefix "yang"; + + organization + "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; + + contact + "WG Web: + WG List: + + WG Chair: David Kessens + + + WG Chair: Juergen Schoenwaelder + + + Editor: Juergen Schoenwaelder + "; + + description + "This module contains a collection of generally useful derived + YANG data types. + + Copyright (c) 2013 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6991; see + the RFC itself for full legal notices."; + + revision 2013-07-15 { + description + "This revision adds the following new data types: + - yang-identifier + - hex-string + - uuid + - dotted-quad"; + reference + "RFC 6991: Common YANG Data Types"; + } + + revision 2010-09-24 { + description + "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + } + + /*** collection of counter and gauge types ***/ + + typedef counter32 { + type uint32; + description + "The counter32 type represents a non-negative integer + that monotonically increases until it reaches a + maximum value of 2^32-1 (4294967295 decimal), when it + wraps around and starts increasing again from zero. + + Counters have no defined 'initial' value, and thus, a + single value of a counter has (in general) no information + content. Discontinuities in the monotonically increasing + value normally occur at re-initialization of the + management system, and at other times as specified in the + description of a schema node using this type. If such + other times can occur, for example, the creation of + a schema node of type counter32 at times other than + re-initialization, then a corresponding schema node + should be defined, with an appropriate type, to indicate + the last discontinuity. + + The counter32 type should not be used for configuration + schema nodes. A default statement SHOULD NOT be used in + combination with the type counter32. + + In the value set and its semantics, this type is equivalent + to the Counter32 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef zero-based-counter32 { + type yang:counter32; + default "0"; + description + "The zero-based-counter32 type represents a counter32 + that has the defined 'initial' value zero. + + A schema node of this type will be set to zero (0) on creation + and will thereafter increase monotonically until it reaches + a maximum value of 2^32-1 (4294967295 decimal), when it + wraps around and starts increasing again from zero. + + Provided that an application discovers a new schema node + of this type within the minimum time to wrap, it can use the + 'initial' value as a delta. It is important for a management + station to be aware of this minimum time and the actual time + between polls, and to discard data if the actual time is too + long or there is no defined minimum time. + + In the value set and its semantics, this type is equivalent + to the ZeroBasedCounter32 textual convention of the SMIv2."; + reference + "RFC 4502: Remote Network Monitoring Management Information + Base Version 2"; + } + + typedef counter64 { + type uint64; + description + "The counter64 type represents a non-negative integer + that monotonically increases until it reaches a + maximum value of 2^64-1 (18446744073709551615 decimal), + when it wraps around and starts increasing again from zero. + + Counters have no defined 'initial' value, and thus, a + single value of a counter has (in general) no information + content. Discontinuities in the monotonically increasing + value normally occur at re-initialization of the + management system, and at other times as specified in the + description of a schema node using this type. If such + other times can occur, for example, the creation of + a schema node of type counter64 at times other than + re-initialization, then a corresponding schema node + should be defined, with an appropriate type, to indicate + the last discontinuity. + + The counter64 type should not be used for configuration + schema nodes. A default statement SHOULD NOT be used in + combination with the type counter64. + + In the value set and its semantics, this type is equivalent + to the Counter64 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef zero-based-counter64 { + type yang:counter64; + default "0"; + description + "The zero-based-counter64 type represents a counter64 that + has the defined 'initial' value zero. + + A schema node of this type will be set to zero (0) on creation + and will thereafter increase monotonically until it reaches + a maximum value of 2^64-1 (18446744073709551615 decimal), + when it wraps around and starts increasing again from zero. + + Provided that an application discovers a new schema node + of this type within the minimum time to wrap, it can use the + 'initial' value as a delta. It is important for a management + station to be aware of this minimum time and the actual time + between polls, and to discard data if the actual time is too + long or there is no defined minimum time. + + In the value set and its semantics, this type is equivalent + to the ZeroBasedCounter64 textual convention of the SMIv2."; + reference + "RFC 2856: Textual Conventions for Additional High Capacity + Data Types"; + } + + typedef gauge32 { + type uint32; + description + "The gauge32 type represents a non-negative integer, which + may increase or decrease, but shall never exceed a maximum + value, nor fall below a minimum value. The maximum value + cannot be greater than 2^32-1 (4294967295 decimal), and + the minimum value cannot be smaller than 0. The value of + a gauge32 has its maximum value whenever the information + being modeled is greater than or equal to its maximum + value, and has its minimum value whenever the information + being modeled is smaller than or equal to its minimum value. + If the information being modeled subsequently decreases + below (increases above) the maximum (minimum) value, the + gauge32 also decreases (increases). + + In the value set and its semantics, this type is equivalent + to the Gauge32 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef gauge64 { + type uint64; + description + "The gauge64 type represents a non-negative integer, which + may increase or decrease, but shall never exceed a maximum + value, nor fall below a minimum value. The maximum value + cannot be greater than 2^64-1 (18446744073709551615), and + the minimum value cannot be smaller than 0. The value of + a gauge64 has its maximum value whenever the information + being modeled is greater than or equal to its maximum + value, and has its minimum value whenever the information + being modeled is smaller than or equal to its minimum value. + If the information being modeled subsequently decreases + below (increases above) the maximum (minimum) value, the + gauge64 also decreases (increases). + + In the value set and its semantics, this type is equivalent + to the CounterBasedGauge64 SMIv2 textual convention defined + in RFC 2856"; + reference + "RFC 2856: Textual Conventions for Additional High Capacity + Data Types"; + } + + /*** collection of identifier-related types ***/ + + typedef object-identifier { + type string { + pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))' + + '(\.(0|([1-9]\d*)))*'; + } + description + "The object-identifier type represents administratively + assigned names in a registration-hierarchical-name tree. + + Values of this type are denoted as a sequence of numerical + non-negative sub-identifier values. Each sub-identifier + value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers + are separated by single dots and without any intermediate + whitespace. + + The ASN.1 standard restricts the value space of the first + sub-identifier to 0, 1, or 2. Furthermore, the value space + of the second sub-identifier is restricted to the range + 0 to 39 if the first sub-identifier is 0 or 1. Finally, + the ASN.1 standard requires that an object identifier + has always at least two sub-identifiers. The pattern + captures these restrictions. + + Although the number of sub-identifiers is not limited, + module designers should realize that there may be + implementations that stick with the SMIv2 limit of 128 + sub-identifiers. + + This type is a superset of the SMIv2 OBJECT IDENTIFIER type + since it is not restricted to 128 sub-identifiers. Hence, + this type SHOULD NOT be used to represent the SMIv2 OBJECT + IDENTIFIER type; the object-identifier-128 type SHOULD be + used instead."; + reference + "ISO9834-1: Information technology -- Open Systems + Interconnection -- Procedures for the operation of OSI + Registration Authorities: General procedures and top + arcs of the ASN.1 Object Identifier tree"; + } + + typedef object-identifier-128 { + type object-identifier { + pattern '\d*(\.\d*){1,127}'; + } + description + "This type represents object-identifiers restricted to 128 + sub-identifiers. + + In the value set and its semantics, this type is equivalent + to the OBJECT IDENTIFIER type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef yang-identifier { + type string { + length "1..max"; + pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*'; + pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*'; + } + description + "A YANG identifier string as defined by the 'identifier' + rule in Section 12 of RFC 6020. An identifier must + start with an alphabetic character or an underscore + followed by an arbitrary sequence of alphabetic or + numeric characters, underscores, hyphens, or dots. + + A YANG identifier MUST NOT start with any possible + combination of the lowercase or uppercase character + sequence 'xml'."; + reference + "RFC 6020: YANG - A Data Modeling Language for the Network + Configuration Protocol (NETCONF)"; + } + + /*** collection of types related to date and time***/ + + typedef date-and-time { + type string { + pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?' + + '(Z|[\+\-]\d{2}:\d{2})'; + } + description + "The date-and-time type is a profile of the ISO 8601 + standard for representation of dates and times using the + Gregorian calendar. The profile is defined by the + date-time production in Section 5.6 of RFC 3339. + + The date-and-time type is compatible with the dateTime XML + schema type with the following notable exceptions: + + (a) The date-and-time type does not allow negative years. + + (b) The date-and-time time-offset -00:00 indicates an unknown + time zone (see RFC 3339) while -00:00 and +00:00 and Z + all represent the same time zone in dateTime. + + (c) The canonical format (see below) of data-and-time values + differs from the canonical format used by the dateTime XML + schema type, which requires all times to be in UTC using + the time-offset 'Z'. + + This type is not equivalent to the DateAndTime textual + convention of the SMIv2 since RFC 3339 uses a different + separator between full-date and full-time and provides + higher resolution of time-secfrac. + + The canonical format for date-and-time values with a known time + zone uses a numeric time zone offset that is calculated using + the device's configured known offset to UTC time. A change of + the device's offset to UTC time will cause date-and-time values + to change accordingly. Such changes might happen periodically + in case a server follows automatically daylight saving time + (DST) time zone offset changes. The canonical format for + date-and-time values with an unknown time zone (usually + referring to the notion of local time) uses the time-offset + -00:00."; + reference + "RFC 3339: Date and Time on the Internet: Timestamps + RFC 2579: Textual Conventions for SMIv2 + XSD-TYPES: XML Schema Part 2: Datatypes Second Edition"; + } + + typedef timeticks { + type uint32; + description + "The timeticks type represents a non-negative integer that + represents the time, modulo 2^32 (4294967296 decimal), in + hundredths of a second between two epochs. When a schema + node is defined that uses this type, the description of + the schema node identifies both of the reference epochs. + + In the value set and its semantics, this type is equivalent + to the TimeTicks type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef timestamp { + type yang:timeticks; + description + "The timestamp type represents the value of an associated + timeticks schema node at which a specific occurrence + happened. The specific occurrence must be defined in the + description of any schema node defined using this type. When + the specific occurrence occurred prior to the last time the + associated timeticks attribute was zero, then the timestamp + value is zero. Note that this requires all timestamp values + to be reset to zero when the value of the associated timeticks + attribute reaches 497+ days and wraps around to zero. + + The associated timeticks schema node must be specified + in the description of any schema node using this type. + + In the value set and its semantics, this type is equivalent + to the TimeStamp textual convention of the SMIv2."; + reference + "RFC 2579: Textual Conventions for SMIv2"; + } + + /*** collection of generic address types ***/ + + typedef phys-address { + type string { + pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + } + + description + "Represents media- or physical-level addresses represented + as a sequence octets, each octet represented by two hexadecimal + numbers. Octets are separated by colons. The canonical + representation uses lowercase characters. + + In the value set and its semantics, this type is equivalent + to the PhysAddress textual convention of the SMIv2."; + reference + "RFC 2579: Textual Conventions for SMIv2"; + } + + typedef mac-address { + type string { + pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'; + } + description + "The mac-address type represents an IEEE 802 MAC address. + The canonical representation uses lowercase characters. + + In the value set and its semantics, this type is equivalent + to the MacAddress textual convention of the SMIv2."; + reference + "IEEE 802: IEEE Standard for Local and Metropolitan Area + Networks: Overview and Architecture + RFC 2579: Textual Conventions for SMIv2"; + } + + /*** collection of XML-specific types ***/ + + typedef xpath1.0 { + type string; + description + "This type represents an XPATH 1.0 expression. + + When a schema node is defined that uses this type, the + description of the schema node MUST specify the XPath + context in which the XPath expression is evaluated."; + reference + "XPATH: XML Path Language (XPath) Version 1.0"; + } + + /*** collection of string types ***/ + + typedef hex-string { + type string { + pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + } + description + "A hexadecimal string with octets represented as hex digits + separated by colons. The canonical representation uses + lowercase characters."; + } + + typedef uuid { + type string { + pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' + + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'; + } + description + "A Universally Unique IDentifier in the string representation + defined in RFC 4122. The canonical representation uses + lowercase characters. + + The following is an example of a UUID in string representation: + f81d4fae-7dec-11d0-a765-00a0c91e6bf6 + "; + reference + "RFC 4122: A Universally Unique IDentifier (UUID) URN + Namespace"; + } + + typedef dotted-quad { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'; + } + description + "An unsigned 32-bit number expressed in the dotted-quad + notation, i.e., four octets written as decimal numbers + and separated with the '.' (full stop) character."; + } +} diff --git a/src/device/tests/qkd/unit/LICENSE b/src/device/tests/qkd/unit/LICENSE new file mode 100644 index 000000000..6b678c507 --- /dev/null +++ b/src/device/tests/qkd/unit/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 FullStory, Inc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/src/device/tests/qkd/unit/generated/context_pb2.py b/src/device/tests/qkd/unit/generated/context_pb2.py new file mode 100644 index 000000000..89c70075b --- /dev/null +++ b/src/device/tests/qkd/unit/generated/context_pb2.py @@ -0,0 +1,994 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: context.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +import acl_pb2 as acl__pb2 +import kpi_sample_types_pb2 as kpi__sample__types__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rcontext.proto\x12\x07\x63ontext\x1a\tacl.proto\x1a\x16kpi_sample_types.proto\"\x07\n\x05\x45mpty\"\x14\n\x04Uuid\x12\x0c\n\x04uuid\x18\x01 \x01(\t\"\x1e\n\tTimestamp\x12\x11\n\ttimestamp\x18\x01 \x01(\x01\"Z\n\x05\x45vent\x12%\n\ttimestamp\x18\x01 \x01(\x0b\x32\x12.context.Timestamp\x12*\n\nevent_type\x18\x02 \x01(\x0e\x32\x16.context.EventTypeEnum\"0\n\tContextId\x12#\n\x0c\x63ontext_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"\xe9\x01\n\x07\x43ontext\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x0c\n\x04name\x18\x02 \x01(\t\x12)\n\x0ctopology_ids\x18\x03 \x03(\x0b\x32\x13.context.TopologyId\x12\'\n\x0bservice_ids\x18\x04 \x03(\x0b\x32\x12.context.ServiceId\x12#\n\tslice_ids\x18\x05 \x03(\x0b\x32\x10.context.SliceId\x12/\n\ncontroller\x18\x06 \x01(\x0b\x32\x1b.context.TeraFlowController\"8\n\rContextIdList\x12\'\n\x0b\x63ontext_ids\x18\x01 \x03(\x0b\x32\x12.context.ContextId\"1\n\x0b\x43ontextList\x12\"\n\x08\x63ontexts\x18\x01 \x03(\x0b\x32\x10.context.Context\"U\n\x0c\x43ontextEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12&\n\ncontext_id\x18\x02 \x01(\x0b\x32\x12.context.ContextId\"Z\n\nTopologyId\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12$\n\rtopology_uuid\x18\x02 \x01(\x0b\x32\r.context.Uuid\"\x8c\x01\n\x08Topology\x12(\n\x0btopology_id\x18\x01 \x01(\x0b\x32\x13.context.TopologyId\x12\x0c\n\x04name\x18\x02 \x01(\t\x12%\n\ndevice_ids\x18\x03 \x03(\x0b\x32\x11.context.DeviceId\x12!\n\x08link_ids\x18\x04 \x03(\x0b\x32\x0f.context.LinkId\"\x89\x01\n\x0fTopologyDetails\x12(\n\x0btopology_id\x18\x01 \x01(\x0b\x32\x13.context.TopologyId\x12\x0c\n\x04name\x18\x02 \x01(\t\x12 \n\x07\x64\x65vices\x18\x03 \x03(\x0b\x32\x0f.context.Device\x12\x1c\n\x05links\x18\x04 \x03(\x0b\x32\r.context.Link\";\n\x0eTopologyIdList\x12)\n\x0ctopology_ids\x18\x01 \x03(\x0b\x32\x13.context.TopologyId\"5\n\x0cTopologyList\x12%\n\ntopologies\x18\x01 \x03(\x0b\x32\x11.context.Topology\"X\n\rTopologyEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12(\n\x0btopology_id\x18\x02 \x01(\x0b\x32\x13.context.TopologyId\".\n\x08\x44\x65viceId\x12\"\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"\xfa\x02\n\x06\x44\x65vice\x12$\n\tdevice_id\x18\x01 \x01(\x0b\x32\x11.context.DeviceId\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65vice_type\x18\x03 \x01(\t\x12,\n\rdevice_config\x18\x04 \x01(\x0b\x32\x15.context.DeviceConfig\x12G\n\x19\x64\x65vice_operational_status\x18\x05 \x01(\x0e\x32$.context.DeviceOperationalStatusEnum\x12\x31\n\x0e\x64\x65vice_drivers\x18\x06 \x03(\x0e\x32\x19.context.DeviceDriverEnum\x12+\n\x10\x64\x65vice_endpoints\x18\x07 \x03(\x0b\x32\x11.context.EndPoint\x12&\n\ncomponents\x18\x08 \x03(\x0b\x32\x12.context.Component\x12(\n\rcontroller_id\x18\t \x01(\x0b\x32\x11.context.DeviceId\"\xc9\x01\n\tComponent\x12%\n\x0e\x63omponent_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x36\n\nattributes\x18\x04 \x03(\x0b\x32\".context.Component.AttributesEntry\x12\x0e\n\x06parent\x18\x05 \x01(\t\x1a\x31\n\x0f\x41ttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"9\n\x0c\x44\x65viceConfig\x12)\n\x0c\x63onfig_rules\x18\x01 \x03(\x0b\x32\x13.context.ConfigRule\"5\n\x0c\x44\x65viceIdList\x12%\n\ndevice_ids\x18\x01 \x03(\x0b\x32\x11.context.DeviceId\".\n\nDeviceList\x12 \n\x07\x64\x65vices\x18\x01 \x03(\x0b\x32\x0f.context.Device\"\x8e\x01\n\x0c\x44\x65viceFilter\x12)\n\ndevice_ids\x18\x01 \x01(\x0b\x32\x15.context.DeviceIdList\x12\x19\n\x11include_endpoints\x18\x02 \x01(\x08\x12\x1c\n\x14include_config_rules\x18\x03 \x01(\x08\x12\x1a\n\x12include_components\x18\x04 \x01(\x08\"\x80\x01\n\x0b\x44\x65viceEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12$\n\tdevice_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\x12,\n\rdevice_config\x18\x03 \x01(\x0b\x32\x15.context.DeviceConfig\"*\n\x06LinkId\x12 \n\tlink_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"I\n\x0eLinkAttributes\x12\x1b\n\x13total_capacity_gbps\x18\x01 \x01(\x02\x12\x1a\n\x12used_capacity_gbps\x18\x02 \x01(\x02\"\x93\x01\n\x04Link\x12 \n\x07link_id\x18\x01 \x01(\x0b\x32\x0f.context.LinkId\x12\x0c\n\x04name\x18\x02 \x01(\t\x12.\n\x11link_endpoint_ids\x18\x03 \x03(\x0b\x32\x13.context.EndPointId\x12+\n\nattributes\x18\x04 \x01(\x0b\x32\x17.context.LinkAttributes\"/\n\nLinkIdList\x12!\n\x08link_ids\x18\x01 \x03(\x0b\x32\x0f.context.LinkId\"(\n\x08LinkList\x12\x1c\n\x05links\x18\x01 \x03(\x0b\x32\r.context.Link\"L\n\tLinkEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12 \n\x07link_id\x18\x02 \x01(\x0b\x32\x0f.context.LinkId\"X\n\tServiceId\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12#\n\x0cservice_uuid\x18\x02 \x01(\x0b\x32\r.context.Uuid\"\xdb\x02\n\x07Service\x12&\n\nservice_id\x18\x01 \x01(\x0b\x32\x12.context.ServiceId\x12\x0c\n\x04name\x18\x02 \x01(\t\x12.\n\x0cservice_type\x18\x03 \x01(\x0e\x32\x18.context.ServiceTypeEnum\x12\x31\n\x14service_endpoint_ids\x18\x04 \x03(\x0b\x32\x13.context.EndPointId\x12\x30\n\x13service_constraints\x18\x05 \x03(\x0b\x32\x13.context.Constraint\x12.\n\x0eservice_status\x18\x06 \x01(\x0b\x32\x16.context.ServiceStatus\x12.\n\x0eservice_config\x18\x07 \x01(\x0b\x32\x16.context.ServiceConfig\x12%\n\ttimestamp\x18\x08 \x01(\x0b\x32\x12.context.Timestamp\"C\n\rServiceStatus\x12\x32\n\x0eservice_status\x18\x01 \x01(\x0e\x32\x1a.context.ServiceStatusEnum\":\n\rServiceConfig\x12)\n\x0c\x63onfig_rules\x18\x01 \x03(\x0b\x32\x13.context.ConfigRule\"8\n\rServiceIdList\x12\'\n\x0bservice_ids\x18\x01 \x03(\x0b\x32\x12.context.ServiceId\"1\n\x0bServiceList\x12\"\n\x08services\x18\x01 \x03(\x0b\x32\x10.context.Service\"\x95\x01\n\rServiceFilter\x12+\n\x0bservice_ids\x18\x01 \x01(\x0b\x32\x16.context.ServiceIdList\x12\x1c\n\x14include_endpoint_ids\x18\x02 \x01(\x08\x12\x1b\n\x13include_constraints\x18\x03 \x01(\x08\x12\x1c\n\x14include_config_rules\x18\x04 \x01(\x08\"U\n\x0cServiceEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12&\n\nservice_id\x18\x02 \x01(\x0b\x32\x12.context.ServiceId\"T\n\x07SliceId\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12!\n\nslice_uuid\x18\x02 \x01(\x0b\x32\r.context.Uuid\"\xa0\x03\n\x05Slice\x12\"\n\x08slice_id\x18\x01 \x01(\x0b\x32\x10.context.SliceId\x12\x0c\n\x04name\x18\x02 \x01(\t\x12/\n\x12slice_endpoint_ids\x18\x03 \x03(\x0b\x32\x13.context.EndPointId\x12.\n\x11slice_constraints\x18\x04 \x03(\x0b\x32\x13.context.Constraint\x12-\n\x11slice_service_ids\x18\x05 \x03(\x0b\x32\x12.context.ServiceId\x12,\n\x12slice_subslice_ids\x18\x06 \x03(\x0b\x32\x10.context.SliceId\x12*\n\x0cslice_status\x18\x07 \x01(\x0b\x32\x14.context.SliceStatus\x12*\n\x0cslice_config\x18\x08 \x01(\x0b\x32\x14.context.SliceConfig\x12(\n\x0bslice_owner\x18\t \x01(\x0b\x32\x13.context.SliceOwner\x12%\n\ttimestamp\x18\n \x01(\x0b\x32\x12.context.Timestamp\"E\n\nSliceOwner\x12!\n\nowner_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\x12\x14\n\x0cowner_string\x18\x02 \x01(\t\"=\n\x0bSliceStatus\x12.\n\x0cslice_status\x18\x01 \x01(\x0e\x32\x18.context.SliceStatusEnum\"8\n\x0bSliceConfig\x12)\n\x0c\x63onfig_rules\x18\x01 \x03(\x0b\x32\x13.context.ConfigRule\"2\n\x0bSliceIdList\x12#\n\tslice_ids\x18\x01 \x03(\x0b\x32\x10.context.SliceId\"+\n\tSliceList\x12\x1e\n\x06slices\x18\x01 \x03(\x0b\x32\x0e.context.Slice\"\xca\x01\n\x0bSliceFilter\x12\'\n\tslice_ids\x18\x01 \x01(\x0b\x32\x14.context.SliceIdList\x12\x1c\n\x14include_endpoint_ids\x18\x02 \x01(\x08\x12\x1b\n\x13include_constraints\x18\x03 \x01(\x08\x12\x1b\n\x13include_service_ids\x18\x04 \x01(\x08\x12\x1c\n\x14include_subslice_ids\x18\x05 \x01(\x08\x12\x1c\n\x14include_config_rules\x18\x06 \x01(\x08\"O\n\nSliceEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12\"\n\x08slice_id\x18\x02 \x01(\x0b\x32\x10.context.SliceId\"6\n\x0c\x43onnectionId\x12&\n\x0f\x63onnection_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"2\n\x15\x43onnectionSettings_L0\x12\x19\n\x11lsp_symbolic_name\x18\x01 \x01(\t\"\x9e\x01\n\x15\x43onnectionSettings_L2\x12\x17\n\x0fsrc_mac_address\x18\x01 \x01(\t\x12\x17\n\x0f\x64st_mac_address\x18\x02 \x01(\t\x12\x12\n\nether_type\x18\x03 \x01(\r\x12\x0f\n\x07vlan_id\x18\x04 \x01(\r\x12\x12\n\nmpls_label\x18\x05 \x01(\r\x12\x1a\n\x12mpls_traffic_class\x18\x06 \x01(\r\"t\n\x15\x43onnectionSettings_L3\x12\x16\n\x0esrc_ip_address\x18\x01 \x01(\t\x12\x16\n\x0e\x64st_ip_address\x18\x02 \x01(\t\x12\x0c\n\x04\x64scp\x18\x03 \x01(\r\x12\x10\n\x08protocol\x18\x04 \x01(\r\x12\x0b\n\x03ttl\x18\x05 \x01(\r\"[\n\x15\x43onnectionSettings_L4\x12\x10\n\x08src_port\x18\x01 \x01(\r\x12\x10\n\x08\x64st_port\x18\x02 \x01(\r\x12\x11\n\ttcp_flags\x18\x03 \x01(\r\x12\x0b\n\x03ttl\x18\x04 \x01(\r\"\xc4\x01\n\x12\x43onnectionSettings\x12*\n\x02l0\x18\x01 \x01(\x0b\x32\x1e.context.ConnectionSettings_L0\x12*\n\x02l2\x18\x02 \x01(\x0b\x32\x1e.context.ConnectionSettings_L2\x12*\n\x02l3\x18\x03 \x01(\x0b\x32\x1e.context.ConnectionSettings_L3\x12*\n\x02l4\x18\x04 \x01(\x0b\x32\x1e.context.ConnectionSettings_L4\"\xf3\x01\n\nConnection\x12,\n\rconnection_id\x18\x01 \x01(\x0b\x32\x15.context.ConnectionId\x12&\n\nservice_id\x18\x02 \x01(\x0b\x32\x12.context.ServiceId\x12\x33\n\x16path_hops_endpoint_ids\x18\x03 \x03(\x0b\x32\x13.context.EndPointId\x12+\n\x0fsub_service_ids\x18\x04 \x03(\x0b\x32\x12.context.ServiceId\x12-\n\x08settings\x18\x05 \x01(\x0b\x32\x1b.context.ConnectionSettings\"A\n\x10\x43onnectionIdList\x12-\n\x0e\x63onnection_ids\x18\x01 \x03(\x0b\x32\x15.context.ConnectionId\":\n\x0e\x43onnectionList\x12(\n\x0b\x63onnections\x18\x01 \x03(\x0b\x32\x13.context.Connection\"^\n\x0f\x43onnectionEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12,\n\rconnection_id\x18\x02 \x01(\x0b\x32\x15.context.ConnectionId\"\x82\x01\n\nEndPointId\x12(\n\x0btopology_id\x18\x01 \x01(\x0b\x32\x13.context.TopologyId\x12$\n\tdevice_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\x12$\n\rendpoint_uuid\x18\x03 \x01(\x0b\x32\r.context.Uuid\"\xc2\x01\n\x08\x45ndPoint\x12(\n\x0b\x65ndpoint_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x15\n\rendpoint_type\x18\x03 \x01(\t\x12\x39\n\x10kpi_sample_types\x18\x04 \x03(\x0e\x32\x1f.kpi_sample_types.KpiSampleType\x12,\n\x11\x65ndpoint_location\x18\x05 \x01(\x0b\x32\x11.context.Location\"{\n\x0c\x45ndPointName\x12(\n\x0b\x65ndpoint_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12\x13\n\x0b\x64\x65vice_name\x18\x02 \x01(\t\x12\x15\n\rendpoint_name\x18\x03 \x01(\t\x12\x15\n\rendpoint_type\x18\x04 \x01(\t\";\n\x0e\x45ndPointIdList\x12)\n\x0c\x65ndpoint_ids\x18\x01 \x03(\x0b\x32\x13.context.EndPointId\"A\n\x10\x45ndPointNameList\x12-\n\x0e\x65ndpoint_names\x18\x01 \x03(\x0b\x32\x15.context.EndPointName\"A\n\x11\x43onfigRule_Custom\x12\x14\n\x0cresource_key\x18\x01 \x01(\t\x12\x16\n\x0eresource_value\x18\x02 \x01(\t\"]\n\x0e\x43onfigRule_ACL\x12(\n\x0b\x65ndpoint_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12!\n\x08rule_set\x18\x02 \x01(\x0b\x32\x0f.acl.AclRuleSet\"\x9c\x01\n\nConfigRule\x12)\n\x06\x61\x63tion\x18\x01 \x01(\x0e\x32\x19.context.ConfigActionEnum\x12,\n\x06\x63ustom\x18\x02 \x01(\x0b\x32\x1a.context.ConfigRule_CustomH\x00\x12&\n\x03\x61\x63l\x18\x03 \x01(\x0b\x32\x17.context.ConfigRule_ACLH\x00\x42\r\n\x0b\x63onfig_rule\"F\n\x11\x43onstraint_Custom\x12\x17\n\x0f\x63onstraint_type\x18\x01 \x01(\t\x12\x18\n\x10\x63onstraint_value\x18\x02 \x01(\t\"E\n\x13\x43onstraint_Schedule\x12\x17\n\x0fstart_timestamp\x18\x01 \x01(\x02\x12\x15\n\rduration_days\x18\x02 \x01(\x02\"3\n\x0cGPS_Position\x12\x10\n\x08latitude\x18\x01 \x01(\x02\x12\x11\n\tlongitude\x18\x02 \x01(\x02\"W\n\x08Location\x12\x10\n\x06region\x18\x01 \x01(\tH\x00\x12-\n\x0cgps_position\x18\x02 \x01(\x0b\x32\x15.context.GPS_PositionH\x00\x42\n\n\x08location\"l\n\x1b\x43onstraint_EndPointLocation\x12(\n\x0b\x65ndpoint_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12#\n\x08location\x18\x02 \x01(\x0b\x32\x11.context.Location\"Y\n\x1b\x43onstraint_EndPointPriority\x12(\n\x0b\x65ndpoint_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12\x10\n\x08priority\x18\x02 \x01(\r\"0\n\x16\x43onstraint_SLA_Latency\x12\x16\n\x0e\x65\x32\x65_latency_ms\x18\x01 \x01(\x02\"0\n\x17\x43onstraint_SLA_Capacity\x12\x15\n\rcapacity_gbps\x18\x01 \x01(\x02\"c\n\x1b\x43onstraint_SLA_Availability\x12\x1a\n\x12num_disjoint_paths\x18\x01 \x01(\r\x12\x12\n\nall_active\x18\x02 \x01(\x08\x12\x14\n\x0c\x61vailability\x18\x03 \x01(\x02\"V\n\x1e\x43onstraint_SLA_Isolation_level\x12\x34\n\x0fisolation_level\x18\x01 \x03(\x0e\x32\x1b.context.IsolationLevelEnum\"\xa2\x01\n\x15\x43onstraint_Exclusions\x12\x14\n\x0cis_permanent\x18\x01 \x01(\x08\x12%\n\ndevice_ids\x18\x02 \x03(\x0b\x32\x11.context.DeviceId\x12)\n\x0c\x65ndpoint_ids\x18\x03 \x03(\x0b\x32\x13.context.EndPointId\x12!\n\x08link_ids\x18\x04 \x03(\x0b\x32\x0f.context.LinkId\"\xdb\x04\n\nConstraint\x12-\n\x06\x61\x63tion\x18\x01 \x01(\x0e\x32\x1d.context.ConstraintActionEnum\x12,\n\x06\x63ustom\x18\x02 \x01(\x0b\x32\x1a.context.Constraint_CustomH\x00\x12\x30\n\x08schedule\x18\x03 \x01(\x0b\x32\x1c.context.Constraint_ScheduleH\x00\x12\x41\n\x11\x65ndpoint_location\x18\x04 \x01(\x0b\x32$.context.Constraint_EndPointLocationH\x00\x12\x41\n\x11\x65ndpoint_priority\x18\x05 \x01(\x0b\x32$.context.Constraint_EndPointPriorityH\x00\x12\x38\n\x0csla_capacity\x18\x06 \x01(\x0b\x32 .context.Constraint_SLA_CapacityH\x00\x12\x36\n\x0bsla_latency\x18\x07 \x01(\x0b\x32\x1f.context.Constraint_SLA_LatencyH\x00\x12@\n\x10sla_availability\x18\x08 \x01(\x0b\x32$.context.Constraint_SLA_AvailabilityH\x00\x12@\n\rsla_isolation\x18\t \x01(\x0b\x32\'.context.Constraint_SLA_Isolation_levelH\x00\x12\x34\n\nexclusions\x18\n \x01(\x0b\x32\x1e.context.Constraint_ExclusionsH\x00\x42\x0c\n\nconstraint\"^\n\x12TeraFlowController\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x12\n\nip_address\x18\x02 \x01(\t\x12\x0c\n\x04port\x18\x03 \x01(\r\"U\n\x14\x41uthenticationResult\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x15\n\rauthenticated\x18\x02 \x01(\x08\"-\n\x0fOpticalConfigId\x12\x1a\n\x12opticalconfig_uuid\x18\x01 \x01(\t\"S\n\rOpticalConfig\x12\x32\n\x10opticalconfig_id\x18\x01 \x01(\x0b\x32\x18.context.OpticalConfigId\x12\x0e\n\x06\x63onfig\x18\x02 \x01(\t\"C\n\x11OpticalConfigList\x12.\n\x0eopticalconfigs\x18\x01 \x03(\x0b\x32\x16.context.OpticalConfig\"9\n\rOpticalLinkId\x12(\n\x11optical_link_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\",\n\x07\x46iberId\x12!\n\nfiber_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"\xe1\x01\n\x05\x46iber\x12\n\n\x02ID\x18\n \x01(\t\x12\x10\n\x08src_port\x18\x01 \x01(\t\x12\x10\n\x08\x64st_port\x18\x02 \x01(\t\x12\x17\n\x0flocal_peer_port\x18\x03 \x01(\t\x12\x18\n\x10remote_peer_port\x18\x04 \x01(\t\x12\x0f\n\x07\x63_slots\x18\x05 \x03(\x05\x12\x0f\n\x07l_slots\x18\x06 \x03(\x05\x12\x0f\n\x07s_slots\x18\x07 \x03(\x05\x12\x0e\n\x06length\x18\x08 \x01(\x02\x12\x0c\n\x04used\x18\t \x01(\x08\x12$\n\nfiber_uuid\x18\x0b \x01(\x0b\x32\x10.context.FiberId\"d\n\x12OpticalLinkDetails\x12\x0e\n\x06length\x18\x01 \x01(\x02\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x0e\n\x06target\x18\x03 \x01(\t\x12\x1e\n\x06\x66ibers\x18\x04 \x03(\x0b\x32\x0e.context.Fiber\"|\n\x0bOpticalLink\x12\x0c\n\x04name\x18\x01 \x01(\t\x12,\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x1b.context.OpticalLinkDetails\x12\x31\n\x11optical_link_uuid\x18\x03 \x01(\x0b\x32\x16.context.OpticalLinkId*j\n\rEventTypeEnum\x12\x17\n\x13\x45VENTTYPE_UNDEFINED\x10\x00\x12\x14\n\x10\x45VENTTYPE_CREATE\x10\x01\x12\x14\n\x10\x45VENTTYPE_UPDATE\x10\x02\x12\x14\n\x10\x45VENTTYPE_REMOVE\x10\x03*\xfe\x02\n\x10\x44\x65viceDriverEnum\x12\x1a\n\x16\x44\x45VICEDRIVER_UNDEFINED\x10\x00\x12\x1b\n\x17\x44\x45VICEDRIVER_OPENCONFIG\x10\x01\x12\x1e\n\x1a\x44\x45VICEDRIVER_TRANSPORT_API\x10\x02\x12\x13\n\x0f\x44\x45VICEDRIVER_P4\x10\x03\x12&\n\"DEVICEDRIVER_IETF_NETWORK_TOPOLOGY\x10\x04\x12\x1b\n\x17\x44\x45VICEDRIVER_ONF_TR_532\x10\x05\x12\x13\n\x0f\x44\x45VICEDRIVER_XR\x10\x06\x12\x1b\n\x17\x44\x45VICEDRIVER_IETF_L2VPN\x10\x07\x12 \n\x1c\x44\x45VICEDRIVER_GNMI_OPENCONFIG\x10\x08\x12\x1c\n\x18\x44\x45VICEDRIVER_OPTICAL_TFS\x10\t\x12\x1a\n\x16\x44\x45VICEDRIVER_IETF_ACTN\x10\n\x12\x13\n\x0f\x44\x45VICEDRIVER_OC\x10\x0b\x12\x14\n\x10\x44\x45VICEDRIVER_QKD\x10\x0c*\x8f\x01\n\x1b\x44\x65viceOperationalStatusEnum\x12%\n!DEVICEOPERATIONALSTATUS_UNDEFINED\x10\x00\x12$\n DEVICEOPERATIONALSTATUS_DISABLED\x10\x01\x12#\n\x1f\x44\x45VICEOPERATIONALSTATUS_ENABLED\x10\x02*\xe5\x01\n\x0fServiceTypeEnum\x12\x17\n\x13SERVICETYPE_UNKNOWN\x10\x00\x12\x14\n\x10SERVICETYPE_L3NM\x10\x01\x12\x14\n\x10SERVICETYPE_L2NM\x10\x02\x12)\n%SERVICETYPE_TAPI_CONNECTIVITY_SERVICE\x10\x03\x12\x12\n\x0eSERVICETYPE_TE\x10\x04\x12\x13\n\x0fSERVICETYPE_E2E\x10\x05\x12$\n SERVICETYPE_OPTICAL_CONNECTIVITY\x10\x06\x12\x13\n\x0fSERVICETYPE_QKD\x10\x07*\xc4\x01\n\x11ServiceStatusEnum\x12\x1b\n\x17SERVICESTATUS_UNDEFINED\x10\x00\x12\x19\n\x15SERVICESTATUS_PLANNED\x10\x01\x12\x18\n\x14SERVICESTATUS_ACTIVE\x10\x02\x12\x1a\n\x16SERVICESTATUS_UPDATING\x10\x03\x12!\n\x1dSERVICESTATUS_PENDING_REMOVAL\x10\x04\x12\x1e\n\x1aSERVICESTATUS_SLA_VIOLATED\x10\x05*\xa9\x01\n\x0fSliceStatusEnum\x12\x19\n\x15SLICESTATUS_UNDEFINED\x10\x00\x12\x17\n\x13SLICESTATUS_PLANNED\x10\x01\x12\x14\n\x10SLICESTATUS_INIT\x10\x02\x12\x16\n\x12SLICESTATUS_ACTIVE\x10\x03\x12\x16\n\x12SLICESTATUS_DEINIT\x10\x04\x12\x1c\n\x18SLICESTATUS_SLA_VIOLATED\x10\x05*]\n\x10\x43onfigActionEnum\x12\x1a\n\x16\x43ONFIGACTION_UNDEFINED\x10\x00\x12\x14\n\x10\x43ONFIGACTION_SET\x10\x01\x12\x17\n\x13\x43ONFIGACTION_DELETE\x10\x02*m\n\x14\x43onstraintActionEnum\x12\x1e\n\x1a\x43ONSTRAINTACTION_UNDEFINED\x10\x00\x12\x18\n\x14\x43ONSTRAINTACTION_SET\x10\x01\x12\x1b\n\x17\x43ONSTRAINTACTION_DELETE\x10\x02*\x83\x02\n\x12IsolationLevelEnum\x12\x10\n\x0cNO_ISOLATION\x10\x00\x12\x16\n\x12PHYSICAL_ISOLATION\x10\x01\x12\x15\n\x11LOGICAL_ISOLATION\x10\x02\x12\x15\n\x11PROCESS_ISOLATION\x10\x03\x12\x1d\n\x19PHYSICAL_MEMORY_ISOLATION\x10\x04\x12\x1e\n\x1aPHYSICAL_NETWORK_ISOLATION\x10\x05\x12\x1e\n\x1aVIRTUAL_RESOURCE_ISOLATION\x10\x06\x12\x1f\n\x1bNETWORK_FUNCTIONS_ISOLATION\x10\x07\x12\x15\n\x11SERVICE_ISOLATION\x10\x08\x32\xa6\x19\n\x0e\x43ontextService\x12:\n\x0eListContextIds\x12\x0e.context.Empty\x1a\x16.context.ContextIdList\"\x00\x12\x36\n\x0cListContexts\x12\x0e.context.Empty\x1a\x14.context.ContextList\"\x00\x12\x34\n\nGetContext\x12\x12.context.ContextId\x1a\x10.context.Context\"\x00\x12\x34\n\nSetContext\x12\x10.context.Context\x1a\x12.context.ContextId\"\x00\x12\x35\n\rRemoveContext\x12\x12.context.ContextId\x1a\x0e.context.Empty\"\x00\x12=\n\x10GetContextEvents\x12\x0e.context.Empty\x1a\x15.context.ContextEvent\"\x00\x30\x01\x12@\n\x0fListTopologyIds\x12\x12.context.ContextId\x1a\x17.context.TopologyIdList\"\x00\x12=\n\x0eListTopologies\x12\x12.context.ContextId\x1a\x15.context.TopologyList\"\x00\x12\x37\n\x0bGetTopology\x12\x13.context.TopologyId\x1a\x11.context.Topology\"\x00\x12\x45\n\x12GetTopologyDetails\x12\x13.context.TopologyId\x1a\x18.context.TopologyDetails\"\x00\x12\x37\n\x0bSetTopology\x12\x11.context.Topology\x1a\x13.context.TopologyId\"\x00\x12\x37\n\x0eRemoveTopology\x12\x13.context.TopologyId\x1a\x0e.context.Empty\"\x00\x12?\n\x11GetTopologyEvents\x12\x0e.context.Empty\x1a\x16.context.TopologyEvent\"\x00\x30\x01\x12\x38\n\rListDeviceIds\x12\x0e.context.Empty\x1a\x15.context.DeviceIdList\"\x00\x12\x34\n\x0bListDevices\x12\x0e.context.Empty\x1a\x13.context.DeviceList\"\x00\x12\x31\n\tGetDevice\x12\x11.context.DeviceId\x1a\x0f.context.Device\"\x00\x12\x31\n\tSetDevice\x12\x0f.context.Device\x1a\x11.context.DeviceId\"\x00\x12\x33\n\x0cRemoveDevice\x12\x11.context.DeviceId\x1a\x0e.context.Empty\"\x00\x12;\n\x0fGetDeviceEvents\x12\x0e.context.Empty\x1a\x14.context.DeviceEvent\"\x00\x30\x01\x12<\n\x0cSelectDevice\x12\x15.context.DeviceFilter\x1a\x13.context.DeviceList\"\x00\x12I\n\x11ListEndPointNames\x12\x17.context.EndPointIdList\x1a\x19.context.EndPointNameList\"\x00\x12\x34\n\x0bListLinkIds\x12\x0e.context.Empty\x1a\x13.context.LinkIdList\"\x00\x12\x30\n\tListLinks\x12\x0e.context.Empty\x1a\x11.context.LinkList\"\x00\x12+\n\x07GetLink\x12\x0f.context.LinkId\x1a\r.context.Link\"\x00\x12+\n\x07SetLink\x12\r.context.Link\x1a\x0f.context.LinkId\"\x00\x12/\n\nRemoveLink\x12\x0f.context.LinkId\x1a\x0e.context.Empty\"\x00\x12\x37\n\rGetLinkEvents\x12\x0e.context.Empty\x1a\x12.context.LinkEvent\"\x00\x30\x01\x12>\n\x0eListServiceIds\x12\x12.context.ContextId\x1a\x16.context.ServiceIdList\"\x00\x12:\n\x0cListServices\x12\x12.context.ContextId\x1a\x14.context.ServiceList\"\x00\x12\x34\n\nGetService\x12\x12.context.ServiceId\x1a\x10.context.Service\"\x00\x12\x34\n\nSetService\x12\x10.context.Service\x1a\x12.context.ServiceId\"\x00\x12\x36\n\x0cUnsetService\x12\x10.context.Service\x1a\x12.context.ServiceId\"\x00\x12\x35\n\rRemoveService\x12\x12.context.ServiceId\x1a\x0e.context.Empty\"\x00\x12=\n\x10GetServiceEvents\x12\x0e.context.Empty\x1a\x15.context.ServiceEvent\"\x00\x30\x01\x12?\n\rSelectService\x12\x16.context.ServiceFilter\x1a\x14.context.ServiceList\"\x00\x12:\n\x0cListSliceIds\x12\x12.context.ContextId\x1a\x14.context.SliceIdList\"\x00\x12\x36\n\nListSlices\x12\x12.context.ContextId\x1a\x12.context.SliceList\"\x00\x12.\n\x08GetSlice\x12\x10.context.SliceId\x1a\x0e.context.Slice\"\x00\x12.\n\x08SetSlice\x12\x0e.context.Slice\x1a\x10.context.SliceId\"\x00\x12\x30\n\nUnsetSlice\x12\x0e.context.Slice\x1a\x10.context.SliceId\"\x00\x12\x31\n\x0bRemoveSlice\x12\x10.context.SliceId\x1a\x0e.context.Empty\"\x00\x12\x39\n\x0eGetSliceEvents\x12\x0e.context.Empty\x1a\x13.context.SliceEvent\"\x00\x30\x01\x12\x39\n\x0bSelectSlice\x12\x14.context.SliceFilter\x1a\x12.context.SliceList\"\x00\x12\x44\n\x11ListConnectionIds\x12\x12.context.ServiceId\x1a\x19.context.ConnectionIdList\"\x00\x12@\n\x0fListConnections\x12\x12.context.ServiceId\x1a\x17.context.ConnectionList\"\x00\x12=\n\rGetConnection\x12\x15.context.ConnectionId\x1a\x13.context.Connection\"\x00\x12=\n\rSetConnection\x12\x13.context.Connection\x1a\x15.context.ConnectionId\"\x00\x12;\n\x10RemoveConnection\x12\x15.context.ConnectionId\x1a\x0e.context.Empty\"\x00\x12\x43\n\x13GetConnectionEvents\x12\x0e.context.Empty\x1a\x18.context.ConnectionEvent\"\x00\x30\x01\x12@\n\x10GetOpticalConfig\x12\x0e.context.Empty\x1a\x1a.context.OpticalConfigList\"\x00\x12\x46\n\x10SetOpticalConfig\x12\x16.context.OpticalConfig\x1a\x18.context.OpticalConfigId\"\x00\x12I\n\x13SelectOpticalConfig\x12\x18.context.OpticalConfigId\x1a\x16.context.OpticalConfig\"\x00\x12\x38\n\x0eSetOpticalLink\x12\x14.context.OpticalLink\x1a\x0e.context.Empty\"\x00\x12@\n\x0eGetOpticalLink\x12\x16.context.OpticalLinkId\x1a\x14.context.OpticalLink\"\x00\x12.\n\x08GetFiber\x12\x10.context.FiberId\x1a\x0e.context.Fiber\"\x00\x62\x06proto3') + +_EVENTTYPEENUM = DESCRIPTOR.enum_types_by_name['EventTypeEnum'] +EventTypeEnum = enum_type_wrapper.EnumTypeWrapper(_EVENTTYPEENUM) +_DEVICEDRIVERENUM = DESCRIPTOR.enum_types_by_name['DeviceDriverEnum'] +DeviceDriverEnum = enum_type_wrapper.EnumTypeWrapper(_DEVICEDRIVERENUM) +_DEVICEOPERATIONALSTATUSENUM = DESCRIPTOR.enum_types_by_name['DeviceOperationalStatusEnum'] +DeviceOperationalStatusEnum = enum_type_wrapper.EnumTypeWrapper(_DEVICEOPERATIONALSTATUSENUM) +_SERVICETYPEENUM = DESCRIPTOR.enum_types_by_name['ServiceTypeEnum'] +ServiceTypeEnum = enum_type_wrapper.EnumTypeWrapper(_SERVICETYPEENUM) +_SERVICESTATUSENUM = DESCRIPTOR.enum_types_by_name['ServiceStatusEnum'] +ServiceStatusEnum = enum_type_wrapper.EnumTypeWrapper(_SERVICESTATUSENUM) +_SLICESTATUSENUM = DESCRIPTOR.enum_types_by_name['SliceStatusEnum'] +SliceStatusEnum = enum_type_wrapper.EnumTypeWrapper(_SLICESTATUSENUM) +_CONFIGACTIONENUM = DESCRIPTOR.enum_types_by_name['ConfigActionEnum'] +ConfigActionEnum = enum_type_wrapper.EnumTypeWrapper(_CONFIGACTIONENUM) +_CONSTRAINTACTIONENUM = DESCRIPTOR.enum_types_by_name['ConstraintActionEnum'] +ConstraintActionEnum = enum_type_wrapper.EnumTypeWrapper(_CONSTRAINTACTIONENUM) +_ISOLATIONLEVELENUM = DESCRIPTOR.enum_types_by_name['IsolationLevelEnum'] +IsolationLevelEnum = enum_type_wrapper.EnumTypeWrapper(_ISOLATIONLEVELENUM) +EVENTTYPE_UNDEFINED = 0 +EVENTTYPE_CREATE = 1 +EVENTTYPE_UPDATE = 2 +EVENTTYPE_REMOVE = 3 +DEVICEDRIVER_UNDEFINED = 0 +DEVICEDRIVER_OPENCONFIG = 1 +DEVICEDRIVER_TRANSPORT_API = 2 +DEVICEDRIVER_P4 = 3 +DEVICEDRIVER_IETF_NETWORK_TOPOLOGY = 4 +DEVICEDRIVER_ONF_TR_532 = 5 +DEVICEDRIVER_XR = 6 +DEVICEDRIVER_IETF_L2VPN = 7 +DEVICEDRIVER_GNMI_OPENCONFIG = 8 +DEVICEDRIVER_OPTICAL_TFS = 9 +DEVICEDRIVER_IETF_ACTN = 10 +DEVICEDRIVER_OC = 11 +DEVICEDRIVER_QKD = 12 +DEVICEOPERATIONALSTATUS_UNDEFINED = 0 +DEVICEOPERATIONALSTATUS_DISABLED = 1 +DEVICEOPERATIONALSTATUS_ENABLED = 2 +SERVICETYPE_UNKNOWN = 0 +SERVICETYPE_L3NM = 1 +SERVICETYPE_L2NM = 2 +SERVICETYPE_TAPI_CONNECTIVITY_SERVICE = 3 +SERVICETYPE_TE = 4 +SERVICETYPE_E2E = 5 +SERVICETYPE_OPTICAL_CONNECTIVITY = 6 +SERVICETYPE_QKD = 7 +SERVICESTATUS_UNDEFINED = 0 +SERVICESTATUS_PLANNED = 1 +SERVICESTATUS_ACTIVE = 2 +SERVICESTATUS_UPDATING = 3 +SERVICESTATUS_PENDING_REMOVAL = 4 +SERVICESTATUS_SLA_VIOLATED = 5 +SLICESTATUS_UNDEFINED = 0 +SLICESTATUS_PLANNED = 1 +SLICESTATUS_INIT = 2 +SLICESTATUS_ACTIVE = 3 +SLICESTATUS_DEINIT = 4 +SLICESTATUS_SLA_VIOLATED = 5 +CONFIGACTION_UNDEFINED = 0 +CONFIGACTION_SET = 1 +CONFIGACTION_DELETE = 2 +CONSTRAINTACTION_UNDEFINED = 0 +CONSTRAINTACTION_SET = 1 +CONSTRAINTACTION_DELETE = 2 +NO_ISOLATION = 0 +PHYSICAL_ISOLATION = 1 +LOGICAL_ISOLATION = 2 +PROCESS_ISOLATION = 3 +PHYSICAL_MEMORY_ISOLATION = 4 +PHYSICAL_NETWORK_ISOLATION = 5 +VIRTUAL_RESOURCE_ISOLATION = 6 +NETWORK_FUNCTIONS_ISOLATION = 7 +SERVICE_ISOLATION = 8 + + +_EMPTY = DESCRIPTOR.message_types_by_name['Empty'] +_UUID = DESCRIPTOR.message_types_by_name['Uuid'] +_TIMESTAMP = DESCRIPTOR.message_types_by_name['Timestamp'] +_EVENT = DESCRIPTOR.message_types_by_name['Event'] +_CONTEXTID = DESCRIPTOR.message_types_by_name['ContextId'] +_CONTEXT = DESCRIPTOR.message_types_by_name['Context'] +_CONTEXTIDLIST = DESCRIPTOR.message_types_by_name['ContextIdList'] +_CONTEXTLIST = DESCRIPTOR.message_types_by_name['ContextList'] +_CONTEXTEVENT = DESCRIPTOR.message_types_by_name['ContextEvent'] +_TOPOLOGYID = DESCRIPTOR.message_types_by_name['TopologyId'] +_TOPOLOGY = DESCRIPTOR.message_types_by_name['Topology'] +_TOPOLOGYDETAILS = DESCRIPTOR.message_types_by_name['TopologyDetails'] +_TOPOLOGYIDLIST = DESCRIPTOR.message_types_by_name['TopologyIdList'] +_TOPOLOGYLIST = DESCRIPTOR.message_types_by_name['TopologyList'] +_TOPOLOGYEVENT = DESCRIPTOR.message_types_by_name['TopologyEvent'] +_DEVICEID = DESCRIPTOR.message_types_by_name['DeviceId'] +_DEVICE = DESCRIPTOR.message_types_by_name['Device'] +_COMPONENT = DESCRIPTOR.message_types_by_name['Component'] +_COMPONENT_ATTRIBUTESENTRY = _COMPONENT.nested_types_by_name['AttributesEntry'] +_DEVICECONFIG = DESCRIPTOR.message_types_by_name['DeviceConfig'] +_DEVICEIDLIST = DESCRIPTOR.message_types_by_name['DeviceIdList'] +_DEVICELIST = DESCRIPTOR.message_types_by_name['DeviceList'] +_DEVICEFILTER = DESCRIPTOR.message_types_by_name['DeviceFilter'] +_DEVICEEVENT = DESCRIPTOR.message_types_by_name['DeviceEvent'] +_LINKID = DESCRIPTOR.message_types_by_name['LinkId'] +_LINKATTRIBUTES = DESCRIPTOR.message_types_by_name['LinkAttributes'] +_LINK = DESCRIPTOR.message_types_by_name['Link'] +_LINKIDLIST = DESCRIPTOR.message_types_by_name['LinkIdList'] +_LINKLIST = DESCRIPTOR.message_types_by_name['LinkList'] +_LINKEVENT = DESCRIPTOR.message_types_by_name['LinkEvent'] +_SERVICEID = DESCRIPTOR.message_types_by_name['ServiceId'] +_SERVICE = DESCRIPTOR.message_types_by_name['Service'] +_SERVICESTATUS = DESCRIPTOR.message_types_by_name['ServiceStatus'] +_SERVICECONFIG = DESCRIPTOR.message_types_by_name['ServiceConfig'] +_SERVICEIDLIST = DESCRIPTOR.message_types_by_name['ServiceIdList'] +_SERVICELIST = DESCRIPTOR.message_types_by_name['ServiceList'] +_SERVICEFILTER = DESCRIPTOR.message_types_by_name['ServiceFilter'] +_SERVICEEVENT = DESCRIPTOR.message_types_by_name['ServiceEvent'] +_SLICEID = DESCRIPTOR.message_types_by_name['SliceId'] +_SLICE = DESCRIPTOR.message_types_by_name['Slice'] +_SLICEOWNER = DESCRIPTOR.message_types_by_name['SliceOwner'] +_SLICESTATUS = DESCRIPTOR.message_types_by_name['SliceStatus'] +_SLICECONFIG = DESCRIPTOR.message_types_by_name['SliceConfig'] +_SLICEIDLIST = DESCRIPTOR.message_types_by_name['SliceIdList'] +_SLICELIST = DESCRIPTOR.message_types_by_name['SliceList'] +_SLICEFILTER = DESCRIPTOR.message_types_by_name['SliceFilter'] +_SLICEEVENT = DESCRIPTOR.message_types_by_name['SliceEvent'] +_CONNECTIONID = DESCRIPTOR.message_types_by_name['ConnectionId'] +_CONNECTIONSETTINGS_L0 = DESCRIPTOR.message_types_by_name['ConnectionSettings_L0'] +_CONNECTIONSETTINGS_L2 = DESCRIPTOR.message_types_by_name['ConnectionSettings_L2'] +_CONNECTIONSETTINGS_L3 = DESCRIPTOR.message_types_by_name['ConnectionSettings_L3'] +_CONNECTIONSETTINGS_L4 = DESCRIPTOR.message_types_by_name['ConnectionSettings_L4'] +_CONNECTIONSETTINGS = DESCRIPTOR.message_types_by_name['ConnectionSettings'] +_CONNECTION = DESCRIPTOR.message_types_by_name['Connection'] +_CONNECTIONIDLIST = DESCRIPTOR.message_types_by_name['ConnectionIdList'] +_CONNECTIONLIST = DESCRIPTOR.message_types_by_name['ConnectionList'] +_CONNECTIONEVENT = DESCRIPTOR.message_types_by_name['ConnectionEvent'] +_ENDPOINTID = DESCRIPTOR.message_types_by_name['EndPointId'] +_ENDPOINT = DESCRIPTOR.message_types_by_name['EndPoint'] +_ENDPOINTNAME = DESCRIPTOR.message_types_by_name['EndPointName'] +_ENDPOINTIDLIST = DESCRIPTOR.message_types_by_name['EndPointIdList'] +_ENDPOINTNAMELIST = DESCRIPTOR.message_types_by_name['EndPointNameList'] +_CONFIGRULE_CUSTOM = DESCRIPTOR.message_types_by_name['ConfigRule_Custom'] +_CONFIGRULE_ACL = DESCRIPTOR.message_types_by_name['ConfigRule_ACL'] +_CONFIGRULE = DESCRIPTOR.message_types_by_name['ConfigRule'] +_CONSTRAINT_CUSTOM = DESCRIPTOR.message_types_by_name['Constraint_Custom'] +_CONSTRAINT_SCHEDULE = DESCRIPTOR.message_types_by_name['Constraint_Schedule'] +_GPS_POSITION = DESCRIPTOR.message_types_by_name['GPS_Position'] +_LOCATION = DESCRIPTOR.message_types_by_name['Location'] +_CONSTRAINT_ENDPOINTLOCATION = DESCRIPTOR.message_types_by_name['Constraint_EndPointLocation'] +_CONSTRAINT_ENDPOINTPRIORITY = DESCRIPTOR.message_types_by_name['Constraint_EndPointPriority'] +_CONSTRAINT_SLA_LATENCY = DESCRIPTOR.message_types_by_name['Constraint_SLA_Latency'] +_CONSTRAINT_SLA_CAPACITY = DESCRIPTOR.message_types_by_name['Constraint_SLA_Capacity'] +_CONSTRAINT_SLA_AVAILABILITY = DESCRIPTOR.message_types_by_name['Constraint_SLA_Availability'] +_CONSTRAINT_SLA_ISOLATION_LEVEL = DESCRIPTOR.message_types_by_name['Constraint_SLA_Isolation_level'] +_CONSTRAINT_EXCLUSIONS = DESCRIPTOR.message_types_by_name['Constraint_Exclusions'] +_CONSTRAINT = DESCRIPTOR.message_types_by_name['Constraint'] +_TERAFLOWCONTROLLER = DESCRIPTOR.message_types_by_name['TeraFlowController'] +_AUTHENTICATIONRESULT = DESCRIPTOR.message_types_by_name['AuthenticationResult'] +_OPTICALCONFIGID = DESCRIPTOR.message_types_by_name['OpticalConfigId'] +_OPTICALCONFIG = DESCRIPTOR.message_types_by_name['OpticalConfig'] +_OPTICALCONFIGLIST = DESCRIPTOR.message_types_by_name['OpticalConfigList'] +_OPTICALLINKID = DESCRIPTOR.message_types_by_name['OpticalLinkId'] +_FIBERID = DESCRIPTOR.message_types_by_name['FiberId'] +_FIBER = DESCRIPTOR.message_types_by_name['Fiber'] +_OPTICALLINKDETAILS = DESCRIPTOR.message_types_by_name['OpticalLinkDetails'] +_OPTICALLINK = DESCRIPTOR.message_types_by_name['OpticalLink'] +Empty = _reflection.GeneratedProtocolMessageType('Empty', (_message.Message,), { + 'DESCRIPTOR' : _EMPTY, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Empty) + }) +_sym_db.RegisterMessage(Empty) + +Uuid = _reflection.GeneratedProtocolMessageType('Uuid', (_message.Message,), { + 'DESCRIPTOR' : _UUID, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Uuid) + }) +_sym_db.RegisterMessage(Uuid) + +Timestamp = _reflection.GeneratedProtocolMessageType('Timestamp', (_message.Message,), { + 'DESCRIPTOR' : _TIMESTAMP, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Timestamp) + }) +_sym_db.RegisterMessage(Timestamp) + +Event = _reflection.GeneratedProtocolMessageType('Event', (_message.Message,), { + 'DESCRIPTOR' : _EVENT, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Event) + }) +_sym_db.RegisterMessage(Event) + +ContextId = _reflection.GeneratedProtocolMessageType('ContextId', (_message.Message,), { + 'DESCRIPTOR' : _CONTEXTID, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ContextId) + }) +_sym_db.RegisterMessage(ContextId) + +Context = _reflection.GeneratedProtocolMessageType('Context', (_message.Message,), { + 'DESCRIPTOR' : _CONTEXT, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Context) + }) +_sym_db.RegisterMessage(Context) + +ContextIdList = _reflection.GeneratedProtocolMessageType('ContextIdList', (_message.Message,), { + 'DESCRIPTOR' : _CONTEXTIDLIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ContextIdList) + }) +_sym_db.RegisterMessage(ContextIdList) + +ContextList = _reflection.GeneratedProtocolMessageType('ContextList', (_message.Message,), { + 'DESCRIPTOR' : _CONTEXTLIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ContextList) + }) +_sym_db.RegisterMessage(ContextList) + +ContextEvent = _reflection.GeneratedProtocolMessageType('ContextEvent', (_message.Message,), { + 'DESCRIPTOR' : _CONTEXTEVENT, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ContextEvent) + }) +_sym_db.RegisterMessage(ContextEvent) + +TopologyId = _reflection.GeneratedProtocolMessageType('TopologyId', (_message.Message,), { + 'DESCRIPTOR' : _TOPOLOGYID, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.TopologyId) + }) +_sym_db.RegisterMessage(TopologyId) + +Topology = _reflection.GeneratedProtocolMessageType('Topology', (_message.Message,), { + 'DESCRIPTOR' : _TOPOLOGY, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Topology) + }) +_sym_db.RegisterMessage(Topology) + +TopologyDetails = _reflection.GeneratedProtocolMessageType('TopologyDetails', (_message.Message,), { + 'DESCRIPTOR' : _TOPOLOGYDETAILS, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.TopologyDetails) + }) +_sym_db.RegisterMessage(TopologyDetails) + +TopologyIdList = _reflection.GeneratedProtocolMessageType('TopologyIdList', (_message.Message,), { + 'DESCRIPTOR' : _TOPOLOGYIDLIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.TopologyIdList) + }) +_sym_db.RegisterMessage(TopologyIdList) + +TopologyList = _reflection.GeneratedProtocolMessageType('TopologyList', (_message.Message,), { + 'DESCRIPTOR' : _TOPOLOGYLIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.TopologyList) + }) +_sym_db.RegisterMessage(TopologyList) + +TopologyEvent = _reflection.GeneratedProtocolMessageType('TopologyEvent', (_message.Message,), { + 'DESCRIPTOR' : _TOPOLOGYEVENT, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.TopologyEvent) + }) +_sym_db.RegisterMessage(TopologyEvent) + +DeviceId = _reflection.GeneratedProtocolMessageType('DeviceId', (_message.Message,), { + 'DESCRIPTOR' : _DEVICEID, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.DeviceId) + }) +_sym_db.RegisterMessage(DeviceId) + +Device = _reflection.GeneratedProtocolMessageType('Device', (_message.Message,), { + 'DESCRIPTOR' : _DEVICE, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Device) + }) +_sym_db.RegisterMessage(Device) + +Component = _reflection.GeneratedProtocolMessageType('Component', (_message.Message,), { + + 'AttributesEntry' : _reflection.GeneratedProtocolMessageType('AttributesEntry', (_message.Message,), { + 'DESCRIPTOR' : _COMPONENT_ATTRIBUTESENTRY, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Component.AttributesEntry) + }) + , + 'DESCRIPTOR' : _COMPONENT, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Component) + }) +_sym_db.RegisterMessage(Component) +_sym_db.RegisterMessage(Component.AttributesEntry) + +DeviceConfig = _reflection.GeneratedProtocolMessageType('DeviceConfig', (_message.Message,), { + 'DESCRIPTOR' : _DEVICECONFIG, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.DeviceConfig) + }) +_sym_db.RegisterMessage(DeviceConfig) + +DeviceIdList = _reflection.GeneratedProtocolMessageType('DeviceIdList', (_message.Message,), { + 'DESCRIPTOR' : _DEVICEIDLIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.DeviceIdList) + }) +_sym_db.RegisterMessage(DeviceIdList) + +DeviceList = _reflection.GeneratedProtocolMessageType('DeviceList', (_message.Message,), { + 'DESCRIPTOR' : _DEVICELIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.DeviceList) + }) +_sym_db.RegisterMessage(DeviceList) + +DeviceFilter = _reflection.GeneratedProtocolMessageType('DeviceFilter', (_message.Message,), { + 'DESCRIPTOR' : _DEVICEFILTER, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.DeviceFilter) + }) +_sym_db.RegisterMessage(DeviceFilter) + +DeviceEvent = _reflection.GeneratedProtocolMessageType('DeviceEvent', (_message.Message,), { + 'DESCRIPTOR' : _DEVICEEVENT, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.DeviceEvent) + }) +_sym_db.RegisterMessage(DeviceEvent) + +LinkId = _reflection.GeneratedProtocolMessageType('LinkId', (_message.Message,), { + 'DESCRIPTOR' : _LINKID, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.LinkId) + }) +_sym_db.RegisterMessage(LinkId) + +LinkAttributes = _reflection.GeneratedProtocolMessageType('LinkAttributes', (_message.Message,), { + 'DESCRIPTOR' : _LINKATTRIBUTES, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.LinkAttributes) + }) +_sym_db.RegisterMessage(LinkAttributes) + +Link = _reflection.GeneratedProtocolMessageType('Link', (_message.Message,), { + 'DESCRIPTOR' : _LINK, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Link) + }) +_sym_db.RegisterMessage(Link) + +LinkIdList = _reflection.GeneratedProtocolMessageType('LinkIdList', (_message.Message,), { + 'DESCRIPTOR' : _LINKIDLIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.LinkIdList) + }) +_sym_db.RegisterMessage(LinkIdList) + +LinkList = _reflection.GeneratedProtocolMessageType('LinkList', (_message.Message,), { + 'DESCRIPTOR' : _LINKLIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.LinkList) + }) +_sym_db.RegisterMessage(LinkList) + +LinkEvent = _reflection.GeneratedProtocolMessageType('LinkEvent', (_message.Message,), { + 'DESCRIPTOR' : _LINKEVENT, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.LinkEvent) + }) +_sym_db.RegisterMessage(LinkEvent) + +ServiceId = _reflection.GeneratedProtocolMessageType('ServiceId', (_message.Message,), { + 'DESCRIPTOR' : _SERVICEID, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ServiceId) + }) +_sym_db.RegisterMessage(ServiceId) + +Service = _reflection.GeneratedProtocolMessageType('Service', (_message.Message,), { + 'DESCRIPTOR' : _SERVICE, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Service) + }) +_sym_db.RegisterMessage(Service) + +ServiceStatus = _reflection.GeneratedProtocolMessageType('ServiceStatus', (_message.Message,), { + 'DESCRIPTOR' : _SERVICESTATUS, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ServiceStatus) + }) +_sym_db.RegisterMessage(ServiceStatus) + +ServiceConfig = _reflection.GeneratedProtocolMessageType('ServiceConfig', (_message.Message,), { + 'DESCRIPTOR' : _SERVICECONFIG, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ServiceConfig) + }) +_sym_db.RegisterMessage(ServiceConfig) + +ServiceIdList = _reflection.GeneratedProtocolMessageType('ServiceIdList', (_message.Message,), { + 'DESCRIPTOR' : _SERVICEIDLIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ServiceIdList) + }) +_sym_db.RegisterMessage(ServiceIdList) + +ServiceList = _reflection.GeneratedProtocolMessageType('ServiceList', (_message.Message,), { + 'DESCRIPTOR' : _SERVICELIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ServiceList) + }) +_sym_db.RegisterMessage(ServiceList) + +ServiceFilter = _reflection.GeneratedProtocolMessageType('ServiceFilter', (_message.Message,), { + 'DESCRIPTOR' : _SERVICEFILTER, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ServiceFilter) + }) +_sym_db.RegisterMessage(ServiceFilter) + +ServiceEvent = _reflection.GeneratedProtocolMessageType('ServiceEvent', (_message.Message,), { + 'DESCRIPTOR' : _SERVICEEVENT, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ServiceEvent) + }) +_sym_db.RegisterMessage(ServiceEvent) + +SliceId = _reflection.GeneratedProtocolMessageType('SliceId', (_message.Message,), { + 'DESCRIPTOR' : _SLICEID, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.SliceId) + }) +_sym_db.RegisterMessage(SliceId) + +Slice = _reflection.GeneratedProtocolMessageType('Slice', (_message.Message,), { + 'DESCRIPTOR' : _SLICE, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Slice) + }) +_sym_db.RegisterMessage(Slice) + +SliceOwner = _reflection.GeneratedProtocolMessageType('SliceOwner', (_message.Message,), { + 'DESCRIPTOR' : _SLICEOWNER, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.SliceOwner) + }) +_sym_db.RegisterMessage(SliceOwner) + +SliceStatus = _reflection.GeneratedProtocolMessageType('SliceStatus', (_message.Message,), { + 'DESCRIPTOR' : _SLICESTATUS, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.SliceStatus) + }) +_sym_db.RegisterMessage(SliceStatus) + +SliceConfig = _reflection.GeneratedProtocolMessageType('SliceConfig', (_message.Message,), { + 'DESCRIPTOR' : _SLICECONFIG, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.SliceConfig) + }) +_sym_db.RegisterMessage(SliceConfig) + +SliceIdList = _reflection.GeneratedProtocolMessageType('SliceIdList', (_message.Message,), { + 'DESCRIPTOR' : _SLICEIDLIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.SliceIdList) + }) +_sym_db.RegisterMessage(SliceIdList) + +SliceList = _reflection.GeneratedProtocolMessageType('SliceList', (_message.Message,), { + 'DESCRIPTOR' : _SLICELIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.SliceList) + }) +_sym_db.RegisterMessage(SliceList) + +SliceFilter = _reflection.GeneratedProtocolMessageType('SliceFilter', (_message.Message,), { + 'DESCRIPTOR' : _SLICEFILTER, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.SliceFilter) + }) +_sym_db.RegisterMessage(SliceFilter) + +SliceEvent = _reflection.GeneratedProtocolMessageType('SliceEvent', (_message.Message,), { + 'DESCRIPTOR' : _SLICEEVENT, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.SliceEvent) + }) +_sym_db.RegisterMessage(SliceEvent) + +ConnectionId = _reflection.GeneratedProtocolMessageType('ConnectionId', (_message.Message,), { + 'DESCRIPTOR' : _CONNECTIONID, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ConnectionId) + }) +_sym_db.RegisterMessage(ConnectionId) + +ConnectionSettings_L0 = _reflection.GeneratedProtocolMessageType('ConnectionSettings_L0', (_message.Message,), { + 'DESCRIPTOR' : _CONNECTIONSETTINGS_L0, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ConnectionSettings_L0) + }) +_sym_db.RegisterMessage(ConnectionSettings_L0) + +ConnectionSettings_L2 = _reflection.GeneratedProtocolMessageType('ConnectionSettings_L2', (_message.Message,), { + 'DESCRIPTOR' : _CONNECTIONSETTINGS_L2, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ConnectionSettings_L2) + }) +_sym_db.RegisterMessage(ConnectionSettings_L2) + +ConnectionSettings_L3 = _reflection.GeneratedProtocolMessageType('ConnectionSettings_L3', (_message.Message,), { + 'DESCRIPTOR' : _CONNECTIONSETTINGS_L3, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ConnectionSettings_L3) + }) +_sym_db.RegisterMessage(ConnectionSettings_L3) + +ConnectionSettings_L4 = _reflection.GeneratedProtocolMessageType('ConnectionSettings_L4', (_message.Message,), { + 'DESCRIPTOR' : _CONNECTIONSETTINGS_L4, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ConnectionSettings_L4) + }) +_sym_db.RegisterMessage(ConnectionSettings_L4) + +ConnectionSettings = _reflection.GeneratedProtocolMessageType('ConnectionSettings', (_message.Message,), { + 'DESCRIPTOR' : _CONNECTIONSETTINGS, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ConnectionSettings) + }) +_sym_db.RegisterMessage(ConnectionSettings) + +Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), { + 'DESCRIPTOR' : _CONNECTION, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Connection) + }) +_sym_db.RegisterMessage(Connection) + +ConnectionIdList = _reflection.GeneratedProtocolMessageType('ConnectionIdList', (_message.Message,), { + 'DESCRIPTOR' : _CONNECTIONIDLIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ConnectionIdList) + }) +_sym_db.RegisterMessage(ConnectionIdList) + +ConnectionList = _reflection.GeneratedProtocolMessageType('ConnectionList', (_message.Message,), { + 'DESCRIPTOR' : _CONNECTIONLIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ConnectionList) + }) +_sym_db.RegisterMessage(ConnectionList) + +ConnectionEvent = _reflection.GeneratedProtocolMessageType('ConnectionEvent', (_message.Message,), { + 'DESCRIPTOR' : _CONNECTIONEVENT, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ConnectionEvent) + }) +_sym_db.RegisterMessage(ConnectionEvent) + +EndPointId = _reflection.GeneratedProtocolMessageType('EndPointId', (_message.Message,), { + 'DESCRIPTOR' : _ENDPOINTID, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.EndPointId) + }) +_sym_db.RegisterMessage(EndPointId) + +EndPoint = _reflection.GeneratedProtocolMessageType('EndPoint', (_message.Message,), { + 'DESCRIPTOR' : _ENDPOINT, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.EndPoint) + }) +_sym_db.RegisterMessage(EndPoint) + +EndPointName = _reflection.GeneratedProtocolMessageType('EndPointName', (_message.Message,), { + 'DESCRIPTOR' : _ENDPOINTNAME, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.EndPointName) + }) +_sym_db.RegisterMessage(EndPointName) + +EndPointIdList = _reflection.GeneratedProtocolMessageType('EndPointIdList', (_message.Message,), { + 'DESCRIPTOR' : _ENDPOINTIDLIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.EndPointIdList) + }) +_sym_db.RegisterMessage(EndPointIdList) + +EndPointNameList = _reflection.GeneratedProtocolMessageType('EndPointNameList', (_message.Message,), { + 'DESCRIPTOR' : _ENDPOINTNAMELIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.EndPointNameList) + }) +_sym_db.RegisterMessage(EndPointNameList) + +ConfigRule_Custom = _reflection.GeneratedProtocolMessageType('ConfigRule_Custom', (_message.Message,), { + 'DESCRIPTOR' : _CONFIGRULE_CUSTOM, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ConfigRule_Custom) + }) +_sym_db.RegisterMessage(ConfigRule_Custom) + +ConfigRule_ACL = _reflection.GeneratedProtocolMessageType('ConfigRule_ACL', (_message.Message,), { + 'DESCRIPTOR' : _CONFIGRULE_ACL, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ConfigRule_ACL) + }) +_sym_db.RegisterMessage(ConfigRule_ACL) + +ConfigRule = _reflection.GeneratedProtocolMessageType('ConfigRule', (_message.Message,), { + 'DESCRIPTOR' : _CONFIGRULE, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.ConfigRule) + }) +_sym_db.RegisterMessage(ConfigRule) + +Constraint_Custom = _reflection.GeneratedProtocolMessageType('Constraint_Custom', (_message.Message,), { + 'DESCRIPTOR' : _CONSTRAINT_CUSTOM, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Constraint_Custom) + }) +_sym_db.RegisterMessage(Constraint_Custom) + +Constraint_Schedule = _reflection.GeneratedProtocolMessageType('Constraint_Schedule', (_message.Message,), { + 'DESCRIPTOR' : _CONSTRAINT_SCHEDULE, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Constraint_Schedule) + }) +_sym_db.RegisterMessage(Constraint_Schedule) + +GPS_Position = _reflection.GeneratedProtocolMessageType('GPS_Position', (_message.Message,), { + 'DESCRIPTOR' : _GPS_POSITION, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.GPS_Position) + }) +_sym_db.RegisterMessage(GPS_Position) + +Location = _reflection.GeneratedProtocolMessageType('Location', (_message.Message,), { + 'DESCRIPTOR' : _LOCATION, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Location) + }) +_sym_db.RegisterMessage(Location) + +Constraint_EndPointLocation = _reflection.GeneratedProtocolMessageType('Constraint_EndPointLocation', (_message.Message,), { + 'DESCRIPTOR' : _CONSTRAINT_ENDPOINTLOCATION, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Constraint_EndPointLocation) + }) +_sym_db.RegisterMessage(Constraint_EndPointLocation) + +Constraint_EndPointPriority = _reflection.GeneratedProtocolMessageType('Constraint_EndPointPriority', (_message.Message,), { + 'DESCRIPTOR' : _CONSTRAINT_ENDPOINTPRIORITY, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Constraint_EndPointPriority) + }) +_sym_db.RegisterMessage(Constraint_EndPointPriority) + +Constraint_SLA_Latency = _reflection.GeneratedProtocolMessageType('Constraint_SLA_Latency', (_message.Message,), { + 'DESCRIPTOR' : _CONSTRAINT_SLA_LATENCY, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Constraint_SLA_Latency) + }) +_sym_db.RegisterMessage(Constraint_SLA_Latency) + +Constraint_SLA_Capacity = _reflection.GeneratedProtocolMessageType('Constraint_SLA_Capacity', (_message.Message,), { + 'DESCRIPTOR' : _CONSTRAINT_SLA_CAPACITY, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Constraint_SLA_Capacity) + }) +_sym_db.RegisterMessage(Constraint_SLA_Capacity) + +Constraint_SLA_Availability = _reflection.GeneratedProtocolMessageType('Constraint_SLA_Availability', (_message.Message,), { + 'DESCRIPTOR' : _CONSTRAINT_SLA_AVAILABILITY, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Constraint_SLA_Availability) + }) +_sym_db.RegisterMessage(Constraint_SLA_Availability) + +Constraint_SLA_Isolation_level = _reflection.GeneratedProtocolMessageType('Constraint_SLA_Isolation_level', (_message.Message,), { + 'DESCRIPTOR' : _CONSTRAINT_SLA_ISOLATION_LEVEL, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Constraint_SLA_Isolation_level) + }) +_sym_db.RegisterMessage(Constraint_SLA_Isolation_level) + +Constraint_Exclusions = _reflection.GeneratedProtocolMessageType('Constraint_Exclusions', (_message.Message,), { + 'DESCRIPTOR' : _CONSTRAINT_EXCLUSIONS, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Constraint_Exclusions) + }) +_sym_db.RegisterMessage(Constraint_Exclusions) + +Constraint = _reflection.GeneratedProtocolMessageType('Constraint', (_message.Message,), { + 'DESCRIPTOR' : _CONSTRAINT, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Constraint) + }) +_sym_db.RegisterMessage(Constraint) + +TeraFlowController = _reflection.GeneratedProtocolMessageType('TeraFlowController', (_message.Message,), { + 'DESCRIPTOR' : _TERAFLOWCONTROLLER, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.TeraFlowController) + }) +_sym_db.RegisterMessage(TeraFlowController) + +AuthenticationResult = _reflection.GeneratedProtocolMessageType('AuthenticationResult', (_message.Message,), { + 'DESCRIPTOR' : _AUTHENTICATIONRESULT, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.AuthenticationResult) + }) +_sym_db.RegisterMessage(AuthenticationResult) + +OpticalConfigId = _reflection.GeneratedProtocolMessageType('OpticalConfigId', (_message.Message,), { + 'DESCRIPTOR' : _OPTICALCONFIGID, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.OpticalConfigId) + }) +_sym_db.RegisterMessage(OpticalConfigId) + +OpticalConfig = _reflection.GeneratedProtocolMessageType('OpticalConfig', (_message.Message,), { + 'DESCRIPTOR' : _OPTICALCONFIG, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.OpticalConfig) + }) +_sym_db.RegisterMessage(OpticalConfig) + +OpticalConfigList = _reflection.GeneratedProtocolMessageType('OpticalConfigList', (_message.Message,), { + 'DESCRIPTOR' : _OPTICALCONFIGLIST, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.OpticalConfigList) + }) +_sym_db.RegisterMessage(OpticalConfigList) + +OpticalLinkId = _reflection.GeneratedProtocolMessageType('OpticalLinkId', (_message.Message,), { + 'DESCRIPTOR' : _OPTICALLINKID, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.OpticalLinkId) + }) +_sym_db.RegisterMessage(OpticalLinkId) + +FiberId = _reflection.GeneratedProtocolMessageType('FiberId', (_message.Message,), { + 'DESCRIPTOR' : _FIBERID, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.FiberId) + }) +_sym_db.RegisterMessage(FiberId) + +Fiber = _reflection.GeneratedProtocolMessageType('Fiber', (_message.Message,), { + 'DESCRIPTOR' : _FIBER, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.Fiber) + }) +_sym_db.RegisterMessage(Fiber) + +OpticalLinkDetails = _reflection.GeneratedProtocolMessageType('OpticalLinkDetails', (_message.Message,), { + 'DESCRIPTOR' : _OPTICALLINKDETAILS, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.OpticalLinkDetails) + }) +_sym_db.RegisterMessage(OpticalLinkDetails) + +OpticalLink = _reflection.GeneratedProtocolMessageType('OpticalLink', (_message.Message,), { + 'DESCRIPTOR' : _OPTICALLINK, + '__module__' : 'context_pb2' + # @@protoc_insertion_point(class_scope:context.OpticalLink) + }) +_sym_db.RegisterMessage(OpticalLink) + +_CONTEXTSERVICE = DESCRIPTOR.services_by_name['ContextService'] +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + _COMPONENT_ATTRIBUTESENTRY._options = None + _COMPONENT_ATTRIBUTESENTRY._serialized_options = b'8\001' + _EVENTTYPEENUM._serialized_start=9328 + _EVENTTYPEENUM._serialized_end=9434 + _DEVICEDRIVERENUM._serialized_start=9437 + _DEVICEDRIVERENUM._serialized_end=9819 + _DEVICEOPERATIONALSTATUSENUM._serialized_start=9822 + _DEVICEOPERATIONALSTATUSENUM._serialized_end=9965 + _SERVICETYPEENUM._serialized_start=9968 + _SERVICETYPEENUM._serialized_end=10197 + _SERVICESTATUSENUM._serialized_start=10200 + _SERVICESTATUSENUM._serialized_end=10396 + _SLICESTATUSENUM._serialized_start=10399 + _SLICESTATUSENUM._serialized_end=10568 + _CONFIGACTIONENUM._serialized_start=10570 + _CONFIGACTIONENUM._serialized_end=10663 + _CONSTRAINTACTIONENUM._serialized_start=10665 + _CONSTRAINTACTIONENUM._serialized_end=10774 + _ISOLATIONLEVELENUM._serialized_start=10777 + _ISOLATIONLEVELENUM._serialized_end=11036 + _EMPTY._serialized_start=61 + _EMPTY._serialized_end=68 + _UUID._serialized_start=70 + _UUID._serialized_end=90 + _TIMESTAMP._serialized_start=92 + _TIMESTAMP._serialized_end=122 + _EVENT._serialized_start=124 + _EVENT._serialized_end=214 + _CONTEXTID._serialized_start=216 + _CONTEXTID._serialized_end=264 + _CONTEXT._serialized_start=267 + _CONTEXT._serialized_end=500 + _CONTEXTIDLIST._serialized_start=502 + _CONTEXTIDLIST._serialized_end=558 + _CONTEXTLIST._serialized_start=560 + _CONTEXTLIST._serialized_end=609 + _CONTEXTEVENT._serialized_start=611 + _CONTEXTEVENT._serialized_end=696 + _TOPOLOGYID._serialized_start=698 + _TOPOLOGYID._serialized_end=788 + _TOPOLOGY._serialized_start=791 + _TOPOLOGY._serialized_end=931 + _TOPOLOGYDETAILS._serialized_start=934 + _TOPOLOGYDETAILS._serialized_end=1071 + _TOPOLOGYIDLIST._serialized_start=1073 + _TOPOLOGYIDLIST._serialized_end=1132 + _TOPOLOGYLIST._serialized_start=1134 + _TOPOLOGYLIST._serialized_end=1187 + _TOPOLOGYEVENT._serialized_start=1189 + _TOPOLOGYEVENT._serialized_end=1277 + _DEVICEID._serialized_start=1279 + _DEVICEID._serialized_end=1325 + _DEVICE._serialized_start=1328 + _DEVICE._serialized_end=1706 + _COMPONENT._serialized_start=1709 + _COMPONENT._serialized_end=1910 + _COMPONENT_ATTRIBUTESENTRY._serialized_start=1861 + _COMPONENT_ATTRIBUTESENTRY._serialized_end=1910 + _DEVICECONFIG._serialized_start=1912 + _DEVICECONFIG._serialized_end=1969 + _DEVICEIDLIST._serialized_start=1971 + _DEVICEIDLIST._serialized_end=2024 + _DEVICELIST._serialized_start=2026 + _DEVICELIST._serialized_end=2072 + _DEVICEFILTER._serialized_start=2075 + _DEVICEFILTER._serialized_end=2217 + _DEVICEEVENT._serialized_start=2220 + _DEVICEEVENT._serialized_end=2348 + _LINKID._serialized_start=2350 + _LINKID._serialized_end=2392 + _LINKATTRIBUTES._serialized_start=2394 + _LINKATTRIBUTES._serialized_end=2467 + _LINK._serialized_start=2470 + _LINK._serialized_end=2617 + _LINKIDLIST._serialized_start=2619 + _LINKIDLIST._serialized_end=2666 + _LINKLIST._serialized_start=2668 + _LINKLIST._serialized_end=2708 + _LINKEVENT._serialized_start=2710 + _LINKEVENT._serialized_end=2786 + _SERVICEID._serialized_start=2788 + _SERVICEID._serialized_end=2876 + _SERVICE._serialized_start=2879 + _SERVICE._serialized_end=3226 + _SERVICESTATUS._serialized_start=3228 + _SERVICESTATUS._serialized_end=3295 + _SERVICECONFIG._serialized_start=3297 + _SERVICECONFIG._serialized_end=3355 + _SERVICEIDLIST._serialized_start=3357 + _SERVICEIDLIST._serialized_end=3413 + _SERVICELIST._serialized_start=3415 + _SERVICELIST._serialized_end=3464 + _SERVICEFILTER._serialized_start=3467 + _SERVICEFILTER._serialized_end=3616 + _SERVICEEVENT._serialized_start=3618 + _SERVICEEVENT._serialized_end=3703 + _SLICEID._serialized_start=3705 + _SLICEID._serialized_end=3789 + _SLICE._serialized_start=3792 + _SLICE._serialized_end=4208 + _SLICEOWNER._serialized_start=4210 + _SLICEOWNER._serialized_end=4279 + _SLICESTATUS._serialized_start=4281 + _SLICESTATUS._serialized_end=4342 + _SLICECONFIG._serialized_start=4344 + _SLICECONFIG._serialized_end=4400 + _SLICEIDLIST._serialized_start=4402 + _SLICEIDLIST._serialized_end=4452 + _SLICELIST._serialized_start=4454 + _SLICELIST._serialized_end=4497 + _SLICEFILTER._serialized_start=4500 + _SLICEFILTER._serialized_end=4702 + _SLICEEVENT._serialized_start=4704 + _SLICEEVENT._serialized_end=4783 + _CONNECTIONID._serialized_start=4785 + _CONNECTIONID._serialized_end=4839 + _CONNECTIONSETTINGS_L0._serialized_start=4841 + _CONNECTIONSETTINGS_L0._serialized_end=4891 + _CONNECTIONSETTINGS_L2._serialized_start=4894 + _CONNECTIONSETTINGS_L2._serialized_end=5052 + _CONNECTIONSETTINGS_L3._serialized_start=5054 + _CONNECTIONSETTINGS_L3._serialized_end=5170 + _CONNECTIONSETTINGS_L4._serialized_start=5172 + _CONNECTIONSETTINGS_L4._serialized_end=5263 + _CONNECTIONSETTINGS._serialized_start=5266 + _CONNECTIONSETTINGS._serialized_end=5462 + _CONNECTION._serialized_start=5465 + _CONNECTION._serialized_end=5708 + _CONNECTIONIDLIST._serialized_start=5710 + _CONNECTIONIDLIST._serialized_end=5775 + _CONNECTIONLIST._serialized_start=5777 + _CONNECTIONLIST._serialized_end=5835 + _CONNECTIONEVENT._serialized_start=5837 + _CONNECTIONEVENT._serialized_end=5931 + _ENDPOINTID._serialized_start=5934 + _ENDPOINTID._serialized_end=6064 + _ENDPOINT._serialized_start=6067 + _ENDPOINT._serialized_end=6261 + _ENDPOINTNAME._serialized_start=6263 + _ENDPOINTNAME._serialized_end=6386 + _ENDPOINTIDLIST._serialized_start=6388 + _ENDPOINTIDLIST._serialized_end=6447 + _ENDPOINTNAMELIST._serialized_start=6449 + _ENDPOINTNAMELIST._serialized_end=6514 + _CONFIGRULE_CUSTOM._serialized_start=6516 + _CONFIGRULE_CUSTOM._serialized_end=6581 + _CONFIGRULE_ACL._serialized_start=6583 + _CONFIGRULE_ACL._serialized_end=6676 + _CONFIGRULE._serialized_start=6679 + _CONFIGRULE._serialized_end=6835 + _CONSTRAINT_CUSTOM._serialized_start=6837 + _CONSTRAINT_CUSTOM._serialized_end=6907 + _CONSTRAINT_SCHEDULE._serialized_start=6909 + _CONSTRAINT_SCHEDULE._serialized_end=6978 + _GPS_POSITION._serialized_start=6980 + _GPS_POSITION._serialized_end=7031 + _LOCATION._serialized_start=7033 + _LOCATION._serialized_end=7120 + _CONSTRAINT_ENDPOINTLOCATION._serialized_start=7122 + _CONSTRAINT_ENDPOINTLOCATION._serialized_end=7230 + _CONSTRAINT_ENDPOINTPRIORITY._serialized_start=7232 + _CONSTRAINT_ENDPOINTPRIORITY._serialized_end=7321 + _CONSTRAINT_SLA_LATENCY._serialized_start=7323 + _CONSTRAINT_SLA_LATENCY._serialized_end=7371 + _CONSTRAINT_SLA_CAPACITY._serialized_start=7373 + _CONSTRAINT_SLA_CAPACITY._serialized_end=7421 + _CONSTRAINT_SLA_AVAILABILITY._serialized_start=7423 + _CONSTRAINT_SLA_AVAILABILITY._serialized_end=7522 + _CONSTRAINT_SLA_ISOLATION_LEVEL._serialized_start=7524 + _CONSTRAINT_SLA_ISOLATION_LEVEL._serialized_end=7610 + _CONSTRAINT_EXCLUSIONS._serialized_start=7613 + _CONSTRAINT_EXCLUSIONS._serialized_end=7775 + _CONSTRAINT._serialized_start=7778 + _CONSTRAINT._serialized_end=8381 + _TERAFLOWCONTROLLER._serialized_start=8383 + _TERAFLOWCONTROLLER._serialized_end=8477 + _AUTHENTICATIONRESULT._serialized_start=8479 + _AUTHENTICATIONRESULT._serialized_end=8564 + _OPTICALCONFIGID._serialized_start=8566 + _OPTICALCONFIGID._serialized_end=8611 + _OPTICALCONFIG._serialized_start=8613 + _OPTICALCONFIG._serialized_end=8696 + _OPTICALCONFIGLIST._serialized_start=8698 + _OPTICALCONFIGLIST._serialized_end=8765 + _OPTICALLINKID._serialized_start=8767 + _OPTICALLINKID._serialized_end=8824 + _FIBERID._serialized_start=8826 + _FIBERID._serialized_end=8870 + _FIBER._serialized_start=8873 + _FIBER._serialized_end=9098 + _OPTICALLINKDETAILS._serialized_start=9100 + _OPTICALLINKDETAILS._serialized_end=9200 + _OPTICALLINK._serialized_start=9202 + _OPTICALLINK._serialized_end=9326 + _CONTEXTSERVICE._serialized_start=11039 + _CONTEXTSERVICE._serialized_end=14277 +# @@protoc_insertion_point(module_scope) diff --git a/src/device/tests/qkd/unit/generated/context_pb2_grpc.py b/src/device/tests/qkd/unit/generated/context_pb2_grpc.py new file mode 100644 index 000000000..ed6e153ba --- /dev/null +++ b/src/device/tests/qkd/unit/generated/context_pb2_grpc.py @@ -0,0 +1,1849 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc + +import context_pb2 as context__pb2 + + +class ContextServiceStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.ListContextIds = channel.unary_unary( + '/context.ContextService/ListContextIds', + request_serializer=context__pb2.Empty.SerializeToString, + response_deserializer=context__pb2.ContextIdList.FromString, + ) + self.ListContexts = channel.unary_unary( + '/context.ContextService/ListContexts', + request_serializer=context__pb2.Empty.SerializeToString, + response_deserializer=context__pb2.ContextList.FromString, + ) + self.GetContext = channel.unary_unary( + '/context.ContextService/GetContext', + request_serializer=context__pb2.ContextId.SerializeToString, + response_deserializer=context__pb2.Context.FromString, + ) + self.SetContext = channel.unary_unary( + '/context.ContextService/SetContext', + request_serializer=context__pb2.Context.SerializeToString, + response_deserializer=context__pb2.ContextId.FromString, + ) + self.RemoveContext = channel.unary_unary( + '/context.ContextService/RemoveContext', + request_serializer=context__pb2.ContextId.SerializeToString, + response_deserializer=context__pb2.Empty.FromString, + ) + self.GetContextEvents = channel.unary_stream( + '/context.ContextService/GetContextEvents', + request_serializer=context__pb2.Empty.SerializeToString, + response_deserializer=context__pb2.ContextEvent.FromString, + ) + self.ListTopologyIds = channel.unary_unary( + '/context.ContextService/ListTopologyIds', + request_serializer=context__pb2.ContextId.SerializeToString, + response_deserializer=context__pb2.TopologyIdList.FromString, + ) + self.ListTopologies = channel.unary_unary( + '/context.ContextService/ListTopologies', + request_serializer=context__pb2.ContextId.SerializeToString, + response_deserializer=context__pb2.TopologyList.FromString, + ) + self.GetTopology = channel.unary_unary( + '/context.ContextService/GetTopology', + request_serializer=context__pb2.TopologyId.SerializeToString, + response_deserializer=context__pb2.Topology.FromString, + ) + self.GetTopologyDetails = channel.unary_unary( + '/context.ContextService/GetTopologyDetails', + request_serializer=context__pb2.TopologyId.SerializeToString, + response_deserializer=context__pb2.TopologyDetails.FromString, + ) + self.SetTopology = channel.unary_unary( + '/context.ContextService/SetTopology', + request_serializer=context__pb2.Topology.SerializeToString, + response_deserializer=context__pb2.TopologyId.FromString, + ) + self.RemoveTopology = channel.unary_unary( + '/context.ContextService/RemoveTopology', + request_serializer=context__pb2.TopologyId.SerializeToString, + response_deserializer=context__pb2.Empty.FromString, + ) + self.GetTopologyEvents = channel.unary_stream( + '/context.ContextService/GetTopologyEvents', + request_serializer=context__pb2.Empty.SerializeToString, + response_deserializer=context__pb2.TopologyEvent.FromString, + ) + self.ListDeviceIds = channel.unary_unary( + '/context.ContextService/ListDeviceIds', + request_serializer=context__pb2.Empty.SerializeToString, + response_deserializer=context__pb2.DeviceIdList.FromString, + ) + self.ListDevices = channel.unary_unary( + '/context.ContextService/ListDevices', + request_serializer=context__pb2.Empty.SerializeToString, + response_deserializer=context__pb2.DeviceList.FromString, + ) + self.GetDevice = channel.unary_unary( + '/context.ContextService/GetDevice', + request_serializer=context__pb2.DeviceId.SerializeToString, + response_deserializer=context__pb2.Device.FromString, + ) + self.SetDevice = channel.unary_unary( + '/context.ContextService/SetDevice', + request_serializer=context__pb2.Device.SerializeToString, + response_deserializer=context__pb2.DeviceId.FromString, + ) + self.RemoveDevice = channel.unary_unary( + '/context.ContextService/RemoveDevice', + request_serializer=context__pb2.DeviceId.SerializeToString, + response_deserializer=context__pb2.Empty.FromString, + ) + self.GetDeviceEvents = channel.unary_stream( + '/context.ContextService/GetDeviceEvents', + request_serializer=context__pb2.Empty.SerializeToString, + response_deserializer=context__pb2.DeviceEvent.FromString, + ) + self.SelectDevice = channel.unary_unary( + '/context.ContextService/SelectDevice', + request_serializer=context__pb2.DeviceFilter.SerializeToString, + response_deserializer=context__pb2.DeviceList.FromString, + ) + self.ListEndPointNames = channel.unary_unary( + '/context.ContextService/ListEndPointNames', + request_serializer=context__pb2.EndPointIdList.SerializeToString, + response_deserializer=context__pb2.EndPointNameList.FromString, + ) + self.ListLinkIds = channel.unary_unary( + '/context.ContextService/ListLinkIds', + request_serializer=context__pb2.Empty.SerializeToString, + response_deserializer=context__pb2.LinkIdList.FromString, + ) + self.ListLinks = channel.unary_unary( + '/context.ContextService/ListLinks', + request_serializer=context__pb2.Empty.SerializeToString, + response_deserializer=context__pb2.LinkList.FromString, + ) + self.GetLink = channel.unary_unary( + '/context.ContextService/GetLink', + request_serializer=context__pb2.LinkId.SerializeToString, + response_deserializer=context__pb2.Link.FromString, + ) + self.SetLink = channel.unary_unary( + '/context.ContextService/SetLink', + request_serializer=context__pb2.Link.SerializeToString, + response_deserializer=context__pb2.LinkId.FromString, + ) + self.RemoveLink = channel.unary_unary( + '/context.ContextService/RemoveLink', + request_serializer=context__pb2.LinkId.SerializeToString, + response_deserializer=context__pb2.Empty.FromString, + ) + self.GetLinkEvents = channel.unary_stream( + '/context.ContextService/GetLinkEvents', + request_serializer=context__pb2.Empty.SerializeToString, + response_deserializer=context__pb2.LinkEvent.FromString, + ) + self.ListServiceIds = channel.unary_unary( + '/context.ContextService/ListServiceIds', + request_serializer=context__pb2.ContextId.SerializeToString, + response_deserializer=context__pb2.ServiceIdList.FromString, + ) + self.ListServices = channel.unary_unary( + '/context.ContextService/ListServices', + request_serializer=context__pb2.ContextId.SerializeToString, + response_deserializer=context__pb2.ServiceList.FromString, + ) + self.GetService = channel.unary_unary( + '/context.ContextService/GetService', + request_serializer=context__pb2.ServiceId.SerializeToString, + response_deserializer=context__pb2.Service.FromString, + ) + self.SetService = channel.unary_unary( + '/context.ContextService/SetService', + request_serializer=context__pb2.Service.SerializeToString, + response_deserializer=context__pb2.ServiceId.FromString, + ) + self.UnsetService = channel.unary_unary( + '/context.ContextService/UnsetService', + request_serializer=context__pb2.Service.SerializeToString, + response_deserializer=context__pb2.ServiceId.FromString, + ) + self.RemoveService = channel.unary_unary( + '/context.ContextService/RemoveService', + request_serializer=context__pb2.ServiceId.SerializeToString, + response_deserializer=context__pb2.Empty.FromString, + ) + self.GetServiceEvents = channel.unary_stream( + '/context.ContextService/GetServiceEvents', + request_serializer=context__pb2.Empty.SerializeToString, + response_deserializer=context__pb2.ServiceEvent.FromString, + ) + self.SelectService = channel.unary_unary( + '/context.ContextService/SelectService', + request_serializer=context__pb2.ServiceFilter.SerializeToString, + response_deserializer=context__pb2.ServiceList.FromString, + ) + self.ListSliceIds = channel.unary_unary( + '/context.ContextService/ListSliceIds', + request_serializer=context__pb2.ContextId.SerializeToString, + response_deserializer=context__pb2.SliceIdList.FromString, + ) + self.ListSlices = channel.unary_unary( + '/context.ContextService/ListSlices', + request_serializer=context__pb2.ContextId.SerializeToString, + response_deserializer=context__pb2.SliceList.FromString, + ) + self.GetSlice = channel.unary_unary( + '/context.ContextService/GetSlice', + request_serializer=context__pb2.SliceId.SerializeToString, + response_deserializer=context__pb2.Slice.FromString, + ) + self.SetSlice = channel.unary_unary( + '/context.ContextService/SetSlice', + request_serializer=context__pb2.Slice.SerializeToString, + response_deserializer=context__pb2.SliceId.FromString, + ) + self.UnsetSlice = channel.unary_unary( + '/context.ContextService/UnsetSlice', + request_serializer=context__pb2.Slice.SerializeToString, + response_deserializer=context__pb2.SliceId.FromString, + ) + self.RemoveSlice = channel.unary_unary( + '/context.ContextService/RemoveSlice', + request_serializer=context__pb2.SliceId.SerializeToString, + response_deserializer=context__pb2.Empty.FromString, + ) + self.GetSliceEvents = channel.unary_stream( + '/context.ContextService/GetSliceEvents', + request_serializer=context__pb2.Empty.SerializeToString, + response_deserializer=context__pb2.SliceEvent.FromString, + ) + self.SelectSlice = channel.unary_unary( + '/context.ContextService/SelectSlice', + request_serializer=context__pb2.SliceFilter.SerializeToString, + response_deserializer=context__pb2.SliceList.FromString, + ) + self.ListConnectionIds = channel.unary_unary( + '/context.ContextService/ListConnectionIds', + request_serializer=context__pb2.ServiceId.SerializeToString, + response_deserializer=context__pb2.ConnectionIdList.FromString, + ) + self.ListConnections = channel.unary_unary( + '/context.ContextService/ListConnections', + request_serializer=context__pb2.ServiceId.SerializeToString, + response_deserializer=context__pb2.ConnectionList.FromString, + ) + self.GetConnection = channel.unary_unary( + '/context.ContextService/GetConnection', + request_serializer=context__pb2.ConnectionId.SerializeToString, + response_deserializer=context__pb2.Connection.FromString, + ) + self.SetConnection = channel.unary_unary( + '/context.ContextService/SetConnection', + request_serializer=context__pb2.Connection.SerializeToString, + response_deserializer=context__pb2.ConnectionId.FromString, + ) + self.RemoveConnection = channel.unary_unary( + '/context.ContextService/RemoveConnection', + request_serializer=context__pb2.ConnectionId.SerializeToString, + response_deserializer=context__pb2.Empty.FromString, + ) + self.GetConnectionEvents = channel.unary_stream( + '/context.ContextService/GetConnectionEvents', + request_serializer=context__pb2.Empty.SerializeToString, + response_deserializer=context__pb2.ConnectionEvent.FromString, + ) + self.GetOpticalConfig = channel.unary_unary( + '/context.ContextService/GetOpticalConfig', + request_serializer=context__pb2.Empty.SerializeToString, + response_deserializer=context__pb2.OpticalConfigList.FromString, + ) + self.SetOpticalConfig = channel.unary_unary( + '/context.ContextService/SetOpticalConfig', + request_serializer=context__pb2.OpticalConfig.SerializeToString, + response_deserializer=context__pb2.OpticalConfigId.FromString, + ) + self.SelectOpticalConfig = channel.unary_unary( + '/context.ContextService/SelectOpticalConfig', + request_serializer=context__pb2.OpticalConfigId.SerializeToString, + response_deserializer=context__pb2.OpticalConfig.FromString, + ) + self.SetOpticalLink = channel.unary_unary( + '/context.ContextService/SetOpticalLink', + request_serializer=context__pb2.OpticalLink.SerializeToString, + response_deserializer=context__pb2.Empty.FromString, + ) + self.GetOpticalLink = channel.unary_unary( + '/context.ContextService/GetOpticalLink', + request_serializer=context__pb2.OpticalLinkId.SerializeToString, + response_deserializer=context__pb2.OpticalLink.FromString, + ) + self.GetFiber = channel.unary_unary( + '/context.ContextService/GetFiber', + request_serializer=context__pb2.FiberId.SerializeToString, + response_deserializer=context__pb2.Fiber.FromString, + ) + + +class ContextServiceServicer(object): + """Missing associated documentation comment in .proto file.""" + + def ListContextIds(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListContexts(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetContext(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetContext(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RemoveContext(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetContextEvents(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListTopologyIds(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListTopologies(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetTopology(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetTopologyDetails(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetTopology(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RemoveTopology(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetTopologyEvents(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListDeviceIds(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListDevices(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetDevice(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetDevice(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RemoveDevice(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetDeviceEvents(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SelectDevice(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListEndPointNames(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListLinkIds(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListLinks(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetLink(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetLink(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RemoveLink(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetLinkEvents(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListServiceIds(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListServices(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetService(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetService(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def UnsetService(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RemoveService(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetServiceEvents(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SelectService(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListSliceIds(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListSlices(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetSlice(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetSlice(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def UnsetSlice(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RemoveSlice(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetSliceEvents(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SelectSlice(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListConnectionIds(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ListConnections(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetConnection(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetConnection(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def RemoveConnection(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetConnectionEvents(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetOpticalConfig(self, request, context): + """------------------------------ Experimental ----------------------------- + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetOpticalConfig(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SelectOpticalConfig(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SetOpticalLink(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetOpticalLink(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetFiber(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_ContextServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'ListContextIds': grpc.unary_unary_rpc_method_handler( + servicer.ListContextIds, + request_deserializer=context__pb2.Empty.FromString, + response_serializer=context__pb2.ContextIdList.SerializeToString, + ), + 'ListContexts': grpc.unary_unary_rpc_method_handler( + servicer.ListContexts, + request_deserializer=context__pb2.Empty.FromString, + response_serializer=context__pb2.ContextList.SerializeToString, + ), + 'GetContext': grpc.unary_unary_rpc_method_handler( + servicer.GetContext, + request_deserializer=context__pb2.ContextId.FromString, + response_serializer=context__pb2.Context.SerializeToString, + ), + 'SetContext': grpc.unary_unary_rpc_method_handler( + servicer.SetContext, + request_deserializer=context__pb2.Context.FromString, + response_serializer=context__pb2.ContextId.SerializeToString, + ), + 'RemoveContext': grpc.unary_unary_rpc_method_handler( + servicer.RemoveContext, + request_deserializer=context__pb2.ContextId.FromString, + response_serializer=context__pb2.Empty.SerializeToString, + ), + 'GetContextEvents': grpc.unary_stream_rpc_method_handler( + servicer.GetContextEvents, + request_deserializer=context__pb2.Empty.FromString, + response_serializer=context__pb2.ContextEvent.SerializeToString, + ), + 'ListTopologyIds': grpc.unary_unary_rpc_method_handler( + servicer.ListTopologyIds, + request_deserializer=context__pb2.ContextId.FromString, + response_serializer=context__pb2.TopologyIdList.SerializeToString, + ), + 'ListTopologies': grpc.unary_unary_rpc_method_handler( + servicer.ListTopologies, + request_deserializer=context__pb2.ContextId.FromString, + response_serializer=context__pb2.TopologyList.SerializeToString, + ), + 'GetTopology': grpc.unary_unary_rpc_method_handler( + servicer.GetTopology, + request_deserializer=context__pb2.TopologyId.FromString, + response_serializer=context__pb2.Topology.SerializeToString, + ), + 'GetTopologyDetails': grpc.unary_unary_rpc_method_handler( + servicer.GetTopologyDetails, + request_deserializer=context__pb2.TopologyId.FromString, + response_serializer=context__pb2.TopologyDetails.SerializeToString, + ), + 'SetTopology': grpc.unary_unary_rpc_method_handler( + servicer.SetTopology, + request_deserializer=context__pb2.Topology.FromString, + response_serializer=context__pb2.TopologyId.SerializeToString, + ), + 'RemoveTopology': grpc.unary_unary_rpc_method_handler( + servicer.RemoveTopology, + request_deserializer=context__pb2.TopologyId.FromString, + response_serializer=context__pb2.Empty.SerializeToString, + ), + 'GetTopologyEvents': grpc.unary_stream_rpc_method_handler( + servicer.GetTopologyEvents, + request_deserializer=context__pb2.Empty.FromString, + response_serializer=context__pb2.TopologyEvent.SerializeToString, + ), + 'ListDeviceIds': grpc.unary_unary_rpc_method_handler( + servicer.ListDeviceIds, + request_deserializer=context__pb2.Empty.FromString, + response_serializer=context__pb2.DeviceIdList.SerializeToString, + ), + 'ListDevices': grpc.unary_unary_rpc_method_handler( + servicer.ListDevices, + request_deserializer=context__pb2.Empty.FromString, + response_serializer=context__pb2.DeviceList.SerializeToString, + ), + 'GetDevice': grpc.unary_unary_rpc_method_handler( + servicer.GetDevice, + request_deserializer=context__pb2.DeviceId.FromString, + response_serializer=context__pb2.Device.SerializeToString, + ), + 'SetDevice': grpc.unary_unary_rpc_method_handler( + servicer.SetDevice, + request_deserializer=context__pb2.Device.FromString, + response_serializer=context__pb2.DeviceId.SerializeToString, + ), + 'RemoveDevice': grpc.unary_unary_rpc_method_handler( + servicer.RemoveDevice, + request_deserializer=context__pb2.DeviceId.FromString, + response_serializer=context__pb2.Empty.SerializeToString, + ), + 'GetDeviceEvents': grpc.unary_stream_rpc_method_handler( + servicer.GetDeviceEvents, + request_deserializer=context__pb2.Empty.FromString, + response_serializer=context__pb2.DeviceEvent.SerializeToString, + ), + 'SelectDevice': grpc.unary_unary_rpc_method_handler( + servicer.SelectDevice, + request_deserializer=context__pb2.DeviceFilter.FromString, + response_serializer=context__pb2.DeviceList.SerializeToString, + ), + 'ListEndPointNames': grpc.unary_unary_rpc_method_handler( + servicer.ListEndPointNames, + request_deserializer=context__pb2.EndPointIdList.FromString, + response_serializer=context__pb2.EndPointNameList.SerializeToString, + ), + 'ListLinkIds': grpc.unary_unary_rpc_method_handler( + servicer.ListLinkIds, + request_deserializer=context__pb2.Empty.FromString, + response_serializer=context__pb2.LinkIdList.SerializeToString, + ), + 'ListLinks': grpc.unary_unary_rpc_method_handler( + servicer.ListLinks, + request_deserializer=context__pb2.Empty.FromString, + response_serializer=context__pb2.LinkList.SerializeToString, + ), + 'GetLink': grpc.unary_unary_rpc_method_handler( + servicer.GetLink, + request_deserializer=context__pb2.LinkId.FromString, + response_serializer=context__pb2.Link.SerializeToString, + ), + 'SetLink': grpc.unary_unary_rpc_method_handler( + servicer.SetLink, + request_deserializer=context__pb2.Link.FromString, + response_serializer=context__pb2.LinkId.SerializeToString, + ), + 'RemoveLink': grpc.unary_unary_rpc_method_handler( + servicer.RemoveLink, + request_deserializer=context__pb2.LinkId.FromString, + response_serializer=context__pb2.Empty.SerializeToString, + ), + 'GetLinkEvents': grpc.unary_stream_rpc_method_handler( + servicer.GetLinkEvents, + request_deserializer=context__pb2.Empty.FromString, + response_serializer=context__pb2.LinkEvent.SerializeToString, + ), + 'ListServiceIds': grpc.unary_unary_rpc_method_handler( + servicer.ListServiceIds, + request_deserializer=context__pb2.ContextId.FromString, + response_serializer=context__pb2.ServiceIdList.SerializeToString, + ), + 'ListServices': grpc.unary_unary_rpc_method_handler( + servicer.ListServices, + request_deserializer=context__pb2.ContextId.FromString, + response_serializer=context__pb2.ServiceList.SerializeToString, + ), + 'GetService': grpc.unary_unary_rpc_method_handler( + servicer.GetService, + request_deserializer=context__pb2.ServiceId.FromString, + response_serializer=context__pb2.Service.SerializeToString, + ), + 'SetService': grpc.unary_unary_rpc_method_handler( + servicer.SetService, + request_deserializer=context__pb2.Service.FromString, + response_serializer=context__pb2.ServiceId.SerializeToString, + ), + 'UnsetService': grpc.unary_unary_rpc_method_handler( + servicer.UnsetService, + request_deserializer=context__pb2.Service.FromString, + response_serializer=context__pb2.ServiceId.SerializeToString, + ), + 'RemoveService': grpc.unary_unary_rpc_method_handler( + servicer.RemoveService, + request_deserializer=context__pb2.ServiceId.FromString, + response_serializer=context__pb2.Empty.SerializeToString, + ), + 'GetServiceEvents': grpc.unary_stream_rpc_method_handler( + servicer.GetServiceEvents, + request_deserializer=context__pb2.Empty.FromString, + response_serializer=context__pb2.ServiceEvent.SerializeToString, + ), + 'SelectService': grpc.unary_unary_rpc_method_handler( + servicer.SelectService, + request_deserializer=context__pb2.ServiceFilter.FromString, + response_serializer=context__pb2.ServiceList.SerializeToString, + ), + 'ListSliceIds': grpc.unary_unary_rpc_method_handler( + servicer.ListSliceIds, + request_deserializer=context__pb2.ContextId.FromString, + response_serializer=context__pb2.SliceIdList.SerializeToString, + ), + 'ListSlices': grpc.unary_unary_rpc_method_handler( + servicer.ListSlices, + request_deserializer=context__pb2.ContextId.FromString, + response_serializer=context__pb2.SliceList.SerializeToString, + ), + 'GetSlice': grpc.unary_unary_rpc_method_handler( + servicer.GetSlice, + request_deserializer=context__pb2.SliceId.FromString, + response_serializer=context__pb2.Slice.SerializeToString, + ), + 'SetSlice': grpc.unary_unary_rpc_method_handler( + servicer.SetSlice, + request_deserializer=context__pb2.Slice.FromString, + response_serializer=context__pb2.SliceId.SerializeToString, + ), + 'UnsetSlice': grpc.unary_unary_rpc_method_handler( + servicer.UnsetSlice, + request_deserializer=context__pb2.Slice.FromString, + response_serializer=context__pb2.SliceId.SerializeToString, + ), + 'RemoveSlice': grpc.unary_unary_rpc_method_handler( + servicer.RemoveSlice, + request_deserializer=context__pb2.SliceId.FromString, + response_serializer=context__pb2.Empty.SerializeToString, + ), + 'GetSliceEvents': grpc.unary_stream_rpc_method_handler( + servicer.GetSliceEvents, + request_deserializer=context__pb2.Empty.FromString, + response_serializer=context__pb2.SliceEvent.SerializeToString, + ), + 'SelectSlice': grpc.unary_unary_rpc_method_handler( + servicer.SelectSlice, + request_deserializer=context__pb2.SliceFilter.FromString, + response_serializer=context__pb2.SliceList.SerializeToString, + ), + 'ListConnectionIds': grpc.unary_unary_rpc_method_handler( + servicer.ListConnectionIds, + request_deserializer=context__pb2.ServiceId.FromString, + response_serializer=context__pb2.ConnectionIdList.SerializeToString, + ), + 'ListConnections': grpc.unary_unary_rpc_method_handler( + servicer.ListConnections, + request_deserializer=context__pb2.ServiceId.FromString, + response_serializer=context__pb2.ConnectionList.SerializeToString, + ), + 'GetConnection': grpc.unary_unary_rpc_method_handler( + servicer.GetConnection, + request_deserializer=context__pb2.ConnectionId.FromString, + response_serializer=context__pb2.Connection.SerializeToString, + ), + 'SetConnection': grpc.unary_unary_rpc_method_handler( + servicer.SetConnection, + request_deserializer=context__pb2.Connection.FromString, + response_serializer=context__pb2.ConnectionId.SerializeToString, + ), + 'RemoveConnection': grpc.unary_unary_rpc_method_handler( + servicer.RemoveConnection, + request_deserializer=context__pb2.ConnectionId.FromString, + response_serializer=context__pb2.Empty.SerializeToString, + ), + 'GetConnectionEvents': grpc.unary_stream_rpc_method_handler( + servicer.GetConnectionEvents, + request_deserializer=context__pb2.Empty.FromString, + response_serializer=context__pb2.ConnectionEvent.SerializeToString, + ), + 'GetOpticalConfig': grpc.unary_unary_rpc_method_handler( + servicer.GetOpticalConfig, + request_deserializer=context__pb2.Empty.FromString, + response_serializer=context__pb2.OpticalConfigList.SerializeToString, + ), + 'SetOpticalConfig': grpc.unary_unary_rpc_method_handler( + servicer.SetOpticalConfig, + request_deserializer=context__pb2.OpticalConfig.FromString, + response_serializer=context__pb2.OpticalConfigId.SerializeToString, + ), + 'SelectOpticalConfig': grpc.unary_unary_rpc_method_handler( + servicer.SelectOpticalConfig, + request_deserializer=context__pb2.OpticalConfigId.FromString, + response_serializer=context__pb2.OpticalConfig.SerializeToString, + ), + 'SetOpticalLink': grpc.unary_unary_rpc_method_handler( + servicer.SetOpticalLink, + request_deserializer=context__pb2.OpticalLink.FromString, + response_serializer=context__pb2.Empty.SerializeToString, + ), + 'GetOpticalLink': grpc.unary_unary_rpc_method_handler( + servicer.GetOpticalLink, + request_deserializer=context__pb2.OpticalLinkId.FromString, + response_serializer=context__pb2.OpticalLink.SerializeToString, + ), + 'GetFiber': grpc.unary_unary_rpc_method_handler( + servicer.GetFiber, + request_deserializer=context__pb2.FiberId.FromString, + response_serializer=context__pb2.Fiber.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'context.ContextService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + # This class is part of an EXPERIMENTAL API. +class ContextService(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def ListContextIds(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListContextIds', + context__pb2.Empty.SerializeToString, + context__pb2.ContextIdList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListContexts(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListContexts', + context__pb2.Empty.SerializeToString, + context__pb2.ContextList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetContext(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetContext', + context__pb2.ContextId.SerializeToString, + context__pb2.Context.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SetContext(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetContext', + context__pb2.Context.SerializeToString, + context__pb2.ContextId.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RemoveContext(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/RemoveContext', + context__pb2.ContextId.SerializeToString, + context__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetContextEvents(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream(request, target, '/context.ContextService/GetContextEvents', + context__pb2.Empty.SerializeToString, + context__pb2.ContextEvent.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListTopologyIds(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListTopologyIds', + context__pb2.ContextId.SerializeToString, + context__pb2.TopologyIdList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListTopologies(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListTopologies', + context__pb2.ContextId.SerializeToString, + context__pb2.TopologyList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetTopology(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetTopology', + context__pb2.TopologyId.SerializeToString, + context__pb2.Topology.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetTopologyDetails(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetTopologyDetails', + context__pb2.TopologyId.SerializeToString, + context__pb2.TopologyDetails.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SetTopology(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetTopology', + context__pb2.Topology.SerializeToString, + context__pb2.TopologyId.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RemoveTopology(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/RemoveTopology', + context__pb2.TopologyId.SerializeToString, + context__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetTopologyEvents(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream(request, target, '/context.ContextService/GetTopologyEvents', + context__pb2.Empty.SerializeToString, + context__pb2.TopologyEvent.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListDeviceIds(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListDeviceIds', + context__pb2.Empty.SerializeToString, + context__pb2.DeviceIdList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListDevices(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListDevices', + context__pb2.Empty.SerializeToString, + context__pb2.DeviceList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetDevice(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetDevice', + context__pb2.DeviceId.SerializeToString, + context__pb2.Device.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SetDevice(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetDevice', + context__pb2.Device.SerializeToString, + context__pb2.DeviceId.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RemoveDevice(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/RemoveDevice', + context__pb2.DeviceId.SerializeToString, + context__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetDeviceEvents(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream(request, target, '/context.ContextService/GetDeviceEvents', + context__pb2.Empty.SerializeToString, + context__pb2.DeviceEvent.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SelectDevice(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/SelectDevice', + context__pb2.DeviceFilter.SerializeToString, + context__pb2.DeviceList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListEndPointNames(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListEndPointNames', + context__pb2.EndPointIdList.SerializeToString, + context__pb2.EndPointNameList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListLinkIds(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListLinkIds', + context__pb2.Empty.SerializeToString, + context__pb2.LinkIdList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListLinks(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListLinks', + context__pb2.Empty.SerializeToString, + context__pb2.LinkList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetLink(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetLink', + context__pb2.LinkId.SerializeToString, + context__pb2.Link.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SetLink(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetLink', + context__pb2.Link.SerializeToString, + context__pb2.LinkId.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RemoveLink(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/RemoveLink', + context__pb2.LinkId.SerializeToString, + context__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetLinkEvents(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream(request, target, '/context.ContextService/GetLinkEvents', + context__pb2.Empty.SerializeToString, + context__pb2.LinkEvent.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListServiceIds(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListServiceIds', + context__pb2.ContextId.SerializeToString, + context__pb2.ServiceIdList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListServices(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListServices', + context__pb2.ContextId.SerializeToString, + context__pb2.ServiceList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetService(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetService', + context__pb2.ServiceId.SerializeToString, + context__pb2.Service.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SetService(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetService', + context__pb2.Service.SerializeToString, + context__pb2.ServiceId.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def UnsetService(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/UnsetService', + context__pb2.Service.SerializeToString, + context__pb2.ServiceId.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RemoveService(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/RemoveService', + context__pb2.ServiceId.SerializeToString, + context__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetServiceEvents(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream(request, target, '/context.ContextService/GetServiceEvents', + context__pb2.Empty.SerializeToString, + context__pb2.ServiceEvent.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SelectService(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/SelectService', + context__pb2.ServiceFilter.SerializeToString, + context__pb2.ServiceList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListSliceIds(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListSliceIds', + context__pb2.ContextId.SerializeToString, + context__pb2.SliceIdList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListSlices(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListSlices', + context__pb2.ContextId.SerializeToString, + context__pb2.SliceList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetSlice(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetSlice', + context__pb2.SliceId.SerializeToString, + context__pb2.Slice.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SetSlice(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetSlice', + context__pb2.Slice.SerializeToString, + context__pb2.SliceId.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def UnsetSlice(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/UnsetSlice', + context__pb2.Slice.SerializeToString, + context__pb2.SliceId.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RemoveSlice(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/RemoveSlice', + context__pb2.SliceId.SerializeToString, + context__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetSliceEvents(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream(request, target, '/context.ContextService/GetSliceEvents', + context__pb2.Empty.SerializeToString, + context__pb2.SliceEvent.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SelectSlice(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/SelectSlice', + context__pb2.SliceFilter.SerializeToString, + context__pb2.SliceList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListConnectionIds(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListConnectionIds', + context__pb2.ServiceId.SerializeToString, + context__pb2.ConnectionIdList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def ListConnections(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListConnections', + context__pb2.ServiceId.SerializeToString, + context__pb2.ConnectionList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetConnection(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetConnection', + context__pb2.ConnectionId.SerializeToString, + context__pb2.Connection.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SetConnection(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetConnection', + context__pb2.Connection.SerializeToString, + context__pb2.ConnectionId.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def RemoveConnection(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/RemoveConnection', + context__pb2.ConnectionId.SerializeToString, + context__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetConnectionEvents(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream(request, target, '/context.ContextService/GetConnectionEvents', + context__pb2.Empty.SerializeToString, + context__pb2.ConnectionEvent.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetOpticalConfig(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetOpticalConfig', + context__pb2.Empty.SerializeToString, + context__pb2.OpticalConfigList.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SetOpticalConfig(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetOpticalConfig', + context__pb2.OpticalConfig.SerializeToString, + context__pb2.OpticalConfigId.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SelectOpticalConfig(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/SelectOpticalConfig', + context__pb2.OpticalConfigId.SerializeToString, + context__pb2.OpticalConfig.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def SetOpticalLink(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetOpticalLink', + context__pb2.OpticalLink.SerializeToString, + context__pb2.Empty.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetOpticalLink(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetOpticalLink', + context__pb2.OpticalLinkId.SerializeToString, + context__pb2.OpticalLink.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetFiber(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetFiber', + context__pb2.FiberId.SerializeToString, + context__pb2.Fiber.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/src/device/tests/qkd/unit/retrieve_device_mock_information.py b/src/device/tests/qkd/unit/retrieve_device_mock_information.py new file mode 100644 index 000000000..20074924b --- /dev/null +++ b/src/device/tests/qkd/unit/retrieve_device_mock_information.py @@ -0,0 +1,70 @@ +import unittest +from unittest.mock import patch, MagicMock +from context.client.ContextClient import ContextClient +from common.proto.context_pb2 import Empty + +def retrieve_descriptor_information(): + client = ContextClient() + contexts = client.ListContexts(Empty()) + topologies = client.ListTopologies(contexts.contexts[0].context_id) + devices = client.ListDevices(Empty()) + links = client.ListLinks(Empty()) + + return { + 'contexts': contexts, + 'topologies': topologies, + 'devices': devices, + 'links': links, + } + +class TestRetrieveDescriptorInformation(unittest.TestCase): + + @patch('context.client.ContextClient.ContextClient') + def test_retrieve_descriptor_information(self, MockContextClient): + # Setup mock responses + mock_client = MagicMock() + MockContextClient.return_value = mock_client + + # Mocking ListContexts response + context_mock = MagicMock() + context_mock.contexts = [MagicMock()] + context_mock.contexts[0].context_id.context_uuid.uuid = "admin" + mock_client.ListContexts.return_value = context_mock + + # Mocking ListTopologies response + topology_mock = MagicMock() + topology_mock.topologies = [MagicMock()] + topology_mock.topologies[0].topology_id.topology_uuid.uuid = "admin" + mock_client.ListTopologies.return_value = topology_mock + + # Mocking ListDevices response + device_mock = MagicMock() + device_mock.devices = [MagicMock()] + device_mock.devices[0].device_id.device_uuid.uuid = "QKD1" + device_mock.devices[0].device_type = "qkd-node" + device_mock.devices[0].device_operational_status = 0 + device_mock.devices[0].device_drivers = [12] + mock_client.ListDevices.return_value = device_mock + + # Mocking ListLinks response + link_mock = MagicMock() + link_mock.links = [MagicMock()] + link_mock.links[0].link_id.link_uuid.uuid = "QKD1/10.211.36.220:1001==QKD2/10.211.36.220:2001" + mock_client.ListLinks.return_value = link_mock + + # Call the function and verify + result = retrieve_descriptor_information() + + mock_client.ListContexts.assert_called_once_with(Empty()) + mock_client.ListTopologies.assert_called_once_with(context_mock.contexts[0].context_id) + mock_client.ListDevices.assert_called_once_with(Empty()) + mock_client.ListLinks.assert_called_once_with(Empty()) + + # Assertions to verify the expected structure + self.assertEqual(result['contexts'].contexts[0].context_id.context_uuid.uuid, "admin") + self.assertEqual(result['topologies'].topologies[0].topology_id.topology_uuid.uuid, "admin") + self.assertEqual(result['devices'].devices[0].device_id.device_uuid.uuid, "QKD1") + self.assertEqual(result['links'].links[0].link_id.link_uuid.uuid, "QKD1/10.211.36.220:1001==QKD2/10.211.36.220:2001") + +if __name__ == "__main__": + unittest.main() diff --git a/src/device/tests/qkd/unit/retrieve_qkd_information.py b/src/device/tests/qkd/unit/retrieve_qkd_information.py new file mode 100644 index 000000000..10db6a370 --- /dev/null +++ b/src/device/tests/qkd/unit/retrieve_qkd_information.py @@ -0,0 +1,348 @@ +import grpc +from common.proto.context_pb2 import Empty, ContextId, TopologyId, Uuid +from common.proto.context_pb2_grpc import ContextServiceStub +import unittest +from unittest.mock import patch, MagicMock + +def get_context_topology_info(): + # Establish a gRPC channel + channel = grpc.insecure_channel('10.152.183.77:1010') # Update with the correct IP and port + stub = ContextServiceStub(channel) + + # Retrieve the context information + context_list = stub.ListContexts(Empty()) + contexts_info = [] + for context in context_list.contexts: + context_info = { + 'context_id': context.context_id.context_uuid.uuid, + 'context_name': context.name, + 'topologies': [] + } + + # Retrieve topology information for each context + topology_list = stub.ListTopologies(context.context_id) + for topology in topology_list.topologies: + topology_info = { + 'topology_id': topology.topology_id.topology_uuid.uuid, + 'topology_name': topology.name, + 'devices': [] + } + + # Retrieve detailed topology information + topology_details = stub.GetTopologyDetails(topology.topology_id) + for device in topology_details.devices: + device_info = { + 'device_id': device.device_id.device_uuid.uuid, + 'device_name': device.name, + 'device_type': device.device_type, + 'status': device.device_operational_status, + 'drivers': [driver for driver in device.device_drivers], + 'endpoints': [{ + 'uuid': endpoint.endpoint_id.endpoint_uuid.uuid, + 'name': endpoint.name, + 'type': endpoint.endpoint_type, + 'location': endpoint.endpoint_location + } for endpoint in device.device_endpoints], + 'configurations': [{ + 'key': config.custom.resource_key, + 'value': config.custom.resource_value + } for config in device.device_config.config_rules], + 'interfaces': [{ + 'id': interface.qkdi_id, + 'enabled': interface.enabled, + 'name': interface.name, + 'att_point': interface.qkdi_att_point, + 'capabilities': interface.qkdi_capabilities + } for interface in device.qkd_interfaces.qkd_interface], + 'applications': [{ + 'app_id': app.app_id, + 'app_qos': app.app_qos, + 'app_statistics': app.app_statistics, + 'backing_qkdl_id': app.backing_qkdl_id, + 'client_app_id': app.client_app_id + } for app in device.qkd_applications.qkd_app] + } + topology_info['devices'].append(device_info) + context_info['topologies'].append(topology_info) + contexts_info.append(context_info) + + return contexts_info + +def get_detailed_device_info(): + context_info = get_context_topology_info() + detailed_info = [] + for context in context_info: + if context['context_name'] == 'admin': + for topology in context['topologies']: + if topology['topology_name'] == 'admin': + detailed_info.extend(topology['devices']) + print("Detailed Device Info:", detailed_info) # Print the detailed device information + return detailed_info + + +class TestRetrieveQKDInformation(unittest.TestCase): + + @patch('retrieve_qkd_information.ContextServiceStub') + def test_get_detailed_device_info(self, MockContextServiceStub): + # Mocking the gRPC channel and stubs + mock_stub = MagicMock() + MockContextServiceStub.return_value = mock_stub + + # Create a mock response for ListContexts + context_id = ContextId(context_uuid=Uuid(uuid="43813baf-195e-5da6-af20-b3d0922e71a7")) + context_response = MagicMock() + mock_context = MagicMock() + mock_context.context_id = context_id + mock_context.name = "admin" + context_response.contexts = [mock_context] + + # Create a mock response for ListTopologies + topology_id = TopologyId(topology_uuid=Uuid(uuid="c76135e3-24a8-5e92-9bed-c3c9139359c8")) + topology_response = MagicMock() + mock_topology = MagicMock() + mock_topology.topology_id = topology_id + mock_topology.name = "admin" + topology_response.topologies = [mock_topology] + + # Create a mock response for GetTopologyDetails + device1 = MagicMock() + device1.device_id.device_uuid.uuid = "40e6c9e2-fdc8-5802-8361-413286c03494" + device1.name = "QKD2" + device1.device_type = "qkd-node" + device1.device_operational_status = "ENABLED" + device1.device_drivers = ["QKD"] + + endpoint1_1 = MagicMock() + endpoint1_1.endpoint_id.endpoint_uuid.uuid = "97b3b8e2-0e3e-5271-bc1e-ab2600b17fbd" + endpoint1_1.name = "10.211.36.220:2001" + endpoint1_1.endpoint_type = "-" + endpoint1_1.endpoint_location = "" + + endpoint1_2 = MagicMock() + endpoint1_2.endpoint_id.endpoint_uuid.uuid = "bcb1cc4b-9208-54d1-bb70-8039871dd820" + endpoint1_2.name = "10.211.36.220:2002" + endpoint1_2.endpoint_type = "-" + endpoint1_2.endpoint_location = "" + + device1.device_endpoints = [endpoint1_1, endpoint1_2] + + config_rule1_1 = MagicMock() + config_rule1_1.custom.resource_key = "_connect/address" + config_rule1_1.custom.resource_value = "10.211.36.220" + + config_rule1_2 = MagicMock() + config_rule1_2.custom.resource_key = "_connect/port" + config_rule1_2.custom.resource_value = "22222" + + config_rule1_3 = MagicMock() + config_rule1_3.custom.resource_key = "_connect/settings" + config_rule1_3.custom.resource_value = "scheme: http" + + device1.device_config.config_rules = [config_rule1_1, config_rule1_2, config_rule1_3] + + interface1_1 = MagicMock() + interface1_1.qkdi_id = "200" + interface1_1.enabled = True + interface1_1.name = "10.211.36.220:2001" + interface1_1.qkdi_att_point = {'device': '10.211.36.220', 'port': '2001'} + interface1_1.qkdi_capabilities = {} + + interface1_2 = MagicMock() + interface1_2.qkdi_id = "201" + interface1_2.enabled = True + interface1_2.name = "10.211.36.220:2002" + interface1_2.qkdi_att_point = {'device': '10.211.36.220', 'port': '2002'} + interface1_2.qkdi_capabilities = {} + + device1.qkd_interfaces.qkd_interface = [interface1_1, interface1_2] + + app1_1 = MagicMock() + app1_1.app_id = "00000002-0001-0000-0000-000000000000" + app1_1.app_qos = {} + app1_1.app_statistics = {'statistics': []} + app1_1.backing_qkdl_id = [] + app1_1.client_app_id = [] + + device1.qkd_applications.qkd_app = [app1_1] + + # Repeat similar structure for device2 and device3 + device2 = MagicMock() + device2.device_id.device_uuid.uuid = "456e461e-1de7-569a-999f-73903e818e4c" + device2.name = "QKD3" + device2.device_type = "qkd-node" + device2.device_operational_status = "ENABLED" + device2.device_drivers = ["QKD"] + + endpoint2_1 = MagicMock() + endpoint2_1.endpoint_id.endpoint_uuid.uuid = "73b56f99-52f3-5af9-a7fd-cdd6e94fb289" + endpoint2_1.name = "10.211.36.220:3001" + endpoint2_1.endpoint_type = "-" + endpoint2_1.endpoint_location = "" + + device2.device_endpoints = [endpoint2_1] + + config_rule2_1 = MagicMock() + config_rule2_1.custom.resource_key = "_connect/address" + config_rule2_1.custom.resource_value = "10.211.36.220" + + config_rule2_2 = MagicMock() + config_rule2_2.custom.resource_key = "_connect/port" + config_rule2_2.custom.resource_value = "33333" + + config_rule2_3 = MagicMock() + config_rule2_3.custom.resource_key = "_connect/settings" + config_rule2_3.custom.resource_value = "scheme: http" + + device2.device_config.config_rules = [config_rule2_1, config_rule2_2, config_rule2_3] + + interface2_1 = MagicMock() + interface2_1.qkdi_id = "300" + interface2_1.enabled = True + interface2_1.name = "10.211.36.220:3001" + interface2_1.qkdi_att_point = {'device': '10.211.36.220', 'port': '3001'} + interface2_1.qkdi_capabilities = {} + + device2.qkd_interfaces.qkd_interface = [interface2_1] + + app2_1 = MagicMock() + app2_1.app_id = "00000003-0001-0000-0000-000000000000" + app2_1.app_qos = {} + app2_1.app_statistics = {'statistics': []} + app2_1.backing_qkdl_id = [] + app2_1.client_app_id = [] + + device2.qkd_applications.qkd_app = [app2_1] + + device3 = MagicMock() + device3.device_id.device_uuid.uuid = "74520336-c12f-545e-9e18-15319f987352" + device3.name = "QKD1" + device3.device_type = "qkd-node" + device3.device_operational_status = "ENABLED" + device3.device_drivers = ["QKD"] + + endpoint3_1 = MagicMock() + endpoint3_1.endpoint_id.endpoint_uuid.uuid = "197a413f-5051-5241-81b7-ea4f89f0a0fc" + endpoint3_1.name = "10.211.36.220:1001" + endpoint3_1.endpoint_type = "-" + endpoint3_1.endpoint_location = "" + + device3.device_endpoints = [endpoint3_1] + + config_rule3_1 = MagicMock() + config_rule3_1.custom.resource_key = "_connect/address" + config_rule3_1.custom.resource_value = "10.211.36.220" + + config_rule3_2 = MagicMock() + config_rule3_2.custom.resource_key = "_connect/port" + config_rule3_2.custom.resource_value = "11111" + + config_rule3_3 = MagicMock() + config_rule3_3.custom.resource_key = "_connect/settings" + config_rule3_3.custom.resource_value = "scheme: http" + + device3.device_config.config_rules = [config_rule3_1, config_rule3_2, config_rule3_3] + + interface3_1 = MagicMock() + interface3_1.qkdi_id = "100" + interface3_1.enabled = True + interface3_1.name = "10.211.36.220:1001" + interface3_1.qkdi_att_point = {'device': '10.211.36.220', 'port': '1001'} + interface3_1.qkdi_capabilities = {} + + device3.qkd_interfaces.qkd_interface = [interface3_1] + + app3_1 = MagicMock() + app3_1.app_id = "00000001-0001-0000-0000-000000000000" + app3_1.app_qos = {} + app3_1.app_statistics = {'statistics': []} + app3_1.backing_qkdl_id = [] + app3_1.client_app_id = [] + + device3.qkd_applications.qkd_app = [app3_1] + + topology_details_response = MagicMock(devices=[device1, device2, device3]) + + # Set up the mock return values + mock_stub.ListContexts.return_value = context_response + mock_stub.ListTopologies.return_value = topology_response + mock_stub.GetTopologyDetails.return_value = topology_details_response + + # Run the function to test + detailed_info = get_detailed_device_info() + + # Print the detailed information for testing purposes + print("Test Detailed Info:", detailed_info) + + # Assertions + mock_stub.ListContexts.assert_called_once_with(Empty()) + mock_stub.ListTopologies.assert_called_once_with(context_id) + mock_stub.GetTopologyDetails.assert_called_once_with(topology_id) + + # Check the returned information + expected_info = [{ + 'device_id': '40e6c9e2-fdc8-5802-8361-413286c03494', + 'device_name': 'QKD2', + 'device_type': 'qkd-node', + 'status': 'ENABLED', + 'drivers': ['QKD'], + 'endpoints': [ + {'uuid': '97b3b8e2-0e3e-5271-bc1e-ab2600b17fbd', 'name': '10.211.36.220:2001', 'type': '-', 'location': ''}, + {'uuid': 'bcb1cc4b-9208-54d1-bb70-8039871dd820', 'name': '10.211.36.220:2002', 'type': '-', 'location': ''} + ], + 'configurations': [ + {'key': '_connect/address', 'value': '10.211.36.220'}, + {'key': '_connect/port', 'value': '22222'}, + {'key': '_connect/settings', 'value': 'scheme: http'} + ], + 'interfaces': [ + {'id': '200', 'enabled': True, 'name': '10.211.36.220:2001', 'att_point': {'device': '10.211.36.220', 'port': '2001'}, 'capabilities': {}}, + {'id': '201', 'enabled': True, 'name': '10.211.36.220:2002', 'att_point': {'device': '10.211.36.220', 'port': '2002'}, 'capabilities': {}} + ], + 'applications': [ + {'app_id': '00000002-0001-0000-0000-000000000000', 'app_qos': {}, 'app_statistics': {'statistics': []}, 'backing_qkdl_id': [], 'client_app_id': []} + ] + }, { + 'device_id': '456e461e-1de7-569a-999f-73903e818e4c', + 'device_name': 'QKD3', + 'device_type': 'qkd-node', + 'status': 'ENABLED', + 'drivers': ['QKD'], + 'endpoints': [ + {'uuid': '73b56f99-52f3-5af9-a7fd-cdd6e94fb289', 'name': '10.211.36.220:3001', 'type': '-', 'location': ''} + ], + 'configurations': [ + {'key': '_connect/address', 'value': '10.211.36.220'}, + {'key': '_connect/port', 'value': '33333'}, + {'key': '_connect/settings', 'value': 'scheme: http'} + ], + 'interfaces': [ + {'id': '300', 'enabled': True, 'name': '10.211.36.220:3001', 'att_point': {'device': '10.211.36.220', 'port': '3001'}, 'capabilities': {}} + ], + 'applications': [ + {'app_id': '00000003-0001-0000-0000-000000000000', 'app_qos': {}, 'app_statistics': {'statistics': []}, 'backing_qkdl_id': [], 'client_app_id': []} + ] + }, { + 'device_id': '74520336-c12f-545e-9e18-15319f987352', + 'device_name': 'QKD1', + 'device_type': 'qkd-node', + 'status': 'ENABLED', + 'drivers': ['QKD'], + 'endpoints': [ + {'uuid': '197a413f-5051-5241-81b7-ea4f89f0a0fc', 'name': '10.211.36.220:1001', 'type': '-', 'location': ''} + ], + 'configurations': [ + {'key': '_connect/address', 'value': '10.211.36.220'}, + {'key': '_connect/port', 'value': '11111'}, + {'key': '_connect/settings', 'value': 'scheme: http'} + ], + 'interfaces': [ + {'id': '100', 'enabled': True, 'name': '10.211.36.220:1001', 'att_point': {'device': '10.211.36.220', 'port': '1001'}, 'capabilities': {}} + ], + 'applications': [ + {'app_id': '00000001-0001-0000-0000-000000000000', 'app_qos': {}, 'app_statistics': {'statistics': []}, 'backing_qkdl_id': [], 'client_app_id': []} + ] + }] + self.assertEqual(detailed_info, expected_info) + +if __name__ == "__main__": + unittest.main() diff --git a/src/device/tests/qkd/unit/test_mock_qkd_node.py b/src/device/tests/qkd/unit/test_mock_qkd_node.py new file mode 100644 index 000000000..aee118e8f --- /dev/null +++ b/src/device/tests/qkd/unit/test_mock_qkd_node.py @@ -0,0 +1,17 @@ +import pytest +import requests +from requests.exceptions import ConnectionError + +def test_mock_qkd_node_responses(): + response = requests.get('http://10.211.36.220:11111/restconf/data/etsi-qkd-sdn-node:qkd_node') + assert response.status_code == 200 + data = response.json() + assert 'qkd_node' in data + +def test_mock_node_failure_scenarios(): + try: + response = requests.get('http://10.211.36.220:12345/restconf/data/etsi-qkd-sdn-node:qkd_node') + except ConnectionError as e: + assert isinstance(e, ConnectionError) + else: + pytest.fail("ConnectionError not raised as expected") diff --git a/src/device/tests/qkd/unit/test_qkd_compliance.py b/src/device/tests/qkd/unit/test_qkd_compliance.py new file mode 100644 index 000000000..0b624d923 --- /dev/null +++ b/src/device/tests/qkd/unit/test_qkd_compliance.py @@ -0,0 +1,10 @@ + +import pytest +import requests +from tests.tools.mock_qkd_nodes.YangValidator import YangValidator + +def test_compliance_with_yang_models(): + validator = YangValidator('etsi-qkd-sdn-node', ['etsi-qkd-node-types']) + response = requests.get('http://10.211.36.220:11111/restconf/data/etsi-qkd-sdn-node:qkd_node') + data = response.json() + assert validator.parse_to_dict(data) is not None diff --git a/src/device/tests/qkd/unit/test_qkd_configuration.py b/src/device/tests/qkd/unit/test_qkd_configuration.py new file mode 100644 index 000000000..179e072fa --- /dev/null +++ b/src/device/tests/qkd/unit/test_qkd_configuration.py @@ -0,0 +1,93 @@ +import pytest +from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver +import json + +@pytest.fixture +def qkd_driver(): + return QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') + +# Deliverable Test ID: SBI_Test_03 (Initial Config Retrieval) +def test_initial_config_retrieval(qkd_driver): + qkd_driver.Connect() + + # Retrieve and print initial config + config = qkd_driver.GetInitialConfig() + print("Initial Config:", json.dumps(config, indent=2)) + + assert isinstance(config, list) + assert len(config) > 0 + assert isinstance(config[0], tuple) + assert config[0][0] == 'qkd_node' + assert isinstance(config[0][1], dict) + +# Deliverable Test ID: INT_LQ_Test_04 (QKD Links Retrieval) +def test_retrieve_links(qkd_driver): + qkd_driver.Connect() + + # Retrieve and print link information + links = qkd_driver.GetConfig(['links']) + + if not links: + pytest.fail("No links found in the system.") + + if isinstance(links[0][1], Exception): + print(f"Error retrieving links: {links[0][1]}") + else: + print("Links:", json.dumps(links, indent=2)) + + assert isinstance(links, list) + assert len(links) > 0 + +# Deliverable Test ID: INT_LQ_Test_03 (QKD Interfaces Retrieval) +def test_retrieve_interfaces(qkd_driver): + qkd_driver.Connect() + + # Retrieve and print interface information + interfaces = qkd_driver.GetConfig(['interfaces']) + + if not interfaces: + pytest.fail("No interfaces found in the system.") + + if isinstance(interfaces[0][1], Exception): + print(f"Error retrieving interfaces: {interfaces[0][1]}") + else: + print("Interfaces:", json.dumps(interfaces, indent=2)) + + assert isinstance(interfaces, list) + assert len(interfaces) > 0 + +# Deliverable Test ID: INT_LQ_Test_02 (QKD Capabilities Retrieval) +def test_retrieve_capabilities(qkd_driver): + qkd_driver.Connect() + + # Retrieve and print capabilities information + capabilities = qkd_driver.GetConfig(['capabilities']) + + if not capabilities: + pytest.fail("No capabilities found in the system.") + + if isinstance(capabilities[0][1], Exception): + print(f"Error retrieving capabilities: {capabilities[0][1]}") + else: + print("Capabilities:", json.dumps(capabilities, indent=2)) + + assert isinstance(capabilities, list) + assert len(capabilities) > 0 + +# Deliverable Test ID: INT_LQ_Test_03 (QKD Endpoints Retrieval) +def test_retrieve_endpoints(qkd_driver): + qkd_driver.Connect() + + # Retrieve and print endpoint information + endpoints = qkd_driver.GetConfig(['endpoints']) + + if not endpoints: + pytest.fail("No endpoints found in the system.") + + if isinstance(endpoints[0][1], Exception): + print(f"Error retrieving endpoints: {endpoints[0][1]}") + else: + print("Endpoints:", json.dumps(endpoints, indent=2)) + + assert isinstance(endpoints, list) + assert len(endpoints) > 0 diff --git a/src/device/tests/qkd/unit/test_qkd_error_hanling.py b/src/device/tests/qkd/unit/test_qkd_error_hanling.py new file mode 100644 index 000000000..a053e819d --- /dev/null +++ b/src/device/tests/qkd/unit/test_qkd_error_hanling.py @@ -0,0 +1,22 @@ +import json +import pytest +from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver + +def test_error_handling_invalid_operations(): + driver = QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') + driver.Connect() + result = driver.SetConfig([('/invalid/resource', json.dumps({'invalid': 'data'}))]) + + # Print the result for debugging purposes + print("Result of SetConfig with invalid data:", result) + + # Check if the result contains ValueError for invalid resource keys + assert all(isinstance(res, ValueError) for res in result), "Expected ValueError for invalid operations" + +def test_network_failure(): + driver = QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') + driver.Connect() + # Simulate network failure by disconnecting the mock server + # This would require mock server modification to simulate downtime + result = driver.GetConfig(['/qkd_interfaces/qkd_interface']) + assert result == [] # Expecting an empty list instead of None diff --git a/src/device/tests/qkd/unit/test_qkd_mock_connectivity.py b/src/device/tests/qkd/unit/test_qkd_mock_connectivity.py new file mode 100644 index 000000000..49afc8efd --- /dev/null +++ b/src/device/tests/qkd/unit/test_qkd_mock_connectivity.py @@ -0,0 +1,24 @@ +import pytest +from unittest.mock import patch +from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver +import requests + +@pytest.fixture +def qkd_driver(): + return QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') + +# Deliverable Test ID: SBI_Test_01 +def test_qkd_driver_connection(qkd_driver): + assert qkd_driver.Connect() is True + +# Deliverable Test ID: SBI_Test_01 +def test_qkd_driver_invalid_connection(): + qkd_driver = QKDDriver(address='10.211.36.220', port=12345, username='user', password='pass') # Use invalid port directly + assert qkd_driver.Connect() is False + +# Deliverable Test ID: SBI_Test_10 +@patch('src.device.service.drivers.qkd.QKDDriver2.requests.get') +def test_qkd_driver_timeout_connection(mock_get, qkd_driver): + mock_get.side_effect = requests.exceptions.Timeout + qkd_driver.timeout = 0.001 # Simulate very short timeout + assert qkd_driver.Connect() is False diff --git a/src/device/tests/qkd/unit/test_qkd_performance.py b/src/device/tests/qkd/unit/test_qkd_performance.py new file mode 100644 index 000000000..e9ef9cf68 --- /dev/null +++ b/src/device/tests/qkd/unit/test_qkd_performance.py @@ -0,0 +1,16 @@ +# tests/unit/test_qkd_performance.py + +import pytest +import time +from src.device.service.drivers.qkd.QKDDriver import QKDDriver + +def test_performance_under_load(): + driver = QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') + driver.Connect() + + start_time = time.time() + for _ in range(1000): + driver.GetConfig(['/qkd_interfaces/qkd_interface']) + end_time = time.time() + + assert (end_time - start_time) < 60 diff --git a/src/device/tests/qkd/unit/test_qkd_security.py b/src/device/tests/qkd/unit/test_qkd_security.py new file mode 100644 index 000000000..a9602c783 --- /dev/null +++ b/src/device/tests/qkd/unit/test_qkd_security.py @@ -0,0 +1,45 @@ +# test_qkd_security.py + +import os +import pytest +import requests +import jwt +from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver + +SECRET_KEY = "your_secret_key" + +def generate_jwt_token(username: str) -> str: + return jwt.encode({'username': username}, SECRET_KEY, algorithm='HS256') + +@pytest.fixture() +def enable_bypass_auth(request): + # Backup the original value of BYPASS_AUTH + original_bypass_auth = os.getenv('BYPASS_AUTH') + # Set BYPASS_AUTH to true for the test + os.environ['BYPASS_AUTH'] = 'true' + + def restore_bypass_auth(): + # Restore the original value of BYPASS_AUTH + if original_bypass_auth is not None: + os.environ['BYPASS_AUTH'] = original_bypass_auth + else: + del os.environ['BYPASS_AUTH'] + + # Add the finalizer to restore the environment variable after the test + request.addfinalizer(restore_bypass_auth) + +@pytest.mark.usefixtures("enable_bypass_auth") +def test_authentication(): + token = generate_jwt_token('wrong_user') + driver = QKDDriver(address='10.211.36.220', port=11111, token=token) + assert driver.Connect() is False + +@pytest.mark.usefixtures("enable_bypass_auth") +def test_authorization(): + token = generate_jwt_token('user') + driver = QKDDriver(address='10.211.36.220', port=11111, token=token) + assert driver.Connect() is True + wrong_token = generate_jwt_token('wrong_user') + headers = {'Authorization': 'Bearer ' + wrong_token} + response = requests.get('http://10.211.36.220:11111/restconf/data/etsi-qkd-sdn-node:qkd_node', headers=headers) + assert response.status_code == 401 diff --git a/src/device/tests/qkd/unit/test_qkd_subscription.py b/src/device/tests/qkd/unit/test_qkd_subscription.py new file mode 100644 index 000000000..99a96f08c --- /dev/null +++ b/src/device/tests/qkd/unit/test_qkd_subscription.py @@ -0,0 +1,23 @@ +# tests/unit/test_qkd_subscription.py + +import pytest +from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver + +def test_state_subscription(): + driver = QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') + driver.Connect() + result = driver.SubscribeState([('/qkd_interfaces/qkd_interface', 1.0, 2.0)]) + assert all(isinstance(res, bool) and res for res in result) + +def test_state_unsubscription(): + driver = QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') + driver.Connect() + result = driver.UnsubscribeState(['/qkd_interfaces/qkd_interface']) + assert all(isinstance(res, bool) and res for res in result) + +def test_state_retrieval(): + driver = QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') + driver.Connect() + state = driver.GetState() + assert isinstance(state, dict) or isinstance(state, list) + diff --git a/src/device/tests/qkd/unit/validate_context.py b/src/device/tests/qkd/unit/validate_context.py new file mode 100644 index 000000000..9205f8f4f --- /dev/null +++ b/src/device/tests/qkd/unit/validate_context.py @@ -0,0 +1,31 @@ +import grpc +import pytest +from common.proto.context_pb2 import Empty, ContextId, Uuid +from common.proto.context_pb2_grpc import ContextServiceStub + +@pytest.fixture +def grpc_stub(): + channel = grpc.insecure_channel('10.152.183.77:1010') # Replace with actual server address + stub = ContextServiceStub(channel) + return stub + +def test_retrieve_all_contexts(grpc_stub): + try: + response = grpc_stub.ListContexts(Empty()) + assert response is not None + assert len(response.contexts) > 0 + for context in response.contexts: + assert isinstance(context.context_uuid.uuid, str) + assert isinstance(context.name, str) + except grpc.RpcError as e: + print(f"gRPC Error: {e}") + +def test_retrieve_context_details(grpc_stub): + try: + uuid = Uuid(uuid="valid-id-here") + context_id = ContextId(context_uuid=uuid) + response = grpc_stub.GetContext(context_id) + assert response is not None + assert response.context_uuid.uuid == "valid-id-here" + except grpc.RpcError as e: + print(f"gRPC Error: {e}") -- GitLab From 50730a55fdd064d0cf1293506de3f5265e210952 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 4 Sep 2024 07:34:26 +0000 Subject: [PATCH 545/602] Include envorunment variables for qkds --- .../test_external_qkd_retrieve_information.py | 157 ++++++++++++++++ ...test_qkd_luxquanta_retrieve_information.py | 177 ------------------ 2 files changed, 157 insertions(+), 177 deletions(-) create mode 100644 src/device/tests/qkd/integration/test_external_qkd_retrieve_information.py delete mode 100644 src/device/tests/qkd/integration/test_qkd_luxquanta_retrieve_information.py diff --git a/src/device/tests/qkd/integration/test_external_qkd_retrieve_information.py b/src/device/tests/qkd/integration/test_external_qkd_retrieve_information.py new file mode 100644 index 000000000..fdf873bdb --- /dev/null +++ b/src/device/tests/qkd/integration/test_external_qkd_retrieve_information.py @@ -0,0 +1,157 @@ +import pytest +import json +import logging +import os +from dotenv import load_dotenv +from src.device.service.drivers.qkd.QKDDriver import QKDDriver + +# Load environment variables from .env file +load_dotenv() + +# Set up logging +logging.basicConfig(level=logging.INFO) +LOGGER = logging.getLogger(__name__) + +class SafeJSONEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, Exception): + return {'error': str(obj), 'type': type(obj).__name__} + return super().default(obj) + +# Dictionary to store retrieved information +retrieved_info = { + "config_qkd1": None, + "config_qkd2": None, + "capabilities_qkd1": None, + "capabilities_qkd2": None, + "interfaces_qkd1": None, + "interfaces_qkd2": None, + "links_qkd1": None, + "links_qkd2": None, + "state_qkd1": None, + "state_qkd2": None, +} + +# Environment variables for sensitive information +QKD1_ADDRESS = os.getenv("QKD1_ADDRESS") +QKD2_ADDRESS = os.getenv("QKD2_ADDRESS") +PORT = os.getenv("QKD_PORT") +USERNAME = os.getenv("QKD_USERNAME") +PASSWORD = os.getenv("QKD_PASSWORD") + +@pytest.fixture +def driver_qkd1(): + return QKDDriver(address=QKD1_ADDRESS, port=PORT, username=USERNAME, password=PASSWORD, use_jwt=True) + +@pytest.fixture +def driver_qkd2(): + return QKDDriver(address=QKD2_ADDRESS, port=PORT, username=USERNAME, password=PASSWORD, use_jwt=True) + +def log_data(label, data): + """Logs data in JSON format with a label.""" + LOGGER.info(f"{label}: {json.dumps(data, indent=2, cls=SafeJSONEncoder)}") + +def get_jwt_token(driver): + """Retrieve JWT token from the driver.""" + try: + return driver._QKDDriver__headers.get('Authorization').split(' ')[1] + except (AttributeError, KeyError, TypeError): + LOGGER.error("Failed to retrieve JWT token") + return None + +def save_json_file(filename, data): + """Save data to a JSON file.""" + try: + with open(filename, 'w') as f: + json.dump(data, f, indent=2) + LOGGER.info(f"Successfully saved {filename}") + except Exception as e: + LOGGER.error(f"Failed to save {filename}: {e}") + +def retrieve_data(driver, label, method, *args): + """Retrieve data from the driver and log it.""" + try: + data = method(*args) + log_data(label, data) + return data + except Exception as e: + LOGGER.error(f"Failed to retrieve {label}: {e}") + return None + +def test_retrieve_and_create_descriptor(driver_qkd1, driver_qkd2): + # Connect to both QKD nodes + assert driver_qkd1.Connect(), "Failed to connect to QKD1" + assert driver_qkd2.Connect(), "Failed to connect to QKD2" + + # Use the same JWT token for all requests + jwt_token = get_jwt_token(driver_qkd1) + assert jwt_token, "Failed to retrieve JWT token from QKD1" + driver_qkd2._QKDDriver__headers['Authorization'] = f'Bearer {jwt_token}' + + # Retrieve configurations + retrieved_info['config_qkd1'] = retrieve_data(driver_qkd1, "QKD1 Initial Config", driver_qkd1.GetInitialConfig) + retrieved_info['config_qkd2'] = retrieve_data(driver_qkd2, "QKD2 Initial Config", driver_qkd2.GetInitialConfig) + + # Retrieve capabilities + retrieved_info['capabilities_qkd1'] = retrieve_data(driver_qkd1, "QKD1 Capabilities", driver_qkd1.GetConfig, ['capabilities']) + retrieved_info['capabilities_qkd2'] = retrieve_data(driver_qkd2, "QKD2 Capabilities", driver_qkd2.GetConfig, ['capabilities']) + + # Retrieve interfaces + retrieved_info['interfaces_qkd1'] = retrieve_data(driver_qkd1, "QKD1 Interfaces", driver_qkd1.GetConfig, ['interfaces']) + retrieved_info['interfaces_qkd2'] = retrieve_data(driver_qkd2, "QKD2 Interfaces", driver_qkd2.GetConfig, ['interfaces']) + + # Retrieve links + retrieved_info['links_qkd1'] = retrieve_data(driver_qkd1, "QKD1 Links", driver_qkd1.GetConfig, ['links']) + retrieved_info['links_qkd2'] = retrieve_data(driver_qkd2, "QKD2 Links", driver_qkd2.GetConfig, ['links']) + + # Retrieve states + retrieved_info['state_qkd1'] = retrieve_data(driver_qkd1, "QKD1 Current State", driver_qkd1.GetState) + retrieved_info['state_qkd2'] = retrieve_data(driver_qkd2, "QKD2 Current State", driver_qkd2.GetState) + + # Save retrieved information + save_json_file('retrieved_info.json', retrieved_info) + + # Create descriptor dynamically + descriptor = { + "contexts": [{"context_id": {"context_uuid": {"uuid": "admin"}}}], + "topologies": [{"topology_id": {"topology_uuid": {"uuid": "admin"}, "context_id": {"context_uuid": {"uuid": "admin"}}}}], + "devices": [], + "links": [] + } + + # Add device information to descriptor + for config, token, interfaces, device_name, address in [ + (retrieved_info['config_qkd1'], jwt_token, retrieved_info['interfaces_qkd1'], "QKD1", QKD1_ADDRESS), + (retrieved_info['config_qkd2'], jwt_token, retrieved_info['interfaces_qkd2'], "QKD2", QKD2_ADDRESS) + ]: + device_info = { + "device_id": {"device_uuid": {"uuid": device_name}}, + "device_type": "qkd-node", + "device_operational_status": 0, + "device_drivers": [12], + "device_endpoints": [], + "device_config": { + "config_rules": [ + {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": address}}, + {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": PORT}}, + {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"scheme": "http", "token": token}}} + ] + } + } + descriptor['devices'].append(device_info) + + # Create links based on retrieved link data + if retrieved_info['links_qkd1'] and retrieved_info['links_qkd2']: + for link_data in retrieved_info['links_qkd1']: + link_entry = { + "link_id": {"link_uuid": {"uuid": f"QKD1/{QKD1_ADDRESS}:{PORT}==QKD2/{retrieved_info['links_qkd2'][0][1]['qkdi_status']}/{PORT}"}}, + "link_endpoint_ids": [ + {"device_id": {"device_uuid": {"uuid": "QKD1"}}, "endpoint_uuid": {"uuid": f"{QKD1_ADDRESS}:{PORT}"}}, + {"device_id": {"device_uuid": {"uuid": "QKD2"}}, "endpoint_uuid": {"uuid": f"{QKD2_ADDRESS}:{PORT}"}} + ] + } + descriptor['links'].append(link_entry) + + # Save the dynamically created descriptor + save_json_file('descriptor.json', descriptor) + log_data("Created Descriptor", descriptor) diff --git a/src/device/tests/qkd/integration/test_qkd_luxquanta_retrieve_information.py b/src/device/tests/qkd/integration/test_qkd_luxquanta_retrieve_information.py deleted file mode 100644 index 9364b8e5e..000000000 --- a/src/device/tests/qkd/integration/test_qkd_luxquanta_retrieve_information.py +++ /dev/null @@ -1,177 +0,0 @@ -import pytest -import json -import logging -from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver - -# Set up logging -logging.basicConfig(level=logging.INFO) -LOGGER = logging.getLogger(__name__) - -class SafeJSONEncoder(json.JSONEncoder): - def default(self, obj): - if isinstance(obj, Exception): - return {'error': str(obj), 'type': type(obj).__name__} - return super().default(obj) - -# Dictionary to store retrieved information -retrieved_info = { - "config_qkd1": None, - "config_qkd2": None, - "capabilities_qkd1": None, - "capabilities_qkd2": None, - "interfaces_qkd1": None, - "interfaces_qkd2": None, - "links_qkd1": None, - "links_qkd2": None, - "state_qkd1": None, - "state_qkd2": None, -} - -@pytest.fixture -def driver_qkd1(): - return QKDDriver(address='10.13.13.2', port=5100, username='admin', password='password', use_jwt=True) - -@pytest.fixture -def driver_qkd2(): - return QKDDriver(address='10.13.13.3', port=5100, username='admin', password='password', use_jwt=True) - -def log_data(label, data): - LOGGER.info(f"{label}: {json.dumps(data, indent=2, cls=SafeJSONEncoder)}") - -def get_jwt_token(driver): - try: - return driver._QKDDriver__headers.get('Authorization').split(' ')[1] - except (AttributeError, KeyError, TypeError): - return None - -def save_json_file(filename, data): - """Save data to a JSON file.""" - try: - with open(filename, 'w') as f: - json.dump(data, f, indent=2) - LOGGER.info(f"Successfully saved {filename}") - except Exception as e: - LOGGER.error(f"Failed to save {filename}: {e}") - -def test_retrieve_and_create_descriptor(driver_qkd1, driver_qkd2): - # Connect to both QKD nodes - assert driver_qkd1.Connect() - assert driver_qkd2.Connect() - - # Use the same JWT token for all requests - jwt_token = get_jwt_token(driver_qkd1) - assert jwt_token, "Failed to retrieve JWT token from QKD1" - - driver_qkd2._QKDDriver__headers['Authorization'] = f'Bearer {jwt_token}' - - # Retrieve initial configs - config_qkd1 = driver_qkd1.GetInitialConfig() - retrieved_info['config_qkd1'] = config_qkd1 - log_data("QKD1 Initial Config", config_qkd1) - assert config_qkd1, "Failed to retrieve initial configuration for QKD1" - - config_qkd2 = driver_qkd2.GetInitialConfig() - retrieved_info['config_qkd2'] = config_qkd2 - log_data("QKD2 Initial Config", config_qkd2) - assert config_qkd2, "Failed to retrieve initial configuration for QKD2" - - # Retrieve capabilities - capabilities_qkd1 = driver_qkd1.GetConfig(['capabilities']) - retrieved_info['capabilities_qkd1'] = capabilities_qkd1 - log_data("QKD1 Capabilities", capabilities_qkd1) - assert capabilities_qkd1, "Failed to retrieve capabilities for QKD1" - - capabilities_qkd2 = driver_qkd2.GetConfig(['capabilities']) - retrieved_info['capabilities_qkd2'] = capabilities_qkd2 - log_data("QKD2 Capabilities", capabilities_qkd2) - assert capabilities_qkd2, "Failed to retrieve capabilities for QKD2" - - # Retrieve interfaces - interfaces_qkd1 = driver_qkd1.GetConfig(['interfaces']) - retrieved_info['interfaces_qkd1'] = interfaces_qkd1 - log_data("QKD1 Interfaces", interfaces_qkd1) - assert interfaces_qkd1, "Failed to retrieve interfaces for QKD1" - - interfaces_qkd2 = driver_qkd2.GetConfig(['interfaces']) - retrieved_info['interfaces_qkd2'] = interfaces_qkd2 - log_data("QKD2 Interfaces", interfaces_qkd2) - assert interfaces_qkd2, "Failed to retrieve interfaces for QKD2" - - # Retrieve links - links_qkd1 = driver_qkd1.GetConfig(['links']) - retrieved_info['links_qkd1'] = links_qkd1 - log_data("QKD1 Links", links_qkd1) - assert links_qkd1, "Failed to retrieve links for QKD1" - - links_qkd2 = driver_qkd2.GetConfig(['links']) - retrieved_info['links_qkd2'] = links_qkd2 - log_data("QKD2 Links", links_qkd2) - assert links_qkd2, "Failed to retrieve links for QKD2" - - # Retrieve states - state_qkd1 = driver_qkd1.GetState() - retrieved_info['state_qkd1'] = state_qkd1 - log_data("QKD1 Current State", state_qkd1) - assert state_qkd1, "Failed to retrieve state for QKD1" - - state_qkd2 = driver_qkd2.GetState() - retrieved_info['state_qkd2'] = state_qkd2 - log_data("QKD2 Current State", state_qkd2) - assert state_qkd2, "Failed to retrieve state for QKD2" - - # Save retrieved information after all data retrieval - save_json_file('retrieved_info.json', retrieved_info) - - # Dynamically create the descriptor - descriptor = { - "contexts": [ - {"context_id": {"context_uuid": {"uuid": "admin"}}} - ], - "topologies": [ - {"topology_id": {"topology_uuid": {"uuid": "admin"}, "context_id": {"context_uuid": {"uuid": "admin"}}}} - ], - "devices": [], - "links": [] - } - - # Dynamically add device information - for config, token, interfaces, device_name, address, port in [ - (config_qkd1, jwt_token, interfaces_qkd1, "QKD1", "10.13.13.2", "5100"), - (config_qkd2, jwt_token, interfaces_qkd2, "QKD2", "10.13.13.3", "5100") - ]: - device_info = { - "device_id": {"device_uuid": {"uuid": device_name}}, - "device_type": "qkd-node", - "device_operational_status": 0, - "device_drivers": [12], # This could be dynamically determined if needed - "device_endpoints": [], - "device_config": { - "config_rules": [ - {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": address}}, - {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": port}}, - {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": { - "scheme": "http", - "token": token if token else "N/A" - }}} - ] - } - } - - descriptor['devices'].append(device_info) - - # Dynamically create and add links based on retrieved links data - if links_qkd1 and links_qkd2: - for link_data in links_qkd1: - link_uuid = link_data[1].get('qkdl_id') - link_entry = { - "link_id": {"link_uuid": {"uuid": f"QKD1/{address}:{port}==QKD2/{links_qkd2[0][1]['qkdi_status']}/{port}"}}, - "link_endpoint_ids": [ - {"device_id": {"device_uuid": {"uuid": "QKD1"}}, "endpoint_uuid": {"uuid": f"{address}:{port}"}}, - {"device_id": {"device_uuid": {"uuid": "QKD2"}}, "endpoint_uuid": {"uuid": f"{address}:{port}"}} - ] - } - descriptor['links'].append(link_entry) - - # Save the dynamically created descriptor - save_json_file('descriptor.json', descriptor) - log_data("Created Descriptor", descriptor) \ No newline at end of file -- GitLab From 2c370a0b48c5467a0b9d021c160413f610ecfd7f Mon Sep 17 00:00:00 2001 From: root Date: Wed, 4 Sep 2024 08:57:32 +0000 Subject: [PATCH 546/602] Added components to service --- proto/context.proto | 2 + .../database/models/enums/DeviceDriver.py | 3 +- .../database/models/enums/ServiceType.py | 1 + .../service_handler_api/FilterFields.py | 6 +- .../service/service_handlers/__init__.py | 7 + .../service/service_handlers/qkd/__init__.py | 0 .../qkd/qkd_service_handler.py | 379 ++++++++++++++++++ 7 files changed, 395 insertions(+), 3 deletions(-) create mode 100644 src/service/service/service_handlers/qkd/__init__.py create mode 100644 src/service/service/service_handlers/qkd/qkd_service_handler.py diff --git a/proto/context.proto b/proto/context.proto index 87f69132d..fa9b1959b 100644 --- a/proto/context.proto +++ b/proto/context.proto @@ -214,6 +214,7 @@ enum DeviceDriverEnum { DEVICEDRIVER_OPTICAL_TFS = 9; DEVICEDRIVER_IETF_ACTN = 10; DEVICEDRIVER_OC = 11; + DEVICEDRIVER_QKD = 12; } enum DeviceOperationalStatusEnum { @@ -300,6 +301,7 @@ enum ServiceTypeEnum { SERVICETYPE_TE = 4; SERVICETYPE_E2E = 5; SERVICETYPE_OPTICAL_CONNECTIVITY = 6; + SERVICETYPE_QKD = 7; } enum ServiceStatusEnum { diff --git a/src/context/service/database/models/enums/DeviceDriver.py b/src/context/service/database/models/enums/DeviceDriver.py index 06d731770..4f6b22474 100644 --- a/src/context/service/database/models/enums/DeviceDriver.py +++ b/src/context/service/database/models/enums/DeviceDriver.py @@ -33,7 +33,8 @@ class ORM_DeviceDriverEnum(enum.Enum): GNMI_OPENCONFIG = DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG OPTICAL_TFS = DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS IETF_ACTN = DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN - OC = DeviceDriverEnum.DEVICEDRIVER_OC + OC = DeviceDriverEnum.DEVICEDRIVER_OC, + QKD = DeviceDriverEnum.DEVICEDRIVER_QKD grpc_to_enum__device_driver = functools.partial( grpc_to_enum, DeviceDriverEnum, ORM_DeviceDriverEnum) diff --git a/src/context/service/database/models/enums/ServiceType.py b/src/context/service/database/models/enums/ServiceType.py index 62d5380b5..cd6819999 100644 --- a/src/context/service/database/models/enums/ServiceType.py +++ b/src/context/service/database/models/enums/ServiceType.py @@ -29,6 +29,7 @@ class ORM_ServiceTypeEnum(enum.Enum): TE = ServiceTypeEnum.SERVICETYPE_TE E2E = ServiceTypeEnum.SERVICETYPE_E2E OPTICAL_CONNECTIVITY = ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY + QKD = ServiceTypeEnum.SERVICETYPE_QKD grpc_to_enum__service_type = functools.partial( grpc_to_enum, ServiceTypeEnum, ORM_ServiceTypeEnum) diff --git a/src/service/service/service_handler_api/FilterFields.py b/src/service/service/service_handler_api/FilterFields.py index ca70fa938..30e597f31 100644 --- a/src/service/service/service_handler_api/FilterFields.py +++ b/src/service/service/service_handler_api/FilterFields.py @@ -26,7 +26,8 @@ SERVICE_TYPE_VALUES = { ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE, ServiceTypeEnum.SERVICETYPE_TE, ServiceTypeEnum.SERVICETYPE_E2E, - ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY + ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY, + ServiceTypeEnum.SERVICETYPE_QKD } DEVICE_DRIVER_VALUES = { @@ -41,7 +42,8 @@ DEVICE_DRIVER_VALUES = { DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG, DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS, DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN, - DeviceDriverEnum.DEVICEDRIVER_OC + DeviceDriverEnum.DEVICEDRIVER_OC, + DeviceDriverEnum.DEVICEDRIVER_QKD } # Map allowed filter fields to allowed values per Filter field. If no restriction (free text) None is specified diff --git a/src/service/service/service_handlers/__init__.py b/src/service/service/service_handlers/__init__.py index 8b5e2b283..3beb7c9ee 100644 --- a/src/service/service/service_handlers/__init__.py +++ b/src/service/service/service_handlers/__init__.py @@ -27,6 +27,7 @@ from .tapi_tapi.TapiServiceHandler import TapiServiceHandler from .tapi_xr.TapiXrServiceHandler import TapiXrServiceHandler from .e2e_orch.E2EOrchestratorServiceHandler import E2EOrchestratorServiceHandler from .oc.OCServiceHandler import OCServiceHandler +from .qkd.qkd_service_handler import QKDServiceHandler SERVICE_HANDLERS = [ (L2NMEmulatedServiceHandler, [ @@ -106,5 +107,11 @@ SERVICE_HANDLERS = [ FilterFieldEnum.SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY, FilterFieldEnum.DEVICE_DRIVER : DeviceDriverEnum.DEVICEDRIVER_OC, } + ]), + (QKDServiceHandler, [ + { + FilterFieldEnum.SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_QKD, + FilterFieldEnum.DEVICE_DRIVER : [DeviceDriverEnum.DEVICEDRIVER_QKD], + } ]) ] diff --git a/src/service/service/service_handlers/qkd/__init__.py b/src/service/service/service_handlers/qkd/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/service/service/service_handlers/qkd/qkd_service_handler.py b/src/service/service/service_handlers/qkd/qkd_service_handler.py new file mode 100644 index 000000000..867fa4781 --- /dev/null +++ b/src/service/service/service_handlers/qkd/qkd_service_handler.py @@ -0,0 +1,379 @@ +import json, logging, uuid +from typing import Any, Dict, List, Optional, Tuple, Union +from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method +from common.proto.context_pb2 import ConfigRule, DeviceId, Service +from common.proto.app_pb2 import App, QKDAppStatusEnum, QKDAppTypesEnum +from common.tools.object_factory.ConfigRule import json_config_rule_delete, json_config_rule_set +from common.tools.object_factory.Device import json_device_id +from common.type_checkers.Checkers import chk_type +from service.service.service_handler_api.Tools import get_device_endpoint_uuids, get_endpoint_matching +from service.service.service_handler_api._ServiceHandler import _ServiceHandler +from service.service.service_handler_api.SettingsHandler import SettingsHandler +from service.service.task_scheduler.TaskExecutor import TaskExecutor + +LOGGER = logging.getLogger(__name__) + +def get_endpoint_name_by_uuid(device, uuid): + for device_endpoint in device.device_endpoints: + if device_endpoint.endpoint_id.endpoint_uuid.uuid == uuid: + return device_endpoint.name + return None + +class QKDServiceHandler(_ServiceHandler): + def __init__( # pylint: disable=super-init-not-called + self, service : Service, task_executor : TaskExecutor, **settings + ) -> None: + self.__service = service + self.__task_executor = task_executor + self.__settings_handler = SettingsHandler(service.service_config, **settings) + + + # Optare: This function is where the service is created + # Optare: It already receives the path provided by pathcomp in endpoints variable + # Optare: It then checks for each respective QKD Node and requests SBI to inform of the new connection + # Optare: It also requests app module for a creation of internal service if the service is virtual + def SetEndpoint( + self, endpoints : List[Tuple[str, str, Optional[str]]], + connection_uuid : Optional[str] = None + ) -> List[Union[bool, Exception]]: + chk_type('endpoints', endpoints, list) + if len(endpoints) < 2 or len(endpoints) % 2: return [] + + LOGGER.info('Endpoints: ' + str(endpoints)) + + + service_uuid = self.__service.service_id.service_uuid.uuid + settings = self.__settings_handler.get('/settings') + + context_uuid = self.__service.service_id.context_id.context_uuid.uuid + + results = [] + try: + + if len(endpoints) > 4: + is_virtual = True + else: + is_virtual = False + + devices = [] + qkdn_ids = [] + interfaces = [] + links = [] + + # Optare: First a big iteration through all devices is done in order to obtain all information needed for the whole operation + # Optare: This is a way to minimize time of operation. Otherwise it would require many O(N) operations. This way we can reduce it to one + + # Populate devices and QKDN ids + for idx, endpoint in enumerate(endpoints[::2]): + device_uuid, endpoint_left_uuid = get_device_endpoint_uuids(endpoint) + _, endpoint_right_uuid = get_device_endpoint_uuids(endpoints[2 * idx + 1]) + + device = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) + devices.append(device) + interfaces.append([0,0]) + links.append([]) + + + + + + endpoint_left = get_endpoint_name_by_uuid(device, endpoint_left_uuid) if idx > 0 else None + endpoint_right = get_endpoint_name_by_uuid(device, endpoint_right_uuid) if 2 * idx + 2 < len(endpoints) else None + + + for config_rule in device.device_config.config_rules: + resource_key = config_rule.custom.resource_key + + if resource_key == '__node__': + value = json.loads(config_rule.custom.resource_value) + qkdn_ids.append(value['qkdn_id']) + + elif resource_key.startswith('/interface'): + value = json.loads(config_rule.custom.resource_value) + try: + endpoint_str = value['qkdi_att_point']['uuid'] + LOGGER.info("A: " + str(endpoint_str) + "....." + str(endpoint_left) + "....." + str(endpoint_right)) + + if endpoint_str == endpoint_left: + interfaces[idx][0] = value['qkdi_id'] + elif endpoint_str == endpoint_right: + interfaces[idx][1] = value['qkdi_id'] + except KeyError: + pass + + elif resource_key.startswith('/link'): + value = json.loads(config_rule.custom.resource_value) + links[idx].append(( value['uuid'], + (value['src_qkdn_id'], value['src_interface_id']), + (value['dst_qkdn_id'], value['dst_interface_id']) + )) + + + LOGGER.info("IFs: " + str(interfaces)) + LOGGER.info("Links: " + str(links)) + LOGGER.info("context_: " + context_uuid) + + + # Optare: From here now is where the work is really done. It iterates over every device in use for the service (ordered) + + src_device_uuid, src_endpoint_uuid = get_device_endpoint_uuids(endpoints[0]) + src_device = devices[0] + src_endpoint = get_endpoint_matching(src_device, src_endpoint_uuid) + + dst_device_uuid, dst_endpoint_uuid = get_device_endpoint_uuids(endpoints[-1]) + dst_device = devices[-1] + dst_endpoint = get_endpoint_matching(dst_device, dst_endpoint_uuid) + + src_qkdn_id = qkdn_ids[0] + dst_qkdn_id = qkdn_ids[-1] + + src_interface_id = interfaces[0][1] + dst_interface_id = interfaces[-1][0] + + service_qkdl_id_src_dst = str(uuid.uuid4()) + service_qkdl_id_dst_src = str(uuid.uuid4()) + + + for idx, device in enumerate(devices): + + # Even though we always create them together. There is a chance the admin deletes one of the rules manually + phys_qkdl_id_right = None if idx == (len(devices) - 1) else '' # None == impossible + phys_qkdl_id_left = None if idx == 0 else '' # None == impossible + + for link_uuid, link_src, link_dst in links[idx]: + qkdn_link_src, qkdn_interface_src = link_src + qkdn_link_dst, qkdn_interface_dst = link_dst + + if phys_qkdl_id_right == '' and \ + qkdn_link_src == qkdn_ids[idx] and qkdn_interface_src == interfaces[idx][1] and \ + qkdn_link_dst[idx+1] and qkdn_interface_dst == interfaces[idx+1][0]: + phys_qkdl_id_right = link_uuid + + + if phys_qkdl_id_left == '' and \ + qkdn_link_src == qkdn_ids[idx] and qkdn_interface_src == interfaces[idx][0] and \ + qkdn_link_dst[idx-1] and qkdn_interface_dst == interfaces[idx-1][1]: + phys_qkdl_id_left = link_uuid + + + # Optare: Before adding information to config_rules you have to delete the list first otherwise old content will be called again + del device.device_config.config_rules[:] + + + if phys_qkdl_id_right: + if not is_virtual: + service_qkdl_id_src_dst = phys_qkdl_id_right + + elif phys_qkdl_id_right == '': + qkdl_id_src_dst = str(uuid.uuid4()) if is_virtual else service_qkdl_id_src_dst + + json_config_rule = json_config_rule_set('/link/link[{:s}]'.format(qkdl_id_src_dst), { + 'uuid' : qkdl_id_src_dst, + 'type' : 'DIRECT', + 'src_qkdn_id' : qkdn_ids[idx], + 'src_interface_id' : interfaces[idx][1], + 'dst_qkdn_id' : qkdn_ids[idx+1], + 'dst_interface_id' : interfaces[idx+1][0], + }) + + device.device_config.config_rules.append(ConfigRule(**json_config_rule)) + + + if phys_qkdl_id_left: + if not is_virtual: + service_qkdl_id_dst_src = phys_qkdl_id_left + + elif phys_qkdl_id_left == '': + qkdl_id_dst_src = str(uuid.uuid4()) if is_virtual else service_qkdl_id_dst_src + + json_config_rule = json_config_rule_set('/link/link[{:s}]'.format(qkdl_id_dst_src), { + 'uuid' : qkdl_id_dst_src, + 'type' : 'DIRECT', + 'src_qkdn_id' : qkdn_ids[idx], + 'src_interface_id' : interfaces[idx][0], + 'dst_qkdn_id' : qkdn_ids[idx-1], + 'dst_interface_id' : interfaces[idx-1][1], + }) + + device.device_config.config_rules.append(ConfigRule(**json_config_rule)) + + + + if is_virtual: + if idx < len(qkdn_ids) - 1: + json_config_rule = json_config_rule_set('/link/link[{:s}]'.format(service_qkdl_id_src_dst), { + 'uuid' : service_qkdl_id_src_dst, + 'type' : 'VIRTUAL', + 'src_qkdn_id' : src_qkdn_id, + 'src_interface_id' : src_interface_id, + 'dst_qkdn_id' : dst_qkdn_id, + 'dst_interface_id' : dst_interface_id, + 'virt_prev_hop' : qkdn_ids[idx-1] if idx > 0 else None, + 'virt_next_hops' : qkdn_ids[idx+1:], + 'virt_bandwidth' : 0, + }) + + device.device_config.config_rules.append(ConfigRule(**json_config_rule)) + + if idx > 0: + json_config_rule = json_config_rule_set('/link/link[{:s}]'.format(service_qkdl_id_dst_src), { + 'uuid' : service_qkdl_id_dst_src, + 'type' : 'VIRTUAL', + 'src_qkdn_id' : dst_qkdn_id, + 'src_interface_id' : dst_interface_id, + 'dst_qkdn_id' : src_qkdn_id, + 'dst_interface_id' : src_interface_id, + 'virt_prev_hop' : qkdn_ids[idx+1] if idx < len(qkdn_ids) - 1 else None, + 'virt_next_hops' : qkdn_ids[idx-1::-1], + 'virt_bandwidth' : 0, + }) + + device.device_config.config_rules.append(ConfigRule(**json_config_rule)) + + + + json_config_rule = json_config_rule_set('/services/service[{:s}]'.format(service_uuid), { + 'uuid' : service_uuid, + 'qkdl_id_src_dst' : service_qkdl_id_src_dst, + 'qkdl_id_dst_src' : service_qkdl_id_dst_src, + }) + + device.device_config.config_rules.append(ConfigRule(**json_config_rule)) + self.__task_executor.configure_device(device) + + + if is_virtual: + + # Register App + internal_app_src_dst = { + 'app_id': {'context_id': {'context_uuid': {'uuid': context_uuid}}, 'app_uuid': {'uuid': str(uuid.uuid4())}}, + 'app_status': QKDAppStatusEnum.QKDAPPSTATUS_ON, + 'app_type': QKDAppTypesEnum.QKDAPPTYPES_INTERNAL, + 'server_app_id': '', + 'client_app_id': [], + 'backing_qkdl_id': [{'qkdl_uuid': {'uuid': service_qkdl_id_src_dst}}], + 'local_device_id': src_device.device_id, + 'remote_device_id': dst_device.device_id, + } + + self.__task_executor.register_app(App(**internal_app_src_dst)) + + + # Register App + internal_app_dst_src = { + 'app_id': {'context_id': {'context_uuid': {'uuid': context_uuid}}, 'app_uuid': {'uuid': str(uuid.uuid4())}}, + 'app_status': QKDAppStatusEnum.QKDAPPSTATUS_ON, + 'app_type': QKDAppTypesEnum.QKDAPPTYPES_INTERNAL, + 'server_app_id': '', + 'client_app_id': [], + 'backing_qkdl_id': [{'qkdl_uuid': {'uuid': service_qkdl_id_dst_src}}], + 'local_device_id': dst_device.device_id, + 'remote_device_id': src_device.device_id, + } + + self.__task_executor.register_app(App(**internal_app_dst_src)) + + results.append(True) + except Exception as e: # pylint: disable=broad-except + LOGGER.exception('Unable to SetEndpoint for Service({:s})'.format(str(service_uuid))) + results.append(e) + + return results + + # Optare: This will be to delete a service + def DeleteEndpoint( + self, endpoints : List[Tuple[str, str, Optional[str]]], + connection_uuid : Optional[str] = None + ) -> List[Union[bool, Exception]]: + """ Delete service endpoints form a list. + Parameters: + endpoints: List[Tuple[str, str, Optional[str]]] + List of tuples, each containing a device_uuid, + endpoint_uuid, and the topology_uuid of the endpoint + to be removed. + connection_uuid : Optional[str] + If specified, is the UUID of the connection this endpoint is associated to. + Returns: + results: List[Union[bool, Exception]] + List of results for endpoint deletions requested. + Return values must be in the same order as the requested + endpoints. If an endpoint is properly deleted, True must be + returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + raise NotImplementedError() + + # Optare: Can be ingored. It's in case if a service is later updated. Not required to proper functioning + + def SetConstraint(self, constraints: List[Tuple[str, Any]]) \ + -> List[Union[bool, Exception]]: + """ Create/Update service constraints. + Parameters: + constraints: List[Tuple[str, Any]] + List of tuples, each containing a constraint_type and the + new constraint_value to be set. + Returns: + results: List[Union[bool, Exception]] + List of results for constraint changes requested. + Return values must be in the same order as the requested + constraints. If a constraint is properly set, True must be + returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + raise NotImplementedError() + + def DeleteConstraint(self, constraints: List[Tuple[str, Any]]) \ + -> List[Union[bool, Exception]]: + """ Delete service constraints. + Parameters: + constraints: List[Tuple[str, Any]] + List of tuples, each containing a constraint_type pointing + to the constraint to be deleted, and a constraint_value + containing possible additionally required values to locate + the constraint to be removed. + Returns: + results: List[Union[bool, Exception]] + List of results for constraint deletions requested. + Return values must be in the same order as the requested + constraints. If a constraint is properly deleted, True must + be returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + raise NotImplementedError() + + def SetConfig(self, resources: List[Tuple[str, Any]]) \ + -> List[Union[bool, Exception]]: + """ Create/Update configuration for a list of service resources. + Parameters: + resources: List[Tuple[str, Any]] + List of tuples, each containing a resource_key pointing to + the resource to be modified, and a resource_value + containing the new value to be set. + Returns: + results: List[Union[bool, Exception]] + List of results for resource key changes requested. + Return values must be in the same order as the requested + resource keys. If a resource is properly set, True must be + returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + raise NotImplementedError() + + def DeleteConfig(self, resources: List[Tuple[str, Any]]) \ + -> List[Union[bool, Exception]]: + """ Delete configuration for a list of service resources. + Parameters: + resources: List[Tuple[str, Any]] + List of tuples, each containing a resource_key pointing to + the resource to be modified, and a resource_value containing + possible additionally required values to locate the value + to be removed. + Returns: + results: List[Union[bool, Exception]] + List of results for resource key deletions requested. + Return values must be in the same order as the requested + resource keys. If a resource is properly deleted, True must + be returned; otherwise, the Exception that is raised during + the processing must be returned. + """ + raise NotImplementedError() -- GitLab From 522300c4c3b356a1bec869fb8b89b9a3312a84ff Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 4 Sep 2024 13:14:48 +0000 Subject: [PATCH 547/602] Pre-merge code cleanup --- deploy/all.sh | 2 +- deploy/tfs.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/all.sh b/deploy/all.sh index e77ff22ae..2b9e219ea 100755 --- a/deploy/all.sh +++ b/deploy/all.sh @@ -27,7 +27,7 @@ export TFS_REGISTRY_IMAGES=${TFS_REGISTRY_IMAGES:-"http://localhost:32000/tfs/"} # If not already set, set the list of components, separated by spaces, you want to build images for, and deploy. # By default, only basic components are deployed -export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device ztp monitoring pathcomp service slice nbi webui load_generator dlt"} +export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device pathcomp service slice nbi webui load_generator"} # If not already set, set the tag you want to use for your images. export TFS_IMAGE_TAG=${TFS_IMAGE_TAG:-"dev"} diff --git a/deploy/tfs.sh b/deploy/tfs.sh index 00bc2d48f..2c152fd60 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -27,7 +27,7 @@ export TFS_REGISTRY_IMAGES=${TFS_REGISTRY_IMAGES:-"http://localhost:32000/tfs/"} # If not already set, set the list of components, separated by spaces, you want to build images for, and deploy. # By default, only basic components are deployed -export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device ztp monitoring pathcomp service slice nbi webui load_generator dlt"} +export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device pathcomp service slice nbi webui load_generator"} # If not already set, set the tag you want to use for your images. export TFS_IMAGE_TAG=${TFS_IMAGE_TAG:-"dev"} -- GitLab From 01b8535d0320324fcb153357ca7a69d671ba732a Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 4 Sep 2024 13:19:17 +0000 Subject: [PATCH 548/602] Recovered legacy Gateway code --- src/dlt/gateway/legacy/Dockerfile | 41 ++++ src/dlt/gateway/legacy/README.md | 134 +++++++++++++ src/dlt/gateway/legacy/build.gradle.kts | 147 ++++++++++++++ .../config/ca.org1.example.com-cert.pem | 14 ++ .../legacy/config/connection-org1.json | 73 +++++++ src/dlt/gateway/legacy/gradle.properties | 1 + .../legacy/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + src/dlt/gateway/legacy/gradlew | 185 ++++++++++++++++++ src/dlt/gateway/legacy/gradlew.bat | 89 +++++++++ src/dlt/gateway/legacy/settings.gradle.kts | 19 ++ .../gateway/legacy/src/main/kotlin/Main.kt | 161 +++++++++++++++ .../src/main/kotlin/fabric/ConnectGateway.kt | 54 +++++ .../src/main/kotlin/fabric/EnrollAdmin.kt | 29 +++ .../src/main/kotlin/fabric/FabricConnector.kt | 178 +++++++++++++++++ .../src/main/kotlin/fabric/RegisterUser.kt | 65 ++++++ .../src/main/kotlin/grpc/FabricServer.kt | 94 +++++++++ .../src/main/kotlin/grpc/GrpcHandler.kt | 95 +++++++++ .../legacy/src/main/kotlin/proto/Config.proto | 54 +++++ 19 files changed, 1438 insertions(+) create mode 100644 src/dlt/gateway/legacy/Dockerfile create mode 100644 src/dlt/gateway/legacy/README.md create mode 100644 src/dlt/gateway/legacy/build.gradle.kts create mode 100644 src/dlt/gateway/legacy/config/ca.org1.example.com-cert.pem create mode 100644 src/dlt/gateway/legacy/config/connection-org1.json create mode 100644 src/dlt/gateway/legacy/gradle.properties create mode 100644 src/dlt/gateway/legacy/gradle/wrapper/gradle-wrapper.jar create mode 100644 src/dlt/gateway/legacy/gradle/wrapper/gradle-wrapper.properties create mode 100755 src/dlt/gateway/legacy/gradlew create mode 100644 src/dlt/gateway/legacy/gradlew.bat create mode 100644 src/dlt/gateway/legacy/settings.gradle.kts create mode 100644 src/dlt/gateway/legacy/src/main/kotlin/Main.kt create mode 100644 src/dlt/gateway/legacy/src/main/kotlin/fabric/ConnectGateway.kt create mode 100644 src/dlt/gateway/legacy/src/main/kotlin/fabric/EnrollAdmin.kt create mode 100644 src/dlt/gateway/legacy/src/main/kotlin/fabric/FabricConnector.kt create mode 100644 src/dlt/gateway/legacy/src/main/kotlin/fabric/RegisterUser.kt create mode 100644 src/dlt/gateway/legacy/src/main/kotlin/grpc/FabricServer.kt create mode 100644 src/dlt/gateway/legacy/src/main/kotlin/grpc/GrpcHandler.kt create mode 100644 src/dlt/gateway/legacy/src/main/kotlin/proto/Config.proto diff --git a/src/dlt/gateway/legacy/Dockerfile b/src/dlt/gateway/legacy/Dockerfile new file mode 100644 index 000000000..5b888b410 --- /dev/null +++ b/src/dlt/gateway/legacy/Dockerfile @@ -0,0 +1,41 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +FROM zenika/kotlin:1.4-jdk12 + +# Make working directory move to it and copy DLT Gateway code +RUN mkdir -p /var/teraflow/dlt/gateway +WORKDIR /var/teraflow/dlt/gateway +COPY src/dlt/gateway/. ./ + +# Make directory for proto files and copy them +RUN mkdir proto +COPY proto/*.proto ./proto/ + +# Build DLT Gateway +RUN ./gradlew build + +EXPOSE 50051 + +# Create entrypoint.sh script +RUN echo "#!/bin/sh" > /entrypoint.sh +RUN echo "echo 195.37.154.24 peer0.org1.example.com >> /etc/hosts" >> /entrypoint.sh +RUN echo "echo 195.37.154.24 peer0.org2.example.com >> /etc/hosts" >> /entrypoint.sh +RUN echo "echo 195.37.154.24 orderer0.example.com >> /etc/hosts" >> /entrypoint.sh +RUN echo "cd /var/teraflow/dlt/gateway" >> /entrypoint.sh +RUN echo "./gradlew runServer" >> /entrypoint.sh +RUN chmod +x /entrypoint.sh + +# Gateway entry point +ENTRYPOINT ["sh", "/entrypoint.sh"] diff --git a/src/dlt/gateway/legacy/README.md b/src/dlt/gateway/legacy/README.md new file mode 100644 index 000000000..2cf6cfeb1 --- /dev/null +++ b/src/dlt/gateway/legacy/README.md @@ -0,0 +1,134 @@ +``` + NEC Laboratories Europe GmbH + + PROPRIETARY INFORMATION + + The software and its source code contain valuable trade secrets and + shall be maintained in confidence and treated as confidential + information. The software may only be used for evaluation and/or + testing purposes, unless otherwise explicitly stated in a written + agreement with NEC Laboratories Europe GmbH. + + Any unauthorized publication, transfer to third parties or + duplication of the object or source code - either totally or in + part - is strictly prohibited. + + Copyright (c) 2022 NEC Laboratories Europe GmbH + All Rights Reserved. + + Authors: Konstantin Munichev + + + NEC Laboratories Europe GmbH DISCLAIMS ALL WARRANTIES, EITHER + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND THE + WARRANTY AGAINST LATENT DEFECTS, WITH RESPECT TO THE PROGRAM AND + THE ACCOMPANYING DOCUMENTATION. + + NO LIABILITIES FOR CONSEQUENTIAL DAMAGES: IN NO EVENT SHALL NEC + Laboratories Europe GmbH or ANY OF ITS SUBSIDIARIES BE LIABLE FOR + ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR + LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF + INFORMATION, OR OTHER PECUNIARY LOSS AND INDIRECT, CONSEQUENTIAL, + INCIDENTAL, ECONOMIC OR PUNITIVE DAMAGES) ARISING OUT OF THE USE OF + OR INABILITY TO USE THIS PROGRAM, EVEN IF NEC Laboratories Europe + GmbH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. + ``` + +# DLT module guide + +## General information +The DLT module is used to provide access to the underlying Fabric deployment. It allows clients +to add, retrieve, modify and delete blockchain-backed data, essentially working as a key-value +database. External clients should use gRPC API to communicate with this service, its detailed +description available below. + +## Code structure +The whole DLT module consists of several packages: +- fabric package +- http package +- proto package +- client example + +### Fabric package +The most important class in this package is `FabricConnector`. First, it establishes connection +with the underlying Fabric network using Java Gateway SDK. After that, it could be used as a +CRUD interface. +Other files contain auxiliary code for `FabricConnector` which allows it to register/enroll +users and to obtain smart contract instances. + +### Grpc package +Contains server side gRPC handler. It accepts requests from the outside and performs the +requested operation. For the more detailed description see Proto package description right below. + +### Proto package +The proto package contains `dlt.proto` file which defines gRPC service `DltService` API and messages +it uses. There are 3 main functions: `RecordToDlt` which allows to create/modify/delete data, +`GetFromDlt` which returns already written data and `SubscribeToDlt` which allows clients subscribe +for future create/modify/delete events with provided filters. +Other proto files don't play any significant role and could be safely ignored by end users. + +### Client example +This code is not necessary to the service, but it could be used to test the service. It contains +a sample gRPC client which connects the service and perform all the CRUD operations. + +# Fabric deployment notes + +## General notes +Current Fabric deployment uses Fabric test network with some additional helping scripts on top of it. +To start the network just run the `raft.sh` from `blockchain/scripts` directory. Use `stop.sh` +when you need to stop the network. + +## Server start preparations +To run the server it's necessary to copy certificate file +`fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem` +to the config folder (replacing the existing one). Also, it's necessary to copy `scripts/connection-org1.json` +file (again, replacing the old one). After copying, it must be edited. First, all `localhost` entrances +should be replaced with `teraflow.nlehd.de`. Second, `channel` section at the end of the file should be removed. +This should be done after every restart of the Fabric network. + +## Fabric configuration +Even though a test network is easy to deploy and use it's better to perform a custom configuration +for a production deployment. In practice every participating organization will likely prefer to have +its own Peer/Orderer/CA instances to prevent possible dependency on any other participants. This leads +not only to a better privacy/availability/security in general but also to the more complicated +deployment process as a side effect. Here we provide a very brief description of the most important points. + +### Organizations +Organization represents a network participant, which can be an individual, a large corporation or any other +entity. Each organization has its own CAs, orderers and peers. The recommendation here is to create an +organization entity for every independent participant and then decide how many CAs/peers/orderers does +every organization need and which channels should it has access to based on the exact project's goals. + +### Channels +Each channel represents an independent ledger with its own genesis block. Each transaction is executed +on a specific channel, and it's possible to define which organization has access to a given channel. +As a result channels are a pretty powerful privacy mechanism which allows to limit access to the private +data between organization. + +### Certificate authorities, peers and orderers +Certificate authorities (CA) are used to generate crypto materials for each organization. Two types of CA +exist: one is used to generate the certificates of the admin, the MSP and certificates of non-admin users. +Another type of CA is used to generate TLS certificates. As a result it's preferable to have at least two +CAs for every organization. + +Peers are entities which host ledgers and smart contracts. They communicate with applications and orderers, +receiving chaincode invocations (proposals), invoking chaincode, updating ledger when necessary and +returning result of execution. Peers can handle one or many ledgers, depending on the configuration. It's +very use case specific how many peers are necessary to the exact deployment. + +Orderers are used to execute a consensus in a distributing network making sure that every channel participant +has the same blocks with the same data. The default consensus algorithm is Raft which provides only a crash +fault tolerance. + +### Conclusion +As you can see, configuration procedure for Fabric is pretty tricky and includes quite a lot of entities. +In real world it will very likely involve participants from multiple organizations each of them performing +its own part of configuration. + +As a further reading it's recommended to start with the +[official deployment guide](https://hyperledger-fabric.readthedocs.io/en/release-2.2/deployment_guide_overview.html). +It contains a high level overview of a deployment process as well as links to the detailed descriptions to +CA/Peer/Orderer configuration descriptions. \ No newline at end of file diff --git a/src/dlt/gateway/legacy/build.gradle.kts b/src/dlt/gateway/legacy/build.gradle.kts new file mode 100644 index 000000000..b65aff89e --- /dev/null +++ b/src/dlt/gateway/legacy/build.gradle.kts @@ -0,0 +1,147 @@ +// NEC Laboratories Europe GmbH +// +// PROPRIETARY INFORMATION +// +// The software and its source code contain valuable trade secrets and +// shall be maintained in confidence and treated as confidential +// information. The software may only be used for evaluation and/or +// testing purposes, unless otherwise explicitly stated in a written +// agreement with NEC Laboratories Europe GmbH. +// +// Any unauthorized publication, transfer to third parties or +// duplication of the object or source code - either totally or in +// part - is strictly prohibited. +// +// Copyright (c) 2021 NEC Laboratories Europe GmbH +// All Rights Reserved. +// +// Authors: Konstantin Munichev +// +// +// NEC Laboratories Europe GmbH DISCLAIMS ALL WARRANTIES, EITHER +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES +// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND THE +// WARRANTY AGAINST LATENT DEFECTS, WITH RESPECT TO THE PROGRAM AND +// THE ACCOMPANYING DOCUMENTATION. +// +// NO LIABILITIES FOR CONSEQUENTIAL DAMAGES: IN NO EVENT SHALL NEC +// Laboratories Europe GmbH or ANY OF ITS SUBSIDIARIES BE LIABLE FOR +// ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR +// LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF +// INFORMATION, OR OTHER PECUNIARY LOSS AND INDIRECT, CONSEQUENTIAL, +// INCIDENTAL, ECONOMIC OR PUNITIVE DAMAGES) ARISING OUT OF THE USE OF +// OR INABILITY TO USE THIS PROGRAM, EVEN IF NEC Laboratories Europe +// GmbH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +// +// THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. + +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +import com.google.protobuf.gradle.generateProtoTasks +import com.google.protobuf.gradle.id +import com.google.protobuf.gradle.plugins +import com.google.protobuf.gradle.protobuf +import com.google.protobuf.gradle.protoc + +ext["grpcVersion"] = "1.47.0" +ext["grpcKotlinVersion"] = "1.3.0" // CURRENT_GRPC_KOTLIN_VERSION +ext["protobufVersion"] = "3.20.1" +ext["ktorVersion"] = "1.6.5" + +plugins { + kotlin("jvm") version "1.6.21" + kotlin("plugin.serialization") version "1.4.21" + id("com.google.protobuf") version "0.8.18" + application +} + +group = "eu.neclab" +version = "1.0-SNAPSHOT" + +repositories { + mavenLocal() + google() + mavenCentral() +} + +dependencies { + implementation(kotlin("stdlib-jdk8")) + testImplementation("org.jetbrains.kotlin:kotlin-test:1.6.21") + implementation("javax.annotation:javax.annotation-api:1.3.2") + implementation("io.grpc:grpc-kotlin-stub:1.3.0") + implementation("io.grpc:grpc-protobuf:1.47.0") + implementation("com.google.protobuf:protobuf-kotlin:3.21.1") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.3") + implementation("org.hyperledger.fabric:fabric-gateway-java:2.2.5") + implementation("ch.qos.logback:logback-classic:1.2.11") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.1") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-protobuf:1.3.1") + runtimeOnly("io.grpc:grpc-netty:${rootProject.ext["grpcVersion"]}") +} + +tasks.test { + useJUnitPlatform() +} + +tasks.withType { + kotlinOptions.jvmTarget = "11" +} + +tasks.withType().all { + kotlinOptions { + freeCompilerArgs = listOf("-Xopt-in=kotlin.RequiresOptIn") + } +} + + +application { + mainClass.set("MainKt") +} + +task("runServer", JavaExec::class) { + main = "grpc.FabricServerKt" + classpath = sourceSets["main"].runtimeClasspath +} + + +sourceSets { + main { + proto { + srcDir("proto") + srcDir("src/main/kotlin/proto") + } + } +} + +sourceSets { + val main by getting { } + main.java.srcDirs("build/generated/source/proto/main/grpc") + main.java.srcDirs("build/generated/source/proto/main/grpckt") + main.java.srcDirs("build/generated/source/proto/main/java") + main.java.srcDirs("build/generated/source/proto/main/kotlin") +} + +protobuf { + protoc { + artifact = "com.google.protobuf:protoc:${rootProject.ext["protobufVersion"]}" + } + plugins { + id("grpc") { + artifact = "io.grpc:protoc-gen-grpc-java:${rootProject.ext["grpcVersion"]}" + } + id("grpckt") { + artifact = "io.grpc:protoc-gen-grpc-kotlin:${rootProject.ext["grpcKotlinVersion"]}:jdk8@jar" + } + } + generateProtoTasks { + all().forEach { + it.plugins { + id("grpc") + id("grpckt") + } + it.builtins { + id("kotlin") + } + } + } +} diff --git a/src/dlt/gateway/legacy/config/ca.org1.example.com-cert.pem b/src/dlt/gateway/legacy/config/ca.org1.example.com-cert.pem new file mode 100644 index 000000000..d7fdf63cc --- /dev/null +++ b/src/dlt/gateway/legacy/config/ca.org1.example.com-cert.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICJzCCAc2gAwIBAgIUb5gDMfVeVdQjFkK3uC8LtlogN+gwCgYIKoZIzj0EAwIw +cDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH +EwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh +Lm9yZzEuZXhhbXBsZS5jb20wHhcNMjIwOTI3MDgzMDAwWhcNMzcwOTIzMDgzMDAw +WjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV +BAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT +Y2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDC3 +spCTT3pjfFXxkX/SFuBgWRiceR8rSoCNQOnIPeNGZK8xl2Zr7VuY06gqy9c+ecSU +PUWaXiCQxiLgZuS6TOWjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG +AQH/AgEBMB0GA1UdDgQWBBRFWSc7GZqcJJyJjXSEspzgAYInGzAKBggqhkjOPQQD +AgNIADBFAiEAodqc+adkiMuU6iv1IF8uJ/nMQbvMGoP3pb2827QzDosCICOw6W+y +uH03H3RO6KhOcS1ZzPjspyjrcC+dwzYX4DpW +-----END CERTIFICATE----- diff --git a/src/dlt/gateway/legacy/config/connection-org1.json b/src/dlt/gateway/legacy/config/connection-org1.json new file mode 100644 index 000000000..6f6f3f08d --- /dev/null +++ b/src/dlt/gateway/legacy/config/connection-org1.json @@ -0,0 +1,73 @@ +{ + "name": "test-network-org1", + "version": "1.0.0", + "client": { + "organization": "Org1", + "connection": { + "timeout": { + "peer": { + "endorser": "300" + } + } + } + }, + "organizations": { + "Org1": { + "mspid": "Org1MSP", + "peers": [ + "peer0.org1.example.com" + ], + "certificateAuthorities": [ + "ca.org1.example.com" + ] + } + }, + "peers": { + "peer0.org1.example.com": { + "url": "grpcs://teraflow.nlehd.de:7051", + "tlsCACerts": { + "pem": "-----BEGIN CERTIFICATE-----\nMIICJzCCAc2gAwIBAgIUb5gDMfVeVdQjFkK3uC8LtlogN+gwCgYIKoZIzj0EAwIw\ncDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH\nEwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjIwOTI3MDgzMDAwWhcNMzcwOTIzMDgzMDAw\nWjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV\nBAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT\nY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDC3\nspCTT3pjfFXxkX/SFuBgWRiceR8rSoCNQOnIPeNGZK8xl2Zr7VuY06gqy9c+ecSU\nPUWaXiCQxiLgZuS6TOWjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEBMB0GA1UdDgQWBBRFWSc7GZqcJJyJjXSEspzgAYInGzAKBggqhkjOPQQD\nAgNIADBFAiEAodqc+adkiMuU6iv1IF8uJ/nMQbvMGoP3pb2827QzDosCICOw6W+y\nuH03H3RO6KhOcS1ZzPjspyjrcC+dwzYX4DpW\n-----END CERTIFICATE-----\n" + }, + "grpcOptions": { + "ssl-target-name-override": "peer0.org1.example.com", + "hostnameOverride": "peer0.org1.example.com" + } + }, + "peer0.org2.example.com": { + "url": "grpcs://teraflow.nlehd.de:9051", + "tlsCACerts": { + "pem": "-----BEGIN CERTIFICATE-----\nMIICHjCCAcWgAwIBAgIUL48scgv9ItATkBjSNhzYDjLUDsAwCgYIKoZIzj0EAwIw\nbDELMAkGA1UEBhMCVUsxEjAQBgNVBAgTCUhhbXBzaGlyZTEQMA4GA1UEBxMHSHVy\nc2xleTEZMBcGA1UEChMQb3JnMi5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eub3Jn\nMi5leGFtcGxlLmNvbTAeFw0yMjA5MjcwODMwMDBaFw0zNzA5MjMwODMwMDBaMGwx\nCzAJBgNVBAYTAlVLMRIwEAYDVQQIEwlIYW1wc2hpcmUxEDAOBgNVBAcTB0h1cnNs\nZXkxGTAXBgNVBAoTEG9yZzIuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2NhLm9yZzIu\nZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQ5qz8FfrEQ5S08\nr/avPyTrF2grXj5L4DnbvF4YEZ5Usnbm8Svovu7PO8uiVcwT5vrt6ssOdpBFZYu3\nNndpojnYo0UwQzAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBATAd\nBgNVHQ4EFgQUYcp7axYV9AaIptYQqhiCL0VDmXQwCgYIKoZIzj0EAwIDRwAwRAIg\nWT1V8/6flUPNcBkmbtEEKf83k7+6sR9k1a2wtVeJFnQCIE0ZSIL3k0dKQydQBpiz\nPcZZUULvQivcMlIsw5+mjIGc\n-----END CERTIFICATE-----\n" + }, + "grpcOptions": { + "ssl-target-name-override": "peer0.org2.example.com", + "hostnameOverride": "peer0.org2.example.com" + } + } + }, + "certificateAuthorities": { + "ca.org1.example.com": { + "url": "https://teraflow.nlehd.de:7054", + "caName": "ca-org1", + "tlsCACerts": { + "pem": [ + "-----BEGIN CERTIFICATE-----\nMIICJzCCAc2gAwIBAgIUb5gDMfVeVdQjFkK3uC8LtlogN+gwCgYIKoZIzj0EAwIw\ncDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH\nEwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjIwOTI3MDgzMDAwWhcNMzcwOTIzMDgzMDAw\nWjBwMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExDzANBgNV\nBAcTBkR1cmhhbTEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMT\nY2Eub3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDC3\nspCTT3pjfFXxkX/SFuBgWRiceR8rSoCNQOnIPeNGZK8xl2Zr7VuY06gqy9c+ecSU\nPUWaXiCQxiLgZuS6TOWjRTBDMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEBMB0GA1UdDgQWBBRFWSc7GZqcJJyJjXSEspzgAYInGzAKBggqhkjOPQQD\nAgNIADBFAiEAodqc+adkiMuU6iv1IF8uJ/nMQbvMGoP3pb2827QzDosCICOw6W+y\nuH03H3RO6KhOcS1ZzPjspyjrcC+dwzYX4DpW\n-----END CERTIFICATE-----\n" + ] + }, + "httpOptions": { + "verify": false + } + } + }, + "orderers": { + "orderer0.example.com": { + "url": "grpcs://teraflow.nlehd.de:7050", + "tlsCACerts": { + "pem": "-----BEGIN CERTIFICATE-----\nMIICCzCCAbGgAwIBAgIUdZQo3q4OqyxIkidmAV4QkewCylIwCgYIKoZIzj0EAwIw\nYjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQHEwhOZXcg\nWW9yazEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1wbGUu\nY29tMB4XDTIyMDkyNzA4MzAwMFoXDTM3MDkyMzA4MzAwMFowYjELMAkGA1UEBhMC\nVVMxETAPBgNVBAgTCE5ldyBZb3JrMREwDwYDVQQHEwhOZXcgWW9yazEUMBIGA1UE\nChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1wbGUuY29tMFkwEwYHKoZI\nzj0CAQYIKoZIzj0DAQcDQgAERR0UzsHSFoyON+9Noxmk1IhnTvSdLWGgEpEwrqVr\n5DwitkeJwRWq134JBTmXuZzsUG87oN6Hr94XAEe4j9Zq8qNFMEMwDgYDVR0PAQH/\nBAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwHQYDVR0OBBYEFN8XsELp/X0akrlJ\nY3/BWo2jZS3cMAoGCCqGSM49BAMCA0gAMEUCIQCZYYXW/0h3Kq4BmROpOHfrondg\nopf5LndeujYlH3i8tQIgCtpTQiDXZd+IAUduRmn7a46CwJSbjYbXFVX5vumIbE4=\n-----END CERTIFICATE-----\n" + }, + "grpcOptions": { + "ssl-target-name-override": "orderer0.example.com", + "hostnameOverride": "orderer0.example.com" + } + } + } +} diff --git a/src/dlt/gateway/legacy/gradle.properties b/src/dlt/gateway/legacy/gradle.properties new file mode 100644 index 000000000..7fc6f1ff2 --- /dev/null +++ b/src/dlt/gateway/legacy/gradle.properties @@ -0,0 +1 @@ +kotlin.code.style=official diff --git a/src/dlt/gateway/legacy/gradle/wrapper/gradle-wrapper.jar b/src/dlt/gateway/legacy/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/src/dlt/gateway/legacy/gradle/wrapper/gradle-wrapper.properties b/src/dlt/gateway/legacy/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..69a971507 --- /dev/null +++ b/src/dlt/gateway/legacy/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/src/dlt/gateway/legacy/gradlew b/src/dlt/gateway/legacy/gradlew new file mode 100755 index 000000000..744e882ed --- /dev/null +++ b/src/dlt/gateway/legacy/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# 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 +# +# https://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. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MSYS* | MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/src/dlt/gateway/legacy/gradlew.bat b/src/dlt/gateway/legacy/gradlew.bat new file mode 100644 index 000000000..ac1b06f93 --- /dev/null +++ b/src/dlt/gateway/legacy/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/dlt/gateway/legacy/settings.gradle.kts b/src/dlt/gateway/legacy/settings.gradle.kts new file mode 100644 index 000000000..77fa0f0b2 --- /dev/null +++ b/src/dlt/gateway/legacy/settings.gradle.kts @@ -0,0 +1,19 @@ +/* + * 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. + */ + + +rootProject.name = "gateway" + diff --git a/src/dlt/gateway/legacy/src/main/kotlin/Main.kt b/src/dlt/gateway/legacy/src/main/kotlin/Main.kt new file mode 100644 index 000000000..c57c9e980 --- /dev/null +++ b/src/dlt/gateway/legacy/src/main/kotlin/Main.kt @@ -0,0 +1,161 @@ +// NEC Laboratories Europe GmbH +// +// PROPRIETARY INFORMATION +// +// The software and its source code contain valuable trade secrets and +// shall be maintained in confidence and treated as confidential +// information. The software may only be used for evaluation and/or +// testing purposes, unless otherwise explicitly stated in a written +// agreement with NEC Laboratories Europe GmbH. +// +// Any unauthorized publication, transfer to third parties or +// duplication of the object or source code - either totally or in +// part - is strictly prohibited. +// +// Copyright (c) 2022 NEC Laboratories Europe GmbH +// All Rights Reserved. +// +// Authors: Konstantin Munichev +// +// +// NEC Laboratories Europe GmbH DISCLAIMS ALL WARRANTIES, EITHER +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES +// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND THE +// WARRANTY AGAINST LATENT DEFECTS, WITH RESPECT TO THE PROGRAM AND +// THE ACCOMPANYING DOCUMENTATION. +// +// NO LIABILITIES FOR CONSEQUENTIAL DAMAGES: IN NO EVENT SHALL NEC +// Laboratories Europe GmbH or ANY OF ITS SUBSIDIARIES BE LIABLE FOR +// ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR +// LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF +// INFORMATION, OR OTHER PECUNIARY LOSS AND INDIRECT, CONSEQUENTIAL, +// INCIDENTAL, ECONOMIC OR PUNITIVE DAMAGES) ARISING OUT OF THE USE OF +// OR INABILITY TO USE THIS PROGRAM, EVEN IF NEC Laboratories Europe +// GmbH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +// +// THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. + +import context.ContextOuterClass +import io.grpc.ManagedChannel +import io.grpc.ManagedChannelBuilder +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import dlt.DltGateway +import dlt.DltGatewayServiceGrpcKt +import java.io.Closeable +import java.util.* +import java.util.concurrent.TimeUnit + +class DltServiceClient(private val channel: ManagedChannel) : Closeable { + private val stub: DltGatewayServiceGrpcKt.DltGatewayServiceCoroutineStub = + DltGatewayServiceGrpcKt.DltGatewayServiceCoroutineStub(channel) + + suspend fun putData(data: DltGateway.DltRecord) { + println("Sending record ${data.recordId}...") + val response = stub.recordToDlt(data) + println("Response: ${response.recordId}") + } + + suspend fun getData(id: DltGateway.DltRecordId) { + println("Requesting record $id...") + val response = stub.getFromDlt(id) + println("Got data: $response") + } + + fun subscribe(filter: DltGateway.DltRecordSubscription) { + val subscription = stub.subscribeToDlt(filter) + GlobalScope.launch { + subscription.collect { + println("Got subscription event") + println(it) + } + } + } + + override fun close() { + channel.shutdown().awaitTermination(5, TimeUnit.SECONDS) + } +} + + +fun main() = runBlocking { + val port = 50051 + val channel = ManagedChannelBuilder.forAddress("localhost", port).usePlaintext().build() + + val client = DltServiceClient(channel) + + val domainUuid = UUID.randomUUID().toString() + val recordUuid = UUID.randomUUID().toString() + println("New domain uuid $domainUuid") + println("New record uuid $recordUuid") + + val id = DltGateway.DltRecordId.newBuilder() + .setDomainUuid( + ContextOuterClass.Uuid.newBuilder() + .setUuid(domainUuid) + ) + .setRecordUuid( + ContextOuterClass.Uuid.newBuilder() + .setUuid(recordUuid) + ) + .setType(DltGateway.DltRecordTypeEnum.DLTRECORDTYPE_SERVICE) + .build() + + val subscription = DltGateway.DltRecordSubscription.newBuilder() + .addType(DltGateway.DltRecordTypeEnum.DLTRECORDTYPE_CONTEXT) + .addType(DltGateway.DltRecordTypeEnum.DLTRECORDTYPE_LINK) + .addType(DltGateway.DltRecordTypeEnum.DLTRECORDTYPE_SERVICE) + .addOperation(DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_ADD) + .addOperation(DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_UPDATE) + .addOperation(DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_DELETE) + .build() + + client.subscribe(subscription) + + Thread.sleep(5000) + + val data = DltGateway.DltRecord.newBuilder() + .setRecordId(id) + .setOperation(DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_ADD) + .setDataJson("\"{\"device_config\": {\"config_rules\": []}, \"device_drivers\": []," + + "\"device_endpoints\": [], \"device_id\": {\"device_uuid\": {\"uuid\": \"dev-12345\"}}," + + "\"device_operational_status\": \"DEVICEOPERATIONALSTATUS_ENABLED\"," + + "\"device_type\": \"packet-router\"}\", \"operation\": \"DLTRECORDOPERATION_ADD\"," + + "\"record_id\": {\"domain_uuid\": {\"uuid\": \"tfs-a\"}, \"record_uuid\": {\"uuid\": \"dev-12345\"}," + + "\"type\": \"DLTRECORDTYPE_DEVICE\"}") + .build() + + println("sending new record") + client.putData(data) + client.getData(id) + + Thread.sleep(5000) + + val updateData = DltGateway.DltRecord.newBuilder() + .setRecordId(id) + .setOperation(DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_UPDATE) + .setDataJson("{\"name\": \"test\"}") + .build() + + println("updating record") + client.putData(updateData) + client.getData(id) + + Thread.sleep(5000) + + val removeData = DltGateway.DltRecord.newBuilder() + .setRecordId(id) + .setOperation(DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_DELETE) + .setDataJson("{\"name\": \"test\"}") + .build() + + println("removing record") + client.putData(removeData) + try { + client.getData(id) + } catch (e: Exception) { + println(e.toString()) + } + Thread.sleep(5000) +} diff --git a/src/dlt/gateway/legacy/src/main/kotlin/fabric/ConnectGateway.kt b/src/dlt/gateway/legacy/src/main/kotlin/fabric/ConnectGateway.kt new file mode 100644 index 000000000..00ec40d57 --- /dev/null +++ b/src/dlt/gateway/legacy/src/main/kotlin/fabric/ConnectGateway.kt @@ -0,0 +1,54 @@ +// NEC Laboratories Europe GmbH +// +// PROPRIETARY INFORMATION +// +// The software and its source code contain valuable trade secrets and +// shall be maintained in confidence and treated as confidential +// information. The software may only be used for evaluation and/or +// testing purposes, unless otherwise explicitly stated in a written +// agreement with NEC Laboratories Europe GmbH. +// +// Any unauthorized publication, transfer to third parties or +// duplication of the object or source code - either totally or in +// part - is strictly prohibited. +// +// Copyright (c) 2022 NEC Laboratories Europe GmbH +// All Rights Reserved. +// +// Authors: Konstantin Munichev +// +// +// NEC Laboratories Europe GmbH DISCLAIMS ALL WARRANTIES, EITHER +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES +// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND THE +// WARRANTY AGAINST LATENT DEFECTS, WITH RESPECT TO THE PROGRAM AND +// THE ACCOMPANYING DOCUMENTATION. +// +// NO LIABILITIES FOR CONSEQUENTIAL DAMAGES: IN NO EVENT SHALL NEC +// Laboratories Europe GmbH or ANY OF ITS SUBSIDIARIES BE LIABLE FOR +// ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR +// LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF +// INFORMATION, OR OTHER PECUNIARY LOSS AND INDIRECT, CONSEQUENTIAL, +// INCIDENTAL, ECONOMIC OR PUNITIVE DAMAGES) ARISING OUT OF THE USE OF +// OR INABILITY TO USE THIS PROGRAM, EVEN IF NEC Laboratories Europe +// GmbH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +// +// THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. + +package fabric + +import org.hyperledger.fabric.gateway.Contract +import org.hyperledger.fabric.gateway.Gateway +import org.hyperledger.fabric.gateway.Wallet +import java.nio.file.Paths + +// helper function for getting connected to the gateway +fun getContract(config: proto.Config.DltConfig, wallet: Wallet): Contract { + // load a CCP + val networkConfigPath = Paths.get(config.connectionFile) + val builder = Gateway.createBuilder() + builder.identity(wallet, config.user).networkConfig(networkConfigPath).discovery(true) + val gateway = builder.connect() + val network = gateway.getNetwork(config.channel) + return network.getContract(config.contract) +} \ No newline at end of file diff --git a/src/dlt/gateway/legacy/src/main/kotlin/fabric/EnrollAdmin.kt b/src/dlt/gateway/legacy/src/main/kotlin/fabric/EnrollAdmin.kt new file mode 100644 index 000000000..b44202719 --- /dev/null +++ b/src/dlt/gateway/legacy/src/main/kotlin/fabric/EnrollAdmin.kt @@ -0,0 +1,29 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +package fabric + +import org.hyperledger.fabric.gateway.Identities +import org.hyperledger.fabric.gateway.Wallet +import org.hyperledger.fabric_ca.sdk.EnrollmentRequest +import org.hyperledger.fabric_ca.sdk.HFCAClient + +fun enrollAdmin(config: proto.Config.DltConfig, caClient: HFCAClient, wallet: Wallet) { + // Check to see if we've already enrolled the admin user. + if (wallet.get(config.caAdmin) != null) { + println("An identity for the admin user ${config.caAdmin} already exists in the wallet") + return + } + + // Enroll the admin user, and import the new identity into the wallet. + val enrollmentRequestTLS = EnrollmentRequest() + enrollmentRequestTLS.addHost(config.caUrl) + enrollmentRequestTLS.profile = "tls" + val enrollment = caClient.enroll(config.caAdmin, config.caAdminSecret, enrollmentRequestTLS) + val user = Identities.newX509Identity(config.msp, enrollment) + wallet.put(config.caAdmin, user) + println("Successfully enrolled user ${config.caAdmin} and imported it into the wallet") +} diff --git a/src/dlt/gateway/legacy/src/main/kotlin/fabric/FabricConnector.kt b/src/dlt/gateway/legacy/src/main/kotlin/fabric/FabricConnector.kt new file mode 100644 index 000000000..af6592be9 --- /dev/null +++ b/src/dlt/gateway/legacy/src/main/kotlin/fabric/FabricConnector.kt @@ -0,0 +1,178 @@ +// NEC Laboratories Europe GmbH +// +// PROPRIETARY INFORMATION +// +// The software and its source code contain valuable trade secrets and +// shall be maintained in confidence and treated as confidential +// information. The software may only be used for evaluation and/or +// testing purposes, unless otherwise explicitly stated in a written +// agreement with NEC Laboratories Europe GmbH. +// +// Any unauthorized publication, transfer to third parties or +// duplication of the object or source code - either totally or in +// part - is strictly prohibited. +// +// Copyright (c) 2022 NEC Laboratories Europe GmbH +// All Rights Reserved. +// +// Authors: Konstantin Munichev +// +// +// NEC Laboratories Europe GmbH DISCLAIMS ALL WARRANTIES, EITHER +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES +// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND THE +// WARRANTY AGAINST LATENT DEFECTS, WITH RESPECT TO THE PROGRAM AND +// THE ACCOMPANYING DOCUMENTATION. +// +// NO LIABILITIES FOR CONSEQUENTIAL DAMAGES: IN NO EVENT SHALL NEC +// Laboratories Europe GmbH or ANY OF ITS SUBSIDIARIES BE LIABLE FOR +// ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR +// LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF +// INFORMATION, OR OTHER PECUNIARY LOSS AND INDIRECT, CONSEQUENTIAL, +// INCIDENTAL, ECONOMIC OR PUNITIVE DAMAGES) ARISING OUT OF THE USE OF +// OR INABILITY TO USE THIS PROGRAM, EVEN IF NEC Laboratories Europe +// GmbH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +// +// THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. + +package fabric + +import context.ContextOuterClass +import dlt.DltGateway.DltRecord +import dlt.DltGateway.DltRecordEvent +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.runBlocking +import org.hyperledger.fabric.gateway.Contract +import org.hyperledger.fabric.gateway.ContractEvent +import org.hyperledger.fabric.gateway.Wallet +import org.hyperledger.fabric.gateway.Wallets +import org.hyperledger.fabric.sdk.security.CryptoSuiteFactory +import org.hyperledger.fabric_ca.sdk.HFCAClient +import proto.Config +import java.nio.file.Paths +import java.util.* +import java.util.function.Consumer + +class FabricConnector(val config: Config.DltConfig) { + private val caClient: HFCAClient + private val wallet: Wallet + private val contract: Contract + + private val channels: MutableList> = mutableListOf() + + private val encoder: Base64.Encoder = Base64.getEncoder() + private val decoder: Base64.Decoder = Base64.getDecoder() + + init { + // Create a CA client for interacting with the CA. + val props = Properties() + props["pemFile"] = config.caCertFile + props["allowAllHostNames"] = "true" + caClient = HFCAClient.createNewInstance(config.caUrl, props) + val cryptoSuite = CryptoSuiteFactory.getDefault().cryptoSuite + caClient.cryptoSuite = cryptoSuite + + // Create a wallet for managing identities + wallet = Wallets.newFileSystemWallet(Paths.get(config.wallet)) + contract = connect() + + fabricSubscribe() + } + + private fun fabricSubscribe() { + val consumer = Consumer { event: ContractEvent? -> + run { + println("new event detected") + val record = DltRecord.parseFrom(decoder.decode(event?.payload?.get())) + println(record.recordId.recordUuid) + val eventType: ContextOuterClass.EventTypeEnum = when (event?.name) { + "Add" -> ContextOuterClass.EventTypeEnum.EVENTTYPE_CREATE + "Update" -> ContextOuterClass.EventTypeEnum.EVENTTYPE_UPDATE + "Remove" -> ContextOuterClass.EventTypeEnum.EVENTTYPE_REMOVE + else -> ContextOuterClass.EventTypeEnum.EVENTTYPE_UNDEFINED + } + val pbEvent = DltRecordEvent.newBuilder() + .setEvent( + ContextOuterClass.Event.newBuilder() + .setTimestamp( + ContextOuterClass.Timestamp.newBuilder() + .setTimestamp(System.currentTimeMillis().toDouble()) + ) + .setEventType(eventType) + ) + .setRecordId(record.recordId) + .build() + + runBlocking { + channels.forEach { + it.trySend(pbEvent) + } + } + } + } + contract.addContractListener(consumer) + } + + fun connect(): Contract { + enrollAdmin(config, caClient, wallet) + registerUser(config, caClient, wallet) + return getContract(config, wallet) + } + + fun putData(record: DltRecord): String { + println(record.toString()) + + try { + contract.submitTransaction( + "AddRecord", + record.recordId.recordUuid.uuid, + encoder.encodeToString(record.toByteArray()) + ) + } catch (e: Exception) { + println(e.toString()) + return e.toString() + } + return "" + } + + fun getData(uuid: String): DltRecord { + return try { + val result = contract.evaluateTransaction("GetRecord", uuid) + DltRecord.parseFrom(decoder.decode(result)) + } catch (e: Exception) { + println(e.toString()) + DltRecord.getDefaultInstance() + } + } + + fun updateData(record: DltRecord): String { + try { + contract.submitTransaction( + "UpdateRecord", + record.recordId.recordUuid.uuid, + encoder.encodeToString(record.toByteArray()) + ) + } catch (e: Exception) { + return e.toString() + } + return "" + } + + fun deleteData(record: DltRecord): String { + try { + contract.submitTransaction( + "DeleteRecord", + record.recordId.recordUuid.uuid, + ) + } catch (e: Exception) { + return e.toString() + } + return "" + } + + fun subscribeForEvents(): Channel { + val produceCh = Channel() + channels.add(produceCh) + return produceCh + } +} \ No newline at end of file diff --git a/src/dlt/gateway/legacy/src/main/kotlin/fabric/RegisterUser.kt b/src/dlt/gateway/legacy/src/main/kotlin/fabric/RegisterUser.kt new file mode 100644 index 000000000..fb5cc2969 --- /dev/null +++ b/src/dlt/gateway/legacy/src/main/kotlin/fabric/RegisterUser.kt @@ -0,0 +1,65 @@ +/* +SPDX-License-Identifier: Apache-2.0 +*/ +package fabric + +import org.hyperledger.fabric.gateway.Identities +import org.hyperledger.fabric.gateway.Wallet +import org.hyperledger.fabric.gateway.X509Identity +import org.hyperledger.fabric.sdk.Enrollment +import org.hyperledger.fabric.sdk.User +import org.hyperledger.fabric_ca.sdk.HFCAClient +import org.hyperledger.fabric_ca.sdk.RegistrationRequest +import java.security.PrivateKey + +fun registerUser(config: proto.Config.DltConfig, caClient: HFCAClient, wallet: Wallet) { + // Check to see if we've already enrolled the user. + if (wallet[config.user] != null) { + println("An identity for the user ${config.user} already exists in the wallet") + return + } + val adminIdentity = wallet[config.caAdmin] as X509Identity + val admin = object : User { + override fun getName(): String { + return config.caAdmin + } + + override fun getRoles(): Set? { + return null + } + + override fun getAccount(): String? { + return null + } + + override fun getAffiliation(): String { + return config.affiliation + } + + override fun getEnrollment(): Enrollment { + return object : Enrollment { + override fun getKey(): PrivateKey { + return adminIdentity.privateKey + } + + override fun getCert(): String { + return Identities.toPemString(adminIdentity.certificate) + } + } + } + + override fun getMspId(): String { + return config.msp + } + } + + // Register the user, enroll the user, and import the new identity into the wallet. + val registrationRequest = RegistrationRequest(config.user) + registrationRequest.affiliation = config.affiliation + registrationRequest.enrollmentID = config.user + val enrollmentSecret = caClient.register(registrationRequest, admin) + val enrollment = caClient.enroll(config.user, enrollmentSecret) + val user = Identities.newX509Identity(config.msp, enrollment) + wallet.put(config.user, user) + println("Successfully enrolled user ${config.user} and imported it into the wallet") +} diff --git a/src/dlt/gateway/legacy/src/main/kotlin/grpc/FabricServer.kt b/src/dlt/gateway/legacy/src/main/kotlin/grpc/FabricServer.kt new file mode 100644 index 000000000..9b4e1f4dc --- /dev/null +++ b/src/dlt/gateway/legacy/src/main/kotlin/grpc/FabricServer.kt @@ -0,0 +1,94 @@ +// NEC Laboratories Europe GmbH +// +// PROPRIETARY INFORMATION +// +// The software and its source code contain valuable trade secrets and +// shall be maintained in confidence and treated as confidential +// information. The software may only be used for evaluation and/or +// testing purposes, unless otherwise explicitly stated in a written +// agreement with NEC Laboratories Europe GmbH. +// +// Any unauthorized publication, transfer to third parties or +// duplication of the object or source code - either totally or in +// part - is strictly prohibited. +// +// Copyright (c) 2022 NEC Laboratories Europe GmbH +// All Rights Reserved. +// +// Authors: Konstantin Munichev +// +// +// NEC Laboratories Europe GmbH DISCLAIMS ALL WARRANTIES, EITHER +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES +// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND THE +// WARRANTY AGAINST LATENT DEFECTS, WITH RESPECT TO THE PROGRAM AND +// THE ACCOMPANYING DOCUMENTATION. +// +// NO LIABILITIES FOR CONSEQUENTIAL DAMAGES: IN NO EVENT SHALL NEC +// Laboratories Europe GmbH or ANY OF ITS SUBSIDIARIES BE LIABLE FOR +// ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR +// LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF +// INFORMATION, OR OTHER PECUNIARY LOSS AND INDIRECT, CONSEQUENTIAL, +// INCIDENTAL, ECONOMIC OR PUNITIVE DAMAGES) ARISING OUT OF THE USE OF +// OR INABILITY TO USE THIS PROGRAM, EVEN IF NEC Laboratories Europe +// GmbH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +// +// THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. + +package grpc + +import fabric.FabricConnector +import io.grpc.Server +import io.grpc.ServerBuilder +import proto.Config +import kotlin.random.Random +import kotlin.random.nextUInt + +class FabricServer(val port: Int) { + private val server: Server + + init { + val id = Random.nextUInt() + val cfg = Config.DltConfig.newBuilder().setWallet("wallet$id").setConnectionFile("config/connection-org1.json") + .setUser("appUser$id") + .setChannel("dlt") + .setContract("basic").setCaCertFile("config/ca.org1.example.com-cert.pem").setCaUrl("https://teraflow.nlehd.de:7054") + .setCaAdmin("admin").setCaAdminSecret("adminpw").setMsp("Org1MSP").setAffiliation("org1.department1") + .build() + val connector = FabricConnector(cfg) + + val dltService = DLTService(connector) + server = ServerBuilder + .forPort(port) + .addService(dltService) + .build() + + } + + fun start() { + server.start() + println("Server started, listening on $port") + Runtime.getRuntime().addShutdownHook( + Thread { + println("Shutting down...") + this@FabricServer.stop() + println("Server shut down") + } + ) + } + + private fun stop() { + server.shutdown() + } + + fun blockUntilShutdown() { + server.awaitTermination() + } +} + +fun main() { + val port = 50051 + val server = FabricServer(port) + server.start() + server.blockUntilShutdown() +} diff --git a/src/dlt/gateway/legacy/src/main/kotlin/grpc/GrpcHandler.kt b/src/dlt/gateway/legacy/src/main/kotlin/grpc/GrpcHandler.kt new file mode 100644 index 000000000..d39c24a1a --- /dev/null +++ b/src/dlt/gateway/legacy/src/main/kotlin/grpc/GrpcHandler.kt @@ -0,0 +1,95 @@ +// NEC Laboratories Europe GmbH +// +// PROPRIETARY INFORMATION +// +// The software and its source code contain valuable trade secrets and +// shall be maintained in confidence and treated as confidential +// information. The software may only be used for evaluation and/or +// testing purposes, unless otherwise explicitly stated in a written +// agreement with NEC Laboratories Europe GmbH. +// +// Any unauthorized publication, transfer to third parties or +// duplication of the object or source code - either totally or in +// part - is strictly prohibited. +// +// Copyright (c) 2022 NEC Laboratories Europe GmbH +// All Rights Reserved. +// +// Authors: Konstantin Munichev +// +// +// NEC Laboratories Europe GmbH DISCLAIMS ALL WARRANTIES, EITHER +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES +// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND THE +// WARRANTY AGAINST LATENT DEFECTS, WITH RESPECT TO THE PROGRAM AND +// THE ACCOMPANYING DOCUMENTATION. +// +// NO LIABILITIES FOR CONSEQUENTIAL DAMAGES: IN NO EVENT SHALL NEC +// Laboratories Europe GmbH or ANY OF ITS SUBSIDIARIES BE LIABLE FOR +// ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR +// LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF +// INFORMATION, OR OTHER PECUNIARY LOSS AND INDIRECT, CONSEQUENTIAL, +// INCIDENTAL, ECONOMIC OR PUNITIVE DAMAGES) ARISING OUT OF THE USE OF +// OR INABILITY TO USE THIS PROGRAM, EVEN IF NEC Laboratories Europe +// GmbH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +// +// THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. + +package grpc + +import fabric.FabricConnector +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.consumeAsFlow +import context.ContextOuterClass +import dlt.DltGateway +import dlt.DltGatewayServiceGrpcKt + +class DLTService(private val connector: FabricConnector) : + DltGatewayServiceGrpcKt.DltGatewayServiceCoroutineImplBase() { + override suspend fun recordToDlt(request: DltGateway.DltRecord): DltGateway.DltRecordStatus { + println("Incoming request ${request.recordId.recordUuid}") + val error = when (request.operation) { + DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_ADD -> { + println("Adding new record") + connector.putData(request) + } + DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_UPDATE -> { + println("Updating record") + connector.updateData(request) + } + DltGateway.DltRecordOperationEnum.DLTRECORDOPERATION_DELETE -> { + println("Deleting record") + connector.deleteData(request) + } + else -> "Undefined or unknown operation" + } + + val dltStatusEnum: DltGateway.DltRecordStatusEnum = if (error == "") { + DltGateway.DltRecordStatusEnum.DLTRECORDSTATUS_SUCCEEDED + } else { + DltGateway.DltRecordStatusEnum.DLTRECORDSTATUS_FAILED + } + return DltGateway.DltRecordStatus.newBuilder() + .setRecordId(request.recordId) + .setStatus(dltStatusEnum) + .setErrorMessage(error) + .build() + } + + override suspend fun getFromDlt(request: DltGateway.DltRecordId): DltGateway.DltRecord { + return connector.getData(request.recordUuid.uuid) + } + + override fun subscribeToDlt(request: DltGateway.DltRecordSubscription): Flow { + println("Subscription request: $request") + return connector.subscribeForEvents().consumeAsFlow() + } + + override suspend fun getDltStatus(request: ContextOuterClass.TeraFlowController): DltGateway.DltPeerStatus { + return super.getDltStatus(request) + } + + override suspend fun getDltPeers(request: ContextOuterClass.Empty): DltGateway.DltPeerStatusList { + return super.getDltPeers(request) + } +} \ No newline at end of file diff --git a/src/dlt/gateway/legacy/src/main/kotlin/proto/Config.proto b/src/dlt/gateway/legacy/src/main/kotlin/proto/Config.proto new file mode 100644 index 000000000..b6d4c5614 --- /dev/null +++ b/src/dlt/gateway/legacy/src/main/kotlin/proto/Config.proto @@ -0,0 +1,54 @@ +// NEC Laboratories Europe GmbH +// +// PROPRIETARY INFORMATION +// +// The software and its source code contain valuable trade secrets and +// shall be maintained in confidence and treated as confidential +// information. The software may only be used for evaluation and/or +// testing purposes, unless otherwise explicitly stated in a written +// agreement with NEC Laboratories Europe GmbH. +// +// Any unauthorized publication, transfer to third parties or +// duplication of the object or source code - either totally or in +// part - is strictly prohibited. +// +// Copyright (c) 2022 NEC Laboratories Europe GmbH +// All Rights Reserved. +// +// Authors: Konstantin Munichev +// +// +// NEC Laboratories Europe GmbH DISCLAIMS ALL WARRANTIES, EITHER +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES +// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND THE +// WARRANTY AGAINST LATENT DEFECTS, WITH RESPECT TO THE PROGRAM AND +// THE ACCOMPANYING DOCUMENTATION. +// +// NO LIABILITIES FOR CONSEQUENTIAL DAMAGES: IN NO EVENT SHALL NEC +// Laboratories Europe GmbH or ANY OF ITS SUBSIDIARIES BE LIABLE FOR +// ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR +// LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF +// INFORMATION, OR OTHER PECUNIARY LOSS AND INDIRECT, CONSEQUENTIAL, +// INCIDENTAL, ECONOMIC OR PUNITIVE DAMAGES) ARISING OUT OF THE USE OF +// OR INABILITY TO USE THIS PROGRAM, EVEN IF NEC Laboratories Europe +// GmbH HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +// +// THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY. + +syntax = "proto3"; + +package proto; + +message DltConfig { + string wallet = 1; + string connectionFile = 2; + string user = 3; + string channel = 4; + string contract = 5; + string caCertFile = 6; + string caUrl = 7; + string caAdmin = 8; + string caAdminSecret = 9; + string msp = 10; + string affiliation = 11; +} -- GitLab From d0d04e247d3aa906e89d45b68c610ba6b854a9d5 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 4 Sep 2024 13:34:38 +0000 Subject: [PATCH 549/602] Pre-merge code cleanup --- manifests/dltservice.yaml | 207 +++++++++++++++++++------------------- 1 file changed, 101 insertions(+), 106 deletions(-) diff --git a/manifests/dltservice.yaml b/manifests/dltservice.yaml index 6602a45f5..04f0921ca 100644 --- a/manifests/dltservice.yaml +++ b/manifests/dltservice.yaml @@ -20,7 +20,7 @@ data: CHANNEL_NAME: "channel1" CHAINCODE_NAME: "adrenalineDLT" MSP_ID: "Org1MSP" - PEER_ENDPOINT: "10.1.1.96:7051" #Change to required peer# + PEER_ENDPOINT: "10.1.1.96:7051" #Change to required peer# PEER_HOST_ALIAS: "peer0.org1.adrenaline.com" CRYPTO_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com" KEY_DIRECTORY_PATH: "/etc/hyperledger/fabric-keystore/keystore" @@ -28,7 +28,6 @@ data: TLS_CERT_PATH: "/etc/hyperledger/fabric-ca-crt/ca.crt" --- - apiVersion: apps/v1 kind: Deployment metadata: @@ -44,111 +43,110 @@ spec: spec: terminationGracePeriodSeconds: 5 containers: - - name: connector - image: labs.etsi.org:5050/tfs/controller/dlt-connector:latest - imagePullPolicy: Always - ports: - - containerPort: 8080 - - containerPort: 9192 - env: - - name: LOG_LEVEL - value: "INFO" - ## for debug purposes - #- name: DLT_GATEWAY_HOST - # value: "mock-blockchain.tfs-bchain.svc.cluster.local" - #- name: DLT_GATEWAY_PORT - # value: "50051" - readinessProbe: - exec: - command: ["/bin/grpc_health_probe", "-addr=:8080"] - livenessProbe: - exec: - command: ["/bin/grpc_health_probe", "-addr=:8080"] - resources: - requests: - cpu: 50m - memory: 64Mi - limits: - cpu: 500m - memory: 512Mi - - name: gateway - image: labs.etsi.org:5050/tfs/controller/dlt-gateway:latest - imagePullPolicy: Always - ports: - - containerPort: 50051 - resources: - requests: - cpu: 200m - memory: 512Mi - limits: - cpu: 700m - memory: 1024Mi - volumeMounts: - - mountPath: /test-network - name: dlt-volume - readOnly: true + - name: connector + image: labs.etsi.org:5050/tfs/controller/dlt-connector:latest + imagePullPolicy: Always + ports: + - containerPort: 8080 + - containerPort: 9192 + env: + - name: LOG_LEVEL + value: "INFO" + ## for debug purposes + #- name: DLT_GATEWAY_HOST + # value: "mock-blockchain.tfs-bchain.svc.cluster.local" + #- name: DLT_GATEWAY_PORT + # value: "50051" + readinessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:8080"] + livenessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:8080"] + resources: + requests: + cpu: 50m + memory: 64Mi + limits: + cpu: 500m + memory: 512Mi + - name: gateway + image: labs.etsi.org:5050/tfs/controller/dlt-gateway:latest + imagePullPolicy: Always + ports: + - containerPort: 50051 + resources: + requests: + cpu: 200m + memory: 512Mi + limits: + cpu: 700m + memory: 1024Mi + volumeMounts: + - mountPath: /test-network + name: dlt-volume + readOnly: true + - name: keystore + mountPath: /etc/hyperledger/fabric-keystore + readOnly: true + - name: signcerts + mountPath: /etc/hyperledger/fabric-signcerts + readOnly: true + - name: ca-crt + mountPath: /etc/hyperledger/fabric-ca-crt + readOnly: true + env: + - name: CHANNEL_NAME + valueFrom: + configMapKeyRef: + name: dlt-config + key: CHANNEL_NAME + - name: CHAINCODE_NAME + valueFrom: + configMapKeyRef: + name: dlt-config + key: CHAINCODE_NAME + - name: MSP_ID + valueFrom: + configMapKeyRef: + name: dlt-config + key: MSP_ID + - name: PEER_ENDPOINT + valueFrom: + configMapKeyRef: + name: dlt-config + key: PEER_ENDPOINT + - name: PEER_HOST_ALIAS + valueFrom: + configMapKeyRef: + name: dlt-config + key: PEER_HOST_ALIAS + - name: CRYPTO_PATH + valueFrom: + configMapKeyRef: + name: dlt-config + key: CRYPTO_PATH + - name: KEY_DIRECTORY_PATH + value: "/etc/hyperledger/fabric-keystore/keystore" + - name: CERT_DIRECTORY_PATH + value: "/etc/hyperledger/fabric-signcerts/signcerts.pem" + - name: TLS_CERT_PATH + value: "/etc/hyperledger/fabric-ca-crt/ca.crt" + volumes: + - name: dlt-volume + persistentVolumeClaim: + claimName: dlt-pvc - name: keystore - mountPath: /etc/hyperledger/fabric-keystore - readOnly: true + secret: + secretName: dlt-keystone - name: signcerts - mountPath: /etc/hyperledger/fabric-signcerts - readOnly: true + secret: + secretName: dlt-signcerts - name: ca-crt - mountPath: /etc/hyperledger/fabric-ca-crt - readOnly: true - env: - - name: CHANNEL_NAME - valueFrom: - configMapKeyRef: - name: dlt-config - key: CHANNEL_NAME - - name: CHAINCODE_NAME - valueFrom: - configMapKeyRef: - name: dlt-config - key: CHAINCODE_NAME - - name: MSP_ID - valueFrom: - configMapKeyRef: - name: dlt-config - key: MSP_ID - - name: PEER_ENDPOINT - valueFrom: - configMapKeyRef: - name: dlt-config - key: PEER_ENDPOINT - - name: PEER_HOST_ALIAS - valueFrom: - configMapKeyRef: - name: dlt-config - key: PEER_HOST_ALIAS - - name: CRYPTO_PATH - valueFrom: - configMapKeyRef: - name: dlt-config - key: CRYPTO_PATH - - name: KEY_DIRECTORY_PATH - value: "/etc/hyperledger/fabric-keystore/keystore" - - name: CERT_DIRECTORY_PATH - value: "/etc/hyperledger/fabric-signcerts/signcerts.pem" - - name: TLS_CERT_PATH - value: "/etc/hyperledger/fabric-ca-crt/ca.crt" - volumes: - - name: dlt-volume - persistentVolumeClaim: - claimName: dlt-pvc - - name: keystore - secret: - secretName: dlt-keystone - - name: signcerts - secret: - secretName: dlt-signcerts - - name: ca-crt - secret: - secretName: dlt-ca-crt + secret: + secretName: dlt-ca-crt --- - apiVersion: v1 kind: PersistentVolumeClaim metadata: @@ -161,7 +159,6 @@ spec: storage: 1Gi --- - apiVersion: v1 kind: PersistentVolume metadata: @@ -173,12 +170,11 @@ spec: - ReadOnlyMany persistentVolumeReclaimPolicy: Retain hostPath: - path: "/home/ubuntu/fabric-samples/test-network" #Update to correct host paths where the MSP is located. + path: "/home/ubuntu/fabric-samples/test-network" #Update to correct host paths where the MSP is located. claimRef: name: dlt-pvc --- - apiVersion: v1 kind: Service metadata: @@ -194,7 +190,6 @@ spec: type: NodePort --- - apiVersion: v1 kind: Service metadata: -- GitLab From ff13999fd9317c803c8e1007fb00951148f3cba6 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 4 Sep 2024 14:20:50 +0000 Subject: [PATCH 550/602] Recovered legacy Gateway code --- src/dlt/gateway/legacy/.gitignore | 90 +++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/dlt/gateway/legacy/.gitignore diff --git a/src/dlt/gateway/legacy/.gitignore b/src/dlt/gateway/legacy/.gitignore new file mode 100644 index 000000000..9ecdb254c --- /dev/null +++ b/src/dlt/gateway/legacy/.gitignore @@ -0,0 +1,90 @@ +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +# From https://github.com/github/gitignore/blob/master/Gradle.gitignore +/.gradle/ +/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache + +local.properties +wallet*/ \ No newline at end of file -- GitLab From 2183218975578c96f380cf69d6b5aea017dba41c Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 5 Sep 2024 10:29:44 +0000 Subject: [PATCH 551/602] Changes in Analytics Backend. - In the BackendService.py: + Updated SparkStreamer call with new parameters. - In SparkStreaming.py: + Added 'GetAggregerations' and 'ApplyThresholds' methods + Added 'window_size', 'win_slide_duration', 'time_stamp_col' and 'thresholds' parameters. - Added new messages. - Updated the 'RunSparkStreamer' call wth new parameters. --- .../service/AnalyticsBackendService.py | 9 +- .../backend/service/SparkStreaming.py | 90 +++++++++++++------ src/analytics/backend/tests/messages.py | 19 ++++ src/analytics/backend/tests/test_backend.py | 23 ++--- 4 files changed, 101 insertions(+), 40 deletions(-) diff --git a/src/analytics/backend/service/AnalyticsBackendService.py b/src/analytics/backend/service/AnalyticsBackendService.py index 5331d027d..2842e2374 100755 --- a/src/analytics/backend/service/AnalyticsBackendService.py +++ b/src/analytics/backend/service/AnalyticsBackendService.py @@ -33,8 +33,13 @@ class AnalyticsBackendService(GenericGrpcService): 'group.id' : 'analytics-frontend', 'auto.offset.reset' : 'latest'}) - def RunSparkStreamer(self, kpi_list): - threading.Thread(target=SparkStreamer, args=(kpi_list,)).start() + def RunSparkStreamer(self, kpi_list, oper_list, thresholds_dict): + print ("Received parameters: {:} - {:} - {:}".format(kpi_list, oper_list, thresholds_dict)) + LOGGER.debug ("Received parameters: {:} - {:} - {:}".format(kpi_list, oper_list, thresholds_dict)) + threading.Thread(target=SparkStreamer, + args=(kpi_list, oper_list, None, None, thresholds_dict, None) + ).start() + return True def RunRequestListener(self)->bool: threading.Thread(target=self.RequestListener).start() diff --git a/src/analytics/backend/service/SparkStreaming.py b/src/analytics/backend/service/SparkStreaming.py index 245a77d80..26d3c26d8 100644 --- a/src/analytics/backend/service/SparkStreaming.py +++ b/src/analytics/backend/service/SparkStreaming.py @@ -15,8 +15,8 @@ import logging from pyspark.sql import SparkSession -from pyspark.sql.types import StructType, StructField, StringType, DoubleType -from pyspark.sql.functions import from_json, col +from pyspark.sql.types import StructType, StructField, StringType, DoubleType, TimestampType +from pyspark.sql.functions import from_json, col, window, avg, min, max, first, last, stddev, when, round from common.tools.kafka.Variables import KafkaConfig, KafkaTopic LOGGER = logging.getLogger(__name__) @@ -44,22 +44,50 @@ def DefiningRequestSchema(): StructField("kpi_value" , DoubleType() , True) ]) -def SettingKafkaProducerParams(): - return { - "kafka.bootstrap.servers" : KafkaConfig.get_kafka_address(), - "topic" : KafkaTopic.ANALYTICS_RESPONSE.value +def get_aggregations(oper_list): + # Define the possible aggregation functions + agg_functions = { + 'avg' : round(avg ("kpi_value"), 3) .alias("avg_value"), + 'min' : round(min ("kpi_value"), 3) .alias("min_value"), + 'max' : round(max ("kpi_value"), 3) .alias("max_value"), + 'first': round(first ("kpi_value"), 3) .alias("first_value"), + 'last' : round(last ("kpi_value"), 3) .alias("last_value"), + 'stdev': round(stddev ("kpi_value"), 3) .alias("stdev_value") } + return [agg_functions[op] for op in oper_list if op in agg_functions] # Filter and return only the selected aggregations + +def apply_thresholds(aggregated_df, thresholds): + # Apply thresholds (TH-Fail and TH-RAISE) based on the thresholds dictionary on the aggregated DataFrame. + + # Loop through each column name and its associated thresholds + for col_name, (fail_th, raise_th) in thresholds.items(): + # Apply TH-Fail condition (if column value is less than the fail threshold) + aggregated_df = aggregated_df.withColumn( + f"{col_name}_THRESHOLD_FAIL", + when(col(col_name) < fail_th, True).otherwise(False) + ) + # Apply TH-RAISE condition (if column value is greater than the raise threshold) + aggregated_df = aggregated_df.withColumn( + f"{col_name}_THRESHOLD_RAISE", + when(col(col_name) > raise_th, True).otherwise(False) + ) + return aggregated_df -def SparkStreamer(kpi_list): +def SparkStreamer(kpi_list, oper_list, window_size=None, win_slide_duration=None, thresholds=None, time_stamp_col=None): """ Method to perform Spark operation Kafka stream. NOTE: Kafka topic to be processesd should have atleast one row before initiating the spark session. """ - kafka_producer_params = SettingKafkaConsumerParams() # Define the Kafka producer parameters kafka_consumer_params = SettingKafkaConsumerParams() # Define the Kafka consumer parameters schema = DefiningRequestSchema() # Define the schema for the incoming JSON data spark = DefiningSparkSession() # Define the spark session with app name and spark version - + + # extra options default assignment + if window_size is None: window_size = "60 seconds" # default + if win_slide_duration is None: win_slide_duration = "30 seconds" # default + if time_stamp_col is None: time_stamp_col = "time_stamp" # default + if thresholds is None: thresholds = {} # No threshold will be applied + try: # Read data from Kafka raw_stream_data = spark \ @@ -74,36 +102,42 @@ def SparkStreamer(kpi_list): parsed_stream_data = stream_data.withColumn("parsed_value", from_json(col("value"), schema)) # Select the parsed fields final_stream_data = parsed_stream_data.select("parsed_value.*") + # Convert the time_stamp to proper timestamp (assuming it's in ISO format) + final_stream_data = final_stream_data.withColumn(time_stamp_col, col(time_stamp_col).cast(TimestampType())) # Filter the stream to only include rows where the kpi_id is in the kpi_list filtered_stream_data = final_stream_data.filter(col("kpi_id").isin(kpi_list)) + # Define a window for aggregation + windowed_stream_data = filtered_stream_data \ + .groupBy( + window( col(time_stamp_col), + window_size, slideDuration=win_slide_duration + ), + col("kpi_id") + ) \ + .agg(*get_aggregations(oper_list)) + # Apply thresholds to the aggregated data + thresholded_stream_data = apply_thresholds(windowed_stream_data, thresholds) + + # --- This will write output on console: FOR TESTING PURPOSES + # Start the Spark streaming query + # query = thresholded_stream_data \ + # .writeStream \ + # .outputMode("update") \ + # .format("console") - query = filtered_stream_data \ + # --- This will write output to Kafka: ACTUAL IMPLEMENTATION + query = thresholded_stream_data \ .selectExpr("CAST(kpi_id AS STRING) AS key", "to_json(struct(*)) AS value") \ .writeStream \ .format("kafka") \ .option("kafka.bootstrap.servers", KafkaConfig.get_kafka_address()) \ .option("topic", KafkaTopic.ANALYTICS_RESPONSE.value) \ - .option("checkpointLocation", "/home/tfs/sparkcheckpoint") \ - .outputMode("append") - - # Start the Spark streaming query and write the output to the Kafka topic - # query = filtered_stream_data \ - # .selectExpr("CAST(kpi_id AS STRING) AS key", "to_json(struct(*)) AS value") \ - # .writeStream \ - # .format("kafka") \ - # .option(**kafka_producer_params) \ - # .option("checkpointLocation", "sparkcheckpoint") \ - # .outputMode("append") \ - # .start() - - # Start the Spark streaming query - # query = filtered_stream_data \ - # .writeStream \ - # .outputMode("append") \ - # .format("console") # You can change this to other output modes or sinks + .option("checkpointLocation", "analytics/.spark/checkpoint") \ + .outputMode("update") # Start the query execution query.start().awaitTermination() + except Exception as e: print("Error in Spark streaming process: {:}".format(e)) LOGGER.debug("Error in Spark streaming process: {:}".format(e)) diff --git a/src/analytics/backend/tests/messages.py b/src/analytics/backend/tests/messages.py index 5cf553eaa..c4a26a1ac 100644 --- a/src/analytics/backend/tests/messages.py +++ b/src/analytics/backend/tests/messages.py @@ -13,3 +13,22 @@ # limitations under the License. +def get_kpi_id_list(): + return ["6e22f180-ba28-4641-b190-2287bf448888", "1e22f180-ba28-4641-b190-2287bf446666"] + +def get_operation_list(): + return [ 'avg', 'max' ] # possibilities ['avg', 'min', 'max', 'first', 'last', 'stdev'] + +def get_threshold_dict(): + threshold_dict = { + 'avg_value' : (20, 30), + 'min_value' : (00, 10), + 'max_value' : (45, 50), + 'first_value' : (00, 10), + 'last_value' : (40, 50), + 'stddev_value' : (00, 10), + } + # Filter threshold_dict based on the operation_list + return { + op + '_value': threshold_dict[op+'_value'] for op in get_operation_list() if op + '_value' in threshold_dict + } diff --git a/src/analytics/backend/tests/test_backend.py b/src/analytics/backend/tests/test_backend.py index 426c89e54..9e8a0832d 100644 --- a/src/analytics/backend/tests/test_backend.py +++ b/src/analytics/backend/tests/test_backend.py @@ -15,7 +15,7 @@ import logging from common.tools.kafka.Variables import KafkaTopic from analytics.backend.service.AnalyticsBackendService import AnalyticsBackendService - +from analytics.backend.tests.messages import get_kpi_id_list, get_operation_list, get_threshold_dict LOGGER = logging.getLogger(__name__) @@ -25,10 +25,10 @@ LOGGER = logging.getLogger(__name__) ########################### # --- "test_validate_kafka_topics" should be run before the functionality tests --- -# def test_validate_kafka_topics(): -# LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ") -# response = KafkaTopic.create_all_topics() -# assert isinstance(response, bool) +def test_validate_kafka_topics(): + LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ") + response = KafkaTopic.create_all_topics() + assert isinstance(response, bool) def test_RunRequestListener(): LOGGER.info('test_RunRequestListener') @@ -37,8 +37,11 @@ def test_RunRequestListener(): LOGGER.debug(str(response)) -# def test_SparkListener(): -# LOGGER.info('test_RunRequestListener') -# AnalyticsBackendServiceObj = AnalyticsBackendService() -# response = AnalyticsBackendServiceObj.RunSparkStreamer() -# LOGGER.debug(str(response)) +def test_SparkListener(): + LOGGER.info('test_RunRequestListener') + AnalyticsBackendServiceObj = AnalyticsBackendService() + response = AnalyticsBackendServiceObj.RunSparkStreamer( + get_kpi_id_list(), get_operation_list(), get_threshold_dict() + ) + LOGGER.debug(str(response)) + assert isinstance(response, bool) -- GitLab From faa6c684f08a62da7ab5bc871b7680179961375b Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 5 Sep 2024 10:32:09 +0000 Subject: [PATCH 552/602] Changes in Analytics Backend. - Updated function names. --- src/analytics/backend/service/SparkStreaming.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/analytics/backend/service/SparkStreaming.py b/src/analytics/backend/service/SparkStreaming.py index 26d3c26d8..73aa75025 100644 --- a/src/analytics/backend/service/SparkStreaming.py +++ b/src/analytics/backend/service/SparkStreaming.py @@ -44,7 +44,7 @@ def DefiningRequestSchema(): StructField("kpi_value" , DoubleType() , True) ]) -def get_aggregations(oper_list): +def GetAggregations(oper_list): # Define the possible aggregation functions agg_functions = { 'avg' : round(avg ("kpi_value"), 3) .alias("avg_value"), @@ -56,7 +56,7 @@ def get_aggregations(oper_list): } return [agg_functions[op] for op in oper_list if op in agg_functions] # Filter and return only the selected aggregations -def apply_thresholds(aggregated_df, thresholds): +def ApplyThresholds(aggregated_df, thresholds): # Apply thresholds (TH-Fail and TH-RAISE) based on the thresholds dictionary on the aggregated DataFrame. # Loop through each column name and its associated thresholds @@ -114,9 +114,9 @@ def SparkStreamer(kpi_list, oper_list, window_size=None, win_slide_duration=None ), col("kpi_id") ) \ - .agg(*get_aggregations(oper_list)) + .agg(*GetAggregations(oper_list)) # Apply thresholds to the aggregated data - thresholded_stream_data = apply_thresholds(windowed_stream_data, thresholds) + thresholded_stream_data = ApplyThresholds(windowed_stream_data, thresholds) # --- This will write output on console: FOR TESTING PURPOSES # Start the Spark streaming query -- GitLab From df864e661ecc8d548dd015bffa63aa5a96088e9f Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Thu, 5 Sep 2024 10:32:59 +0000 Subject: [PATCH 553/602] Added pySpark checkpoint path in '.gitignore' file. --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 20b98c30c..6a53f106e 100644 --- a/.gitignore +++ b/.gitignore @@ -176,3 +176,6 @@ libyang/ # Other logs **/logs/*.log.* + +# PySpark checkpoints +src/analytics/.spark/* \ No newline at end of file -- GitLab From 990395f47c5c6ca47027f036b71edcdb090edb08 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 6 Sep 2024 07:55:54 +0000 Subject: [PATCH 554/602] Changes in Analytics DB. - parameters col added in DB - parameters field added in Analytics.proto - AnalyzerModel class methods changes - changes in messages file --- src/analytics/database/AnalyzerModel.py | 45 ++++++++++--------- src/analytics/frontend/tests/messages.py | 11 ++++- src/analytics/frontend/tests/test_frontend.py | 2 +- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/analytics/database/AnalyzerModel.py b/src/analytics/database/AnalyzerModel.py index 0b66e04d0..783205269 100644 --- a/src/analytics/database/AnalyzerModel.py +++ b/src/analytics/database/AnalyzerModel.py @@ -15,7 +15,7 @@ import logging import enum -from sqlalchemy import Column, String, Float, Enum +from sqlalchemy import Column, String, Float, Enum, BigInteger, JSON from sqlalchemy.orm import registry from common.proto import analytics_frontend_pb2 from common.proto import kpi_manager_pb2 @@ -36,23 +36,25 @@ class AnalyzerOperationMode (enum.Enum): class Analyzer(Base): __tablename__ = 'analyzer' - analyzer_id = Column(UUID(as_uuid=False) , primary_key=True) - algorithm_name = Column(String , nullable=False) - input_kpi_ids = Column(ARRAY(UUID(as_uuid=False)) , nullable=False) - output_kpi_ids = Column(ARRAY(UUID(as_uuid=False)) , nullable=False) - operation_mode = Column(Enum(AnalyzerOperationMode), nullable=False) - batch_min_duration_s = Column(Float , nullable=False) - batch_max_duration_s = Column(Float , nullable=False) - bacth_min_size = Column(Float , nullable=False) - bacth_max_size = Column(Float , nullable=False) + analyzer_id = Column( UUID(as_uuid=False) , primary_key=True) + algorithm_name = Column( String , nullable=False ) + input_kpi_ids = Column( ARRAY(UUID(as_uuid=False)) , nullable=False ) + output_kpi_ids = Column( ARRAY(UUID(as_uuid=False)) , nullable=False ) + operation_mode = Column( Enum(AnalyzerOperationMode), nullable=False ) + parameters = Column( JSON , nullable=True ) + batch_min_duration_s = Column( Float , nullable=False ) + batch_max_duration_s = Column( Float , nullable=False ) + batch_min_size = Column( BigInteger , nullable=False ) + batch_max_size = Column( BigInteger , nullable=False ) # helps in logging the information def __repr__(self): - return (f"") + return (f"") + @classmethod def ConvertAnalyzerToRow(cls, request): @@ -67,10 +69,11 @@ class Analyzer(Base): input_kpi_ids = [k.kpi_id.uuid for k in request.input_kpi_ids], output_kpi_ids = [k.kpi_id.uuid for k in request.output_kpi_ids], operation_mode = AnalyzerOperationMode(request.operation_mode), # converts integer to coresponding Enum class member + parameters = dict(request.parameters), batch_min_duration_s = request.batch_min_duration_s, batch_max_duration_s = request.batch_max_duration_s, - bacth_min_size = request.batch_min_size, - bacth_max_size = request.batch_max_size + batch_min_size = request.batch_min_size, + batch_max_size = request.batch_max_size ) @classmethod @@ -85,17 +88,19 @@ class Analyzer(Base): response.analyzer_id.analyzer_id.uuid = row.analyzer_id response.algorithm_name = row.algorithm_name response.operation_mode = row.operation_mode + response.parameters.update(row.parameters) - _kpi_id = kpi_manager_pb2.KpiId() for input_kpi_id in row.input_kpi_ids: + _kpi_id = kpi_manager_pb2.KpiId() _kpi_id.kpi_id.uuid = input_kpi_id response.input_kpi_ids.append(_kpi_id) for output_kpi_id in row.output_kpi_ids: + _kpi_id = kpi_manager_pb2.KpiId() _kpi_id.kpi_id.uuid = output_kpi_id response.output_kpi_ids.append(_kpi_id) response.batch_min_duration_s = row.batch_min_duration_s response.batch_max_duration_s = row.batch_max_duration_s - response.batch_min_size = row.bacth_min_size - response.batch_max_size = row.bacth_max_size + response.batch_min_size = row.batch_min_size + response.batch_max_size = row.batch_max_size return response diff --git a/src/analytics/frontend/tests/messages.py b/src/analytics/frontend/tests/messages.py index 0a8300436..4ffbb0b8e 100644 --- a/src/analytics/frontend/tests/messages.py +++ b/src/analytics/frontend/tests/messages.py @@ -13,6 +13,7 @@ # limitations under the License. import uuid +import json from common.proto.kpi_manager_pb2 import KpiId from common.proto.analytics_frontend_pb2 import ( AnalyzerOperationMode, AnalyzerId, Analyzer, AnalyzerFilter ) @@ -26,7 +27,7 @@ def create_analyzer_id(): def create_analyzer(): _create_analyzer = Analyzer() _create_analyzer.analyzer_id.analyzer_id.uuid = str(uuid.uuid4()) - _create_analyzer.algorithm_name = "some_algo_name" + _create_analyzer.algorithm_name = "Test_Aggergate_and_Threshold" _create_analyzer.operation_mode = AnalyzerOperationMode.ANALYZEROPERATIONMODE_STREAMING _kpi_id = KpiId() @@ -44,6 +45,14 @@ def create_analyzer(): _create_analyzer.output_kpi_ids.append(_kpi_id) _kpi_id.kpi_id.uuid = str(uuid.uuid4()) _create_analyzer.output_kpi_ids.append(_kpi_id) + # parameter + _threshold_dict = { + 'avg_value' :(20, 30), 'min_value' :(00, 10), 'max_value' :(45, 50), + 'first_value' :(00, 10), 'last_value' :(40, 50), 'stddev_value':(00, 10)} + _create_analyzer.parameters['thresholds'] = json.dumps(_threshold_dict) + _create_analyzer.parameters['window_size'] = "60 seconds" # Such as "10 seconds", "2 minutes", "3 hours", "4 days" or "5 weeks" + _create_analyzer.parameters['window_slider'] = "30 seconds" # should be less than window size + _create_analyzer.parameters['store_aggregate'] = str(False) # TRUE to store. No implemented yet return _create_analyzer diff --git a/src/analytics/frontend/tests/test_frontend.py b/src/analytics/frontend/tests/test_frontend.py index ae7875b86..df6ce165e 100644 --- a/src/analytics/frontend/tests/test_frontend.py +++ b/src/analytics/frontend/tests/test_frontend.py @@ -76,7 +76,7 @@ def analyticsFrontend_client(analyticsFrontend_service : AnalyticsFrontendServic ########################### # ----- core funtionality test ----- -def test_StartAnalytic(analyticsFrontend_client): +def test_StartAnalytics(analyticsFrontend_client): LOGGER.info(' >>> test_StartAnalytic START: <<< ') response = analyticsFrontend_client.StartAnalyzer(create_analyzer()) LOGGER.debug(str(response)) -- GitLab From 5eed4743c3195f42e677f9818604fed03c3a0a69 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 6 Sep 2024 09:48:02 +0000 Subject: [PATCH 555/602] Changes in Analytics. - UNSPECIFIED option added in the "AnalyzerOperationMode" enum as a best practice. - In SparkStreamer, changed the thresholds parameter from optional to compulsory. --- proto/analytics_frontend.proto | 5 +++-- src/analytics/backend/service/SparkStreaming.py | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/proto/analytics_frontend.proto b/proto/analytics_frontend.proto index bd28a21bf..bc7420d54 100644 --- a/proto/analytics_frontend.proto +++ b/proto/analytics_frontend.proto @@ -30,8 +30,9 @@ message AnalyzerId { } enum AnalyzerOperationMode { - ANALYZEROPERATIONMODE_BATCH = 0; - ANALYZEROPERATIONMODE_STREAMING = 1; + ANALYZEROPERATIONMODE_UNSPECIFIED = 0; + ANALYZEROPERATIONMODE_BATCH = 1; + ANALYZEROPERATIONMODE_STREAMING = 2; } message Analyzer { diff --git a/src/analytics/backend/service/SparkStreaming.py b/src/analytics/backend/service/SparkStreaming.py index 73aa75025..175222b59 100644 --- a/src/analytics/backend/service/SparkStreaming.py +++ b/src/analytics/backend/service/SparkStreaming.py @@ -73,7 +73,7 @@ def ApplyThresholds(aggregated_df, thresholds): ) return aggregated_df -def SparkStreamer(kpi_list, oper_list, window_size=None, win_slide_duration=None, thresholds=None, time_stamp_col=None): +def SparkStreamer(kpi_list, oper_list, thresholds, window_size=None, win_slide_duration=None, time_stamp_col=None): """ Method to perform Spark operation Kafka stream. NOTE: Kafka topic to be processesd should have atleast one row before initiating the spark session. @@ -86,7 +86,6 @@ def SparkStreamer(kpi_list, oper_list, window_size=None, win_slide_duration=None if window_size is None: window_size = "60 seconds" # default if win_slide_duration is None: win_slide_duration = "30 seconds" # default if time_stamp_col is None: time_stamp_col = "time_stamp" # default - if thresholds is None: thresholds = {} # No threshold will be applied try: # Read data from Kafka -- GitLab From 88d7a20007565a66f7561ec9e9a7811db1c9b0fe Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 7 Sep 2024 05:56:22 +0000 Subject: [PATCH 556/602] Changes in Analytics Service. - Thresholds, window_size, window_slider is added in Frontend and Backend. --- .../service/AnalyticsBackendService.py | 24 ++++++++++++------- .../backend/service/SparkStreaming.py | 3 ++- src/analytics/backend/tests/messages.py | 2 +- .../AnalyticsFrontendServiceServicerImpl.py | 12 ++++++---- src/analytics/frontend/tests/messages.py | 8 +++---- 5 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/analytics/backend/service/AnalyticsBackendService.py b/src/analytics/backend/service/AnalyticsBackendService.py index 2842e2374..4784ef051 100755 --- a/src/analytics/backend/service/AnalyticsBackendService.py +++ b/src/analytics/backend/service/AnalyticsBackendService.py @@ -22,7 +22,7 @@ from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from confluent_kafka import Consumer as KafkaConsumer from confluent_kafka import KafkaError -LOGGER = logging.getLogger(__name__) +LOGGER = logging.getLogger(__name__) class AnalyticsBackendService(GenericGrpcService): """ @@ -33,11 +33,18 @@ class AnalyticsBackendService(GenericGrpcService): 'group.id' : 'analytics-frontend', 'auto.offset.reset' : 'latest'}) - def RunSparkStreamer(self, kpi_list, oper_list, thresholds_dict): - print ("Received parameters: {:} - {:} - {:}".format(kpi_list, oper_list, thresholds_dict)) - LOGGER.debug ("Received parameters: {:} - {:} - {:}".format(kpi_list, oper_list, thresholds_dict)) + def RunSparkStreamer(self, analyzer): + kpi_list = analyzer['input_kpis'] + oper_list = [s.replace('_value', '') for s in list(analyzer["thresholds"].keys())] + thresholds = analyzer['thresholds'] + window_size = analyzer['window_size'] + window_slider = analyzer['window_slider'] + print ("Received parameters: {:} - {:} - {:} - {:} - {:}".format( + kpi_list, oper_list, thresholds, window_size, window_slider)) + LOGGER.debug ("Received parameters: {:} - {:} - {:} - {:} - {:}".format( + kpi_list, oper_list, thresholds, window_size, window_slider)) threading.Thread(target=SparkStreamer, - args=(kpi_list, oper_list, None, None, thresholds_dict, None) + args=(kpi_list, oper_list, thresholds, window_size, window_slider, None) ).start() return True @@ -63,6 +70,7 @@ class AnalyticsBackendService(GenericGrpcService): break analyzer = json.loads(receive_msg.value().decode('utf-8')) analyzer_id = receive_msg.key().decode('utf-8') - LOGGER.debug('Recevied Collector: {:} - {:}'.format(analyzer_id, analyzer)) - print('Recevied Collector: {:} - {:} - {:}'.format(analyzer_id, analyzer, analyzer['input_kpis'])) - self.RunSparkStreamer(analyzer['input_kpis']) # TODO: Add active analyzer to list + LOGGER.debug('Recevied Analyzer: {:} - {:}'.format(analyzer_id, analyzer)) + print('Recevied Analyzer: {:} - {:}'.format(analyzer_id, analyzer)) + # TODO: Add active analyzer to list + self.RunSparkStreamer(analyzer) diff --git a/src/analytics/backend/service/SparkStreaming.py b/src/analytics/backend/service/SparkStreaming.py index 175222b59..11ec9fe5f 100644 --- a/src/analytics/backend/service/SparkStreaming.py +++ b/src/analytics/backend/service/SparkStreaming.py @@ -73,7 +73,8 @@ def ApplyThresholds(aggregated_df, thresholds): ) return aggregated_df -def SparkStreamer(kpi_list, oper_list, thresholds, window_size=None, win_slide_duration=None, time_stamp_col=None): +def SparkStreamer(kpi_list, oper_list, thresholds, + window_size=None, win_slide_duration=None, time_stamp_col=None): """ Method to perform Spark operation Kafka stream. NOTE: Kafka topic to be processesd should have atleast one row before initiating the spark session. diff --git a/src/analytics/backend/tests/messages.py b/src/analytics/backend/tests/messages.py index c4a26a1ac..9acd6ad9d 100644 --- a/src/analytics/backend/tests/messages.py +++ b/src/analytics/backend/tests/messages.py @@ -26,7 +26,7 @@ def get_threshold_dict(): 'max_value' : (45, 50), 'first_value' : (00, 10), 'last_value' : (40, 50), - 'stddev_value' : (00, 10), + 'stdev_value' : (00, 10), } # Filter threshold_dict based on the operation_list return { diff --git a/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py index 0f9f4e146..2671bfb13 100644 --- a/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py +++ b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py @@ -64,10 +64,14 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer): """ analyzer_uuid = analyzer_obj.analyzer_id.analyzer_id.uuid analyzer_to_generate : Dict = { - "algo_name" : analyzer_obj.algorithm_name, - "input_kpis" : [k.kpi_id.uuid for k in analyzer_obj.input_kpi_ids], - "output_kpis" : [k.kpi_id.uuid for k in analyzer_obj.output_kpi_ids], - "oper_mode" : analyzer_obj.operation_mode + "algo_name" : analyzer_obj.algorithm_name, + "input_kpis" : [k.kpi_id.uuid for k in analyzer_obj.input_kpi_ids], + "output_kpis" : [k.kpi_id.uuid for k in analyzer_obj.output_kpi_ids], + "oper_mode" : analyzer_obj.operation_mode, + "thresholds" : json.loads(analyzer_obj.parameters["thresholds"]), + "window_size" : analyzer_obj.parameters["window_size"], + "window_slider" : analyzer_obj.parameters["window_slider"], + # "store_aggregate" : analyzer_obj.parameters["store_aggregate"] } self.kafka_producer.produce( KafkaTopic.ANALYTICS_REQUEST.value, diff --git a/src/analytics/frontend/tests/messages.py b/src/analytics/frontend/tests/messages.py index 4ffbb0b8e..180fac1f8 100644 --- a/src/analytics/frontend/tests/messages.py +++ b/src/analytics/frontend/tests/messages.py @@ -33,10 +33,10 @@ def create_analyzer(): _kpi_id = KpiId() # input IDs to analyze _kpi_id.kpi_id.uuid = str(uuid.uuid4()) - _kpi_id.kpi_id.uuid = "1e22f180-ba28-4641-b190-2287bf446666" + _kpi_id.kpi_id.uuid = "6e22f180-ba28-4641-b190-2287bf448888" _create_analyzer.input_kpi_ids.append(_kpi_id) _kpi_id.kpi_id.uuid = str(uuid.uuid4()) - _kpi_id.kpi_id.uuid = "6e22f180-ba28-4641-b190-2287bf448888" + _kpi_id.kpi_id.uuid = "1e22f180-ba28-4641-b190-2287bf446666" _create_analyzer.input_kpi_ids.append(_kpi_id) _kpi_id.kpi_id.uuid = str(uuid.uuid4()) _create_analyzer.input_kpi_ids.append(_kpi_id) @@ -47,8 +47,8 @@ def create_analyzer(): _create_analyzer.output_kpi_ids.append(_kpi_id) # parameter _threshold_dict = { - 'avg_value' :(20, 30), 'min_value' :(00, 10), 'max_value' :(45, 50), - 'first_value' :(00, 10), 'last_value' :(40, 50), 'stddev_value':(00, 10)} + # 'avg_value' :(20, 30), 'min_value' :(00, 10), 'max_value' :(45, 50), + 'first_value' :(00, 10), 'last_value' :(40, 50), 'stdev_value':(00, 10)} _create_analyzer.parameters['thresholds'] = json.dumps(_threshold_dict) _create_analyzer.parameters['window_size'] = "60 seconds" # Such as "10 seconds", "2 minutes", "3 hours", "4 days" or "5 weeks" _create_analyzer.parameters['window_slider'] = "30 seconds" # should be less than window size -- GitLab From 88caa1cf6f141b8409c258fe685f192c646a9dea Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 7 Sep 2024 14:20:49 +0000 Subject: [PATCH 557/602] Changes in Analytics **Backend:** - Added a dictionary to manage running analyzers. - Implemented logic to manage running analyzers. - Added the `TerminateAnalyzerBackend` method to handle analyzer termination. **Frontend:** - Modified and invoked the `PublishStopRequestOnKafka` method. --- .../service/AnalyticsBackendService.py | 54 +++++++++++++++---- .../AnalyticsFrontendServiceServicerImpl.py | 12 ++--- 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/analytics/backend/service/AnalyticsBackendService.py b/src/analytics/backend/service/AnalyticsBackendService.py index 4784ef051..f9fcf47ec 100755 --- a/src/analytics/backend/service/AnalyticsBackendService.py +++ b/src/analytics/backend/service/AnalyticsBackendService.py @@ -29,13 +29,14 @@ class AnalyticsBackendService(GenericGrpcService): Class listens for ... """ def __init__(self, cls_name : str = __name__) -> None: + self.running_threads = {} # To keep track of all running analyzers self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.get_kafka_address(), 'group.id' : 'analytics-frontend', 'auto.offset.reset' : 'latest'}) - def RunSparkStreamer(self, analyzer): + def RunSparkStreamer(self, analyzer_id, analyzer): kpi_list = analyzer['input_kpis'] - oper_list = [s.replace('_value', '') for s in list(analyzer["thresholds"].keys())] + oper_list = [s.replace('_value', '') for s in list(analyzer["thresholds"].keys())] # TODO: update this line... thresholds = analyzer['thresholds'] window_size = analyzer['window_size'] window_slider = analyzer['window_slider'] @@ -43,10 +44,19 @@ class AnalyticsBackendService(GenericGrpcService): kpi_list, oper_list, thresholds, window_size, window_slider)) LOGGER.debug ("Received parameters: {:} - {:} - {:} - {:} - {:}".format( kpi_list, oper_list, thresholds, window_size, window_slider)) - threading.Thread(target=SparkStreamer, - args=(kpi_list, oper_list, thresholds, window_size, window_slider, None) - ).start() - return True + try: + stop_event = threading.Event() + thread = threading.Thread(target=SparkStreamer, + args=(kpi_list, oper_list, thresholds, window_size, window_slider, None, + stop_event)) + self.running_threads[analyzer_id] = (thread, stop_event) + # thread.start() + LOGGER.info("Initiated Analyzer backend: {:}".format(analyzer_id)) + return True + except Exception as e: + print ("Failed to initiate Analyzer backend: {:}".format(e)) + LOGGER.error("Failed to initiate Analyzer backend: {:}".format(e)) + return False def RunRequestListener(self)->bool: threading.Thread(target=self.RequestListener).start() @@ -69,8 +79,30 @@ class AnalyticsBackendService(GenericGrpcService): print("Consumer error: {}".format(receive_msg.error())) break analyzer = json.loads(receive_msg.value().decode('utf-8')) - analyzer_id = receive_msg.key().decode('utf-8') - LOGGER.debug('Recevied Analyzer: {:} - {:}'.format(analyzer_id, analyzer)) - print('Recevied Analyzer: {:} - {:}'.format(analyzer_id, analyzer)) - # TODO: Add active analyzer to list - self.RunSparkStreamer(analyzer) + analyzer_uuid = receive_msg.key().decode('utf-8') + LOGGER.debug('Recevied Analyzer: {:} - {:}'.format(analyzer_uuid, analyzer)) + print ('Recevied Analyzer: {:} - {:}'.format(analyzer_uuid, analyzer)) + + if analyzer["algo_name"] is None and analyzer["oper_mode"] is None: + self.TerminateAnalyzerBackend(analyzer_uuid) + else: + self.RunSparkStreamer(analyzer_uuid, analyzer) + + def TerminateAnalyzerBackend(self, analyzer_uuid): + if analyzer_uuid in self.running_threads: + try: + thread, stop_event = self.running_threads[analyzer_uuid] + stop_event.set() + thread.join() + del self.running_threads[analyzer_uuid] + print ("Terminating backend (by TerminateBackend): Analyzer Id: {:}".format(analyzer_uuid)) + LOGGER.info("Terminating backend (by TerminateBackend): Analyzer Id: {:}".format(analyzer_uuid)) + return True + except Exception as e: + LOGGER.error("Failed to terminate. Analyzer Id: {:} - ERROR: ".format(analyzer_uuid, e)) + return False + else: + print ("Analyzer not found in active collectors: Analyzer Id: {:}".format(analyzer_uuid)) + # LOGGER.warning("Analyzer not found in active collectors: Analyzer Id: {:}".format(analyzer_uuid)) + # generate confirmation towards frontend + diff --git a/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py index 2671bfb13..9c438761c 100644 --- a/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py +++ b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py @@ -94,21 +94,21 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer): self.db_obj.delete_db_row_by_id( AnalyzerModel, "analyzer_id", analyzer_id_to_delete ) + self.PublishStopRequestOnKafka(analyzer_id_to_delete) except Exception as e: - LOGGER.warning('Unable to delete analyzer. Error: {:}'.format(e)) - self.PublishStopRequestOnKafka(request) + LOGGER.error('Unable to delete analyzer. Error: {:}'.format(e)) return Empty() - def PublishStopRequestOnKafka(self, analyzer_id): + def PublishStopRequestOnKafka(self, analyzer_uuid): """ Method to generate stop analyzer request on Kafka. """ - analyzer_uuid = analyzer_id.analyzer_id.uuid + # analyzer_uuid = analyzer_id.analyzer_id.uuid analyzer_to_stop : Dict = { - "algo_name" : -1, + "algo_name" : None, "input_kpis" : [], "output_kpis" : [], - "oper_mode" : -1 + "oper_mode" : None } self.kafka_producer.produce( KafkaTopic.ANALYTICS_REQUEST.value, -- GitLab From 9e2266258226df312ef67b65b781dc3b1dc07459 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 7 Sep 2024 14:30:55 +0000 Subject: [PATCH 558/602] Changes in Telemetry Service **Frontend:** - Deleted irrelevant lines. **Backend:** - Added `delete_db_row_by_id` in the Stop Collector method. --- src/telemetry/backend/service/TelemetryBackendService.py | 2 -- .../service/TelemetryFrontendServiceServicerImpl.py | 9 ++++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index bb9f0a314..5276c2be3 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -32,8 +32,6 @@ from common.tools.service.GenericGrpcService import GenericGrpcService LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('TelemetryBackend', 'backendService') -# EXPORTER_ENDPOINT = "http://10.152.183.2:9100/metrics" - class TelemetryBackendService(GenericGrpcService): """ diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py index 2b872dba3..b73d9fa95 100644 --- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py +++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py @@ -89,7 +89,14 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer): request : CollectorId, grpc_context: grpc.ServicerContext # type: ignore ) -> Empty: # type: ignore LOGGER.info ("gRPC message: {:}".format(request)) - self.PublishStopRequestOnKafka(request) + try: + collector_to_delete = request.collector_id.uuid + self.tele_db_obj.delete_db_row_by_id( + CollectorModel, "collector_id", collector_to_delete + ) + self.PublishStopRequestOnKafka(request) + except Exception as e: + LOGGER.error('Unable to delete collector. Error: {:}'.format(e)) return Empty() def PublishStopRequestOnKafka(self, collector_id): -- GitLab From d6dc91c284e370c3aa64fd854bb0120bd2ca565f Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 7 Sep 2024 16:48:20 +0000 Subject: [PATCH 559/602] Changes in Analytics Backend - Updated the position of the `stop_event` parameter. - Added confirmation for pySpark checkpoint deletion. - Added a PySpark termination script to handle the `StopCollector` event. --- .../backend/service/AnalyticsBackendService.py | 12 ++++++------ .../backend/service/SparkStreaming.py | 18 +++++++++++++----- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/analytics/backend/service/AnalyticsBackendService.py b/src/analytics/backend/service/AnalyticsBackendService.py index f9fcf47ec..899525fc6 100755 --- a/src/analytics/backend/service/AnalyticsBackendService.py +++ b/src/analytics/backend/service/AnalyticsBackendService.py @@ -47,10 +47,11 @@ class AnalyticsBackendService(GenericGrpcService): try: stop_event = threading.Event() thread = threading.Thread(target=SparkStreamer, - args=(kpi_list, oper_list, thresholds, window_size, window_slider, None, - stop_event)) + args=(kpi_list, oper_list, thresholds, stop_event, + window_size, window_slider, None )) self.running_threads[analyzer_id] = (thread, stop_event) - # thread.start() + thread.start() + print ("Initiated Analyzer backend: {:}".format(analyzer_id)) LOGGER.info("Initiated Analyzer backend: {:}".format(analyzer_id)) return True except Exception as e: @@ -99,10 +100,9 @@ class AnalyticsBackendService(GenericGrpcService): LOGGER.info("Terminating backend (by TerminateBackend): Analyzer Id: {:}".format(analyzer_uuid)) return True except Exception as e: - LOGGER.error("Failed to terminate. Analyzer Id: {:} - ERROR: ".format(analyzer_uuid, e)) + LOGGER.error("Failed to terminate. Analyzer Id: {:} - ERROR: {:}".format(analyzer_uuid, e)) return False else: - print ("Analyzer not found in active collectors: Analyzer Id: {:}".format(analyzer_uuid)) + print ("Analyzer not found in active collectors. Analyzer Id: {:}".format(analyzer_uuid)) # LOGGER.warning("Analyzer not found in active collectors: Analyzer Id: {:}".format(analyzer_uuid)) # generate confirmation towards frontend - diff --git a/src/analytics/backend/service/SparkStreaming.py b/src/analytics/backend/service/SparkStreaming.py index 11ec9fe5f..202076ed5 100644 --- a/src/analytics/backend/service/SparkStreaming.py +++ b/src/analytics/backend/service/SparkStreaming.py @@ -13,7 +13,7 @@ # limitations under the License. -import logging +import logging, time from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType, DoubleType, TimestampType from pyspark.sql.functions import from_json, col, window, avg, min, max, first, last, stddev, when, round @@ -25,6 +25,7 @@ def DefiningSparkSession(): # Create a Spark session with specific spark verions (3.5.0) return SparkSession.builder \ .appName("Analytics") \ + .config("spark.sql.streaming.forceDeleteTempCheckpointLocation", "true") \ .config("spark.jars.packages", "org.apache.spark:spark-sql-kafka-0-10_2.12:3.5.0") \ .getOrCreate() @@ -73,7 +74,7 @@ def ApplyThresholds(aggregated_df, thresholds): ) return aggregated_df -def SparkStreamer(kpi_list, oper_list, thresholds, +def SparkStreamer(kpi_list, oper_list, thresholds, stop_event, window_size=None, win_slide_duration=None, time_stamp_col=None): """ Method to perform Spark operation Kafka stream. @@ -136,10 +137,17 @@ def SparkStreamer(kpi_list, oper_list, thresholds, .outputMode("update") # Start the query execution - query.start().awaitTermination() + queryHandler = query.start() + + # Loop to check for stop event flag. To be set by stop collector method. + while True: + if stop_event.is_set(): + print ("Stop Event activated. Terminating in 5 seconds...") + time.sleep(5) + queryHandler.stop() + break + time.sleep(5) except Exception as e: print("Error in Spark streaming process: {:}".format(e)) LOGGER.debug("Error in Spark streaming process: {:}".format(e)) - finally: - spark.stop() -- GitLab From 54e0014b545f6a6d4db0384171ca30189c8a6c8a Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Sat, 7 Sep 2024 16:51:01 +0000 Subject: [PATCH 560/602] This Commit is for Error Correction - Reverted an unintentional change made in the `tfs.sh` file. --- deploy/tfs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/tfs.sh b/deploy/tfs.sh index 1aa32684b..b756ad2d0 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -179,7 +179,7 @@ kubectl create secret generic crdb-telemetry --namespace ${TFS_K8S_NAMESPACE} -- --from-literal=CRDB_DATABASE=${CRDB_DATABASE_TELEMETRY} \ --from-literal=CRDB_USERNAME=${CRDB_USERNAME} \ --from-literal=CRDB_PASSWORD=${CRDB_PASSWORD} \ - --from-literSLMODE=require + --from-literal=CRDB_SSLMODE=require printf "\n" echo "Create secret with CockroachDB data for Analytics microservices" -- GitLab From 8ac130c10dade4d58a1de43382d046a203a80af5 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 9 Sep 2024 11:38:19 +0000 Subject: [PATCH 561/602] Changes in Analytics Proto: - Added `Duration_s` field to the proto file. Frontend: - Added `SelectAnalyzer` logic. - Improved message formatting in the `create_analyzer_filter()` function. - Added a test case: `test_SelectAnalytics`. Backend: - Renamed the `RunSparkStreamer` method to `StartSparkStreamer`. - Updated the `StartRequestListener` method to return `(thread, stop_event)`. - Added a `StopRequestListener` method to stop the listener. Database: - Added the `select_with_filter` method with actual logic implementation. - Updated the `ConvertRowToAnalyzer` method to correctly read the `operation_mode` ENUM value. --- proto/analytics_frontend.proto | 18 +++++----- .../service/AnalyticsBackendService.py | 34 ++++++++++++++----- .../backend/service/SparkStreaming.py | 3 +- src/analytics/backend/tests/test_backend.py | 21 ++++++++++-- src/analytics/database/AnalyzerModel.py | 2 +- src/analytics/database/Analyzer_DB.py | 19 +++++++++-- .../AnalyticsFrontendServiceServicerImpl.py | 19 ++++++++--- src/analytics/frontend/tests/messages.py | 25 +++++++------- src/analytics/frontend/tests/test_frontend.py | 21 ++++++++---- 9 files changed, 115 insertions(+), 47 deletions(-) diff --git a/proto/analytics_frontend.proto b/proto/analytics_frontend.proto index bc7420d54..ace0581db 100644 --- a/proto/analytics_frontend.proto +++ b/proto/analytics_frontend.proto @@ -35,18 +35,20 @@ enum AnalyzerOperationMode { ANALYZEROPERATIONMODE_STREAMING = 2; } +// duration field may be added in analyzer... message Analyzer { AnalyzerId analyzer_id = 1; string algorithm_name = 2; // The algorithm to be executed - repeated kpi_manager.KpiId input_kpi_ids = 3; // The KPI Ids to be processed by the analyzer - repeated kpi_manager.KpiId output_kpi_ids = 4; // The KPI Ids produced by the analyzer - AnalyzerOperationMode operation_mode = 5; // Operation mode of the analyzer - map parameters = 6; + float duration_s = 3; // Termiate the data analytics thread after duration (seconds); 0 = infinity time + repeated kpi_manager.KpiId input_kpi_ids = 4; // The KPI Ids to be processed by the analyzer + repeated kpi_manager.KpiId output_kpi_ids = 5; // The KPI Ids produced by the analyzer + AnalyzerOperationMode operation_mode = 6; // Operation mode of the analyzer + map parameters = 7; // Add dictionary of (key, value) pairs such as (window_size, 10) etc. // In batch mode... - float batch_min_duration_s = 7; // ..., min duration to collect before executing batch - float batch_max_duration_s = 8; // ..., max duration collected to execute the batch - uint64 batch_min_size = 9; // ..., min number of samples to collect before executing batch - uint64 batch_max_size = 10; // ..., max number of samples collected to execute the batch + float batch_min_duration_s = 8; // ..., min duration to collect before executing batch + float batch_max_duration_s = 9; // ..., max duration collected to execute the batch + uint64 batch_min_size = 10; // ..., min number of samples to collect before executing batch + uint64 batch_max_size = 11; // ..., max number of samples collected to execute the batch } message AnalyzerFilter { diff --git a/src/analytics/backend/service/AnalyticsBackendService.py b/src/analytics/backend/service/AnalyticsBackendService.py index 899525fc6..463442f82 100755 --- a/src/analytics/backend/service/AnalyticsBackendService.py +++ b/src/analytics/backend/service/AnalyticsBackendService.py @@ -34,7 +34,7 @@ class AnalyticsBackendService(GenericGrpcService): 'group.id' : 'analytics-frontend', 'auto.offset.reset' : 'latest'}) - def RunSparkStreamer(self, analyzer_id, analyzer): + def StartSparkStreamer(self, analyzer_id, analyzer): kpi_list = analyzer['input_kpis'] oper_list = [s.replace('_value', '') for s in list(analyzer["thresholds"].keys())] # TODO: update this line... thresholds = analyzer['thresholds'] @@ -59,17 +59,33 @@ class AnalyticsBackendService(GenericGrpcService): LOGGER.error("Failed to initiate Analyzer backend: {:}".format(e)) return False - def RunRequestListener(self)->bool: - threading.Thread(target=self.RequestListener).start() - return True + def StopRequestListener(self, threadInfo: tuple): + try: + thread, stop_event = threadInfo + stop_event.set() + thread.join() + print ("Terminating Analytics backend RequestListener") + LOGGER.info("Terminating Analytics backend RequestListener") + return True + except Exception as e: + print ("Failed to terminate analytics backend {:}".format(e)) + LOGGER.error("Failed to terminate analytics backend {:}".format(e)) + return False + + def StartRequestListener(self)->tuple: + stop_event = threading.Event() + thread = threading.Thread(target=self.RequestListener, + args=(stop_event,) ) + thread.start() + return (thread, stop_event) - def RequestListener(self): + def RequestListener(self, stop_event): """ listener for requests on Kafka topic. """ consumer = self.kafka_consumer consumer.subscribe([KafkaTopic.ANALYTICS_REQUEST.value]) - while True: + while not stop_event.is_set(): receive_msg = consumer.poll(2.0) if receive_msg is None: continue @@ -87,7 +103,9 @@ class AnalyticsBackendService(GenericGrpcService): if analyzer["algo_name"] is None and analyzer["oper_mode"] is None: self.TerminateAnalyzerBackend(analyzer_uuid) else: - self.RunSparkStreamer(analyzer_uuid, analyzer) + self.StartSparkStreamer(analyzer_uuid, analyzer) + LOGGER.debug("Stop Event activated. Terminating...") + print ("Stop Event activated. Terminating...") def TerminateAnalyzerBackend(self, analyzer_uuid): if analyzer_uuid in self.running_threads: @@ -104,5 +122,5 @@ class AnalyticsBackendService(GenericGrpcService): return False else: print ("Analyzer not found in active collectors. Analyzer Id: {:}".format(analyzer_uuid)) - # LOGGER.warning("Analyzer not found in active collectors: Analyzer Id: {:}".format(analyzer_uuid)) + LOGGER.warning("Analyzer not found in active collectors: Analyzer Id: {:}".format(analyzer_uuid)) # generate confirmation towards frontend diff --git a/src/analytics/backend/service/SparkStreaming.py b/src/analytics/backend/service/SparkStreaming.py index 202076ed5..eaabcfed2 100644 --- a/src/analytics/backend/service/SparkStreaming.py +++ b/src/analytics/backend/service/SparkStreaming.py @@ -142,7 +142,8 @@ def SparkStreamer(kpi_list, oper_list, thresholds, stop_event, # Loop to check for stop event flag. To be set by stop collector method. while True: if stop_event.is_set(): - print ("Stop Event activated. Terminating in 5 seconds...") + LOGGER.debug("Stop Event activated. Terminating in 5 seconds...") + print ("Stop Event activated. Terminating in 5 seconds...") time.sleep(5) queryHandler.stop() break diff --git a/src/analytics/backend/tests/test_backend.py b/src/analytics/backend/tests/test_backend.py index 9e8a0832d..c3e00df35 100644 --- a/src/analytics/backend/tests/test_backend.py +++ b/src/analytics/backend/tests/test_backend.py @@ -12,7 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +import time import logging +import threading from common.tools.kafka.Variables import KafkaTopic from analytics.backend.service.AnalyticsBackendService import AnalyticsBackendService from analytics.backend.tests.messages import get_kpi_id_list, get_operation_list, get_threshold_dict @@ -30,12 +32,25 @@ def test_validate_kafka_topics(): response = KafkaTopic.create_all_topics() assert isinstance(response, bool) -def test_RunRequestListener(): +def test_StartRequestListener(): LOGGER.info('test_RunRequestListener') AnalyticsBackendServiceObj = AnalyticsBackendService() - response = AnalyticsBackendServiceObj.RunRequestListener() - LOGGER.debug(str(response)) + response = AnalyticsBackendServiceObj.StartRequestListener() # response is Tuple (thread, stop_event) + LOGGER.debug(str(response)) + assert isinstance(response, tuple) +def test_StopRequestListener(): + LOGGER.info('test_RunRequestListener') + LOGGER.info('Initiating StartRequestListener...') + AnalyticsBackendServiceObj = AnalyticsBackendService() + response_thread = AnalyticsBackendServiceObj.StartRequestListener() # response is Tuple (thread, stop_event) + # LOGGER.debug(str(response_thread)) + time.sleep(10) + LOGGER.info('Initiating StopRequestListener...') + AnalyticsBackendServiceObj = AnalyticsBackendService() + response = AnalyticsBackendServiceObj.StopRequestListener(response_thread) + LOGGER.debug(str(response)) + assert isinstance(response, bool) def test_SparkListener(): LOGGER.info('test_RunRequestListener') diff --git a/src/analytics/database/AnalyzerModel.py b/src/analytics/database/AnalyzerModel.py index 783205269..c33e396e0 100644 --- a/src/analytics/database/AnalyzerModel.py +++ b/src/analytics/database/AnalyzerModel.py @@ -87,7 +87,7 @@ class Analyzer(Base): response = analytics_frontend_pb2.Analyzer() response.analyzer_id.analyzer_id.uuid = row.analyzer_id response.algorithm_name = row.algorithm_name - response.operation_mode = row.operation_mode + response.operation_mode = row.operation_mode.value response.parameters.update(row.parameters) for input_kpi_id in row.input_kpi_ids: diff --git a/src/analytics/database/Analyzer_DB.py b/src/analytics/database/Analyzer_DB.py index 896ba1100..1ba68989a 100644 --- a/src/analytics/database/Analyzer_DB.py +++ b/src/analytics/database/Analyzer_DB.py @@ -15,7 +15,7 @@ import logging import sqlalchemy_utils -from sqlalchemy import inspect +from sqlalchemy import inspect, or_ from sqlalchemy.orm import sessionmaker from analytics.database.AnalyzerModel import Analyzer as AnalyzerModel @@ -120,9 +120,22 @@ class AnalyzerDB: session = self.Session() try: query = session.query(AnalyzerModel) + # Apply filters based on the filter_object - if filter_object.kpi_id: - query = query.filter(AnalyzerModel.kpi_id.in_([k.kpi_id.uuid for k in filter_object.kpi_id])) # Need to be updated + if filter_object.analyzer_id: + query = query.filter(AnalyzerModel.analyzer_id.in_([a.analyzer_id.uuid for a in filter_object.analyzer_id])) + + if filter_object.algorithm_names: + query = query.filter(AnalyzerModel.algorithm_name.in_(filter_object.algorithm_names)) + + if filter_object.input_kpi_ids: + input_kpi_uuids = [k.kpi_id.uuid for k in filter_object.input_kpi_ids] + query = query.filter(AnalyzerModel.input_kpi_ids.op('&&')(input_kpi_uuids)) + + if filter_object.output_kpi_ids: + output_kpi_uuids = [k.kpi_id.uuid for k in filter_object.output_kpi_ids] + query = query.filter(AnalyzerModel.output_kpi_ids.op('&&')(output_kpi_uuids)) + result = query.all() # query should be added to return all rows if result: diff --git a/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py index 9c438761c..f35f035e2 100644 --- a/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py +++ b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py @@ -126,12 +126,23 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer): @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SelectAnalyzers(self, - request : AnalyzerFilter, contextgrpc_context: grpc.ServicerContext # type: ignore + filter : AnalyzerFilter, contextgrpc_context: grpc.ServicerContext # type: ignore ) -> AnalyzerList: # type: ignore - LOGGER.info("At Service gRPC message: {:}".format(request)) + LOGGER.info("At Service gRPC message: {:}".format(filter)) response = AnalyzerList() - - return response + try: + rows = self.db_obj.select_with_filter(AnalyzerModel, filter) + try: + for row in rows: + response.analyzer_list.append( + AnalyzerModel.ConvertRowToAnalyzer(row) + ) + return response + except Exception as e: + LOGGER.info('Unable to process filter response {:}'.format(e)) + except Exception as e: + LOGGER.error('Unable to apply filter on table {:}. ERROR: {:}'.format(AnalyzerModel.__name__, e)) + def delivery_callback(self, err, msg): if err: diff --git a/src/analytics/frontend/tests/messages.py b/src/analytics/frontend/tests/messages.py index 180fac1f8..646de962e 100644 --- a/src/analytics/frontend/tests/messages.py +++ b/src/analytics/frontend/tests/messages.py @@ -21,12 +21,13 @@ from common.proto.analytics_frontend_pb2 import ( AnalyzerOperationMode, Analyze def create_analyzer_id(): _create_analyzer_id = AnalyzerId() # _create_analyzer_id.analyzer_id.uuid = str(uuid.uuid4()) - _create_analyzer_id.analyzer_id.uuid = "9baa306d-d91c-48c2-a92f-76a21bab35b6" + _create_analyzer_id.analyzer_id.uuid = "efef4d95-1cf1-43c4-9742-95c283ddd7a6" return _create_analyzer_id def create_analyzer(): _create_analyzer = Analyzer() - _create_analyzer.analyzer_id.analyzer_id.uuid = str(uuid.uuid4()) + # _create_analyzer.analyzer_id.analyzer_id.uuid = str(uuid.uuid4()) + _create_analyzer.analyzer_id.analyzer_id.uuid = "efef4d95-1cf1-43c4-9742-95c283ddd7a6" _create_analyzer.algorithm_name = "Test_Aggergate_and_Threshold" _create_analyzer.operation_mode = AnalyzerOperationMode.ANALYZEROPERATIONMODE_STREAMING @@ -60,24 +61,24 @@ def create_analyzer_filter(): _create_analyzer_filter = AnalyzerFilter() _analyzer_id_obj = AnalyzerId() - _analyzer_id_obj.analyzer_id.uuid = str(uuid.uuid4()) + # _analyzer_id_obj.analyzer_id.uuid = str(uuid.uuid4()) + _analyzer_id_obj.analyzer_id.uuid = "efef4d95-1cf1-43c4-9742-95c283ddd7a6" _create_analyzer_filter.analyzer_id.append(_analyzer_id_obj) - _create_analyzer_filter.algorithm_names.append('Algorithum1') + _create_analyzer_filter.algorithm_names.append('Test_Aggergate_and_Threshold') - _input_kpi_id_obj = KpiId() - _input_kpi_id_obj.kpi_id.uuid = str(uuid.uuid4()) - _create_analyzer_filter.input_kpi_ids.append(_input_kpi_id_obj) + # _input_kpi_id_obj = KpiId() + # _input_kpi_id_obj.kpi_id.uuid = str(uuid.uuid4()) + # _create_analyzer_filter.input_kpi_ids.append(_input_kpi_id_obj) # another input kpi Id # _input_kpi_id_obj.kpi_id.uuid = str(uuid.uuid4()) # _create_analyzer_filter.input_kpi_ids.append(_input_kpi_id_obj) - _output_kpi_id_obj = KpiId() - _output_kpi_id_obj.kpi_id.uuid = str(uuid.uuid4()) - _create_analyzer_filter.output_kpi_ids.append(_output_kpi_id_obj) - # another output kpi Id + # _output_kpi_id_obj = KpiId() + # _output_kpi_id_obj.kpi_id.uuid = str(uuid.uuid4()) + # _create_analyzer_filter.output_kpi_ids.append(_output_kpi_id_obj) + # # another output kpi Id # _output_kpi_id_obj.kpi_id.uuid = str(uuid.uuid4()) # _create_analyzer_filter.input_kpi_ids.append(_output_kpi_id_obj) return _create_analyzer_filter - diff --git a/src/analytics/frontend/tests/test_frontend.py b/src/analytics/frontend/tests/test_frontend.py index df6ce165e..b96116d29 100644 --- a/src/analytics/frontend/tests/test_frontend.py +++ b/src/analytics/frontend/tests/test_frontend.py @@ -21,10 +21,11 @@ from common.proto.context_pb2 import Empty from common.Settings import ( get_service_port_grpc, get_env_var_name, ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC ) +from common.tools.kafka.Variables import KafkaTopic from common.proto.analytics_frontend_pb2 import AnalyzerId, AnalyzerList from analytics.frontend.client.AnalyticsFrontendClient import AnalyticsFrontendClient from analytics.frontend.service.AnalyticsFrontendService import AnalyticsFrontendService -from analytics.frontend.tests.messages import ( create_analyzer_id, create_analyzer, +from analytics.frontend.tests.messages import ( create_analyzer_id, create_analyzer, create_analyzer_filter ) ########################### @@ -75,6 +76,12 @@ def analyticsFrontend_client(analyticsFrontend_service : AnalyticsFrontendServic # Tests Implementation of Analytics Frontend ########################### +# --- "test_validate_kafka_topics" should be executed before the functionality tests --- +def test_validate_kafka_topics(): + LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ") + response = KafkaTopic.create_all_topics() + assert isinstance(response, bool) + # ----- core funtionality test ----- def test_StartAnalytics(analyticsFrontend_client): LOGGER.info(' >>> test_StartAnalytic START: <<< ') @@ -82,14 +89,14 @@ def test_StartAnalytics(analyticsFrontend_client): LOGGER.debug(str(response)) assert isinstance(response, AnalyzerId) +def test_SelectAnalytics(analyticsFrontend_client): + LOGGER.info(' >>> test_SelectAnalytics START: <<< ') + response = analyticsFrontend_client.SelectAnalyzers(create_analyzer_filter()) + LOGGER.debug(str(response)) + assert isinstance(response, AnalyzerList) + def test_StopAnalytic(analyticsFrontend_client): LOGGER.info(' >>> test_StopAnalytic START: <<< ') response = analyticsFrontend_client.StopAnalyzer(create_analyzer_id()) LOGGER.debug(str(response)) assert isinstance(response, Empty) - -def test_SelectAnalytics(analyticsFrontend_client): - LOGGER.info(' >>> test_SelectAnalytics START: <<< ') - response = analyticsFrontend_client.SelectAnalyzers(create_analyzer_filter()) - LOGGER.debug(str(response)) - assert isinstance(response, AnalyzerList) \ No newline at end of file -- GitLab From 63bc43337e3eaaa81239b3e0073b7f710cba05ef Mon Sep 17 00:00:00 2001 From: jjdiaz Date: Mon, 9 Sep 2024 15:31:37 +0200 Subject: [PATCH 562/602] Code cleanup --- src/common/method_wrappers/Decorator.py | 14 - .../connector/client/DltConnectorClient.py | 70 +- ...ientSync.py => DltConnectorClientAsync.py} | 57 +- .../connector/client/DltEventsCollector.py | 4 +- src/dlt/connector/client/DltGatewayClient.py | 73 +- .../connector/client/DltGatewayClientAsync.py | 87 + .../connector/client/DltGatewayClientEvent.py | 57 - .../DltConnectorServiceServicerImpl.py | 18 +- src/dlt/connector/service/__main__.py | 6 +- .../event_dispatcher/DltEventDispatcher.py | 8 +- .../automation/k8sconfig/configmap.yaml | 17 - .../k8sconfig/deploy_dlt_gateway.sh | 34 - .../automation/k8sconfig/deployment.yaml | 74 - .../k8sconfig/persistent-volume-claim.yaml | 11 - .../k8sconfig/persistent-volume.yaml | 15 - .../k8sconfig/remove_dlt_gateway.sh | 37 - .../gateway/automation/k8sconfig/service.yaml | 14 - .../automation/k8sconfig/simpletest.yaml | 19 - .../{adrenalineTopo.go => chaincode.go} | 14 + src/dlt/gateway/chaincode/go.mod | 16 +- src/dlt/gateway/dltApp/proto/context.proto | 14 + src/dlt/gateway/dltApp/src/dltGateway.js | 15 + src/dlt/gateway/dltApp/src/fabricConnect.ts | 17 +- .../dltApp/tests/dltApp_Test/.gitignore | 1 - .../tests/dltApp_Test/package-lock.json | 2060 ----------------- .../dltApp/tests/dltApp_Test/package.json | 34 - .../dltApp_Test/src/adrenalineDLT_app.ts | 341 --- .../dltApp/tests/dltApp_Test/tsconfig.json | 18 - src/dlt/gateway/dltApp/tests/perfTest.js | 14 + src/dlt/gateway/dltApp/tests/rateTest.js | 14 + src/dlt/gateway/dltApp/tests/simpleTest.js | 14 + .../dltApp/{src => tests}/testEvents.js | 15 + .../dltApp/{src => tests}/testGateway.js | 15 + src/dlt/gateway/dltApp/tsconfig.json | 2 +- src/dlt/performance/__main__.py | 2 +- src/dlt/performance/play_ground/Dlt.py | 2 +- src/dlt/performance/play_ground/__init__.py | 2 +- .../service/InterdomainServiceServicerImpl.py | 4 +- .../topology_abstractor/DltRecordSender.py | 6 +- .../topology_abstractor/TopologyAbstractor.py | 2 +- src/load_generator/load_gen/DltTools.py | 2 +- .../load_gen/RequestGenerator.py | 2 +- .../tests/test_dlt_functional.py | 2 +- 43 files changed, 318 insertions(+), 2925 deletions(-) rename src/dlt/connector/client/{DltConnectorClientSync.py => DltConnectorClientAsync.py} (72%) create mode 100644 src/dlt/connector/client/DltGatewayClientAsync.py delete mode 100644 src/dlt/connector/client/DltGatewayClientEvent.py delete mode 100644 src/dlt/gateway/automation/k8sconfig/configmap.yaml delete mode 100644 src/dlt/gateway/automation/k8sconfig/deploy_dlt_gateway.sh delete mode 100644 src/dlt/gateway/automation/k8sconfig/deployment.yaml delete mode 100644 src/dlt/gateway/automation/k8sconfig/persistent-volume-claim.yaml delete mode 100644 src/dlt/gateway/automation/k8sconfig/persistent-volume.yaml delete mode 100644 src/dlt/gateway/automation/k8sconfig/remove_dlt_gateway.sh delete mode 100644 src/dlt/gateway/automation/k8sconfig/service.yaml delete mode 100644 src/dlt/gateway/automation/k8sconfig/simpletest.yaml rename src/dlt/gateway/chaincode/{adrenalineTopo.go => chaincode.go} (88%) delete mode 100644 src/dlt/gateway/dltApp/tests/dltApp_Test/.gitignore delete mode 100644 src/dlt/gateway/dltApp/tests/dltApp_Test/package-lock.json delete mode 100644 src/dlt/gateway/dltApp/tests/dltApp_Test/package.json delete mode 100644 src/dlt/gateway/dltApp/tests/dltApp_Test/src/adrenalineDLT_app.ts delete mode 100644 src/dlt/gateway/dltApp/tests/dltApp_Test/tsconfig.json rename src/dlt/gateway/dltApp/{src => tests}/testEvents.js (66%) rename src/dlt/gateway/dltApp/{src => tests}/testGateway.js (84%) diff --git a/src/common/method_wrappers/Decorator.py b/src/common/method_wrappers/Decorator.py index bfda31ec9..d86a769ef 100644 --- a/src/common/method_wrappers/Decorator.py +++ b/src/common/method_wrappers/Decorator.py @@ -12,20 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 grpc, json, logging, threading from enum import Enum from prettytable import PrettyTable diff --git a/src/dlt/connector/client/DltConnectorClient.py b/src/dlt/connector/client/DltConnectorClient.py index a2224dd32..e383217d8 100644 --- a/src/dlt/connector/client/DltConnectorClient.py +++ b/src/dlt/connector/client/DltConnectorClient.py @@ -12,12 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -# DltConnectorClient.py - -import grpc -import logging -import asyncio - +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 Empty, TopologyId @@ -40,90 +35,77 @@ class DltConnectorClient: LOGGER.debug('Creating channel to {:s}...'.format(self.endpoint)) self.channel = None self.stub = None - #self.connect() - #LOGGER.debug('Channel created') + self.connect() + LOGGER.debug('Channel created') - async def connect(self): - self.channel = grpc.aio.insecure_channel(self.endpoint) + def connect(self): + self.channel = grpc.insecure_channel(self.endpoint) self.stub = DltConnectorServiceStub(self.channel) - LOGGER.debug('Channel created') - async def close(self): - if self.channel is not None: - await self.channel.close() + def close(self): + if self.channel is not None: self.channel.close() self.channel = None self.stub = None @RETRY_DECORATOR - async def RecordAll(self, request: TopologyId) -> Empty: + def RecordAll(self, request : TopologyId) -> Empty: LOGGER.debug('RecordAll request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordAll(request) + response = self.stub.RecordAll(request) LOGGER.debug('RecordAll result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def RecordAllDevices(self, request: TopologyId) -> Empty: + def RecordAllDevices(self, request : TopologyId) -> Empty: LOGGER.debug('RecordAllDevices request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordAllDevices(request) + response = self.stub.RecordAllDevices(request) LOGGER.debug('RecordAllDevices result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - # async def RecordDevice(self, request: DltDeviceId) -> Empty: - # LOGGER.debug('RECORD_DEVICE request received: {:s}'.format(grpc_message_to_json_string(request))) - - # Simulate some asynchronous processing delay - # await asyncio.sleep(2) # Simulates processing time - - # Create a dummy response (Empty message) - # response = Empty() - - # LOGGER.debug('RECORD_DEVICE processing complete for request: {:s}'.format(grpc_message_to_json_string(request))) - # return response - async def RecordDevice(self, request: DltDeviceId) -> Empty: - LOGGER.debug('RECORD_DEVICE request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordDevice(request) + def RecordDevice(self, request : DltDeviceId) -> Empty: + LOGGER.debug('RecordDevice request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.RecordDevice(request) LOGGER.debug('RecordDevice result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def RecordAllLinks(self, request: TopologyId) -> Empty: + def RecordAllLinks(self, request : TopologyId) -> Empty: LOGGER.debug('RecordAllLinks request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordAllLinks(request) + response = self.stub.RecordAllLinks(request) LOGGER.debug('RecordAllLinks result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def RecordLink(self, request: DltLinkId) -> Empty: + def RecordLink(self, request : DltLinkId) -> Empty: LOGGER.debug('RecordLink request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordLink(request) + response = self.stub.RecordLink(request) LOGGER.debug('RecordLink result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def RecordAllServices(self, request: TopologyId) -> Empty: + def RecordAllServices(self, request : TopologyId) -> Empty: LOGGER.debug('RecordAllServices request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordAllServices(request) + response = self.stub.RecordAllServices(request) LOGGER.debug('RecordAllServices result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def RecordService(self, request: DltServiceId) -> Empty: + def RecordService(self, request : DltServiceId) -> Empty: LOGGER.debug('RecordService request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordService(request) + response = self.stub.RecordService(request) LOGGER.debug('RecordService result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def RecordAllSlices(self, request: TopologyId) -> Empty: + def RecordAllSlices(self, request : TopologyId) -> Empty: LOGGER.debug('RecordAllSlices request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordAllSlices(request) + response = self.stub.RecordAllSlices(request) LOGGER.debug('RecordAllSlices result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - async def RecordSlice(self, request: DltSliceId) -> Empty: + def RecordSlice(self, request : DltSliceId) -> Empty: LOGGER.debug('RecordSlice request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordSlice(request) + response = self.stub.RecordSlice(request) LOGGER.debug('RecordSlice result: {:s}'.format(grpc_message_to_json_string(response))) return response diff --git a/src/dlt/connector/client/DltConnectorClientSync.py b/src/dlt/connector/client/DltConnectorClientAsync.py similarity index 72% rename from src/dlt/connector/client/DltConnectorClientSync.py rename to src/dlt/connector/client/DltConnectorClientAsync.py index a633e89bd..23cd63fa0 100644 --- a/src/dlt/connector/client/DltConnectorClientSync.py +++ b/src/dlt/connector/client/DltConnectorClientAsync.py @@ -12,7 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import grpc, logging +import grpc, logging, asyncio + from common.Constants import ServiceNameEnum from common.Settings import get_service_host, get_service_port_grpc from common.proto.context_pb2 import Empty, TopologyId @@ -27,7 +28,7 @@ MAX_RETRIES = 15 DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') -class DltConnectorClientSync: +class DltConnectorClientAsync: def __init__(self, host=None, port=None): if not host: host = get_service_host(ServiceNameEnum.DLT) if not port: port = get_service_port_grpc(ServiceNameEnum.DLT) @@ -35,77 +36,79 @@ class DltConnectorClientSync: LOGGER.debug('Creating channel to {:s}...'.format(self.endpoint)) self.channel = None self.stub = None - self.connect() - LOGGER.debug('Channel created') + #self.connect() + #LOGGER.debug('Channel created') - def connect(self): - self.channel = grpc.insecure_channel(self.endpoint) + async def connect(self): + self.channel = grpc.aio.insecure_channel(self.endpoint) self.stub = DltConnectorServiceStub(self.channel) + LOGGER.debug('Channel created') - def close(self): - if self.channel is not None: self.channel.close() + async def close(self): + if self.channel is not None: + await self.channel.close() self.channel = None self.stub = None @RETRY_DECORATOR - def RecordAll(self, request : TopologyId) -> Empty: + async def RecordAll(self, request: TopologyId) -> Empty: LOGGER.debug('RecordAll request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordAll(request) + response = await self.stub.RecordAll(request) LOGGER.debug('RecordAll result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordAllDevices(self, request : TopologyId) -> Empty: + async def RecordAllDevices(self, request: TopologyId) -> Empty: LOGGER.debug('RecordAllDevices request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordAllDevices(request) + response = await self.stub.RecordAllDevices(request) LOGGER.debug('RecordAllDevices result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordDevice(self, request : DltDeviceId) -> Empty: - LOGGER.debug('RecordDevice request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordDevice(request) + async def RecordDevice(self, request: DltDeviceId) -> Empty: + LOGGER.debug('RECORD_DEVICE request: {:s}'.format(grpc_message_to_json_string(request))) + response = await self.stub.RecordDevice(request) LOGGER.debug('RecordDevice result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordAllLinks(self, request : TopologyId) -> Empty: + async def RecordAllLinks(self, request: TopologyId) -> Empty: LOGGER.debug('RecordAllLinks request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordAllLinks(request) + response = await self.stub.RecordAllLinks(request) LOGGER.debug('RecordAllLinks result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordLink(self, request : DltLinkId) -> Empty: + async def RecordLink(self, request: DltLinkId) -> Empty: LOGGER.debug('RecordLink request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordLink(request) + response = await self.stub.RecordLink(request) LOGGER.debug('RecordLink result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordAllServices(self, request : TopologyId) -> Empty: + async def RecordAllServices(self, request: TopologyId) -> Empty: LOGGER.debug('RecordAllServices request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordAllServices(request) + response = await self.stub.RecordAllServices(request) LOGGER.debug('RecordAllServices result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordService(self, request : DltServiceId) -> Empty: + async def RecordService(self, request: DltServiceId) -> Empty: LOGGER.debug('RecordService request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordService(request) + response = await self.stub.RecordService(request) LOGGER.debug('RecordService result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordAllSlices(self, request : TopologyId) -> Empty: + async def RecordAllSlices(self, request: TopologyId) -> Empty: LOGGER.debug('RecordAllSlices request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordAllSlices(request) + response = await self.stub.RecordAllSlices(request) LOGGER.debug('RecordAllSlices result: {:s}'.format(grpc_message_to_json_string(response))) return response @RETRY_DECORATOR - def RecordSlice(self, request : DltSliceId) -> Empty: + async def RecordSlice(self, request: DltSliceId) -> Empty: LOGGER.debug('RecordSlice request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.RecordSlice(request) + response = await self.stub.RecordSlice(request) LOGGER.debug('RecordSlice result: {:s}'.format(grpc_message_to_json_string(response))) return response diff --git a/src/dlt/connector/client/DltEventsCollector.py b/src/dlt/connector/client/DltEventsCollector.py index 2e38d0445..594d84838 100644 --- a/src/dlt/connector/client/DltEventsCollector.py +++ b/src/dlt/connector/client/DltEventsCollector.py @@ -16,7 +16,7 @@ from typing import Callable, Optional import grpc, logging, queue, threading, time from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordSubscription from common.tools.grpc.Tools import grpc_message_to_json_string -from dlt.connector.client.DltGatewayClientEvent import DltGatewayClientEvent +from src.dlt.connector.client.DltGatewayClient import DltGatewayClient LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -31,7 +31,7 @@ LOGGER.setLevel(logging.DEBUG) class DltEventsCollector(threading.Thread): def __init__( - self, dltgateway_client : DltGatewayClientEvent, + self, dltgateway_client : DltGatewayClient, log_events_received : bool = False, event_handler : Optional[Callable[[DltRecordEvent], Optional[DltRecordEvent]]] = None, ) -> None: diff --git a/src/dlt/connector/client/DltGatewayClient.py b/src/dlt/connector/client/DltGatewayClient.py index 2690dfb66..71f336866 100644 --- a/src/dlt/connector/client/DltGatewayClient.py +++ b/src/dlt/connector/client/DltGatewayClient.py @@ -13,14 +13,9 @@ # limitations under the License. - -import grpc -import logging -import asyncio -from typing import Iterator, List -from common.proto.context_pb2 import Empty, TeraFlowController -from common.proto.dlt_gateway_pb2 import ( - DltPeerStatus, DltPeerStatusList, DltRecord, DltRecordEvent, DltRecordId, DltRecordStatus, DltRecordSubscription) +import grpc, logging +from typing import Iterator +from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordSubscription from common.proto.dlt_gateway_pb2_grpc import DltGatewayServiceStub from common.tools.client.RetryDecorator import retry, delay_exponential from common.tools.grpc.Tools import grpc_message_to_json_string @@ -40,70 +35,22 @@ class DltGatewayClient: LOGGER.debug('Creating channel to {:s}...'.format(self.endpoint)) self.channel = None self.stub = None - #self.connect() - self.message_queue: List[DltRecord] = [] - #LOGGER.debug('Channel created') - + self.connect() + LOGGER.debug('Channel created') - async def connect(self): - self.channel = grpc.aio.insecure_channel(self.endpoint) + def connect(self): + self.channel = grpc.insecure_channel(self.endpoint) self.stub = DltGatewayServiceStub(self.channel) - LOGGER.debug('Channel created') - async def close(self): + def close(self): if self.channel is not None: - await self.channel.close() + self.channel.close() self.channel = None self.stub = None - # async def dummy_process(self, request: DltRecord): - # # Simulate processing delay - # await asyncio.sleep(2) - # return DltRecordStatus(status="DLTRECORDSTATUS_SUCCEEDED", record_id=request.record_id) - - - @RETRY_DECORATOR - async def RecordToDlt(self, request : DltRecord) -> DltRecordStatus: - LOGGER.debug('RecordToDlt request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.RecordToDlt(request) - LOGGER.debug('RecordToDlt result: {:s}'.format(grpc_message_to_json_string(response))) - return response - - # @RETRY_DECORATOR - # async def RecordToDlt(self, request: DltRecord) -> DltRecordStatus: - # self.message_queue.append(request) - # LOGGER.debug(f'RecordToDlt request: {grpc_message_to_json_string(request)}') - # LOGGER.debug(f'Queue length before processing: {len(self.message_queue)}') - # response = await self.dummy_process(request) - # LOGGER.debug(f'RecordToDlt result: {grpc_message_to_json_string(response)}') - # self.message_queue.remove(request) - # LOGGER.debug(f'Queue length after processing: {len(self.message_queue)}') - # return response - @RETRY_DECORATOR - async def GetFromDlt(self, request : DltRecordId) -> DltRecord: - LOGGER.debug('GetFromDlt request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.GetFromDlt(request) - LOGGER.debug('GetFromDlt result: {:s}'.format(grpc_message_to_json_string(response))) - return response - - @RETRY_DECORATOR - def SubscribeToDlt(self, request : DltRecordSubscription) -> Iterator[DltRecordEvent]: + def SubscribeToDlt(self, request: DltRecordSubscription) -> Iterator[DltRecordEvent]: LOGGER.debug('SubscribeToDlt request: {:s}'.format(grpc_message_to_json_string(request))) response = self.stub.SubscribeToDlt(request) LOGGER.debug('SubscribeToDlt result: {:s}'.format(grpc_message_to_json_string(response))) return response - - @RETRY_DECORATOR - async def GetDltStatus(self, request : TeraFlowController) -> DltPeerStatus: - LOGGER.debug('GetDltStatus request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.GetDltStatus(request) - LOGGER.debug('GetDltStatus result: {:s}'.format(grpc_message_to_json_string(response))) - return response - - @RETRY_DECORATOR - async def GetDltPeers(self, request : Empty) -> DltPeerStatusList: - LOGGER.debug('GetDltPeers request: {:s}'.format(grpc_message_to_json_string(request))) - response = await self.stub.GetDltPeers(request) - LOGGER.debug('GetDltPeers result: {:s}'.format(grpc_message_to_json_string(response))) - return response diff --git a/src/dlt/connector/client/DltGatewayClientAsync.py b/src/dlt/connector/client/DltGatewayClientAsync.py new file mode 100644 index 000000000..84c753e03 --- /dev/null +++ b/src/dlt/connector/client/DltGatewayClientAsync.py @@ -0,0 +1,87 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 grpc, logging, asyncio +from typing import Iterator, List +from common.proto.context_pb2 import Empty, TeraFlowController +from common.proto.dlt_gateway_pb2 import ( + DltPeerStatus, DltPeerStatusList, DltRecord, DltRecordEvent, DltRecordId, DltRecordStatus, DltRecordSubscription) +from common.proto.dlt_gateway_pb2_grpc import DltGatewayServiceStub +from common.tools.client.RetryDecorator import retry, delay_exponential +from common.tools.grpc.Tools import grpc_message_to_json_string +from dlt.connector.Config import DLT_GATEWAY_HOST, DLT_GATEWAY_PORT + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) +MAX_RETRIES = 15 +DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) +RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') + +class DltGatewayClientAsync: + def __init__(self, host=None, port=None): + if not host: host = DLT_GATEWAY_HOST + if not port: port = DLT_GATEWAY_PORT + self.endpoint = '{:s}:{:s}'.format(str(host), str(port)) + LOGGER.debug('Creating channel to {:s}...'.format(self.endpoint)) + self.channel = None + self.stub = None + #self.connect() + self.message_queue: List[DltRecord] = [] + #LOGGER.debug('Channel created') + + async def connect(self): + self.channel = grpc.aio.insecure_channel(self.endpoint) + self.stub = DltGatewayServiceStub(self.channel) + LOGGER.debug('Channel created') + + async def close(self): + if self.channel is not None: + await self.channel.close() + self.channel = None + self.stub = None + + @RETRY_DECORATOR + async def RecordToDlt(self, request : DltRecord) -> DltRecordStatus: + LOGGER.debug('RecordToDlt request: {:s}'.format(grpc_message_to_json_string(request))) + response = await self.stub.RecordToDlt(request) + LOGGER.debug('RecordToDlt result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + async def GetFromDlt(self, request : DltRecordId) -> DltRecord: + LOGGER.debug('GetFromDlt request: {:s}'.format(grpc_message_to_json_string(request))) + response = await self.stub.GetFromDlt(request) + LOGGER.debug('GetFromDlt result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def SubscribeToDlt(self, request : DltRecordSubscription) -> Iterator[DltRecordEvent]: + LOGGER.debug('SubscribeToDlt request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.SubscribeToDlt(request) + LOGGER.debug('SubscribeToDlt result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + async def GetDltStatus(self, request : TeraFlowController) -> DltPeerStatus: + LOGGER.debug('GetDltStatus request: {:s}'.format(grpc_message_to_json_string(request))) + response = await self.stub.GetDltStatus(request) + LOGGER.debug('GetDltStatus result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + async def GetDltPeers(self, request : Empty) -> DltPeerStatusList: + LOGGER.debug('GetDltPeers request: {:s}'.format(grpc_message_to_json_string(request))) + response = await self.stub.GetDltPeers(request) + LOGGER.debug('GetDltPeers result: {:s}'.format(grpc_message_to_json_string(response))) + return response diff --git a/src/dlt/connector/client/DltGatewayClientEvent.py b/src/dlt/connector/client/DltGatewayClientEvent.py deleted file mode 100644 index 6cbaf1a27..000000000 --- a/src/dlt/connector/client/DltGatewayClientEvent.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 grpc -import logging -from typing import Iterator -from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordSubscription -from common.proto.dlt_gateway_pb2_grpc import DltGatewayServiceStub -from common.tools.client.RetryDecorator import retry, delay_exponential -from common.tools.grpc.Tools import grpc_message_to_json_string -from dlt.connector.Config import DLT_GATEWAY_HOST, DLT_GATEWAY_PORT - -LOGGER = logging.getLogger(__name__) -LOGGER.setLevel(logging.DEBUG) -MAX_RETRIES = 15 -DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) -RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') - -class DltGatewayClientEvent: - def __init__(self, host=None, port=None): - if not host: host = DLT_GATEWAY_HOST - if not port: port = DLT_GATEWAY_PORT - self.endpoint = '{:s}:{:s}'.format(str(host), str(port)) - LOGGER.debug('Creating channel to {:s}...'.format(self.endpoint)) - self.channel = None - self.stub = None - self.connect() - LOGGER.debug('Channel created') - - def connect(self): - self.channel = grpc.insecure_channel(self.endpoint) - self.stub = DltGatewayServiceStub(self.channel) - - def close(self): - if self.channel is not None: - self.channel.close() - self.channel = None - self.stub = None - - @RETRY_DECORATOR - def SubscribeToDlt(self, request: DltRecordSubscription) -> Iterator[DltRecordEvent]: - LOGGER.debug('SubscribeToDlt request: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.SubscribeToDlt(request) - LOGGER.debug('SubscribeToDlt result: {:s}'.format(grpc_message_to_json_string(response))) - return response diff --git a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py index 46c58e063..17cc6fd33 100644 --- a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py +++ b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py @@ -12,10 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import grpc -import asyncio +import grpc, asyncio, logging from grpc.aio import ServicerContext -import logging from typing import Optional from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method_async from common.proto.context_pb2 import Empty, TopologyId @@ -24,7 +22,7 @@ from common.proto.dlt_connector_pb2_grpc import DltConnectorServiceServicer from common.proto.dlt_gateway_pb2 import DltRecord, DltRecordId, DltRecordOperationEnum, DltRecordTypeEnum from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient -from dlt.connector.client.DltGatewayClient import DltGatewayClient +from src.dlt.connector.client.DltGatewayClientAsync import DltGatewayClientAsync from .tools.Checkers import record_exists LOGGER = logging.getLogger(__name__) @@ -35,7 +33,7 @@ METRICS_POOL = MetricsPool('DltConnector', 'RPC') class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): def __init__(self): LOGGER.debug('Creating Servicer...') - self.dltgateway_client = DltGatewayClient() + self.dltgateway_client = DltGatewayClientAsync() LOGGER.debug('Servicer Created') async def initialize(self): @@ -50,16 +48,6 @@ class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): return Empty() @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) - # async def RecordDevice(self, request: DltDeviceId, context: ServicerContext) -> Empty: - # LOGGER.debug('Received RecordDevice request: {:s}'.format(grpc_message_to_json_string(request))) - # try: - # if not request.delete: - # LOGGER.debug('Processing RecordDevice request: {:s}'.format(grpc_message_to_json_string(request))) - # # Perform any dummy operation or simply log the request - # LOGGER.debug('Processed RecordDevice request: {:s}'.format(grpc_message_to_json_string(request))) - # except Exception as e: - # LOGGER.error(f"Error processing RecordDevice: {e}") - # return Empty() async def RecordDevice(self, request: DltDeviceId, context: ServicerContext) -> Empty: data_json = None LOGGER.debug('RECORD_DEVICE = {:s}'.format(grpc_message_to_json_string(request))) diff --git a/src/dlt/connector/service/__main__.py b/src/dlt/connector/service/__main__.py index 09f525ed4..f8296660e 100644 --- a/src/dlt/connector/service/__main__.py +++ b/src/dlt/connector/service/__main__.py @@ -13,11 +13,7 @@ # limitations under the License. -import logging -import signal -import sys -import threading -import asyncio +import logging, signal, sys, threading, asyncio from prometheus_client import start_http_server from common.Constants import ServiceNameEnum from common.Settings import ( diff --git a/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py b/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py index 29e8c096d..4ae6fec54 100644 --- a/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py +++ b/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py @@ -26,9 +26,9 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient -from dlt.connector.client.DltConnectorClientSync import DltConnectorClientSync +from src.dlt.connector.client.DltConnectorClient import DltConnectorClient from dlt.connector.client.DltEventsCollector import DltEventsCollector -from dlt.connector.client.DltGatewayClientEvent import DltGatewayClientEvent +from src.dlt.connector.client.DltGatewayClient import DltGatewayClient from interdomain.client.InterdomainClient import InterdomainClient LOGGER = logging.getLogger(__name__) @@ -40,8 +40,8 @@ ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) class Clients: def __init__(self) -> None: self.context_client = ContextClient() - self.dlt_connector_client = DltConnectorClientSync() - self.dlt_gateway_client = DltGatewayClientEvent() + self.dlt_connector_client = DltConnectorClient() + self.dlt_gateway_client = DltGatewayClient() self.interdomain_client = InterdomainClient() def close(self) -> None: diff --git a/src/dlt/gateway/automation/k8sconfig/configmap.yaml b/src/dlt/gateway/automation/k8sconfig/configmap.yaml deleted file mode 100644 index f8e19b798..000000000 --- a/src/dlt/gateway/automation/k8sconfig/configmap.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: dlt-config - namespace: dlt -#NEED to find a better way to setup ENV variables for Kubernetes services -##Modify the PEER_ENDPOINT IP according to your deployment -data: - CHANNEL_NAME: "channel1" - CHAINCODE_NAME: "adrenalineDLT" - MSP_ID: "Org1MSP" - PEER_ENDPOINT: "PEER_IP:PORT" #USE THE IP address and Ports of your Fabric deployment peers. - PEER_HOST_ALIAS: "peer0.org1.adrenaline.com" - CRYPTO_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com" - KEY_DIRECTORY_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/keystore" - CERT_DIRECTORY_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/signcerts" - TLS_CERT_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com/peers/peer0.org1.adrenaline.com/tls/ca.crt" diff --git a/src/dlt/gateway/automation/k8sconfig/deploy_dlt_gateway.sh b/src/dlt/gateway/automation/k8sconfig/deploy_dlt_gateway.sh deleted file mode 100644 index 736d65ee8..000000000 --- a/src/dlt/gateway/automation/k8sconfig/deploy_dlt_gateway.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - -# Namespace -NAMESPACE="dlt" - -# Configurations -CONFIGMAP="configmap.yaml" -PV="persistent-volume.yaml" -PVC="persistent-volume-claim.yaml" -DEPLOYMENT="deployment.yaml" -SERVICE="service.yaml" - -# Apply Configurations -echo "Applying ConfigMap..." -kubectl apply -f $CONFIGMAP - -echo "Applying PersistentVolume..." -kubectl apply -f $PV - -echo "Applying PersistentVolumeClaim..." -kubectl apply -f $PVC - -echo "Applying Deployment..." -kubectl apply -f $DEPLOYMENT - -echo "Applying Service..." -kubectl apply -f $SERVICE - -# Verify Deployment -echo "Verifying Deployment..." -kubectl get pods -n $NAMESPACE -kubectl get services -n $NAMESPACE - -echo "Deployment Completed." diff --git a/src/dlt/gateway/automation/k8sconfig/deployment.yaml b/src/dlt/gateway/automation/k8sconfig/deployment.yaml deleted file mode 100644 index 88ca9a5af..000000000 --- a/src/dlt/gateway/automation/k8sconfig/deployment.yaml +++ /dev/null @@ -1,74 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: dlt-gateway - namespace: dlt -spec: - replicas: 3 - selector: - matchLabels: - app: dlt-gateway - template: - metadata: - labels: - app: dlt-gateway - spec: - containers: - - name: dlt-gateway - image: shaifvier/dltgateway:v1.0.0 - ports: - - containerPort: 50051 - volumeMounts: - - mountPath: /test-network - name: dlt-volume - readOnly: true # Mount the volume as read-only - env: - - name: CHANNEL_NAME - valueFrom: - configMapKeyRef: - name: dlt-config - key: CHANNEL_NAME - - name: CHAINCODE_NAME - valueFrom: - configMapKeyRef: - name: dlt-config - key: CHAINCODE_NAME - - name: MSP_ID - valueFrom: - configMapKeyRef: - name: dlt-config - key: MSP_ID - - name: PEER_ENDPOINT - valueFrom: - configMapKeyRef: - name: dlt-config - key: PEER_ENDPOINT - - name: PEER_HOST_ALIAS - valueFrom: - configMapKeyRef: - name: dlt-config - key: PEER_HOST_ALIAS - - name: CRYPTO_PATH - valueFrom: - configMapKeyRef: - name: dlt-config - key: CRYPTO_PATH - - name: KEY_DIRECTORY_PATH - valueFrom: - configMapKeyRef: - name: dlt-config - key: KEY_DIRECTORY_PATH - - name: CERT_DIRECTORY_PATH - valueFrom: - configMapKeyRef: - name: dlt-config - key: CERT_DIRECTORY_PATH - - name: TLS_CERT_PATH - valueFrom: - configMapKeyRef: - name: dlt-config - key: TLS_CERT_PATH - volumes: - - name: dlt-volume - persistentVolumeClaim: - claimName: dlt-pvc diff --git a/src/dlt/gateway/automation/k8sconfig/persistent-volume-claim.yaml b/src/dlt/gateway/automation/k8sconfig/persistent-volume-claim.yaml deleted file mode 100644 index a1e4f477c..000000000 --- a/src/dlt/gateway/automation/k8sconfig/persistent-volume-claim.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: dlt-pvc - namespace: dlt -spec: - accessModes: - - ReadOnlyMany - resources: - requests: - storage: 1Gi diff --git a/src/dlt/gateway/automation/k8sconfig/persistent-volume.yaml b/src/dlt/gateway/automation/k8sconfig/persistent-volume.yaml deleted file mode 100644 index 435b02a25..000000000 --- a/src/dlt/gateway/automation/k8sconfig/persistent-volume.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: PersistentVolume -metadata: - name: dlt-pv -spec: - capacity: - storage: 1Gi - accessModes: - - ReadOnlyMany - persistentVolumeReclaimPolicy: Retain - hostPath: - path: "/home/cttc/test-network" # Update this path to the actual path on the host machine where the Kubernetes Pod will be deployed. - claimRef: - namespace: dlt - name: dlt-pvc \ No newline at end of file diff --git a/src/dlt/gateway/automation/k8sconfig/remove_dlt_gateway.sh b/src/dlt/gateway/automation/k8sconfig/remove_dlt_gateway.sh deleted file mode 100644 index 5633789f3..000000000 --- a/src/dlt/gateway/automation/k8sconfig/remove_dlt_gateway.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -# Namespace -NAMESPACE="dlt" - -# Configurations -CONFIGMAP="configmap.yaml" -PV="persistent-volume.yaml" -PVC="persistent-volume-claim.yaml" -DEPLOYMENT="deployment.yaml" -SERVICE="service.yaml" - -# Delete Configurations -echo "Deleting Deployment..." -kubectl delete -f $DEPLOYMENT || echo "Deployment not found." - -echo "Deleting Service..." -kubectl delete -f $SERVICE || echo "Service not found." - -echo "Deleting PersistentVolumeClaim..." -kubectl delete -f $PVC || echo "PersistentVolumeClaim not found." - -echo "Deleting PersistentVolume..." -kubectl delete -f $PV || echo "PersistentVolume not found." - -echo "Deleting ConfigMap..." -kubectl delete -f $CONFIGMAP || echo "ConfigMap not found." - -# Verify Deletion -echo "Verifying Deletion..." -kubectl get pods -n $NAMESPACE -kubectl get services -n $NAMESPACE -kubectl get pvc -n $NAMESPACE -kubectl get pv -kubectl get configmap -n $NAMESPACE - -echo "Deletion Completed." diff --git a/src/dlt/gateway/automation/k8sconfig/service.yaml b/src/dlt/gateway/automation/k8sconfig/service.yaml deleted file mode 100644 index 2590e99c9..000000000 --- a/src/dlt/gateway/automation/k8sconfig/service.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: dlt-gateway - namespace: dlt -spec: - selector: - app: dlt-gateway - ports: - - protocol: TCP - port: 50051 # External port - targetPort: 50051 # Internal port of the service - nodePort: 32001 # A high port number for external access - type: NodePort diff --git a/src/dlt/gateway/automation/k8sconfig/simpletest.yaml b/src/dlt/gateway/automation/k8sconfig/simpletest.yaml deleted file mode 100644 index 0926285b8..000000000 --- a/src/dlt/gateway/automation/k8sconfig/simpletest.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - name: dlt-gateway - namespace: dlt -spec: - containers: - - name: test-container - image: busybox - command: ["sh", "-c", "sleep 3600"] # Keep the container running for testing - volumeMounts: - - mountPath: /mnt/test-network - name: dlt-volume - readOnly: true - volumes: - - name: dlt-volume - hostPath: - path: /home/cttc/test-network - type: Directory diff --git a/src/dlt/gateway/chaincode/adrenalineTopo.go b/src/dlt/gateway/chaincode/chaincode.go similarity index 88% rename from src/dlt/gateway/chaincode/adrenalineTopo.go rename to src/dlt/gateway/chaincode/chaincode.go index 4052d7c2c..878cbe942 100644 --- a/src/dlt/gateway/chaincode/adrenalineTopo.go +++ b/src/dlt/gateway/chaincode/chaincode.go @@ -1,3 +1,17 @@ +// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + package main import ( diff --git a/src/dlt/gateway/chaincode/go.mod b/src/dlt/gateway/chaincode/go.mod index d6c9e7a40..27f86fbab 100644 --- a/src/dlt/gateway/chaincode/go.mod +++ b/src/dlt/gateway/chaincode/go.mod @@ -1,4 +1,18 @@ -module adrenalineTopo + + +module chaincode go 1.17 diff --git a/src/dlt/gateway/dltApp/proto/context.proto b/src/dlt/gateway/dltApp/proto/context.proto index 88ec0605d..dccb72dfa 100644 --- a/src/dlt/gateway/dltApp/proto/context.proto +++ b/src/dlt/gateway/dltApp/proto/context.proto @@ -1,3 +1,17 @@ +// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + syntax = "proto3"; package context; diff --git a/src/dlt/gateway/dltApp/src/dltGateway.js b/src/dlt/gateway/dltApp/src/dltGateway.js index ba9a67a31..374be6464 100644 --- a/src/dlt/gateway/dltApp/src/dltGateway.js +++ b/src/dlt/gateway/dltApp/src/dltGateway.js @@ -1,3 +1,18 @@ +// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + + const grpc = require('@grpc/grpc-js'); const protoLoader = require('@grpc/proto-loader'); const path = require('path'); diff --git a/src/dlt/gateway/dltApp/src/fabricConnect.ts b/src/dlt/gateway/dltApp/src/fabricConnect.ts index cab955958..4bef9b335 100644 --- a/src/dlt/gateway/dltApp/src/fabricConnect.ts +++ b/src/dlt/gateway/dltApp/src/fabricConnect.ts @@ -1,7 +1,16 @@ -/* - * - * SPDX-License-Identifier: Apache-2.0 - */ +// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 * as grpc from '@grpc/grpc-js'; import { connect, Contract, Identity, Signer, signers, Network, CloseableAsyncIterable, ChaincodeEvent, GatewayError } from '@hyperledger/fabric-gateway'; diff --git a/src/dlt/gateway/dltApp/tests/dltApp_Test/.gitignore b/src/dlt/gateway/dltApp/tests/dltApp_Test/.gitignore deleted file mode 100644 index 40b878db5..000000000 --- a/src/dlt/gateway/dltApp/tests/dltApp_Test/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ \ No newline at end of file diff --git a/src/dlt/gateway/dltApp/tests/dltApp_Test/package-lock.json b/src/dlt/gateway/dltApp/tests/dltApp_Test/package-lock.json deleted file mode 100644 index c7e3f7976..000000000 --- a/src/dlt/gateway/dltApp/tests/dltApp_Test/package-lock.json +++ /dev/null @@ -1,2060 +0,0 @@ -{ - "name": "adrenalineDLT_APP", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "adrenalineDLT_APP", - "version": "1.0.0", - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "^1.9.7", - "@hyperledger/fabric-gateway": "~1.4.0", - "dotenv": "^16.4.5" - }, - "devDependencies": { - "@tsconfig/node18": "^18.2.2", - "@types/node": "^18.18.6", - "@typescript-eslint/eslint-plugin": "^6.9.0", - "@typescript-eslint/parser": "^6.9.0", - "eslint": "^8.52.0", - "typescript": "~5.2.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.7.tgz", - "integrity": "sha512-ZMBVjSeDAz3tFSehyO6Pd08xZT1HfIwq3opbeM4cDlBh52gmwp0wVIPcQur53NN0ac68HMZ/7SF2rGRD5KmVmg==", - "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", - "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, - "node_modules/@hyperledger/fabric-gateway": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@hyperledger/fabric-gateway/-/fabric-gateway-1.4.0.tgz", - "integrity": "sha512-dJ0eJdGBo8wtZ/oR5mADHnllp+pSuVOI7uq5fRFf0NTVk1SzlX42Q3kt4j53bJQaxd21TMvofgXNO+BCgJcB/A==", - "dependencies": { - "@grpc/grpc-js": "^1.9.0", - "@hyperledger/fabric-protos": "^0.2.0", - "asn1.js": "^5.4.1", - "bn.js": "^5.2.1", - "elliptic": "^6.5.4", - "google-protobuf": "^3.21.0" - }, - "engines": { - "node": ">=18.12.0" - }, - "optionalDependencies": { - "pkcs11js": "^1.3.0" - } - }, - "node_modules/@hyperledger/fabric-protos": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@hyperledger/fabric-protos/-/fabric-protos-0.2.1.tgz", - "integrity": "sha512-qjm0vIQIfCall804tWDeA8p/mUfu14sl5Sj+PbOn2yDKJq+7ThoIhNsLAqf+BCxUfqsoqQq6AojhqQeTFyOOqg==", - "dependencies": { - "@grpc/grpc-js": "^1.9.0", - "google-protobuf": "^3.21.0" - }, - "engines": { - "node": ">=14.15.0" - } - }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@tsconfig/node18": { - "version": "18.2.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.4.tgz", - "integrity": "sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.19.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.32.tgz", - "integrity": "sha512-2bkg93YBSDKk8DLmmHnmj/Rwr18TLx7/n+I23BigFwgexUJoMHZOd8X1OFxuF/W3NN0S2W2E5sVabI5CPinNvA==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/elliptic": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", - "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/google-protobuf": { - "version": "3.21.2", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", - "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, - "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nan": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", - "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==", - "optional": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkcs11js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkcs11js/-/pkcs11js-1.3.1.tgz", - "integrity": "sha512-eo7fTeQwYGzX1pFmRaf4ji/WcDW2XKpwqylOwzutsjNWECv6G9PzDHj3Yj5dX9EW/fydMnJG8xvWj/btnQT9TA==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.15.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/PeculiarVentures" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/protobufjs": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", - "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/src/dlt/gateway/dltApp/tests/dltApp_Test/package.json b/src/dlt/gateway/dltApp/tests/dltApp_Test/package.json deleted file mode 100644 index 228dbaad9..000000000 --- a/src/dlt/gateway/dltApp/tests/dltApp_Test/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "adrenalineDLT_APP", - "version": "1.0.0", - "description": "A DLT application that record and manages topology data as JSON implemented in typeScript using fabric-gateway", - "main": "dist/index.js", - "typings": "dist/index.d.ts", - "engines": { - "node": ">=18" - }, - "scripts": { - "build": "tsc", - "build:watch": "tsc -w", - "lint": "eslint . --ext .ts", - "prepare": "npm run build", - "pretest": "npm run lint", - "start": "node dist/adrenalineDLT_app.js" - }, - "engineStrict": true, - "author": "CTTC-Javier", - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "^1.9.7", - "@hyperledger/fabric-gateway": "~1.4.0", - "dotenv": "^16.4.5" - }, - "devDependencies": { - "@tsconfig/node18": "^18.2.2", - "@types/node": "^18.18.6", - "@typescript-eslint/eslint-plugin": "^6.9.0", - "@typescript-eslint/parser": "^6.9.0", - "eslint": "^8.52.0", - "typescript": "~5.2.2" - } -} diff --git a/src/dlt/gateway/dltApp/tests/dltApp_Test/src/adrenalineDLT_app.ts b/src/dlt/gateway/dltApp/tests/dltApp_Test/src/adrenalineDLT_app.ts deleted file mode 100644 index d1cd3a5e3..000000000 --- a/src/dlt/gateway/dltApp/tests/dltApp_Test/src/adrenalineDLT_app.ts +++ /dev/null @@ -1,341 +0,0 @@ -/* - * - * SPDX-License-Identifier: Apache-2.0 - */ - -import * as grpc from '@grpc/grpc-js'; -import { connect, Contract, Identity, Signer, signers, Network, CloseableAsyncIterable, ChaincodeEvent, GatewayError } from '@hyperledger/fabric-gateway'; -import * as crypto from 'crypto'; -import { promises as fs } from 'fs'; -import * as path from 'path'; -import { TextDecoder } from 'util'; -import * as dotenv from 'dotenv'; - -dotenv.config(); -const channelName = envOrDefault('CHANNEL_NAME', 'channel1'); -const chaincodeName = envOrDefault('CHAINCODE_NAME', 'adrenalineDLT'); -const mspId = envOrDefault('MSP_ID', 'Org1MSP'); - -// Path to crypto materials. -const cryptoPath = envOrDefault('CRYPTO_PATH', path.resolve(__dirname, '..', '..', '..', 'test-network', 'organizations', 'peerOrganizations', 'org1.adrenaline.com')); - -// Path to user private key directory. -const keyDirectoryPath = envOrDefault('KEY_DIRECTORY_PATH', path.resolve(cryptoPath, 'users', 'User1@org1.adrenaline.com', 'msp', 'keystore')); - -// Path to user certificate directory. -const certDirectoryPath = envOrDefault('CERT_DIRECTORY_PATH', path.resolve(cryptoPath, 'users', 'User1@org1.adrenaline.com', 'msp', 'signcerts')); - -// Path to peer tls certificate. -const tlsCertPath = envOrDefault('TLS_CERT_PATH', path.resolve(cryptoPath, 'peers', 'peer0.org1.adrenaline.com', 'tls', 'ca.crt')); - -// Gateway peer endpoint. -const peerEndpoint = envOrDefault('PEER_ENDPOINT', 'localhost:7051'); - -// Gateway peer SSL host name override. -const peerHostAlias = envOrDefault('PEER_HOST_ALIAS', 'peer0.org1.adrenaline.com'); - -const utf8Decoder = new TextDecoder(); -const assetId = `asset${Date.now()}`; - -async function main(): Promise { - - await displayInputParameters(); - - // The gRPC client connection should be shared by all Gateway connections to this endpoint. - const client = await newGrpcConnection(); - - const gateway = connect({ - client, - identity: await newIdentity(), - signer: await newSigner(), - // Default timeouts for different gRPC calls - evaluateOptions: () => { - return { deadline: Date.now() + 5000 }; // 5 seconds - }, - endorseOptions: () => { - return { deadline: Date.now() + 15000 }; // 15 seconds - }, - submitOptions: () => { - return { deadline: Date.now() + 5000 }; // 5 seconds - }, - commitStatusOptions: () => { - return { deadline: Date.now() + 60000 }; // 1 minute - }, - }); - - let events: CloseableAsyncIterable | undefined; - - try { - // Get a network instance representing the channel where the smart contract is deployed. - const network = gateway.getNetwork(channelName); - - // Get the smart contract from the network. - const contract = network.getContract(chaincodeName); - - //Listen for events emitted by transactions - events = await startEventListening(network); - - // Initialize the ledger. - await initLedger(contract); - -// Create a new asset on the ledger and gets the blocknumber. - const firstBlockNumber = await StoreTopoData(contract); - - // Get the asset details by key. - await RetrieveTopoData(contract); - - //Updates existing record of a topology - await updateRecord(contract); - - // Verifies the changes. - await RetrieveTopoData(contract); - - //Deletes existing topology - await deleteRecordByID(contract); - - // Return all the current assets on the ledger. - await GetAllInfo(contract); - - // Update an asset which does not exist. - await updateNonExistentRecord(contract) - - // Replay events from the block containing the first transactions - await replayChaincodeEvents(network, firstBlockNumber); - - } finally { - events?.close(); - gateway.close(); - client.close(); - } -} - -main().catch(error => { - console.error('******** FAILED to run the application:', error); - process.exitCode = 1; -}); - -async function newGrpcConnection(): Promise { - const tlsRootCert = await fs.readFile(tlsCertPath); - const tlsCredentials = grpc.credentials.createSsl(tlsRootCert); - return new grpc.Client(peerEndpoint, tlsCredentials, { - 'grpc.ssl_target_name_override': peerHostAlias, - }); -} - -async function newIdentity(): Promise { - const certPath = await getFirstDirFileName(certDirectoryPath); - const credentials = await fs.readFile(certPath); - return { mspId, credentials }; -} - -async function getFirstDirFileName(dirPath: string): Promise { - const files = await fs.readdir(dirPath); - return path.join(dirPath, files[0]); -} - -async function newSigner(): Promise { - const keyPath = await getFirstDirFileName(keyDirectoryPath); - const privateKeyPem = await fs.readFile(keyPath); - const privateKey = crypto.createPrivateKey(privateKeyPem); - return signers.newPrivateKeySigner(privateKey); -} - -/** - * This type of transaction would typically only be run once by an application the first time it was started after its - * initial deployment. A new version of the chaincode deployed later would likely not need to run an "init" function. - */ -async function initLedger(contract: Contract): Promise { - try { - console.log('\n--> Submit Transaction: InitLedger, function activates the chaincode'); - - await contract.submitTransaction('InitLedger'); - - console.log('*** Transaction committed successfully'); - } catch (error) { - console.error('Failed to submit InitLedger transaction:', error); - throw error; - } -} - - - -/** - * Evaluate a transaction to query ledger state. - */ -async function GetAllInfo(contract: Contract): Promise { - console.log('\n--> Evaluate Transaction: GetAllInfo, function returns all the current topologies on the ledger'); - - const resultBytes = await contract.evaluateTransaction('GetAllInfo'); - - const resultJson = utf8Decoder.decode(resultBytes); - const result = JSON.parse(resultJson); - console.log('*** Result:', result); -} - -/** - * Submit a transaction Asynchronously. - */ -async function StoreTopoData(contract: Contract): Promise { - console.log('\n--> Submit Transaction: StoreTopoData, records a new topology structure by Key values'); - - const storeTopoDataPath = path.resolve(__dirname, '..', '..', '..', 'samples', 'sampleTopo.json'); - const jsonData = await fs.readFile(storeTopoDataPath, 'utf8'); - const result = await contract.submitAsync('StoreTopoData', { - arguments: [assetId, jsonData] - }); - - const status = await result.getStatus(); - if (!status.successful) { - throw new Error(`failed to commit transaction ${status.transactionId} with status code ${status.code}`); - } - - console.log('*** Transaction committed successfully'); - return status.blockNumber; -} - -/** - * updateRecord(), updates topology record by key synchronously. - */ -async function updateRecord(contract: Contract): Promise { - console.log(`\n--> Submit transaction: UpdateTopoData, ${assetId}`); - - - try { - const updateTopoDataPath = path.resolve(__dirname, '..', '..', '..', 'samples', 'updatedTopo.json'); - const jsonData = await fs.readFile(updateTopoDataPath, 'utf8'); - await contract.submitTransaction('UpdateTopoData', assetId, jsonData); - console.log('UpdateTopoData committed successfully'); - } catch (error) { - console.log('*** Successfully caught the error: \n', error); - } -} - -/** - * RetrieveTopoData(), gets the topology information by key. - */ -async function RetrieveTopoData(contract: Contract): Promise { - console.log('\n--> Evaluate Transaction: RetrieveTopoData, function returns topology attributes'); - - const resultBytes = await contract.evaluateTransaction('RetrieveTopoData', assetId); - - const resultJson = utf8Decoder.decode(resultBytes); - const result = JSON.parse(resultJson); - console.log('*** Result:', result); -} - -/** - * submitTransaction() will throw an error containing details of any error responses from the smart contract. - */ -async function updateNonExistentRecord(contract: Contract): Promise{ - console.log('\n--> Submit Transaction: UpdateAsset asset70, asset70 does not exist and should return an error'); - - try { - const updateTopoDataPath = path.resolve(__dirname, '..', '..', '..', 'samples', 'updatedTopo.json'); - const jsonData = await fs.readFile(updateTopoDataPath, 'utf8'); - await contract.submitTransaction('UpdateTopoData', 'nonExist', jsonData) - console.log('******** FAILED to return an error'); - } catch (error) { - console.log('*** Successfully caught the error: \n', error); - } -} - -/** - * deleteRecordByID() removes a record from the ledger. - */ - -async function deleteRecordByID(contract: Contract): Promise{ - console.log(`\n--> Submit transaction: deleteRecordByID, ${assetId}`); - try { - - await contract.submitTransaction('DeleteTopo', assetId); - console.log('\n*** deleteRecordByID committed successfully'); - } catch (error) { - console.log('*** Successfully caught the error: \n', error); - } -} - - -/** - * envOrDefault() will return the value of an environment variable, or a default value if the variable is undefined. - */ -function envOrDefault(key: string, defaultValue: string): string { - return process.env[key] || defaultValue; -} - -/** - * displayInputParameters() will print the global scope parameters used by the main driver routine. - */ -async function displayInputParameters(): Promise { - console.log(`channelName: ${channelName}`); - console.log(`chaincodeName: ${chaincodeName}`); - console.log(`mspId: ${mspId}`); - console.log(`cryptoPath: ${cryptoPath}`); - console.log(`keyDirectoryPath: ${keyDirectoryPath}`); - console.log(`certDirectoryPath: ${certDirectoryPath}`); - console.log(`tlsCertPath: ${tlsCertPath}`); - console.log(`peerEndpoint: ${peerEndpoint}`); - console.log(`peerHostAlias: ${peerHostAlias}`); -} - -/** - * startEventListening() will initiate the event listener for chaincode events. - */ -async function startEventListening(network: Network): Promise> { - console.log('\n*** Start chaincode event listening'); - - const events = await network.getChaincodeEvents(chaincodeName); - - void readEvents(events); // Don't await - run asynchronously - return events; -} - -/** - * readEvents() format and display the events as a JSON. - */ -async function readEvents(events: CloseableAsyncIterable): Promise { - try { - for await (const event of events) { - const payload = parseJson(event.payload); - console.log(`\n<-- Chaincode event received: ${event.eventName} -`, payload); - } - } catch (error: unknown) { - // Ignore the read error when events.close() is called explicitly - if (!(error instanceof GatewayError) || error.code !== grpc.status.CANCELLED.valueOf()) { - throw error; - } - } -} - -/** - * parseJson() formats a JSON. - */ -function parseJson(jsonBytes: Uint8Array): unknown { - const json = utf8Decoder.decode(jsonBytes); - return JSON.parse(json); -} - - -/** - * replayChaincodeEvents() - */ -async function replayChaincodeEvents(network: Network, startBlock: bigint): Promise { - console.log('\n*** Start chaincode event replay'); - - const events = await network.getChaincodeEvents(chaincodeName, { - startBlock, - }); - - try { - for await (const event of events) { - const payload = parseJson(event.payload); - console.log(`\n<-- Chaincode event replayed: ${event.eventName} -`, payload); - - if (event.eventName === 'DeleteTopo') { - // Reached the last submitted transaction so break to stop listening for events - break; - } - } - } finally { - events.close(); - } -} \ No newline at end of file diff --git a/src/dlt/gateway/dltApp/tests/dltApp_Test/tsconfig.json b/src/dlt/gateway/dltApp/tests/dltApp_Test/tsconfig.json deleted file mode 100644 index ed2150983..000000000 --- a/src/dlt/gateway/dltApp/tests/dltApp_Test/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends":"@tsconfig/node18/tsconfig.json", - "compilerOptions": { - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "outDir": "dist", - "declaration": true, - "sourceMap": true, - "noImplicitAny": true - }, - "include": [ - "./src/**/*" - ], - "exclude": [ - "./src/**/*.spec.ts" - ] - } - \ No newline at end of file diff --git a/src/dlt/gateway/dltApp/tests/perfTest.js b/src/dlt/gateway/dltApp/tests/perfTest.js index d2892d451..6549d4e7b 100644 --- a/src/dlt/gateway/dltApp/tests/perfTest.js +++ b/src/dlt/gateway/dltApp/tests/perfTest.js @@ -1,3 +1,17 @@ +// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + const { connectToNetwork } = require('../dist/fabricConnect'); const fsp = require('fs').promises; const fs = require('fs'); diff --git a/src/dlt/gateway/dltApp/tests/rateTest.js b/src/dlt/gateway/dltApp/tests/rateTest.js index 95370f487..ca3f540d3 100644 --- a/src/dlt/gateway/dltApp/tests/rateTest.js +++ b/src/dlt/gateway/dltApp/tests/rateTest.js @@ -1,3 +1,17 @@ +// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + const { connectToNetwork } = require('../dist/fabricConnect'); const fs = require('fs'); const util = require('util'); diff --git a/src/dlt/gateway/dltApp/tests/simpleTest.js b/src/dlt/gateway/dltApp/tests/simpleTest.js index 98c6ae135..d84b5dba1 100644 --- a/src/dlt/gateway/dltApp/tests/simpleTest.js +++ b/src/dlt/gateway/dltApp/tests/simpleTest.js @@ -1,3 +1,17 @@ +// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + const { connectToNetwork } = require('../dist/fabricConnect'); const fs = require('fs'); const util = require('util'); diff --git a/src/dlt/gateway/dltApp/src/testEvents.js b/src/dlt/gateway/dltApp/tests/testEvents.js similarity index 66% rename from src/dlt/gateway/dltApp/src/testEvents.js rename to src/dlt/gateway/dltApp/tests/testEvents.js index 68573e271..2590d40d4 100644 --- a/src/dlt/gateway/dltApp/src/testEvents.js +++ b/src/dlt/gateway/dltApp/tests/testEvents.js @@ -1,3 +1,18 @@ +// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + + const grpc = require('@grpc/grpc-js'); const protoLoader = require('@grpc/proto-loader'); const path = require('path'); diff --git a/src/dlt/gateway/dltApp/src/testGateway.js b/src/dlt/gateway/dltApp/tests/testGateway.js similarity index 84% rename from src/dlt/gateway/dltApp/src/testGateway.js rename to src/dlt/gateway/dltApp/tests/testGateway.js index 3486cb4f3..778c0f909 100644 --- a/src/dlt/gateway/dltApp/src/testGateway.js +++ b/src/dlt/gateway/dltApp/tests/testGateway.js @@ -1,3 +1,18 @@ +// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + + const grpc = require('@grpc/grpc-js'); const protoLoader = require('@grpc/proto-loader'); const path = require('path'); diff --git a/src/dlt/gateway/dltApp/tsconfig.json b/src/dlt/gateway/dltApp/tsconfig.json index 56f092a36..c81e4d5f9 100644 --- a/src/dlt/gateway/dltApp/tsconfig.json +++ b/src/dlt/gateway/dltApp/tsconfig.json @@ -10,7 +10,7 @@ }, "include": [ "./src/**/*" -, "src.old/grpcClient.js", "src.old/grpcServer.js" ], +, "src.old/grpcClient.js", "src.old/grpcServer.js", "tests/testEvents.js", "tests/testGateway.js" ], "exclude": [ "./src/**/*.spec.ts" ] diff --git a/src/dlt/performance/__main__.py b/src/dlt/performance/__main__.py index 1d6c41965..09248c1b1 100644 --- a/src/dlt/performance/__main__.py +++ b/src/dlt/performance/__main__.py @@ -14,7 +14,7 @@ import functools, logging, pathlib, sys, time from common.proto.dlt_gateway_pb2 import DltRecordEvent -from dlt.connector.client.DltGatewayClient import DltGatewayClient +from src.dlt.connector.client.DltGatewayClient import DltGatewayClient from dlt.connector.client.DltEventsCollector import DltEventsCollector from .play_ground.Enums import CONTEXT_EVENT_TYPE_TO_ACTION, RECORD_TYPE_TO_ENUM from .play_ground import PlayGround diff --git a/src/dlt/performance/play_ground/Dlt.py b/src/dlt/performance/play_ground/Dlt.py index b2c889545..5de186c8c 100644 --- a/src/dlt/performance/play_ground/Dlt.py +++ b/src/dlt/performance/play_ground/Dlt.py @@ -18,7 +18,7 @@ from common.proto.context_pb2 import Device, Link, Service, Slice from common.proto.dlt_gateway_pb2 import ( DltRecord, DltRecordId, DltRecordOperationEnum, DltRecordStatus, DltRecordTypeEnum) from common.tools.grpc.Tools import grpc_message_to_json_string -from dlt.connector.client.DltGatewayClient import DltGatewayClient +from src.dlt.connector.client.DltGatewayClient import DltGatewayClient from .PerfPoint import PerfPoint DLT_OPERATION_CREATE = DltRecordOperationEnum.DLTRECORDOPERATION_ADD diff --git a/src/dlt/performance/play_ground/__init__.py b/src/dlt/performance/play_ground/__init__.py index 68ad14dee..ce34d30a4 100644 --- a/src/dlt/performance/play_ground/__init__.py +++ b/src/dlt/performance/play_ground/__init__.py @@ -15,7 +15,7 @@ import logging, operator, random from typing import Dict, Tuple from common.proto.context_pb2 import Device, Link, Service, Slice -from dlt.connector.client.DltGatewayClient import DltGatewayClient +from src.dlt.connector.client.DltGatewayClient import DltGatewayClient from .Enums import ActionEnum, RecordTypeEnum from .Dlt import ( DLT_OPERATION_CREATE, DLT_OPERATION_DELETE, DLT_OPERATION_UPDATE, diff --git a/src/interdomain/service/InterdomainServiceServicerImpl.py b/src/interdomain/service/InterdomainServiceServicerImpl.py index 54878be2e..146284aaa 100644 --- a/src/interdomain/service/InterdomainServiceServicerImpl.py +++ b/src/interdomain/service/InterdomainServiceServicerImpl.py @@ -34,7 +34,7 @@ from common.tools.object_factory.Device import json_device_id from common.tools.object_factory.EndPoint import json_endpoint_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient -from dlt.connector.client.DltConnectorClient import DltConnectorClient +from src.dlt.connector.client.DltConnectorClientAsync import DltConnectorClientAsync from pathcomp.frontend.client.PathCompClient import PathCompClient from service.client.ServiceClient import ServiceClient from slice.client.SliceClient import SliceClient @@ -88,7 +88,7 @@ class InterdomainServiceServicerImpl(InterdomainServiceServicer): ]) if len(env_vars) == 2: # DLT available - dlt_connector_client = DltConnectorClient() + dlt_connector_client = DltConnectorClientAsync() dlt_connector_client.connect() else: dlt_connector_client = None diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index d6d5ef0f6..104f2e378 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# DltRecordSender.py - import logging import asyncio @@ -23,7 +21,7 @@ from common.proto.context_pb2 import Device, Link, Service, Slice, TopologyId from common.proto.dlt_connector_pb2 import DltDeviceId, DltLinkId, DltServiceId, DltSliceId from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient -from dlt.connector.client.DltConnectorClient import DltConnectorClient +from src.dlt.connector.client.DltConnectorClientAsync import DltConnectorClientAsync LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) @@ -32,7 +30,7 @@ class DltRecordSender: def __init__(self, context_client: ContextClient) -> None: self.context_client = context_client LOGGER.debug('Creating Servicer...') - self.dlt_connector_client = DltConnectorClient() + self.dlt_connector_client = DltConnectorClientAsync() LOGGER.debug('Servicer Created') self.dlt_record_uuids: List[str] = list() self.dlt_record_uuid_to_data: Dict[str, Tuple[TopologyId, object]] = dict() diff --git a/src/interdomain/service/topology_abstractor/TopologyAbstractor.py b/src/interdomain/service/topology_abstractor/TopologyAbstractor.py index 2a6ef5e32..0dbb332db 100644 --- a/src/interdomain/service/topology_abstractor/TopologyAbstractor.py +++ b/src/interdomain/service/topology_abstractor/TopologyAbstractor.py @@ -33,7 +33,7 @@ from common.tools.object_factory.Device import json_device_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient from context.client.EventsCollector import EventsCollector -from dlt.connector.client.DltConnectorClient import DltConnectorClient +from src.dlt.connector.client.DltConnectorClient import DltConnectorClient from .AbstractDevice import AbstractDevice from .AbstractLink import AbstractLink from .DltRecordSender import DltRecordSender diff --git a/src/load_generator/load_gen/DltTools.py b/src/load_generator/load_gen/DltTools.py index 0ac7ab3f0..8321dffa5 100644 --- a/src/load_generator/load_gen/DltTools.py +++ b/src/load_generator/load_gen/DltTools.py @@ -19,7 +19,7 @@ from common.proto.dlt_connector_pb2 import DltDeviceId, DltLinkId, DltServiceId, from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient -from dlt.connector.client.DltConnectorClient import DltConnectorClient +from src.dlt.connector.client.DltConnectorClient import DltConnectorClient def explore_entities_to_record( slice_id : Optional[SliceId] = None, service_id : Optional[ServiceId] = None diff --git a/src/load_generator/load_gen/RequestGenerator.py b/src/load_generator/load_gen/RequestGenerator.py index 2a3e89fe0..e6e934b68 100644 --- a/src/load_generator/load_gen/RequestGenerator.py +++ b/src/load_generator/load_gen/RequestGenerator.py @@ -27,7 +27,7 @@ from common.tools.object_factory.Service import ( from common.tools.object_factory.Slice import json_slice from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient -from dlt.connector.client.DltConnectorClient import DltConnectorClient +from src.dlt.connector.client.DltConnectorClient import DltConnectorClient from load_generator.tools.ListScalarRange import generate_value from .Constants import ENDPOINT_COMPATIBILITY, RequestType from .DltTools import record_device_to_dlt, record_link_to_dlt diff --git a/src/load_generator/tests/test_dlt_functional.py b/src/load_generator/tests/test_dlt_functional.py index f3dea3b4a..588200e0c 100644 --- a/src/load_generator/tests/test_dlt_functional.py +++ b/src/load_generator/tests/test_dlt_functional.py @@ -19,7 +19,7 @@ from common.proto.dlt_connector_pb2 import DltDeviceId, DltLinkId, DltServiceId, from common.tools.object_factory.Device import json_device from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient -from dlt.connector.client.DltConnectorClient import DltConnectorClient +from src.dlt.connector.client.DltConnectorClient import DltConnectorClient def record_device_to_dlt( dlt_connector_client : DltConnectorClient, domain_id : TopologyId, device_id : DeviceId, delete : bool = False -- GitLab From ff0877b92b7cf4e5003f8b9c9f6a67b0c0b49859 Mon Sep 17 00:00:00 2001 From: jjdiaz Date: Mon, 9 Sep 2024 16:27:04 +0200 Subject: [PATCH 563/602] Code cleanup --- src/dlt/gateway/Dockerfile | 3 +- src/dlt/gateway/dltApp/proto/context.proto | 48 - .../gateway/dltApp/proto/dlt_service.proto | 97 - .../dltApp/proto/dlt_service_grpc_pb.js | 181 -- .../gateway/dltApp/proto/dlt_service_pb.js | 1633 ----------------- src/dlt/gateway/dltApp/src/dltGateway.js | 2 +- src/dlt/gateway/dltApp/tests/testEvents.js | 2 +- src/dlt/gateway/dltApp/tests/testGateway.js | 2 +- 8 files changed, 5 insertions(+), 1963 deletions(-) delete mode 100644 src/dlt/gateway/dltApp/proto/context.proto delete mode 100644 src/dlt/gateway/dltApp/proto/dlt_service.proto delete mode 100644 src/dlt/gateway/dltApp/proto/dlt_service_grpc_pb.js delete mode 100644 src/dlt/gateway/dltApp/proto/dlt_service_pb.js diff --git a/src/dlt/gateway/Dockerfile b/src/dlt/gateway/Dockerfile index 694cc521f..66b7e0b30 100644 --- a/src/dlt/gateway/Dockerfile +++ b/src/dlt/gateway/Dockerfile @@ -10,7 +10,8 @@ COPY src/dlt/gateway/dltApp/package*.json ./ # Copy tsconfig.json COPY src/dlt/gateway/dltApp/tsconfig*.json ./ # Copy the proto folder -COPY src/dlt/gateway/dltApp/proto/ ./proto +COPY proto/context.proto ./proto +COPY proto/dlt_gateway.proto ./proto # Copy the src folder COPY src/dlt/gateway/dltApp/src/ ./src diff --git a/src/dlt/gateway/dltApp/proto/context.proto b/src/dlt/gateway/dltApp/proto/context.proto deleted file mode 100644 index dccb72dfa..000000000 --- a/src/dlt/gateway/dltApp/proto/context.proto +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. - -syntax = "proto3"; -package context; - -message Empty {} - -message Uuid { - string uuid = 1; -} - -enum EventTypeEnum { - EVENTTYPE_UNDEFINED = 0; - EVENTTYPE_CREATE = 1; - EVENTTYPE_UPDATE = 2; - EVENTTYPE_REMOVE = 3; -} - -message Timestamp { - double timestamp = 1; -} - -message Event { - Timestamp timestamp = 1; - EventTypeEnum event_type = 2; -} - -message TeraFlowController { - ContextId context_id = 1; - string ip_address = 2; - uint32 port = 3; -} - -message ContextId { - Uuid context_uuid = 1; -} diff --git a/src/dlt/gateway/dltApp/proto/dlt_service.proto b/src/dlt/gateway/dltApp/proto/dlt_service.proto deleted file mode 100644 index 9f6da08f5..000000000 --- a/src/dlt/gateway/dltApp/proto/dlt_service.proto +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. - -syntax = "proto3"; -package dlt; - -import "context.proto"; - -service DltGatewayService { - rpc RecordToDlt (DltRecord ) returns ( DltRecordStatus ) {} - rpc GetFromDlt (DltRecordId ) returns ( DltRecord ) {} - rpc SubscribeToDlt(DltRecordSubscription ) returns (stream DltRecordEvent ) {} - rpc GetDltStatus (context.TeraFlowController) returns ( DltPeerStatus ) {} // NEC is checking if it is possible - rpc GetDltPeers (context.Empty ) returns ( DltPeerStatusList) {} // NEC is checking if it is possible -} - -enum DltRecordTypeEnum { - DLTRECORDTYPE_UNDEFINED = 0; - DLTRECORDTYPE_CONTEXT = 1; - DLTRECORDTYPE_TOPOLOGY = 2; - DLTRECORDTYPE_DEVICE = 3; - DLTRECORDTYPE_LINK = 4; - DLTRECORDTYPE_SERVICE = 5; - DLTRECORDTYPE_SLICE = 6; -} - -enum DltRecordOperationEnum { - DLTRECORDOPERATION_UNDEFINED = 0; - DLTRECORDOPERATION_ADD = 1; - DLTRECORDOPERATION_UPDATE = 2; - DLTRECORDOPERATION_DELETE = 3; -} - -enum DltRecordStatusEnum { - DLTRECORDSTATUS_UNDEFINED = 0; - DLTRECORDSTATUS_SUCCEEDED = 1; - DLTRECORDSTATUS_FAILED = 2; -} - -enum DltStatusEnum { - DLTSTATUS_UNDEFINED = 0; - DLTSTATUS_NOTAVAILABLE = 1; - DLTSTATUS_INITIALIZED = 2; - DLTSTATUS_AVAILABLE = 3; - DLTSTATUS_DEINIT = 4; -} - -message DltRecordId { - context.Uuid domain_uuid = 1; // unique identifier of domain owning the record - DltRecordTypeEnum type = 2; // type of record - context.Uuid record_uuid = 3; // unique identifier of the record within the domain context_uuid/topology_uuid -} - -message DltRecord { - DltRecordId record_id = 1; // record identifier - DltRecordOperationEnum operation = 2; // operation to be performed over the record - string data_json = 3; // record content: JSON-encoded record content -} - -message DltRecordSubscription { - // retrieved events have to match ALL conditions. - // i.e., type in types requested, AND operation in operations requested - // TODO: consider adding a more sophisticated filtering - repeated DltRecordTypeEnum type = 1; // selected event types, empty=all - repeated DltRecordOperationEnum operation = 2; // selected event operations, empty=all -} - -message DltRecordEvent { - context.Event event = 1; // common event data (timestamp & event_type) - DltRecordId record_id = 2; // record identifier associated with this event -} - -message DltRecordStatus { - DltRecordId record_id = 1; // identifier of the associated record - DltRecordStatusEnum status = 2; // status of the record - string error_message = 3; // error message in case of failure, empty otherwise -} - -message DltPeerStatus { - context.TeraFlowController controller = 1; // Identifier of the TeraFlow controller instance - DltStatusEnum status = 2; // Status of the TeraFlow controller instance -} - -message DltPeerStatusList { - repeated DltPeerStatus peers = 1; // List of peers and their status -} diff --git a/src/dlt/gateway/dltApp/proto/dlt_service_grpc_pb.js b/src/dlt/gateway/dltApp/proto/dlt_service_grpc_pb.js deleted file mode 100644 index 85af635c7..000000000 --- a/src/dlt/gateway/dltApp/proto/dlt_service_grpc_pb.js +++ /dev/null @@ -1,181 +0,0 @@ -// GENERATED CODE -- DO NOT EDIT! - -// Original file comments: -// Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. -// -'use strict'; -var grpc = require('grpc'); -var dlt_service_pb = require('./dlt_service_pb.js'); -var context_pb = require('./context_pb.js'); - -function serialize_context_Empty(arg) { - if (!(arg instanceof context_pb.Empty)) { - throw new Error('Expected argument of type context.Empty'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_context_Empty(buffer_arg) { - return context_pb.Empty.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_context_TeraFlowController(arg) { - if (!(arg instanceof context_pb.TeraFlowController)) { - throw new Error('Expected argument of type context.TeraFlowController'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_context_TeraFlowController(buffer_arg) { - return context_pb.TeraFlowController.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_dlt_DltPeerStatus(arg) { - if (!(arg instanceof dlt_service_pb.DltPeerStatus)) { - throw new Error('Expected argument of type dlt.DltPeerStatus'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_dlt_DltPeerStatus(buffer_arg) { - return dlt_service_pb.DltPeerStatus.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_dlt_DltPeerStatusList(arg) { - if (!(arg instanceof dlt_service_pb.DltPeerStatusList)) { - throw new Error('Expected argument of type dlt.DltPeerStatusList'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_dlt_DltPeerStatusList(buffer_arg) { - return dlt_service_pb.DltPeerStatusList.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_dlt_DltRecord(arg) { - if (!(arg instanceof dlt_service_pb.DltRecord)) { - throw new Error('Expected argument of type dlt.DltRecord'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_dlt_DltRecord(buffer_arg) { - return dlt_service_pb.DltRecord.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_dlt_DltRecordEvent(arg) { - if (!(arg instanceof dlt_service_pb.DltRecordEvent)) { - throw new Error('Expected argument of type dlt.DltRecordEvent'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_dlt_DltRecordEvent(buffer_arg) { - return dlt_service_pb.DltRecordEvent.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_dlt_DltRecordId(arg) { - if (!(arg instanceof dlt_service_pb.DltRecordId)) { - throw new Error('Expected argument of type dlt.DltRecordId'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_dlt_DltRecordId(buffer_arg) { - return dlt_service_pb.DltRecordId.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_dlt_DltRecordStatus(arg) { - if (!(arg instanceof dlt_service_pb.DltRecordStatus)) { - throw new Error('Expected argument of type dlt.DltRecordStatus'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_dlt_DltRecordStatus(buffer_arg) { - return dlt_service_pb.DltRecordStatus.deserializeBinary(new Uint8Array(buffer_arg)); -} - -function serialize_dlt_DltRecordSubscription(arg) { - if (!(arg instanceof dlt_service_pb.DltRecordSubscription)) { - throw new Error('Expected argument of type dlt.DltRecordSubscription'); - } - return Buffer.from(arg.serializeBinary()); -} - -function deserialize_dlt_DltRecordSubscription(buffer_arg) { - return dlt_service_pb.DltRecordSubscription.deserializeBinary(new Uint8Array(buffer_arg)); -} - - -var DltGatewayServiceService = exports.DltGatewayServiceService = { - recordToDlt: { - path: '/dlt.DltGatewayService/RecordToDlt', - requestStream: false, - responseStream: false, - requestType: dlt_service_pb.DltRecord, - responseType: dlt_service_pb.DltRecordStatus, - requestSerialize: serialize_dlt_DltRecord, - requestDeserialize: deserialize_dlt_DltRecord, - responseSerialize: serialize_dlt_DltRecordStatus, - responseDeserialize: deserialize_dlt_DltRecordStatus, - }, - getFromDlt: { - path: '/dlt.DltGatewayService/GetFromDlt', - requestStream: false, - responseStream: false, - requestType: dlt_service_pb.DltRecordId, - responseType: dlt_service_pb.DltRecord, - requestSerialize: serialize_dlt_DltRecordId, - requestDeserialize: deserialize_dlt_DltRecordId, - responseSerialize: serialize_dlt_DltRecord, - responseDeserialize: deserialize_dlt_DltRecord, - }, - subscribeToDlt: { - path: '/dlt.DltGatewayService/SubscribeToDlt', - requestStream: false, - responseStream: true, - requestType: dlt_service_pb.DltRecordSubscription, - responseType: dlt_service_pb.DltRecordEvent, - requestSerialize: serialize_dlt_DltRecordSubscription, - requestDeserialize: deserialize_dlt_DltRecordSubscription, - responseSerialize: serialize_dlt_DltRecordEvent, - responseDeserialize: deserialize_dlt_DltRecordEvent, - }, - getDltStatus: { - path: '/dlt.DltGatewayService/GetDltStatus', - requestStream: false, - responseStream: false, - requestType: context_pb.TeraFlowController, - responseType: dlt_service_pb.DltPeerStatus, - requestSerialize: serialize_context_TeraFlowController, - requestDeserialize: deserialize_context_TeraFlowController, - responseSerialize: serialize_dlt_DltPeerStatus, - responseDeserialize: deserialize_dlt_DltPeerStatus, - }, - getDltPeers: { - path: '/dlt.DltGatewayService/GetDltPeers', - requestStream: false, - responseStream: false, - requestType: context_pb.Empty, - responseType: dlt_service_pb.DltPeerStatusList, - requestSerialize: serialize_context_Empty, - requestDeserialize: deserialize_context_Empty, - responseSerialize: serialize_dlt_DltPeerStatusList, - responseDeserialize: deserialize_dlt_DltPeerStatusList, - }, -}; - -exports.DltGatewayServiceClient = grpc.makeGenericClientConstructor(DltGatewayServiceService); diff --git a/src/dlt/gateway/dltApp/proto/dlt_service_pb.js b/src/dlt/gateway/dltApp/proto/dlt_service_pb.js deleted file mode 100644 index 59782ff7a..000000000 --- a/src/dlt/gateway/dltApp/proto/dlt_service_pb.js +++ /dev/null @@ -1,1633 +0,0 @@ -// source: dlt_service.proto -/** - * @fileoverview - * @enhanceable - * @suppress {missingRequire} reports error on implicit type usages. - * @suppress {messageConventions} JS Compiler reports an error if a variable or - * field starts with 'MSG_' and isn't a translatable message. - * @public - */ -// GENERATED CODE -- DO NOT EDIT! -/* eslint-disable */ -// @ts-nocheck - -var jspb = require('google-protobuf'); -var goog = jspb; -var global = (function() { - if (this) { return this; } - if (typeof window !== 'undefined') { return window; } - if (typeof global !== 'undefined') { return global; } - if (typeof self !== 'undefined') { return self; } - return Function('return this')(); -}.call(null)); - -var context_pb = require('./context_pb.js'); -goog.object.extend(proto, context_pb); -goog.exportSymbol('proto.dlt.DltPeerStatus', null, global); -goog.exportSymbol('proto.dlt.DltPeerStatusList', null, global); -goog.exportSymbol('proto.dlt.DltRecord', null, global); -goog.exportSymbol('proto.dlt.DltRecordEvent', null, global); -goog.exportSymbol('proto.dlt.DltRecordId', null, global); -goog.exportSymbol('proto.dlt.DltRecordOperationEnum', null, global); -goog.exportSymbol('proto.dlt.DltRecordStatus', null, global); -goog.exportSymbol('proto.dlt.DltRecordStatusEnum', null, global); -goog.exportSymbol('proto.dlt.DltRecordSubscription', null, global); -goog.exportSymbol('proto.dlt.DltRecordTypeEnum', null, global); -goog.exportSymbol('proto.dlt.DltStatusEnum', null, global); -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.dlt.DltRecordId = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.dlt.DltRecordId, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.dlt.DltRecordId.displayName = 'proto.dlt.DltRecordId'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.dlt.DltRecord = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.dlt.DltRecord, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.dlt.DltRecord.displayName = 'proto.dlt.DltRecord'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.dlt.DltRecordSubscription = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.dlt.DltRecordSubscription.repeatedFields_, null); -}; -goog.inherits(proto.dlt.DltRecordSubscription, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.dlt.DltRecordSubscription.displayName = 'proto.dlt.DltRecordSubscription'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.dlt.DltRecordEvent = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.dlt.DltRecordEvent, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.dlt.DltRecordEvent.displayName = 'proto.dlt.DltRecordEvent'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.dlt.DltRecordStatus = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.dlt.DltRecordStatus, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.dlt.DltRecordStatus.displayName = 'proto.dlt.DltRecordStatus'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.dlt.DltPeerStatus = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); -}; -goog.inherits(proto.dlt.DltPeerStatus, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.dlt.DltPeerStatus.displayName = 'proto.dlt.DltPeerStatus'; -} -/** - * Generated by JsPbCodeGenerator. - * @param {Array=} opt_data Optional initial data array, typically from a - * server response, or constructed directly in Javascript. The array is used - * in place and becomes part of the constructed object. It is not cloned. - * If no data is provided, the constructed object will be empty, but still - * valid. - * @extends {jspb.Message} - * @constructor - */ -proto.dlt.DltPeerStatusList = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, proto.dlt.DltPeerStatusList.repeatedFields_, null); -}; -goog.inherits(proto.dlt.DltPeerStatusList, jspb.Message); -if (goog.DEBUG && !COMPILED) { - /** - * @public - * @override - */ - proto.dlt.DltPeerStatusList.displayName = 'proto.dlt.DltPeerStatusList'; -} - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.dlt.DltRecordId.prototype.toObject = function(opt_includeInstance) { - return proto.dlt.DltRecordId.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.dlt.DltRecordId} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.dlt.DltRecordId.toObject = function(includeInstance, msg) { - var f, obj = { - domainUuid: (f = msg.getDomainUuid()) && context_pb.Uuid.toObject(includeInstance, f), - type: jspb.Message.getFieldWithDefault(msg, 2, 0), - recordUuid: (f = msg.getRecordUuid()) && context_pb.Uuid.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.dlt.DltRecordId} - */ -proto.dlt.DltRecordId.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.dlt.DltRecordId; - return proto.dlt.DltRecordId.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.dlt.DltRecordId} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.dlt.DltRecordId} - */ -proto.dlt.DltRecordId.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new context_pb.Uuid; - reader.readMessage(value,context_pb.Uuid.deserializeBinaryFromReader); - msg.setDomainUuid(value); - break; - case 2: - var value = /** @type {!proto.dlt.DltRecordTypeEnum} */ (reader.readEnum()); - msg.setType(value); - break; - case 3: - var value = new context_pb.Uuid; - reader.readMessage(value,context_pb.Uuid.deserializeBinaryFromReader); - msg.setRecordUuid(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.dlt.DltRecordId.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.dlt.DltRecordId.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.dlt.DltRecordId} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.dlt.DltRecordId.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getDomainUuid(); - if (f != null) { - writer.writeMessage( - 1, - f, - context_pb.Uuid.serializeBinaryToWriter - ); - } - f = message.getType(); - if (f !== 0.0) { - writer.writeEnum( - 2, - f - ); - } - f = message.getRecordUuid(); - if (f != null) { - writer.writeMessage( - 3, - f, - context_pb.Uuid.serializeBinaryToWriter - ); - } -}; - - -/** - * optional context.Uuid domain_uuid = 1; - * @return {?proto.context.Uuid} - */ -proto.dlt.DltRecordId.prototype.getDomainUuid = function() { - return /** @type{?proto.context.Uuid} */ ( - jspb.Message.getWrapperField(this, context_pb.Uuid, 1)); -}; - - -/** - * @param {?proto.context.Uuid|undefined} value - * @return {!proto.dlt.DltRecordId} returns this -*/ -proto.dlt.DltRecordId.prototype.setDomainUuid = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.dlt.DltRecordId} returns this - */ -proto.dlt.DltRecordId.prototype.clearDomainUuid = function() { - return this.setDomainUuid(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.dlt.DltRecordId.prototype.hasDomainUuid = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional DltRecordTypeEnum type = 2; - * @return {!proto.dlt.DltRecordTypeEnum} - */ -proto.dlt.DltRecordId.prototype.getType = function() { - return /** @type {!proto.dlt.DltRecordTypeEnum} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {!proto.dlt.DltRecordTypeEnum} value - * @return {!proto.dlt.DltRecordId} returns this - */ -proto.dlt.DltRecordId.prototype.setType = function(value) { - return jspb.Message.setProto3EnumField(this, 2, value); -}; - - -/** - * optional context.Uuid record_uuid = 3; - * @return {?proto.context.Uuid} - */ -proto.dlt.DltRecordId.prototype.getRecordUuid = function() { - return /** @type{?proto.context.Uuid} */ ( - jspb.Message.getWrapperField(this, context_pb.Uuid, 3)); -}; - - -/** - * @param {?proto.context.Uuid|undefined} value - * @return {!proto.dlt.DltRecordId} returns this -*/ -proto.dlt.DltRecordId.prototype.setRecordUuid = function(value) { - return jspb.Message.setWrapperField(this, 3, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.dlt.DltRecordId} returns this - */ -proto.dlt.DltRecordId.prototype.clearRecordUuid = function() { - return this.setRecordUuid(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.dlt.DltRecordId.prototype.hasRecordUuid = function() { - return jspb.Message.getField(this, 3) != null; -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.dlt.DltRecord.prototype.toObject = function(opt_includeInstance) { - return proto.dlt.DltRecord.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.dlt.DltRecord} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.dlt.DltRecord.toObject = function(includeInstance, msg) { - var f, obj = { - recordId: (f = msg.getRecordId()) && proto.dlt.DltRecordId.toObject(includeInstance, f), - operation: jspb.Message.getFieldWithDefault(msg, 2, 0), - dataJson: jspb.Message.getFieldWithDefault(msg, 3, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.dlt.DltRecord} - */ -proto.dlt.DltRecord.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.dlt.DltRecord; - return proto.dlt.DltRecord.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.dlt.DltRecord} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.dlt.DltRecord} - */ -proto.dlt.DltRecord.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.dlt.DltRecordId; - reader.readMessage(value,proto.dlt.DltRecordId.deserializeBinaryFromReader); - msg.setRecordId(value); - break; - case 2: - var value = /** @type {!proto.dlt.DltRecordOperationEnum} */ (reader.readEnum()); - msg.setOperation(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setDataJson(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.dlt.DltRecord.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.dlt.DltRecord.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.dlt.DltRecord} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.dlt.DltRecord.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getRecordId(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.dlt.DltRecordId.serializeBinaryToWriter - ); - } - f = message.getOperation(); - if (f !== 0.0) { - writer.writeEnum( - 2, - f - ); - } - f = message.getDataJson(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } -}; - - -/** - * optional DltRecordId record_id = 1; - * @return {?proto.dlt.DltRecordId} - */ -proto.dlt.DltRecord.prototype.getRecordId = function() { - return /** @type{?proto.dlt.DltRecordId} */ ( - jspb.Message.getWrapperField(this, proto.dlt.DltRecordId, 1)); -}; - - -/** - * @param {?proto.dlt.DltRecordId|undefined} value - * @return {!proto.dlt.DltRecord} returns this -*/ -proto.dlt.DltRecord.prototype.setRecordId = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.dlt.DltRecord} returns this - */ -proto.dlt.DltRecord.prototype.clearRecordId = function() { - return this.setRecordId(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.dlt.DltRecord.prototype.hasRecordId = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional DltRecordOperationEnum operation = 2; - * @return {!proto.dlt.DltRecordOperationEnum} - */ -proto.dlt.DltRecord.prototype.getOperation = function() { - return /** @type {!proto.dlt.DltRecordOperationEnum} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {!proto.dlt.DltRecordOperationEnum} value - * @return {!proto.dlt.DltRecord} returns this - */ -proto.dlt.DltRecord.prototype.setOperation = function(value) { - return jspb.Message.setProto3EnumField(this, 2, value); -}; - - -/** - * optional string data_json = 3; - * @return {string} - */ -proto.dlt.DltRecord.prototype.getDataJson = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.dlt.DltRecord} returns this - */ -proto.dlt.DltRecord.prototype.setDataJson = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array} - * @const - */ -proto.dlt.DltRecordSubscription.repeatedFields_ = [1,2]; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.dlt.DltRecordSubscription.prototype.toObject = function(opt_includeInstance) { - return proto.dlt.DltRecordSubscription.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.dlt.DltRecordSubscription} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.dlt.DltRecordSubscription.toObject = function(includeInstance, msg) { - var f, obj = { - typeList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f, - operationList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.dlt.DltRecordSubscription} - */ -proto.dlt.DltRecordSubscription.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.dlt.DltRecordSubscription; - return proto.dlt.DltRecordSubscription.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.dlt.DltRecordSubscription} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.dlt.DltRecordSubscription} - */ -proto.dlt.DltRecordSubscription.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var values = /** @type {!Array} */ (reader.isDelimited() ? reader.readPackedEnum() : [reader.readEnum()]); - for (var i = 0; i < values.length; i++) { - msg.addType(values[i]); - } - break; - case 2: - var values = /** @type {!Array} */ (reader.isDelimited() ? reader.readPackedEnum() : [reader.readEnum()]); - for (var i = 0; i < values.length; i++) { - msg.addOperation(values[i]); - } - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.dlt.DltRecordSubscription.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.dlt.DltRecordSubscription.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.dlt.DltRecordSubscription} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.dlt.DltRecordSubscription.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getTypeList(); - if (f.length > 0) { - writer.writePackedEnum( - 1, - f - ); - } - f = message.getOperationList(); - if (f.length > 0) { - writer.writePackedEnum( - 2, - f - ); - } -}; - - -/** - * repeated DltRecordTypeEnum type = 1; - * @return {!Array} - */ -proto.dlt.DltRecordSubscription.prototype.getTypeList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); -}; - - -/** - * @param {!Array} value - * @return {!proto.dlt.DltRecordSubscription} returns this - */ -proto.dlt.DltRecordSubscription.prototype.setTypeList = function(value) { - return jspb.Message.setField(this, 1, value || []); -}; - - -/** - * @param {!proto.dlt.DltRecordTypeEnum} value - * @param {number=} opt_index - * @return {!proto.dlt.DltRecordSubscription} returns this - */ -proto.dlt.DltRecordSubscription.prototype.addType = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 1, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.dlt.DltRecordSubscription} returns this - */ -proto.dlt.DltRecordSubscription.prototype.clearTypeList = function() { - return this.setTypeList([]); -}; - - -/** - * repeated DltRecordOperationEnum operation = 2; - * @return {!Array} - */ -proto.dlt.DltRecordSubscription.prototype.getOperationList = function() { - return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 2)); -}; - - -/** - * @param {!Array} value - * @return {!proto.dlt.DltRecordSubscription} returns this - */ -proto.dlt.DltRecordSubscription.prototype.setOperationList = function(value) { - return jspb.Message.setField(this, 2, value || []); -}; - - -/** - * @param {!proto.dlt.DltRecordOperationEnum} value - * @param {number=} opt_index - * @return {!proto.dlt.DltRecordSubscription} returns this - */ -proto.dlt.DltRecordSubscription.prototype.addOperation = function(value, opt_index) { - return jspb.Message.addToRepeatedField(this, 2, value, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.dlt.DltRecordSubscription} returns this - */ -proto.dlt.DltRecordSubscription.prototype.clearOperationList = function() { - return this.setOperationList([]); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.dlt.DltRecordEvent.prototype.toObject = function(opt_includeInstance) { - return proto.dlt.DltRecordEvent.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.dlt.DltRecordEvent} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.dlt.DltRecordEvent.toObject = function(includeInstance, msg) { - var f, obj = { - event: (f = msg.getEvent()) && context_pb.Event.toObject(includeInstance, f), - recordId: (f = msg.getRecordId()) && proto.dlt.DltRecordId.toObject(includeInstance, f) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.dlt.DltRecordEvent} - */ -proto.dlt.DltRecordEvent.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.dlt.DltRecordEvent; - return proto.dlt.DltRecordEvent.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.dlt.DltRecordEvent} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.dlt.DltRecordEvent} - */ -proto.dlt.DltRecordEvent.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new context_pb.Event; - reader.readMessage(value,context_pb.Event.deserializeBinaryFromReader); - msg.setEvent(value); - break; - case 2: - var value = new proto.dlt.DltRecordId; - reader.readMessage(value,proto.dlt.DltRecordId.deserializeBinaryFromReader); - msg.setRecordId(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.dlt.DltRecordEvent.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.dlt.DltRecordEvent.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.dlt.DltRecordEvent} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.dlt.DltRecordEvent.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getEvent(); - if (f != null) { - writer.writeMessage( - 1, - f, - context_pb.Event.serializeBinaryToWriter - ); - } - f = message.getRecordId(); - if (f != null) { - writer.writeMessage( - 2, - f, - proto.dlt.DltRecordId.serializeBinaryToWriter - ); - } -}; - - -/** - * optional context.Event event = 1; - * @return {?proto.context.Event} - */ -proto.dlt.DltRecordEvent.prototype.getEvent = function() { - return /** @type{?proto.context.Event} */ ( - jspb.Message.getWrapperField(this, context_pb.Event, 1)); -}; - - -/** - * @param {?proto.context.Event|undefined} value - * @return {!proto.dlt.DltRecordEvent} returns this -*/ -proto.dlt.DltRecordEvent.prototype.setEvent = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.dlt.DltRecordEvent} returns this - */ -proto.dlt.DltRecordEvent.prototype.clearEvent = function() { - return this.setEvent(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.dlt.DltRecordEvent.prototype.hasEvent = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional DltRecordId record_id = 2; - * @return {?proto.dlt.DltRecordId} - */ -proto.dlt.DltRecordEvent.prototype.getRecordId = function() { - return /** @type{?proto.dlt.DltRecordId} */ ( - jspb.Message.getWrapperField(this, proto.dlt.DltRecordId, 2)); -}; - - -/** - * @param {?proto.dlt.DltRecordId|undefined} value - * @return {!proto.dlt.DltRecordEvent} returns this -*/ -proto.dlt.DltRecordEvent.prototype.setRecordId = function(value) { - return jspb.Message.setWrapperField(this, 2, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.dlt.DltRecordEvent} returns this - */ -proto.dlt.DltRecordEvent.prototype.clearRecordId = function() { - return this.setRecordId(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.dlt.DltRecordEvent.prototype.hasRecordId = function() { - return jspb.Message.getField(this, 2) != null; -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.dlt.DltRecordStatus.prototype.toObject = function(opt_includeInstance) { - return proto.dlt.DltRecordStatus.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.dlt.DltRecordStatus} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.dlt.DltRecordStatus.toObject = function(includeInstance, msg) { - var f, obj = { - recordId: (f = msg.getRecordId()) && proto.dlt.DltRecordId.toObject(includeInstance, f), - status: jspb.Message.getFieldWithDefault(msg, 2, 0), - errorMessage: jspb.Message.getFieldWithDefault(msg, 3, "") - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.dlt.DltRecordStatus} - */ -proto.dlt.DltRecordStatus.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.dlt.DltRecordStatus; - return proto.dlt.DltRecordStatus.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.dlt.DltRecordStatus} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.dlt.DltRecordStatus} - */ -proto.dlt.DltRecordStatus.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.dlt.DltRecordId; - reader.readMessage(value,proto.dlt.DltRecordId.deserializeBinaryFromReader); - msg.setRecordId(value); - break; - case 2: - var value = /** @type {!proto.dlt.DltRecordStatusEnum} */ (reader.readEnum()); - msg.setStatus(value); - break; - case 3: - var value = /** @type {string} */ (reader.readString()); - msg.setErrorMessage(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.dlt.DltRecordStatus.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.dlt.DltRecordStatus.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.dlt.DltRecordStatus} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.dlt.DltRecordStatus.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getRecordId(); - if (f != null) { - writer.writeMessage( - 1, - f, - proto.dlt.DltRecordId.serializeBinaryToWriter - ); - } - f = message.getStatus(); - if (f !== 0.0) { - writer.writeEnum( - 2, - f - ); - } - f = message.getErrorMessage(); - if (f.length > 0) { - writer.writeString( - 3, - f - ); - } -}; - - -/** - * optional DltRecordId record_id = 1; - * @return {?proto.dlt.DltRecordId} - */ -proto.dlt.DltRecordStatus.prototype.getRecordId = function() { - return /** @type{?proto.dlt.DltRecordId} */ ( - jspb.Message.getWrapperField(this, proto.dlt.DltRecordId, 1)); -}; - - -/** - * @param {?proto.dlt.DltRecordId|undefined} value - * @return {!proto.dlt.DltRecordStatus} returns this -*/ -proto.dlt.DltRecordStatus.prototype.setRecordId = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.dlt.DltRecordStatus} returns this - */ -proto.dlt.DltRecordStatus.prototype.clearRecordId = function() { - return this.setRecordId(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.dlt.DltRecordStatus.prototype.hasRecordId = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional DltRecordStatusEnum status = 2; - * @return {!proto.dlt.DltRecordStatusEnum} - */ -proto.dlt.DltRecordStatus.prototype.getStatus = function() { - return /** @type {!proto.dlt.DltRecordStatusEnum} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {!proto.dlt.DltRecordStatusEnum} value - * @return {!proto.dlt.DltRecordStatus} returns this - */ -proto.dlt.DltRecordStatus.prototype.setStatus = function(value) { - return jspb.Message.setProto3EnumField(this, 2, value); -}; - - -/** - * optional string error_message = 3; - * @return {string} - */ -proto.dlt.DltRecordStatus.prototype.getErrorMessage = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); -}; - - -/** - * @param {string} value - * @return {!proto.dlt.DltRecordStatus} returns this - */ -proto.dlt.DltRecordStatus.prototype.setErrorMessage = function(value) { - return jspb.Message.setProto3StringField(this, 3, value); -}; - - - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.dlt.DltPeerStatus.prototype.toObject = function(opt_includeInstance) { - return proto.dlt.DltPeerStatus.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.dlt.DltPeerStatus} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.dlt.DltPeerStatus.toObject = function(includeInstance, msg) { - var f, obj = { - controller: (f = msg.getController()) && context_pb.TeraFlowController.toObject(includeInstance, f), - status: jspb.Message.getFieldWithDefault(msg, 2, 0) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.dlt.DltPeerStatus} - */ -proto.dlt.DltPeerStatus.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.dlt.DltPeerStatus; - return proto.dlt.DltPeerStatus.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.dlt.DltPeerStatus} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.dlt.DltPeerStatus} - */ -proto.dlt.DltPeerStatus.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new context_pb.TeraFlowController; - reader.readMessage(value,context_pb.TeraFlowController.deserializeBinaryFromReader); - msg.setController(value); - break; - case 2: - var value = /** @type {!proto.dlt.DltStatusEnum} */ (reader.readEnum()); - msg.setStatus(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.dlt.DltPeerStatus.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.dlt.DltPeerStatus.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.dlt.DltPeerStatus} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.dlt.DltPeerStatus.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getController(); - if (f != null) { - writer.writeMessage( - 1, - f, - context_pb.TeraFlowController.serializeBinaryToWriter - ); - } - f = message.getStatus(); - if (f !== 0.0) { - writer.writeEnum( - 2, - f - ); - } -}; - - -/** - * optional context.TeraFlowController controller = 1; - * @return {?proto.context.TeraFlowController} - */ -proto.dlt.DltPeerStatus.prototype.getController = function() { - return /** @type{?proto.context.TeraFlowController} */ ( - jspb.Message.getWrapperField(this, context_pb.TeraFlowController, 1)); -}; - - -/** - * @param {?proto.context.TeraFlowController|undefined} value - * @return {!proto.dlt.DltPeerStatus} returns this -*/ -proto.dlt.DltPeerStatus.prototype.setController = function(value) { - return jspb.Message.setWrapperField(this, 1, value); -}; - - -/** - * Clears the message field making it undefined. - * @return {!proto.dlt.DltPeerStatus} returns this - */ -proto.dlt.DltPeerStatus.prototype.clearController = function() { - return this.setController(undefined); -}; - - -/** - * Returns whether this field is set. - * @return {boolean} - */ -proto.dlt.DltPeerStatus.prototype.hasController = function() { - return jspb.Message.getField(this, 1) != null; -}; - - -/** - * optional DltStatusEnum status = 2; - * @return {!proto.dlt.DltStatusEnum} - */ -proto.dlt.DltPeerStatus.prototype.getStatus = function() { - return /** @type {!proto.dlt.DltStatusEnum} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); -}; - - -/** - * @param {!proto.dlt.DltStatusEnum} value - * @return {!proto.dlt.DltPeerStatus} returns this - */ -proto.dlt.DltPeerStatus.prototype.setStatus = function(value) { - return jspb.Message.setProto3EnumField(this, 2, value); -}; - - - -/** - * List of repeated fields within this message type. - * @private {!Array} - * @const - */ -proto.dlt.DltPeerStatusList.repeatedFields_ = [1]; - - - -if (jspb.Message.GENERATE_TO_OBJECT) { -/** - * Creates an object representation of this proto. - * Field names that are reserved in JavaScript and will be renamed to pb_name. - * Optional fields that are not set will be set to undefined. - * To access a reserved field use, foo.pb_, eg, foo.pb_default. - * For the list of reserved names please see: - * net/proto2/compiler/js/internal/generator.cc#kKeyword. - * @param {boolean=} opt_includeInstance Deprecated. whether to include the - * JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @return {!Object} - */ -proto.dlt.DltPeerStatusList.prototype.toObject = function(opt_includeInstance) { - return proto.dlt.DltPeerStatusList.toObject(opt_includeInstance, this); -}; - - -/** - * Static version of the {@see toObject} method. - * @param {boolean|undefined} includeInstance Deprecated. Whether to include - * the JSPB instance for transitional soy proto support: - * http://goto/soy-param-migration - * @param {!proto.dlt.DltPeerStatusList} msg The msg instance to transform. - * @return {!Object} - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.dlt.DltPeerStatusList.toObject = function(includeInstance, msg) { - var f, obj = { - peersList: jspb.Message.toObjectList(msg.getPeersList(), - proto.dlt.DltPeerStatus.toObject, includeInstance) - }; - - if (includeInstance) { - obj.$jspbMessageInstance = msg; - } - return obj; -}; -} - - -/** - * Deserializes binary data (in protobuf wire format). - * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.dlt.DltPeerStatusList} - */ -proto.dlt.DltPeerStatusList.deserializeBinary = function(bytes) { - var reader = new jspb.BinaryReader(bytes); - var msg = new proto.dlt.DltPeerStatusList; - return proto.dlt.DltPeerStatusList.deserializeBinaryFromReader(msg, reader); -}; - - -/** - * Deserializes binary data (in protobuf wire format) from the - * given reader into the given message object. - * @param {!proto.dlt.DltPeerStatusList} msg The message object to deserialize into. - * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.dlt.DltPeerStatusList} - */ -proto.dlt.DltPeerStatusList.deserializeBinaryFromReader = function(msg, reader) { - while (reader.nextField()) { - if (reader.isEndGroup()) { - break; - } - var field = reader.getFieldNumber(); - switch (field) { - case 1: - var value = new proto.dlt.DltPeerStatus; - reader.readMessage(value,proto.dlt.DltPeerStatus.deserializeBinaryFromReader); - msg.addPeers(value); - break; - default: - reader.skipField(); - break; - } - } - return msg; -}; - - -/** - * Serializes the message to binary data (in protobuf wire format). - * @return {!Uint8Array} - */ -proto.dlt.DltPeerStatusList.prototype.serializeBinary = function() { - var writer = new jspb.BinaryWriter(); - proto.dlt.DltPeerStatusList.serializeBinaryToWriter(this, writer); - return writer.getResultBuffer(); -}; - - -/** - * Serializes the given message to binary data (in protobuf wire - * format), writing to the given BinaryWriter. - * @param {!proto.dlt.DltPeerStatusList} message - * @param {!jspb.BinaryWriter} writer - * @suppress {unusedLocalVariables} f is only used for nested messages - */ -proto.dlt.DltPeerStatusList.serializeBinaryToWriter = function(message, writer) { - var f = undefined; - f = message.getPeersList(); - if (f.length > 0) { - writer.writeRepeatedMessage( - 1, - f, - proto.dlt.DltPeerStatus.serializeBinaryToWriter - ); - } -}; - - -/** - * repeated DltPeerStatus peers = 1; - * @return {!Array} - */ -proto.dlt.DltPeerStatusList.prototype.getPeersList = function() { - return /** @type{!Array} */ ( - jspb.Message.getRepeatedWrapperField(this, proto.dlt.DltPeerStatus, 1)); -}; - - -/** - * @param {!Array} value - * @return {!proto.dlt.DltPeerStatusList} returns this -*/ -proto.dlt.DltPeerStatusList.prototype.setPeersList = function(value) { - return jspb.Message.setRepeatedWrapperField(this, 1, value); -}; - - -/** - * @param {!proto.dlt.DltPeerStatus=} opt_value - * @param {number=} opt_index - * @return {!proto.dlt.DltPeerStatus} - */ -proto.dlt.DltPeerStatusList.prototype.addPeers = function(opt_value, opt_index) { - return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.dlt.DltPeerStatus, opt_index); -}; - - -/** - * Clears the list making it empty but non-null. - * @return {!proto.dlt.DltPeerStatusList} returns this - */ -proto.dlt.DltPeerStatusList.prototype.clearPeersList = function() { - return this.setPeersList([]); -}; - - -/** - * @enum {number} - */ -proto.dlt.DltRecordTypeEnum = { - DLTRECORDTYPE_UNDEFINED: 0, - DLTRECORDTYPE_CONTEXT: 1, - DLTRECORDTYPE_TOPOLOGY: 2, - DLTRECORDTYPE_DEVICE: 3, - DLTRECORDTYPE_LINK: 4, - DLTRECORDTYPE_SERVICE: 5, - DLTRECORDTYPE_SLICE: 6 -}; - -/** - * @enum {number} - */ -proto.dlt.DltRecordOperationEnum = { - DLTRECORDOPERATION_UNDEFINED: 0, - DLTRECORDOPERATION_ADD: 1, - DLTRECORDOPERATION_UPDATE: 2, - DLTRECORDOPERATION_DELETE: 3 -}; - -/** - * @enum {number} - */ -proto.dlt.DltRecordStatusEnum = { - DLTRECORDSTATUS_UNDEFINED: 0, - DLTRECORDSTATUS_SUCCEEDED: 1, - DLTRECORDSTATUS_FAILED: 2 -}; - -/** - * @enum {number} - */ -proto.dlt.DltStatusEnum = { - DLTSTATUS_UNDEFINED: 0, - DLTSTATUS_NOTAVAILABLE: 1, - DLTSTATUS_INITIALIZED: 2, - DLTSTATUS_AVAILABLE: 3, - DLTSTATUS_DEINIT: 4 -}; - -goog.object.extend(exports, proto.dlt); diff --git a/src/dlt/gateway/dltApp/src/dltGateway.js b/src/dlt/gateway/dltApp/src/dltGateway.js index 374be6464..656397dc8 100644 --- a/src/dlt/gateway/dltApp/src/dltGateway.js +++ b/src/dlt/gateway/dltApp/src/dltGateway.js @@ -20,7 +20,7 @@ const { connectToNetwork } = require('../dist/fabricConnect'); const utf8Decoder = new TextDecoder(); // Load the protocol buffer definitions -const PROTO_PATH = path.resolve(__dirname, '../proto/dlt_service.proto'); +const PROTO_PATH = path.resolve(__dirname, '../proto/dlt_gateway.proto'); const packageDefinition = protoLoader.loadSync(PROTO_PATH, { keepCase: true, longs: String, diff --git a/src/dlt/gateway/dltApp/tests/testEvents.js b/src/dlt/gateway/dltApp/tests/testEvents.js index 2590d40d4..d788f04e1 100644 --- a/src/dlt/gateway/dltApp/tests/testEvents.js +++ b/src/dlt/gateway/dltApp/tests/testEvents.js @@ -17,7 +17,7 @@ const grpc = require('@grpc/grpc-js'); const protoLoader = require('@grpc/proto-loader'); const path = require('path'); -const PROTO_PATH = path.resolve(__dirname, '../proto/dlt_service.proto'); +const PROTO_PATH = path.resolve(__dirname, '../proto/dlt_gateway.proto'); const packageDefinition = protoLoader.loadSync(PROTO_PATH, { keepCase: true, longs: String, diff --git a/src/dlt/gateway/dltApp/tests/testGateway.js b/src/dlt/gateway/dltApp/tests/testGateway.js index 778c0f909..099837567 100644 --- a/src/dlt/gateway/dltApp/tests/testGateway.js +++ b/src/dlt/gateway/dltApp/tests/testGateway.js @@ -20,7 +20,7 @@ const fs = require('fs').promises; const { v4: uuidv4 } = require('uuid'); // Import the UUID library -const PROTO_PATH = path.resolve(__dirname, '../proto/dlt_service.proto'); +const PROTO_PATH = path.resolve(__dirname, '../proto/dlt_gateway.proto'); const packageDefinition = protoLoader.loadSync(PROTO_PATH, { keepCase: true, longs: String, -- GitLab From e47151d6cd9ffc0a23a128bd2ee0d75dc5e257ea Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 9 Sep 2024 14:31:09 +0000 Subject: [PATCH 564/602] Pre-merge code cleanup --- .../nbi_plugins/ietf_hardware/Hardware.py | 2 +- .../ietf_hardware/HardwareMultipleDevices.py | 16 +++++++++++++++- .../nbi_plugins/ietf_hardware/YangHandler.py | 13 +++++-------- .../nbi_plugins/ietf_hardware/__init__.py | 9 ++++----- .../rest_server/nbi_plugins/tfs_api/__init__.py | 5 ++--- 5 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/Hardware.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/Hardware.py index a7404b924..2282de557 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/Hardware.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/Hardware.py @@ -50,4 +50,4 @@ class Hardware(Resource): LOGGER.exception(MSG.format(str(device_uuid))) response = jsonify({'error': str(e)}) response.status_code = HTTP_SERVERERROR - return response \ No newline at end of file + return response diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/HardwareMultipleDevices.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/HardwareMultipleDevices.py index 5258455e5..b1beff518 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/HardwareMultipleDevices.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/HardwareMultipleDevices.py @@ -1,3 +1,17 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 logging from flask import request from flask.json import jsonify @@ -33,4 +47,4 @@ class HardwareMultipleDevices(Resource): MSG = 'Something went wrong Retrieving Hardware of Devices({:s})' response = jsonify({'error': str(e)}) response.status_code = HTTP_SERVERERROR - return response \ No newline at end of file + return response diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py index aa0a90908..33611adcf 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py @@ -89,10 +89,9 @@ class YangHandler: if component_type == "FRU" : component_type = "slack" - + component_type = component_type.replace("_", "-").lower() component_type = 'iana-hardware:' + component_type - component_new.create_path('class', component_type) #Añadir resto de atributos en IETF @@ -100,7 +99,7 @@ class YangHandler: physical_index += 1 component_new.create_path('description', attributes["description"].replace('/"',"")) - + if "CHASSIS" not in component.type: parent_component_references = component_new.create_path('parent-component-references') parent = parent_component_references.create_path('component-reference[index="{:d}"]'.format(physical_index)) @@ -124,7 +123,7 @@ class YangHandler: component_new.create_path('is-fru', True) elif 'false' in removable: component_new.create_path('is-fru', False) - + if attributes["id"]: try: if "CHASSIS" in component.type : @@ -137,8 +136,6 @@ class YangHandler: continue component_new.create_path('uri', component.name) - - component_new.create_path('uuid', component.component_uuid.uuid) for child in device.components: @@ -146,6 +143,6 @@ class YangHandler: component_new.create_path('contained-child', child.component_uuid.uuid) return json.loads(hardware.print_mem('json')) - + def destroy(self) -> None: - self._yang_context.destroy() \ No newline at end of file + self._yang_context.destroy() diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py index acec9ac45..ba774650e 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/__init__.py @@ -16,10 +16,9 @@ from nbi.service.rest_server.nbi_plugins.ietf_hardware.Hardware import Hardware from nbi.service.rest_server.nbi_plugins.ietf_hardware.HardwareMultipleDevices import HardwareMultipleDevices from nbi.service.rest_server.RestServer import RestServer -URL_PREFIX_device = "/restconf/data/device=/ietf-network-hardware-inventory:network-hardware-inventory" -URL_PREFIX_hardware = "/restconf/data/ietf-network-hardware-inventory:network-hardware-inventory" +URL_PREFIX_DEVICE = "/restconf/data/device=/ietf-network-hardware-inventory:network-hardware-inventory" +URL_PREFIX_HARDWARE = "/restconf/data/ietf-network-hardware-inventory:network-hardware-inventory" def register_ietf_hardware(rest_server: RestServer): - rest_server.add_resource(Hardware, URL_PREFIX_device) - rest_server.add_resource(HardwareMultipleDevices, URL_PREFIX_hardware) - \ No newline at end of file + rest_server.add_resource(Hardware, URL_PREFIX_DEVICE) + rest_server.add_resource(HardwareMultipleDevices, URL_PREFIX_HARDWARE) diff --git a/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py b/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py index e67c297bc..1f667f134 100644 --- a/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py +++ b/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py @@ -49,9 +49,8 @@ RESOURCES = [ ('api.slice', Slice, '/context//slice/'), ('api.device_ids', DeviceIds, '/device_ids'), - - ('api.devices', HardwareMultipleDevices, '/devices'), - ('api.device', Hardware, '/device/'), + ('api.devices', Devices, '/devices'), + ('api.device', Device, '/device/'), ('api.link_ids', LinkIds, '/link_ids'), ('api.links', Links, '/links'), -- GitLab From 90bb0d507e65250f9d9fe83579e6ee2e18d9bb82 Mon Sep 17 00:00:00 2001 From: armingol Date: Mon, 9 Sep 2024 16:42:02 +0200 Subject: [PATCH 565/602] pre merge code cleanup --- .../nbi_plugins/ietf_hardware/YangHandler.py | 25 +++---------------- .../nbi_plugins/tfs_api/__init__.py | 3 +-- 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py index 33611adcf..7662261e9 100644 --- a/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py +++ b/src/nbi/service/rest_server/nbi_plugins/ietf_hardware/YangHandler.py @@ -46,60 +46,45 @@ class YangHandler: dnode.free() return message - @staticmethod def convert_to_iso_date(date_str: str) -> Optional[str]: date_str = date_str.strip('"') - # Define the regex pattern for ISO 8601 date format pattern = r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[\+\-]\d{2}:\d{2})" - # Check if the input date string matches the pattern if re.match(pattern, date_str): - return date_str # Already in ISO format + return date_str else: try: - # Parse the input date string as a datetime object datetime_obj = datetime.datetime.strptime(date_str, "%Y-%m-%d") - # Convert to ISO format iso_date = datetime_obj.isoformat() + "Z" return iso_date except ValueError: - return None # Invalid date format - + return None def compose(self, device : Device) -> Dict: hardware = self._yang_context.create_data_path('/ietf-network-hardware-inventory:network-hardware-inventory') network_elements = hardware.create_path('network-elements') - + network_element = network_elements.create_path('network-element[uuid="{:s}"]'.format(device.device_id.device_uuid.uuid)) network_element.create_path('uuid', device.device_id.device_uuid.uuid) network_element.create_path('name', device.name) components = network_element.create_path('components') physical_index = 1 - + for component in device.components: attributes = component.attributes - component_new = components.create_path('component[uuid="{:s}"]'.format(component.component_uuid.uuid)) component_new.create_path('name', component.name) - - #Cambiar las clases especiales, su formato y añadir isfru component_type = component.type if component_type == "TRANSCEIVER" : component_type = "module" - if component_type == "FRU" : component_type = "slack" component_type = component_type.replace("_", "-").lower() component_type = 'iana-hardware:' + component_type component_new.create_path('class', component_type) - - #Añadir resto de atributos en IETF - physical_index += 1 - component_new.create_path('description', attributes["description"].replace('/"',"")) - if "CHASSIS" not in component.type: parent_component_references = component_new.create_path('parent-component-references') parent = parent_component_references.create_path('component-reference[index="{:d}"]'.format(physical_index)) @@ -107,7 +92,6 @@ class YangHandler: if component.parent == component_parent.name : parent.create_path('uuid', component_parent.component_uuid.uuid) break - if attributes["mfg-date"] != "": mfg_date = self.convert_to_iso_date(attributes["mfg-date"]) component_new.create_path('mfg-date', mfg_date) @@ -137,7 +121,6 @@ class YangHandler: component_new.create_path('uri', component.name) component_new.create_path('uuid', component.component_uuid.uuid) - for child in device.components: if component.name == child.parent : component_new.create_path('contained-child', child.component_uuid.uuid) diff --git a/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py b/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py index 1f667f134..41e8ff1ea 100644 --- a/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py +++ b/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py @@ -13,7 +13,6 @@ # limitations under the License. from nbi.service.rest_server.RestServer import RestServer -from nbi.service.rest_server.nbi_plugins.ietf_hardware import Hardware, HardwareMultipleDevices from .Resources import ( Connection, ConnectionIds, Connections, Context, ContextIds, Contexts, @@ -51,7 +50,7 @@ RESOURCES = [ ('api.device_ids', DeviceIds, '/device_ids'), ('api.devices', Devices, '/devices'), ('api.device', Device, '/device/'), - + ('api.link_ids', LinkIds, '/link_ids'), ('api.links', Links, '/links'), ('api.link', Link, '/link/'), -- GitLab From d2c607408c56d02a94915d39690b6738808a2df5 Mon Sep 17 00:00:00 2001 From: jjdiaz Date: Tue, 10 Sep 2024 11:37:30 +0200 Subject: [PATCH 566/602] Code Cleanup --- src/dlt/gateway/dltApp/src/fabricConnect.ts | 28 ++++++++++++--------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/dlt/gateway/dltApp/src/fabricConnect.ts b/src/dlt/gateway/dltApp/src/fabricConnect.ts index 4bef9b335..85ad15b2e 100644 --- a/src/dlt/gateway/dltApp/src/fabricConnect.ts +++ b/src/dlt/gateway/dltApp/src/fabricConnect.ts @@ -21,27 +21,27 @@ import { TextDecoder } from 'util'; import * as dotenv from 'dotenv'; dotenv.config({ path: path.resolve(__dirname, '..', '.env') }); -const channelName = envOrDefault('CHANNEL_NAME', 'channel1'); -const chaincodeName = envOrDefault('CHAINCODE_NAME', 'adrenalineDLT'); -const mspId = envOrDefault('MSP_ID', 'Org1MSP'); +const channelName = getEnvVar('CHANNEL_NAME'); +const chaincodeName = getEnvVar('CHAINCODE_NAME'); +const mspId = getEnvVar('MSP_ID'); // Path to crypto materials. -const cryptoPath = envOrDefault('CRYPTO_PATH', path.resolve(__dirname, '..', '..', '..', 'test-network', 'organizations', 'peerOrganizations', 'org1.adrenaline.com')); +const cryptoPath = getEnvVar('CRYPTO_PATH'); // Path to user private key directory. -const keyDirectoryPath = envOrDefault('KEY_DIRECTORY_PATH', path.resolve(cryptoPath, 'users', 'User1@org1.adrenaline.com', 'msp', 'keystore')); +const keyDirectoryPath = getEnvVar('KEY_DIRECTORY_PATH'); // Path to user certificate directory. -const certDirectoryPath = envOrDefault('CERT_DIRECTORY_PATH', path.resolve(cryptoPath, 'users', 'User1@org1.adrenaline.com', 'msp', 'signcerts')); +const certDirectoryPath = getEnvVar('CERT_DIRECTORY_PATH'); // Path to peer tls certificate. -const tlsCertPath = envOrDefault('TLS_CERT_PATH', path.resolve(cryptoPath, 'peers', 'peer1.org1.adrenaline.com', 'tls', 'ca.crt')); +const tlsCertPath = getEnvVar('TLS_CERT_PATH'); // Gateway peer endpoint. -const peerEndpoint = envOrDefault('PEER_ENDPOINT', 'localhost:7051'); +const peerEndpoint = getEnvVar('PEER_ENDPOINT'); // Gateway peer SSL host name override. -const peerHostAlias = envOrDefault('PEER_HOST_ALIAS', 'peer1.org1.adrenaline.com'); +const peerHostAlias = getEnvVar('PEER_HOST_ALIAS'); const utf8Decoder = new TextDecoder(); const assetId = `asset${Date.now()}`; @@ -154,10 +154,14 @@ async function initLedger(contract: Contract): Promise { /** - * envOrDefault() will return the value of an environment variable, or a default value if the variable is undefined. + * getEnvVar() will return the value of an environment variable. */ -function envOrDefault(key: string, defaultValue: string): string { - return process.env[key] || defaultValue; +function getEnvVar(varName: string): string { + const value = process.env[varName]; + if (!value) { + throw new Error(`Environment variable ${varName} is not set`); + } + return value; } /** -- GitLab From 9927983157a73ececb2acaa9bfb826b57dde5dec Mon Sep 17 00:00:00 2001 From: jjdiaz Date: Tue, 10 Sep 2024 11:57:59 +0200 Subject: [PATCH 567/602] Code Cleanup --- src/dlt/gateway/README.md | 47 +------------------ src/dlt/gateway/dltApp/package-lock.json | 4 +- src/dlt/gateway/dltApp/package.json | 6 +-- src/dlt/gateway/dltApp/tsconfig.json | 3 +- .../gateway/{dltApp => }/tests/perfTest.js | 6 +-- .../gateway/{dltApp => }/tests/rateTest.js | 2 +- .../gateway/{dltApp => }/tests/simpleTest.js | 2 +- .../gateway/{dltApp => }/tests/testEvents.js | 4 +- .../gateway/{dltApp => }/tests/testGateway.js | 4 +- 9 files changed, 17 insertions(+), 61 deletions(-) rename src/dlt/gateway/{dltApp => }/tests/perfTest.js (95%) rename src/dlt/gateway/{dltApp => }/tests/rateTest.js (97%) rename src/dlt/gateway/{dltApp => }/tests/simpleTest.js (97%) rename src/dlt/gateway/{dltApp => }/tests/testEvents.js (92%) rename src/dlt/gateway/{dltApp => }/tests/testGateway.js (96%) diff --git a/src/dlt/gateway/README.md b/src/dlt/gateway/README.md index 401e17864..0ea41cd2f 100644 --- a/src/dlt/gateway/README.md +++ b/src/dlt/gateway/README.md @@ -1,16 +1,8 @@ -# ADRENALINE DLT App - -
- DLT Gateway for chaincode interaction -
DLT_APP for chaincode tests.
-
+# DLT Gateway ## Description -The DLT app consists of a **fabricConnect.ts** TypeScript file, which contains the logic for identification management (certificates required for the MSP), connection management to the blockchain, and finally, it exposes a contract object with all the required information for interacting with the chaincode. The **fabricConnect.ts** is coded following the Fabric Gateway API recommendations from Hyperledger Fabric 2.4+. The compiled **fabricConnect.ts** logic is imported into a **dltGateway.js** file, which contains the gRPC logic for interaction with the TFS controller. Testing code for various performance tests is included inside the [/dltApp/tests](./dltApp/tests/) folder. +The DLT Gateway consists of a **fabricConnect.ts** TypeScript file, which contains the logic for identification management (certificates required for the MSP), connection management to the blockchain, and finally, it exposes a contract object with all the required information for interacting with the chaincode. The **fabricConnect.ts** is coded following the Fabric Gateway API recommendations from Hyperledger Fabric 2.4+. The compiled **fabricConnect.ts** logic is imported into a **dltGateway.js** file, which contains the gRPC logic for interaction with the TFS controller. Testing code for various performance tests is included inside the [/tests](./tests/) folder. The chaincode is written in Go, providing a reference for the operations that are recorded in the blockchain. This chaincode must already be deployed in a working Hyperledger Fabric blockchain. @@ -20,38 +12,3 @@ The chaincode is written in Go, providing a reference for the operations that ar * Docker * K8s -## Building the App - -Install the dependencies and compile the source code. - -```bash -npm install -``` - -## Packing the App - -The [automation](./automation/) folder contains the Dockerfiles and Kubernetes configuration files alongside deployment scripts. - -### Build a Docker Image - -Using the Dockerfile, create a Docker image of the Gateway. - -```bash -docker build -t your-username/dltgateway:v1.0.0 . -``` - -If necessary, upload the Docker image to a Docker repository for convenience. (You can work with the local image if deploying the Kubernetes service on the same machine.) - -```bash -docker push your-username/dltgateway:v1.0.0 -``` - -### Run the Deployment Script - -Make the necessary changes to the environment variables inside the **configmap.yaml** according to the specific Fabric deployment. Also, update the path in the **persistent-volume.yaml** with the correct information. - -```bash -./deploy_dlt_gateway.sh -``` - -Once the Kubernetes service is deployed, TFS can perform gRPC requests to as usual. \ No newline at end of file diff --git a/src/dlt/gateway/dltApp/package-lock.json b/src/dlt/gateway/dltApp/package-lock.json index 9ab326263..6fb245621 100644 --- a/src/dlt/gateway/dltApp/package-lock.json +++ b/src/dlt/gateway/dltApp/package-lock.json @@ -1,11 +1,11 @@ { - "name": "adrenalineDLT_APP", + "name": "dlt_gateway", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "adrenalineDLT_APP", + "name": "dlt_gateway", "version": "1.0.0", "license": "Apache-2.0", "dependencies": { diff --git a/src/dlt/gateway/dltApp/package.json b/src/dlt/gateway/dltApp/package.json index 58ec22dea..5eabc2dff 100644 --- a/src/dlt/gateway/dltApp/package.json +++ b/src/dlt/gateway/dltApp/package.json @@ -1,7 +1,7 @@ { - "name": "adrenalineDLT_APP", + "name": "dlt_gateway", "version": "1.0.0", - "description": "A DLT application that record and manages topology data as JSON implemented in typeScript using fabric-gateway", + "description": "A DLT application that record and manages network related data as JSON, implemented in typeScript using HLF fabric-gateway", "main": "dist/index.js", "typings": "dist/index.d.ts", "engines": { @@ -13,7 +13,7 @@ "lint": "eslint . --ext .ts", "prepare": "npm run build", "pretest": "npm run lint", - "start": "node dist/adrenalineDLT_app.js" + "start": "node dist/dlt_gateway.js" }, "engineStrict": true, "author": "CTTC-Javier", diff --git a/src/dlt/gateway/dltApp/tsconfig.json b/src/dlt/gateway/dltApp/tsconfig.json index c81e4d5f9..34eddef69 100644 --- a/src/dlt/gateway/dltApp/tsconfig.json +++ b/src/dlt/gateway/dltApp/tsconfig.json @@ -9,8 +9,7 @@ "noImplicitAny": true }, "include": [ - "./src/**/*" -, "src.old/grpcClient.js", "src.old/grpcServer.js", "tests/testEvents.js", "tests/testGateway.js" ], + "./src/**/*" ], "exclude": [ "./src/**/*.spec.ts" ] diff --git a/src/dlt/gateway/dltApp/tests/perfTest.js b/src/dlt/gateway/tests/perfTest.js similarity index 95% rename from src/dlt/gateway/dltApp/tests/perfTest.js rename to src/dlt/gateway/tests/perfTest.js index 6549d4e7b..fd60bd9c4 100644 --- a/src/dlt/gateway/dltApp/tests/perfTest.js +++ b/src/dlt/gateway/tests/perfTest.js @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -const { connectToNetwork } = require('../dist/fabricConnect'); +const { connectToNetwork } = require('../dltApp/dist/fabricConnect'); const fsp = require('fs').promises; const fs = require('fs'); const util = require('util'); const utf8Decoder = new TextDecoder(); const topoDirectory = '../samples/'; -//const topologies = ['topo1.json', 'topo2.json', 'topo3.json', 'topo4.json']; -const topologies = ['topo4.json']; +const topologies = ['topo1.json', 'topo2.json', 'topo3.json', 'topo4.json']; +//const topologies = ['topo4.json']; const iterations = 1000; diff --git a/src/dlt/gateway/dltApp/tests/rateTest.js b/src/dlt/gateway/tests/rateTest.js similarity index 97% rename from src/dlt/gateway/dltApp/tests/rateTest.js rename to src/dlt/gateway/tests/rateTest.js index ca3f540d3..f7c408842 100644 --- a/src/dlt/gateway/dltApp/tests/rateTest.js +++ b/src/dlt/gateway/tests/rateTest.js @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -const { connectToNetwork } = require('../dist/fabricConnect'); +const { connectToNetwork } = require('../dltApp/dist/fabricConnect'); const fs = require('fs'); const util = require('util'); const appendFile = util.promisify(fs.appendFile); diff --git a/src/dlt/gateway/dltApp/tests/simpleTest.js b/src/dlt/gateway/tests/simpleTest.js similarity index 97% rename from src/dlt/gateway/dltApp/tests/simpleTest.js rename to src/dlt/gateway/tests/simpleTest.js index d84b5dba1..72da03dec 100644 --- a/src/dlt/gateway/dltApp/tests/simpleTest.js +++ b/src/dlt/gateway/tests/simpleTest.js @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -const { connectToNetwork } = require('../dist/fabricConnect'); +const { connectToNetwork } = require('../dltApp/dist/fabricConnect'); const fs = require('fs'); const util = require('util'); const appendFile = util.promisify(fs.appendFile); diff --git a/src/dlt/gateway/dltApp/tests/testEvents.js b/src/dlt/gateway/tests/testEvents.js similarity index 92% rename from src/dlt/gateway/dltApp/tests/testEvents.js rename to src/dlt/gateway/tests/testEvents.js index d788f04e1..8d209723e 100644 --- a/src/dlt/gateway/dltApp/tests/testEvents.js +++ b/src/dlt/gateway/tests/testEvents.js @@ -17,7 +17,7 @@ const grpc = require('@grpc/grpc-js'); const protoLoader = require('@grpc/proto-loader'); const path = require('path'); -const PROTO_PATH = path.resolve(__dirname, '../proto/dlt_gateway.proto'); +const PROTO_PATH = path.resolve(__dirname, '../../../../proto/dlt_gateway.proto'); const packageDefinition = protoLoader.loadSync(PROTO_PATH, { keepCase: true, longs: String, @@ -28,7 +28,7 @@ const packageDefinition = protoLoader.loadSync(PROTO_PATH, { const dltProto = grpc.loadPackageDefinition(packageDefinition).dlt; const client = new dltProto.DltGatewayService( - '10.1.1.96:32001', + '10.1.1.96:32001', //Replace with TFS server IP_ADDRESS grpc.credentials.createInsecure() ); diff --git a/src/dlt/gateway/dltApp/tests/testGateway.js b/src/dlt/gateway/tests/testGateway.js similarity index 96% rename from src/dlt/gateway/dltApp/tests/testGateway.js rename to src/dlt/gateway/tests/testGateway.js index 099837567..dde6b3efc 100644 --- a/src/dlt/gateway/dltApp/tests/testGateway.js +++ b/src/dlt/gateway/tests/testGateway.js @@ -20,7 +20,7 @@ const fs = require('fs').promises; const { v4: uuidv4 } = require('uuid'); // Import the UUID library -const PROTO_PATH = path.resolve(__dirname, '../proto/dlt_gateway.proto'); +const PROTO_PATH = path.resolve(__dirname, '../../../../proto/dlt_gateway.proto'); const packageDefinition = protoLoader.loadSync(PROTO_PATH, { keepCase: true, longs: String, @@ -40,7 +40,7 @@ const domainUuid = `domain-${uuidv4()}`; // Generate a pretty domain UUID async function getTopoData(filename) { try { - const data = await fs.readFile(`../../samples/${filename}`, 'utf8'); + const data = await fs.readFile(`../samples/${filename}`, 'utf8'); return data; } catch (error) { console.error('Failed to read file:', filename, error); -- GitLab From ed1b4bbee442a2b1a3bb4dfdde331c0c6b2b1a54 Mon Sep 17 00:00:00 2001 From: jjdiaz Date: Tue, 10 Sep 2024 12:06:06 +0200 Subject: [PATCH 568/602] Code Cleanup --- src/dlt/connector/client/DltEventsCollector.py | 2 +- src/dlt/connector/service/DltConnectorServiceServicerImpl.py | 2 +- .../connector/service/event_dispatcher/DltEventDispatcher.py | 4 ++-- src/dlt/performance/__main__.py | 2 +- src/dlt/performance/play_ground/Dlt.py | 2 +- src/dlt/performance/play_ground/__init__.py | 2 +- src/interdomain/service/InterdomainServiceServicerImpl.py | 2 +- .../service/topology_abstractor/DltRecordSender.py | 2 +- .../service/topology_abstractor/TopologyAbstractor.py | 2 +- src/load_generator/load_gen/DltTools.py | 2 +- src/load_generator/load_gen/RequestGenerator.py | 2 +- src/load_generator/tests/test_dlt_functional.py | 2 +- 12 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/dlt/connector/client/DltEventsCollector.py b/src/dlt/connector/client/DltEventsCollector.py index 594d84838..e59784a4d 100644 --- a/src/dlt/connector/client/DltEventsCollector.py +++ b/src/dlt/connector/client/DltEventsCollector.py @@ -16,7 +16,7 @@ from typing import Callable, Optional import grpc, logging, queue, threading, time from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordSubscription from common.tools.grpc.Tools import grpc_message_to_json_string -from src.dlt.connector.client.DltGatewayClient import DltGatewayClient +from dlt.connector.client.DltGatewayClient import DltGatewayClient LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py index 17cc6fd33..1d4066fc9 100644 --- a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py +++ b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py @@ -22,7 +22,7 @@ from common.proto.dlt_connector_pb2_grpc import DltConnectorServiceServicer from common.proto.dlt_gateway_pb2 import DltRecord, DltRecordId, DltRecordOperationEnum, DltRecordTypeEnum from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient -from src.dlt.connector.client.DltGatewayClientAsync import DltGatewayClientAsync +from dlt.connector.client.DltGatewayClientAsync import DltGatewayClientAsync from .tools.Checkers import record_exists LOGGER = logging.getLogger(__name__) diff --git a/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py b/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py index 4ae6fec54..779bae9c1 100644 --- a/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py +++ b/src/dlt/connector/service/event_dispatcher/DltEventDispatcher.py @@ -26,9 +26,9 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient -from src.dlt.connector.client.DltConnectorClient import DltConnectorClient +from dlt.connector.client.DltConnectorClient import DltConnectorClient from dlt.connector.client.DltEventsCollector import DltEventsCollector -from src.dlt.connector.client.DltGatewayClient import DltGatewayClient +from dlt.connector.client.DltGatewayClient import DltGatewayClient from interdomain.client.InterdomainClient import InterdomainClient LOGGER = logging.getLogger(__name__) diff --git a/src/dlt/performance/__main__.py b/src/dlt/performance/__main__.py index 09248c1b1..1d6c41965 100644 --- a/src/dlt/performance/__main__.py +++ b/src/dlt/performance/__main__.py @@ -14,7 +14,7 @@ import functools, logging, pathlib, sys, time from common.proto.dlt_gateway_pb2 import DltRecordEvent -from src.dlt.connector.client.DltGatewayClient import DltGatewayClient +from dlt.connector.client.DltGatewayClient import DltGatewayClient from dlt.connector.client.DltEventsCollector import DltEventsCollector from .play_ground.Enums import CONTEXT_EVENT_TYPE_TO_ACTION, RECORD_TYPE_TO_ENUM from .play_ground import PlayGround diff --git a/src/dlt/performance/play_ground/Dlt.py b/src/dlt/performance/play_ground/Dlt.py index 5de186c8c..b2c889545 100644 --- a/src/dlt/performance/play_ground/Dlt.py +++ b/src/dlt/performance/play_ground/Dlt.py @@ -18,7 +18,7 @@ from common.proto.context_pb2 import Device, Link, Service, Slice from common.proto.dlt_gateway_pb2 import ( DltRecord, DltRecordId, DltRecordOperationEnum, DltRecordStatus, DltRecordTypeEnum) from common.tools.grpc.Tools import grpc_message_to_json_string -from src.dlt.connector.client.DltGatewayClient import DltGatewayClient +from dlt.connector.client.DltGatewayClient import DltGatewayClient from .PerfPoint import PerfPoint DLT_OPERATION_CREATE = DltRecordOperationEnum.DLTRECORDOPERATION_ADD diff --git a/src/dlt/performance/play_ground/__init__.py b/src/dlt/performance/play_ground/__init__.py index ce34d30a4..68ad14dee 100644 --- a/src/dlt/performance/play_ground/__init__.py +++ b/src/dlt/performance/play_ground/__init__.py @@ -15,7 +15,7 @@ import logging, operator, random from typing import Dict, Tuple from common.proto.context_pb2 import Device, Link, Service, Slice -from src.dlt.connector.client.DltGatewayClient import DltGatewayClient +from dlt.connector.client.DltGatewayClient import DltGatewayClient from .Enums import ActionEnum, RecordTypeEnum from .Dlt import ( DLT_OPERATION_CREATE, DLT_OPERATION_DELETE, DLT_OPERATION_UPDATE, diff --git a/src/interdomain/service/InterdomainServiceServicerImpl.py b/src/interdomain/service/InterdomainServiceServicerImpl.py index 146284aaa..bce5e6920 100644 --- a/src/interdomain/service/InterdomainServiceServicerImpl.py +++ b/src/interdomain/service/InterdomainServiceServicerImpl.py @@ -34,7 +34,7 @@ from common.tools.object_factory.Device import json_device_id from common.tools.object_factory.EndPoint import json_endpoint_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient -from src.dlt.connector.client.DltConnectorClientAsync import DltConnectorClientAsync +from dlt.connector.client.DltConnectorClientAsync import DltConnectorClientAsync from pathcomp.frontend.client.PathCompClient import PathCompClient from service.client.ServiceClient import ServiceClient from slice.client.SliceClient import SliceClient diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index 104f2e378..2dd899be2 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -21,7 +21,7 @@ from common.proto.context_pb2 import Device, Link, Service, Slice, TopologyId from common.proto.dlt_connector_pb2 import DltDeviceId, DltLinkId, DltServiceId, DltSliceId from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient -from src.dlt.connector.client.DltConnectorClientAsync import DltConnectorClientAsync +from dlt.connector.client.DltConnectorClientAsync import DltConnectorClientAsync LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) diff --git a/src/interdomain/service/topology_abstractor/TopologyAbstractor.py b/src/interdomain/service/topology_abstractor/TopologyAbstractor.py index 0dbb332db..2a6ef5e32 100644 --- a/src/interdomain/service/topology_abstractor/TopologyAbstractor.py +++ b/src/interdomain/service/topology_abstractor/TopologyAbstractor.py @@ -33,7 +33,7 @@ from common.tools.object_factory.Device import json_device_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient from context.client.EventsCollector import EventsCollector -from src.dlt.connector.client.DltConnectorClient import DltConnectorClient +from dlt.connector.client.DltConnectorClient import DltConnectorClient from .AbstractDevice import AbstractDevice from .AbstractLink import AbstractLink from .DltRecordSender import DltRecordSender diff --git a/src/load_generator/load_gen/DltTools.py b/src/load_generator/load_gen/DltTools.py index 8321dffa5..0ac7ab3f0 100644 --- a/src/load_generator/load_gen/DltTools.py +++ b/src/load_generator/load_gen/DltTools.py @@ -19,7 +19,7 @@ from common.proto.dlt_connector_pb2 import DltDeviceId, DltLinkId, DltServiceId, from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient -from src.dlt.connector.client.DltConnectorClient import DltConnectorClient +from dlt.connector.client.DltConnectorClient import DltConnectorClient def explore_entities_to_record( slice_id : Optional[SliceId] = None, service_id : Optional[ServiceId] = None diff --git a/src/load_generator/load_gen/RequestGenerator.py b/src/load_generator/load_gen/RequestGenerator.py index e6e934b68..2a3e89fe0 100644 --- a/src/load_generator/load_gen/RequestGenerator.py +++ b/src/load_generator/load_gen/RequestGenerator.py @@ -27,7 +27,7 @@ from common.tools.object_factory.Service import ( from common.tools.object_factory.Slice import json_slice from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient -from src.dlt.connector.client.DltConnectorClient import DltConnectorClient +from dlt.connector.client.DltConnectorClient import DltConnectorClient from load_generator.tools.ListScalarRange import generate_value from .Constants import ENDPOINT_COMPATIBILITY, RequestType from .DltTools import record_device_to_dlt, record_link_to_dlt diff --git a/src/load_generator/tests/test_dlt_functional.py b/src/load_generator/tests/test_dlt_functional.py index 588200e0c..f3dea3b4a 100644 --- a/src/load_generator/tests/test_dlt_functional.py +++ b/src/load_generator/tests/test_dlt_functional.py @@ -19,7 +19,7 @@ from common.proto.dlt_connector_pb2 import DltDeviceId, DltLinkId, DltServiceId, from common.tools.object_factory.Device import json_device from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient -from src.dlt.connector.client.DltConnectorClient import DltConnectorClient +from dlt.connector.client.DltConnectorClient import DltConnectorClient def record_device_to_dlt( dlt_connector_client : DltConnectorClient, domain_id : TopologyId, device_id : DeviceId, delete : bool = False -- GitLab From a83ab192971236c52a103367a920ad38925e9609 Mon Sep 17 00:00:00 2001 From: jjdiaz Date: Tue, 10 Sep 2024 12:11:01 +0200 Subject: [PATCH 569/602] Code Cleanup --- src/dlt/gateway/Dockerfile | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/dlt/gateway/Dockerfile b/src/dlt/gateway/Dockerfile index 66b7e0b30..f277aa05b 100644 --- a/src/dlt/gateway/Dockerfile +++ b/src/dlt/gateway/Dockerfile @@ -1,3 +1,17 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + # Use an official Node.js runtime as a parent image FROM node:20 -- GitLab From c1ee28db6870f0b0531c2ca42e147afe700c9312 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 13 Sep 2024 09:40:44 +0000 Subject: [PATCH 570/602] Changes in Analytics Backend: - Updated the `StartSparkStreamer` function call to send `Analyzer_uuid` as the key for messages produced on the Kafka topic. - Updated the `SparkStream` definition to receive the key and added the key to the `streamwriter` object. Frontend: - Integrated APScheduler to manage `StreamListener`. - Added `ResponseListener` to consume messages from the `analytics_response_topic` and process them. - Added APScheduler to manage StreamListener. - Added "ResponseListener" to consumer messages from analytics response_topic and process it. --- .../service/AnalyticsBackendService.py | 10 +-- .../backend/service/SparkStreaming.py | 4 +- src/analytics/backend/tests/test_backend.py | 30 +++---- src/analytics/frontend/requirements.in | 1 + .../AnalyticsFrontendServiceServicerImpl.py | 81 ++++++++++++++++--- src/analytics/frontend/tests/test_frontend.py | 62 ++++++++++---- 6 files changed, 142 insertions(+), 46 deletions(-) diff --git a/src/analytics/backend/service/AnalyticsBackendService.py b/src/analytics/backend/service/AnalyticsBackendService.py index 463442f82..1e0c8a15b 100755 --- a/src/analytics/backend/service/AnalyticsBackendService.py +++ b/src/analytics/backend/service/AnalyticsBackendService.py @@ -34,7 +34,7 @@ class AnalyticsBackendService(GenericGrpcService): 'group.id' : 'analytics-frontend', 'auto.offset.reset' : 'latest'}) - def StartSparkStreamer(self, analyzer_id, analyzer): + def StartSparkStreamer(self, analyzer_uuid, analyzer): kpi_list = analyzer['input_kpis'] oper_list = [s.replace('_value', '') for s in list(analyzer["thresholds"].keys())] # TODO: update this line... thresholds = analyzer['thresholds'] @@ -47,12 +47,12 @@ class AnalyticsBackendService(GenericGrpcService): try: stop_event = threading.Event() thread = threading.Thread(target=SparkStreamer, - args=(kpi_list, oper_list, thresholds, stop_event, + args=(analyzer_uuid, kpi_list, oper_list, thresholds, stop_event, window_size, window_slider, None )) - self.running_threads[analyzer_id] = (thread, stop_event) + self.running_threads[analyzer_uuid] = (thread, stop_event) thread.start() - print ("Initiated Analyzer backend: {:}".format(analyzer_id)) - LOGGER.info("Initiated Analyzer backend: {:}".format(analyzer_id)) + print ("Initiated Analyzer backend: {:}".format(analyzer_uuid)) + LOGGER.info("Initiated Analyzer backend: {:}".format(analyzer_uuid)) return True except Exception as e: print ("Failed to initiate Analyzer backend: {:}".format(e)) diff --git a/src/analytics/backend/service/SparkStreaming.py b/src/analytics/backend/service/SparkStreaming.py index eaabcfed2..96e1aa05d 100644 --- a/src/analytics/backend/service/SparkStreaming.py +++ b/src/analytics/backend/service/SparkStreaming.py @@ -74,7 +74,7 @@ def ApplyThresholds(aggregated_df, thresholds): ) return aggregated_df -def SparkStreamer(kpi_list, oper_list, thresholds, stop_event, +def SparkStreamer(key, kpi_list, oper_list, thresholds, stop_event, window_size=None, win_slide_duration=None, time_stamp_col=None): """ Method to perform Spark operation Kafka stream. @@ -128,7 +128,7 @@ def SparkStreamer(kpi_list, oper_list, thresholds, stop_event, # --- This will write output to Kafka: ACTUAL IMPLEMENTATION query = thresholded_stream_data \ - .selectExpr("CAST(kpi_id AS STRING) AS key", "to_json(struct(*)) AS value") \ + .selectExpr(f"'{key}' AS key", "to_json(struct(*)) AS value") \ .writeStream \ .format("kafka") \ .option("kafka.bootstrap.servers", KafkaConfig.get_kafka_address()) \ diff --git a/src/analytics/backend/tests/test_backend.py b/src/analytics/backend/tests/test_backend.py index c3e00df35..2f40faba9 100644 --- a/src/analytics/backend/tests/test_backend.py +++ b/src/analytics/backend/tests/test_backend.py @@ -32,13 +32,14 @@ def test_validate_kafka_topics(): response = KafkaTopic.create_all_topics() assert isinstance(response, bool) -def test_StartRequestListener(): - LOGGER.info('test_RunRequestListener') - AnalyticsBackendServiceObj = AnalyticsBackendService() - response = AnalyticsBackendServiceObj.StartRequestListener() # response is Tuple (thread, stop_event) - LOGGER.debug(str(response)) - assert isinstance(response, tuple) +# def test_StartRequestListener(): +# LOGGER.info('test_RunRequestListener') +# AnalyticsBackendServiceObj = AnalyticsBackendService() +# response = AnalyticsBackendServiceObj.StartRequestListener() # response is Tuple (thread, stop_event) +# LOGGER.debug(str(response)) +# assert isinstance(response, tuple) +# To test START and STOP communication together def test_StopRequestListener(): LOGGER.info('test_RunRequestListener') LOGGER.info('Initiating StartRequestListener...') @@ -52,11 +53,12 @@ def test_StopRequestListener(): LOGGER.debug(str(response)) assert isinstance(response, bool) -def test_SparkListener(): - LOGGER.info('test_RunRequestListener') - AnalyticsBackendServiceObj = AnalyticsBackendService() - response = AnalyticsBackendServiceObj.RunSparkStreamer( - get_kpi_id_list(), get_operation_list(), get_threshold_dict() - ) - LOGGER.debug(str(response)) - assert isinstance(response, bool) +# To independently tests the SparkListener functionality +# def test_SparkListener(): +# LOGGER.info('test_RunRequestListener') +# AnalyticsBackendServiceObj = AnalyticsBackendService() +# response = AnalyticsBackendServiceObj.RunSparkStreamer( +# get_kpi_id_list(), get_operation_list(), get_threshold_dict() +# ) +# LOGGER.debug(str(response)) +# assert isinstance(response, bool) diff --git a/src/analytics/frontend/requirements.in b/src/analytics/frontend/requirements.in index 1d22df11b..6bf3d7c26 100644 --- a/src/analytics/frontend/requirements.in +++ b/src/analytics/frontend/requirements.in @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +apscheduler==3.10.* # .4 confluent-kafka==2.3.* psycopg2-binary==2.9.* SQLAlchemy==1.4.* diff --git a/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py index f35f035e2..8bb6a17af 100644 --- a/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py +++ b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py @@ -13,7 +13,7 @@ # limitations under the License. -import logging, grpc, json +import logging, grpc, json, queue from typing import Dict from confluent_kafka import Consumer as KafkaConsumer @@ -27,22 +27,24 @@ from common.proto.analytics_frontend_pb2 import Analyzer, AnalyzerId, Analy from common.proto.analytics_frontend_pb2_grpc import AnalyticsFrontendServiceServicer from analytics.database.Analyzer_DB import AnalyzerDB from analytics.database.AnalyzerModel import Analyzer as AnalyzerModel - +from apscheduler.schedulers.background import BackgroundScheduler +from apscheduler.triggers.interval import IntervalTrigger LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('AnalyticsFrontend', 'NBIgRPC') -ACTIVE_ANALYZERS = [] # In case of sevice restarts, the list can be populated from the DB. class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer): def __init__(self): LOGGER.info('Init AnalyticsFrontendService') + self.listener_topic = KafkaTopic.ANALYTICS_RESPONSE.value self.db_obj = AnalyzerDB() + self.result_queue = queue.Queue() + self.scheduler = BackgroundScheduler() self.kafka_producer = KafkaProducer({'bootstrap.servers' : KafkaConfig.get_kafka_address()}) self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.get_kafka_address(), 'group.id' : 'analytics-frontend', 'auto.offset.reset' : 'latest'}) - @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StartAnalyzer(self, request : Analyzer, grpc_context: grpc.ServicerContext # type: ignore @@ -80,9 +82,64 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer): callback = self.delivery_callback ) LOGGER.info("Analyzer Start Request Generated: Analyzer Id: {:}, Value: {:}".format(analyzer_uuid, analyzer_to_generate)) - ACTIVE_ANALYZERS.append(analyzer_uuid) self.kafka_producer.flush() + + # self.StartResponseListener(analyzer_uuid) + def StartResponseListener(self, filter_key=None): + """ + Start the Kafka response listener with APScheduler and return key-value pairs periodically. + """ + LOGGER.info("Starting StartResponseListener") + # Schedule the ResponseListener at fixed intervals + self.scheduler.add_job( + self.response_listener, + trigger=IntervalTrigger(seconds=5), + args=[filter_key], + id=f"response_listener_{self.listener_topic}", + replace_existing=True + ) + self.scheduler.start() + LOGGER.info(f"Started Kafka listener for topic {self.listener_topic}...") + try: + while True: + LOGGER.info("entering while...") + key, value = self.result_queue.get() # Wait until a result is available + LOGGER.info("In while true ...") + yield key, value # Yield the result to the calling function + except KeyboardInterrupt: + LOGGER.warning("Listener stopped manually.") + finally: + self.StopListener() + + def response_listener(self, filter_key=None): + """ + Poll Kafka messages and put key-value pairs into the queue. + """ + LOGGER.info(f"Polling Kafka topic {self.listener_topic}...") + + consumer = self.kafka_consumer + consumer.subscribe([self.listener_topic]) + msg = consumer.poll(2.0) + if msg is None: + return + elif msg.error(): + if msg.error().code() != KafkaError._PARTITION_EOF: + LOGGER.error(f"Kafka error: {msg.error()}") + return + + try: + key = msg.key().decode('utf-8') if msg.key() else None + if filter_key is not None and key == filter_key: + value = json.loads(msg.value().decode('utf-8')) + LOGGER.info(f"Received key: {key}, value: {value}") + self.result_queue.put((key, value)) + else: + LOGGER.info(f"Skipping message with unmatched key: {key}") + # value = json.loads(msg.value().decode('utf-8')) # Added for debugging + # self.result_queue.put((filter_key, value)) # Added for debugging + except Exception as e: + LOGGER.error(f"Error processing Kafka message: {e}") @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def StopAnalyzer(self, @@ -118,11 +175,15 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer): ) LOGGER.info("Analyzer Stop Request Generated: Analyzer Id: {:}".format(analyzer_uuid)) self.kafka_producer.flush() - try: - ACTIVE_ANALYZERS.remove(analyzer_uuid) - except ValueError: - LOGGER.warning('Analyzer ID {:} not found in active analyzers'.format(analyzer_uuid)) + self.StopListener() + def StopListener(self): + """ + Gracefully stop the Kafka listener and the scheduler. + """ + LOGGER.info("Stopping Kafka listener...") + self.scheduler.shutdown() + LOGGER.info("Kafka listener stopped.") @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SelectAnalyzers(self, @@ -147,7 +208,7 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer): def delivery_callback(self, err, msg): if err: LOGGER.debug('Message delivery failed: {:}'.format(err)) - print('Message delivery failed: {:}'.format(err)) + print ('Message delivery failed: {:}'.format(err)) # else: # LOGGER.debug('Message delivered to topic {:}'.format(msg.topic())) # print('Message delivered to topic {:}'.format(msg.topic())) diff --git a/src/analytics/frontend/tests/test_frontend.py b/src/analytics/frontend/tests/test_frontend.py index b96116d29..d2428c01f 100644 --- a/src/analytics/frontend/tests/test_frontend.py +++ b/src/analytics/frontend/tests/test_frontend.py @@ -13,8 +13,11 @@ # limitations under the License. import os +import time +import json import pytest import logging +import threading from common.Constants import ServiceNameEnum from common.proto.context_pb2 import Empty @@ -27,6 +30,10 @@ from analytics.frontend.client.AnalyticsFrontendClient import AnalyticsFronten from analytics.frontend.service.AnalyticsFrontendService import AnalyticsFrontendService from analytics.frontend.tests.messages import ( create_analyzer_id, create_analyzer, create_analyzer_filter ) +from analytics.frontend.service.AnalyticsFrontendServiceServicerImpl import AnalyticsFrontendServiceServicerImpl +from apscheduler.schedulers.background import BackgroundScheduler +from apscheduler.triggers.interval import IntervalTrigger + ########################### # Tests Setup @@ -83,20 +90,45 @@ def test_validate_kafka_topics(): assert isinstance(response, bool) # ----- core funtionality test ----- -def test_StartAnalytics(analyticsFrontend_client): - LOGGER.info(' >>> test_StartAnalytic START: <<< ') - response = analyticsFrontend_client.StartAnalyzer(create_analyzer()) - LOGGER.debug(str(response)) - assert isinstance(response, AnalyzerId) - -def test_SelectAnalytics(analyticsFrontend_client): - LOGGER.info(' >>> test_SelectAnalytics START: <<< ') - response = analyticsFrontend_client.SelectAnalyzers(create_analyzer_filter()) +# def test_StartAnalytics(analyticsFrontend_client): +# LOGGER.info(' >>> test_StartAnalytic START: <<< ') +# response = analyticsFrontend_client.StartAnalyzer(create_analyzer()) +# LOGGER.debug(str(response)) +# assert isinstance(response, AnalyzerId) + +# To test start and stop listener together +def test_StartStopAnalyzers(analyticsFrontend_client): + LOGGER.info(' >>> test_StartStopAnalyzers START: <<< ') + LOGGER.info('--> StartAnalyzer') + added_analyzer_id = analyticsFrontend_client.StartAnalyzer(create_analyzer()) + LOGGER.debug(str(added_analyzer_id)) + LOGGER.info(' --> Calling StartResponseListener... ') + class_obj = AnalyticsFrontendServiceServicerImpl() + response = class_obj.StartResponseListener(added_analyzer_id.analyzer_id._uuid) + LOGGER.debug(response) + LOGGER.info("waiting for timer to comlete ...") + time.sleep(3) + LOGGER.info('--> StopAnalyzer') + response = analyticsFrontend_client.StopAnalyzer(added_analyzer_id) LOGGER.debug(str(response)) - assert isinstance(response, AnalyzerList) -def test_StopAnalytic(analyticsFrontend_client): - LOGGER.info(' >>> test_StopAnalytic START: <<< ') - response = analyticsFrontend_client.StopAnalyzer(create_analyzer_id()) - LOGGER.debug(str(response)) - assert isinstance(response, Empty) +# def test_SelectAnalytics(analyticsFrontend_client): +# LOGGER.info(' >>> test_SelectAnalytics START: <<< ') +# response = analyticsFrontend_client.SelectAnalyzers(create_analyzer_filter()) +# LOGGER.debug(str(response)) +# assert isinstance(response, AnalyzerList) + +# def test_StopAnalytic(analyticsFrontend_client): +# LOGGER.info(' >>> test_StopAnalytic START: <<< ') +# response = analyticsFrontend_client.StopAnalyzer(create_analyzer_id()) +# LOGGER.debug(str(response)) +# assert isinstance(response, Empty) + +# def test_ResponseListener(): +# LOGGER.info(' >>> test_ResponseListener START <<< ') +# analyzer_id = create_analyzer_id() +# LOGGER.debug("Starting Response Listener for Analyzer ID: {:}".format(analyzer_id.analyzer_id.uuid)) +# class_obj = AnalyticsFrontendServiceServicerImpl() +# for response in class_obj.StartResponseListener(analyzer_id.analyzer_id.uuid): +# LOGGER.debug(response) +# assert isinstance(response, tuple) \ No newline at end of file -- GitLab From d97e685a09c7adc768bfe1f82b4fb243b22367d7 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 13 Sep 2024 14:02:00 +0000 Subject: [PATCH 571/602] Pre-merge code cleanup and activation of Telemetry RequestListener --- deploy/kafka.sh | 2 +- src/telemetry/backend/service/TelemetryBackendService.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/deploy/kafka.sh b/deploy/kafka.sh index f86108011..0483bce15 100755 --- a/deploy/kafka.sh +++ b/deploy/kafka.sh @@ -78,7 +78,7 @@ function kafka_deploy() { echo "Apache Kafka" echo ">>> Checking if Apache Kafka is deployed ... " -if [ "$KFK_REDEPLOY" = "YES" ]; then +if [ "$KFK_REDEPLOY" == "YES" ]; then echo ">>> Redeploying kafka namespace" kafka_deploy elif kubectl get namespace "${KFK_NAMESPACE}" &> /dev/null; then diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py index bb9f0a314..95662969b 100755 --- a/src/telemetry/backend/service/TelemetryBackendService.py +++ b/src/telemetry/backend/service/TelemetryBackendService.py @@ -50,9 +50,8 @@ class TelemetryBackendService(GenericGrpcService): 'auto.offset.reset' : 'latest'}) self.running_threads = {} - def RunRequestListener(self)->bool: + def install_servicers(self): threading.Thread(target=self.RequestListener).start() - return True def RequestListener(self): """ -- GitLab From 0706f4142e35fee208f173d1dd54389c6f20843f Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 13 Sep 2024 14:10:38 +0000 Subject: [PATCH 572/602] Added missing metrics server in Telemetry Frontend --- src/telemetry/frontend/service/__main__.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/telemetry/frontend/service/__main__.py b/src/telemetry/frontend/service/__main__.py index 238619f2e..74bc6f500 100644 --- a/src/telemetry/frontend/service/__main__.py +++ b/src/telemetry/frontend/service/__main__.py @@ -13,7 +13,8 @@ # limitations under the License. import logging, signal, sys, threading -from common.Settings import get_log_level +from prometheus_client import start_http_server +from common.Settings import get_log_level, get_metrics_port from .TelemetryFrontendService import TelemetryFrontendService terminate = threading.Event() @@ -35,6 +36,10 @@ def main(): LOGGER.debug('Starting...') + # Start metrics server + metrics_port = get_metrics_port() + start_http_server(metrics_port) + grpc_service = TelemetryFrontendService() grpc_service.start() -- GitLab From 7532b59a00ac44cb3cbf579da721c31cafce75f1 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 13 Sep 2024 14:11:50 +0000 Subject: [PATCH 573/602] Pre-merge cleanup --- src/telemetry/frontend/service/__main__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/telemetry/frontend/service/__main__.py b/src/telemetry/frontend/service/__main__.py index 74bc6f500..8d80eae52 100644 --- a/src/telemetry/frontend/service/__main__.py +++ b/src/telemetry/frontend/service/__main__.py @@ -34,7 +34,7 @@ def main(): signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) - LOGGER.debug('Starting...') + LOGGER.info('Starting...') # Start metrics server metrics_port = get_metrics_port() @@ -46,10 +46,10 @@ def main(): # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=1.0): pass - LOGGER.debug('Terminating...') + LOGGER.info('Terminating...') grpc_service.stop() - LOGGER.debug('Bye') + LOGGER.info('Bye') return 0 if __name__ == '__main__': -- GitLab From 32d9a97b22620d18d557116a78d55f5442e2730c Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 13 Sep 2024 14:15:18 +0000 Subject: [PATCH 574/602] Pre-merge cleanup --- src/telemetry/frontend/service/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/telemetry/frontend/service/__main__.py b/src/telemetry/frontend/service/__main__.py index 8d80eae52..2a6c5dbcf 100644 --- a/src/telemetry/frontend/service/__main__.py +++ b/src/telemetry/frontend/service/__main__.py @@ -28,7 +28,7 @@ def main(): global LOGGER # pylint: disable=global-statement log_level = get_log_level() - logging.basicConfig(level=log_level) + logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") LOGGER = logging.getLogger(__name__) signal.signal(signal.SIGINT, signal_handler) -- GitLab From 2c1fc9c8e466f628ee5ed0920cb650614be80151 Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 13 Sep 2024 15:45:28 +0000 Subject: [PATCH 575/602] Changes in Analytic, manifest files and deployment script Deployment Script - Analytics is added in new montioring component to be deployed with TFS. - condition is added in analytics component TFS deployment script. - Analytics show logs files are added. Manifest - modifed KAFKA_ADVERTISED_LISTENERS with internal kafka service address in kafka.yml - analyticsservice.yml added. Analytics - grpc service is added in backend - Docker file for backend and frontend is added. - main file is updaed - small changes in requirements.in files Kafka Variables - get_kafka_address method logic is updated. --- deploy/all.sh | 2 +- deploy/kafka.sh | 2 +- deploy/tfs.sh | 8 +- manifests/analyticsservice.yaml | 128 ++++++++++++++++++ manifests/kafka/02-kafka.yaml | 4 +- .../run_tests_locally-telemetry-backend.sh | 4 +- scripts/show_logs_analytics_backend.sh | 27 ++++ scripts/show_logs_analytics_frontend.sh | 27 ++++ src/analytics/backend/Dockerfile | 69 ++++++++++ src/analytics/backend/requirements.in | 1 - .../service/AnalyticsBackendService.py | 8 +- src/analytics/frontend/Dockerfile | 2 +- src/analytics/frontend/requirements.in | 2 +- src/analytics/frontend/service/__main__.py | 11 +- src/common/tools/kafka/Variables.py | 11 +- 15 files changed, 283 insertions(+), 23 deletions(-) create mode 100644 manifests/analyticsservice.yaml create mode 100755 scripts/show_logs_analytics_backend.sh create mode 100755 scripts/show_logs_analytics_frontend.sh create mode 100644 src/analytics/backend/Dockerfile diff --git a/deploy/all.sh b/deploy/all.sh index e9b33b469..06b8ee701 100755 --- a/deploy/all.sh +++ b/deploy/all.sh @@ -33,7 +33,7 @@ export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device pathcomp service slice n #export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" # Uncomment to activate Monitoring Framework (new) -#export TFS_COMPONENTS="${TFS_COMPONENTS} kpi_manager kpi_value_writer kpi_value_api" +#export TFS_COMPONENTS="${TFS_COMPONENTS} kpi_manager kpi_value_writer kpi_value_api telemetry analytics" # Uncomment to activate BGP-LS Speaker #export TFS_COMPONENTS="${TFS_COMPONENTS} bgpls_speaker" diff --git a/deploy/kafka.sh b/deploy/kafka.sh index f86108011..0483bce15 100755 --- a/deploy/kafka.sh +++ b/deploy/kafka.sh @@ -78,7 +78,7 @@ function kafka_deploy() { echo "Apache Kafka" echo ">>> Checking if Apache Kafka is deployed ... " -if [ "$KFK_REDEPLOY" = "YES" ]; then +if [ "$KFK_REDEPLOY" == "YES" ]; then echo ">>> Redeploying kafka namespace" kafka_deploy elif kubectl get namespace "${KFK_NAMESPACE}" &> /dev/null; then diff --git a/deploy/tfs.sh b/deploy/tfs.sh index b756ad2d0..1dceae1c1 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -194,7 +194,7 @@ kubectl create secret generic crdb-analytics --namespace ${TFS_K8S_NAMESPACE} -- --from-literal=CRDB_SSLMODE=require printf "\n" -echo "Create secret with Apache Kafka data for KPI and Telemetry microservices" +echo "Create secret with Apache Kafka data for KPI, Telemetry and Analytics microservices" KFK_SERVER_PORT=$(kubectl --namespace ${KFK_NAMESPACE} get service kafka-service -o 'jsonpath={.spec.ports[0].port}') kubectl create secret generic kfk-kpi-data --namespace ${TFS_K8S_NAMESPACE} --type='Opaque' \ --from-literal=KFK_NAMESPACE=${KFK_NAMESPACE} \ @@ -276,7 +276,7 @@ for COMPONENT in $TFS_COMPONENTS; do if [ "$COMPONENT" == "ztp" ] || [ "$COMPONENT" == "policy" ]; then $DOCKER_BUILD -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile ./src/"$COMPONENT"/ > "$BUILD_LOG" - elif [ "$COMPONENT" == "pathcomp" ] || [ "$COMPONENT" == "telemetry" ]; then + elif [ "$COMPONENT" == "pathcomp" ] || [ "$COMPONENT" == "telemetry" ] || [ "$COMPONENT" == "analytics" ]; then BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-frontend.log" $DOCKER_BUILD -t "$COMPONENT-frontend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/frontend/Dockerfile . > "$BUILD_LOG" @@ -299,7 +299,7 @@ for COMPONENT in $TFS_COMPONENTS; do echo " Pushing Docker image to '$TFS_REGISTRY_IMAGES'..." - if [ "$COMPONENT" == "pathcomp" ] || [ "$COMPONENT" == "telemetry" ]; then + if [ "$COMPONENT" == "pathcomp" ] || [ "$COMPONENT" == "telemetry" ] || [ "$COMPONENT" == "analytics" ] ; then IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-frontend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-frontend.log" @@ -350,7 +350,7 @@ for COMPONENT in $TFS_COMPONENTS; do cp ./manifests/"${COMPONENT}"service.yaml "$MANIFEST" fi - if [ "$COMPONENT" == "pathcomp" ] || [ "$COMPONENT" == "telemetry" ]; then + if [ "$COMPONENT" == "pathcomp" ] || [ "$COMPONENT" == "telemetry" ] || [ "$COMPONENT" == "analytics" ]; then IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-frontend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}-frontend:" "$MANIFEST" | cut -d ":" -f4) sed -E -i "s#image: $GITLAB_REPO_URL/$COMPONENT-frontend:${VERSION}#image: $IMAGE_URL#g" "$MANIFEST" diff --git a/manifests/analyticsservice.yaml b/manifests/analyticsservice.yaml new file mode 100644 index 000000000..9fbdc642f --- /dev/null +++ b/manifests/analyticsservice.yaml @@ -0,0 +1,128 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: analyticsservice +spec: + selector: + matchLabels: + app: analyticsservice + #replicas: 1 + template: + metadata: + labels: + app: analyticsservice + spec: + terminationGracePeriodSeconds: 5 + containers: + - name: frontend + image: labs.etsi.org:5050/tfs/controller/analytics-frontend:latest + imagePullPolicy: Always + ports: + - containerPort: 30080 + - containerPort: 9192 + env: + - name: LOG_LEVEL + value: "INFO" + envFrom: + - secretRef: + name: crdb-analytics + - secretRef: + name: kfk-kpi-data + readinessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:30050"] + livenessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:30050"] + resources: + requests: + cpu: 250m + memory: 128Mi + limits: + cpu: 1000m + memory: 1024Mi + - name: backend + image: labs.etsi.org:5050/tfs/controller/analytics-backend:latest + imagePullPolicy: Always + ports: + - containerPort: 30090 + - containerPort: 9192 + env: + - name: LOG_LEVEL + value: "INFO" + envFrom: + - secretRef: + name: kfk-kpi-data + readinessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:30060"] + livenessProbe: + exec: + command: ["/bin/grpc_health_probe", "-addr=:30060"] + resources: + requests: + cpu: 250m + memory: 128Mi + limits: + cpu: 1000m + memory: 1024Mi +--- +apiVersion: v1 +kind: Service +metadata: + name: analyticsservice + labels: + app: analyticsservice +spec: + type: ClusterIP + selector: + app: analyticsservice + ports: + - name: frontend-grpc + protocol: TCP + port: 30080 + targetPort: 30080 + - name: backend-grpc + protocol: TCP + port: 30090 + targetPort: 30090 + - name: metrics + protocol: TCP + port: 9192 + targetPort: 9192 +--- +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: analyticsservice-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: analyticsservice + minReplicas: 1 + maxReplicas: 20 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 80 + #behavior: + # scaleDown: + # stabilizationWindowSeconds: 30 diff --git a/manifests/kafka/02-kafka.yaml b/manifests/kafka/02-kafka.yaml index 8e4562e6e..8400f5944 100644 --- a/manifests/kafka/02-kafka.yaml +++ b/manifests/kafka/02-kafka.yaml @@ -53,9 +53,9 @@ spec: - name: KAFKA_LISTENERS value: PLAINTEXT://:9092 - name: KAFKA_ADVERTISED_LISTENERS - value: PLAINTEXT://localhost:9092 + value: PLAINTEXT://kafka-service.kafka.svc.cluster.local:9092 image: wurstmeister/kafka imagePullPolicy: IfNotPresent name: kafka-broker ports: - - containerPort: 9092 \ No newline at end of file + - containerPort: 9092 diff --git a/scripts/run_tests_locally-telemetry-backend.sh b/scripts/run_tests_locally-telemetry-backend.sh index 9cf404ffc..79db05fcf 100755 --- a/scripts/run_tests_locally-telemetry-backend.sh +++ b/scripts/run_tests_locally-telemetry-backend.sh @@ -24,5 +24,5 @@ cd $PROJECTDIR/src # python3 kpi_manager/tests/test_unitary.py RCFILE=$PROJECTDIR/coverage/.coveragerc -python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ - telemetry/backend/tests/testTelemetryBackend.py +python3 -m pytest --log-level=INFO --log-cli-level=debug --verbose \ + telemetry/backend/tests/test_TelemetryBackend.py diff --git a/scripts/show_logs_analytics_backend.sh b/scripts/show_logs_analytics_backend.sh new file mode 100755 index 000000000..afb58567c --- /dev/null +++ b/scripts/show_logs_analytics_backend.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +######################################################################################################################## +# Define your deployment settings here +######################################################################################################################## + +# If not already set, set the name of the Kubernetes namespace to deploy to. +export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"} + +######################################################################################################################## +# Automated steps start here +######################################################################################################################## + +kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/analyticsservice -c backend diff --git a/scripts/show_logs_analytics_frontend.sh b/scripts/show_logs_analytics_frontend.sh new file mode 100755 index 000000000..6d3fae10b --- /dev/null +++ b/scripts/show_logs_analytics_frontend.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +######################################################################################################################## +# Define your deployment settings here +######################################################################################################################## + +# If not already set, set the name of the Kubernetes namespace to deploy to. +export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"} + +######################################################################################################################## +# Automated steps start here +######################################################################################################################## + +kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/analyticsservice -c frontend diff --git a/src/analytics/backend/Dockerfile b/src/analytics/backend/Dockerfile new file mode 100644 index 000000000..17adcd3ab --- /dev/null +++ b/src/analytics/backend/Dockerfile @@ -0,0 +1,69 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + +FROM python:3.9-slim + +# Install dependencies +RUN apt-get --yes --quiet --quiet update && \ + apt-get --yes --quiet --quiet install wget g++ git && \ + rm -rf /var/lib/apt/lists/* + +# Set Python to show logs as they occur +ENV PYTHONUNBUFFERED=0 + +# Download the gRPC health probe +RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \ + wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \ + chmod +x /bin/grpc_health_probe + +# Get generic Python packages +RUN python3 -m pip install --upgrade pip +RUN python3 -m pip install --upgrade setuptools wheel +RUN python3 -m pip install --upgrade pip-tools + +# Get common Python packages +# Note: this step enables sharing the previous Docker build steps among all the Python components +WORKDIR /var/teraflow +COPY common_requirements.in common_requirements.in +RUN pip-compile --quiet --output-file=common_requirements.txt common_requirements.in +RUN python3 -m pip install -r common_requirements.txt + +# Add common files into working directory +WORKDIR /var/teraflow/common +COPY src/common/. ./ +RUN rm -rf proto + +# Create proto sub-folder, copy .proto files, and generate Python code +RUN mkdir -p /var/teraflow/common/proto +WORKDIR /var/teraflow/common/proto +RUN touch __init__.py +COPY proto/*.proto ./ +RUN python3 -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. *.proto +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/analytics/backend +WORKDIR /var/teraflow/analytics/backend +COPY src/analytics/backend/requirements.in requirements.in +RUN pip-compile --quiet --output-file=requirements.txt requirements.in +RUN python3 -m pip install -r requirements.txt + +# Add component files into working directory +WORKDIR /var/teraflow +COPY src/analytics/__init__.py analytics/__init__.py +COPY src/analytics/backend/. analytics/backend/ + +# Start the service +ENTRYPOINT ["python", "-m", "analytics.backend.service"] diff --git a/src/analytics/backend/requirements.in b/src/analytics/backend/requirements.in index 5c2280c5d..e2917029e 100644 --- a/src/analytics/backend/requirements.in +++ b/src/analytics/backend/requirements.in @@ -12,6 +12,5 @@ # See the License for the specific language governing permissions and # limitations under the License. -java==11.0.* pyspark==3.5.2 confluent-kafka==2.3.* \ No newline at end of file diff --git a/src/analytics/backend/service/AnalyticsBackendService.py b/src/analytics/backend/service/AnalyticsBackendService.py index 1e0c8a15b..595603567 100755 --- a/src/analytics/backend/service/AnalyticsBackendService.py +++ b/src/analytics/backend/service/AnalyticsBackendService.py @@ -21,6 +21,9 @@ from analytics.backend.service.SparkStreaming import SparkStreamer from common.tools.kafka.Variables import KafkaConfig, KafkaTopic from confluent_kafka import Consumer as KafkaConsumer from confluent_kafka import KafkaError +from common.Constants import ServiceNameEnum +from common.Settings import get_service_port_grpc + LOGGER = logging.getLogger(__name__) @@ -29,6 +32,9 @@ class AnalyticsBackendService(GenericGrpcService): Class listens for ... """ def __init__(self, cls_name : str = __name__) -> None: + LOGGER.info('Init AnalyticsBackendService') + port = get_service_port_grpc(ServiceNameEnum.ANALYTICSBACKEND) + super().__init__(port, cls_name=cls_name) self.running_threads = {} # To keep track of all running analyzers self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.get_kafka_address(), 'group.id' : 'analytics-frontend', @@ -72,7 +78,7 @@ class AnalyticsBackendService(GenericGrpcService): LOGGER.error("Failed to terminate analytics backend {:}".format(e)) return False - def StartRequestListener(self)->tuple: + def install_services(self): stop_event = threading.Event() thread = threading.Thread(target=self.RequestListener, args=(stop_event,) ) diff --git a/src/analytics/frontend/Dockerfile b/src/analytics/frontend/Dockerfile index f3b8838b2..10499713f 100644 --- a/src/analytics/frontend/Dockerfile +++ b/src/analytics/frontend/Dockerfile @@ -55,7 +55,7 @@ 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/analytics/frontend -WORKDIR /var/analyticstelemetry/frontend +WORKDIR /var/teraflow/analytics/frontend COPY src/analytics/frontend/requirements.in requirements.in RUN pip-compile --quiet --output-file=requirements.txt requirements.in RUN python3 -m pip install -r requirements.txt diff --git a/src/analytics/frontend/requirements.in b/src/analytics/frontend/requirements.in index 6bf3d7c26..20000420c 100644 --- a/src/analytics/frontend/requirements.in +++ b/src/analytics/frontend/requirements.in @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -apscheduler==3.10.* # .4 +apscheduler==3.10.4 confluent-kafka==2.3.* psycopg2-binary==2.9.* SQLAlchemy==1.4.* diff --git a/src/analytics/frontend/service/__main__.py b/src/analytics/frontend/service/__main__.py index e33a4c62b..3fa2ca875 100644 --- a/src/analytics/frontend/service/__main__.py +++ b/src/analytics/frontend/service/__main__.py @@ -13,7 +13,8 @@ # limitations under the License. import logging, signal, sys, threading -from common.Settings import get_log_level +from prometheus_client import start_http_server +from common.Settings import get_log_level, get_metrics_port from .AnalyticsFrontendService import AnalyticsFrontendService @@ -28,13 +29,17 @@ def main(): global LOGGER # pylint: disable=global-statement log_level = get_log_level() - logging.basicConfig(level=log_level) + logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") LOGGER = logging.getLogger(__name__) signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) - LOGGER.debug('Starting...') + LOGGER.info('Starting...') + + # Start metrics server + metrics_port = get_metrics_port() + start_http_server(metrics_port) grpc_service = AnalyticsFrontendService() grpc_service.start() diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py index 215913c0e..fc43c3151 100644 --- a/src/common/tools/kafka/Variables.py +++ b/src/common/tools/kafka/Variables.py @@ -14,7 +14,6 @@ import logging from enum import Enum -from confluent_kafka import KafkaException from confluent_kafka.admin import AdminClient, NewTopic from common.Settings import get_setting @@ -26,11 +25,11 @@ class KafkaConfig(Enum): @staticmethod def get_kafka_address() -> str: - kafka_server_address = get_setting('KFK_SERVER_ADDRESS', default=None) - if kafka_server_address is None: - KFK_NAMESPACE = get_setting('KFK_NAMESPACE') - KFK_PORT = get_setting('KFK_SERVER_PORT') - kafka_server_address = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) + # kafka_server_address = get_setting('KFK_SERVER_ADDRESS', default=None) + # if kafka_server_address is None: + KFK_NAMESPACE = get_setting('KFK_NAMESPACE') + KFK_PORT = get_setting('KFK_SERVER_PORT') + kafka_server_address = KFK_SERVER_ADDRESS_TEMPLATE.format(KFK_NAMESPACE, KFK_PORT) return kafka_server_address @staticmethod -- GitLab From 8e0f060131795d50b5e14a1671dc96600bc272ff Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 13 Sep 2024 16:00:37 +0000 Subject: [PATCH 576/602] Analytics component: - Corrected Liveness/Readiness probes --- manifests/analyticsservice.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/manifests/analyticsservice.yaml b/manifests/analyticsservice.yaml index 9fbdc642f..0fa3ed0be 100644 --- a/manifests/analyticsservice.yaml +++ b/manifests/analyticsservice.yaml @@ -44,10 +44,10 @@ spec: name: kfk-kpi-data readinessProbe: exec: - command: ["/bin/grpc_health_probe", "-addr=:30050"] + command: ["/bin/grpc_health_probe", "-addr=:30080"] livenessProbe: exec: - command: ["/bin/grpc_health_probe", "-addr=:30050"] + command: ["/bin/grpc_health_probe", "-addr=:30080"] resources: requests: cpu: 250m @@ -69,10 +69,10 @@ spec: name: kfk-kpi-data readinessProbe: exec: - command: ["/bin/grpc_health_probe", "-addr=:30060"] + command: ["/bin/grpc_health_probe", "-addr=:30090"] livenessProbe: exec: - command: ["/bin/grpc_health_probe", "-addr=:30060"] + command: ["/bin/grpc_health_probe", "-addr=:30090"] resources: requests: cpu: 250m -- GitLab From 059027081c0ab9169594653e083a501ee2f836ce Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 13 Sep 2024 16:19:22 +0000 Subject: [PATCH 577/602] Pre-merge commit --- ... run_tests_locally-analytics-backend__.sh} | 0 scripts/run_tests_locally-telemetry-mgtDB.sh | 26 +++++++++++++++++++ src/analytics/__init__.py | 2 -- src/telemetry/database/tests/__init__.py | 14 ++++++++++ src/telemetry/frontend/tests/__init__.py | 15 +++++++++++ 5 files changed, 55 insertions(+), 2 deletions(-) rename scripts/{run_tests_locally-analytics-backend.sh => run_tests_locally-analytics-backend__.sh} (100%) create mode 100755 scripts/run_tests_locally-telemetry-mgtDB.sh create mode 100644 src/telemetry/database/tests/__init__.py create mode 100644 src/telemetry/frontend/tests/__init__.py diff --git a/scripts/run_tests_locally-analytics-backend.sh b/scripts/run_tests_locally-analytics-backend__.sh similarity index 100% rename from scripts/run_tests_locally-analytics-backend.sh rename to scripts/run_tests_locally-analytics-backend__.sh diff --git a/scripts/run_tests_locally-telemetry-mgtDB.sh b/scripts/run_tests_locally-telemetry-mgtDB.sh new file mode 100755 index 000000000..4b9a41760 --- /dev/null +++ b/scripts/run_tests_locally-telemetry-mgtDB.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + + +PROJECTDIR=`pwd` + +cd $PROJECTDIR/src +# RCFILE=$PROJECTDIR/coverage/.coveragerc +# coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \ +# kpi_manager/tests/test_unitary.py + +RCFILE=$PROJECTDIR/coverage/.coveragerc +python3 -m pytest --log-level=DEBUG --log-cli-level=debug --verbose \ + telemetry/tests/test_telemetryDB.py diff --git a/src/analytics/__init__.py b/src/analytics/__init__.py index 234a1af65..bbfc943b6 100644 --- a/src/analytics/__init__.py +++ b/src/analytics/__init__.py @@ -1,4 +1,3 @@ - # Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,4 +11,3 @@ # 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/telemetry/database/tests/__init__.py b/src/telemetry/database/tests/__init__.py new file mode 100644 index 000000000..3ee6f7071 --- /dev/null +++ b/src/telemetry/database/tests/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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/telemetry/frontend/tests/__init__.py b/src/telemetry/frontend/tests/__init__.py new file mode 100644 index 000000000..234a1af65 --- /dev/null +++ b/src/telemetry/frontend/tests/__init__.py @@ -0,0 +1,15 @@ + +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. + -- GitLab From 08b15bed236bb4b9ffa9a5ba9e08074a22a20c5b Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 13 Sep 2024 16:28:18 +0000 Subject: [PATCH 578/602] Analytics: fixed main.py --- src/analytics/backend/service/__main__.py | 17 +++++++++++------ src/analytics/frontend/service/__main__.py | 5 ++--- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/analytics/backend/service/__main__.py b/src/analytics/backend/service/__main__.py index 371b5a7ca..3c4c36b7c 100644 --- a/src/analytics/backend/service/__main__.py +++ b/src/analytics/backend/service/__main__.py @@ -13,8 +13,9 @@ # limitations under the License. import logging, signal, sys, threading -from common.Settings import get_log_level -from analytics.backend.service.AnalyticsBackendService import AnalyticsBackendService +from prometheus_client import start_http_server +from common.Settings import get_log_level, get_metrics_port +from .AnalyticsBackendService import AnalyticsBackendService terminate = threading.Event() LOGGER = None @@ -27,13 +28,17 @@ def main(): global LOGGER # pylint: disable=global-statement log_level = get_log_level() - logging.basicConfig(level=log_level) + logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") LOGGER = logging.getLogger(__name__) signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) - LOGGER.debug('Starting...') + LOGGER.info('Starting...') + + # Start metrics server + metrics_port = get_metrics_port() + start_http_server(metrics_port) grpc_service = AnalyticsBackendService() grpc_service.start() @@ -41,10 +46,10 @@ def main(): # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=1.0): pass - LOGGER.debug('Terminating...') + LOGGER.info('Terminating...') grpc_service.stop() - LOGGER.debug('Bye') + LOGGER.info('Bye') return 0 if __name__ == '__main__': diff --git a/src/analytics/frontend/service/__main__.py b/src/analytics/frontend/service/__main__.py index 3fa2ca875..6c331844f 100644 --- a/src/analytics/frontend/service/__main__.py +++ b/src/analytics/frontend/service/__main__.py @@ -17,7 +17,6 @@ from prometheus_client import start_http_server from common.Settings import get_log_level, get_metrics_port from .AnalyticsFrontendService import AnalyticsFrontendService - terminate = threading.Event() LOGGER = None @@ -47,10 +46,10 @@ def main(): # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=1.0): pass - LOGGER.debug('Terminating...') + LOGGER.info('Terminating...') grpc_service.stop() - LOGGER.debug('Bye') + LOGGER.info('Bye') return 0 if __name__ == '__main__': -- GitLab From 368cbf299b8b05e2bb7c15ed1c9ee5776ec98913 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 13 Sep 2024 16:38:46 +0000 Subject: [PATCH 579/602] Pre-merge Cosmetic changes --- .gitignore | 2 +- src/analytics/backend/requirements.in | 2 +- src/analytics/frontend/__init__.py | 1 - .../frontend/client/AnalyticsFrontendClient.py | 2 +- src/analytics/frontend/requirements.in | 2 +- .../frontend/service/AnalyticsFrontendService.py | 2 +- src/analytics/frontend/service/__init__.py | 1 - src/analytics/frontend/tests/__init__.py | 14 ++++++++++++++ src/analytics/requirements.in | 2 +- src/analytics/tests/__init__.py | 14 ++++++++++++++ src/kpi_manager/database/KpiEngine.py | 6 +----- 11 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 src/analytics/frontend/tests/__init__.py create mode 100644 src/analytics/tests/__init__.py diff --git a/.gitignore b/.gitignore index 6a53f106e..e1f87cfd3 100644 --- a/.gitignore +++ b/.gitignore @@ -178,4 +178,4 @@ libyang/ **/logs/*.log.* # PySpark checkpoints -src/analytics/.spark/* \ No newline at end of file +src/analytics/.spark/* diff --git a/src/analytics/backend/requirements.in b/src/analytics/backend/requirements.in index e2917029e..9df678fe8 100644 --- a/src/analytics/backend/requirements.in +++ b/src/analytics/backend/requirements.in @@ -13,4 +13,4 @@ # limitations under the License. pyspark==3.5.2 -confluent-kafka==2.3.* \ No newline at end of file +confluent-kafka==2.3.* diff --git a/src/analytics/frontend/__init__.py b/src/analytics/frontend/__init__.py index 234a1af65..3ee6f7071 100644 --- a/src/analytics/frontend/__init__.py +++ b/src/analytics/frontend/__init__.py @@ -1,4 +1,3 @@ - # Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/analytics/frontend/client/AnalyticsFrontendClient.py b/src/analytics/frontend/client/AnalyticsFrontendClient.py index bfa8cae45..90e95d661 100644 --- a/src/analytics/frontend/client/AnalyticsFrontendClient.py +++ b/src/analytics/frontend/client/AnalyticsFrontendClient.py @@ -65,4 +65,4 @@ class AnalyticsFrontendClient: LOGGER.debug('SelectAnalyzers: {:s}'.format(grpc_message_to_json_string(request))) response = self.stub.SelectAnalyzers(request) LOGGER.debug('SelectAnalyzers result: {:s}'.format(grpc_message_to_json_string(response))) - return response \ No newline at end of file + return response diff --git a/src/analytics/frontend/requirements.in b/src/analytics/frontend/requirements.in index 20000420c..d81b9ddbe 100644 --- a/src/analytics/frontend/requirements.in +++ b/src/analytics/frontend/requirements.in @@ -17,4 +17,4 @@ confluent-kafka==2.3.* psycopg2-binary==2.9.* SQLAlchemy==1.4.* sqlalchemy-cockroachdb==1.4.* -SQLAlchemy-Utils==0.38.* \ No newline at end of file +SQLAlchemy-Utils==0.38.* diff --git a/src/analytics/frontend/service/AnalyticsFrontendService.py b/src/analytics/frontend/service/AnalyticsFrontendService.py index e702c0144..42a7fc9b6 100644 --- a/src/analytics/frontend/service/AnalyticsFrontendService.py +++ b/src/analytics/frontend/service/AnalyticsFrontendService.py @@ -25,4 +25,4 @@ class AnalyticsFrontendService(GenericGrpcService): self.analytics_frontend_servicer = AnalyticsFrontendServiceServicerImpl() def install_servicers(self): - add_AnalyticsFrontendServiceServicer_to_server(self.analytics_frontend_servicer, self.server) \ No newline at end of file + add_AnalyticsFrontendServiceServicer_to_server(self.analytics_frontend_servicer, self.server) diff --git a/src/analytics/frontend/service/__init__.py b/src/analytics/frontend/service/__init__.py index 234a1af65..3ee6f7071 100644 --- a/src/analytics/frontend/service/__init__.py +++ b/src/analytics/frontend/service/__init__.py @@ -1,4 +1,3 @@ - # Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/) # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/analytics/frontend/tests/__init__.py b/src/analytics/frontend/tests/__init__.py new file mode 100644 index 000000000..3ee6f7071 --- /dev/null +++ b/src/analytics/frontend/tests/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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/analytics/requirements.in b/src/analytics/requirements.in index 98cf96710..8ff30ddaa 100644 --- a/src/analytics/requirements.in +++ b/src/analytics/requirements.in @@ -18,4 +18,4 @@ confluent-kafka==2.3.* psycopg2-binary==2.9.* SQLAlchemy==1.4.* sqlalchemy-cockroachdb==1.4.* -SQLAlchemy-Utils==0.38.* \ No newline at end of file +SQLAlchemy-Utils==0.38.* diff --git a/src/analytics/tests/__init__.py b/src/analytics/tests/__init__.py new file mode 100644 index 000000000..3ee6f7071 --- /dev/null +++ b/src/analytics/tests/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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/database/KpiEngine.py b/src/kpi_manager/database/KpiEngine.py index dff406de6..0fce7e3d3 100644 --- a/src/kpi_manager/database/KpiEngine.py +++ b/src/kpi_manager/database/KpiEngine.py @@ -16,8 +16,6 @@ import logging, sqlalchemy from common.Settings import get_setting LOGGER = logging.getLogger(__name__) - -# CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' class KpiEngine: @@ -33,12 +31,10 @@ class KpiEngine: CRDB_SSLMODE = get_setting('CRDB_SSLMODE') crdb_uri = CRDB_URI_TEMPLATE.format( CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) - # crdb_uri = CRDB_URI_TEMPLATE.format( - # CRDB_USERNAME, CRDB_PASSWORD, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) try: engine = sqlalchemy.create_engine(crdb_uri, echo=False) LOGGER.info(' KpiDBmanager initalized with DB URL: {:}'.format(crdb_uri)) except: # pylint: disable=bare-except # pragma: no cover LOGGER.exception('Failed to connect to database: {:s}'.format(str(crdb_uri))) return None # type: ignore - return engine + return engine -- GitLab From 25c86b1776640614d51898d710c88f1290f8f23d Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 13 Sep 2024 16:39:07 +0000 Subject: [PATCH 580/602] Added Analytics and Telemetry dynamic DB Engine configuration --- src/analytics/database/AnalyzerEngine.py | 20 ++++++++++---------- src/telemetry/database/TelemetryEngine.py | 20 +++++++++----------- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/analytics/database/AnalyzerEngine.py b/src/analytics/database/AnalyzerEngine.py index 4bed9f93a..9294e0996 100644 --- a/src/analytics/database/AnalyzerEngine.py +++ b/src/analytics/database/AnalyzerEngine.py @@ -22,19 +22,19 @@ class AnalyzerEngine: @staticmethod def get_engine() -> sqlalchemy.engine.Engine: crdb_uri = get_setting('CRDB_URI', default=None) - if crdb_uri is None: - CRDB_NAMESPACE = "crdb" - CRDB_SQL_PORT = "26257" - CRDB_DATABASE = "tfs-analyzer" - CRDB_USERNAME = "tfs" - CRDB_PASSWORD = "tfs123" - CRDB_SSLMODE = "require" + if crdb_uri is None: + CRDB_NAMESPACE = get_setting('CRDB_NAMESPACE') + CRDB_SQL_PORT = get_setting('CRDB_SQL_PORT') + CRDB_DATABASE = "tfs-analyzer" # TODO: define variable get_setting('CRDB_DATABASE_KPI_MGMT') + CRDB_USERNAME = get_setting('CRDB_USERNAME') + CRDB_PASSWORD = get_setting('CRDB_PASSWORD') + CRDB_SSLMODE = get_setting('CRDB_SSLMODE') crdb_uri = CRDB_URI_TEMPLATE.format( - CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) + CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) try: engine = sqlalchemy.create_engine(crdb_uri, echo=False) LOGGER.info(' AnalyzerDB initalized with DB URL: {:}'.format(crdb_uri)) - except: + except: # pylint: disable=bare-except # pragma: no cover LOGGER.exception('Failed to connect to database: {:s}'.format(str(crdb_uri))) - return None + return None # type: ignore return engine diff --git a/src/telemetry/database/TelemetryEngine.py b/src/telemetry/database/TelemetryEngine.py index 18ec2ddbc..7c8620faf 100644 --- a/src/telemetry/database/TelemetryEngine.py +++ b/src/telemetry/database/TelemetryEngine.py @@ -16,27 +16,25 @@ import logging, sqlalchemy from common.Settings import get_setting LOGGER = logging.getLogger(__name__) - -# CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@127.0.0.1:{:s}/{:s}?sslmode={:s}' CRDB_URI_TEMPLATE = 'cockroachdb://{:s}:{:s}@cockroachdb-public.{:s}.svc.cluster.local:{:s}/{:s}?sslmode={:s}' class TelemetryEngine: @staticmethod def get_engine() -> sqlalchemy.engine.Engine: crdb_uri = get_setting('CRDB_URI', default=None) - if crdb_uri is None: - CRDB_NAMESPACE = "crdb" - CRDB_SQL_PORT = "26257" - CRDB_DATABASE = "tfs-telemetry" - CRDB_USERNAME = "tfs" - CRDB_PASSWORD = "tfs123" - CRDB_SSLMODE = "require" + if crdb_uri is None: + CRDB_NAMESPACE = get_setting('CRDB_NAMESPACE') + CRDB_SQL_PORT = get_setting('CRDB_SQL_PORT') + CRDB_DATABASE = "tfs-telemetry" # TODO: define variable get_setting('CRDB_DATABASE_KPI_MGMT') + CRDB_USERNAME = get_setting('CRDB_USERNAME') + CRDB_PASSWORD = get_setting('CRDB_PASSWORD') + CRDB_SSLMODE = get_setting('CRDB_SSLMODE') crdb_uri = CRDB_URI_TEMPLATE.format( - CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) + CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE) try: engine = sqlalchemy.create_engine(crdb_uri, echo=False) LOGGER.info(' TelemetryDB initalized with DB URL: {:}'.format(crdb_uri)) except: # pylint: disable=bare-except # pragma: no cover LOGGER.exception('Failed to connect to database: {:s}'.format(str(crdb_uri))) return None # type: ignore - return engine # type: ignore + return engine -- GitLab From a94fe1fdfe078db28a729adf2b177f17632e5aaa Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Fri, 13 Sep 2024 16:43:13 +0000 Subject: [PATCH 581/602] Pre-merge Cosmetic changes --- src/telemetry/backend/service/__main__.py | 15 ++++++++++----- src/telemetry/frontend/service/__main__.py | 8 ++++---- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/telemetry/backend/service/__main__.py b/src/telemetry/backend/service/__main__.py index 4ad867331..9ec9e191f 100644 --- a/src/telemetry/backend/service/__main__.py +++ b/src/telemetry/backend/service/__main__.py @@ -13,7 +13,8 @@ # limitations under the License. import logging, signal, sys, threading -from common.Settings import get_log_level +from prometheus_client import start_http_server +from common.Settings import get_log_level, get_metrics_port from .TelemetryBackendService import TelemetryBackendService terminate = threading.Event() @@ -27,13 +28,17 @@ def main(): global LOGGER # pylint: disable=global-statement log_level = get_log_level() - logging.basicConfig(level=log_level) + logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") LOGGER = logging.getLogger(__name__) signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) - LOGGER.debug('Starting...') + LOGGER.info('Starting...') + + # Start metrics server + metrics_port = get_metrics_port() + start_http_server(metrics_port) grpc_service = TelemetryBackendService() grpc_service.start() @@ -41,10 +46,10 @@ def main(): # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=1.0): pass - LOGGER.debug('Terminating...') + LOGGER.info('Terminating...') grpc_service.stop() - LOGGER.debug('Bye') + LOGGER.info('Bye') return 0 if __name__ == '__main__': diff --git a/src/telemetry/frontend/service/__main__.py b/src/telemetry/frontend/service/__main__.py index 74bc6f500..2a6c5dbcf 100644 --- a/src/telemetry/frontend/service/__main__.py +++ b/src/telemetry/frontend/service/__main__.py @@ -28,13 +28,13 @@ def main(): global LOGGER # pylint: disable=global-statement log_level = get_log_level() - logging.basicConfig(level=log_level) + logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") LOGGER = logging.getLogger(__name__) signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) - LOGGER.debug('Starting...') + LOGGER.info('Starting...') # Start metrics server metrics_port = get_metrics_port() @@ -46,10 +46,10 @@ def main(): # Wait for Ctrl+C or termination signal while not terminate.wait(timeout=1.0): pass - LOGGER.debug('Terminating...') + LOGGER.info('Terminating...') grpc_service.stop() - LOGGER.debug('Bye') + LOGGER.info('Bye') return 0 if __name__ == '__main__': -- GitLab From c45dd3fe81605f4d9af86337c5fa3b30efb67199 Mon Sep 17 00:00:00 2001 From: jjdiaz Date: Mon, 16 Sep 2024 10:59:01 +0200 Subject: [PATCH 582/602] Code Cleanup --- manifests/dltservice.yaml | 44 +++++--------------------------------- src/dlt/gateway/Dockerfile | 11 +++++++--- 2 files changed, 13 insertions(+), 42 deletions(-) diff --git a/manifests/dltservice.yaml b/manifests/dltservice.yaml index 04f0921ca..64d74188b 100644 --- a/manifests/dltservice.yaml +++ b/manifests/dltservice.yaml @@ -17,11 +17,11 @@ kind: ConfigMap metadata: name: dlt-config data: - CHANNEL_NAME: "channel1" - CHAINCODE_NAME: "adrenalineDLT" - MSP_ID: "Org1MSP" - PEER_ENDPOINT: "10.1.1.96:7051" #Change to required peer# - PEER_HOST_ALIAS: "peer0.org1.adrenaline.com" + CHANNEL_NAME: "channel1" #Change according to your blockchain configuration + CHAINCODE_NAME: "adrenalineDLT" #Change according to your blockchain configuration + MSP_ID: "Org1MSP" #Change according to your blockchain configuration + PEER_ENDPOINT: "10.1.1.96:7051" #Change to required peer address according to your blockchain deployment# + PEER_HOST_ALIAS: "peer0.org1.adrenaline.com" #Change according to your blockchain configuration CRYPTO_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com" KEY_DIRECTORY_PATH: "/etc/hyperledger/fabric-keystore/keystore" CERT_DIRECTORY_PATH: "/etc/hyperledger/fabric-signcerts/signcerts.pem" @@ -83,9 +83,6 @@ spec: cpu: 700m memory: 1024Mi volumeMounts: - - mountPath: /test-network - name: dlt-volume - readOnly: true - name: keystore mountPath: /etc/hyperledger/fabric-keystore readOnly: true @@ -133,9 +130,6 @@ spec: - name: TLS_CERT_PATH value: "/etc/hyperledger/fabric-ca-crt/ca.crt" volumes: - - name: dlt-volume - persistentVolumeClaim: - claimName: dlt-pvc - name: keystore secret: secretName: dlt-keystone @@ -146,34 +140,6 @@ spec: secret: secretName: dlt-ca-crt ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: dlt-pvc -spec: - accessModes: - - ReadOnlyMany - resources: - requests: - storage: 1Gi - ---- -apiVersion: v1 -kind: PersistentVolume -metadata: - name: dlt-pv -spec: - capacity: - storage: 1Gi - accessModes: - - ReadOnlyMany - persistentVolumeReclaimPolicy: Retain - hostPath: - path: "/home/ubuntu/fabric-samples/test-network" #Update to correct host paths where the MSP is located. - claimRef: - name: dlt-pvc - --- apiVersion: v1 kind: Service diff --git a/src/dlt/gateway/Dockerfile b/src/dlt/gateway/Dockerfile index f277aa05b..78e735c09 100644 --- a/src/dlt/gateway/Dockerfile +++ b/src/dlt/gateway/Dockerfile @@ -18,14 +18,19 @@ FROM node:20 # Set the working directory in the container WORKDIR /usr/dltApp +# Create proto directory before copying the .proto files +RUN mkdir -p ./proto + # Copy package.json and package-lock.json COPY src/dlt/gateway/dltApp/package*.json ./ # Copy tsconfig.json COPY src/dlt/gateway/dltApp/tsconfig*.json ./ -# Copy the proto folder -COPY proto/context.proto ./proto -COPY proto/dlt_gateway.proto ./proto +# Copy the proto folder contents +COPY proto/acl.proto ./proto/acl.proto +COPY proto/kpi_sample_types.proto ./proto/kpi_sample_types.proto +COPY proto/context.proto ./proto/context.proto +COPY proto/dlt_gateway.proto ./proto/dlt_gateway.proto # Copy the src folder COPY src/dlt/gateway/dltApp/src/ ./src -- GitLab From 1573e9cc9c8d2f4bb095dd8884c2260d7a39acd9 Mon Sep 17 00:00:00 2001 From: jjdiaz Date: Mon, 16 Sep 2024 11:10:10 +0200 Subject: [PATCH 583/602] Code Cleanup --- manifests/dltservice.yaml | 34 ++------------------- src/dlt/gateway/dltApp/src/fabricConnect.ts | 13 ++------ 2 files changed, 5 insertions(+), 42 deletions(-) diff --git a/manifests/dltservice.yaml b/manifests/dltservice.yaml index 64d74188b..e96896489 100644 --- a/manifests/dltservice.yaml +++ b/manifests/dltservice.yaml @@ -22,7 +22,6 @@ data: MSP_ID: "Org1MSP" #Change according to your blockchain configuration PEER_ENDPOINT: "10.1.1.96:7051" #Change to required peer address according to your blockchain deployment# PEER_HOST_ALIAS: "peer0.org1.adrenaline.com" #Change according to your blockchain configuration - CRYPTO_PATH: "/test-network/organizations/peerOrganizations/org1.adrenaline.com" KEY_DIRECTORY_PATH: "/etc/hyperledger/fabric-keystore/keystore" CERT_DIRECTORY_PATH: "/etc/hyperledger/fabric-signcerts/signcerts.pem" TLS_CERT_PATH: "/etc/hyperledger/fabric-ca-crt/ca.crt" @@ -92,37 +91,10 @@ spec: - name: ca-crt mountPath: /etc/hyperledger/fabric-ca-crt readOnly: true + envFrom: + - configMapRef: + name: dlt-config env: - - name: CHANNEL_NAME - valueFrom: - configMapKeyRef: - name: dlt-config - key: CHANNEL_NAME - - name: CHAINCODE_NAME - valueFrom: - configMapKeyRef: - name: dlt-config - key: CHAINCODE_NAME - - name: MSP_ID - valueFrom: - configMapKeyRef: - name: dlt-config - key: MSP_ID - - name: PEER_ENDPOINT - valueFrom: - configMapKeyRef: - name: dlt-config - key: PEER_ENDPOINT - - name: PEER_HOST_ALIAS - valueFrom: - configMapKeyRef: - name: dlt-config - key: PEER_HOST_ALIAS - - name: CRYPTO_PATH - valueFrom: - configMapKeyRef: - name: dlt-config - key: CRYPTO_PATH - name: KEY_DIRECTORY_PATH value: "/etc/hyperledger/fabric-keystore/keystore" - name: CERT_DIRECTORY_PATH diff --git a/src/dlt/gateway/dltApp/src/fabricConnect.ts b/src/dlt/gateway/dltApp/src/fabricConnect.ts index 85ad15b2e..973fd6077 100644 --- a/src/dlt/gateway/dltApp/src/fabricConnect.ts +++ b/src/dlt/gateway/dltApp/src/fabricConnect.ts @@ -25,8 +25,6 @@ const channelName = getEnvVar('CHANNEL_NAME'); const chaincodeName = getEnvVar('CHAINCODE_NAME'); const mspId = getEnvVar('MSP_ID'); -// Path to crypto materials. -const cryptoPath = getEnvVar('CRYPTO_PATH'); // Path to user private key directory. const keyDirectoryPath = getEnvVar('KEY_DIRECTORY_PATH'); @@ -114,21 +112,15 @@ async function newGrpcConnection(): Promise { async function newIdentity(): Promise { //const certPath = await getFirstDirFileName(certDirectoryPath); - console.log("DEBUG", certDirectoryPath); + //console.log("DEBUG", certDirectoryPath); const credentials = await fs.readFile(certDirectoryPath); return { mspId, credentials }; } -//async function getFirstDirFileName(dirPath: string): Promise { - // const files = await fs.readdir(dirPath); - // const filePath = path.join(dirPath, files[0]); - // const realFilePath = await fs.readlink(filePath); - // return path.join(dirPath, realFilePath); -//} async function newSigner(): Promise { //const keyPath = await getFirstDirFileName(keyDirectoryPath); - console.log("DEBUG2", keyDirectoryPath); + //console.log("DEBUG2", keyDirectoryPath); const privateKeyPem = await fs.readFile(keyDirectoryPath); const privateKey = crypto.createPrivateKey(privateKeyPem); return signers.newPrivateKeySigner(privateKey); @@ -171,7 +163,6 @@ async function displayInputParameters(): Promise { console.log(`channelName: ${channelName}`); console.log(`chaincodeName: ${chaincodeName}`); console.log(`mspId: ${mspId}`); - console.log(`cryptoPath: ${cryptoPath}`); console.log(`keyDirectoryPath: ${keyDirectoryPath}`); console.log(`certDirectoryPath: ${certDirectoryPath}`); console.log(`tlsCertPath: ${tlsCertPath}`); -- GitLab From fe4af7af920c4d7ecccc930728011fa146e4d246 Mon Sep 17 00:00:00 2001 From: jjdiaz Date: Mon, 16 Sep 2024 11:28:41 +0200 Subject: [PATCH 584/602] Code Cleanup --- deploy/tfs.sh | 36 ++++++++++++------------------------ my_deploy.sh | 9 ++++++++- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/deploy/tfs.sh b/deploy/tfs.sh index 26ed52f82..293a56f0f 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -118,20 +118,6 @@ export PROM_EXT_PORT_HTTP=${PROM_EXT_PORT_HTTP:-"9090"} # If not already set, set the external port Grafana HTTP Dashboards will be exposed to. export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"} -# ----- HLF Key Paths ----------------------------------------------------------- - -echo "Keystore PATH" -KEY_DIRECTORY_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/keystore/priv_sk" -printf "\n" - -echo "signcerts PATH" -CERT_DIRECTORY_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/signcerts/User1@org1.adrenaline.com-cert.pem" -printf "\n" - -echo "ca.crt PATH" -TLS_CERT_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/peers/peer0.org1.adrenaline.com/tls/ca.crt" -printf "\n" - ######################################################################################################################## # Automated steps start here ######################################################################################################################## @@ -204,18 +190,20 @@ kubectl create secret generic qdb-data --namespace ${TFS_K8S_NAMESPACE} --type=' --from-literal=METRICSDB_PASSWORD=${QDB_PASSWORD} printf "\n" -echo "Create secret for HLF keystore" -kubectl create secret generic dlt-keystone --namespace ${TFS_K8S_NAMESPACE} --from-file=keystore=${KEY_DIRECTORY_PATH} -printf "\n" - -echo "Create secret for HLF signcerts" -kubectl create secret generic dlt-signcerts --namespace ${TFS_K8S_NAMESPACE} --from-file=signcerts.pem=${CERT_DIRECTORY_PATH} -printf "\n" +# Check if "dlt" is in the list of components +if [[ " ${TFS_COMPONENTS[@]} " =~ " dlt " ]]; then + echo "Create secret for HLF keystore" + kubectl create secret generic dlt-keystone --namespace ${TFS_K8S_NAMESPACE} --from-file=keystore=${KEY_DIRECTORY_PATH} + printf "\n" -echo "Create secret for HLF ca.crt" -kubectl create secret generic dlt-ca-crt --namespace ${TFS_K8S_NAMESPACE} --from-file=ca.crt=${TLS_CERT_PATH} -printf "\n" + echo "Create secret for HLF signcerts" + kubectl create secret generic dlt-signcerts --namespace ${TFS_K8S_NAMESPACE} --from-file=signcerts.pem=${CERT_DIRECTORY_PATH} + printf "\n" + echo "Create secret for HLF ca.crt" + kubectl create secret generic dlt-ca-crt --namespace ${TFS_K8S_NAMESPACE} --from-file=ca.crt=${TLS_CERT_PATH} + printf "\n" +fi echo "Deploying components and collecting environment variables..." ENV_VARS_SCRIPT=tfs_runtime_env_vars.sh diff --git a/my_deploy.sh b/my_deploy.sh index bb1816bb9..c477aef1f 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -20,7 +20,7 @@ export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/" # Set the list of components, separated by spaces, you want to build images for, and deploy. -export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_generator interdomain dlt" +export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_generator" # Uncomment to activate Monitoring (old) #export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" @@ -62,6 +62,13 @@ export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_gene # Uncomment to activate E2E Orchestrator #export TFS_COMPONENTS="${TFS_COMPONENTS} e2e_orchestrator" +# Uncomment to activate DLT +export TFS_COMPONENTS="${TFS_COMPONENTS} interdomain dlt" +export KEY_DIRECTORY_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/keystore/priv_sk" +export CERT_DIRECTORY_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/signcerts/User1@org1.adrenaline.com-cert.pem" +export TLS_CERT_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/peers/peer0.org1.adrenaline.com/tls/ca.crt" + + # Set the tag you want to use for your images. export TFS_IMAGE_TAG="dev" -- GitLab From 534ad49c336e26cd350fb38721978bf9519dd2ae Mon Sep 17 00:00:00 2001 From: jjdiaz Date: Mon, 16 Sep 2024 12:28:32 +0200 Subject: [PATCH 585/602] Code Cleanup --- manifests/dltservice.yaml | 10 +++++----- .../service/DltConnectorServiceServicerImpl.py | 2 +- src/dlt/connector/service/__main__.py | 8 ++++---- src/dlt/connector/service/tools/Checkers.py | 2 +- src/interdomain/service/__main__.py | 4 ++-- .../service/topology_abstractor/DltRecordSender.py | 3 +-- .../service/topology_abstractor/DltRecorder.py | 12 ++---------- 7 files changed, 16 insertions(+), 25 deletions(-) diff --git a/manifests/dltservice.yaml b/manifests/dltservice.yaml index e96896489..35ab9919d 100644 --- a/manifests/dltservice.yaml +++ b/manifests/dltservice.yaml @@ -51,11 +51,11 @@ spec: env: - name: LOG_LEVEL value: "INFO" - ## for debug purposes - #- name: DLT_GATEWAY_HOST - # value: "mock-blockchain.tfs-bchain.svc.cluster.local" - #- name: DLT_GATEWAY_PORT - # value: "50051" + ## for debug purposes + #- name: DLT_GATEWAY_HOST + # value: "mock-blockchain.tfs-bchain.svc.cluster.local" + #- name: DLT_GATEWAY_PORT + # value: "50051" readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:8080"] diff --git a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py index 1d4066fc9..edba01fac 100644 --- a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py +++ b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import grpc, asyncio, logging +import logging from grpc.aio import ServicerContext from typing import Optional from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method_async diff --git a/src/dlt/connector/service/__main__.py b/src/dlt/connector/service/__main__.py index f8296660e..e368f6302 100644 --- a/src/dlt/connector/service/__main__.py +++ b/src/dlt/connector/service/__main__.py @@ -13,7 +13,7 @@ # limitations under the License. -import logging, signal, sys, threading, asyncio +import logging, signal, threading, asyncio from prometheus_client import start_http_server from common.Constants import ServiceNameEnum from common.Settings import ( @@ -25,12 +25,12 @@ from .DltConnectorService import DltConnectorService terminate = threading.Event() LOGGER: logging.Logger = None -def signal_handler(signal, frame): +def signal_handler(signal, frame): # pylint: disable=redefined-outer-name LOGGER.warning('Terminate signal received') terminate.set() async def main(): - global LOGGER + global LOGGER # pylint: disable=global-statement log_level = get_log_level() logging.basicConfig(level=log_level, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s") @@ -59,7 +59,7 @@ async def main(): await grpc_service.start() # Wait for Ctrl+C or termination signal - while not terminate.wait(timeout=1.0): + while not terminate.is_set(): await asyncio.sleep(1.0) LOGGER.info('Terminating...') diff --git a/src/dlt/connector/service/tools/Checkers.py b/src/dlt/connector/service/tools/Checkers.py index 94a10d409..9afb0da07 100644 --- a/src/dlt/connector/service/tools/Checkers.py +++ b/src/dlt/connector/service/tools/Checkers.py @@ -20,5 +20,5 @@ def record_exists(record : DltRecord) -> bool: exists = exists and (record.record_id.type != DLTRECORDTYPE_UNDEFINED) exists = exists and (len(record.record_id.record_uuid.uuid) > 0) #exists = exists and (record.operation != DLTRECORDOPERATION_UNDEFINED) - #exists = exists and (len(record.data_json) > 0) + #exists = exists and (len(record.data_json) > 0) #It conflicts as sometimes records do not have a data_json. return exists diff --git a/src/interdomain/service/__main__.py b/src/interdomain/service/__main__.py index 8c392821e..4181fa73a 100644 --- a/src/interdomain/service/__main__.py +++ b/src/interdomain/service/__main__.py @@ -50,7 +50,7 @@ def main(): signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) - LOGGER.info('Starting Interdomain Service...') + LOGGER.info('Starting...') # Start metrics server metrics_port = get_metrics_port() @@ -71,7 +71,7 @@ def main(): # topology_abstractor.start() # Subscribe to Context Events - #dlt_enabled = is_dlt_enabled() + #dlt_enabled = is_dlt_enabled() #How to change the config? dlt_enabled = True if dlt_enabled: LOGGER.info('Starting DLT functionality...') diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index 2dd899be2..5605ae412 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -16,10 +16,9 @@ import logging import asyncio -from typing import Dict, List, Optional, Tuple +from typing import Dict, List, Tuple from common.proto.context_pb2 import Device, Link, Service, Slice, TopologyId from common.proto.dlt_connector_pb2 import DltDeviceId, DltLinkId, DltServiceId, DltSliceId -from common.tools.grpc.Tools import grpc_message_to_json_string from context.client.ContextClient import ContextClient from dlt.connector.client.DltConnectorClientAsync import DltConnectorClientAsync diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index 97b48628a..79067072c 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -12,21 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging -import threading -import asyncio -import time +import logging, threading, asyncio, time from typing import Dict, Optional - from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum -from common.Settings import ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_environment_variables, get_env_var_name -from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, DeviceId, EndPointId, Link, LinkId, LinkEvent, TopologyId, TopologyEvent +from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, DeviceId, LinkId, LinkEvent, TopologyId, TopologyEvent from common.tools.context_queries.Context import create_context -from common.tools.context_queries.Device import get_uuids_of_devices_in_topology -from common.tools.context_queries.Topology import create_missing_topologies from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id -from common.tools.object_factory.Device import json_device_id from common.tools.object_factory.Topology import json_topology_id from context.client.ContextClient import ContextClient from context.client.EventsCollector import EventsCollector -- GitLab From d8ea4a412f497404919cd77c54e46bbfc006e50f Mon Sep 17 00:00:00 2001 From: jjdiaz Date: Mon, 16 Sep 2024 12:43:26 +0200 Subject: [PATCH 586/602] Code Cleanup --- my_deploy.sh | 6 +++--- src/dlt/gateway/keys/.gitignore | 3 +++ src/dlt/gateway/keys/place_hls_keys_in_this_folder | 0 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 src/dlt/gateway/keys/.gitignore create mode 100644 src/dlt/gateway/keys/place_hls_keys_in_this_folder diff --git a/my_deploy.sh b/my_deploy.sh index c477aef1f..0fb205542 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -64,9 +64,9 @@ export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_gene # Uncomment to activate DLT export TFS_COMPONENTS="${TFS_COMPONENTS} interdomain dlt" -export KEY_DIRECTORY_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/keystore/priv_sk" -export CERT_DIRECTORY_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/users/User1@org1.adrenaline.com/msp/signcerts/User1@org1.adrenaline.com-cert.pem" -export TLS_CERT_PATH="${HOME}/fabric-samples/test-network/organizations/peerOrganizations/org1.adrenaline.com/peers/peer0.org1.adrenaline.com/tls/ca.crt" +export KEY_DIRECTORY_PATH="src/dlt/gateway/keys/priv_sk" +export CERT_DIRECTORY_PATH="src/dlt/gateway/keys/cert.pem" +export TLS_CERT_PATH="src/dlt/gateway/keys/ca.crt" # Set the tag you want to use for your images. diff --git a/src/dlt/gateway/keys/.gitignore b/src/dlt/gateway/keys/.gitignore new file mode 100644 index 000000000..28d89119f --- /dev/null +++ b/src/dlt/gateway/keys/.gitignore @@ -0,0 +1,3 @@ +ca.crt +cert.pem +priv_sk \ No newline at end of file diff --git a/src/dlt/gateway/keys/place_hls_keys_in_this_folder b/src/dlt/gateway/keys/place_hls_keys_in_this_folder new file mode 100644 index 000000000..e69de29bb -- GitLab From e9d0bafc1f1e862c6d02075f3764435f7aeb5246 Mon Sep 17 00:00:00 2001 From: jjdiaz Date: Mon, 16 Sep 2024 12:54:33 +0200 Subject: [PATCH 587/602] Code Cleanup --- src/dlt/gateway/README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/dlt/gateway/README.md b/src/dlt/gateway/README.md index 0ea41cd2f..ae05ed6c6 100644 --- a/src/dlt/gateway/README.md +++ b/src/dlt/gateway/README.md @@ -10,5 +10,18 @@ The chaincode is written in Go, providing a reference for the operations that ar * NodeJS * Docker -* K8s +* Kubernetes (K8s) + +Sign and TLS certificates, and private key of the MSP user from the Hyperledger Fabric deployment must be copied to the [/keys](./keys/) directory inside this repository. + Example: + + ```bash + cp ~/fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/ca.crt src/dlt/gateway/keys/ + + cp ~/fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem src/dlt/gateway/keys/cert.pem + + cp ~/fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/priv_sk src/dlt/gateway/keys/ + ``` + +These files are essential for establishing the identity and secure connection to the blockchain. Make sure you replace the paths with your actual file locations from your Hyperledger Fabric deployment. -- GitLab From 2910da0518c2978b67b4af8843641a8e9d35e1c1 Mon Sep 17 00:00:00 2001 From: jjdiaz Date: Mon, 16 Sep 2024 14:52:48 +0200 Subject: [PATCH 588/602] Code Cleanup --- .../service/topology_abstractor/DltRecordSender.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index 5605ae412..f91d6d547 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -45,27 +45,27 @@ class DltRecordSender: def add_device(self, topology_id: TopologyId, device: Device) -> None: topology_uuid = topology_id.topology_uuid.uuid device_uuid = device.device_id.device_uuid.uuid - record_uuid = f'{topology_uuid}:device:{device_uuid}' + record_uuid = '{:s}:device:{:s}'.format(topology_uuid, device_uuid) self._add_record(record_uuid, (topology_id, device)) def add_link(self, topology_id: TopologyId, link: Link) -> None: topology_uuid = topology_id.topology_uuid.uuid link_uuid = link.link_id.link_uuid.uuid - record_uuid = f'{topology_uuid}:link:{link_uuid}' + record_uuid = '{:s}:link:{:s}'.format(topology_uuid, link_uuid) self._add_record(record_uuid, (topology_id, link)) def add_service(self, topology_id: TopologyId, service: Service) -> None: topology_uuid = topology_id.topology_uuid.uuid context_uuid = service.service_id.context_id.context_uuid.uuid service_uuid = service.service_id.service_uuid.uuid - record_uuid = f'{topology_uuid}:service:{context_uuid}/{service_uuid}' + record_uuid = '{:s}:service:{:s}/{:s}'.format(topology_uuid, context_uuid, service_uuid) self._add_record(record_uuid, (topology_id, service)) def add_slice(self, topology_id: TopologyId, slice_: Slice) -> None: topology_uuid = topology_id.topology_uuid.uuid context_uuid = slice_.slice_id.context_id.context_uuid.uuid slice_uuid = slice_.slice_id.slice_uuid.uuid - record_uuid = f'{topology_uuid}:slice:{context_uuid}/{slice_uuid}' + record_uuid = '{:s}:slice:{:s}/{:s}'.format(topology_uuid, context_uuid, slice_uuid) self._add_record(record_uuid, (topology_id, slice_)) async def commit(self) -> None: @@ -83,7 +83,6 @@ class DltRecordSender: dlt_device_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member dlt_device_id.device_id.CopyFrom(device_id) # pylint: disable=no-member tasks.append(self.dlt_connector_client.RecordDevice(dlt_device_id)) -# await self.dlt_connector_client.RecordDevice(dlt_device_id) elif isinstance(dlt_record, Link): link_id = dlt_record.link_id if self.dlt_connector_client is None: continue @@ -91,7 +90,6 @@ class DltRecordSender: dlt_link_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member dlt_link_id.link_id.CopyFrom(link_id) # pylint: disable=no-member tasks.append(self.dlt_connector_client.RecordLink(dlt_link_id)) - #await self.dlt_connector_client.RecordLink(dlt_link_id) elif isinstance(dlt_record, Service): service_id = dlt_record.service_id if self.dlt_connector_client is None: continue @@ -99,7 +97,6 @@ class DltRecordSender: dlt_service_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member dlt_service_id.service_id.CopyFrom(service_id) # pylint: disable=no-member tasks.append(self.dlt_connector_client.RecordService(dlt_service_id)) - #await self.dlt_connector_client.RecordService(dlt_service_id) elif isinstance(dlt_record, Slice): slice_id = dlt_record.slice_id if self.dlt_connector_client is None: continue @@ -107,7 +104,6 @@ class DltRecordSender: dlt_slice_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member dlt_slice_id.slice_id.CopyFrom(slice_id) # pylint: disable=no-member tasks.append(self.dlt_connector_client.RecordSlice(dlt_slice_id)) - #await self.dlt_connector_client.RecordSlice(dlt_slice_id) else: LOGGER.error(f'Unsupported Record({str(dlt_record)})') -- GitLab From 67b3498800c5cebb69268c926b8186987b0323ee Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 16 Sep 2024 14:26:36 +0000 Subject: [PATCH 589/602] Pre-merge code cleanup --- hackfest/containerlab/srl.cli | 2 +- hackfest/containerlab/tfs-scenario.clab.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/hackfest/containerlab/srl.cli b/hackfest/containerlab/srl.cli index ec368cce9..7d4987e22 100644 --- a/hackfest/containerlab/srl.cli +++ b/hackfest/containerlab/srl.cli @@ -1,2 +1,2 @@ set / system management openconfig admin-state enable -set / system gnmi-server network-instance mgmt yang-models openconfig \ No newline at end of file +set / system gnmi-server network-instance mgmt yang-models openconfig diff --git a/hackfest/containerlab/tfs-scenario.clab.yml b/hackfest/containerlab/tfs-scenario.clab.yml index 7efc8cd10..c715a1a53 100644 --- a/hackfest/containerlab/tfs-scenario.clab.yml +++ b/hackfest/containerlab/tfs-scenario.clab.yml @@ -20,6 +20,7 @@ name: tfs-scenario mgmt: network: mgmt-net ipv4-subnet: 172.100.100.0/24 + topology: kinds: nokia_srlinux: -- GitLab From f70ebafaa9c626bfa8921e626c81ec5b418237b6 Mon Sep 17 00:00:00 2001 From: "agbarneo@optaresolutions.com" Date: Tue, 17 Sep 2024 08:38:41 +0000 Subject: [PATCH 590/602] Added new tests and updated version of QKDDriver2 and Tools2 --- src/device/service/drivers/qkd/QKDDriver2.py | 98 ++--- src/device/service/drivers/qkd/Tools2.py | 335 ++++++++++-------- .../test_external_qkd_retrieve_information.py | 277 ++++++++------- src/device/tests/qkd/unit/PrepareScenario.py | 112 ++++++ .../unit/retrieve_device_mock_information.py | 158 +++++---- .../qkd/unit/test_application_deployment.py | 30 ++ .../tests/qkd/unit/test_qkd_configuration.py | 228 +++++++++--- .../tests/qkd/unit/test_qkd_error_hanling.py | 88 ++++- .../qkd/unit/test_qkd_mock_connectivity.py | 2 +- .../tests/qkd/unit/test_qkd_security.py | 105 ++++-- .../tests/qkd/unit/test_qkd_subscription.py | 47 ++- .../tests/qkd/unit/test_qkd_unsubscription.py | 36 ++ .../qkd/unit/test_set_new configuration.py | 109 ++++++ 13 files changed, 1092 insertions(+), 533 deletions(-) create mode 100644 src/device/tests/qkd/unit/PrepareScenario.py create mode 100644 src/device/tests/qkd/unit/test_application_deployment.py create mode 100644 src/device/tests/qkd/unit/test_qkd_unsubscription.py create mode 100644 src/device/tests/qkd/unit/test_set_new configuration.py diff --git a/src/device/service/drivers/qkd/QKDDriver2.py b/src/device/service/drivers/qkd/QKDDriver2.py index 84d9f411e..e4d31cf2d 100644 --- a/src/device/service/drivers/qkd/QKDDriver2.py +++ b/src/device/service/drivers/qkd/QKDDriver2.py @@ -9,6 +9,8 @@ from common.method_wrappers.Decorator import MetricsPool, metered_subclass_metho from common.type_checkers.Checkers import chk_string, chk_type from device.service.driver_api._Driver import _Driver from .Tools2 import config_getter, create_connectivity_link +from device.service.driver_api._Driver import _Driver +from . import ALL_RESOURCE_KEYS LOGGER = logging.getLogger(__name__) @@ -25,49 +27,17 @@ class QKDDriver(_Driver): self.__terminate = threading.Event() self.__auth = None self.__headers = {} - self.__qkd_root = os.getenv('QKD_API_URL', '{:s}://{:s}:{:d}'.format(settings.get('scheme', 'http'), self.address, int(self.port))) + self.__qkd_root = os.getenv('QKD_API_URL', f"http://{self.address}:{self.port}") # Simplified URL management self.__timeout = int(self.settings.get('timeout', 120)) self.__node_ids = set(self.settings.get('node_ids', [])) self.__initial_data = None - # Authentication settings - self.__username = settings.get('username') - self.__password = settings.get('password') - self.__use_jwt = settings.get('use_jwt', True) # Default to True if JWT is required - self.__token = settings.get('token') - - if self.__token: - self.__headers = {'Authorization': 'Bearer ' + self.__token} - elif self.__username and self.__password: - self.__auth = HTTPBasicAuth(self.__username, self.__password) + # Optionally pass headers for authentication (e.g., JWT) + self.__headers = settings.get('headers', {}) + self.__auth = settings.get('auth', None) LOGGER.info(f"QKDDriver initialized with QKD root URL: {self.__qkd_root}") - def authenticate(self) -> bool: - if self.__use_jwt and not self.__token: - return self.__authenticate_with_jwt() - return True - - def __authenticate_with_jwt(self) -> bool: - login_url = f'{self.__qkd_root}/login' - payload = {'username': self.__username, 'password': self.__password} - - try: - LOGGER.info(f'Attempting to authenticate with JWT at {login_url}') - response = requests.post(login_url, data=payload, timeout=self.__timeout) - response.raise_for_status() - token = response.json().get('access_token') - if not token: - LOGGER.error('Failed to retrieve access token') - return False - self.__token = token # Store the token - self.__headers = {'Authorization': f'Bearer {token}'} - LOGGER.info('JWT authentication successful') - return True - except requests.exceptions.RequestException as e: - LOGGER.exception(f'JWT authentication failed: {e}') - return False - def Connect(self) -> bool: url = self.__qkd_root + '/restconf/data/etsi-qkd-sdn-node:qkd_node' with self.__lock: @@ -77,11 +47,6 @@ class QKDDriver(_Driver): return True try: - if not self.__headers and not self.__auth: - LOGGER.info("No headers or auth found, calling authenticate.") - if not self.authenticate(): - return False - LOGGER.info(f'Attempting to connect to {url} with headers {self.__headers} and timeout {self.__timeout}') response = requests.get(url, timeout=self.__timeout, verify=False, headers=self.__headers, auth=self.__auth) LOGGER.info(f'Received response: {response.status_code}, content: {response.text}') @@ -119,13 +84,12 @@ class QKDDriver(_Driver): results = [] with self.__lock: if not resource_keys: - resource_keys = ['capabilities', 'interfaces', 'links', 'endpoints', 'apps'] + resource_keys = ALL_RESOURCE_KEYS for i, resource_key in enumerate(resource_keys): chk_string(f'resource_key[{i}]', resource_key, allow_empty=False) LOGGER.info(f"Retrieving resource key: {resource_key}") resource_results = config_getter( - self.__qkd_root, resource_key, timeout=self.__timeout, headers=self.__headers, auth=self.__auth, - node_ids=self.__node_ids) + self.__qkd_root, resource_key, timeout=self.__timeout, headers=self.__headers, auth=self.__auth) results.extend(resource_results) LOGGER.info(f"Resource results for {resource_key}: {resource_results}") LOGGER.info(f"Final configuration results: {results}") @@ -133,45 +97,55 @@ class QKDDriver(_Driver): @metered_subclass_method(METRICS_POOL) def SetConfig(self, resources: List[Tuple[str, Any]]) -> List[Union[bool, Exception]]: - LOGGER.info(f"Setting configuration for resources: {resources}") results = [] - if not resources: - LOGGER.warning("No resources provided for SetConfig") + if len(resources) == 0: return results + with self.__lock: for resource_key, resource_value in resources: - LOGGER.info(f'Processing resource_key: {resource_key}, resource_value: {resource_value}') + LOGGER.info('Processing resource_key = {:s}'.format(str(resource_key))) + # Only process '/link' keys if resource_key.startswith('/link'): try: - if not isinstance(resource_value, dict): - raise TypeError(f"Expected dictionary but got {type(resource_value).__name__}") - - link_uuid = resource_value.get('uuid') - node_id_src = resource_value.get('src_qkdn_id') - interface_id_src = resource_value.get('src_interface_id') - node_id_dst = resource_value.get('dst_qkdn_id') - interface_id_dst = resource_value.get('dst_interface_id') + # Ensure resource_value is deserialized + if isinstance(resource_value, str): + resource_value = json.loads(resource_value) + + # Extract values from resource_value dictionary + link_uuid = resource_value['uuid'] + node_id_src = resource_value['src_qkdn_id'] + interface_id_src = resource_value['src_interface_id'] + node_id_dst = resource_value['dst_qkdn_id'] + interface_id_dst = resource_value['dst_interface_id'] virt_prev_hop = resource_value.get('virt_prev_hop') virt_next_hops = resource_value.get('virt_next_hops') virt_bandwidth = resource_value.get('virt_bandwidth') + # Call create_connectivity_link with the extracted values LOGGER.info(f"Creating connectivity link with UUID: {link_uuid}") - create_connectivity_link( + data = create_connectivity_link( self.__qkd_root, link_uuid, node_id_src, interface_id_src, node_id_dst, interface_id_dst, virt_prev_hop, virt_next_hops, virt_bandwidth, - headers=self.__headers, timeout=self.__timeout, auth=self.__auth + timeout=self.__timeout, auth=self.__auth ) + + # Append success result results.append(True) LOGGER.info(f"Connectivity link {link_uuid} created successfully") + except Exception as e: + # Catch and log any unhandled exceptions LOGGER.exception(f'Unhandled error processing resource_key({resource_key})') results.append(e) else: - LOGGER.error(f'Invalid resource key detected: {resource_key}') - results.append(ValueError(f'Invalid resource key: {resource_key}')) - - LOGGER.info(f"SetConfig results: {results}") + # Skip unsupported resource keys and append success + results.append(True) + + # Logging test results + LOGGER.info('Test keys: ' + str([x for x,y in resources])) + LOGGER.info('Test values: ' + str(results)) + return results @metered_subclass_method(METRICS_POOL) diff --git a/src/device/service/drivers/qkd/Tools2.py b/src/device/service/drivers/qkd/Tools2.py index ea88799f4..082e820bb 100644 --- a/src/device/service/drivers/qkd/Tools2.py +++ b/src/device/service/drivers/qkd/Tools2.py @@ -1,202 +1,251 @@ import json import logging import requests -from requests.auth import HTTPBasicAuth from typing import Dict, Optional, Set, List, Tuple, Union, Any -from requests.adapters import HTTPAdapter -from urllib3.util.retry import Retry +from device.service.driver_api._Driver import RESOURCE_ENDPOINTS, RESOURCE_INTERFACES, RESOURCE_NETWORK_INSTANCES +from . import RESOURCE_APPS, RESOURCE_LINKS, RESOURCE_CAPABILITES, RESOURCE_NODE LOGGER = logging.getLogger(__name__) -HTTP_OK_CODES = { - 200, # OK - 201, # Created - 202, # Accepted - 204, # No Content -} - -def get_request_session(retries=5, backoff_factor=1.0, status_forcelist=(500, 502, 504)): - """ - Creates a requests session with retries and backoff strategy. - """ - LOGGER.info(f"Creating request session with retries={retries}, backoff_factor={backoff_factor}, status_forcelist={status_forcelist}") - session = requests.Session() - retry = Retry( - total=retries, - read=retries, - connect=retries, - backoff_factor=backoff_factor, - status_forcelist=status_forcelist, - ) - adapter = HTTPAdapter(max_retries=retry) - session.mount('http://', adapter) - session.mount('https://', adapter) - LOGGER.info("Request session created successfully") - return session - -def find_key(resource, key): +HTTP_OK_CODES = {200, 201, 202, 204} + +def find_key(resource: Tuple[str, str], key: str) -> Any: """ Extracts a specific key from a JSON resource. """ - return json.loads(resource[1])[key] + return json.loads(resource[1]).get(key) -def verify_endpoint_existence(session, endpoint_uuid, root_url, headers): - """ - Verifies if the given endpoint exists. - """ - url = f"{root_url}/restconf/data/etsi-qkd-sdn-node:qkd_node/qkd_interfaces/qkd_interface={endpoint_uuid}" - r = session.get(url, headers=headers) - if r.status_code == 200 and r.json(): - return True - else: - LOGGER.error(f"Endpoint {endpoint_uuid} does not exist or is not accessible") - return False def config_getter( - root_url: str, resource_key: str, auth: Optional[HTTPBasicAuth] = None, timeout: Optional[int] = None, + root_url: str, resource_key: str, auth: Optional[Any] = None, timeout: Optional[int] = None, node_ids: Set[str] = set(), headers: Dict[str, str] = {} ) -> List[Tuple[str, Union[Dict[str, Any], Exception]]]: """ Fetches configuration data from a QKD node for a specified resource key. Returns a list of tuples containing the resource key and the corresponding data or exception. + The function is agnostic to authentication: headers and auth are passed from external sources. """ url = f"{root_url}/restconf/data/etsi-qkd-sdn-node:qkd_node/" - result = [] - session = get_request_session() + LOGGER.info(f"Fetching configuration for {resource_key} from {root_url}") + + try: + if resource_key in [RESOURCE_ENDPOINTS, RESOURCE_INTERFACES]: + return fetch_interfaces(url, resource_key, headers, auth, timeout) + + elif resource_key in [RESOURCE_LINKS, RESOURCE_NETWORK_INSTANCES]: + return fetch_links(url, resource_key, headers, auth, timeout) + + elif resource_key in [RESOURCE_APPS]: + return fetch_apps(url, resource_key, headers, auth, timeout) + + elif resource_key in [RESOURCE_CAPABILITES]: + return fetch_capabilities(url, resource_key, headers, auth, timeout) - LOGGER.info(f"Starting config_getter with root_url={root_url}, resource_key={resource_key}, headers={headers}") + elif resource_key in [RESOURCE_NODE]: + return fetch_node(url, resource_key, headers, auth, timeout) + else: + LOGGER.warning(f"Unknown resource key: {resource_key}") + return [(resource_key, ValueError(f"Unknown resource key: {resource_key}"))] + + except requests.exceptions.RequestException as e: + LOGGER.error(f'Error retrieving/parsing {resource_key} from {url}: {e}') + return [(resource_key, e)] + + +def fetch_interfaces(url: str, resource_key: str, headers: Dict[str, str], auth: Optional[Any], timeout: Optional[int]) -> List[Tuple[str, Union[Dict[str, Any], Exception]]]: + """ + Fetches interface data from the QKD node. Adapts to both mocked and real QKD data structures. + """ + result = [] + url += 'qkd_interfaces/' + try: - if resource_key in ['endpoints', '__endpoints__', 'interfaces']: - url += 'qkd_interfaces/' - LOGGER.info(f"Making GET request to {url} with headers: {headers}") - r = session.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) - LOGGER.info(f"Received response: {r.status_code}, content: {r.text}") - r.raise_for_status() - interfaces = r.json().get('qkd_interfaces', {}).get('qkd_interface', []) - if not interfaces: - raise KeyError('qkd_interfaces') - for interface in interfaces: - if resource_key in ['endpoints', '__endpoints__']: - endpoint_uuid = f"{interface['qkdi_att_point'].get('device', 'N/A')}:{interface['qkdi_att_point'].get('port', 'N/A')}" - resource_key_with_uuid = f"/endpoints/endpoint[{endpoint_uuid}]" - interface['uuid'] = endpoint_uuid - result.append((resource_key_with_uuid, interface)) - else: - interface_uuid = f"{interface['qkdi_att_point'].get('device', 'N/A')}:{interface['qkdi_att_point'].get('port', 'N/A')}" + r = requests.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) + r.raise_for_status() + + # Handle both real and mocked QKD response structures + response_data = r.json() + + if isinstance(response_data.get('qkd_interfaces'), dict): + interfaces = response_data.get('qkd_interfaces', {}).get('qkd_interface', []) + else: + interfaces = response_data.get('qkd_interface', []) + + for interface in interfaces: + if resource_key in [RESOURCE_ENDPOINTS]: + # Handle real QKD data format + resource_value = interface.get('qkdi_att_point', {}) + if 'device' in resource_value and 'port' in resource_value: + uuid = f"{resource_value['device']}:{resource_value['port']}" + resource_key_with_uuid = f"/endpoints/endpoint[{uuid}]" + resource_value['uuid'] = uuid + + # Add sample types (for demonstration purposes) + sample_types = {} + metric_name = 'KPISAMPLETYPE_LINK_TOTAL_CAPACITY_GBPS' + metric_id = 301 + metric_name = metric_name.lower().replace('kpisampletype_', '') + monitoring_resource_key = '{:s}/state/{:s}'.format(resource_key, metric_name) + sample_types[metric_id] = monitoring_resource_key + resource_value['sample_types'] = sample_types + + result.append((resource_key_with_uuid, resource_value)) + + else: + # Handle both real and mocked QKD formats + endpoint_value = interface.get('qkdi_att_point', {}) + if 'device' in endpoint_value and 'port' in endpoint_value: + # Real QKD data format + interface_uuid = f"{endpoint_value['device']}:{endpoint_value['port']}" interface['uuid'] = interface_uuid interface['name'] = interface_uuid - interface['enabled'] = True - resource_key_with_uuid = f"/interface[{interface['qkdi_id']}]" - result.append((resource_key_with_uuid, interface)) - - elif resource_key in ['links', '__links__', '__network_instances__', 'network_instances']: - url += 'qkd_links/' - LOGGER.info(f"Making GET request to {url} with headers: {headers}") - r = session.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) - LOGGER.info(f"Received response: {r.status_code}, content: {r.text}") + interface['enabled'] = True # Assume enabled for real data + else: + # Mocked QKD data format + interface_uuid = interface.get('uuid', f"/interface[{interface['qkdi_id']}]") + interface['uuid'] = interface_uuid + interface['name'] = interface.get('name', interface_uuid) + interface['enabled'] = interface.get('enabled', False) # Mocked enabled status + + result.append((f"/interface[{interface['qkdi_id']}]", interface)) + + except requests.RequestException as e: + LOGGER.error(f"Error fetching interfaces from {url}: {e}") + result.append((resource_key, e)) + + return result + +def fetch_links(url: str, resource_key: str, headers: Dict[str, str], auth: Optional[Any], timeout: Optional[int]) -> List[Tuple[str, Union[Dict[str, Any], Exception]]]: + """ + Fetches link data from the QKD node. Adapts to both mocked and real QKD data structures. + """ + result = [] + + if resource_key in [RESOURCE_LINKS, RESOURCE_NETWORK_INSTANCES]: + url += 'qkd_links/' + + try: + r = requests.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) r.raise_for_status() - links = r.json().get('qkd_links', {}).get('qkd_link', []) - if not links: - LOGGER.warning(f"No links found in the response for 'qkd_links'") + + # Handle real and mocked QKD data structures + links = r.json().get('qkd_links', []) for link in links: - link_type = link.get('qkdl_type', 'Direct') + # For real QKD format (QKD links returned as dictionary objects) + if isinstance(link, dict): + qkdl_id = link.get('qkdl_id') + link_type = link.get('qkdl_type', 'Direct') + + # Handle both real (PHYS, VIRT) and mocked (DIRECT) link types + if link_type == 'PHYS' or link_type == 'VIRT': + resource_key_direct = f"/link[{qkdl_id}]" + result.append((resource_key_direct, link)) + elif link_type == 'DIRECT': + # Mocked QKD format has a slightly different structure + result.append((f"/link/link[{qkdl_id}]", link)) - if resource_key == 'links': - if link_type == 'Direct': - resource_key_with_uuid = f"/link[{link['qkdl_id']}]" - result.append((resource_key_with_uuid, link)) - else: - if link_type == 'Virtual': - resource_key_with_uuid = f"/service[{link['qkdl_id']}]" - result.append((resource_key_with_uuid, link)) - - elif resource_key in ['apps', '__apps__']: - url += 'qkd_applications/' - LOGGER.info(f"Making GET request to {url} with headers: {headers}") - r = session.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) - LOGGER.info(f"Received response: {r.status_code}, content: {r.text}") - r.raise_for_status() - apps = r.json().get('qkd_applications', {}).get('qkd_app', []) - if not apps: - raise KeyError('qkd_applications') - for app in apps: - app_resource_key = f"/app[{app['app_id']}]" - result.append((app_resource_key, app)) - - elif resource_key in ['capabilities', '__capabilities__']: - url += 'qkdn_capabilities/' - LOGGER.info(f"Making GET request to {url} with headers: {headers}") - r = session.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) - LOGGER.info(f"Received response: {r.status_code}, content: {r.text}") - r.raise_for_status() - capabilities = r.json() - result.append((resource_key, capabilities)) + # For mocked QKD format (QKD links returned as lists) + elif isinstance(link, list): + for l in link: + qkdl_id = l.get('uuid') + link_type = l.get('type', 'Direct') + + if link_type == 'DIRECT': + resource_key_direct = f"/link/link[{qkdl_id}]" + result.append((resource_key_direct, l)) + + except requests.RequestException as e: + LOGGER.error(f"Error fetching links from {url}: {e}") + result.append((resource_key, e)) + + return result - elif resource_key in ['node', '__node__']: - LOGGER.info(f"Making GET request to {url} with headers: {headers}") - r = session.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) - LOGGER.info(f"Received response: {r.status_code}, content: {r.text}") - r.raise_for_status() - node = r.json().get('qkd_node', {}) - result.append((resource_key, node)) +def fetch_apps(url: str, resource_key: str, headers: Dict[str, str], auth: Optional[Any], timeout: Optional[int]) -> List[Tuple[str, Union[Dict[str, Any], Exception]]]: + """ + Fetches application data from the QKD node. + """ + result = [] + url += 'qkd_applications/' + + try: + r = requests.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) + r.raise_for_status() + + apps = r.json().get('qkd_applications', {}).get('qkd_app', []) + for app in apps: + result.append((f"/app[{app['app_id']}]", app)) + except requests.RequestException as e: + LOGGER.error(f"Error fetching applications from {url}: {e}") + result.append((resource_key, e)) + + return result - else: - LOGGER.warning(f"Unknown resource key: {resource_key}") - result.append((resource_key, ValueError(f"Unknown resource key: {resource_key}"))) - except requests.exceptions.RequestException as e: - LOGGER.error(f'Exception retrieving/parsing {resource_key} from {url}: {e}') +def fetch_capabilities(url: str, resource_key: str, headers: Dict[str, str], auth: Optional[Any], timeout: Optional[int]) -> List[Tuple[str, Union[Dict[str, Any], Exception]]]: + """ + Fetches capabilities data from the QKD node. + """ + result = [] + url += 'qkdn_capabilities/' + + try: + r = requests.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) + r.raise_for_status() + result.append((resource_key, r.json())) + except requests.RequestException as e: + LOGGER.error(f"Error fetching capabilities from {url}: {e}") result.append((resource_key, e)) + + return result + - LOGGER.info(f"config_getter results for {resource_key}: {result}") +def fetch_node(url: str, resource_key: str, headers: Dict[str, str], auth: Optional[Any], timeout: Optional[int]) -> List[Tuple[str, Union[Dict[str, Any], Exception]]]: + """ + Fetches node data from the QKD node. + """ + result = [] + + try: + r = requests.get(url, timeout=timeout, verify=False, auth=auth, headers=headers) + r.raise_for_status() + result.append((resource_key, r.json().get('qkd_node', {}))) + except requests.RequestException as e: + LOGGER.error(f"Error fetching node from {url}: {e}") + result.append((resource_key, e)) + return result + def create_connectivity_link( root_url: str, link_uuid: str, node_id_src: str, interface_id_src: str, node_id_dst: str, interface_id_dst: str, virt_prev_hop: Optional[str] = None, virt_next_hops: Optional[List[str]] = None, virt_bandwidth: Optional[int] = None, - auth: Optional[HTTPBasicAuth] = None, timeout: Optional[int] = None, headers: Dict[str, str] = {} + auth: Optional[Any] = None, timeout: Optional[int] = None, headers: Dict[str, str] = {} ) -> Union[bool, Exception]: """ Creates a connectivity link between QKD nodes using the provided parameters. """ url = f"{root_url}/restconf/data/etsi-qkd-sdn-node:qkd_node/qkd_links/" - session = get_request_session() - - # Verify that endpoints exist before creating the link - if not (verify_endpoint_existence(session, interface_id_src, root_url, headers) and - verify_endpoint_existence(session, interface_id_dst, root_url, headers)): - LOGGER.error(f"Cannot create link {link_uuid} because one or both endpoints do not exist.") - return Exception(f"Endpoint verification failed for link {link_uuid}") - - is_virtual = bool(virt_prev_hop or virt_next_hops) - + qkd_link = { 'qkdl_id': link_uuid, - 'qkdl_type': 'etsi-qkd-node-types:' + ('VIRT' if is_virtual else 'PHYS'), - 'qkdl_local': { - 'qkdn_id': node_id_src, - 'qkdi_id': interface_id_src - }, - 'qkdl_remote': { - 'qkdn_id': node_id_dst, - 'qkdi_id': interface_id_dst - } + 'qkdl_type': 'etsi-qkd-node-types:' + ('VIRT' if virt_prev_hop or virt_next_hops else 'PHYS'), + 'qkdl_local': {'qkdn_id': node_id_src, 'qkdi_id': interface_id_src}, + 'qkdl_remote': {'qkdn_id': node_id_dst, 'qkdi_id': interface_id_dst} } - if is_virtual: + if virt_prev_hop or virt_next_hops: qkd_link['virt_prev_hop'] = virt_prev_hop qkd_link['virt_next_hop'] = virt_next_hops or [] qkd_link['virt_bandwidth'] = virt_bandwidth - data = {'qkd_links': {'qkd_link': [qkd_link]}} + data = {'qkd_links': {'qkd_link': [qkd_link]}} LOGGER.info(f"Creating connectivity link with payload: {json.dumps(data)}") try: - r = session.post(url, json=data, timeout=timeout, verify=False, auth=auth, headers=headers) - LOGGER.info(f"Received response for link creation: {r.status_code}, content: {r.text}") + r = requests.post(url, json=data, timeout=timeout, verify=False, auth=auth, headers=headers) r.raise_for_status() if r.status_code in HTTP_OK_CODES: LOGGER.info(f"Link {link_uuid} created successfully.") diff --git a/src/device/tests/qkd/integration/test_external_qkd_retrieve_information.py b/src/device/tests/qkd/integration/test_external_qkd_retrieve_information.py index fdf873bdb..f2372002d 100644 --- a/src/device/tests/qkd/integration/test_external_qkd_retrieve_information.py +++ b/src/device/tests/qkd/integration/test_external_qkd_retrieve_information.py @@ -1,36 +1,32 @@ import pytest +import requests import json -import logging import os -from dotenv import load_dotenv -from src.device.service.drivers.qkd.QKDDriver import QKDDriver - -# Load environment variables from .env file -load_dotenv() - -# Set up logging -logging.basicConfig(level=logging.INFO) -LOGGER = logging.getLogger(__name__) - -class SafeJSONEncoder(json.JSONEncoder): - def default(self, obj): - if isinstance(obj, Exception): - return {'error': str(obj), 'type': type(obj).__name__} - return super().default(obj) - -# Dictionary to store retrieved information -retrieved_info = { - "config_qkd1": None, - "config_qkd2": None, - "capabilities_qkd1": None, - "capabilities_qkd2": None, - "interfaces_qkd1": None, - "interfaces_qkd2": None, - "links_qkd1": None, - "links_qkd2": None, - "state_qkd1": None, - "state_qkd2": None, -} +from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver +from src.device.service.drivers.qkd.Tools2 import ( + RESOURCE_INTERFACES, + RESOURCE_LINKS, + RESOURCE_CAPABILITES, + RESOURCE_NODE, + RESOURCE_APPS +) + +# Test ID: INT_LQ_Test_01 (QKD Node Authentication) +# Function to retrieve JWT token +def get_jwt_token(node_address, port, username, password): + """ Retrieve JWT token from a node's login endpoint if it's secured. """ + login_url = f"http://{node_address}:{port}/login" + payload = {'username': username, 'password': password} + try: + print(f"Attempting to retrieve JWT token from {login_url}...") + response = requests.post(login_url, headers={'Content-Type': 'application/x-www-form-urlencoded'}, data=payload) + response.raise_for_status() + print(f"Successfully retrieved JWT token from {login_url}") + return response.json().get('access_token') + except requests.exceptions.RequestException as e: + print(f"Failed to retrieve JWT token from {login_url}: {e}") + return None + # Environment variables for sensitive information QKD1_ADDRESS = os.getenv("QKD1_ADDRESS") @@ -39,119 +35,136 @@ PORT = os.getenv("QKD_PORT") USERNAME = os.getenv("QKD_USERNAME") PASSWORD = os.getenv("QKD_PASSWORD") +# Pytest fixture to initialize QKDDriver with token for Node 1 @pytest.fixture def driver_qkd1(): - return QKDDriver(address=QKD1_ADDRESS, port=PORT, username=USERNAME, password=PASSWORD, use_jwt=True) + token = get_jwt_token(QKD1_ADDRESS, PORT, USERNAME, PASSWORD) + headers = {'Authorization': f'Bearer {token}'} if token else {} + return QKDDriver(address=QKD1_ADDRESS, port=PORT, headers=headers) +# Pytest fixture to initialize QKDDriver with token for Node 2 @pytest.fixture def driver_qkd2(): - return QKDDriver(address=QKD2_ADDRESS, port=PORT, username=USERNAME, password=PASSWORD, use_jwt=True) - -def log_data(label, data): - """Logs data in JSON format with a label.""" - LOGGER.info(f"{label}: {json.dumps(data, indent=2, cls=SafeJSONEncoder)}") - -def get_jwt_token(driver): - """Retrieve JWT token from the driver.""" - try: - return driver._QKDDriver__headers.get('Authorization').split(' ')[1] - except (AttributeError, KeyError, TypeError): - LOGGER.error("Failed to retrieve JWT token") - return None + token = get_jwt_token(QKD2_ADDRESS, PORT, USERNAME, PASSWORD) + headers = {'Authorization': f'Bearer {token}'} if token else {} + return QKDDriver(address=QKD2_ADDRESS, port=PORT, headers=headers) +# Utility function to save data to a JSON file, filtering out non-serializable objects def save_json_file(filename, data): - """Save data to a JSON file.""" + serializable_data = filter_serializable(data) + with open(filename, 'w') as f: + json.dump(serializable_data, f, indent=2) + print(f"Saved data to {filename}") + +# Function to filter out non-serializable objects like HTTPError +def filter_serializable(data): + if isinstance(data, list): + return [filter_serializable(item) for item in data if not isinstance(item, requests.exceptions.RequestException)] + elif isinstance(data, dict): + return {key: filter_serializable(value) for key, value in data.items() if not isinstance(value, requests.exceptions.RequestException)} + return data + +# Utility function to print the retrieved data for debugging, handling errors +def print_data(label, data): try: - with open(filename, 'w') as f: - json.dump(data, f, indent=2) - LOGGER.info(f"Successfully saved {filename}") - except Exception as e: - LOGGER.error(f"Failed to save {filename}: {e}") - -def retrieve_data(driver, label, method, *args): - """Retrieve data from the driver and log it.""" + print(f"{label}: {json.dumps(data, indent=2)}") + except TypeError as e: + print(f"Error printing {label}: {e}, Data: {data}") + +# General function to retrieve and handle HTTP errors +def retrieve_data(driver_qkd, resource, resource_name): try: - data = method(*args) - log_data(label, data) + data = driver_qkd.GetConfig([resource]) + assert isinstance(data, list), f"Expected a list for {resource_name}" + assert len(data) > 0, f"No {resource_name} found in the system" return data - except Exception as e: - LOGGER.error(f"Failed to retrieve {label}: {e}") + except requests.exceptions.HTTPError as e: + print(f"HTTPError while fetching {resource_name}: {e}") + return None + except AssertionError as e: + print(f"AssertionError: {e}") return None -def test_retrieve_and_create_descriptor(driver_qkd1, driver_qkd2): - # Connect to both QKD nodes - assert driver_qkd1.Connect(), "Failed to connect to QKD1" - assert driver_qkd2.Connect(), "Failed to connect to QKD2" - - # Use the same JWT token for all requests - jwt_token = get_jwt_token(driver_qkd1) - assert jwt_token, "Failed to retrieve JWT token from QKD1" - driver_qkd2._QKDDriver__headers['Authorization'] = f'Bearer {jwt_token}' - - # Retrieve configurations - retrieved_info['config_qkd1'] = retrieve_data(driver_qkd1, "QKD1 Initial Config", driver_qkd1.GetInitialConfig) - retrieved_info['config_qkd2'] = retrieve_data(driver_qkd2, "QKD2 Initial Config", driver_qkd2.GetInitialConfig) - - # Retrieve capabilities - retrieved_info['capabilities_qkd1'] = retrieve_data(driver_qkd1, "QKD1 Capabilities", driver_qkd1.GetConfig, ['capabilities']) - retrieved_info['capabilities_qkd2'] = retrieve_data(driver_qkd2, "QKD2 Capabilities", driver_qkd2.GetConfig, ['capabilities']) - - # Retrieve interfaces - retrieved_info['interfaces_qkd1'] = retrieve_data(driver_qkd1, "QKD1 Interfaces", driver_qkd1.GetConfig, ['interfaces']) - retrieved_info['interfaces_qkd2'] = retrieve_data(driver_qkd2, "QKD2 Interfaces", driver_qkd2.GetConfig, ['interfaces']) - - # Retrieve links - retrieved_info['links_qkd1'] = retrieve_data(driver_qkd1, "QKD1 Links", driver_qkd1.GetConfig, ['links']) - retrieved_info['links_qkd2'] = retrieve_data(driver_qkd2, "QKD2 Links", driver_qkd2.GetConfig, ['links']) - - # Retrieve states - retrieved_info['state_qkd1'] = retrieve_data(driver_qkd1, "QKD1 Current State", driver_qkd1.GetState) - retrieved_info['state_qkd2'] = retrieve_data(driver_qkd2, "QKD2 Current State", driver_qkd2.GetState) - - # Save retrieved information - save_json_file('retrieved_info.json', retrieved_info) - - # Create descriptor dynamically - descriptor = { - "contexts": [{"context_id": {"context_uuid": {"uuid": "admin"}}}], - "topologies": [{"topology_id": {"topology_uuid": {"uuid": "admin"}, "context_id": {"context_uuid": {"uuid": "admin"}}}}], - "devices": [], - "links": [] +# Test ID: INT_LQ_Test_02 (QKD Node Capabilities) +def retrieve_capabilities(driver_qkd, node_name): + capabilities = retrieve_data(driver_qkd, RESOURCE_CAPABILITES, "capabilities") + if capabilities: + print_data(f"{node_name} Capabilities", capabilities) + return capabilities + +# Test ID: INT_LQ_Test_03 (QKD Interfaces) +def retrieve_interfaces(driver_qkd, node_name): + interfaces = retrieve_data(driver_qkd, RESOURCE_INTERFACES, "interfaces") + if interfaces: + print_data(f"{node_name} Interfaces", interfaces) + return interfaces + +# Test ID: INT_LQ_Test_04 (QKD Links) +def retrieve_links(driver_qkd, node_name): + links = retrieve_data(driver_qkd, RESOURCE_LINKS, "links") + if links: + print_data(f"{node_name} Links", links) + return links + +# Test ID: INT_LQ_Test_05 (QKD Link Metrics) +def retrieve_link_metrics(driver_qkd, node_name): + links = retrieve_links(driver_qkd, node_name) + if links: + for link in links: + if 'performance_metrics' in link[1]: + print_data(f"{node_name} Link Metrics", link[1]['performance_metrics']) + else: + print(f"No metrics found for link {link[0]}") + return links + +# Test ID: INT_LQ_Test_06 (QKD Applications) +def retrieve_applications(driver_qkd, node_name): + applications = retrieve_data(driver_qkd, RESOURCE_APPS, "applications") + if applications: + print_data(f"{node_name} Applications", applications) + return applications + +# Test ID: INT_LQ_Test_07 (System Health Check) +def retrieve_node_data(driver_qkd, node_name): + node_data = retrieve_data(driver_qkd, RESOURCE_NODE, "node data") + if node_data: + print_data(f"{node_name} Node Data", node_data) + return node_data + +# Main test to retrieve and save data from QKD1 and QKD2 to files +def test_retrieve_and_save_data(driver_qkd1, driver_qkd2): + # Retrieve data for QKD1 + qkd1_interfaces = retrieve_interfaces(driver_qkd1, "QKD1") + qkd1_links = retrieve_links(driver_qkd1, "QKD1") + qkd1_capabilities = retrieve_capabilities(driver_qkd1, "QKD1") + qkd1_node_data = retrieve_node_data(driver_qkd1, "QKD1") + qkd1_apps = retrieve_applications(driver_qkd1, "QKD1") + + qkd1_data = { + "interfaces": qkd1_interfaces, + "links": qkd1_links, + "capabilities": qkd1_capabilities, + "apps": qkd1_apps, + "node_data": qkd1_node_data + } + + # Save QKD1 data to file + save_json_file('qkd1_data.json', qkd1_data) + + # Retrieve data for QKD2 + qkd2_interfaces = retrieve_interfaces(driver_qkd2, "QKD2") + qkd2_links = retrieve_links(driver_qkd2, "QKD2") + qkd2_capabilities = retrieve_capabilities(driver_qkd2, "QKD2") + qkd2_node_data = retrieve_node_data(driver_qkd2, "QKD2") + qkd2_apps = retrieve_applications(driver_qkd2, "QKD2") + + qkd2_data = { + "interfaces": qkd2_interfaces, + "links": qkd2_links, + "capabilities": qkd2_capabilities, + "apps": qkd2_apps, + "node_data": qkd2_node_data } - # Add device information to descriptor - for config, token, interfaces, device_name, address in [ - (retrieved_info['config_qkd1'], jwt_token, retrieved_info['interfaces_qkd1'], "QKD1", QKD1_ADDRESS), - (retrieved_info['config_qkd2'], jwt_token, retrieved_info['interfaces_qkd2'], "QKD2", QKD2_ADDRESS) - ]: - device_info = { - "device_id": {"device_uuid": {"uuid": device_name}}, - "device_type": "qkd-node", - "device_operational_status": 0, - "device_drivers": [12], - "device_endpoints": [], - "device_config": { - "config_rules": [ - {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": address}}, - {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": PORT}}, - {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"scheme": "http", "token": token}}} - ] - } - } - descriptor['devices'].append(device_info) - - # Create links based on retrieved link data - if retrieved_info['links_qkd1'] and retrieved_info['links_qkd2']: - for link_data in retrieved_info['links_qkd1']: - link_entry = { - "link_id": {"link_uuid": {"uuid": f"QKD1/{QKD1_ADDRESS}:{PORT}==QKD2/{retrieved_info['links_qkd2'][0][1]['qkdi_status']}/{PORT}"}}, - "link_endpoint_ids": [ - {"device_id": {"device_uuid": {"uuid": "QKD1"}}, "endpoint_uuid": {"uuid": f"{QKD1_ADDRESS}:{PORT}"}}, - {"device_id": {"device_uuid": {"uuid": "QKD2"}}, "endpoint_uuid": {"uuid": f"{QKD2_ADDRESS}:{PORT}"}} - ] - } - descriptor['links'].append(link_entry) - - # Save the dynamically created descriptor - save_json_file('descriptor.json', descriptor) - log_data("Created Descriptor", descriptor) + # Save QKD2 data to file + save_json_file('qkd2_data.json', qkd2_data) diff --git a/src/device/tests/qkd/unit/PrepareScenario.py b/src/device/tests/qkd/unit/PrepareScenario.py new file mode 100644 index 000000000..3716bd444 --- /dev/null +++ b/src/device/tests/qkd/unit/PrepareScenario.py @@ -0,0 +1,112 @@ +import pytest, os, time, logging +from common.Constants import ServiceNameEnum +from common.Settings import ( + ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_HTTP, + get_env_var_name, get_service_port_http +) +from context.client.ContextClient import ContextClient +from nbi.service.rest_server.RestServer import RestServer +from nbi.service.rest_server.nbi_plugins.tfs_api import register_tfs_api +from device.client.DeviceClient import DeviceClient +from device.service.DeviceService import DeviceService +from device.service.driver_api.DriverFactory import DriverFactory +from device.service.driver_api.DriverInstanceCache import DriverInstanceCache +from device.service.drivers import DRIVERS +from device.tests.CommonObjects import CONTEXT, TOPOLOGY +from device.tests.MockService_Dependencies import MockService_Dependencies +from monitoring.client.MonitoringClient import MonitoringClient +from requests import codes as requests_codes +import requests + +# Constants +LOCAL_HOST = '127.0.0.1' +MOCKSERVICE_PORT = 8080 + +# Get dynamic port for NBI service +NBI_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_http(ServiceNameEnum.NBI) + +# Set environment variables for the NBI service host and port +os.environ[get_env_var_name(ServiceNameEnum.NBI, ENVVAR_SUFIX_SERVICE_HOST)] = str(LOCAL_HOST) +os.environ[get_env_var_name(ServiceNameEnum.NBI, ENVVAR_SUFIX_SERVICE_PORT_HTTP)] = str(NBI_SERVICE_PORT) + +# Expected status codes for requests +EXPECTED_STATUS_CODES = {requests_codes['OK'], requests_codes['CREATED'], requests_codes['ACCEPTED'], requests_codes['NO_CONTENT']} + +# Debugging output for the port number +print(f"MOCKSERVICE_PORT: {MOCKSERVICE_PORT}") +print(f"NBI_SERVICE_PORT: {NBI_SERVICE_PORT}") + +@pytest.fixture(scope='session') +def mock_service(): + _service = MockService_Dependencies(MOCKSERVICE_PORT) + _service.configure_env_vars() + _service.start() + yield _service + _service.stop() + +@pytest.fixture(scope='session') +def nbi_service_rest(mock_service): # Pass the `mock_service` as an argument if needed + _rest_server = RestServer() + register_tfs_api(_rest_server) # Register the TFS API with the REST server + _rest_server.start() + time.sleep(1) # Give time for the server to start + yield _rest_server + _rest_server.shutdown() + _rest_server.join() + +@pytest.fixture(scope='session') +def context_client(mock_service): + _client = ContextClient() + yield _client + _client.close() + +@pytest.fixture(scope='session') +def device_service(context_client, monitoring_client): + _driver_factory = DriverFactory(DRIVERS) + _driver_instance_cache = DriverInstanceCache(_driver_factory) + _service = DeviceService(_driver_instance_cache) + _service.start() + yield _service + _service.stop() + +@pytest.fixture(scope='session') +def device_client(device_service): + _client = DeviceClient() + yield _client + _client.close() + +# General request function +def do_rest_request(method, url, body=None, timeout=10, allow_redirects=True, logger=None): + # Construct the request URL with NBI service port + request_url = f"http://{LOCAL_HOST}:{NBI_SERVICE_PORT}{url}" + + # Log the request details for debugging + if logger: + msg = f"Request: {method.upper()} {request_url}" + if body: + msg += f" body={body}" + logger.warning(msg) + + # Send the request + reply = requests.request(method, request_url, timeout=timeout, json=body, allow_redirects=allow_redirects) + + # Log the response details for debugging + if logger: + logger.warning(f"Reply: {reply.text}") + + # Print status code and response for debugging instead of asserting + print(f"Status code: {reply.status_code}") + print(f"Response: {reply.text}") + + # Return the JSON response if present + if reply.content: + return reply.json() + return None + +# Function for GET requests +def do_rest_get_request(url, body=None, timeout=10, allow_redirects=True, logger=None): + return do_rest_request('get', url, body, timeout, allow_redirects, logger=logger) + +# Function for POST requests +def do_rest_post_request(url, body=None, timeout=10, allow_redirects=True, logger=None): + return do_rest_request('post', url, body, timeout, allow_redirects, logger=logger) diff --git a/src/device/tests/qkd/unit/retrieve_device_mock_information.py b/src/device/tests/qkd/unit/retrieve_device_mock_information.py index 20074924b..e869fc284 100644 --- a/src/device/tests/qkd/unit/retrieve_device_mock_information.py +++ b/src/device/tests/qkd/unit/retrieve_device_mock_information.py @@ -1,70 +1,90 @@ -import unittest -from unittest.mock import patch, MagicMock +import logging, urllib +from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME +from common.proto.context_pb2 import ContextId +from common.tools.descriptor.Loader import DescriptorLoader from context.client.ContextClient import ContextClient -from common.proto.context_pb2 import Empty - -def retrieve_descriptor_information(): - client = ContextClient() - contexts = client.ListContexts(Empty()) - topologies = client.ListTopologies(contexts.contexts[0].context_id) - devices = client.ListDevices(Empty()) - links = client.ListLinks(Empty()) - - return { - 'contexts': contexts, - 'topologies': topologies, - 'devices': devices, - 'links': links, - } - -class TestRetrieveDescriptorInformation(unittest.TestCase): - - @patch('context.client.ContextClient.ContextClient') - def test_retrieve_descriptor_information(self, MockContextClient): - # Setup mock responses - mock_client = MagicMock() - MockContextClient.return_value = mock_client - - # Mocking ListContexts response - context_mock = MagicMock() - context_mock.contexts = [MagicMock()] - context_mock.contexts[0].context_id.context_uuid.uuid = "admin" - mock_client.ListContexts.return_value = context_mock - - # Mocking ListTopologies response - topology_mock = MagicMock() - topology_mock.topologies = [MagicMock()] - topology_mock.topologies[0].topology_id.topology_uuid.uuid = "admin" - mock_client.ListTopologies.return_value = topology_mock - - # Mocking ListDevices response - device_mock = MagicMock() - device_mock.devices = [MagicMock()] - device_mock.devices[0].device_id.device_uuid.uuid = "QKD1" - device_mock.devices[0].device_type = "qkd-node" - device_mock.devices[0].device_operational_status = 0 - device_mock.devices[0].device_drivers = [12] - mock_client.ListDevices.return_value = device_mock - - # Mocking ListLinks response - link_mock = MagicMock() - link_mock.links = [MagicMock()] - link_mock.links[0].link_id.link_uuid.uuid = "QKD1/10.211.36.220:1001==QKD2/10.211.36.220:2001" - mock_client.ListLinks.return_value = link_mock - - # Call the function and verify - result = retrieve_descriptor_information() - - mock_client.ListContexts.assert_called_once_with(Empty()) - mock_client.ListTopologies.assert_called_once_with(context_mock.contexts[0].context_id) - mock_client.ListDevices.assert_called_once_with(Empty()) - mock_client.ListLinks.assert_called_once_with(Empty()) - - # Assertions to verify the expected structure - self.assertEqual(result['contexts'].contexts[0].context_id.context_uuid.uuid, "admin") - self.assertEqual(result['topologies'].topologies[0].topology_id.topology_uuid.uuid, "admin") - self.assertEqual(result['devices'].devices[0].device_id.device_uuid.uuid, "QKD1") - self.assertEqual(result['links'].links[0].link_id.link_uuid.uuid, "QKD1/10.211.36.220:1001==QKD2/10.211.36.220:2001") - -if __name__ == "__main__": - unittest.main() +from nbi.service.rest_server.RestServer import RestServer +from common.tools.object_factory.Context import json_context_id +from device.tests.qkd.unit.PrepareScenario import mock_service, nbi_service_rest, do_rest_get_request + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +JSON_ADMIN_CONTEXT_ID = json_context_id(DEFAULT_CONTEXT_NAME) +ADMIN_CONTEXT_ID = ContextId(**JSON_ADMIN_CONTEXT_ID) + + +# ----- Context -------------------------------------------------------------------------------------------------------- + +def test_rest_get_context_ids(nbi_service_rest: RestServer): # pylint: disable=redefined-outer-name, unused-argument + reply = do_rest_get_request('/tfs-api/context_ids') + print("Context IDs:", reply) + +def test_rest_get_contexts(nbi_service_rest: RestServer): # pylint: disable=redefined-outer-name, unused-argument + reply = do_rest_get_request('/tfs-api/contexts') + print("Contexts:", reply) + +def test_rest_get_context(nbi_service_rest: RestServer): # pylint: disable=redefined-outer-name, unused-argument + context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) + reply = do_rest_get_request(f'/tfs-api/context/{context_uuid}') + print("Context data:", reply) + + +# ----- Topology ------------------------------------------------------------------------------------------------------- + +def test_rest_get_topology_ids(nbi_service_rest: RestServer): # pylint: disable=redefined-outer-name, unused-argument + context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) + reply = do_rest_get_request(f'/tfs-api/context/{context_uuid}/topology_ids') + print("Topology IDs:", reply) + +def test_rest_get_topologies(nbi_service_rest: RestServer): # pylint: disable=redefined-outer-name, unused-argument + context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) + reply = do_rest_get_request(f'/tfs-api/context/{context_uuid}/topologies') + print("Topologies:", reply) + +def test_rest_get_topology(nbi_service_rest: RestServer): # pylint: disable=redefined-outer-name, unused-argument + context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) + topology_uuid = urllib.parse.quote(DEFAULT_TOPOLOGY_NAME) + reply = do_rest_get_request(f'/tfs-api/context/{context_uuid}/topology/{topology_uuid}') + print("Topology data:", reply) + + +# ----- Device --------------------------------------------------------------------------------------------------------- + +def test_rest_get_device_ids(nbi_service_rest: RestServer): # pylint: disable=redefined-outer-name, unused-argument + reply = do_rest_get_request('/tfs-api/device_ids') + print("Device IDs:", reply) + +def test_rest_get_devices(nbi_service_rest: RestServer): # pylint: disable=redefined-outer-name, unused-argument + reply = do_rest_get_request('/tfs-api/devices') + print("Devices:", reply) + + +# ----- Link ----------------------------------------------------------------------------------------------------------- + +def test_rest_get_link_ids(nbi_service_rest: RestServer): # pylint: disable=redefined-outer-name, unused-argument + reply = do_rest_get_request('/tfs-api/link_ids') + print("Link IDs:", reply) + +def test_rest_get_links(nbi_service_rest: RestServer): # pylint: disable=redefined-outer-name, unused-argument + reply = do_rest_get_request('/tfs-api/links') + print("Links:", reply) + + +# ----- Service -------------------------------------------------------------------------------------------------------- + +def test_rest_get_service_ids(nbi_service_rest: RestServer): # pylint: disable=redefined-outer-name, unused-argument + reply = do_rest_get_request('/tfs-api/link_ids') + print("Service IDs:", reply) + +def test_rest_get_topologies(nbi_service_rest: RestServer): # pylint: disable=redefined-outer-name, unused-argument + context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) + reply = do_rest_get_request(f'/tfs-api/context/{context_uuid}/services') + print("Services:", reply) + +# ----- Apps ----------------------------------------------------------------------------------------------------------- + +def test_rest_get_apps(nbi_service_rest: RestServer): # pylint: disable=redefined-outer-name, unused-argument + context_uuid = urllib.parse.quote(DEFAULT_CONTEXT_NAME) # Context ID + reply = do_rest_get_request(f'/tfs-api/context/{context_uuid}/apps') + print("Apps:", reply) diff --git a/src/device/tests/qkd/unit/test_application_deployment.py b/src/device/tests/qkd/unit/test_application_deployment.py new file mode 100644 index 000000000..005730e3b --- /dev/null +++ b/src/device/tests/qkd/unit/test_application_deployment.py @@ -0,0 +1,30 @@ +import pytest +import json +from src.device.service.drivers.qkd.QKDDriver import QKDDriver + +@pytest.fixture +def qkd_driver(): + # Initialize the QKD driver with the appropriate settings + return QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') + +def test_application_deployment(qkd_driver): + qkd_driver.Connect() + + # Application registration data + app_data = { + 'qkd_app': [ + { + 'app_id': '00000001-0001-0000-0000-000000000001', + 'client_app_id': [], + 'app_statistics': {'statistics': []}, + 'app_qos': {}, + 'backing_qkdl_id': [] + } + ] + } + + # Send a POST request to create the application + response = qkd_driver.SetConfig([('/qkd_applications/qkd_app', json.dumps(app_data))]) + + # Verify response + assert response[0] is True, "Expected application registration to succeed" diff --git a/src/device/tests/qkd/unit/test_qkd_configuration.py b/src/device/tests/qkd/unit/test_qkd_configuration.py index 179e072fa..c48799b2e 100644 --- a/src/device/tests/qkd/unit/test_qkd_configuration.py +++ b/src/device/tests/qkd/unit/test_qkd_configuration.py @@ -1,93 +1,213 @@ import pytest -from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver import json +from requests.exceptions import HTTPError +from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver +import requests +from src.device.service.drivers.qkd.Tools2 import ( + RESOURCE_INTERFACES, + RESOURCE_LINKS, + RESOURCE_ENDPOINTS, + RESOURCE_APPS, + RESOURCE_CAPABILITES, + RESOURCE_NODE +) @pytest.fixture def qkd_driver(): - return QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') + # Initialize the QKD driver with the appropriate settings, ensure correct JWT headers are included + token = "YOUR_JWT_TOKEN" # Replace with your actual JWT token + if not token: + pytest.fail("JWT token is missing. Make sure to generate a valid JWT token.") + headers = {"Authorization": f"Bearer {token}"} + return QKDDriver(address='10.211.36.220', port=11111, headers=headers) -# Deliverable Test ID: SBI_Test_03 (Initial Config Retrieval) +# Utility function to print the retrieved data for debugging +def print_data(label, data): + print(f"{label}: {json.dumps(data, indent=2)}") + +# Test ID: SBI_Test_03 (Initial Config Retrieval) def test_initial_config_retrieval(qkd_driver): qkd_driver.Connect() - # Retrieve and print initial config + # Retrieve and validate the initial configuration config = qkd_driver.GetInitialConfig() - print("Initial Config:", json.dumps(config, indent=2)) - assert isinstance(config, list) - assert len(config) > 0 - assert isinstance(config[0], tuple) - assert config[0][0] == 'qkd_node' - assert isinstance(config[0][1], dict) + # Since GetInitialConfig returns a list, adjust the assertions accordingly + assert isinstance(config, list), "Expected a list for initial config" + assert len(config) > 0, "Initial config should not be empty" + + # Output for debugging + print_data("Initial Config", config) + +# Test ID: INT_LQ_Test_05 (QKD Devices Retrieval) +def test_retrieve_devices(qkd_driver): + qkd_driver.Connect() + + # Retrieve and validate device information + devices = qkd_driver.GetConfig([RESOURCE_NODE]) + assert isinstance(devices, list), "Expected a list of devices" + + if not devices: + pytest.skip("No devices found in the system. Skipping device test.") + + for device in devices: + assert isinstance(device, tuple), "Each device entry must be a tuple" + assert isinstance(device[1], dict), "Device data must be a dictionary" + if isinstance(device[1], Exception): + pytest.fail(f"Error retrieving devices: {device[1]}") + + # Output for debugging + print_data("Devices", devices) -# Deliverable Test ID: INT_LQ_Test_04 (QKD Links Retrieval) +# Test ID: INT_LQ_Test_04 (QKD Links Retrieval) def test_retrieve_links(qkd_driver): qkd_driver.Connect() + + try: + # Fetch the links using the correct resource key + links = qkd_driver.GetConfig([RESOURCE_LINKS]) + assert isinstance(links, list), "Expected a list of tuples (resource key, data)." + + if len(links) == 0: + pytest.skip("No links found in the system, skipping link validation.") + + for link in links: + assert isinstance(link, tuple), "Each link entry must be a tuple" + resource_key, link_data = link # Unpack the tuple + + # Handle HTTPError or exception in the response + if isinstance(link_data, requests.exceptions.HTTPError): + pytest.fail(f"Failed to retrieve links due to HTTP error: {link_data}") + + if isinstance(link_data, dict): + # For real QKD data (links as dictionaries) + assert 'qkdl_id' in link_data, "Missing 'qkdl_id' in link data" + assert 'qkdl_local' in link_data, "Missing 'qkdl_local' in link data" + assert 'qkdl_remote' in link_data, "Missing 'qkdl_remote' in link data" + assert 'qkdl_type' in link_data, "Missing 'qkdl_type' in link data" + + # Check 'virt_prev_hop' only for virtual links (VIRT) + if link_data['qkdl_type'] == 'etsi-qkd-node-types:VIRT': + virt_prev_hop = link_data.get('virt_prev_hop') + assert virt_prev_hop is None or re.match(r'[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}', str(virt_prev_hop)), \ + f"Invalid 'virt_prev_hop': {virt_prev_hop}" + + # Print out the link details for debugging + print(f"Link ID: {link_data['qkdl_id']}") + print(f"Link Type: {link_data['qkdl_type']}") + print(f"Local QKD: {json.dumps(link_data['qkdl_local'], indent=2)}") + print(f"Remote QKD: {json.dumps(link_data['qkdl_remote'], indent=2)}") + + elif isinstance(link_data, list): + # For mocked QKD data (links as lists of dictionaries) + for mock_link in link_data: + assert 'uuid' in mock_link, "Missing 'uuid' in mocked link data" + assert 'src_qkdn_id' in mock_link, "Missing 'src_qkdn_id' in mocked link data" + assert 'dst_qkdn_id' in mock_link, "Missing 'dst_qkdn_id' in mocked link data" + + # Print out the mocked link details for debugging + print(f"Mock Link ID: {mock_link['uuid']}") + print(f"Source QKD ID: {mock_link['src_qkdn_id']}") + print(f"Destination QKD ID: {mock_link['dst_qkdn_id']}") + + else: + pytest.fail(f"Unexpected link data format: {type(link_data)}") + + except HTTPError as e: + pytest.fail(f"HTTP error occurred while retrieving links: {e}") + except Exception as e: + pytest.fail(f"An unexpected error occurred: {e}") + +# Test for QKD Services +def test_retrieve_services(qkd_driver): + qkd_driver.Connect() + services = qkd_driver.GetConfig([RESOURCE_ENDPOINTS]) + assert isinstance(services, list), "Expected a list of services" + + if not services: + pytest.skip("No services found in the system. Skipping service test.") + + for service in services: + assert isinstance(service, tuple), "Each service entry must be a tuple" + assert isinstance(service[1], dict), "Service data must be a dictionary" + if isinstance(service[1], Exception): + pytest.fail(f"Error retrieving services: {service[1]}") + + print("Services:", json.dumps(services, indent=2)) + +# Test ID: INT_LQ_Test_07 (QKD Applications Retrieval) +def test_retrieve_applications(qkd_driver): + qkd_driver.Connect() - # Retrieve and print link information - links = qkd_driver.GetConfig(['links']) + # Retrieve and validate applications information + applications = qkd_driver.GetConfig([RESOURCE_APPS]) # Adjust to fetch applications using the correct key + assert isinstance(applications, list), "Expected a list of applications" - if not links: - pytest.fail("No links found in the system.") + if not applications: + pytest.skip("No applications found in the system. Skipping applications test.") - if isinstance(links[0][1], Exception): - print(f"Error retrieving links: {links[0][1]}") - else: - print("Links:", json.dumps(links, indent=2)) + for app in applications: + assert isinstance(app, tuple), "Each application entry must be a tuple" + assert isinstance(app[1], dict), "Application data must be a dictionary" + if isinstance(app[1], Exception): + pytest.fail(f"Error retrieving applications: {app[1]}") - assert isinstance(links, list) - assert len(links) > 0 + # Output for debugging + print_data("Applications", applications) -# Deliverable Test ID: INT_LQ_Test_03 (QKD Interfaces Retrieval) +# Test ID: INT_LQ_Test_03 (QKD Interfaces Retrieval) def test_retrieve_interfaces(qkd_driver): qkd_driver.Connect() - # Retrieve and print interface information - interfaces = qkd_driver.GetConfig(['interfaces']) + # Retrieve and validate interface information + interfaces = qkd_driver.GetConfig([RESOURCE_INTERFACES]) - if not interfaces: - pytest.fail("No interfaces found in the system.") + assert isinstance(interfaces, list), "Expected a list of interfaces" + assert len(interfaces) > 0, "No interfaces found in the system" - if isinstance(interfaces[0][1], Exception): - print(f"Error retrieving interfaces: {interfaces[0][1]}") - else: - print("Interfaces:", json.dumps(interfaces, indent=2)) + for interface in interfaces: + assert isinstance(interface, tuple), "Each interface entry must be a tuple" + assert isinstance(interface[1], dict), "Interface data must be a dictionary" + if isinstance(interface[1], Exception): + pytest.fail(f"Error retrieving interfaces: {interface[1]}") - assert isinstance(interfaces, list) - assert len(interfaces) > 0 + # Output for debugging + print_data("Interfaces", interfaces) -# Deliverable Test ID: INT_LQ_Test_02 (QKD Capabilities Retrieval) +# Test ID: INT_LQ_Test_02 (QKD Capabilities Retrieval) def test_retrieve_capabilities(qkd_driver): qkd_driver.Connect() - # Retrieve and print capabilities information - capabilities = qkd_driver.GetConfig(['capabilities']) + # Retrieve and validate capabilities information + capabilities = qkd_driver.GetConfig([RESOURCE_CAPABILITES]) - if not capabilities: - pytest.fail("No capabilities found in the system.") + assert isinstance(capabilities, list), "Expected a list of capabilities" + assert len(capabilities) > 0, "No capabilities found in the system" - if isinstance(capabilities[0][1], Exception): - print(f"Error retrieving capabilities: {capabilities[0][1]}") - else: - print("Capabilities:", json.dumps(capabilities, indent=2)) + for capability in capabilities: + assert isinstance(capability, tuple), "Each capability entry must be a tuple" + assert isinstance(capability[1], dict), "Capability data must be a dictionary" + if isinstance(capability[1], Exception): + pytest.fail(f"Error retrieving capabilities: {capability[1]}") - assert isinstance(capabilities, list) - assert len(capabilities) > 0 + # Output for debugging + print_data("Capabilities", capabilities) -# Deliverable Test ID: INT_LQ_Test_03 (QKD Endpoints Retrieval) +# Test ID: INT_LQ_Test_03 (QKD Endpoints Retrieval) def test_retrieve_endpoints(qkd_driver): qkd_driver.Connect() - # Retrieve and print endpoint information - endpoints = qkd_driver.GetConfig(['endpoints']) + # Retrieve and validate endpoint information + endpoints = qkd_driver.GetConfig([RESOURCE_ENDPOINTS]) - if not endpoints: - pytest.fail("No endpoints found in the system.") + assert isinstance(endpoints, list), "Expected a list of endpoints" + assert len(endpoints) > 0, "No endpoints found in the system" - if isinstance(endpoints[0][1], Exception): - print(f"Error retrieving endpoints: {endpoints[0][1]}") - else: - print("Endpoints:", json.dumps(endpoints, indent=2)) + for endpoint in endpoints: + assert isinstance(endpoint, tuple), "Each endpoint entry must be a tuple" + assert isinstance(endpoint[1], dict), "Endpoint data must be a dictionary" + if isinstance(endpoint[1], Exception): + pytest.fail(f"Error retrieving endpoints: {endpoint[1]}") - assert isinstance(endpoints, list) - assert len(endpoints) > 0 + # Output for debugging + print_data("Endpoints", endpoints) diff --git a/src/device/tests/qkd/unit/test_qkd_error_hanling.py b/src/device/tests/qkd/unit/test_qkd_error_hanling.py index a053e819d..2fbfa4a15 100644 --- a/src/device/tests/qkd/unit/test_qkd_error_hanling.py +++ b/src/device/tests/qkd/unit/test_qkd_error_hanling.py @@ -1,22 +1,78 @@ -import json import pytest +from requests.exceptions import HTTPError from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver +from requests.exceptions import ConnectionError, Timeout +import requests -def test_error_handling_invalid_operations(): - driver = QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') - driver.Connect() - result = driver.SetConfig([('/invalid/resource', json.dumps({'invalid': 'data'}))]) +@pytest.fixture +def qkd_driver(): + # Initialize the QKD driver for testing + return QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') - # Print the result for debugging purposes - print("Result of SetConfig with invalid data:", result) +def test_invalid_operations_on_network_links(qkd_driver): + """ + Test Case ID: SBI_Test_09 - Perform invalid operations and validate error handling. + Objective: Perform invalid operations on network links and ensure proper error handling and logging. + """ + qkd_driver.Connect() - # Check if the result contains ValueError for invalid resource keys - assert all(isinstance(res, ValueError) for res in result), "Expected ValueError for invalid operations" + # Step 1: Perform invalid operation with an incorrect resource key + invalid_payload = { + "invalid_resource_key": { + "invalid_field": "invalid_value" + } + } -def test_network_failure(): - driver = QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') - driver.Connect() - # Simulate network failure by disconnecting the mock server - # This would require mock server modification to simulate downtime - result = driver.GetConfig(['/qkd_interfaces/qkd_interface']) - assert result == [] # Expecting an empty list instead of None + try: + # Attempt to perform an invalid operation (simulate wrong resource key) + response = requests.post(f'http://{qkd_driver.address}/invalid_resource', json=invalid_payload) + response.raise_for_status() + + except HTTPError as e: + # Step 2: Validate proper error handling and user-friendly messages + print(f"Handled HTTPError: {e}") + assert e.response.status_code in [400, 404], "Expected 400 Bad Request or 404 Not Found for invalid operation." + if e.response.status_code == 404: + assert "Not Found" in e.response.text, "Expected user-friendly 'Not Found' message." + elif e.response.status_code == 400: + assert "Invalid resource key" in e.response.text, "Expected user-friendly 'Bad Request' message." + + except Exception as e: + # Log unexpected exceptions + pytest.fail(f"Unexpected error occurred: {e}") + + finally: + qkd_driver.Disconnect() + +def test_network_failure_simulation(qkd_driver): + """ + Test Case ID: SBI_Test_10 - Simulate network failures and validate resilience and recovery. + Objective: Simulate network failures (e.g., QKD node downtime) and validate system's resilience. + """ + qkd_driver.Connect() + + try: + # Step 1: Simulate network failure (disconnect QKD node, or use unreachable address/port) + qkd_driver_with_failure = QKDDriver(address='10.211.36.220', port=12345, username='user', password='pass') # Valid but incorrect port + + # Try to connect and retrieve state, expecting a failure + response = qkd_driver_with_failure.GetState() + + # Step 2: Validate resilience and recovery mechanisms + # Check if the response is empty, indicating a failure to retrieve state + if not response: + print("Network failure simulated successfully and handled.") + else: + pytest.fail("Expected network failure but received a valid response.") + + except HTTPError as e: + # Log HTTP errors as part of error handling + print(f"Handled network failure error: {e}") + + except Exception as e: + # Step 3: Log unexpected exceptions + print(f"Network failure encountered: {e}") + + finally: + # Step 4: Ensure driver disconnects properly + qkd_driver.Disconnect() diff --git a/src/device/tests/qkd/unit/test_qkd_mock_connectivity.py b/src/device/tests/qkd/unit/test_qkd_mock_connectivity.py index 49afc8efd..0874675c0 100644 --- a/src/device/tests/qkd/unit/test_qkd_mock_connectivity.py +++ b/src/device/tests/qkd/unit/test_qkd_mock_connectivity.py @@ -1,6 +1,6 @@ import pytest from unittest.mock import patch -from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver +from src.device.service.drivers.qkd.QKDDriver import QKDDriver import requests @pytest.fixture diff --git a/src/device/tests/qkd/unit/test_qkd_security.py b/src/device/tests/qkd/unit/test_qkd_security.py index a9602c783..389a5fc1a 100644 --- a/src/device/tests/qkd/unit/test_qkd_security.py +++ b/src/device/tests/qkd/unit/test_qkd_security.py @@ -1,45 +1,72 @@ -# test_qkd_security.py - -import os import pytest -import requests -import jwt +import json +import os +from requests.exceptions import HTTPError from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver +from src.device.service.drivers.qkd.Tools2 import RESOURCE_CAPABILITES +import requests + +# Helper function to print data in a formatted JSON style for debugging +def print_data(label, data): + print(f"{label}: {json.dumps(data, indent=2)}") -SECRET_KEY = "your_secret_key" +# Environment variables for sensitive information +QKD1_ADDRESS = os.getenv("QKD1_ADDRESS") +PORT = os.getenv("QKD_PORT") +USERNAME = os.getenv("QKD_USERNAME") +PASSWORD = os.getenv("QKD_PASSWORD") -def generate_jwt_token(username: str) -> str: - return jwt.encode({'username': username}, SECRET_KEY, algorithm='HS256') -@pytest.fixture() -def enable_bypass_auth(request): - # Backup the original value of BYPASS_AUTH - original_bypass_auth = os.getenv('BYPASS_AUTH') - # Set BYPASS_AUTH to true for the test - os.environ['BYPASS_AUTH'] = 'true' +# Utility function to retrieve JWT token +def get_jwt_token(address, port, username, password): + url = f"http://{address}:{port}/login" + headers = {"Content-Type": "application/x-www-form-urlencoded"} + payload = f"username={username}&password={password}" - def restore_bypass_auth(): - # Restore the original value of BYPASS_AUTH - if original_bypass_auth is not None: - os.environ['BYPASS_AUTH'] = original_bypass_auth - else: - del os.environ['BYPASS_AUTH'] - - # Add the finalizer to restore the environment variable after the test - request.addfinalizer(restore_bypass_auth) - -@pytest.mark.usefixtures("enable_bypass_auth") -def test_authentication(): - token = generate_jwt_token('wrong_user') - driver = QKDDriver(address='10.211.36.220', port=11111, token=token) - assert driver.Connect() is False - -@pytest.mark.usefixtures("enable_bypass_auth") -def test_authorization(): - token = generate_jwt_token('user') - driver = QKDDriver(address='10.211.36.220', port=11111, token=token) - assert driver.Connect() is True - wrong_token = generate_jwt_token('wrong_user') - headers = {'Authorization': 'Bearer ' + wrong_token} - response = requests.get('http://10.211.36.220:11111/restconf/data/etsi-qkd-sdn-node:qkd_node', headers=headers) - assert response.status_code == 401 + try: + response = requests.post(url, data=payload, headers=headers) + response.raise_for_status() + return response.json().get('access_token') + except requests.exceptions.RequestException as e: + print(f"Failed to retrieve JWT token: {e}") + return None + +# Real QKD Driver (Requires JWT token) +@pytest.fixture +def real_qkd_driver(): + token = get_jwt_token(QKD1_ADDRESS, PORT, USERNAME, PASSWORD) # Replace with actual details + if not token: + pytest.fail("Failed to retrieve JWT token.") + headers = {'Authorization': f'Bearer {token}'} + return QKDDriver(address=QKD1_ADDRESS, port=PORT, headers=headers) + +# Mock QKD Driver (No actual connection, mock capabilities) +@pytest.fixture +def mock_qkd_driver(): + # Initialize the mock QKD driver with mock settings + token = "mock_token" + headers = {"Authorization": f"Bearer {token}"} + return QKDDriver(address='10.211.36.220', port=11111, headers=headers) + +# General function to retrieve and test capabilities +def retrieve_capabilities(qkd_driver, driver_name): + try: + qkd_driver.Connect() + capabilities = qkd_driver.GetConfig([RESOURCE_CAPABILITES]) + assert isinstance(capabilities, list), "Expected a list of capabilities" + assert len(capabilities) > 0, f"No capabilities found for {driver_name}" + print_data(f"{driver_name} Capabilities", capabilities) + except HTTPError as e: + pytest.fail(f"HTTPError while fetching capabilities for {driver_name}: {e}") + except AssertionError as e: + pytest.fail(f"AssertionError: {e}") + except Exception as e: + pytest.fail(f"An unexpected error occurred: {e}") + +# Test for Real QKD Capabilities +def test_real_qkd_capabilities(real_qkd_driver): + retrieve_capabilities(real_qkd_driver, "Real QKD") + +# Test for Mock QKD Capabilities +def test_mock_qkd_capabilities(mock_qkd_driver): + retrieve_capabilities(mock_qkd_driver, "Mock QKD") diff --git a/src/device/tests/qkd/unit/test_qkd_subscription.py b/src/device/tests/qkd/unit/test_qkd_subscription.py index 99a96f08c..94803862c 100644 --- a/src/device/tests/qkd/unit/test_qkd_subscription.py +++ b/src/device/tests/qkd/unit/test_qkd_subscription.py @@ -1,23 +1,36 @@ -# tests/unit/test_qkd_subscription.py - import pytest from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver +from typing import List, Tuple + + +@pytest.fixture +def qkd_driver(): + # Initialize the QKD driver + return QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') -def test_state_subscription(): - driver = QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') - driver.Connect() - result = driver.SubscribeState([('/qkd_interfaces/qkd_interface', 1.0, 2.0)]) - assert all(isinstance(res, bool) and res for res in result) -def test_state_unsubscription(): - driver = QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') - driver.Connect() - result = driver.UnsubscribeState(['/qkd_interfaces/qkd_interface']) - assert all(isinstance(res, bool) and res for res in result) +def test_state_subscription(qkd_driver): + """ + Test Case ID: SBI_Test_06 - Subscribe to state changes and validate the subscription process. + """ + qkd_driver.Connect() -def test_state_retrieval(): - driver = QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') - driver.Connect() - state = driver.GetState() - assert isinstance(state, dict) or isinstance(state, list) + try: + # Step 1: Define the subscription + subscriptions = [ + ('00000001-0000-0000-0000-000000000000', 60, 10) # (node_id, frequency, timeout) + ] + + # Step 2: Subscribe to state changes using the driver method + subscription_results = qkd_driver.SubscribeState(subscriptions) + + # Step 3: Validate that the subscription was successful + assert all(result is True for result in subscription_results), "Subscription to state changes failed." + print("State subscription successful:", subscription_results) + + except Exception as e: + pytest.fail(f"An unexpected error occurred during state subscription: {e}") + + finally: + qkd_driver.Disconnect() diff --git a/src/device/tests/qkd/unit/test_qkd_unsubscription.py b/src/device/tests/qkd/unit/test_qkd_unsubscription.py new file mode 100644 index 000000000..94803862c --- /dev/null +++ b/src/device/tests/qkd/unit/test_qkd_unsubscription.py @@ -0,0 +1,36 @@ +import pytest +from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver +from typing import List, Tuple + + +@pytest.fixture +def qkd_driver(): + # Initialize the QKD driver + return QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') + + +def test_state_subscription(qkd_driver): + """ + Test Case ID: SBI_Test_06 - Subscribe to state changes and validate the subscription process. + """ + qkd_driver.Connect() + + try: + # Step 1: Define the subscription + subscriptions = [ + ('00000001-0000-0000-0000-000000000000', 60, 10) # (node_id, frequency, timeout) + ] + + # Step 2: Subscribe to state changes using the driver method + subscription_results = qkd_driver.SubscribeState(subscriptions) + + # Step 3: Validate that the subscription was successful + assert all(result is True for result in subscription_results), "Subscription to state changes failed." + + print("State subscription successful:", subscription_results) + + except Exception as e: + pytest.fail(f"An unexpected error occurred during state subscription: {e}") + + finally: + qkd_driver.Disconnect() diff --git a/src/device/tests/qkd/unit/test_set_new configuration.py b/src/device/tests/qkd/unit/test_set_new configuration.py new file mode 100644 index 000000000..ff57486a1 --- /dev/null +++ b/src/device/tests/qkd/unit/test_set_new configuration.py @@ -0,0 +1,109 @@ +import pytest +import requests +from requests.exceptions import HTTPError +from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver +from src.device.service.drivers.qkd.Tools2 import RESOURCE_APPS +import uuid + +@pytest.fixture +def qkd_driver1(): + # Initialize the QKD driver for QKD1 + return QKDDriver(address='10.211.36.220', port=11111, username='user', password='pass') + +@pytest.fixture +def qkd_driver3(): + # Initialize the QKD driver for QKD3 + return QKDDriver(address='10.211.36.220', port=33333, username='user', password='pass') + +def create_qkd_app(driver, qkdn_id, backing_qkdl_id, client_app_id=None): + """ + Helper function to create QKD applications on the given driver. + """ + server_app_id = str(uuid.uuid4()) # Generate a unique server_app_id + + app_payload = { + 'app': { + 'server_app_id': server_app_id, + 'client_app_id': client_app_id if client_app_id else [], # Add client_app_id if provided + 'app_status': 'ON', + 'local_qkdn_id': qkdn_id, + 'backing_qkdl_id': backing_qkdl_id + } + } + + try: + # Log the payload being sent + print(f"Sending payload to {driver.address}: {app_payload}") + + # Send POST request to create the application + response = requests.post(f'http://{driver.address}/app/create_qkd_app', json=app_payload) + + # Check if the request was successful (HTTP 2xx) + response.raise_for_status() + + # Validate the response + assert response.status_code == 200, f"Failed to create QKD app for {driver.address}: {response.text}" + + response_data = response.json() + assert response_data.get('status') == 'success', "Application creation failed." + + # Log the response from the server + print(f"Server {driver.address} response: {response_data}") + + return server_app_id # Return the created server_app_id + + except HTTPError as e: + pytest.fail(f"HTTP error occurred while creating the QKD application on {driver.address}: {e}") + except Exception as e: + pytest.fail(f"An unexpected error occurred: {e}") + +def test_create_qkd_application_bidirectional(qkd_driver1, qkd_driver3): + """ + Create QKD applications on both qkd1 and qkd3, and validate the complete creation in both directions. + """ + + qkd_driver1.Connect() + qkd_driver3.Connect() + + try: + # Step 1: Create QKD application for qkd1, referencing qkd3 as the backing QKDL + server_app_id_qkd1 = create_qkd_app( + qkd_driver1, + qkdn_id='00000001-0000-0000-0000-000000000000', + backing_qkdl_id=['00000003-0002-0000-0000-000000000000'] # qkd3's QKDL + ) + + # Step 2: Create QKD application for qkd3, referencing qkd1 as the backing QKDL, and setting client_app_id to qkd1's app + create_qkd_app( + qkd_driver3, + qkdn_id='00000003-0000-0000-0000-000000000000', + backing_qkdl_id=['00000003-0002-0000-0000-000000000000'], # qkd3's QKDL + client_app_id=[server_app_id_qkd1] # Set qkd1 as the client + ) + + # Step 3: Fetch applications from both qkd1 and qkd3 to validate that the applications exist + apps_qkd1 = qkd_driver1.GetConfig([RESOURCE_APPS]) + apps_qkd3 = qkd_driver3.GetConfig([RESOURCE_APPS]) + + print(f"QKD1 applications config: {apps_qkd1}") + print(f"QKD3 applications config: {apps_qkd3}") + + # Debugging: Print the full structure of the apps to understand what is returned + for app in apps_qkd1: + print(f"QKD1 App: {app}") + + # Debugging: Print the full structure of the apps to understand what is returned + for app in apps_qkd3: + print(f"QKD3 App: {app}") + + # Step 4: Validate the applications are created using app_id instead of server_app_id + assert any(app[1].get('app_id') == '00000001-0001-0000-0000-000000000000' for app in apps_qkd1), "QKD app not created on qkd1." + assert any(app[1].get('app_id') == '00000003-0001-0000-0000-000000000000' for app in apps_qkd3), "QKD app not created on qkd3." + + print("QKD applications created successfully in both directions.") + + except Exception as e: + pytest.fail(f"An unexpected error occurred: {e}") + finally: + qkd_driver1.Disconnect() + qkd_driver3.Disconnect() -- GitLab From f62d28c746bf3cde9511f2f2d6e358820ec3c72e Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 18 Sep 2024 16:26:37 +0000 Subject: [PATCH 591/602] Pre-merge code cleanup --- deploy/tfs.sh | 114 ++++++++---------- manifests/dltservice.yaml | 12 ++ .../connector/client/DltConnectorClient.py | 1 - .../client/DltConnectorClientAsync.py | 1 - .../connector/client/DltEventsCollector.py | 1 - src/dlt/connector/client/DltGatewayClient.py | 1 - .../connector/client/DltGatewayClientAsync.py | 1 - .../DltConnectorServiceServicerImpl.py | 1 - .../topology_abstractor/DltRecordSender.py | 1 - .../topology_abstractor/DltRecorder.py | 1 - 10 files changed, 65 insertions(+), 69 deletions(-) diff --git a/deploy/tfs.sh b/deploy/tfs.sh index 293a56f0f..32605143f 100755 --- a/deploy/tfs.sh +++ b/deploy/tfs.sh @@ -45,10 +45,6 @@ export TFS_GRAFANA_PASSWORD=${TFS_GRAFANA_PASSWORD:-"admin123+"} # If TFS_SKIP_BUILD is "YES", the containers are not rebuilt-retagged-repushed and existing ones are used. export TFS_SKIP_BUILD=${TFS_SKIP_BUILD:-""} -# If not already set, disable build-if-exists flag to skip building Docker images if they already exist. -# If TFS_BUILD_IF_EXISTS is "NO", the containers are not rebuilt if they already exist. -export TFS_BUILD_IF_EXISTS=${TFS_BUILD_IF_EXISTS:-"YES"} - # ----- CockroachDB ------------------------------------------------------------ @@ -118,6 +114,7 @@ export PROM_EXT_PORT_HTTP=${PROM_EXT_PORT_HTTP:-"9090"} # If not already set, set the external port Grafana HTTP Dashboards will be exposed to. export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"} + ######################################################################################################################## # Automated steps start here ######################################################################################################################## @@ -247,77 +244,72 @@ for COMPONENT in $TFS_COMPONENTS; do echo "Processing '$COMPONENT' component..." if [ "$TFS_SKIP_BUILD" != "YES" ]; then - IMAGE_EXISTS=$(docker images -q "$COMPONENT:$TFS_IMAGE_TAG") - if [ -z "$IMAGE_EXISTS" ] || [ "$TFS_BUILD_IF_EXISTS" == "YES" ]; then - echo " Building Docker image..." - BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}.log" - - if [ "$COMPONENT" == "ztp" ] || [ "$COMPONENT" == "policy" ]; then - $DOCKER_BUILD -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile ./src/"$COMPONENT"/ > "$BUILD_LOG" - elif [ "$COMPONENT" == "pathcomp" ]; then - BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-frontend.log" - $DOCKER_BUILD -t "$COMPONENT-frontend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/frontend/Dockerfile . > "$BUILD_LOG" - - BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-backend.log" - $DOCKER_BUILD -t "$COMPONENT-backend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/backend/Dockerfile . > "$BUILD_LOG" - # next command is redundant, but helpful to keep cache updated between rebuilds - IMAGE_NAME="$COMPONENT-backend:$TFS_IMAGE_TAG-builder" - $DOCKER_BUILD -t "$IMAGE_NAME" --target builder -f ./src/"$COMPONENT"/backend/Dockerfile . >> "$BUILD_LOG" - elif [ "$COMPONENT" == "dlt" ]; then - BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-connector.log" - $DOCKER_BUILD -t "$COMPONENT-connector:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/connector/Dockerfile . > "$BUILD_LOG" - - BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-gateway.log" - $DOCKER_BUILD -t "$COMPONENT-gateway:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/gateway/Dockerfile . > "$BUILD_LOG" - else - $DOCKER_BUILD -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile . > "$BUILD_LOG" - fi + echo " Building Docker image..." + BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}.log" + + if [ "$COMPONENT" == "ztp" ] || [ "$COMPONENT" == "policy" ]; then + $DOCKER_BUILD -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile ./src/"$COMPONENT"/ > "$BUILD_LOG" + elif [ "$COMPONENT" == "pathcomp" ]; then + BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-frontend.log" + $DOCKER_BUILD -t "$COMPONENT-frontend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/frontend/Dockerfile . > "$BUILD_LOG" + + BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-backend.log" + $DOCKER_BUILD -t "$COMPONENT-backend:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/backend/Dockerfile . > "$BUILD_LOG" + # next command is redundant, but helpful to keep cache updated between rebuilds + IMAGE_NAME="$COMPONENT-backend:$TFS_IMAGE_TAG-builder" + $DOCKER_BUILD -t "$IMAGE_NAME" --target builder -f ./src/"$COMPONENT"/backend/Dockerfile . >> "$BUILD_LOG" + elif [ "$COMPONENT" == "dlt" ]; then + BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-connector.log" + $DOCKER_BUILD -t "$COMPONENT-connector:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/connector/Dockerfile . > "$BUILD_LOG" + + BUILD_LOG="$TMP_LOGS_FOLDER/build_${COMPONENT}-gateway.log" + $DOCKER_BUILD -t "$COMPONENT-gateway:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/gateway/Dockerfile . > "$BUILD_LOG" + else + $DOCKER_BUILD -t "$COMPONENT:$TFS_IMAGE_TAG" -f ./src/"$COMPONENT"/Dockerfile . > "$BUILD_LOG" + fi - echo " Pushing Docker image to '$TFS_REGISTRY_IMAGES'..." + echo " Pushing Docker image to '$TFS_REGISTRY_IMAGES'..." - if [ "$COMPONENT" == "pathcomp" ]; then - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-frontend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + if [ "$COMPONENT" == "pathcomp" ]; then + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-frontend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-frontend.log" - docker tag "$COMPONENT-frontend:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-frontend.log" + docker tag "$COMPONENT-frontend:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" - PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-frontend.log" - docker push "$IMAGE_URL" > "$PUSH_LOG" + PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-frontend.log" + docker push "$IMAGE_URL" > "$PUSH_LOG" - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-backend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-backend:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-backend.log" - docker tag "$COMPONENT-backend:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-backend.log" + docker tag "$COMPONENT-backend:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" - PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-backend.log" - docker push "$IMAGE_URL" > "$PUSH_LOG" - elif [ "$COMPONENT" == "dlt" ]; then - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-connector:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-backend.log" + docker push "$IMAGE_URL" > "$PUSH_LOG" + elif [ "$COMPONENT" == "dlt" ]; then + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-connector:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-connector.log" - docker tag "$COMPONENT-connector:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-connector.log" + docker tag "$COMPONENT-connector:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" - PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-connector.log" - docker push "$IMAGE_URL" > "$PUSH_LOG" + PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-connector.log" + docker push "$IMAGE_URL" > "$PUSH_LOG" - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-gateway:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT-gateway:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-gateway.log" - docker tag "$COMPONENT-gateway:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}-gateway.log" + docker tag "$COMPONENT-gateway:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" - PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-gateway.log" - docker push "$IMAGE_URL" > "$PUSH_LOG" - else - IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') + PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}-gateway.log" + docker push "$IMAGE_URL" > "$PUSH_LOG" + else + IMAGE_URL=$(echo "$TFS_REGISTRY_IMAGES/$COMPONENT:$TFS_IMAGE_TAG" | sed 's,//,/,g' | sed 's,http:/,,g') - TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}.log" - docker tag "$COMPONENT:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" + TAG_LOG="$TMP_LOGS_FOLDER/tag_${COMPONENT}.log" + docker tag "$COMPONENT:$TFS_IMAGE_TAG" "$IMAGE_URL" > "$TAG_LOG" - PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}.log" - docker push "$IMAGE_URL" > "$PUSH_LOG" - fi - else - echo " Skipping Docker build for '$COMPONENT' as the image already exists and TFS_BUILD_IF_EXISTS is set to 'NO'." + PUSH_LOG="$TMP_LOGS_FOLDER/push_${COMPONENT}.log" + docker push "$IMAGE_URL" > "$PUSH_LOG" fi fi diff --git a/manifests/dltservice.yaml b/manifests/dltservice.yaml index 35ab9919d..c79158801 100644 --- a/manifests/dltservice.yaml +++ b/manifests/dltservice.yaml @@ -74,6 +74,18 @@ spec: imagePullPolicy: Always ports: - containerPort: 50051 + #readinessProbe: + # httpGet: + # path: /health + # port: 8081 + # initialDelaySeconds: 5 + # timeoutSeconds: 5 + #livenessProbe: + # httpGet: + # path: /health + # port: 8081 + # initialDelaySeconds: 5 + # timeoutSeconds: 5 resources: requests: cpu: 200m diff --git a/src/dlt/connector/client/DltConnectorClient.py b/src/dlt/connector/client/DltConnectorClient.py index e383217d8..c3101d65e 100644 --- a/src/dlt/connector/client/DltConnectorClient.py +++ b/src/dlt/connector/client/DltConnectorClient.py @@ -22,7 +22,6 @@ from common.tools.client.RetryDecorator import retry, delay_exponential from common.tools.grpc.Tools import grpc_message_to_json_string LOGGER = logging.getLogger(__name__) -LOGGER.setLevel(logging.DEBUG) MAX_RETRIES = 15 DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') diff --git a/src/dlt/connector/client/DltConnectorClientAsync.py b/src/dlt/connector/client/DltConnectorClientAsync.py index 23cd63fa0..b9ed8a4d6 100644 --- a/src/dlt/connector/client/DltConnectorClientAsync.py +++ b/src/dlt/connector/client/DltConnectorClientAsync.py @@ -23,7 +23,6 @@ from common.tools.client.RetryDecorator import retry, delay_exponential from common.tools.grpc.Tools import grpc_message_to_json_string LOGGER = logging.getLogger(__name__) -LOGGER.setLevel(logging.DEBUG) MAX_RETRIES = 15 DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') diff --git a/src/dlt/connector/client/DltEventsCollector.py b/src/dlt/connector/client/DltEventsCollector.py index e59784a4d..ce7d01480 100644 --- a/src/dlt/connector/client/DltEventsCollector.py +++ b/src/dlt/connector/client/DltEventsCollector.py @@ -19,7 +19,6 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from dlt.connector.client.DltGatewayClient import DltGatewayClient LOGGER = logging.getLogger(__name__) -LOGGER.setLevel(logging.DEBUG) # This class accepts an event_handler method as attribute that can be used to pre-process and # filter events before they reach the events_queue. Depending on the handler, the supported diff --git a/src/dlt/connector/client/DltGatewayClient.py b/src/dlt/connector/client/DltGatewayClient.py index 71f336866..5e0328380 100644 --- a/src/dlt/connector/client/DltGatewayClient.py +++ b/src/dlt/connector/client/DltGatewayClient.py @@ -22,7 +22,6 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from dlt.connector.Config import DLT_GATEWAY_HOST, DLT_GATEWAY_PORT LOGGER = logging.getLogger(__name__) -LOGGER.setLevel(logging.DEBUG) MAX_RETRIES = 15 DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') diff --git a/src/dlt/connector/client/DltGatewayClientAsync.py b/src/dlt/connector/client/DltGatewayClientAsync.py index 84c753e03..3f1cf5396 100644 --- a/src/dlt/connector/client/DltGatewayClientAsync.py +++ b/src/dlt/connector/client/DltGatewayClientAsync.py @@ -23,7 +23,6 @@ from common.tools.grpc.Tools import grpc_message_to_json_string from dlt.connector.Config import DLT_GATEWAY_HOST, DLT_GATEWAY_PORT LOGGER = logging.getLogger(__name__) -LOGGER.setLevel(logging.DEBUG) MAX_RETRIES = 15 DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect') diff --git a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py index edba01fac..2222f5a29 100644 --- a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py +++ b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py @@ -26,7 +26,6 @@ from dlt.connector.client.DltGatewayClientAsync import DltGatewayClientAsync from .tools.Checkers import record_exists LOGGER = logging.getLogger(__name__) -LOGGER.setLevel(logging.DEBUG) METRICS_POOL = MetricsPool('DltConnector', 'RPC') diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index f91d6d547..ae9fd440b 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -23,7 +23,6 @@ from context.client.ContextClient import ContextClient from dlt.connector.client.DltConnectorClientAsync import DltConnectorClientAsync LOGGER = logging.getLogger(__name__) -LOGGER.setLevel(logging.DEBUG) class DltRecordSender: def __init__(self, context_client: ContextClient) -> None: diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index 79067072c..ae869b7c0 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -26,7 +26,6 @@ from .DltRecordSender import DltRecordSender from .Types import EventTypes LOGGER = logging.getLogger(__name__) -LOGGER.setLevel(logging.DEBUG) ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) INTERDOMAIN_TOPOLOGY_ID = TopologyId(**json_topology_id(INTERDOMAIN_TOPOLOGY_NAME, context_id=ADMIN_CONTEXT_ID)) -- GitLab From c43486a27146595744f2f144adc1d54dcdfc153e Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 18 Sep 2024 16:31:47 +0000 Subject: [PATCH 592/602] Pre-merge code cleanup --- manifests/dltservice.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/manifests/dltservice.yaml b/manifests/dltservice.yaml index c79158801..66bd3724c 100644 --- a/manifests/dltservice.yaml +++ b/manifests/dltservice.yaml @@ -17,11 +17,11 @@ kind: ConfigMap metadata: name: dlt-config data: - CHANNEL_NAME: "channel1" #Change according to your blockchain configuration - CHAINCODE_NAME: "adrenalineDLT" #Change according to your blockchain configuration - MSP_ID: "Org1MSP" #Change according to your blockchain configuration - PEER_ENDPOINT: "10.1.1.96:7051" #Change to required peer address according to your blockchain deployment# - PEER_HOST_ALIAS: "peer0.org1.adrenaline.com" #Change according to your blockchain configuration + CHANNEL_NAME: "tfs_channel" # Change according to your blockchain configuration + CHAINCODE_NAME: "tfs_dlt" # Change according to your blockchain configuration + MSP_ID: "ETSI" # Change according to your blockchain configuration + PEER_ENDPOINT: "127.0.0.1:7051" # Change according to your blockchain configuration + PEER_HOST_ALIAS: "peer0.org1.tfs.etsi.org" # Change according to your blockchain configuration KEY_DIRECTORY_PATH: "/etc/hyperledger/fabric-keystore/keystore" CERT_DIRECTORY_PATH: "/etc/hyperledger/fabric-signcerts/signcerts.pem" TLS_CERT_PATH: "/etc/hyperledger/fabric-ca-crt/ca.crt" -- GitLab From 614c625f0d0beb6000b5d026a966cd447744f65c Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 18 Sep 2024 16:37:20 +0000 Subject: [PATCH 593/602] Pre-merge code cleanup --- src/dlt/connector/client/DltGatewayClient.py | 33 ++++++++++++++++++- .../connector/client/DltGatewayClientAsync.py | 9 +++-- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/dlt/connector/client/DltGatewayClient.py b/src/dlt/connector/client/DltGatewayClient.py index 5e0328380..8e2303b2c 100644 --- a/src/dlt/connector/client/DltGatewayClient.py +++ b/src/dlt/connector/client/DltGatewayClient.py @@ -15,7 +15,10 @@ import grpc, logging from typing import Iterator -from common.proto.dlt_gateway_pb2 import DltRecordEvent, DltRecordSubscription +from common.proto.context_pb2 import Empty, TeraFlowController +from common.proto.dlt_gateway_pb2 import ( + DltPeerStatus, DltPeerStatusList, DltRecord, DltRecordEvent, DltRecordId, DltRecordStatus, DltRecordSubscription +) from common.proto.dlt_gateway_pb2_grpc import DltGatewayServiceStub from common.tools.client.RetryDecorator import retry, delay_exponential from common.tools.grpc.Tools import grpc_message_to_json_string @@ -47,9 +50,37 @@ class DltGatewayClient: self.channel = None self.stub = None + @RETRY_DECORATOR + def RecordToDlt(self, request : DltRecord) -> DltRecordStatus: + LOGGER.debug('RecordToDlt request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.RecordToDlt(request) + LOGGER.debug('RecordToDlt result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def GetFromDlt(self, request : DltRecordId) -> DltRecord: + LOGGER.debug('GetFromDlt request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.GetFromDlt(request) + LOGGER.debug('GetFromDlt result: {:s}'.format(grpc_message_to_json_string(response))) + return response + @RETRY_DECORATOR def SubscribeToDlt(self, request: DltRecordSubscription) -> Iterator[DltRecordEvent]: LOGGER.debug('SubscribeToDlt request: {:s}'.format(grpc_message_to_json_string(request))) response = self.stub.SubscribeToDlt(request) LOGGER.debug('SubscribeToDlt result: {:s}'.format(grpc_message_to_json_string(response))) return response + + @RETRY_DECORATOR + def GetDltStatus(self, request : TeraFlowController) -> DltPeerStatus: + LOGGER.debug('GetDltStatus request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.GetDltStatus(request) + LOGGER.debug('GetDltStatus result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def GetDltPeers(self, request : Empty) -> DltPeerStatusList: + LOGGER.debug('GetDltPeers request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.GetDltPeers(request) + LOGGER.debug('GetDltPeers result: {:s}'.format(grpc_message_to_json_string(response))) + return response diff --git a/src/dlt/connector/client/DltGatewayClientAsync.py b/src/dlt/connector/client/DltGatewayClientAsync.py index 3f1cf5396..816241ec5 100644 --- a/src/dlt/connector/client/DltGatewayClientAsync.py +++ b/src/dlt/connector/client/DltGatewayClientAsync.py @@ -12,11 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -import grpc, logging, asyncio +import asyncio, grpc, logging from typing import Iterator, List from common.proto.context_pb2 import Empty, TeraFlowController from common.proto.dlt_gateway_pb2 import ( - DltPeerStatus, DltPeerStatusList, DltRecord, DltRecordEvent, DltRecordId, DltRecordStatus, DltRecordSubscription) + DltPeerStatus, DltPeerStatusList, DltRecord, DltRecordEvent, DltRecordId, DltRecordStatus, DltRecordSubscription +) from common.proto.dlt_gateway_pb2_grpc import DltGatewayServiceStub from common.tools.client.RetryDecorator import retry, delay_exponential from common.tools.grpc.Tools import grpc_message_to_json_string @@ -35,9 +36,7 @@ class DltGatewayClientAsync: LOGGER.debug('Creating channel to {:s}...'.format(self.endpoint)) self.channel = None self.stub = None - #self.connect() self.message_queue: List[DltRecord] = [] - #LOGGER.debug('Channel created') async def connect(self): self.channel = grpc.aio.insecure_channel(self.endpoint) @@ -56,7 +55,7 @@ class DltGatewayClientAsync: response = await self.stub.RecordToDlt(request) LOGGER.debug('RecordToDlt result: {:s}'.format(grpc_message_to_json_string(response))) return response - + @RETRY_DECORATOR async def GetFromDlt(self, request : DltRecordId) -> DltRecord: LOGGER.debug('GetFromDlt request: {:s}'.format(grpc_message_to_json_string(request))) -- GitLab From 3ffe8ac8d90a277e82321c14cc169d1f2a8ef835 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 18 Sep 2024 16:41:25 +0000 Subject: [PATCH 594/602] Pre-merge code cleanup --- src/dlt/connector/client/DltGatewayClient.py | 2 +- .../DltConnectorServiceServicerImpl.py | 22 +++++++++---------- src/dlt/connector/service/__main__.py | 5 +++-- src/dlt/connector/service/tools/Checkers.py | 2 +- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/dlt/connector/client/DltGatewayClient.py b/src/dlt/connector/client/DltGatewayClient.py index 8e2303b2c..21d4df57d 100644 --- a/src/dlt/connector/client/DltGatewayClient.py +++ b/src/dlt/connector/client/DltGatewayClient.py @@ -65,7 +65,7 @@ class DltGatewayClient: return response @RETRY_DECORATOR - def SubscribeToDlt(self, request: DltRecordSubscription) -> Iterator[DltRecordEvent]: + def SubscribeToDlt(self, request : DltRecordSubscription) -> Iterator[DltRecordEvent]: LOGGER.debug('SubscribeToDlt request: {:s}'.format(grpc_message_to_json_string(request))) response = self.stub.SubscribeToDlt(request) LOGGER.debug('SubscribeToDlt result: {:s}'.format(grpc_message_to_json_string(response))) diff --git a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py index 2222f5a29..1885cc153 100644 --- a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py +++ b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py @@ -39,15 +39,15 @@ class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): await self.dltgateway_client.connect() @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) - async def RecordAll(self, request: TopologyId, context: ServicerContext) -> Empty: + async def RecordAll(self, request : TopologyId, context : ServicerContext) -> Empty: return Empty() @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) - async def RecordAllDevices(self, request: TopologyId, context: ServicerContext) -> Empty: + async def RecordAllDevices(self, request : TopologyId, context : ServicerContext) -> Empty: return Empty() @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) - async def RecordDevice(self, request: DltDeviceId, context: ServicerContext) -> Empty: + async def RecordDevice(self, request : DltDeviceId, context : ServicerContext) -> Empty: data_json = None LOGGER.debug('RECORD_DEVICE = {:s}'.format(grpc_message_to_json_string(request))) if not request.delete: @@ -61,11 +61,11 @@ class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): return Empty() @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) - async def RecordAllLinks(self, request: TopologyId, context: ServicerContext) -> Empty: + async def RecordAllLinks(self, request : TopologyId, context : ServicerContext) -> Empty: return Empty() @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) - async def RecordLink(self, request: DltLinkId, context: ServicerContext) -> Empty: + async def RecordLink(self, request : DltLinkId, context : ServicerContext) -> Empty: data_json = None LOGGER.debug('RECORD_LINK = {:s}'.format(grpc_message_to_json_string(request))) @@ -80,11 +80,11 @@ class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): return Empty() @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) - async def RecordAllServices(self, request: TopologyId, context: ServicerContext) -> Empty: + async def RecordAllServices(self, request : TopologyId, context : ServicerContext) -> Empty: return Empty() @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) - async def RecordService(self, request: DltServiceId, context: ServicerContext) -> Empty: + async def RecordService(self, request : DltServiceId, context : ServicerContext) -> Empty: data_json = None if not request.delete: context_client = ContextClient() @@ -97,11 +97,11 @@ class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): return Empty() @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) - async def RecordAllSlices(self, request: TopologyId, context: ServicerContext) -> Empty: + async def RecordAllSlices(self, request : TopologyId, context : ServicerContext) -> Empty: return Empty() @safe_and_metered_rpc_method_async(METRICS_POOL, LOGGER) - async def RecordSlice(self, request: DltSliceId, context: ServicerContext) -> Empty: + async def RecordSlice(self, request : DltSliceId, context : ServicerContext) -> Empty: data_json = None if not request.delete: context_client = ContextClient() @@ -114,8 +114,8 @@ class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): return Empty() async def _record_entity( - self, dlt_domain_uuid: str, dlt_record_type: DltRecordTypeEnum, dlt_record_uuid: str, delete: bool, - data_json: Optional[str] = None + self, dlt_domain_uuid : str, dlt_record_type : DltRecordTypeEnum, dlt_record_uuid : str, delete : bool, + data_json : Optional[str] = None ) -> None: dlt_record_id = DltRecordId() dlt_record_id.domain_uuid.uuid = dlt_domain_uuid # pylint: disable=no-member diff --git a/src/dlt/connector/service/__main__.py b/src/dlt/connector/service/__main__.py index e368f6302..632b2f781 100644 --- a/src/dlt/connector/service/__main__.py +++ b/src/dlt/connector/service/__main__.py @@ -14,6 +14,7 @@ import logging, signal, threading, asyncio +from typing import Optional from prometheus_client import start_http_server from common.Constants import ServiceNameEnum from common.Settings import ( @@ -23,7 +24,7 @@ from .event_dispatcher.DltEventDispatcher import DltEventDispatcher from .DltConnectorService import DltConnectorService terminate = threading.Event() -LOGGER: logging.Logger = None +LOGGER : Optional[logging.Logger] = None def signal_handler(signal, frame): # pylint: disable=redefined-outer-name LOGGER.warning('Terminate signal received') @@ -37,7 +38,7 @@ async def main(): LOGGER = logging.getLogger(__name__) wait_for_environment_variables([ - get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST), + get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST ), get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), ]) diff --git a/src/dlt/connector/service/tools/Checkers.py b/src/dlt/connector/service/tools/Checkers.py index 9afb0da07..5b19afcd2 100644 --- a/src/dlt/connector/service/tools/Checkers.py +++ b/src/dlt/connector/service/tools/Checkers.py @@ -20,5 +20,5 @@ def record_exists(record : DltRecord) -> bool: exists = exists and (record.record_id.type != DLTRECORDTYPE_UNDEFINED) exists = exists and (len(record.record_id.record_uuid.uuid) > 0) #exists = exists and (record.operation != DLTRECORDOPERATION_UNDEFINED) - #exists = exists and (len(record.data_json) > 0) #It conflicts as sometimes records do not have a data_json. + #exists = exists and (len(record.data_json) > 0) # It conflicts as sometimes records do not have a data_json. return exists -- GitLab From 57d837b95cacd197ddf418eb161785c60e0b6428 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 18 Sep 2024 16:47:24 +0000 Subject: [PATCH 595/602] Pre-merge code cleanup --- .../service/DltConnectorServiceServicerImpl.py | 8 ++++---- src/dlt/connector/service/__main__.py | 2 +- src/dlt/gateway/{legacy => _legacy}/.gitignore | 0 src/dlt/gateway/{legacy => _legacy}/Dockerfile | 0 src/dlt/gateway/{legacy => _legacy}/README.md | 0 .../gateway/{legacy => _legacy}/build.gradle.kts | 0 .../config/ca.org1.example.com-cert.pem | 0 .../{legacy => _legacy}/config/connection-org1.json | 0 .../gateway/{legacy => _legacy}/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 src/dlt/gateway/{legacy => _legacy}/gradlew | 0 src/dlt/gateway/{legacy => _legacy}/gradlew.bat | 0 .../gateway/{legacy => _legacy}/settings.gradle.kts | 0 .../{legacy => _legacy}/src/main/kotlin/Main.kt | 0 .../src/main/kotlin/fabric/ConnectGateway.kt | 0 .../src/main/kotlin/fabric/EnrollAdmin.kt | 0 .../src/main/kotlin/fabric/FabricConnector.kt | 0 .../src/main/kotlin/fabric/RegisterUser.kt | 0 .../src/main/kotlin/grpc/FabricServer.kt | 0 .../src/main/kotlin/grpc/GrpcHandler.kt | 0 .../src/main/kotlin/proto/Config.proto | 0 src/dlt/gateway/dltApp/.gitignore | 2 -- 23 files changed, 5 insertions(+), 7 deletions(-) rename src/dlt/gateway/{legacy => _legacy}/.gitignore (100%) rename src/dlt/gateway/{legacy => _legacy}/Dockerfile (100%) rename src/dlt/gateway/{legacy => _legacy}/README.md (100%) rename src/dlt/gateway/{legacy => _legacy}/build.gradle.kts (100%) rename src/dlt/gateway/{legacy => _legacy}/config/ca.org1.example.com-cert.pem (100%) rename src/dlt/gateway/{legacy => _legacy}/config/connection-org1.json (100%) rename src/dlt/gateway/{legacy => _legacy}/gradle.properties (100%) rename src/dlt/gateway/{legacy => _legacy}/gradle/wrapper/gradle-wrapper.jar (100%) rename src/dlt/gateway/{legacy => _legacy}/gradle/wrapper/gradle-wrapper.properties (100%) rename src/dlt/gateway/{legacy => _legacy}/gradlew (100%) rename src/dlt/gateway/{legacy => _legacy}/gradlew.bat (100%) rename src/dlt/gateway/{legacy => _legacy}/settings.gradle.kts (100%) rename src/dlt/gateway/{legacy => _legacy}/src/main/kotlin/Main.kt (100%) rename src/dlt/gateway/{legacy => _legacy}/src/main/kotlin/fabric/ConnectGateway.kt (100%) rename src/dlt/gateway/{legacy => _legacy}/src/main/kotlin/fabric/EnrollAdmin.kt (100%) rename src/dlt/gateway/{legacy => _legacy}/src/main/kotlin/fabric/FabricConnector.kt (100%) rename src/dlt/gateway/{legacy => _legacy}/src/main/kotlin/fabric/RegisterUser.kt (100%) rename src/dlt/gateway/{legacy => _legacy}/src/main/kotlin/grpc/FabricServer.kt (100%) rename src/dlt/gateway/{legacy => _legacy}/src/main/kotlin/grpc/GrpcHandler.kt (100%) rename src/dlt/gateway/{legacy => _legacy}/src/main/kotlin/proto/Config.proto (100%) delete mode 100644 src/dlt/gateway/dltApp/.gitignore diff --git a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py index 1885cc153..c1a4b7b1e 100644 --- a/src/dlt/connector/service/DltConnectorServiceServicerImpl.py +++ b/src/dlt/connector/service/DltConnectorServiceServicerImpl.py @@ -118,9 +118,9 @@ class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): data_json : Optional[str] = None ) -> None: dlt_record_id = DltRecordId() - dlt_record_id.domain_uuid.uuid = dlt_domain_uuid # pylint: disable=no-member - dlt_record_id.type = dlt_record_type - dlt_record_id.record_uuid.uuid = dlt_record_uuid # pylint: disable=no-member + dlt_record_id.domain_uuid.uuid = dlt_domain_uuid # pylint: disable=no-member + dlt_record_id.type = dlt_record_type + dlt_record_id.record_uuid.uuid = dlt_record_uuid # pylint: disable=no-member str_dlt_record_id = grpc_message_to_json_string(dlt_record_id) LOGGER.debug('[_record_entity] sent dlt_record_id = {:s}'.format(str_dlt_record_id)) @@ -132,7 +132,7 @@ class DltConnectorServiceServicerImpl(DltConnectorServiceServicer): LOGGER.debug('[_record_entity] exists = {:s}'.format(str(exists))) dlt_record = DltRecord() - dlt_record.record_id.CopyFrom(dlt_record_id) # pylint: disable=no-member + dlt_record.record_id.CopyFrom(dlt_record_id) # pylint: disable=no-member if delete and exists: dlt_record.operation = DltRecordOperationEnum.DLTRECORDOPERATION_DELETE elif not delete and exists: diff --git a/src/dlt/connector/service/__main__.py b/src/dlt/connector/service/__main__.py index 632b2f781..d1c946124 100644 --- a/src/dlt/connector/service/__main__.py +++ b/src/dlt/connector/service/__main__.py @@ -42,7 +42,7 @@ async def main(): get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC), ]) - signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) LOGGER.info('Starting...') diff --git a/src/dlt/gateway/legacy/.gitignore b/src/dlt/gateway/_legacy/.gitignore similarity index 100% rename from src/dlt/gateway/legacy/.gitignore rename to src/dlt/gateway/_legacy/.gitignore diff --git a/src/dlt/gateway/legacy/Dockerfile b/src/dlt/gateway/_legacy/Dockerfile similarity index 100% rename from src/dlt/gateway/legacy/Dockerfile rename to src/dlt/gateway/_legacy/Dockerfile diff --git a/src/dlt/gateway/legacy/README.md b/src/dlt/gateway/_legacy/README.md similarity index 100% rename from src/dlt/gateway/legacy/README.md rename to src/dlt/gateway/_legacy/README.md diff --git a/src/dlt/gateway/legacy/build.gradle.kts b/src/dlt/gateway/_legacy/build.gradle.kts similarity index 100% rename from src/dlt/gateway/legacy/build.gradle.kts rename to src/dlt/gateway/_legacy/build.gradle.kts diff --git a/src/dlt/gateway/legacy/config/ca.org1.example.com-cert.pem b/src/dlt/gateway/_legacy/config/ca.org1.example.com-cert.pem similarity index 100% rename from src/dlt/gateway/legacy/config/ca.org1.example.com-cert.pem rename to src/dlt/gateway/_legacy/config/ca.org1.example.com-cert.pem diff --git a/src/dlt/gateway/legacy/config/connection-org1.json b/src/dlt/gateway/_legacy/config/connection-org1.json similarity index 100% rename from src/dlt/gateway/legacy/config/connection-org1.json rename to src/dlt/gateway/_legacy/config/connection-org1.json diff --git a/src/dlt/gateway/legacy/gradle.properties b/src/dlt/gateway/_legacy/gradle.properties similarity index 100% rename from src/dlt/gateway/legacy/gradle.properties rename to src/dlt/gateway/_legacy/gradle.properties diff --git a/src/dlt/gateway/legacy/gradle/wrapper/gradle-wrapper.jar b/src/dlt/gateway/_legacy/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from src/dlt/gateway/legacy/gradle/wrapper/gradle-wrapper.jar rename to src/dlt/gateway/_legacy/gradle/wrapper/gradle-wrapper.jar diff --git a/src/dlt/gateway/legacy/gradle/wrapper/gradle-wrapper.properties b/src/dlt/gateway/_legacy/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from src/dlt/gateway/legacy/gradle/wrapper/gradle-wrapper.properties rename to src/dlt/gateway/_legacy/gradle/wrapper/gradle-wrapper.properties diff --git a/src/dlt/gateway/legacy/gradlew b/src/dlt/gateway/_legacy/gradlew similarity index 100% rename from src/dlt/gateway/legacy/gradlew rename to src/dlt/gateway/_legacy/gradlew diff --git a/src/dlt/gateway/legacy/gradlew.bat b/src/dlt/gateway/_legacy/gradlew.bat similarity index 100% rename from src/dlt/gateway/legacy/gradlew.bat rename to src/dlt/gateway/_legacy/gradlew.bat diff --git a/src/dlt/gateway/legacy/settings.gradle.kts b/src/dlt/gateway/_legacy/settings.gradle.kts similarity index 100% rename from src/dlt/gateway/legacy/settings.gradle.kts rename to src/dlt/gateway/_legacy/settings.gradle.kts diff --git a/src/dlt/gateway/legacy/src/main/kotlin/Main.kt b/src/dlt/gateway/_legacy/src/main/kotlin/Main.kt similarity index 100% rename from src/dlt/gateway/legacy/src/main/kotlin/Main.kt rename to src/dlt/gateway/_legacy/src/main/kotlin/Main.kt diff --git a/src/dlt/gateway/legacy/src/main/kotlin/fabric/ConnectGateway.kt b/src/dlt/gateway/_legacy/src/main/kotlin/fabric/ConnectGateway.kt similarity index 100% rename from src/dlt/gateway/legacy/src/main/kotlin/fabric/ConnectGateway.kt rename to src/dlt/gateway/_legacy/src/main/kotlin/fabric/ConnectGateway.kt diff --git a/src/dlt/gateway/legacy/src/main/kotlin/fabric/EnrollAdmin.kt b/src/dlt/gateway/_legacy/src/main/kotlin/fabric/EnrollAdmin.kt similarity index 100% rename from src/dlt/gateway/legacy/src/main/kotlin/fabric/EnrollAdmin.kt rename to src/dlt/gateway/_legacy/src/main/kotlin/fabric/EnrollAdmin.kt diff --git a/src/dlt/gateway/legacy/src/main/kotlin/fabric/FabricConnector.kt b/src/dlt/gateway/_legacy/src/main/kotlin/fabric/FabricConnector.kt similarity index 100% rename from src/dlt/gateway/legacy/src/main/kotlin/fabric/FabricConnector.kt rename to src/dlt/gateway/_legacy/src/main/kotlin/fabric/FabricConnector.kt diff --git a/src/dlt/gateway/legacy/src/main/kotlin/fabric/RegisterUser.kt b/src/dlt/gateway/_legacy/src/main/kotlin/fabric/RegisterUser.kt similarity index 100% rename from src/dlt/gateway/legacy/src/main/kotlin/fabric/RegisterUser.kt rename to src/dlt/gateway/_legacy/src/main/kotlin/fabric/RegisterUser.kt diff --git a/src/dlt/gateway/legacy/src/main/kotlin/grpc/FabricServer.kt b/src/dlt/gateway/_legacy/src/main/kotlin/grpc/FabricServer.kt similarity index 100% rename from src/dlt/gateway/legacy/src/main/kotlin/grpc/FabricServer.kt rename to src/dlt/gateway/_legacy/src/main/kotlin/grpc/FabricServer.kt diff --git a/src/dlt/gateway/legacy/src/main/kotlin/grpc/GrpcHandler.kt b/src/dlt/gateway/_legacy/src/main/kotlin/grpc/GrpcHandler.kt similarity index 100% rename from src/dlt/gateway/legacy/src/main/kotlin/grpc/GrpcHandler.kt rename to src/dlt/gateway/_legacy/src/main/kotlin/grpc/GrpcHandler.kt diff --git a/src/dlt/gateway/legacy/src/main/kotlin/proto/Config.proto b/src/dlt/gateway/_legacy/src/main/kotlin/proto/Config.proto similarity index 100% rename from src/dlt/gateway/legacy/src/main/kotlin/proto/Config.proto rename to src/dlt/gateway/_legacy/src/main/kotlin/proto/Config.proto diff --git a/src/dlt/gateway/dltApp/.gitignore b/src/dlt/gateway/dltApp/.gitignore deleted file mode 100644 index 9e21c69ae..000000000 --- a/src/dlt/gateway/dltApp/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -operation_times.txt \ No newline at end of file -- GitLab From 51765439657bab5e22a897b08f24e1dcfaa76dbe Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 18 Sep 2024 16:56:46 +0000 Subject: [PATCH 596/602] Pre-merge code cleanup --- src/dlt/gateway/Dockerfile | 3 -- src/dlt/gateway/README.md | 38 ++++++++++++++--------- src/dlt/gateway/dltApp/package.json | 2 +- src/dlt/gateway/keys/.gitignore | 2 +- src/dlt/gateway/resources/System.png | Bin 291845 -> 0 bytes src/dlt/gateway/samples/sampleTopo.json | 2 +- src/dlt/gateway/samples/updatedTopo.json | 2 +- src/dlt/gateway/tests/testEvents.js | 2 +- src/dlt/gateway/tests/testGateway.js | 2 +- 9 files changed, 29 insertions(+), 24 deletions(-) delete mode 100644 src/dlt/gateway/resources/System.png diff --git a/src/dlt/gateway/Dockerfile b/src/dlt/gateway/Dockerfile index 78e735c09..ace9cb22e 100644 --- a/src/dlt/gateway/Dockerfile +++ b/src/dlt/gateway/Dockerfile @@ -38,11 +38,8 @@ COPY src/dlt/gateway/dltApp/src/ ./src # Install dependencies RUN npm install - - # Expose the port that the gRPC service runs on EXPOSE 50051 # Command to run the service CMD ["node", "src/dltGateway.js"] -#CMD ["sh", "-c", "sleep 3600"] # Keep the container running for testing diff --git a/src/dlt/gateway/README.md b/src/dlt/gateway/README.md index ae05ed6c6..4a38545ea 100644 --- a/src/dlt/gateway/README.md +++ b/src/dlt/gateway/README.md @@ -2,9 +2,15 @@ ## Description -The DLT Gateway consists of a **fabricConnect.ts** TypeScript file, which contains the logic for identification management (certificates required for the MSP), connection management to the blockchain, and finally, it exposes a contract object with all the required information for interacting with the chaincode. The **fabricConnect.ts** is coded following the Fabric Gateway API recommendations from Hyperledger Fabric 2.4+. The compiled **fabricConnect.ts** logic is imported into a **dltGateway.js** file, which contains the gRPC logic for interaction with the TFS controller. Testing code for various performance tests is included inside the [/tests](./tests/) folder. +The DLT Gateway consists of a **fabricConnect.ts** TypeScript file, which contains the logic for identification +management (certificates required for the MSP), connection management to the blockchain, and finally, it exposes a +contract object with all the required information for interacting with the chaincode. The **fabricConnect.ts** is +coded following the Fabric Gateway API recommendations from Hyperledger Fabric 2.4+. The compiled **fabricConnect.ts** +logic is imported into a **dltGateway.js** file, which contains the gRPC logic for interaction with the TFS controller. +Testing code for various performance tests is included inside the [/tests](./tests/) folder. -The chaincode is written in Go, providing a reference for the operations that are recorded in the blockchain. This chaincode must already be deployed in a working Hyperledger Fabric blockchain. +The chaincode is written in Go, providing a reference for the operations that are recorded in the blockchain. This +chaincode must already be deployed in a working Hyperledger Fabric blockchain. ## Requisites @@ -12,16 +18,18 @@ The chaincode is written in Go, providing a reference for the operations that ar * Docker * Kubernetes (K8s) -Sign and TLS certificates, and private key of the MSP user from the Hyperledger Fabric deployment must be copied to the [/keys](./keys/) directory inside this repository. - - Example: - - ```bash - cp ~/fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/ca.crt src/dlt/gateway/keys/ - - cp ~/fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem src/dlt/gateway/keys/cert.pem - - cp ~/fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/priv_sk src/dlt/gateway/keys/ - ``` - -These files are essential for establishing the identity and secure connection to the blockchain. Make sure you replace the paths with your actual file locations from your Hyperledger Fabric deployment. +Sign and TLS certificates, and private key of the MSP user from the Hyperledger Fabric deployment must be copied to the +[/keys](./keys/) directory inside this repository. + +Example: + +```bash +cp ~/fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/tls/ca.crt src/dlt/gateway/keys/ + +cp ~/fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem src/dlt/gateway/keys/cert.pem + +cp ~/fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/priv_sk src/dlt/gateway/keys/ +``` + +These files are essential for establishing the identity and secure connection to the blockchain. Make sure you replace +the paths with your actual file locations from your Hyperledger Fabric deployment. diff --git a/src/dlt/gateway/dltApp/package.json b/src/dlt/gateway/dltApp/package.json index 5eabc2dff..9d29b5287 100644 --- a/src/dlt/gateway/dltApp/package.json +++ b/src/dlt/gateway/dltApp/package.json @@ -16,7 +16,7 @@ "start": "node dist/dlt_gateway.js" }, "engineStrict": true, - "author": "CTTC-Javier", + "author": "Javier Jose Diaz (CTTC)", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.10.8", diff --git a/src/dlt/gateway/keys/.gitignore b/src/dlt/gateway/keys/.gitignore index 28d89119f..b54a37fc5 100644 --- a/src/dlt/gateway/keys/.gitignore +++ b/src/dlt/gateway/keys/.gitignore @@ -1,3 +1,3 @@ ca.crt cert.pem -priv_sk \ No newline at end of file +priv_sk diff --git a/src/dlt/gateway/resources/System.png b/src/dlt/gateway/resources/System.png deleted file mode 100644 index f8c6b79f08e44842e7a486ede2477b987cbeb9d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291845 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
0`mI47*@tD5cxnKl3TA+U)& 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⁣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 z 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 kimS{O&&+3Q-Hc`27pg45C8xG diff --git a/src/dlt/gateway/samples/sampleTopo.json b/src/dlt/gateway/samples/sampleTopo.json index 435d0bfbe..67115d4be 100644 --- a/src/dlt/gateway/samples/sampleTopo.json +++ b/src/dlt/gateway/samples/sampleTopo.json @@ -27,4 +27,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/src/dlt/gateway/samples/updatedTopo.json b/src/dlt/gateway/samples/updatedTopo.json index 17f927c89..74b084b9d 100644 --- a/src/dlt/gateway/samples/updatedTopo.json +++ b/src/dlt/gateway/samples/updatedTopo.json @@ -14,4 +14,4 @@ "connections": ["node1"] } ] -} \ No newline at end of file +} diff --git a/src/dlt/gateway/tests/testEvents.js b/src/dlt/gateway/tests/testEvents.js index 8d209723e..6e18e8032 100644 --- a/src/dlt/gateway/tests/testEvents.js +++ b/src/dlt/gateway/tests/testEvents.js @@ -28,7 +28,7 @@ const packageDefinition = protoLoader.loadSync(PROTO_PATH, { const dltProto = grpc.loadPackageDefinition(packageDefinition).dlt; const client = new dltProto.DltGatewayService( - '10.1.1.96:32001', //Replace with TFS server IP_ADDRESS + '127.0.0.1:32001', // Replace with TFS server IP_ADDRESS grpc.credentials.createInsecure() ); diff --git a/src/dlt/gateway/tests/testGateway.js b/src/dlt/gateway/tests/testGateway.js index dde6b3efc..b08f648da 100644 --- a/src/dlt/gateway/tests/testGateway.js +++ b/src/dlt/gateway/tests/testGateway.js @@ -31,7 +31,7 @@ const packageDefinition = protoLoader.loadSync(PROTO_PATH, { const dltProto = grpc.loadPackageDefinition(packageDefinition).dlt; const client = new dltProto.DltGatewayService( - '10.1.1.96:32001', + '127.0.0.1:32001', // Replace with TFS server IP_ADDRESS grpc.credentials.createInsecure() ); -- GitLab From 37977f225c2e3b9baf600acfa4ed32220f6c86c4 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 18 Sep 2024 17:07:08 +0000 Subject: [PATCH 597/602] Pre-merge code cleanup --- manifests/interdomainservice.yaml | 2 ++ my_deploy.sh | 17 +++++----- src/interdomain/service/__main__.py | 21 ++++++------ .../topology_abstractor/DltRecordSender.py | 25 +++++++------- .../topology_abstractor/DltRecorder.py | 33 ++++++++++--------- 5 files changed, 49 insertions(+), 49 deletions(-) diff --git a/manifests/interdomainservice.yaml b/manifests/interdomainservice.yaml index 9be6032cf..8926dcdaf 100644 --- a/manifests/interdomainservice.yaml +++ b/manifests/interdomainservice.yaml @@ -38,6 +38,8 @@ spec: value: "INFO" - name: TOPOLOGY_ABSTRACTOR value: "DISABLE" + - name: DLT_INTEGRATION + value: "DISABLE" readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:10010"] diff --git a/my_deploy.sh b/my_deploy.sh index 3d4572e3e..67ec8615e 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -62,12 +62,13 @@ export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_gene # Uncomment to activate E2E Orchestrator #export TFS_COMPONENTS="${TFS_COMPONENTS} e2e_orchestrator" -# Uncomment to activate DLT -export TFS_COMPONENTS="${TFS_COMPONENTS} interdomain dlt" -export KEY_DIRECTORY_PATH="src/dlt/gateway/keys/priv_sk" -export CERT_DIRECTORY_PATH="src/dlt/gateway/keys/cert.pem" -export TLS_CERT_PATH="src/dlt/gateway/keys/ca.crt" - +# Uncomment to activate DLT and Interdomain +#export TFS_COMPONENTS="${TFS_COMPONENTS} interdomain dlt" +#if [[ "$TFS_COMPONENTS" == *"dlt"* ]]; then +# export KEY_DIRECTORY_PATH="src/dlt/gateway/keys/priv_sk" +# export CERT_DIRECTORY_PATH="src/dlt/gateway/keys/cert.pem" +# export TLS_CERT_PATH="src/dlt/gateway/keys/ca.crt" +#fi # Set the tag you want to use for your images. export TFS_IMAGE_TAG="dev" @@ -116,7 +117,7 @@ export CRDB_DATABASE="tfs" export CRDB_DEPLOY_MODE="single" # Disable flag for dropping database, if it exists. -export CRDB_DROP_DATABASE_IF_EXISTS="YES" +export CRDB_DROP_DATABASE_IF_EXISTS="" # Disable flag for re-deploying CockroachDB from scratch. export CRDB_REDEPLOY="" @@ -168,7 +169,7 @@ export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis" export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups" # Disable flag for dropping tables if they exist. -export QDB_DROP_TABLES_IF_EXIST="YES" +export QDB_DROP_TABLES_IF_EXIST="" # Disable flag for re-deploying QuestDB from scratch. export QDB_REDEPLOY="" diff --git a/src/interdomain/service/__main__.py b/src/interdomain/service/__main__.py index 4181fa73a..dc58603b2 100644 --- a/src/interdomain/service/__main__.py +++ b/src/interdomain/service/__main__.py @@ -19,7 +19,7 @@ from common.Settings import ( ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_log_level, get_metrics_port, wait_for_environment_variables) from interdomain.Config import is_dlt_enabled -#from .topology_abstractor.TopologyAbstractor import TopologyAbstractor +from .topology_abstractor.TopologyAbstractor import TopologyAbstractor from .topology_abstractor.DltRecorder import DLTRecorder from .InterdomainService import InterdomainService from .RemoteDomainClients import RemoteDomainClients @@ -65,14 +65,13 @@ def main(): grpc_service.start() # Subscribe to Context Events - # topology_abstractor_enabled = is_topology_abstractor_enabled() - # if topology_abstractor_enabled: - # topology_abstractor = TopologyAbstractor() - # topology_abstractor.start() - - # Subscribe to Context Events - #dlt_enabled = is_dlt_enabled() #How to change the config? - dlt_enabled = True + topology_abstractor_enabled = is_topology_abstractor_enabled() + if topology_abstractor_enabled: + topology_abstractor = TopologyAbstractor() + topology_abstractor.start() + + # Subscribe to Context Events + dlt_enabled = is_dlt_enabled() if dlt_enabled: LOGGER.info('Starting DLT functionality...') dlt_recorder = DLTRecorder() @@ -82,8 +81,8 @@ def main(): while not terminate.wait(timeout=1.0): pass LOGGER.info('Terminating...') - # if topology_abstractor_enabled: - # topology_abstractor.stop() + if topology_abstractor_enabled: + topology_abstractor.stop() if dlt_enabled: dlt_recorder.stop() grpc_service.stop() diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index ae9fd440b..363cda72a 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -12,10 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import logging -import asyncio - - +import asyncio, logging from typing import Dict, List, Tuple from common.proto.context_pb2 import Device, Link, Service, Slice, TopologyId from common.proto.dlt_connector_pb2 import DltDeviceId, DltLinkId, DltServiceId, DltSliceId @@ -25,42 +22,42 @@ from dlt.connector.client.DltConnectorClientAsync import DltConnectorClientAsync LOGGER = logging.getLogger(__name__) class DltRecordSender: - def __init__(self, context_client: ContextClient) -> None: + def __init__(self, context_client : ContextClient) -> None: self.context_client = context_client LOGGER.debug('Creating Servicer...') self.dlt_connector_client = DltConnectorClientAsync() LOGGER.debug('Servicer Created') - self.dlt_record_uuids: List[str] = list() - self.dlt_record_uuid_to_data: Dict[str, Tuple[TopologyId, object]] = dict() - + self.dlt_record_uuids : List[str] = list() + self.dlt_record_uuid_to_data : Dict[str, Tuple[TopologyId, object]] = dict() + async def initialize(self): await self.dlt_connector_client.connect() - def _add_record(self, record_uuid: str, data: Tuple[TopologyId, object]) -> None: + def _add_record(self, record_uuid : str, data : Tuple[TopologyId, object]) -> None: if record_uuid in self.dlt_record_uuid_to_data: return self.dlt_record_uuid_to_data[record_uuid] = data self.dlt_record_uuids.append(record_uuid) - def add_device(self, topology_id: TopologyId, device: Device) -> None: + def add_device(self, topology_id : TopologyId, device : Device) -> None: topology_uuid = topology_id.topology_uuid.uuid device_uuid = device.device_id.device_uuid.uuid record_uuid = '{:s}:device:{:s}'.format(topology_uuid, device_uuid) self._add_record(record_uuid, (topology_id, device)) - def add_link(self, topology_id: TopologyId, link: Link) -> None: + def add_link(self, topology_id : TopologyId, link : Link) -> None: topology_uuid = topology_id.topology_uuid.uuid link_uuid = link.link_id.link_uuid.uuid record_uuid = '{:s}:link:{:s}'.format(topology_uuid, link_uuid) self._add_record(record_uuid, (topology_id, link)) - def add_service(self, topology_id: TopologyId, service: Service) -> None: + def add_service(self, topology_id : TopologyId, service : Service) -> None: topology_uuid = topology_id.topology_uuid.uuid context_uuid = service.service_id.context_id.context_uuid.uuid service_uuid = service.service_id.service_uuid.uuid record_uuid = '{:s}:service:{:s}/{:s}'.format(topology_uuid, context_uuid, service_uuid) self._add_record(record_uuid, (topology_id, service)) - def add_slice(self, topology_id: TopologyId, slice_: Slice) -> None: + def add_slice(self, topology_id : TopologyId, slice_ : Slice) -> None: topology_uuid = topology_id.topology_uuid.uuid context_uuid = slice_.slice_id.context_id.context_uuid.uuid slice_uuid = slice_.slice_id.slice_uuid.uuid @@ -71,6 +68,7 @@ class DltRecordSender: if not self.dlt_connector_client: LOGGER.error('DLT Connector Client is None, cannot commit records.') return + tasks = [] # List to hold all the async tasks for dlt_record_uuid in self.dlt_record_uuids: @@ -108,4 +106,3 @@ class DltRecordSender: if tasks: await asyncio.gather(*tasks) # Run all the tasks concurrently - diff --git a/src/interdomain/service/topology_abstractor/DltRecorder.py b/src/interdomain/service/topology_abstractor/DltRecorder.py index ae869b7c0..22c436363 100644 --- a/src/interdomain/service/topology_abstractor/DltRecorder.py +++ b/src/interdomain/service/topology_abstractor/DltRecorder.py @@ -14,8 +14,10 @@ import logging, threading, asyncio, time from typing import Dict, Optional -from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum -from common.proto.context_pb2 import ContextEvent, ContextId, Device, DeviceEvent, DeviceId, LinkId, LinkEvent, TopologyId, TopologyEvent +from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME +from common.proto.context_pb2 import ( + ContextEvent, ContextId, DeviceEvent, DeviceId, LinkId, LinkEvent, TopologyId, TopologyEvent +) from common.tools.context_queries.Context import create_context from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id @@ -44,7 +46,6 @@ class DLTRecorder(threading.Thread): self.update_event_queue = asyncio.Queue() self.remove_event_queue = asyncio.Queue() - def stop(self): self.terminate.set() @@ -57,10 +58,9 @@ class DLTRecorder(threading.Thread): #self.create_topologies() self.context_event_collector.start() - batch_timeout = 1 # Time in seconds to wait before processing whatever tasks are available last_task_time = time.time() - + while not self.terminate.is_set(): event = self.context_event_collector.get_event(timeout=0.1) if event: @@ -91,7 +91,7 @@ class DLTRecorder(threading.Thread): # Finally, process REMOVE events await self.process_queue(self.remove_event_queue) - async def process_queue(self, queue: asyncio.Queue): + async def process_queue(self, queue : asyncio.Queue): tasks = [] while not queue.empty(): event = await queue.get() @@ -106,7 +106,7 @@ class DLTRecorder(threading.Thread): except Exception as e: LOGGER.error(f"Error while processing tasks: {e}") - async def update_record(self, event: EventTypes) -> None: + async def update_record(self, event : EventTypes) -> None: dlt_record_sender = DltRecordSender(self.context_client) await dlt_record_sender.initialize() # Ensure DltRecordSender is initialized asynchronously LOGGER.debug('STARTING processing event: {:s}'.format(grpc_message_to_json_string(event))) @@ -135,7 +135,7 @@ class DLTRecorder(threading.Thread): LOGGER.debug('Finished processing event: {:s}'.format(grpc_message_to_json_string(event))) - def process_topology_event(self, event: TopologyEvent, dlt_record_sender: DltRecordSender) -> None: + def process_topology_event(self, event : TopologyEvent, dlt_record_sender : DltRecordSender) -> None: topology_id = event.topology_id topology_uuid = topology_id.topology_uuid.uuid context_id = topology_id.context_id @@ -167,7 +167,7 @@ class DLTRecorder(threading.Thread): args = context_uuid, context_name, topology_uuid, topology_name, grpc_message_to_json_string(event) LOGGER.warning(MSG.format(*args)) - def find_topology_for_device(self, device_id: DeviceId) -> Optional[TopologyId]: + def find_topology_for_device(self, device_id : DeviceId) -> Optional[TopologyId]: for topology_uuid, topology_id in self.topology_cache.items(): details = self.context_client.GetTopologyDetails(topology_id) for device in details.devices: @@ -175,7 +175,7 @@ class DLTRecorder(threading.Thread): return topology_id return None - def find_topology_for_link(self, link_id: LinkId) -> Optional[TopologyId]: + def find_topology_for_link(self, link_id : LinkId) -> Optional[TopologyId]: for topology_uuid, topology_id in self.topology_cache.items(): details = self.context_client.GetTopologyDetails(topology_id) for link in details.links: @@ -183,16 +183,18 @@ class DLTRecorder(threading.Thread): return topology_id return None - def process_device_event(self, event: DeviceEvent, dlt_record_sender: DltRecordSender) -> None: + def process_device_event(self, event : DeviceEvent, dlt_record_sender : DltRecordSender) -> None: device_id = event.device_id device = self.context_client.GetDevice(device_id) topology_id = self.find_topology_for_device(device_id) if topology_id: - LOGGER.debug('DEVICE_INFO({:s}), DEVICE_ID ({:s})'.format(str(device.device_id.device_uuid.uuid), grpc_message_to_json_string(device_id))) - + LOGGER.debug('DEVICE_INFO({:s}), DEVICE_ID ({:s})'.format( + str(device.device_id.device_uuid.uuid), + grpc_message_to_json_string(device_id) + )) dlt_record_sender.add_device(topology_id, device) else: - LOGGER.warning(f"Topology not found for device {device_id.device_uuid.uuid}") + LOGGER.warning("Topology not found for device {:s}".format(str(device_id.device_uuid.uuid))) def process_link_event(self, event: LinkEvent, dlt_record_sender: DltRecordSender) -> None: link_id = event.link_id @@ -201,5 +203,4 @@ class DLTRecorder(threading.Thread): if topology_id: dlt_record_sender.add_link(topology_id, link) else: - LOGGER.warning(f"Topology not found for link {link_id.link_uuid.uuid}") - + LOGGER.warning("Topology not found for link {:s}".format(str(link_id.link_uuid.uuid))) -- GitLab From db324b926b31a8146ab4b84673f25b83102d5eba Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Wed, 18 Sep 2024 17:10:34 +0000 Subject: [PATCH 598/602] Pre-merge code cleanup --- src/interdomain/service/__main__.py | 2 +- .../topology_abstractor/DltRecordSender.py | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/interdomain/service/__main__.py b/src/interdomain/service/__main__.py index dc58603b2..7ab9682c2 100644 --- a/src/interdomain/service/__main__.py +++ b/src/interdomain/service/__main__.py @@ -18,7 +18,7 @@ from common.Constants import ServiceNameEnum from common.Settings import ( ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_log_level, get_metrics_port, wait_for_environment_variables) -from interdomain.Config import is_dlt_enabled +from interdomain.Config import is_dlt_enabled, is_topology_abstractor_enabled from .topology_abstractor.TopologyAbstractor import TopologyAbstractor from .topology_abstractor.DltRecorder import DLTRecorder from .InterdomainService import InterdomainService diff --git a/src/interdomain/service/topology_abstractor/DltRecordSender.py b/src/interdomain/service/topology_abstractor/DltRecordSender.py index 363cda72a..5c53edc59 100644 --- a/src/interdomain/service/topology_abstractor/DltRecordSender.py +++ b/src/interdomain/service/topology_abstractor/DltRecordSender.py @@ -77,29 +77,29 @@ class DltRecordSender: device_id = dlt_record.device_id if self.dlt_connector_client is None: continue dlt_device_id = DltDeviceId() - dlt_device_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member - dlt_device_id.device_id.CopyFrom(device_id) # pylint: disable=no-member + dlt_device_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member + dlt_device_id.device_id.CopyFrom(device_id) # pylint: disable=no-member tasks.append(self.dlt_connector_client.RecordDevice(dlt_device_id)) elif isinstance(dlt_record, Link): link_id = dlt_record.link_id if self.dlt_connector_client is None: continue dlt_link_id = DltLinkId() - dlt_link_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member - dlt_link_id.link_id.CopyFrom(link_id) # pylint: disable=no-member + dlt_link_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member + dlt_link_id.link_id.CopyFrom(link_id) # pylint: disable=no-member tasks.append(self.dlt_connector_client.RecordLink(dlt_link_id)) elif isinstance(dlt_record, Service): service_id = dlt_record.service_id if self.dlt_connector_client is None: continue dlt_service_id = DltServiceId() - dlt_service_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member - dlt_service_id.service_id.CopyFrom(service_id) # pylint: disable=no-member + dlt_service_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member + dlt_service_id.service_id.CopyFrom(service_id) # pylint: disable=no-member tasks.append(self.dlt_connector_client.RecordService(dlt_service_id)) elif isinstance(dlt_record, Slice): slice_id = dlt_record.slice_id if self.dlt_connector_client is None: continue dlt_slice_id = DltSliceId() - dlt_slice_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member - dlt_slice_id.slice_id.CopyFrom(slice_id) # pylint: disable=no-member + dlt_slice_id.topology_id.CopyFrom(topology_id) # pylint: disable=no-member + dlt_slice_id.slice_id.CopyFrom(slice_id) # pylint: disable=no-member tasks.append(self.dlt_connector_client.RecordSlice(dlt_slice_id)) else: LOGGER.error(f'Unsupported Record({str(dlt_record)})') -- GitLab From 8a0a6b31fb01f99688cb8ddc6a9b7974c76047a7 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 19 Sep 2024 12:29:58 +0000 Subject: [PATCH 599/602] Pre-merge code cleanup --- src/device/service/drivers/qkd/QKDDriver.py | 1 - src/device/service/drivers/qkd/__init__.py | 2 +- .../test_external_qkd_retrieve_information.py | 4 +- .../tests/qkd/unit/generated/context_pb2.py | 994 --------- .../qkd/unit/generated/context_pb2_grpc.py | 1849 ----------------- .../qkd/unit/test_application_deployment.py | 2 +- .../tests/qkd/unit/test_qkd_configuration.py | 4 +- .../tests/qkd/unit/test_qkd_error_hanling.py | 8 +- .../qkd/unit/test_qkd_mock_connectivity.py | 7 +- .../tests/qkd/unit/test_qkd_performance.py | 5 +- .../tests/qkd/unit/test_qkd_security.py | 8 +- .../tests/qkd/unit/test_qkd_subscription.py | 2 +- .../tests/qkd/unit/test_qkd_unsubscription.py | 2 +- ...ation.py => test_set_new_configuration.py} | 8 +- 14 files changed, 23 insertions(+), 2873 deletions(-) delete mode 100644 src/device/tests/qkd/unit/generated/context_pb2.py delete mode 100644 src/device/tests/qkd/unit/generated/context_pb2_grpc.py rename src/device/tests/qkd/unit/{test_set_new configuration.py => test_set_new_configuration.py} (96%) diff --git a/src/device/service/drivers/qkd/QKDDriver.py b/src/device/service/drivers/qkd/QKDDriver.py index beded9bad..a49144d6f 100644 --- a/src/device/service/drivers/qkd/QKDDriver.py +++ b/src/device/service/drivers/qkd/QKDDriver.py @@ -166,4 +166,3 @@ class QKDDriver(_Driver): # TODO: QKD API Driver does not support monitoring by now LOGGER.info(f'GetState {self.address} called') return [] - diff --git a/src/device/service/drivers/qkd/__init__.py b/src/device/service/drivers/qkd/__init__.py index 15a32c574..e24e5523a 100644 --- a/src/device/service/drivers/qkd/__init__.py +++ b/src/device/service/drivers/qkd/__init__.py @@ -24,4 +24,4 @@ RESOURCE_KEY_MAPPINGS = { RESOURCE_APPS : 'apps', RESOURCE_CAPABILITES : 'capabilities', RESOURCE_NODE : 'node' -} \ No newline at end of file +} diff --git a/src/device/tests/qkd/integration/test_external_qkd_retrieve_information.py b/src/device/tests/qkd/integration/test_external_qkd_retrieve_information.py index 700782523..0bb91191a 100644 --- a/src/device/tests/qkd/integration/test_external_qkd_retrieve_information.py +++ b/src/device/tests/qkd/integration/test_external_qkd_retrieve_information.py @@ -16,8 +16,8 @@ import pytest import requests import json import os -from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver -from src.device.service.drivers.qkd.Tools2 import ( +from device.service.drivers.qkd.QKDDriver2 import QKDDriver +from device.service.drivers.qkd.Tools2 import ( RESOURCE_INTERFACES, RESOURCE_LINKS, RESOURCE_CAPABILITES, diff --git a/src/device/tests/qkd/unit/generated/context_pb2.py b/src/device/tests/qkd/unit/generated/context_pb2.py deleted file mode 100644 index 89c70075b..000000000 --- a/src/device/tests/qkd/unit/generated/context_pb2.py +++ /dev/null @@ -1,994 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: context.proto -"""Generated protocol buffer code.""" -from google.protobuf.internal import enum_type_wrapper -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -import acl_pb2 as acl__pb2 -import kpi_sample_types_pb2 as kpi__sample__types__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rcontext.proto\x12\x07\x63ontext\x1a\tacl.proto\x1a\x16kpi_sample_types.proto\"\x07\n\x05\x45mpty\"\x14\n\x04Uuid\x12\x0c\n\x04uuid\x18\x01 \x01(\t\"\x1e\n\tTimestamp\x12\x11\n\ttimestamp\x18\x01 \x01(\x01\"Z\n\x05\x45vent\x12%\n\ttimestamp\x18\x01 \x01(\x0b\x32\x12.context.Timestamp\x12*\n\nevent_type\x18\x02 \x01(\x0e\x32\x16.context.EventTypeEnum\"0\n\tContextId\x12#\n\x0c\x63ontext_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"\xe9\x01\n\x07\x43ontext\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x0c\n\x04name\x18\x02 \x01(\t\x12)\n\x0ctopology_ids\x18\x03 \x03(\x0b\x32\x13.context.TopologyId\x12\'\n\x0bservice_ids\x18\x04 \x03(\x0b\x32\x12.context.ServiceId\x12#\n\tslice_ids\x18\x05 \x03(\x0b\x32\x10.context.SliceId\x12/\n\ncontroller\x18\x06 \x01(\x0b\x32\x1b.context.TeraFlowController\"8\n\rContextIdList\x12\'\n\x0b\x63ontext_ids\x18\x01 \x03(\x0b\x32\x12.context.ContextId\"1\n\x0b\x43ontextList\x12\"\n\x08\x63ontexts\x18\x01 \x03(\x0b\x32\x10.context.Context\"U\n\x0c\x43ontextEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12&\n\ncontext_id\x18\x02 \x01(\x0b\x32\x12.context.ContextId\"Z\n\nTopologyId\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12$\n\rtopology_uuid\x18\x02 \x01(\x0b\x32\r.context.Uuid\"\x8c\x01\n\x08Topology\x12(\n\x0btopology_id\x18\x01 \x01(\x0b\x32\x13.context.TopologyId\x12\x0c\n\x04name\x18\x02 \x01(\t\x12%\n\ndevice_ids\x18\x03 \x03(\x0b\x32\x11.context.DeviceId\x12!\n\x08link_ids\x18\x04 \x03(\x0b\x32\x0f.context.LinkId\"\x89\x01\n\x0fTopologyDetails\x12(\n\x0btopology_id\x18\x01 \x01(\x0b\x32\x13.context.TopologyId\x12\x0c\n\x04name\x18\x02 \x01(\t\x12 \n\x07\x64\x65vices\x18\x03 \x03(\x0b\x32\x0f.context.Device\x12\x1c\n\x05links\x18\x04 \x03(\x0b\x32\r.context.Link\";\n\x0eTopologyIdList\x12)\n\x0ctopology_ids\x18\x01 \x03(\x0b\x32\x13.context.TopologyId\"5\n\x0cTopologyList\x12%\n\ntopologies\x18\x01 \x03(\x0b\x32\x11.context.Topology\"X\n\rTopologyEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12(\n\x0btopology_id\x18\x02 \x01(\x0b\x32\x13.context.TopologyId\".\n\x08\x44\x65viceId\x12\"\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"\xfa\x02\n\x06\x44\x65vice\x12$\n\tdevice_id\x18\x01 \x01(\x0b\x32\x11.context.DeviceId\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65vice_type\x18\x03 \x01(\t\x12,\n\rdevice_config\x18\x04 \x01(\x0b\x32\x15.context.DeviceConfig\x12G\n\x19\x64\x65vice_operational_status\x18\x05 \x01(\x0e\x32$.context.DeviceOperationalStatusEnum\x12\x31\n\x0e\x64\x65vice_drivers\x18\x06 \x03(\x0e\x32\x19.context.DeviceDriverEnum\x12+\n\x10\x64\x65vice_endpoints\x18\x07 \x03(\x0b\x32\x11.context.EndPoint\x12&\n\ncomponents\x18\x08 \x03(\x0b\x32\x12.context.Component\x12(\n\rcontroller_id\x18\t \x01(\x0b\x32\x11.context.DeviceId\"\xc9\x01\n\tComponent\x12%\n\x0e\x63omponent_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x36\n\nattributes\x18\x04 \x03(\x0b\x32\".context.Component.AttributesEntry\x12\x0e\n\x06parent\x18\x05 \x01(\t\x1a\x31\n\x0f\x41ttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"9\n\x0c\x44\x65viceConfig\x12)\n\x0c\x63onfig_rules\x18\x01 \x03(\x0b\x32\x13.context.ConfigRule\"5\n\x0c\x44\x65viceIdList\x12%\n\ndevice_ids\x18\x01 \x03(\x0b\x32\x11.context.DeviceId\".\n\nDeviceList\x12 \n\x07\x64\x65vices\x18\x01 \x03(\x0b\x32\x0f.context.Device\"\x8e\x01\n\x0c\x44\x65viceFilter\x12)\n\ndevice_ids\x18\x01 \x01(\x0b\x32\x15.context.DeviceIdList\x12\x19\n\x11include_endpoints\x18\x02 \x01(\x08\x12\x1c\n\x14include_config_rules\x18\x03 \x01(\x08\x12\x1a\n\x12include_components\x18\x04 \x01(\x08\"\x80\x01\n\x0b\x44\x65viceEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12$\n\tdevice_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\x12,\n\rdevice_config\x18\x03 \x01(\x0b\x32\x15.context.DeviceConfig\"*\n\x06LinkId\x12 \n\tlink_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"I\n\x0eLinkAttributes\x12\x1b\n\x13total_capacity_gbps\x18\x01 \x01(\x02\x12\x1a\n\x12used_capacity_gbps\x18\x02 \x01(\x02\"\x93\x01\n\x04Link\x12 \n\x07link_id\x18\x01 \x01(\x0b\x32\x0f.context.LinkId\x12\x0c\n\x04name\x18\x02 \x01(\t\x12.\n\x11link_endpoint_ids\x18\x03 \x03(\x0b\x32\x13.context.EndPointId\x12+\n\nattributes\x18\x04 \x01(\x0b\x32\x17.context.LinkAttributes\"/\n\nLinkIdList\x12!\n\x08link_ids\x18\x01 \x03(\x0b\x32\x0f.context.LinkId\"(\n\x08LinkList\x12\x1c\n\x05links\x18\x01 \x03(\x0b\x32\r.context.Link\"L\n\tLinkEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12 \n\x07link_id\x18\x02 \x01(\x0b\x32\x0f.context.LinkId\"X\n\tServiceId\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12#\n\x0cservice_uuid\x18\x02 \x01(\x0b\x32\r.context.Uuid\"\xdb\x02\n\x07Service\x12&\n\nservice_id\x18\x01 \x01(\x0b\x32\x12.context.ServiceId\x12\x0c\n\x04name\x18\x02 \x01(\t\x12.\n\x0cservice_type\x18\x03 \x01(\x0e\x32\x18.context.ServiceTypeEnum\x12\x31\n\x14service_endpoint_ids\x18\x04 \x03(\x0b\x32\x13.context.EndPointId\x12\x30\n\x13service_constraints\x18\x05 \x03(\x0b\x32\x13.context.Constraint\x12.\n\x0eservice_status\x18\x06 \x01(\x0b\x32\x16.context.ServiceStatus\x12.\n\x0eservice_config\x18\x07 \x01(\x0b\x32\x16.context.ServiceConfig\x12%\n\ttimestamp\x18\x08 \x01(\x0b\x32\x12.context.Timestamp\"C\n\rServiceStatus\x12\x32\n\x0eservice_status\x18\x01 \x01(\x0e\x32\x1a.context.ServiceStatusEnum\":\n\rServiceConfig\x12)\n\x0c\x63onfig_rules\x18\x01 \x03(\x0b\x32\x13.context.ConfigRule\"8\n\rServiceIdList\x12\'\n\x0bservice_ids\x18\x01 \x03(\x0b\x32\x12.context.ServiceId\"1\n\x0bServiceList\x12\"\n\x08services\x18\x01 \x03(\x0b\x32\x10.context.Service\"\x95\x01\n\rServiceFilter\x12+\n\x0bservice_ids\x18\x01 \x01(\x0b\x32\x16.context.ServiceIdList\x12\x1c\n\x14include_endpoint_ids\x18\x02 \x01(\x08\x12\x1b\n\x13include_constraints\x18\x03 \x01(\x08\x12\x1c\n\x14include_config_rules\x18\x04 \x01(\x08\"U\n\x0cServiceEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12&\n\nservice_id\x18\x02 \x01(\x0b\x32\x12.context.ServiceId\"T\n\x07SliceId\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12!\n\nslice_uuid\x18\x02 \x01(\x0b\x32\r.context.Uuid\"\xa0\x03\n\x05Slice\x12\"\n\x08slice_id\x18\x01 \x01(\x0b\x32\x10.context.SliceId\x12\x0c\n\x04name\x18\x02 \x01(\t\x12/\n\x12slice_endpoint_ids\x18\x03 \x03(\x0b\x32\x13.context.EndPointId\x12.\n\x11slice_constraints\x18\x04 \x03(\x0b\x32\x13.context.Constraint\x12-\n\x11slice_service_ids\x18\x05 \x03(\x0b\x32\x12.context.ServiceId\x12,\n\x12slice_subslice_ids\x18\x06 \x03(\x0b\x32\x10.context.SliceId\x12*\n\x0cslice_status\x18\x07 \x01(\x0b\x32\x14.context.SliceStatus\x12*\n\x0cslice_config\x18\x08 \x01(\x0b\x32\x14.context.SliceConfig\x12(\n\x0bslice_owner\x18\t \x01(\x0b\x32\x13.context.SliceOwner\x12%\n\ttimestamp\x18\n \x01(\x0b\x32\x12.context.Timestamp\"E\n\nSliceOwner\x12!\n\nowner_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\x12\x14\n\x0cowner_string\x18\x02 \x01(\t\"=\n\x0bSliceStatus\x12.\n\x0cslice_status\x18\x01 \x01(\x0e\x32\x18.context.SliceStatusEnum\"8\n\x0bSliceConfig\x12)\n\x0c\x63onfig_rules\x18\x01 \x03(\x0b\x32\x13.context.ConfigRule\"2\n\x0bSliceIdList\x12#\n\tslice_ids\x18\x01 \x03(\x0b\x32\x10.context.SliceId\"+\n\tSliceList\x12\x1e\n\x06slices\x18\x01 \x03(\x0b\x32\x0e.context.Slice\"\xca\x01\n\x0bSliceFilter\x12\'\n\tslice_ids\x18\x01 \x01(\x0b\x32\x14.context.SliceIdList\x12\x1c\n\x14include_endpoint_ids\x18\x02 \x01(\x08\x12\x1b\n\x13include_constraints\x18\x03 \x01(\x08\x12\x1b\n\x13include_service_ids\x18\x04 \x01(\x08\x12\x1c\n\x14include_subslice_ids\x18\x05 \x01(\x08\x12\x1c\n\x14include_config_rules\x18\x06 \x01(\x08\"O\n\nSliceEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12\"\n\x08slice_id\x18\x02 \x01(\x0b\x32\x10.context.SliceId\"6\n\x0c\x43onnectionId\x12&\n\x0f\x63onnection_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"2\n\x15\x43onnectionSettings_L0\x12\x19\n\x11lsp_symbolic_name\x18\x01 \x01(\t\"\x9e\x01\n\x15\x43onnectionSettings_L2\x12\x17\n\x0fsrc_mac_address\x18\x01 \x01(\t\x12\x17\n\x0f\x64st_mac_address\x18\x02 \x01(\t\x12\x12\n\nether_type\x18\x03 \x01(\r\x12\x0f\n\x07vlan_id\x18\x04 \x01(\r\x12\x12\n\nmpls_label\x18\x05 \x01(\r\x12\x1a\n\x12mpls_traffic_class\x18\x06 \x01(\r\"t\n\x15\x43onnectionSettings_L3\x12\x16\n\x0esrc_ip_address\x18\x01 \x01(\t\x12\x16\n\x0e\x64st_ip_address\x18\x02 \x01(\t\x12\x0c\n\x04\x64scp\x18\x03 \x01(\r\x12\x10\n\x08protocol\x18\x04 \x01(\r\x12\x0b\n\x03ttl\x18\x05 \x01(\r\"[\n\x15\x43onnectionSettings_L4\x12\x10\n\x08src_port\x18\x01 \x01(\r\x12\x10\n\x08\x64st_port\x18\x02 \x01(\r\x12\x11\n\ttcp_flags\x18\x03 \x01(\r\x12\x0b\n\x03ttl\x18\x04 \x01(\r\"\xc4\x01\n\x12\x43onnectionSettings\x12*\n\x02l0\x18\x01 \x01(\x0b\x32\x1e.context.ConnectionSettings_L0\x12*\n\x02l2\x18\x02 \x01(\x0b\x32\x1e.context.ConnectionSettings_L2\x12*\n\x02l3\x18\x03 \x01(\x0b\x32\x1e.context.ConnectionSettings_L3\x12*\n\x02l4\x18\x04 \x01(\x0b\x32\x1e.context.ConnectionSettings_L4\"\xf3\x01\n\nConnection\x12,\n\rconnection_id\x18\x01 \x01(\x0b\x32\x15.context.ConnectionId\x12&\n\nservice_id\x18\x02 \x01(\x0b\x32\x12.context.ServiceId\x12\x33\n\x16path_hops_endpoint_ids\x18\x03 \x03(\x0b\x32\x13.context.EndPointId\x12+\n\x0fsub_service_ids\x18\x04 \x03(\x0b\x32\x12.context.ServiceId\x12-\n\x08settings\x18\x05 \x01(\x0b\x32\x1b.context.ConnectionSettings\"A\n\x10\x43onnectionIdList\x12-\n\x0e\x63onnection_ids\x18\x01 \x03(\x0b\x32\x15.context.ConnectionId\":\n\x0e\x43onnectionList\x12(\n\x0b\x63onnections\x18\x01 \x03(\x0b\x32\x13.context.Connection\"^\n\x0f\x43onnectionEvent\x12\x1d\n\x05\x65vent\x18\x01 \x01(\x0b\x32\x0e.context.Event\x12,\n\rconnection_id\x18\x02 \x01(\x0b\x32\x15.context.ConnectionId\"\x82\x01\n\nEndPointId\x12(\n\x0btopology_id\x18\x01 \x01(\x0b\x32\x13.context.TopologyId\x12$\n\tdevice_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\x12$\n\rendpoint_uuid\x18\x03 \x01(\x0b\x32\r.context.Uuid\"\xc2\x01\n\x08\x45ndPoint\x12(\n\x0b\x65ndpoint_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x15\n\rendpoint_type\x18\x03 \x01(\t\x12\x39\n\x10kpi_sample_types\x18\x04 \x03(\x0e\x32\x1f.kpi_sample_types.KpiSampleType\x12,\n\x11\x65ndpoint_location\x18\x05 \x01(\x0b\x32\x11.context.Location\"{\n\x0c\x45ndPointName\x12(\n\x0b\x65ndpoint_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12\x13\n\x0b\x64\x65vice_name\x18\x02 \x01(\t\x12\x15\n\rendpoint_name\x18\x03 \x01(\t\x12\x15\n\rendpoint_type\x18\x04 \x01(\t\";\n\x0e\x45ndPointIdList\x12)\n\x0c\x65ndpoint_ids\x18\x01 \x03(\x0b\x32\x13.context.EndPointId\"A\n\x10\x45ndPointNameList\x12-\n\x0e\x65ndpoint_names\x18\x01 \x03(\x0b\x32\x15.context.EndPointName\"A\n\x11\x43onfigRule_Custom\x12\x14\n\x0cresource_key\x18\x01 \x01(\t\x12\x16\n\x0eresource_value\x18\x02 \x01(\t\"]\n\x0e\x43onfigRule_ACL\x12(\n\x0b\x65ndpoint_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12!\n\x08rule_set\x18\x02 \x01(\x0b\x32\x0f.acl.AclRuleSet\"\x9c\x01\n\nConfigRule\x12)\n\x06\x61\x63tion\x18\x01 \x01(\x0e\x32\x19.context.ConfigActionEnum\x12,\n\x06\x63ustom\x18\x02 \x01(\x0b\x32\x1a.context.ConfigRule_CustomH\x00\x12&\n\x03\x61\x63l\x18\x03 \x01(\x0b\x32\x17.context.ConfigRule_ACLH\x00\x42\r\n\x0b\x63onfig_rule\"F\n\x11\x43onstraint_Custom\x12\x17\n\x0f\x63onstraint_type\x18\x01 \x01(\t\x12\x18\n\x10\x63onstraint_value\x18\x02 \x01(\t\"E\n\x13\x43onstraint_Schedule\x12\x17\n\x0fstart_timestamp\x18\x01 \x01(\x02\x12\x15\n\rduration_days\x18\x02 \x01(\x02\"3\n\x0cGPS_Position\x12\x10\n\x08latitude\x18\x01 \x01(\x02\x12\x11\n\tlongitude\x18\x02 \x01(\x02\"W\n\x08Location\x12\x10\n\x06region\x18\x01 \x01(\tH\x00\x12-\n\x0cgps_position\x18\x02 \x01(\x0b\x32\x15.context.GPS_PositionH\x00\x42\n\n\x08location\"l\n\x1b\x43onstraint_EndPointLocation\x12(\n\x0b\x65ndpoint_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12#\n\x08location\x18\x02 \x01(\x0b\x32\x11.context.Location\"Y\n\x1b\x43onstraint_EndPointPriority\x12(\n\x0b\x65ndpoint_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12\x10\n\x08priority\x18\x02 \x01(\r\"0\n\x16\x43onstraint_SLA_Latency\x12\x16\n\x0e\x65\x32\x65_latency_ms\x18\x01 \x01(\x02\"0\n\x17\x43onstraint_SLA_Capacity\x12\x15\n\rcapacity_gbps\x18\x01 \x01(\x02\"c\n\x1b\x43onstraint_SLA_Availability\x12\x1a\n\x12num_disjoint_paths\x18\x01 \x01(\r\x12\x12\n\nall_active\x18\x02 \x01(\x08\x12\x14\n\x0c\x61vailability\x18\x03 \x01(\x02\"V\n\x1e\x43onstraint_SLA_Isolation_level\x12\x34\n\x0fisolation_level\x18\x01 \x03(\x0e\x32\x1b.context.IsolationLevelEnum\"\xa2\x01\n\x15\x43onstraint_Exclusions\x12\x14\n\x0cis_permanent\x18\x01 \x01(\x08\x12%\n\ndevice_ids\x18\x02 \x03(\x0b\x32\x11.context.DeviceId\x12)\n\x0c\x65ndpoint_ids\x18\x03 \x03(\x0b\x32\x13.context.EndPointId\x12!\n\x08link_ids\x18\x04 \x03(\x0b\x32\x0f.context.LinkId\"\xdb\x04\n\nConstraint\x12-\n\x06\x61\x63tion\x18\x01 \x01(\x0e\x32\x1d.context.ConstraintActionEnum\x12,\n\x06\x63ustom\x18\x02 \x01(\x0b\x32\x1a.context.Constraint_CustomH\x00\x12\x30\n\x08schedule\x18\x03 \x01(\x0b\x32\x1c.context.Constraint_ScheduleH\x00\x12\x41\n\x11\x65ndpoint_location\x18\x04 \x01(\x0b\x32$.context.Constraint_EndPointLocationH\x00\x12\x41\n\x11\x65ndpoint_priority\x18\x05 \x01(\x0b\x32$.context.Constraint_EndPointPriorityH\x00\x12\x38\n\x0csla_capacity\x18\x06 \x01(\x0b\x32 .context.Constraint_SLA_CapacityH\x00\x12\x36\n\x0bsla_latency\x18\x07 \x01(\x0b\x32\x1f.context.Constraint_SLA_LatencyH\x00\x12@\n\x10sla_availability\x18\x08 \x01(\x0b\x32$.context.Constraint_SLA_AvailabilityH\x00\x12@\n\rsla_isolation\x18\t \x01(\x0b\x32\'.context.Constraint_SLA_Isolation_levelH\x00\x12\x34\n\nexclusions\x18\n \x01(\x0b\x32\x1e.context.Constraint_ExclusionsH\x00\x42\x0c\n\nconstraint\"^\n\x12TeraFlowController\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x12\n\nip_address\x18\x02 \x01(\t\x12\x0c\n\x04port\x18\x03 \x01(\r\"U\n\x14\x41uthenticationResult\x12&\n\ncontext_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x15\n\rauthenticated\x18\x02 \x01(\x08\"-\n\x0fOpticalConfigId\x12\x1a\n\x12opticalconfig_uuid\x18\x01 \x01(\t\"S\n\rOpticalConfig\x12\x32\n\x10opticalconfig_id\x18\x01 \x01(\x0b\x32\x18.context.OpticalConfigId\x12\x0e\n\x06\x63onfig\x18\x02 \x01(\t\"C\n\x11OpticalConfigList\x12.\n\x0eopticalconfigs\x18\x01 \x03(\x0b\x32\x16.context.OpticalConfig\"9\n\rOpticalLinkId\x12(\n\x11optical_link_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\",\n\x07\x46iberId\x12!\n\nfiber_uuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"\xe1\x01\n\x05\x46iber\x12\n\n\x02ID\x18\n \x01(\t\x12\x10\n\x08src_port\x18\x01 \x01(\t\x12\x10\n\x08\x64st_port\x18\x02 \x01(\t\x12\x17\n\x0flocal_peer_port\x18\x03 \x01(\t\x12\x18\n\x10remote_peer_port\x18\x04 \x01(\t\x12\x0f\n\x07\x63_slots\x18\x05 \x03(\x05\x12\x0f\n\x07l_slots\x18\x06 \x03(\x05\x12\x0f\n\x07s_slots\x18\x07 \x03(\x05\x12\x0e\n\x06length\x18\x08 \x01(\x02\x12\x0c\n\x04used\x18\t \x01(\x08\x12$\n\nfiber_uuid\x18\x0b \x01(\x0b\x32\x10.context.FiberId\"d\n\x12OpticalLinkDetails\x12\x0e\n\x06length\x18\x01 \x01(\x02\x12\x0e\n\x06source\x18\x02 \x01(\t\x12\x0e\n\x06target\x18\x03 \x01(\t\x12\x1e\n\x06\x66ibers\x18\x04 \x03(\x0b\x32\x0e.context.Fiber\"|\n\x0bOpticalLink\x12\x0c\n\x04name\x18\x01 \x01(\t\x12,\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x1b.context.OpticalLinkDetails\x12\x31\n\x11optical_link_uuid\x18\x03 \x01(\x0b\x32\x16.context.OpticalLinkId*j\n\rEventTypeEnum\x12\x17\n\x13\x45VENTTYPE_UNDEFINED\x10\x00\x12\x14\n\x10\x45VENTTYPE_CREATE\x10\x01\x12\x14\n\x10\x45VENTTYPE_UPDATE\x10\x02\x12\x14\n\x10\x45VENTTYPE_REMOVE\x10\x03*\xfe\x02\n\x10\x44\x65viceDriverEnum\x12\x1a\n\x16\x44\x45VICEDRIVER_UNDEFINED\x10\x00\x12\x1b\n\x17\x44\x45VICEDRIVER_OPENCONFIG\x10\x01\x12\x1e\n\x1a\x44\x45VICEDRIVER_TRANSPORT_API\x10\x02\x12\x13\n\x0f\x44\x45VICEDRIVER_P4\x10\x03\x12&\n\"DEVICEDRIVER_IETF_NETWORK_TOPOLOGY\x10\x04\x12\x1b\n\x17\x44\x45VICEDRIVER_ONF_TR_532\x10\x05\x12\x13\n\x0f\x44\x45VICEDRIVER_XR\x10\x06\x12\x1b\n\x17\x44\x45VICEDRIVER_IETF_L2VPN\x10\x07\x12 \n\x1c\x44\x45VICEDRIVER_GNMI_OPENCONFIG\x10\x08\x12\x1c\n\x18\x44\x45VICEDRIVER_OPTICAL_TFS\x10\t\x12\x1a\n\x16\x44\x45VICEDRIVER_IETF_ACTN\x10\n\x12\x13\n\x0f\x44\x45VICEDRIVER_OC\x10\x0b\x12\x14\n\x10\x44\x45VICEDRIVER_QKD\x10\x0c*\x8f\x01\n\x1b\x44\x65viceOperationalStatusEnum\x12%\n!DEVICEOPERATIONALSTATUS_UNDEFINED\x10\x00\x12$\n DEVICEOPERATIONALSTATUS_DISABLED\x10\x01\x12#\n\x1f\x44\x45VICEOPERATIONALSTATUS_ENABLED\x10\x02*\xe5\x01\n\x0fServiceTypeEnum\x12\x17\n\x13SERVICETYPE_UNKNOWN\x10\x00\x12\x14\n\x10SERVICETYPE_L3NM\x10\x01\x12\x14\n\x10SERVICETYPE_L2NM\x10\x02\x12)\n%SERVICETYPE_TAPI_CONNECTIVITY_SERVICE\x10\x03\x12\x12\n\x0eSERVICETYPE_TE\x10\x04\x12\x13\n\x0fSERVICETYPE_E2E\x10\x05\x12$\n SERVICETYPE_OPTICAL_CONNECTIVITY\x10\x06\x12\x13\n\x0fSERVICETYPE_QKD\x10\x07*\xc4\x01\n\x11ServiceStatusEnum\x12\x1b\n\x17SERVICESTATUS_UNDEFINED\x10\x00\x12\x19\n\x15SERVICESTATUS_PLANNED\x10\x01\x12\x18\n\x14SERVICESTATUS_ACTIVE\x10\x02\x12\x1a\n\x16SERVICESTATUS_UPDATING\x10\x03\x12!\n\x1dSERVICESTATUS_PENDING_REMOVAL\x10\x04\x12\x1e\n\x1aSERVICESTATUS_SLA_VIOLATED\x10\x05*\xa9\x01\n\x0fSliceStatusEnum\x12\x19\n\x15SLICESTATUS_UNDEFINED\x10\x00\x12\x17\n\x13SLICESTATUS_PLANNED\x10\x01\x12\x14\n\x10SLICESTATUS_INIT\x10\x02\x12\x16\n\x12SLICESTATUS_ACTIVE\x10\x03\x12\x16\n\x12SLICESTATUS_DEINIT\x10\x04\x12\x1c\n\x18SLICESTATUS_SLA_VIOLATED\x10\x05*]\n\x10\x43onfigActionEnum\x12\x1a\n\x16\x43ONFIGACTION_UNDEFINED\x10\x00\x12\x14\n\x10\x43ONFIGACTION_SET\x10\x01\x12\x17\n\x13\x43ONFIGACTION_DELETE\x10\x02*m\n\x14\x43onstraintActionEnum\x12\x1e\n\x1a\x43ONSTRAINTACTION_UNDEFINED\x10\x00\x12\x18\n\x14\x43ONSTRAINTACTION_SET\x10\x01\x12\x1b\n\x17\x43ONSTRAINTACTION_DELETE\x10\x02*\x83\x02\n\x12IsolationLevelEnum\x12\x10\n\x0cNO_ISOLATION\x10\x00\x12\x16\n\x12PHYSICAL_ISOLATION\x10\x01\x12\x15\n\x11LOGICAL_ISOLATION\x10\x02\x12\x15\n\x11PROCESS_ISOLATION\x10\x03\x12\x1d\n\x19PHYSICAL_MEMORY_ISOLATION\x10\x04\x12\x1e\n\x1aPHYSICAL_NETWORK_ISOLATION\x10\x05\x12\x1e\n\x1aVIRTUAL_RESOURCE_ISOLATION\x10\x06\x12\x1f\n\x1bNETWORK_FUNCTIONS_ISOLATION\x10\x07\x12\x15\n\x11SERVICE_ISOLATION\x10\x08\x32\xa6\x19\n\x0e\x43ontextService\x12:\n\x0eListContextIds\x12\x0e.context.Empty\x1a\x16.context.ContextIdList\"\x00\x12\x36\n\x0cListContexts\x12\x0e.context.Empty\x1a\x14.context.ContextList\"\x00\x12\x34\n\nGetContext\x12\x12.context.ContextId\x1a\x10.context.Context\"\x00\x12\x34\n\nSetContext\x12\x10.context.Context\x1a\x12.context.ContextId\"\x00\x12\x35\n\rRemoveContext\x12\x12.context.ContextId\x1a\x0e.context.Empty\"\x00\x12=\n\x10GetContextEvents\x12\x0e.context.Empty\x1a\x15.context.ContextEvent\"\x00\x30\x01\x12@\n\x0fListTopologyIds\x12\x12.context.ContextId\x1a\x17.context.TopologyIdList\"\x00\x12=\n\x0eListTopologies\x12\x12.context.ContextId\x1a\x15.context.TopologyList\"\x00\x12\x37\n\x0bGetTopology\x12\x13.context.TopologyId\x1a\x11.context.Topology\"\x00\x12\x45\n\x12GetTopologyDetails\x12\x13.context.TopologyId\x1a\x18.context.TopologyDetails\"\x00\x12\x37\n\x0bSetTopology\x12\x11.context.Topology\x1a\x13.context.TopologyId\"\x00\x12\x37\n\x0eRemoveTopology\x12\x13.context.TopologyId\x1a\x0e.context.Empty\"\x00\x12?\n\x11GetTopologyEvents\x12\x0e.context.Empty\x1a\x16.context.TopologyEvent\"\x00\x30\x01\x12\x38\n\rListDeviceIds\x12\x0e.context.Empty\x1a\x15.context.DeviceIdList\"\x00\x12\x34\n\x0bListDevices\x12\x0e.context.Empty\x1a\x13.context.DeviceList\"\x00\x12\x31\n\tGetDevice\x12\x11.context.DeviceId\x1a\x0f.context.Device\"\x00\x12\x31\n\tSetDevice\x12\x0f.context.Device\x1a\x11.context.DeviceId\"\x00\x12\x33\n\x0cRemoveDevice\x12\x11.context.DeviceId\x1a\x0e.context.Empty\"\x00\x12;\n\x0fGetDeviceEvents\x12\x0e.context.Empty\x1a\x14.context.DeviceEvent\"\x00\x30\x01\x12<\n\x0cSelectDevice\x12\x15.context.DeviceFilter\x1a\x13.context.DeviceList\"\x00\x12I\n\x11ListEndPointNames\x12\x17.context.EndPointIdList\x1a\x19.context.EndPointNameList\"\x00\x12\x34\n\x0bListLinkIds\x12\x0e.context.Empty\x1a\x13.context.LinkIdList\"\x00\x12\x30\n\tListLinks\x12\x0e.context.Empty\x1a\x11.context.LinkList\"\x00\x12+\n\x07GetLink\x12\x0f.context.LinkId\x1a\r.context.Link\"\x00\x12+\n\x07SetLink\x12\r.context.Link\x1a\x0f.context.LinkId\"\x00\x12/\n\nRemoveLink\x12\x0f.context.LinkId\x1a\x0e.context.Empty\"\x00\x12\x37\n\rGetLinkEvents\x12\x0e.context.Empty\x1a\x12.context.LinkEvent\"\x00\x30\x01\x12>\n\x0eListServiceIds\x12\x12.context.ContextId\x1a\x16.context.ServiceIdList\"\x00\x12:\n\x0cListServices\x12\x12.context.ContextId\x1a\x14.context.ServiceList\"\x00\x12\x34\n\nGetService\x12\x12.context.ServiceId\x1a\x10.context.Service\"\x00\x12\x34\n\nSetService\x12\x10.context.Service\x1a\x12.context.ServiceId\"\x00\x12\x36\n\x0cUnsetService\x12\x10.context.Service\x1a\x12.context.ServiceId\"\x00\x12\x35\n\rRemoveService\x12\x12.context.ServiceId\x1a\x0e.context.Empty\"\x00\x12=\n\x10GetServiceEvents\x12\x0e.context.Empty\x1a\x15.context.ServiceEvent\"\x00\x30\x01\x12?\n\rSelectService\x12\x16.context.ServiceFilter\x1a\x14.context.ServiceList\"\x00\x12:\n\x0cListSliceIds\x12\x12.context.ContextId\x1a\x14.context.SliceIdList\"\x00\x12\x36\n\nListSlices\x12\x12.context.ContextId\x1a\x12.context.SliceList\"\x00\x12.\n\x08GetSlice\x12\x10.context.SliceId\x1a\x0e.context.Slice\"\x00\x12.\n\x08SetSlice\x12\x0e.context.Slice\x1a\x10.context.SliceId\"\x00\x12\x30\n\nUnsetSlice\x12\x0e.context.Slice\x1a\x10.context.SliceId\"\x00\x12\x31\n\x0bRemoveSlice\x12\x10.context.SliceId\x1a\x0e.context.Empty\"\x00\x12\x39\n\x0eGetSliceEvents\x12\x0e.context.Empty\x1a\x13.context.SliceEvent\"\x00\x30\x01\x12\x39\n\x0bSelectSlice\x12\x14.context.SliceFilter\x1a\x12.context.SliceList\"\x00\x12\x44\n\x11ListConnectionIds\x12\x12.context.ServiceId\x1a\x19.context.ConnectionIdList\"\x00\x12@\n\x0fListConnections\x12\x12.context.ServiceId\x1a\x17.context.ConnectionList\"\x00\x12=\n\rGetConnection\x12\x15.context.ConnectionId\x1a\x13.context.Connection\"\x00\x12=\n\rSetConnection\x12\x13.context.Connection\x1a\x15.context.ConnectionId\"\x00\x12;\n\x10RemoveConnection\x12\x15.context.ConnectionId\x1a\x0e.context.Empty\"\x00\x12\x43\n\x13GetConnectionEvents\x12\x0e.context.Empty\x1a\x18.context.ConnectionEvent\"\x00\x30\x01\x12@\n\x10GetOpticalConfig\x12\x0e.context.Empty\x1a\x1a.context.OpticalConfigList\"\x00\x12\x46\n\x10SetOpticalConfig\x12\x16.context.OpticalConfig\x1a\x18.context.OpticalConfigId\"\x00\x12I\n\x13SelectOpticalConfig\x12\x18.context.OpticalConfigId\x1a\x16.context.OpticalConfig\"\x00\x12\x38\n\x0eSetOpticalLink\x12\x14.context.OpticalLink\x1a\x0e.context.Empty\"\x00\x12@\n\x0eGetOpticalLink\x12\x16.context.OpticalLinkId\x1a\x14.context.OpticalLink\"\x00\x12.\n\x08GetFiber\x12\x10.context.FiberId\x1a\x0e.context.Fiber\"\x00\x62\x06proto3') - -_EVENTTYPEENUM = DESCRIPTOR.enum_types_by_name['EventTypeEnum'] -EventTypeEnum = enum_type_wrapper.EnumTypeWrapper(_EVENTTYPEENUM) -_DEVICEDRIVERENUM = DESCRIPTOR.enum_types_by_name['DeviceDriverEnum'] -DeviceDriverEnum = enum_type_wrapper.EnumTypeWrapper(_DEVICEDRIVERENUM) -_DEVICEOPERATIONALSTATUSENUM = DESCRIPTOR.enum_types_by_name['DeviceOperationalStatusEnum'] -DeviceOperationalStatusEnum = enum_type_wrapper.EnumTypeWrapper(_DEVICEOPERATIONALSTATUSENUM) -_SERVICETYPEENUM = DESCRIPTOR.enum_types_by_name['ServiceTypeEnum'] -ServiceTypeEnum = enum_type_wrapper.EnumTypeWrapper(_SERVICETYPEENUM) -_SERVICESTATUSENUM = DESCRIPTOR.enum_types_by_name['ServiceStatusEnum'] -ServiceStatusEnum = enum_type_wrapper.EnumTypeWrapper(_SERVICESTATUSENUM) -_SLICESTATUSENUM = DESCRIPTOR.enum_types_by_name['SliceStatusEnum'] -SliceStatusEnum = enum_type_wrapper.EnumTypeWrapper(_SLICESTATUSENUM) -_CONFIGACTIONENUM = DESCRIPTOR.enum_types_by_name['ConfigActionEnum'] -ConfigActionEnum = enum_type_wrapper.EnumTypeWrapper(_CONFIGACTIONENUM) -_CONSTRAINTACTIONENUM = DESCRIPTOR.enum_types_by_name['ConstraintActionEnum'] -ConstraintActionEnum = enum_type_wrapper.EnumTypeWrapper(_CONSTRAINTACTIONENUM) -_ISOLATIONLEVELENUM = DESCRIPTOR.enum_types_by_name['IsolationLevelEnum'] -IsolationLevelEnum = enum_type_wrapper.EnumTypeWrapper(_ISOLATIONLEVELENUM) -EVENTTYPE_UNDEFINED = 0 -EVENTTYPE_CREATE = 1 -EVENTTYPE_UPDATE = 2 -EVENTTYPE_REMOVE = 3 -DEVICEDRIVER_UNDEFINED = 0 -DEVICEDRIVER_OPENCONFIG = 1 -DEVICEDRIVER_TRANSPORT_API = 2 -DEVICEDRIVER_P4 = 3 -DEVICEDRIVER_IETF_NETWORK_TOPOLOGY = 4 -DEVICEDRIVER_ONF_TR_532 = 5 -DEVICEDRIVER_XR = 6 -DEVICEDRIVER_IETF_L2VPN = 7 -DEVICEDRIVER_GNMI_OPENCONFIG = 8 -DEVICEDRIVER_OPTICAL_TFS = 9 -DEVICEDRIVER_IETF_ACTN = 10 -DEVICEDRIVER_OC = 11 -DEVICEDRIVER_QKD = 12 -DEVICEOPERATIONALSTATUS_UNDEFINED = 0 -DEVICEOPERATIONALSTATUS_DISABLED = 1 -DEVICEOPERATIONALSTATUS_ENABLED = 2 -SERVICETYPE_UNKNOWN = 0 -SERVICETYPE_L3NM = 1 -SERVICETYPE_L2NM = 2 -SERVICETYPE_TAPI_CONNECTIVITY_SERVICE = 3 -SERVICETYPE_TE = 4 -SERVICETYPE_E2E = 5 -SERVICETYPE_OPTICAL_CONNECTIVITY = 6 -SERVICETYPE_QKD = 7 -SERVICESTATUS_UNDEFINED = 0 -SERVICESTATUS_PLANNED = 1 -SERVICESTATUS_ACTIVE = 2 -SERVICESTATUS_UPDATING = 3 -SERVICESTATUS_PENDING_REMOVAL = 4 -SERVICESTATUS_SLA_VIOLATED = 5 -SLICESTATUS_UNDEFINED = 0 -SLICESTATUS_PLANNED = 1 -SLICESTATUS_INIT = 2 -SLICESTATUS_ACTIVE = 3 -SLICESTATUS_DEINIT = 4 -SLICESTATUS_SLA_VIOLATED = 5 -CONFIGACTION_UNDEFINED = 0 -CONFIGACTION_SET = 1 -CONFIGACTION_DELETE = 2 -CONSTRAINTACTION_UNDEFINED = 0 -CONSTRAINTACTION_SET = 1 -CONSTRAINTACTION_DELETE = 2 -NO_ISOLATION = 0 -PHYSICAL_ISOLATION = 1 -LOGICAL_ISOLATION = 2 -PROCESS_ISOLATION = 3 -PHYSICAL_MEMORY_ISOLATION = 4 -PHYSICAL_NETWORK_ISOLATION = 5 -VIRTUAL_RESOURCE_ISOLATION = 6 -NETWORK_FUNCTIONS_ISOLATION = 7 -SERVICE_ISOLATION = 8 - - -_EMPTY = DESCRIPTOR.message_types_by_name['Empty'] -_UUID = DESCRIPTOR.message_types_by_name['Uuid'] -_TIMESTAMP = DESCRIPTOR.message_types_by_name['Timestamp'] -_EVENT = DESCRIPTOR.message_types_by_name['Event'] -_CONTEXTID = DESCRIPTOR.message_types_by_name['ContextId'] -_CONTEXT = DESCRIPTOR.message_types_by_name['Context'] -_CONTEXTIDLIST = DESCRIPTOR.message_types_by_name['ContextIdList'] -_CONTEXTLIST = DESCRIPTOR.message_types_by_name['ContextList'] -_CONTEXTEVENT = DESCRIPTOR.message_types_by_name['ContextEvent'] -_TOPOLOGYID = DESCRIPTOR.message_types_by_name['TopologyId'] -_TOPOLOGY = DESCRIPTOR.message_types_by_name['Topology'] -_TOPOLOGYDETAILS = DESCRIPTOR.message_types_by_name['TopologyDetails'] -_TOPOLOGYIDLIST = DESCRIPTOR.message_types_by_name['TopologyIdList'] -_TOPOLOGYLIST = DESCRIPTOR.message_types_by_name['TopologyList'] -_TOPOLOGYEVENT = DESCRIPTOR.message_types_by_name['TopologyEvent'] -_DEVICEID = DESCRIPTOR.message_types_by_name['DeviceId'] -_DEVICE = DESCRIPTOR.message_types_by_name['Device'] -_COMPONENT = DESCRIPTOR.message_types_by_name['Component'] -_COMPONENT_ATTRIBUTESENTRY = _COMPONENT.nested_types_by_name['AttributesEntry'] -_DEVICECONFIG = DESCRIPTOR.message_types_by_name['DeviceConfig'] -_DEVICEIDLIST = DESCRIPTOR.message_types_by_name['DeviceIdList'] -_DEVICELIST = DESCRIPTOR.message_types_by_name['DeviceList'] -_DEVICEFILTER = DESCRIPTOR.message_types_by_name['DeviceFilter'] -_DEVICEEVENT = DESCRIPTOR.message_types_by_name['DeviceEvent'] -_LINKID = DESCRIPTOR.message_types_by_name['LinkId'] -_LINKATTRIBUTES = DESCRIPTOR.message_types_by_name['LinkAttributes'] -_LINK = DESCRIPTOR.message_types_by_name['Link'] -_LINKIDLIST = DESCRIPTOR.message_types_by_name['LinkIdList'] -_LINKLIST = DESCRIPTOR.message_types_by_name['LinkList'] -_LINKEVENT = DESCRIPTOR.message_types_by_name['LinkEvent'] -_SERVICEID = DESCRIPTOR.message_types_by_name['ServiceId'] -_SERVICE = DESCRIPTOR.message_types_by_name['Service'] -_SERVICESTATUS = DESCRIPTOR.message_types_by_name['ServiceStatus'] -_SERVICECONFIG = DESCRIPTOR.message_types_by_name['ServiceConfig'] -_SERVICEIDLIST = DESCRIPTOR.message_types_by_name['ServiceIdList'] -_SERVICELIST = DESCRIPTOR.message_types_by_name['ServiceList'] -_SERVICEFILTER = DESCRIPTOR.message_types_by_name['ServiceFilter'] -_SERVICEEVENT = DESCRIPTOR.message_types_by_name['ServiceEvent'] -_SLICEID = DESCRIPTOR.message_types_by_name['SliceId'] -_SLICE = DESCRIPTOR.message_types_by_name['Slice'] -_SLICEOWNER = DESCRIPTOR.message_types_by_name['SliceOwner'] -_SLICESTATUS = DESCRIPTOR.message_types_by_name['SliceStatus'] -_SLICECONFIG = DESCRIPTOR.message_types_by_name['SliceConfig'] -_SLICEIDLIST = DESCRIPTOR.message_types_by_name['SliceIdList'] -_SLICELIST = DESCRIPTOR.message_types_by_name['SliceList'] -_SLICEFILTER = DESCRIPTOR.message_types_by_name['SliceFilter'] -_SLICEEVENT = DESCRIPTOR.message_types_by_name['SliceEvent'] -_CONNECTIONID = DESCRIPTOR.message_types_by_name['ConnectionId'] -_CONNECTIONSETTINGS_L0 = DESCRIPTOR.message_types_by_name['ConnectionSettings_L0'] -_CONNECTIONSETTINGS_L2 = DESCRIPTOR.message_types_by_name['ConnectionSettings_L2'] -_CONNECTIONSETTINGS_L3 = DESCRIPTOR.message_types_by_name['ConnectionSettings_L3'] -_CONNECTIONSETTINGS_L4 = DESCRIPTOR.message_types_by_name['ConnectionSettings_L4'] -_CONNECTIONSETTINGS = DESCRIPTOR.message_types_by_name['ConnectionSettings'] -_CONNECTION = DESCRIPTOR.message_types_by_name['Connection'] -_CONNECTIONIDLIST = DESCRIPTOR.message_types_by_name['ConnectionIdList'] -_CONNECTIONLIST = DESCRIPTOR.message_types_by_name['ConnectionList'] -_CONNECTIONEVENT = DESCRIPTOR.message_types_by_name['ConnectionEvent'] -_ENDPOINTID = DESCRIPTOR.message_types_by_name['EndPointId'] -_ENDPOINT = DESCRIPTOR.message_types_by_name['EndPoint'] -_ENDPOINTNAME = DESCRIPTOR.message_types_by_name['EndPointName'] -_ENDPOINTIDLIST = DESCRIPTOR.message_types_by_name['EndPointIdList'] -_ENDPOINTNAMELIST = DESCRIPTOR.message_types_by_name['EndPointNameList'] -_CONFIGRULE_CUSTOM = DESCRIPTOR.message_types_by_name['ConfigRule_Custom'] -_CONFIGRULE_ACL = DESCRIPTOR.message_types_by_name['ConfigRule_ACL'] -_CONFIGRULE = DESCRIPTOR.message_types_by_name['ConfigRule'] -_CONSTRAINT_CUSTOM = DESCRIPTOR.message_types_by_name['Constraint_Custom'] -_CONSTRAINT_SCHEDULE = DESCRIPTOR.message_types_by_name['Constraint_Schedule'] -_GPS_POSITION = DESCRIPTOR.message_types_by_name['GPS_Position'] -_LOCATION = DESCRIPTOR.message_types_by_name['Location'] -_CONSTRAINT_ENDPOINTLOCATION = DESCRIPTOR.message_types_by_name['Constraint_EndPointLocation'] -_CONSTRAINT_ENDPOINTPRIORITY = DESCRIPTOR.message_types_by_name['Constraint_EndPointPriority'] -_CONSTRAINT_SLA_LATENCY = DESCRIPTOR.message_types_by_name['Constraint_SLA_Latency'] -_CONSTRAINT_SLA_CAPACITY = DESCRIPTOR.message_types_by_name['Constraint_SLA_Capacity'] -_CONSTRAINT_SLA_AVAILABILITY = DESCRIPTOR.message_types_by_name['Constraint_SLA_Availability'] -_CONSTRAINT_SLA_ISOLATION_LEVEL = DESCRIPTOR.message_types_by_name['Constraint_SLA_Isolation_level'] -_CONSTRAINT_EXCLUSIONS = DESCRIPTOR.message_types_by_name['Constraint_Exclusions'] -_CONSTRAINT = DESCRIPTOR.message_types_by_name['Constraint'] -_TERAFLOWCONTROLLER = DESCRIPTOR.message_types_by_name['TeraFlowController'] -_AUTHENTICATIONRESULT = DESCRIPTOR.message_types_by_name['AuthenticationResult'] -_OPTICALCONFIGID = DESCRIPTOR.message_types_by_name['OpticalConfigId'] -_OPTICALCONFIG = DESCRIPTOR.message_types_by_name['OpticalConfig'] -_OPTICALCONFIGLIST = DESCRIPTOR.message_types_by_name['OpticalConfigList'] -_OPTICALLINKID = DESCRIPTOR.message_types_by_name['OpticalLinkId'] -_FIBERID = DESCRIPTOR.message_types_by_name['FiberId'] -_FIBER = DESCRIPTOR.message_types_by_name['Fiber'] -_OPTICALLINKDETAILS = DESCRIPTOR.message_types_by_name['OpticalLinkDetails'] -_OPTICALLINK = DESCRIPTOR.message_types_by_name['OpticalLink'] -Empty = _reflection.GeneratedProtocolMessageType('Empty', (_message.Message,), { - 'DESCRIPTOR' : _EMPTY, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Empty) - }) -_sym_db.RegisterMessage(Empty) - -Uuid = _reflection.GeneratedProtocolMessageType('Uuid', (_message.Message,), { - 'DESCRIPTOR' : _UUID, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Uuid) - }) -_sym_db.RegisterMessage(Uuid) - -Timestamp = _reflection.GeneratedProtocolMessageType('Timestamp', (_message.Message,), { - 'DESCRIPTOR' : _TIMESTAMP, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Timestamp) - }) -_sym_db.RegisterMessage(Timestamp) - -Event = _reflection.GeneratedProtocolMessageType('Event', (_message.Message,), { - 'DESCRIPTOR' : _EVENT, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Event) - }) -_sym_db.RegisterMessage(Event) - -ContextId = _reflection.GeneratedProtocolMessageType('ContextId', (_message.Message,), { - 'DESCRIPTOR' : _CONTEXTID, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ContextId) - }) -_sym_db.RegisterMessage(ContextId) - -Context = _reflection.GeneratedProtocolMessageType('Context', (_message.Message,), { - 'DESCRIPTOR' : _CONTEXT, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Context) - }) -_sym_db.RegisterMessage(Context) - -ContextIdList = _reflection.GeneratedProtocolMessageType('ContextIdList', (_message.Message,), { - 'DESCRIPTOR' : _CONTEXTIDLIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ContextIdList) - }) -_sym_db.RegisterMessage(ContextIdList) - -ContextList = _reflection.GeneratedProtocolMessageType('ContextList', (_message.Message,), { - 'DESCRIPTOR' : _CONTEXTLIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ContextList) - }) -_sym_db.RegisterMessage(ContextList) - -ContextEvent = _reflection.GeneratedProtocolMessageType('ContextEvent', (_message.Message,), { - 'DESCRIPTOR' : _CONTEXTEVENT, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ContextEvent) - }) -_sym_db.RegisterMessage(ContextEvent) - -TopologyId = _reflection.GeneratedProtocolMessageType('TopologyId', (_message.Message,), { - 'DESCRIPTOR' : _TOPOLOGYID, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.TopologyId) - }) -_sym_db.RegisterMessage(TopologyId) - -Topology = _reflection.GeneratedProtocolMessageType('Topology', (_message.Message,), { - 'DESCRIPTOR' : _TOPOLOGY, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Topology) - }) -_sym_db.RegisterMessage(Topology) - -TopologyDetails = _reflection.GeneratedProtocolMessageType('TopologyDetails', (_message.Message,), { - 'DESCRIPTOR' : _TOPOLOGYDETAILS, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.TopologyDetails) - }) -_sym_db.RegisterMessage(TopologyDetails) - -TopologyIdList = _reflection.GeneratedProtocolMessageType('TopologyIdList', (_message.Message,), { - 'DESCRIPTOR' : _TOPOLOGYIDLIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.TopologyIdList) - }) -_sym_db.RegisterMessage(TopologyIdList) - -TopologyList = _reflection.GeneratedProtocolMessageType('TopologyList', (_message.Message,), { - 'DESCRIPTOR' : _TOPOLOGYLIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.TopologyList) - }) -_sym_db.RegisterMessage(TopologyList) - -TopologyEvent = _reflection.GeneratedProtocolMessageType('TopologyEvent', (_message.Message,), { - 'DESCRIPTOR' : _TOPOLOGYEVENT, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.TopologyEvent) - }) -_sym_db.RegisterMessage(TopologyEvent) - -DeviceId = _reflection.GeneratedProtocolMessageType('DeviceId', (_message.Message,), { - 'DESCRIPTOR' : _DEVICEID, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.DeviceId) - }) -_sym_db.RegisterMessage(DeviceId) - -Device = _reflection.GeneratedProtocolMessageType('Device', (_message.Message,), { - 'DESCRIPTOR' : _DEVICE, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Device) - }) -_sym_db.RegisterMessage(Device) - -Component = _reflection.GeneratedProtocolMessageType('Component', (_message.Message,), { - - 'AttributesEntry' : _reflection.GeneratedProtocolMessageType('AttributesEntry', (_message.Message,), { - 'DESCRIPTOR' : _COMPONENT_ATTRIBUTESENTRY, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Component.AttributesEntry) - }) - , - 'DESCRIPTOR' : _COMPONENT, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Component) - }) -_sym_db.RegisterMessage(Component) -_sym_db.RegisterMessage(Component.AttributesEntry) - -DeviceConfig = _reflection.GeneratedProtocolMessageType('DeviceConfig', (_message.Message,), { - 'DESCRIPTOR' : _DEVICECONFIG, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.DeviceConfig) - }) -_sym_db.RegisterMessage(DeviceConfig) - -DeviceIdList = _reflection.GeneratedProtocolMessageType('DeviceIdList', (_message.Message,), { - 'DESCRIPTOR' : _DEVICEIDLIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.DeviceIdList) - }) -_sym_db.RegisterMessage(DeviceIdList) - -DeviceList = _reflection.GeneratedProtocolMessageType('DeviceList', (_message.Message,), { - 'DESCRIPTOR' : _DEVICELIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.DeviceList) - }) -_sym_db.RegisterMessage(DeviceList) - -DeviceFilter = _reflection.GeneratedProtocolMessageType('DeviceFilter', (_message.Message,), { - 'DESCRIPTOR' : _DEVICEFILTER, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.DeviceFilter) - }) -_sym_db.RegisterMessage(DeviceFilter) - -DeviceEvent = _reflection.GeneratedProtocolMessageType('DeviceEvent', (_message.Message,), { - 'DESCRIPTOR' : _DEVICEEVENT, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.DeviceEvent) - }) -_sym_db.RegisterMessage(DeviceEvent) - -LinkId = _reflection.GeneratedProtocolMessageType('LinkId', (_message.Message,), { - 'DESCRIPTOR' : _LINKID, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.LinkId) - }) -_sym_db.RegisterMessage(LinkId) - -LinkAttributes = _reflection.GeneratedProtocolMessageType('LinkAttributes', (_message.Message,), { - 'DESCRIPTOR' : _LINKATTRIBUTES, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.LinkAttributes) - }) -_sym_db.RegisterMessage(LinkAttributes) - -Link = _reflection.GeneratedProtocolMessageType('Link', (_message.Message,), { - 'DESCRIPTOR' : _LINK, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Link) - }) -_sym_db.RegisterMessage(Link) - -LinkIdList = _reflection.GeneratedProtocolMessageType('LinkIdList', (_message.Message,), { - 'DESCRIPTOR' : _LINKIDLIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.LinkIdList) - }) -_sym_db.RegisterMessage(LinkIdList) - -LinkList = _reflection.GeneratedProtocolMessageType('LinkList', (_message.Message,), { - 'DESCRIPTOR' : _LINKLIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.LinkList) - }) -_sym_db.RegisterMessage(LinkList) - -LinkEvent = _reflection.GeneratedProtocolMessageType('LinkEvent', (_message.Message,), { - 'DESCRIPTOR' : _LINKEVENT, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.LinkEvent) - }) -_sym_db.RegisterMessage(LinkEvent) - -ServiceId = _reflection.GeneratedProtocolMessageType('ServiceId', (_message.Message,), { - 'DESCRIPTOR' : _SERVICEID, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ServiceId) - }) -_sym_db.RegisterMessage(ServiceId) - -Service = _reflection.GeneratedProtocolMessageType('Service', (_message.Message,), { - 'DESCRIPTOR' : _SERVICE, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Service) - }) -_sym_db.RegisterMessage(Service) - -ServiceStatus = _reflection.GeneratedProtocolMessageType('ServiceStatus', (_message.Message,), { - 'DESCRIPTOR' : _SERVICESTATUS, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ServiceStatus) - }) -_sym_db.RegisterMessage(ServiceStatus) - -ServiceConfig = _reflection.GeneratedProtocolMessageType('ServiceConfig', (_message.Message,), { - 'DESCRIPTOR' : _SERVICECONFIG, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ServiceConfig) - }) -_sym_db.RegisterMessage(ServiceConfig) - -ServiceIdList = _reflection.GeneratedProtocolMessageType('ServiceIdList', (_message.Message,), { - 'DESCRIPTOR' : _SERVICEIDLIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ServiceIdList) - }) -_sym_db.RegisterMessage(ServiceIdList) - -ServiceList = _reflection.GeneratedProtocolMessageType('ServiceList', (_message.Message,), { - 'DESCRIPTOR' : _SERVICELIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ServiceList) - }) -_sym_db.RegisterMessage(ServiceList) - -ServiceFilter = _reflection.GeneratedProtocolMessageType('ServiceFilter', (_message.Message,), { - 'DESCRIPTOR' : _SERVICEFILTER, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ServiceFilter) - }) -_sym_db.RegisterMessage(ServiceFilter) - -ServiceEvent = _reflection.GeneratedProtocolMessageType('ServiceEvent', (_message.Message,), { - 'DESCRIPTOR' : _SERVICEEVENT, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ServiceEvent) - }) -_sym_db.RegisterMessage(ServiceEvent) - -SliceId = _reflection.GeneratedProtocolMessageType('SliceId', (_message.Message,), { - 'DESCRIPTOR' : _SLICEID, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.SliceId) - }) -_sym_db.RegisterMessage(SliceId) - -Slice = _reflection.GeneratedProtocolMessageType('Slice', (_message.Message,), { - 'DESCRIPTOR' : _SLICE, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Slice) - }) -_sym_db.RegisterMessage(Slice) - -SliceOwner = _reflection.GeneratedProtocolMessageType('SliceOwner', (_message.Message,), { - 'DESCRIPTOR' : _SLICEOWNER, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.SliceOwner) - }) -_sym_db.RegisterMessage(SliceOwner) - -SliceStatus = _reflection.GeneratedProtocolMessageType('SliceStatus', (_message.Message,), { - 'DESCRIPTOR' : _SLICESTATUS, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.SliceStatus) - }) -_sym_db.RegisterMessage(SliceStatus) - -SliceConfig = _reflection.GeneratedProtocolMessageType('SliceConfig', (_message.Message,), { - 'DESCRIPTOR' : _SLICECONFIG, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.SliceConfig) - }) -_sym_db.RegisterMessage(SliceConfig) - -SliceIdList = _reflection.GeneratedProtocolMessageType('SliceIdList', (_message.Message,), { - 'DESCRIPTOR' : _SLICEIDLIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.SliceIdList) - }) -_sym_db.RegisterMessage(SliceIdList) - -SliceList = _reflection.GeneratedProtocolMessageType('SliceList', (_message.Message,), { - 'DESCRIPTOR' : _SLICELIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.SliceList) - }) -_sym_db.RegisterMessage(SliceList) - -SliceFilter = _reflection.GeneratedProtocolMessageType('SliceFilter', (_message.Message,), { - 'DESCRIPTOR' : _SLICEFILTER, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.SliceFilter) - }) -_sym_db.RegisterMessage(SliceFilter) - -SliceEvent = _reflection.GeneratedProtocolMessageType('SliceEvent', (_message.Message,), { - 'DESCRIPTOR' : _SLICEEVENT, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.SliceEvent) - }) -_sym_db.RegisterMessage(SliceEvent) - -ConnectionId = _reflection.GeneratedProtocolMessageType('ConnectionId', (_message.Message,), { - 'DESCRIPTOR' : _CONNECTIONID, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ConnectionId) - }) -_sym_db.RegisterMessage(ConnectionId) - -ConnectionSettings_L0 = _reflection.GeneratedProtocolMessageType('ConnectionSettings_L0', (_message.Message,), { - 'DESCRIPTOR' : _CONNECTIONSETTINGS_L0, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ConnectionSettings_L0) - }) -_sym_db.RegisterMessage(ConnectionSettings_L0) - -ConnectionSettings_L2 = _reflection.GeneratedProtocolMessageType('ConnectionSettings_L2', (_message.Message,), { - 'DESCRIPTOR' : _CONNECTIONSETTINGS_L2, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ConnectionSettings_L2) - }) -_sym_db.RegisterMessage(ConnectionSettings_L2) - -ConnectionSettings_L3 = _reflection.GeneratedProtocolMessageType('ConnectionSettings_L3', (_message.Message,), { - 'DESCRIPTOR' : _CONNECTIONSETTINGS_L3, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ConnectionSettings_L3) - }) -_sym_db.RegisterMessage(ConnectionSettings_L3) - -ConnectionSettings_L4 = _reflection.GeneratedProtocolMessageType('ConnectionSettings_L4', (_message.Message,), { - 'DESCRIPTOR' : _CONNECTIONSETTINGS_L4, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ConnectionSettings_L4) - }) -_sym_db.RegisterMessage(ConnectionSettings_L4) - -ConnectionSettings = _reflection.GeneratedProtocolMessageType('ConnectionSettings', (_message.Message,), { - 'DESCRIPTOR' : _CONNECTIONSETTINGS, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ConnectionSettings) - }) -_sym_db.RegisterMessage(ConnectionSettings) - -Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), { - 'DESCRIPTOR' : _CONNECTION, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Connection) - }) -_sym_db.RegisterMessage(Connection) - -ConnectionIdList = _reflection.GeneratedProtocolMessageType('ConnectionIdList', (_message.Message,), { - 'DESCRIPTOR' : _CONNECTIONIDLIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ConnectionIdList) - }) -_sym_db.RegisterMessage(ConnectionIdList) - -ConnectionList = _reflection.GeneratedProtocolMessageType('ConnectionList', (_message.Message,), { - 'DESCRIPTOR' : _CONNECTIONLIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ConnectionList) - }) -_sym_db.RegisterMessage(ConnectionList) - -ConnectionEvent = _reflection.GeneratedProtocolMessageType('ConnectionEvent', (_message.Message,), { - 'DESCRIPTOR' : _CONNECTIONEVENT, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ConnectionEvent) - }) -_sym_db.RegisterMessage(ConnectionEvent) - -EndPointId = _reflection.GeneratedProtocolMessageType('EndPointId', (_message.Message,), { - 'DESCRIPTOR' : _ENDPOINTID, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.EndPointId) - }) -_sym_db.RegisterMessage(EndPointId) - -EndPoint = _reflection.GeneratedProtocolMessageType('EndPoint', (_message.Message,), { - 'DESCRIPTOR' : _ENDPOINT, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.EndPoint) - }) -_sym_db.RegisterMessage(EndPoint) - -EndPointName = _reflection.GeneratedProtocolMessageType('EndPointName', (_message.Message,), { - 'DESCRIPTOR' : _ENDPOINTNAME, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.EndPointName) - }) -_sym_db.RegisterMessage(EndPointName) - -EndPointIdList = _reflection.GeneratedProtocolMessageType('EndPointIdList', (_message.Message,), { - 'DESCRIPTOR' : _ENDPOINTIDLIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.EndPointIdList) - }) -_sym_db.RegisterMessage(EndPointIdList) - -EndPointNameList = _reflection.GeneratedProtocolMessageType('EndPointNameList', (_message.Message,), { - 'DESCRIPTOR' : _ENDPOINTNAMELIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.EndPointNameList) - }) -_sym_db.RegisterMessage(EndPointNameList) - -ConfigRule_Custom = _reflection.GeneratedProtocolMessageType('ConfigRule_Custom', (_message.Message,), { - 'DESCRIPTOR' : _CONFIGRULE_CUSTOM, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ConfigRule_Custom) - }) -_sym_db.RegisterMessage(ConfigRule_Custom) - -ConfigRule_ACL = _reflection.GeneratedProtocolMessageType('ConfigRule_ACL', (_message.Message,), { - 'DESCRIPTOR' : _CONFIGRULE_ACL, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ConfigRule_ACL) - }) -_sym_db.RegisterMessage(ConfigRule_ACL) - -ConfigRule = _reflection.GeneratedProtocolMessageType('ConfigRule', (_message.Message,), { - 'DESCRIPTOR' : _CONFIGRULE, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.ConfigRule) - }) -_sym_db.RegisterMessage(ConfigRule) - -Constraint_Custom = _reflection.GeneratedProtocolMessageType('Constraint_Custom', (_message.Message,), { - 'DESCRIPTOR' : _CONSTRAINT_CUSTOM, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Constraint_Custom) - }) -_sym_db.RegisterMessage(Constraint_Custom) - -Constraint_Schedule = _reflection.GeneratedProtocolMessageType('Constraint_Schedule', (_message.Message,), { - 'DESCRIPTOR' : _CONSTRAINT_SCHEDULE, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Constraint_Schedule) - }) -_sym_db.RegisterMessage(Constraint_Schedule) - -GPS_Position = _reflection.GeneratedProtocolMessageType('GPS_Position', (_message.Message,), { - 'DESCRIPTOR' : _GPS_POSITION, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.GPS_Position) - }) -_sym_db.RegisterMessage(GPS_Position) - -Location = _reflection.GeneratedProtocolMessageType('Location', (_message.Message,), { - 'DESCRIPTOR' : _LOCATION, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Location) - }) -_sym_db.RegisterMessage(Location) - -Constraint_EndPointLocation = _reflection.GeneratedProtocolMessageType('Constraint_EndPointLocation', (_message.Message,), { - 'DESCRIPTOR' : _CONSTRAINT_ENDPOINTLOCATION, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Constraint_EndPointLocation) - }) -_sym_db.RegisterMessage(Constraint_EndPointLocation) - -Constraint_EndPointPriority = _reflection.GeneratedProtocolMessageType('Constraint_EndPointPriority', (_message.Message,), { - 'DESCRIPTOR' : _CONSTRAINT_ENDPOINTPRIORITY, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Constraint_EndPointPriority) - }) -_sym_db.RegisterMessage(Constraint_EndPointPriority) - -Constraint_SLA_Latency = _reflection.GeneratedProtocolMessageType('Constraint_SLA_Latency', (_message.Message,), { - 'DESCRIPTOR' : _CONSTRAINT_SLA_LATENCY, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Constraint_SLA_Latency) - }) -_sym_db.RegisterMessage(Constraint_SLA_Latency) - -Constraint_SLA_Capacity = _reflection.GeneratedProtocolMessageType('Constraint_SLA_Capacity', (_message.Message,), { - 'DESCRIPTOR' : _CONSTRAINT_SLA_CAPACITY, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Constraint_SLA_Capacity) - }) -_sym_db.RegisterMessage(Constraint_SLA_Capacity) - -Constraint_SLA_Availability = _reflection.GeneratedProtocolMessageType('Constraint_SLA_Availability', (_message.Message,), { - 'DESCRIPTOR' : _CONSTRAINT_SLA_AVAILABILITY, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Constraint_SLA_Availability) - }) -_sym_db.RegisterMessage(Constraint_SLA_Availability) - -Constraint_SLA_Isolation_level = _reflection.GeneratedProtocolMessageType('Constraint_SLA_Isolation_level', (_message.Message,), { - 'DESCRIPTOR' : _CONSTRAINT_SLA_ISOLATION_LEVEL, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Constraint_SLA_Isolation_level) - }) -_sym_db.RegisterMessage(Constraint_SLA_Isolation_level) - -Constraint_Exclusions = _reflection.GeneratedProtocolMessageType('Constraint_Exclusions', (_message.Message,), { - 'DESCRIPTOR' : _CONSTRAINT_EXCLUSIONS, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Constraint_Exclusions) - }) -_sym_db.RegisterMessage(Constraint_Exclusions) - -Constraint = _reflection.GeneratedProtocolMessageType('Constraint', (_message.Message,), { - 'DESCRIPTOR' : _CONSTRAINT, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Constraint) - }) -_sym_db.RegisterMessage(Constraint) - -TeraFlowController = _reflection.GeneratedProtocolMessageType('TeraFlowController', (_message.Message,), { - 'DESCRIPTOR' : _TERAFLOWCONTROLLER, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.TeraFlowController) - }) -_sym_db.RegisterMessage(TeraFlowController) - -AuthenticationResult = _reflection.GeneratedProtocolMessageType('AuthenticationResult', (_message.Message,), { - 'DESCRIPTOR' : _AUTHENTICATIONRESULT, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.AuthenticationResult) - }) -_sym_db.RegisterMessage(AuthenticationResult) - -OpticalConfigId = _reflection.GeneratedProtocolMessageType('OpticalConfigId', (_message.Message,), { - 'DESCRIPTOR' : _OPTICALCONFIGID, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.OpticalConfigId) - }) -_sym_db.RegisterMessage(OpticalConfigId) - -OpticalConfig = _reflection.GeneratedProtocolMessageType('OpticalConfig', (_message.Message,), { - 'DESCRIPTOR' : _OPTICALCONFIG, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.OpticalConfig) - }) -_sym_db.RegisterMessage(OpticalConfig) - -OpticalConfigList = _reflection.GeneratedProtocolMessageType('OpticalConfigList', (_message.Message,), { - 'DESCRIPTOR' : _OPTICALCONFIGLIST, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.OpticalConfigList) - }) -_sym_db.RegisterMessage(OpticalConfigList) - -OpticalLinkId = _reflection.GeneratedProtocolMessageType('OpticalLinkId', (_message.Message,), { - 'DESCRIPTOR' : _OPTICALLINKID, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.OpticalLinkId) - }) -_sym_db.RegisterMessage(OpticalLinkId) - -FiberId = _reflection.GeneratedProtocolMessageType('FiberId', (_message.Message,), { - 'DESCRIPTOR' : _FIBERID, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.FiberId) - }) -_sym_db.RegisterMessage(FiberId) - -Fiber = _reflection.GeneratedProtocolMessageType('Fiber', (_message.Message,), { - 'DESCRIPTOR' : _FIBER, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.Fiber) - }) -_sym_db.RegisterMessage(Fiber) - -OpticalLinkDetails = _reflection.GeneratedProtocolMessageType('OpticalLinkDetails', (_message.Message,), { - 'DESCRIPTOR' : _OPTICALLINKDETAILS, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.OpticalLinkDetails) - }) -_sym_db.RegisterMessage(OpticalLinkDetails) - -OpticalLink = _reflection.GeneratedProtocolMessageType('OpticalLink', (_message.Message,), { - 'DESCRIPTOR' : _OPTICALLINK, - '__module__' : 'context_pb2' - # @@protoc_insertion_point(class_scope:context.OpticalLink) - }) -_sym_db.RegisterMessage(OpticalLink) - -_CONTEXTSERVICE = DESCRIPTOR.services_by_name['ContextService'] -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - _COMPONENT_ATTRIBUTESENTRY._options = None - _COMPONENT_ATTRIBUTESENTRY._serialized_options = b'8\001' - _EVENTTYPEENUM._serialized_start=9328 - _EVENTTYPEENUM._serialized_end=9434 - _DEVICEDRIVERENUM._serialized_start=9437 - _DEVICEDRIVERENUM._serialized_end=9819 - _DEVICEOPERATIONALSTATUSENUM._serialized_start=9822 - _DEVICEOPERATIONALSTATUSENUM._serialized_end=9965 - _SERVICETYPEENUM._serialized_start=9968 - _SERVICETYPEENUM._serialized_end=10197 - _SERVICESTATUSENUM._serialized_start=10200 - _SERVICESTATUSENUM._serialized_end=10396 - _SLICESTATUSENUM._serialized_start=10399 - _SLICESTATUSENUM._serialized_end=10568 - _CONFIGACTIONENUM._serialized_start=10570 - _CONFIGACTIONENUM._serialized_end=10663 - _CONSTRAINTACTIONENUM._serialized_start=10665 - _CONSTRAINTACTIONENUM._serialized_end=10774 - _ISOLATIONLEVELENUM._serialized_start=10777 - _ISOLATIONLEVELENUM._serialized_end=11036 - _EMPTY._serialized_start=61 - _EMPTY._serialized_end=68 - _UUID._serialized_start=70 - _UUID._serialized_end=90 - _TIMESTAMP._serialized_start=92 - _TIMESTAMP._serialized_end=122 - _EVENT._serialized_start=124 - _EVENT._serialized_end=214 - _CONTEXTID._serialized_start=216 - _CONTEXTID._serialized_end=264 - _CONTEXT._serialized_start=267 - _CONTEXT._serialized_end=500 - _CONTEXTIDLIST._serialized_start=502 - _CONTEXTIDLIST._serialized_end=558 - _CONTEXTLIST._serialized_start=560 - _CONTEXTLIST._serialized_end=609 - _CONTEXTEVENT._serialized_start=611 - _CONTEXTEVENT._serialized_end=696 - _TOPOLOGYID._serialized_start=698 - _TOPOLOGYID._serialized_end=788 - _TOPOLOGY._serialized_start=791 - _TOPOLOGY._serialized_end=931 - _TOPOLOGYDETAILS._serialized_start=934 - _TOPOLOGYDETAILS._serialized_end=1071 - _TOPOLOGYIDLIST._serialized_start=1073 - _TOPOLOGYIDLIST._serialized_end=1132 - _TOPOLOGYLIST._serialized_start=1134 - _TOPOLOGYLIST._serialized_end=1187 - _TOPOLOGYEVENT._serialized_start=1189 - _TOPOLOGYEVENT._serialized_end=1277 - _DEVICEID._serialized_start=1279 - _DEVICEID._serialized_end=1325 - _DEVICE._serialized_start=1328 - _DEVICE._serialized_end=1706 - _COMPONENT._serialized_start=1709 - _COMPONENT._serialized_end=1910 - _COMPONENT_ATTRIBUTESENTRY._serialized_start=1861 - _COMPONENT_ATTRIBUTESENTRY._serialized_end=1910 - _DEVICECONFIG._serialized_start=1912 - _DEVICECONFIG._serialized_end=1969 - _DEVICEIDLIST._serialized_start=1971 - _DEVICEIDLIST._serialized_end=2024 - _DEVICELIST._serialized_start=2026 - _DEVICELIST._serialized_end=2072 - _DEVICEFILTER._serialized_start=2075 - _DEVICEFILTER._serialized_end=2217 - _DEVICEEVENT._serialized_start=2220 - _DEVICEEVENT._serialized_end=2348 - _LINKID._serialized_start=2350 - _LINKID._serialized_end=2392 - _LINKATTRIBUTES._serialized_start=2394 - _LINKATTRIBUTES._serialized_end=2467 - _LINK._serialized_start=2470 - _LINK._serialized_end=2617 - _LINKIDLIST._serialized_start=2619 - _LINKIDLIST._serialized_end=2666 - _LINKLIST._serialized_start=2668 - _LINKLIST._serialized_end=2708 - _LINKEVENT._serialized_start=2710 - _LINKEVENT._serialized_end=2786 - _SERVICEID._serialized_start=2788 - _SERVICEID._serialized_end=2876 - _SERVICE._serialized_start=2879 - _SERVICE._serialized_end=3226 - _SERVICESTATUS._serialized_start=3228 - _SERVICESTATUS._serialized_end=3295 - _SERVICECONFIG._serialized_start=3297 - _SERVICECONFIG._serialized_end=3355 - _SERVICEIDLIST._serialized_start=3357 - _SERVICEIDLIST._serialized_end=3413 - _SERVICELIST._serialized_start=3415 - _SERVICELIST._serialized_end=3464 - _SERVICEFILTER._serialized_start=3467 - _SERVICEFILTER._serialized_end=3616 - _SERVICEEVENT._serialized_start=3618 - _SERVICEEVENT._serialized_end=3703 - _SLICEID._serialized_start=3705 - _SLICEID._serialized_end=3789 - _SLICE._serialized_start=3792 - _SLICE._serialized_end=4208 - _SLICEOWNER._serialized_start=4210 - _SLICEOWNER._serialized_end=4279 - _SLICESTATUS._serialized_start=4281 - _SLICESTATUS._serialized_end=4342 - _SLICECONFIG._serialized_start=4344 - _SLICECONFIG._serialized_end=4400 - _SLICEIDLIST._serialized_start=4402 - _SLICEIDLIST._serialized_end=4452 - _SLICELIST._serialized_start=4454 - _SLICELIST._serialized_end=4497 - _SLICEFILTER._serialized_start=4500 - _SLICEFILTER._serialized_end=4702 - _SLICEEVENT._serialized_start=4704 - _SLICEEVENT._serialized_end=4783 - _CONNECTIONID._serialized_start=4785 - _CONNECTIONID._serialized_end=4839 - _CONNECTIONSETTINGS_L0._serialized_start=4841 - _CONNECTIONSETTINGS_L0._serialized_end=4891 - _CONNECTIONSETTINGS_L2._serialized_start=4894 - _CONNECTIONSETTINGS_L2._serialized_end=5052 - _CONNECTIONSETTINGS_L3._serialized_start=5054 - _CONNECTIONSETTINGS_L3._serialized_end=5170 - _CONNECTIONSETTINGS_L4._serialized_start=5172 - _CONNECTIONSETTINGS_L4._serialized_end=5263 - _CONNECTIONSETTINGS._serialized_start=5266 - _CONNECTIONSETTINGS._serialized_end=5462 - _CONNECTION._serialized_start=5465 - _CONNECTION._serialized_end=5708 - _CONNECTIONIDLIST._serialized_start=5710 - _CONNECTIONIDLIST._serialized_end=5775 - _CONNECTIONLIST._serialized_start=5777 - _CONNECTIONLIST._serialized_end=5835 - _CONNECTIONEVENT._serialized_start=5837 - _CONNECTIONEVENT._serialized_end=5931 - _ENDPOINTID._serialized_start=5934 - _ENDPOINTID._serialized_end=6064 - _ENDPOINT._serialized_start=6067 - _ENDPOINT._serialized_end=6261 - _ENDPOINTNAME._serialized_start=6263 - _ENDPOINTNAME._serialized_end=6386 - _ENDPOINTIDLIST._serialized_start=6388 - _ENDPOINTIDLIST._serialized_end=6447 - _ENDPOINTNAMELIST._serialized_start=6449 - _ENDPOINTNAMELIST._serialized_end=6514 - _CONFIGRULE_CUSTOM._serialized_start=6516 - _CONFIGRULE_CUSTOM._serialized_end=6581 - _CONFIGRULE_ACL._serialized_start=6583 - _CONFIGRULE_ACL._serialized_end=6676 - _CONFIGRULE._serialized_start=6679 - _CONFIGRULE._serialized_end=6835 - _CONSTRAINT_CUSTOM._serialized_start=6837 - _CONSTRAINT_CUSTOM._serialized_end=6907 - _CONSTRAINT_SCHEDULE._serialized_start=6909 - _CONSTRAINT_SCHEDULE._serialized_end=6978 - _GPS_POSITION._serialized_start=6980 - _GPS_POSITION._serialized_end=7031 - _LOCATION._serialized_start=7033 - _LOCATION._serialized_end=7120 - _CONSTRAINT_ENDPOINTLOCATION._serialized_start=7122 - _CONSTRAINT_ENDPOINTLOCATION._serialized_end=7230 - _CONSTRAINT_ENDPOINTPRIORITY._serialized_start=7232 - _CONSTRAINT_ENDPOINTPRIORITY._serialized_end=7321 - _CONSTRAINT_SLA_LATENCY._serialized_start=7323 - _CONSTRAINT_SLA_LATENCY._serialized_end=7371 - _CONSTRAINT_SLA_CAPACITY._serialized_start=7373 - _CONSTRAINT_SLA_CAPACITY._serialized_end=7421 - _CONSTRAINT_SLA_AVAILABILITY._serialized_start=7423 - _CONSTRAINT_SLA_AVAILABILITY._serialized_end=7522 - _CONSTRAINT_SLA_ISOLATION_LEVEL._serialized_start=7524 - _CONSTRAINT_SLA_ISOLATION_LEVEL._serialized_end=7610 - _CONSTRAINT_EXCLUSIONS._serialized_start=7613 - _CONSTRAINT_EXCLUSIONS._serialized_end=7775 - _CONSTRAINT._serialized_start=7778 - _CONSTRAINT._serialized_end=8381 - _TERAFLOWCONTROLLER._serialized_start=8383 - _TERAFLOWCONTROLLER._serialized_end=8477 - _AUTHENTICATIONRESULT._serialized_start=8479 - _AUTHENTICATIONRESULT._serialized_end=8564 - _OPTICALCONFIGID._serialized_start=8566 - _OPTICALCONFIGID._serialized_end=8611 - _OPTICALCONFIG._serialized_start=8613 - _OPTICALCONFIG._serialized_end=8696 - _OPTICALCONFIGLIST._serialized_start=8698 - _OPTICALCONFIGLIST._serialized_end=8765 - _OPTICALLINKID._serialized_start=8767 - _OPTICALLINKID._serialized_end=8824 - _FIBERID._serialized_start=8826 - _FIBERID._serialized_end=8870 - _FIBER._serialized_start=8873 - _FIBER._serialized_end=9098 - _OPTICALLINKDETAILS._serialized_start=9100 - _OPTICALLINKDETAILS._serialized_end=9200 - _OPTICALLINK._serialized_start=9202 - _OPTICALLINK._serialized_end=9326 - _CONTEXTSERVICE._serialized_start=11039 - _CONTEXTSERVICE._serialized_end=14277 -# @@protoc_insertion_point(module_scope) diff --git a/src/device/tests/qkd/unit/generated/context_pb2_grpc.py b/src/device/tests/qkd/unit/generated/context_pb2_grpc.py deleted file mode 100644 index ed6e153ba..000000000 --- a/src/device/tests/qkd/unit/generated/context_pb2_grpc.py +++ /dev/null @@ -1,1849 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -"""Client and server classes corresponding to protobuf-defined services.""" -import grpc - -import context_pb2 as context__pb2 - - -class ContextServiceStub(object): - """Missing associated documentation comment in .proto file.""" - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.ListContextIds = channel.unary_unary( - '/context.ContextService/ListContextIds', - request_serializer=context__pb2.Empty.SerializeToString, - response_deserializer=context__pb2.ContextIdList.FromString, - ) - self.ListContexts = channel.unary_unary( - '/context.ContextService/ListContexts', - request_serializer=context__pb2.Empty.SerializeToString, - response_deserializer=context__pb2.ContextList.FromString, - ) - self.GetContext = channel.unary_unary( - '/context.ContextService/GetContext', - request_serializer=context__pb2.ContextId.SerializeToString, - response_deserializer=context__pb2.Context.FromString, - ) - self.SetContext = channel.unary_unary( - '/context.ContextService/SetContext', - request_serializer=context__pb2.Context.SerializeToString, - response_deserializer=context__pb2.ContextId.FromString, - ) - self.RemoveContext = channel.unary_unary( - '/context.ContextService/RemoveContext', - request_serializer=context__pb2.ContextId.SerializeToString, - response_deserializer=context__pb2.Empty.FromString, - ) - self.GetContextEvents = channel.unary_stream( - '/context.ContextService/GetContextEvents', - request_serializer=context__pb2.Empty.SerializeToString, - response_deserializer=context__pb2.ContextEvent.FromString, - ) - self.ListTopologyIds = channel.unary_unary( - '/context.ContextService/ListTopologyIds', - request_serializer=context__pb2.ContextId.SerializeToString, - response_deserializer=context__pb2.TopologyIdList.FromString, - ) - self.ListTopologies = channel.unary_unary( - '/context.ContextService/ListTopologies', - request_serializer=context__pb2.ContextId.SerializeToString, - response_deserializer=context__pb2.TopologyList.FromString, - ) - self.GetTopology = channel.unary_unary( - '/context.ContextService/GetTopology', - request_serializer=context__pb2.TopologyId.SerializeToString, - response_deserializer=context__pb2.Topology.FromString, - ) - self.GetTopologyDetails = channel.unary_unary( - '/context.ContextService/GetTopologyDetails', - request_serializer=context__pb2.TopologyId.SerializeToString, - response_deserializer=context__pb2.TopologyDetails.FromString, - ) - self.SetTopology = channel.unary_unary( - '/context.ContextService/SetTopology', - request_serializer=context__pb2.Topology.SerializeToString, - response_deserializer=context__pb2.TopologyId.FromString, - ) - self.RemoveTopology = channel.unary_unary( - '/context.ContextService/RemoveTopology', - request_serializer=context__pb2.TopologyId.SerializeToString, - response_deserializer=context__pb2.Empty.FromString, - ) - self.GetTopologyEvents = channel.unary_stream( - '/context.ContextService/GetTopologyEvents', - request_serializer=context__pb2.Empty.SerializeToString, - response_deserializer=context__pb2.TopologyEvent.FromString, - ) - self.ListDeviceIds = channel.unary_unary( - '/context.ContextService/ListDeviceIds', - request_serializer=context__pb2.Empty.SerializeToString, - response_deserializer=context__pb2.DeviceIdList.FromString, - ) - self.ListDevices = channel.unary_unary( - '/context.ContextService/ListDevices', - request_serializer=context__pb2.Empty.SerializeToString, - response_deserializer=context__pb2.DeviceList.FromString, - ) - self.GetDevice = channel.unary_unary( - '/context.ContextService/GetDevice', - request_serializer=context__pb2.DeviceId.SerializeToString, - response_deserializer=context__pb2.Device.FromString, - ) - self.SetDevice = channel.unary_unary( - '/context.ContextService/SetDevice', - request_serializer=context__pb2.Device.SerializeToString, - response_deserializer=context__pb2.DeviceId.FromString, - ) - self.RemoveDevice = channel.unary_unary( - '/context.ContextService/RemoveDevice', - request_serializer=context__pb2.DeviceId.SerializeToString, - response_deserializer=context__pb2.Empty.FromString, - ) - self.GetDeviceEvents = channel.unary_stream( - '/context.ContextService/GetDeviceEvents', - request_serializer=context__pb2.Empty.SerializeToString, - response_deserializer=context__pb2.DeviceEvent.FromString, - ) - self.SelectDevice = channel.unary_unary( - '/context.ContextService/SelectDevice', - request_serializer=context__pb2.DeviceFilter.SerializeToString, - response_deserializer=context__pb2.DeviceList.FromString, - ) - self.ListEndPointNames = channel.unary_unary( - '/context.ContextService/ListEndPointNames', - request_serializer=context__pb2.EndPointIdList.SerializeToString, - response_deserializer=context__pb2.EndPointNameList.FromString, - ) - self.ListLinkIds = channel.unary_unary( - '/context.ContextService/ListLinkIds', - request_serializer=context__pb2.Empty.SerializeToString, - response_deserializer=context__pb2.LinkIdList.FromString, - ) - self.ListLinks = channel.unary_unary( - '/context.ContextService/ListLinks', - request_serializer=context__pb2.Empty.SerializeToString, - response_deserializer=context__pb2.LinkList.FromString, - ) - self.GetLink = channel.unary_unary( - '/context.ContextService/GetLink', - request_serializer=context__pb2.LinkId.SerializeToString, - response_deserializer=context__pb2.Link.FromString, - ) - self.SetLink = channel.unary_unary( - '/context.ContextService/SetLink', - request_serializer=context__pb2.Link.SerializeToString, - response_deserializer=context__pb2.LinkId.FromString, - ) - self.RemoveLink = channel.unary_unary( - '/context.ContextService/RemoveLink', - request_serializer=context__pb2.LinkId.SerializeToString, - response_deserializer=context__pb2.Empty.FromString, - ) - self.GetLinkEvents = channel.unary_stream( - '/context.ContextService/GetLinkEvents', - request_serializer=context__pb2.Empty.SerializeToString, - response_deserializer=context__pb2.LinkEvent.FromString, - ) - self.ListServiceIds = channel.unary_unary( - '/context.ContextService/ListServiceIds', - request_serializer=context__pb2.ContextId.SerializeToString, - response_deserializer=context__pb2.ServiceIdList.FromString, - ) - self.ListServices = channel.unary_unary( - '/context.ContextService/ListServices', - request_serializer=context__pb2.ContextId.SerializeToString, - response_deserializer=context__pb2.ServiceList.FromString, - ) - self.GetService = channel.unary_unary( - '/context.ContextService/GetService', - request_serializer=context__pb2.ServiceId.SerializeToString, - response_deserializer=context__pb2.Service.FromString, - ) - self.SetService = channel.unary_unary( - '/context.ContextService/SetService', - request_serializer=context__pb2.Service.SerializeToString, - response_deserializer=context__pb2.ServiceId.FromString, - ) - self.UnsetService = channel.unary_unary( - '/context.ContextService/UnsetService', - request_serializer=context__pb2.Service.SerializeToString, - response_deserializer=context__pb2.ServiceId.FromString, - ) - self.RemoveService = channel.unary_unary( - '/context.ContextService/RemoveService', - request_serializer=context__pb2.ServiceId.SerializeToString, - response_deserializer=context__pb2.Empty.FromString, - ) - self.GetServiceEvents = channel.unary_stream( - '/context.ContextService/GetServiceEvents', - request_serializer=context__pb2.Empty.SerializeToString, - response_deserializer=context__pb2.ServiceEvent.FromString, - ) - self.SelectService = channel.unary_unary( - '/context.ContextService/SelectService', - request_serializer=context__pb2.ServiceFilter.SerializeToString, - response_deserializer=context__pb2.ServiceList.FromString, - ) - self.ListSliceIds = channel.unary_unary( - '/context.ContextService/ListSliceIds', - request_serializer=context__pb2.ContextId.SerializeToString, - response_deserializer=context__pb2.SliceIdList.FromString, - ) - self.ListSlices = channel.unary_unary( - '/context.ContextService/ListSlices', - request_serializer=context__pb2.ContextId.SerializeToString, - response_deserializer=context__pb2.SliceList.FromString, - ) - self.GetSlice = channel.unary_unary( - '/context.ContextService/GetSlice', - request_serializer=context__pb2.SliceId.SerializeToString, - response_deserializer=context__pb2.Slice.FromString, - ) - self.SetSlice = channel.unary_unary( - '/context.ContextService/SetSlice', - request_serializer=context__pb2.Slice.SerializeToString, - response_deserializer=context__pb2.SliceId.FromString, - ) - self.UnsetSlice = channel.unary_unary( - '/context.ContextService/UnsetSlice', - request_serializer=context__pb2.Slice.SerializeToString, - response_deserializer=context__pb2.SliceId.FromString, - ) - self.RemoveSlice = channel.unary_unary( - '/context.ContextService/RemoveSlice', - request_serializer=context__pb2.SliceId.SerializeToString, - response_deserializer=context__pb2.Empty.FromString, - ) - self.GetSliceEvents = channel.unary_stream( - '/context.ContextService/GetSliceEvents', - request_serializer=context__pb2.Empty.SerializeToString, - response_deserializer=context__pb2.SliceEvent.FromString, - ) - self.SelectSlice = channel.unary_unary( - '/context.ContextService/SelectSlice', - request_serializer=context__pb2.SliceFilter.SerializeToString, - response_deserializer=context__pb2.SliceList.FromString, - ) - self.ListConnectionIds = channel.unary_unary( - '/context.ContextService/ListConnectionIds', - request_serializer=context__pb2.ServiceId.SerializeToString, - response_deserializer=context__pb2.ConnectionIdList.FromString, - ) - self.ListConnections = channel.unary_unary( - '/context.ContextService/ListConnections', - request_serializer=context__pb2.ServiceId.SerializeToString, - response_deserializer=context__pb2.ConnectionList.FromString, - ) - self.GetConnection = channel.unary_unary( - '/context.ContextService/GetConnection', - request_serializer=context__pb2.ConnectionId.SerializeToString, - response_deserializer=context__pb2.Connection.FromString, - ) - self.SetConnection = channel.unary_unary( - '/context.ContextService/SetConnection', - request_serializer=context__pb2.Connection.SerializeToString, - response_deserializer=context__pb2.ConnectionId.FromString, - ) - self.RemoveConnection = channel.unary_unary( - '/context.ContextService/RemoveConnection', - request_serializer=context__pb2.ConnectionId.SerializeToString, - response_deserializer=context__pb2.Empty.FromString, - ) - self.GetConnectionEvents = channel.unary_stream( - '/context.ContextService/GetConnectionEvents', - request_serializer=context__pb2.Empty.SerializeToString, - response_deserializer=context__pb2.ConnectionEvent.FromString, - ) - self.GetOpticalConfig = channel.unary_unary( - '/context.ContextService/GetOpticalConfig', - request_serializer=context__pb2.Empty.SerializeToString, - response_deserializer=context__pb2.OpticalConfigList.FromString, - ) - self.SetOpticalConfig = channel.unary_unary( - '/context.ContextService/SetOpticalConfig', - request_serializer=context__pb2.OpticalConfig.SerializeToString, - response_deserializer=context__pb2.OpticalConfigId.FromString, - ) - self.SelectOpticalConfig = channel.unary_unary( - '/context.ContextService/SelectOpticalConfig', - request_serializer=context__pb2.OpticalConfigId.SerializeToString, - response_deserializer=context__pb2.OpticalConfig.FromString, - ) - self.SetOpticalLink = channel.unary_unary( - '/context.ContextService/SetOpticalLink', - request_serializer=context__pb2.OpticalLink.SerializeToString, - response_deserializer=context__pb2.Empty.FromString, - ) - self.GetOpticalLink = channel.unary_unary( - '/context.ContextService/GetOpticalLink', - request_serializer=context__pb2.OpticalLinkId.SerializeToString, - response_deserializer=context__pb2.OpticalLink.FromString, - ) - self.GetFiber = channel.unary_unary( - '/context.ContextService/GetFiber', - request_serializer=context__pb2.FiberId.SerializeToString, - response_deserializer=context__pb2.Fiber.FromString, - ) - - -class ContextServiceServicer(object): - """Missing associated documentation comment in .proto file.""" - - def ListContextIds(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ListContexts(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetContext(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def SetContext(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def RemoveContext(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetContextEvents(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ListTopologyIds(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ListTopologies(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetTopology(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetTopologyDetails(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def SetTopology(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def RemoveTopology(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetTopologyEvents(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ListDeviceIds(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ListDevices(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetDevice(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def SetDevice(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def RemoveDevice(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetDeviceEvents(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def SelectDevice(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ListEndPointNames(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ListLinkIds(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ListLinks(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetLink(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def SetLink(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def RemoveLink(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetLinkEvents(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ListServiceIds(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ListServices(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetService(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def SetService(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def UnsetService(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def RemoveService(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetServiceEvents(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def SelectService(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ListSliceIds(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ListSlices(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetSlice(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def SetSlice(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def UnsetSlice(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def RemoveSlice(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetSliceEvents(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def SelectSlice(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ListConnectionIds(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def ListConnections(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetConnection(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def SetConnection(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def RemoveConnection(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetConnectionEvents(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetOpticalConfig(self, request, context): - """------------------------------ Experimental ----------------------------- - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def SetOpticalConfig(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def SelectOpticalConfig(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def SetOpticalLink(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetOpticalLink(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def GetFiber(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - -def add_ContextServiceServicer_to_server(servicer, server): - rpc_method_handlers = { - 'ListContextIds': grpc.unary_unary_rpc_method_handler( - servicer.ListContextIds, - request_deserializer=context__pb2.Empty.FromString, - response_serializer=context__pb2.ContextIdList.SerializeToString, - ), - 'ListContexts': grpc.unary_unary_rpc_method_handler( - servicer.ListContexts, - request_deserializer=context__pb2.Empty.FromString, - response_serializer=context__pb2.ContextList.SerializeToString, - ), - 'GetContext': grpc.unary_unary_rpc_method_handler( - servicer.GetContext, - request_deserializer=context__pb2.ContextId.FromString, - response_serializer=context__pb2.Context.SerializeToString, - ), - 'SetContext': grpc.unary_unary_rpc_method_handler( - servicer.SetContext, - request_deserializer=context__pb2.Context.FromString, - response_serializer=context__pb2.ContextId.SerializeToString, - ), - 'RemoveContext': grpc.unary_unary_rpc_method_handler( - servicer.RemoveContext, - request_deserializer=context__pb2.ContextId.FromString, - response_serializer=context__pb2.Empty.SerializeToString, - ), - 'GetContextEvents': grpc.unary_stream_rpc_method_handler( - servicer.GetContextEvents, - request_deserializer=context__pb2.Empty.FromString, - response_serializer=context__pb2.ContextEvent.SerializeToString, - ), - 'ListTopologyIds': grpc.unary_unary_rpc_method_handler( - servicer.ListTopologyIds, - request_deserializer=context__pb2.ContextId.FromString, - response_serializer=context__pb2.TopologyIdList.SerializeToString, - ), - 'ListTopologies': grpc.unary_unary_rpc_method_handler( - servicer.ListTopologies, - request_deserializer=context__pb2.ContextId.FromString, - response_serializer=context__pb2.TopologyList.SerializeToString, - ), - 'GetTopology': grpc.unary_unary_rpc_method_handler( - servicer.GetTopology, - request_deserializer=context__pb2.TopologyId.FromString, - response_serializer=context__pb2.Topology.SerializeToString, - ), - 'GetTopologyDetails': grpc.unary_unary_rpc_method_handler( - servicer.GetTopologyDetails, - request_deserializer=context__pb2.TopologyId.FromString, - response_serializer=context__pb2.TopologyDetails.SerializeToString, - ), - 'SetTopology': grpc.unary_unary_rpc_method_handler( - servicer.SetTopology, - request_deserializer=context__pb2.Topology.FromString, - response_serializer=context__pb2.TopologyId.SerializeToString, - ), - 'RemoveTopology': grpc.unary_unary_rpc_method_handler( - servicer.RemoveTopology, - request_deserializer=context__pb2.TopologyId.FromString, - response_serializer=context__pb2.Empty.SerializeToString, - ), - 'GetTopologyEvents': grpc.unary_stream_rpc_method_handler( - servicer.GetTopologyEvents, - request_deserializer=context__pb2.Empty.FromString, - response_serializer=context__pb2.TopologyEvent.SerializeToString, - ), - 'ListDeviceIds': grpc.unary_unary_rpc_method_handler( - servicer.ListDeviceIds, - request_deserializer=context__pb2.Empty.FromString, - response_serializer=context__pb2.DeviceIdList.SerializeToString, - ), - 'ListDevices': grpc.unary_unary_rpc_method_handler( - servicer.ListDevices, - request_deserializer=context__pb2.Empty.FromString, - response_serializer=context__pb2.DeviceList.SerializeToString, - ), - 'GetDevice': grpc.unary_unary_rpc_method_handler( - servicer.GetDevice, - request_deserializer=context__pb2.DeviceId.FromString, - response_serializer=context__pb2.Device.SerializeToString, - ), - 'SetDevice': grpc.unary_unary_rpc_method_handler( - servicer.SetDevice, - request_deserializer=context__pb2.Device.FromString, - response_serializer=context__pb2.DeviceId.SerializeToString, - ), - 'RemoveDevice': grpc.unary_unary_rpc_method_handler( - servicer.RemoveDevice, - request_deserializer=context__pb2.DeviceId.FromString, - response_serializer=context__pb2.Empty.SerializeToString, - ), - 'GetDeviceEvents': grpc.unary_stream_rpc_method_handler( - servicer.GetDeviceEvents, - request_deserializer=context__pb2.Empty.FromString, - response_serializer=context__pb2.DeviceEvent.SerializeToString, - ), - 'SelectDevice': grpc.unary_unary_rpc_method_handler( - servicer.SelectDevice, - request_deserializer=context__pb2.DeviceFilter.FromString, - response_serializer=context__pb2.DeviceList.SerializeToString, - ), - 'ListEndPointNames': grpc.unary_unary_rpc_method_handler( - servicer.ListEndPointNames, - request_deserializer=context__pb2.EndPointIdList.FromString, - response_serializer=context__pb2.EndPointNameList.SerializeToString, - ), - 'ListLinkIds': grpc.unary_unary_rpc_method_handler( - servicer.ListLinkIds, - request_deserializer=context__pb2.Empty.FromString, - response_serializer=context__pb2.LinkIdList.SerializeToString, - ), - 'ListLinks': grpc.unary_unary_rpc_method_handler( - servicer.ListLinks, - request_deserializer=context__pb2.Empty.FromString, - response_serializer=context__pb2.LinkList.SerializeToString, - ), - 'GetLink': grpc.unary_unary_rpc_method_handler( - servicer.GetLink, - request_deserializer=context__pb2.LinkId.FromString, - response_serializer=context__pb2.Link.SerializeToString, - ), - 'SetLink': grpc.unary_unary_rpc_method_handler( - servicer.SetLink, - request_deserializer=context__pb2.Link.FromString, - response_serializer=context__pb2.LinkId.SerializeToString, - ), - 'RemoveLink': grpc.unary_unary_rpc_method_handler( - servicer.RemoveLink, - request_deserializer=context__pb2.LinkId.FromString, - response_serializer=context__pb2.Empty.SerializeToString, - ), - 'GetLinkEvents': grpc.unary_stream_rpc_method_handler( - servicer.GetLinkEvents, - request_deserializer=context__pb2.Empty.FromString, - response_serializer=context__pb2.LinkEvent.SerializeToString, - ), - 'ListServiceIds': grpc.unary_unary_rpc_method_handler( - servicer.ListServiceIds, - request_deserializer=context__pb2.ContextId.FromString, - response_serializer=context__pb2.ServiceIdList.SerializeToString, - ), - 'ListServices': grpc.unary_unary_rpc_method_handler( - servicer.ListServices, - request_deserializer=context__pb2.ContextId.FromString, - response_serializer=context__pb2.ServiceList.SerializeToString, - ), - 'GetService': grpc.unary_unary_rpc_method_handler( - servicer.GetService, - request_deserializer=context__pb2.ServiceId.FromString, - response_serializer=context__pb2.Service.SerializeToString, - ), - 'SetService': grpc.unary_unary_rpc_method_handler( - servicer.SetService, - request_deserializer=context__pb2.Service.FromString, - response_serializer=context__pb2.ServiceId.SerializeToString, - ), - 'UnsetService': grpc.unary_unary_rpc_method_handler( - servicer.UnsetService, - request_deserializer=context__pb2.Service.FromString, - response_serializer=context__pb2.ServiceId.SerializeToString, - ), - 'RemoveService': grpc.unary_unary_rpc_method_handler( - servicer.RemoveService, - request_deserializer=context__pb2.ServiceId.FromString, - response_serializer=context__pb2.Empty.SerializeToString, - ), - 'GetServiceEvents': grpc.unary_stream_rpc_method_handler( - servicer.GetServiceEvents, - request_deserializer=context__pb2.Empty.FromString, - response_serializer=context__pb2.ServiceEvent.SerializeToString, - ), - 'SelectService': grpc.unary_unary_rpc_method_handler( - servicer.SelectService, - request_deserializer=context__pb2.ServiceFilter.FromString, - response_serializer=context__pb2.ServiceList.SerializeToString, - ), - 'ListSliceIds': grpc.unary_unary_rpc_method_handler( - servicer.ListSliceIds, - request_deserializer=context__pb2.ContextId.FromString, - response_serializer=context__pb2.SliceIdList.SerializeToString, - ), - 'ListSlices': grpc.unary_unary_rpc_method_handler( - servicer.ListSlices, - request_deserializer=context__pb2.ContextId.FromString, - response_serializer=context__pb2.SliceList.SerializeToString, - ), - 'GetSlice': grpc.unary_unary_rpc_method_handler( - servicer.GetSlice, - request_deserializer=context__pb2.SliceId.FromString, - response_serializer=context__pb2.Slice.SerializeToString, - ), - 'SetSlice': grpc.unary_unary_rpc_method_handler( - servicer.SetSlice, - request_deserializer=context__pb2.Slice.FromString, - response_serializer=context__pb2.SliceId.SerializeToString, - ), - 'UnsetSlice': grpc.unary_unary_rpc_method_handler( - servicer.UnsetSlice, - request_deserializer=context__pb2.Slice.FromString, - response_serializer=context__pb2.SliceId.SerializeToString, - ), - 'RemoveSlice': grpc.unary_unary_rpc_method_handler( - servicer.RemoveSlice, - request_deserializer=context__pb2.SliceId.FromString, - response_serializer=context__pb2.Empty.SerializeToString, - ), - 'GetSliceEvents': grpc.unary_stream_rpc_method_handler( - servicer.GetSliceEvents, - request_deserializer=context__pb2.Empty.FromString, - response_serializer=context__pb2.SliceEvent.SerializeToString, - ), - 'SelectSlice': grpc.unary_unary_rpc_method_handler( - servicer.SelectSlice, - request_deserializer=context__pb2.SliceFilter.FromString, - response_serializer=context__pb2.SliceList.SerializeToString, - ), - 'ListConnectionIds': grpc.unary_unary_rpc_method_handler( - servicer.ListConnectionIds, - request_deserializer=context__pb2.ServiceId.FromString, - response_serializer=context__pb2.ConnectionIdList.SerializeToString, - ), - 'ListConnections': grpc.unary_unary_rpc_method_handler( - servicer.ListConnections, - request_deserializer=context__pb2.ServiceId.FromString, - response_serializer=context__pb2.ConnectionList.SerializeToString, - ), - 'GetConnection': grpc.unary_unary_rpc_method_handler( - servicer.GetConnection, - request_deserializer=context__pb2.ConnectionId.FromString, - response_serializer=context__pb2.Connection.SerializeToString, - ), - 'SetConnection': grpc.unary_unary_rpc_method_handler( - servicer.SetConnection, - request_deserializer=context__pb2.Connection.FromString, - response_serializer=context__pb2.ConnectionId.SerializeToString, - ), - 'RemoveConnection': grpc.unary_unary_rpc_method_handler( - servicer.RemoveConnection, - request_deserializer=context__pb2.ConnectionId.FromString, - response_serializer=context__pb2.Empty.SerializeToString, - ), - 'GetConnectionEvents': grpc.unary_stream_rpc_method_handler( - servicer.GetConnectionEvents, - request_deserializer=context__pb2.Empty.FromString, - response_serializer=context__pb2.ConnectionEvent.SerializeToString, - ), - 'GetOpticalConfig': grpc.unary_unary_rpc_method_handler( - servicer.GetOpticalConfig, - request_deserializer=context__pb2.Empty.FromString, - response_serializer=context__pb2.OpticalConfigList.SerializeToString, - ), - 'SetOpticalConfig': grpc.unary_unary_rpc_method_handler( - servicer.SetOpticalConfig, - request_deserializer=context__pb2.OpticalConfig.FromString, - response_serializer=context__pb2.OpticalConfigId.SerializeToString, - ), - 'SelectOpticalConfig': grpc.unary_unary_rpc_method_handler( - servicer.SelectOpticalConfig, - request_deserializer=context__pb2.OpticalConfigId.FromString, - response_serializer=context__pb2.OpticalConfig.SerializeToString, - ), - 'SetOpticalLink': grpc.unary_unary_rpc_method_handler( - servicer.SetOpticalLink, - request_deserializer=context__pb2.OpticalLink.FromString, - response_serializer=context__pb2.Empty.SerializeToString, - ), - 'GetOpticalLink': grpc.unary_unary_rpc_method_handler( - servicer.GetOpticalLink, - request_deserializer=context__pb2.OpticalLinkId.FromString, - response_serializer=context__pb2.OpticalLink.SerializeToString, - ), - 'GetFiber': grpc.unary_unary_rpc_method_handler( - servicer.GetFiber, - request_deserializer=context__pb2.FiberId.FromString, - response_serializer=context__pb2.Fiber.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'context.ContextService', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) - - - # This class is part of an EXPERIMENTAL API. -class ContextService(object): - """Missing associated documentation comment in .proto file.""" - - @staticmethod - def ListContextIds(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListContextIds', - context__pb2.Empty.SerializeToString, - context__pb2.ContextIdList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def ListContexts(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListContexts', - context__pb2.Empty.SerializeToString, - context__pb2.ContextList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetContext(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetContext', - context__pb2.ContextId.SerializeToString, - context__pb2.Context.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def SetContext(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetContext', - context__pb2.Context.SerializeToString, - context__pb2.ContextId.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def RemoveContext(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/RemoveContext', - context__pb2.ContextId.SerializeToString, - context__pb2.Empty.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetContextEvents(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_stream(request, target, '/context.ContextService/GetContextEvents', - context__pb2.Empty.SerializeToString, - context__pb2.ContextEvent.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def ListTopologyIds(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListTopologyIds', - context__pb2.ContextId.SerializeToString, - context__pb2.TopologyIdList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def ListTopologies(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListTopologies', - context__pb2.ContextId.SerializeToString, - context__pb2.TopologyList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetTopology(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetTopology', - context__pb2.TopologyId.SerializeToString, - context__pb2.Topology.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetTopologyDetails(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetTopologyDetails', - context__pb2.TopologyId.SerializeToString, - context__pb2.TopologyDetails.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def SetTopology(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetTopology', - context__pb2.Topology.SerializeToString, - context__pb2.TopologyId.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def RemoveTopology(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/RemoveTopology', - context__pb2.TopologyId.SerializeToString, - context__pb2.Empty.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetTopologyEvents(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_stream(request, target, '/context.ContextService/GetTopologyEvents', - context__pb2.Empty.SerializeToString, - context__pb2.TopologyEvent.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def ListDeviceIds(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListDeviceIds', - context__pb2.Empty.SerializeToString, - context__pb2.DeviceIdList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def ListDevices(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListDevices', - context__pb2.Empty.SerializeToString, - context__pb2.DeviceList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetDevice(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetDevice', - context__pb2.DeviceId.SerializeToString, - context__pb2.Device.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def SetDevice(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetDevice', - context__pb2.Device.SerializeToString, - context__pb2.DeviceId.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def RemoveDevice(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/RemoveDevice', - context__pb2.DeviceId.SerializeToString, - context__pb2.Empty.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetDeviceEvents(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_stream(request, target, '/context.ContextService/GetDeviceEvents', - context__pb2.Empty.SerializeToString, - context__pb2.DeviceEvent.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def SelectDevice(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/SelectDevice', - context__pb2.DeviceFilter.SerializeToString, - context__pb2.DeviceList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def ListEndPointNames(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListEndPointNames', - context__pb2.EndPointIdList.SerializeToString, - context__pb2.EndPointNameList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def ListLinkIds(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListLinkIds', - context__pb2.Empty.SerializeToString, - context__pb2.LinkIdList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def ListLinks(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListLinks', - context__pb2.Empty.SerializeToString, - context__pb2.LinkList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetLink(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetLink', - context__pb2.LinkId.SerializeToString, - context__pb2.Link.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def SetLink(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetLink', - context__pb2.Link.SerializeToString, - context__pb2.LinkId.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def RemoveLink(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/RemoveLink', - context__pb2.LinkId.SerializeToString, - context__pb2.Empty.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetLinkEvents(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_stream(request, target, '/context.ContextService/GetLinkEvents', - context__pb2.Empty.SerializeToString, - context__pb2.LinkEvent.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def ListServiceIds(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListServiceIds', - context__pb2.ContextId.SerializeToString, - context__pb2.ServiceIdList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def ListServices(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListServices', - context__pb2.ContextId.SerializeToString, - context__pb2.ServiceList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetService(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetService', - context__pb2.ServiceId.SerializeToString, - context__pb2.Service.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def SetService(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetService', - context__pb2.Service.SerializeToString, - context__pb2.ServiceId.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def UnsetService(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/UnsetService', - context__pb2.Service.SerializeToString, - context__pb2.ServiceId.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def RemoveService(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/RemoveService', - context__pb2.ServiceId.SerializeToString, - context__pb2.Empty.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetServiceEvents(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_stream(request, target, '/context.ContextService/GetServiceEvents', - context__pb2.Empty.SerializeToString, - context__pb2.ServiceEvent.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def SelectService(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/SelectService', - context__pb2.ServiceFilter.SerializeToString, - context__pb2.ServiceList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def ListSliceIds(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListSliceIds', - context__pb2.ContextId.SerializeToString, - context__pb2.SliceIdList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def ListSlices(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListSlices', - context__pb2.ContextId.SerializeToString, - context__pb2.SliceList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetSlice(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetSlice', - context__pb2.SliceId.SerializeToString, - context__pb2.Slice.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def SetSlice(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetSlice', - context__pb2.Slice.SerializeToString, - context__pb2.SliceId.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def UnsetSlice(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/UnsetSlice', - context__pb2.Slice.SerializeToString, - context__pb2.SliceId.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def RemoveSlice(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/RemoveSlice', - context__pb2.SliceId.SerializeToString, - context__pb2.Empty.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetSliceEvents(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_stream(request, target, '/context.ContextService/GetSliceEvents', - context__pb2.Empty.SerializeToString, - context__pb2.SliceEvent.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def SelectSlice(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/SelectSlice', - context__pb2.SliceFilter.SerializeToString, - context__pb2.SliceList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def ListConnectionIds(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListConnectionIds', - context__pb2.ServiceId.SerializeToString, - context__pb2.ConnectionIdList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def ListConnections(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/ListConnections', - context__pb2.ServiceId.SerializeToString, - context__pb2.ConnectionList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetConnection(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetConnection', - context__pb2.ConnectionId.SerializeToString, - context__pb2.Connection.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def SetConnection(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetConnection', - context__pb2.Connection.SerializeToString, - context__pb2.ConnectionId.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def RemoveConnection(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/RemoveConnection', - context__pb2.ConnectionId.SerializeToString, - context__pb2.Empty.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetConnectionEvents(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_stream(request, target, '/context.ContextService/GetConnectionEvents', - context__pb2.Empty.SerializeToString, - context__pb2.ConnectionEvent.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetOpticalConfig(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetOpticalConfig', - context__pb2.Empty.SerializeToString, - context__pb2.OpticalConfigList.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def SetOpticalConfig(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetOpticalConfig', - context__pb2.OpticalConfig.SerializeToString, - context__pb2.OpticalConfigId.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def SelectOpticalConfig(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/SelectOpticalConfig', - context__pb2.OpticalConfigId.SerializeToString, - context__pb2.OpticalConfig.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def SetOpticalLink(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/SetOpticalLink', - context__pb2.OpticalLink.SerializeToString, - context__pb2.Empty.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetOpticalLink(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetOpticalLink', - context__pb2.OpticalLinkId.SerializeToString, - context__pb2.OpticalLink.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def GetFiber(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/context.ContextService/GetFiber', - context__pb2.FiberId.SerializeToString, - context__pb2.Fiber.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/src/device/tests/qkd/unit/test_application_deployment.py b/src/device/tests/qkd/unit/test_application_deployment.py index 972f96ce3..92e16663b 100644 --- a/src/device/tests/qkd/unit/test_application_deployment.py +++ b/src/device/tests/qkd/unit/test_application_deployment.py @@ -14,7 +14,7 @@ import pytest import json -from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver +from device.service.drivers.qkd.QKDDriver2 import QKDDriver MOCK_QKD_ADDRRESS = '127.0.0.1' MOCK_PORT = 11111 diff --git a/src/device/tests/qkd/unit/test_qkd_configuration.py b/src/device/tests/qkd/unit/test_qkd_configuration.py index d058978f9..15c4787c2 100644 --- a/src/device/tests/qkd/unit/test_qkd_configuration.py +++ b/src/device/tests/qkd/unit/test_qkd_configuration.py @@ -15,9 +15,9 @@ import pytest import json from requests.exceptions import HTTPError -from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver +from device.service.drivers.qkd.QKDDriver2 import QKDDriver import requests -from src.device.service.drivers.qkd.Tools2 import ( +from device.service.drivers.qkd.Tools2 import ( RESOURCE_INTERFACES, RESOURCE_LINKS, RESOURCE_ENDPOINTS, diff --git a/src/device/tests/qkd/unit/test_qkd_error_hanling.py b/src/device/tests/qkd/unit/test_qkd_error_hanling.py index 0d11b9b5c..d93e37111 100644 --- a/src/device/tests/qkd/unit/test_qkd_error_hanling.py +++ b/src/device/tests/qkd/unit/test_qkd_error_hanling.py @@ -12,11 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pytest -from requests.exceptions import HTTPError -from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver -from requests.exceptions import ConnectionError, Timeout -import requests +import pytest, requests +from requests.exceptions import ConnectionError, HTTPError, Timeout +from device.service.drivers.qkd.QKDDriver2 import QKDDriver MOCK_QKD_ADDRRESS = '127.0.0.1' MOCK_PORT = 11111 diff --git a/src/device/tests/qkd/unit/test_qkd_mock_connectivity.py b/src/device/tests/qkd/unit/test_qkd_mock_connectivity.py index 983ca89ea..150d00fd0 100644 --- a/src/device/tests/qkd/unit/test_qkd_mock_connectivity.py +++ b/src/device/tests/qkd/unit/test_qkd_mock_connectivity.py @@ -12,10 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pytest +import pytest, requests from unittest.mock import patch -from src.device.service.drivers.qkd.QKDDriver import QKDDriver -import requests +from device.service.drivers.qkd.QKDDriver import QKDDriver MOCK_QKD_ADDRRESS = '127.0.0.1' MOCK_PORT = 11111 @@ -34,7 +33,7 @@ def test_qkd_driver_invalid_connection(): assert qkd_driver.Connect() is False # Deliverable Test ID: SBI_Test_10 -@patch('src.device.service.drivers.qkd.QKDDriver2.requests.get') +@patch('device.service.drivers.qkd.QKDDriver2.requests.get') def test_qkd_driver_timeout_connection(mock_get, qkd_driver): mock_get.side_effect = requests.exceptions.Timeout qkd_driver.timeout = 0.001 # Simulate very short timeout diff --git a/src/device/tests/qkd/unit/test_qkd_performance.py b/src/device/tests/qkd/unit/test_qkd_performance.py index a2371a1e7..b15d1ab07 100644 --- a/src/device/tests/qkd/unit/test_qkd_performance.py +++ b/src/device/tests/qkd/unit/test_qkd_performance.py @@ -14,9 +14,8 @@ # tests/unit/test_qkd_performance.py -import pytest -import time -from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver +import pytest, time +from device.service.drivers.qkd.QKDDriver2 import QKDDriver MOCK_QKD_ADDRRESS = '127.0.0.1' MOCK_PORT = 11111 diff --git a/src/device/tests/qkd/unit/test_qkd_security.py b/src/device/tests/qkd/unit/test_qkd_security.py index 1f3ad3498..f2942fd46 100644 --- a/src/device/tests/qkd/unit/test_qkd_security.py +++ b/src/device/tests/qkd/unit/test_qkd_security.py @@ -12,13 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pytest import json import os -from requests.exceptions import HTTPError -from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver -from src.device.service.drivers.qkd.Tools2 import RESOURCE_CAPABILITES +import pytest import requests +from requests.exceptions import HTTPError +from device.service.drivers.qkd.QKDDriver2 import QKDDriver +from device.service.drivers.qkd.Tools2 import RESOURCE_CAPABILITES # Helper function to print data in a formatted JSON style for debugging def print_data(label, data): diff --git a/src/device/tests/qkd/unit/test_qkd_subscription.py b/src/device/tests/qkd/unit/test_qkd_subscription.py index 975dc7b6b..883fe2a1a 100644 --- a/src/device/tests/qkd/unit/test_qkd_subscription.py +++ b/src/device/tests/qkd/unit/test_qkd_subscription.py @@ -13,8 +13,8 @@ # limitations under the License. import pytest -from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver from typing import List, Tuple +from device.service.drivers.qkd.QKDDriver2 import QKDDriver MOCK_QKD_ADDRRESS = '127.0.0.1' MOCK_PORT = 11111 diff --git a/src/device/tests/qkd/unit/test_qkd_unsubscription.py b/src/device/tests/qkd/unit/test_qkd_unsubscription.py index 975dc7b6b..883fe2a1a 100644 --- a/src/device/tests/qkd/unit/test_qkd_unsubscription.py +++ b/src/device/tests/qkd/unit/test_qkd_unsubscription.py @@ -13,8 +13,8 @@ # limitations under the License. import pytest -from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver from typing import List, Tuple +from device.service.drivers.qkd.QKDDriver2 import QKDDriver MOCK_QKD_ADDRRESS = '127.0.0.1' MOCK_PORT = 11111 diff --git a/src/device/tests/qkd/unit/test_set_new configuration.py b/src/device/tests/qkd/unit/test_set_new_configuration.py similarity index 96% rename from src/device/tests/qkd/unit/test_set_new configuration.py rename to src/device/tests/qkd/unit/test_set_new_configuration.py index 2caa44faf..d4b202489 100644 --- a/src/device/tests/qkd/unit/test_set_new configuration.py +++ b/src/device/tests/qkd/unit/test_set_new_configuration.py @@ -12,12 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pytest -import requests +import pytest, requests, uuid from requests.exceptions import HTTPError -from src.device.service.drivers.qkd.QKDDriver2 import QKDDriver -from src.device.service.drivers.qkd.Tools2 import RESOURCE_APPS -import uuid +from device.service.drivers.qkd.QKDDriver2 import QKDDriver +from device.service.drivers.qkd.Tools2 import RESOURCE_APPS MOCK_QKD1_ADDRRESS = '127.0.0.1' MOCK_PORT1 = 11111 -- GitLab From 45f86f703ad0b3fd83321c4fb464a0817053f53d Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 19 Sep 2024 12:42:19 +0000 Subject: [PATCH 600/602] Pre-merge code cleanup --- my_deploy.sh | 10 +++++---- src/context/proto | 1 - src/device/requirements.in | 1 + src/device/tests/qkd/unit/LICENSE | 21 ------------------- .../qkd/unit/test_set_new_configuration.py | 2 +- src/tests/tools/mock_qkd_nodes/mock.py | 15 ++++++++++++- src/tests/tools/mock_qkd_nodes/start.sh | 17 +++++++++++++-- 7 files changed, 37 insertions(+), 30 deletions(-) delete mode 120000 src/context/proto delete mode 100644 src/device/tests/qkd/unit/LICENSE diff --git a/my_deploy.sh b/my_deploy.sh index 4ca545943..88be82b63 100755 --- a/my_deploy.sh +++ b/my_deploy.sh @@ -20,9 +20,7 @@ export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/" # Set the list of components, separated by spaces, you want to build images for, and deploy. -export TFS_COMPONENTS="context device pathcomp service slice nbi webui app" - -# export load_generator +export TFS_COMPONENTS="context device pathcomp service slice nbi webui load_generator" # Uncomment to activate Monitoring (old) #export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring" @@ -72,6 +70,10 @@ export TFS_COMPONENTS="context device pathcomp service slice nbi webui app" # export TLS_CERT_PATH="src/dlt/gateway/keys/ca.crt" #fi +# Uncomment to activate QKD App +#export TFS_COMPONENTS="${TFS_COMPONENTS} app" + + # Set the tag you want to use for your images. export TFS_IMAGE_TAG="dev" @@ -122,7 +124,7 @@ export CRDB_DEPLOY_MODE="single" export CRDB_DROP_DATABASE_IF_EXISTS="" # Disable flag for re-deploying CockroachDB from scratch. -export CRDB_REDEPLOY="YES" +export CRDB_REDEPLOY="" # ----- NATS ------------------------------------------------------------------- diff --git a/src/context/proto b/src/context/proto deleted file mode 120000 index 0ae252a78..000000000 --- a/src/context/proto +++ /dev/null @@ -1 +0,0 @@ -../../proto/src/python \ No newline at end of file diff --git a/src/device/requirements.in b/src/device/requirements.in index a3f6a763b..bf5e6a2b3 100644 --- a/src/device/requirements.in +++ b/src/device/requirements.in @@ -32,6 +32,7 @@ python-json-logger==2.0.2 #pytz==2021.3 #redis==4.1.2 requests==2.27.1 +requests-mock==1.9.3 xmltodict==0.12.0 tabulate ipaddress diff --git a/src/device/tests/qkd/unit/LICENSE b/src/device/tests/qkd/unit/LICENSE deleted file mode 100644 index 6b678c507..000000000 --- a/src/device/tests/qkd/unit/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2017 FullStory, Inc - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/src/device/tests/qkd/unit/test_set_new_configuration.py b/src/device/tests/qkd/unit/test_set_new_configuration.py index d4b202489..438e46d74 100644 --- a/src/device/tests/qkd/unit/test_set_new_configuration.py +++ b/src/device/tests/qkd/unit/test_set_new_configuration.py @@ -30,7 +30,7 @@ def qkd_driver1(): @pytest.fixture def qkd_driver3(): # Initialize the QKD driver for QKD3 - return QKDDriver(address=MOCK_QKD1_ADDRRESS, port=MOCK_PORT3, username='user', password='pass') + return QKDDriver(address=MOCK_QKD3_ADDRRESS, port=MOCK_PORT3, username='user', password='pass') def create_qkd_app(driver, qkdn_id, backing_qkdl_id, client_app_id=None): """ diff --git a/src/tests/tools/mock_qkd_nodes/mock.py b/src/tests/tools/mock_qkd_nodes/mock.py index 2ab60c65d..7a606f6ca 100644 --- a/src/tests/tools/mock_qkd_nodes/mock.py +++ b/src/tests/tools/mock_qkd_nodes/mock.py @@ -1,5 +1,18 @@ -import os +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 os from flask import Flask, request from YangValidator import YangValidator diff --git a/src/tests/tools/mock_qkd_nodes/start.sh b/src/tests/tools/mock_qkd_nodes/start.sh index cf8ee7533..b1bc56d5a 100755 --- a/src/tests/tools/mock_qkd_nodes/start.sh +++ b/src/tests/tools/mock_qkd_nodes/start.sh @@ -1,13 +1,26 @@ #!/bin/bash -cd "$(dirname "$0")" +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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. +cd "$(dirname "$0")" -#!/bin/bash killbg() { for p in "${pids[@]}" ; do kill "$p"; done } + trap killbg EXIT pids=() flask --app mock run --host 0.0.0.0 --port 11111 & -- GitLab From 6fae8286b8b04c041c9f8c575eab20fa6b4e9793 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 19 Sep 2024 12:46:40 +0000 Subject: [PATCH 601/602] DLT Connector: minor import correction --- src/dlt/connector/tests/basic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dlt/connector/tests/basic.py b/src/dlt/connector/tests/basic.py index da400dcbe..08c598088 100644 --- a/src/dlt/connector/tests/basic.py +++ b/src/dlt/connector/tests/basic.py @@ -17,12 +17,12 @@ # PYTHONPATH=/home/cttc/teraflow/src python -m dlt.connector.tests.basic import logging, sys, time +from common.proto.context_pb2 import DEVICEOPERATIONALSTATUS_ENABLED, Device from common.proto.dlt_gateway_pb2 import ( DLTRECORDOPERATION_ADD, DLTRECORDOPERATION_UNDEFINED, DLTRECORDOPERATION_UPDATE, DLTRECORDTYPE_DEVICE, DLTRECORDTYPE_UNDEFINED, DltRecord, DltRecordId) from common.tools.object_factory.Device import json_device from common.tools.grpc.Tools import grpc_message_to_json_string -from src.common.proto.context_pb2 import DEVICEOPERATIONALSTATUS_ENABLED, Device from ..client.DltGatewayClient import DltGatewayClient from ..client.DltEventsCollector import DltEventsCollector -- GitLab From a1f718e7112781642d395a9d361e0be1b23d10b3 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Thu, 19 Sep 2024 12:54:27 +0000 Subject: [PATCH 602/602] Pre-merge code cleanup --- .../service/service_handler_api/FilterFields.py | 4 ++-- .../service/service_handlers/qkd/__init__.py | 14 ++++++++++++++ .../service_handlers/qkd/qkd_service_handler.py | 15 +++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/service/service/service_handler_api/FilterFields.py b/src/service/service/service_handler_api/FilterFields.py index 30e597f31..494e59e3c 100644 --- a/src/service/service/service_handler_api/FilterFields.py +++ b/src/service/service/service_handler_api/FilterFields.py @@ -27,7 +27,7 @@ SERVICE_TYPE_VALUES = { ServiceTypeEnum.SERVICETYPE_TE, ServiceTypeEnum.SERVICETYPE_E2E, ServiceTypeEnum.SERVICETYPE_OPTICAL_CONNECTIVITY, - ServiceTypeEnum.SERVICETYPE_QKD + ServiceTypeEnum.SERVICETYPE_QKD, } DEVICE_DRIVER_VALUES = { @@ -43,7 +43,7 @@ DEVICE_DRIVER_VALUES = { DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS, DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN, DeviceDriverEnum.DEVICEDRIVER_OC, - DeviceDriverEnum.DEVICEDRIVER_QKD + DeviceDriverEnum.DEVICEDRIVER_QKD, } # Map allowed filter fields to allowed values per Filter field. If no restriction (free text) None is specified diff --git a/src/service/service/service_handlers/qkd/__init__.py b/src/service/service/service_handlers/qkd/__init__.py index e69de29bb..3ee6f7071 100644 --- a/src/service/service/service_handlers/qkd/__init__.py +++ b/src/service/service/service_handlers/qkd/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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/service/service/service_handlers/qkd/qkd_service_handler.py b/src/service/service/service_handlers/qkd/qkd_service_handler.py index 867fa4781..76c67867e 100644 --- a/src/service/service/service_handlers/qkd/qkd_service_handler.py +++ b/src/service/service/service_handlers/qkd/qkd_service_handler.py @@ -1,3 +1,18 @@ +# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 json, logging, uuid from typing import Any, Dict, List, Optional, Tuple, Union from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method -- GitLab